2010-02-03 3 views
3

Je suis en cours d'exécution dans la question ci-dessous lorsque vous essayez d'exécuter ce qui suit:doctrine php dernier numéro d'identification

$store = new Store(); 
$store->url =$this->form_validation->set_value('website'); 
$store->save(); 
$store_id = $store->identifier(); 


Fatal error: Uncaught exception 'Doctrine_Connection_Exception' with message 'Couldn't get last insert identifier.' in /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Connection/UnitOfWork.php:932 Stack trace: #0 /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Connection/UnitOfWork.php(632): Doctrine_Connection_UnitOfWork->_assignIdentifier(Object(Category_store_assn)) #1 /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Connection/UnitOfWork.php(562): Doctrine_Connection_UnitOfWork->processSingleInsert(Object(Category_store_assn)) #2 /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Connection/UnitOfWork.php(81): Doctrine_Connection_UnitOfWork->insert(Object(Category_store_assn)) #3 /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Record.php(1691): Doctrine_Connection_UnitOfWork->saveGraph(Object(Category_store_assn)) #4 /home/yummm/public_html/system/application/controllers/auth.php(375): Doctrine_Reco in /home/yummm/public_html/system/application/plugins/doctrine/lib/Doctrine/Connection/UnitOfWork.php on line 932 

Quand j'echo $ store_id, il semble saisir le dernier identifiant sans aucun problème. Avez-vous une idée de la raison pour laquelle cette erreur revient, même si l'ID passe correctement?

Répondre

-1

Peut-être que vous avez écrasé la méthode setTableDefinition(), et maintenant il n'y a pas d'appel hasColum() pour votre attribut id.

0

J'ai trouvé que le problème se trouve dans 'autoincrement' => true pour le champ clé primaire dans hasColumn(). Si je définis 'autoincrement' => false, le problème est résolu.

Mais le champ de clé primaire de cette table est un champ auto-incrémenté. Et il est encore étrange, que sur les autres ordinateurs il n'y a pas d'erreurs. L'application et les bases de données sont les mêmes sur tous les ordinateurs.

0

Et maintenant j'ai trouvé que c'est parce que la méthode lastInsertId() de l'objet PDO renvoie 0. Donc, supposons, le problème est dans le pilote PDO et ce n'est pas le bogue Doctrine. Besoin de réinstaller l'extension PHP ou PDO. Voir aussi http://bugs.php.net/bug.php?id=33618.

+1

Ce rapport de bogue a été fermé pendant cinq ans. Les pilotes PDO devraient fonctionner correctement. – Thomas

2

Il est possible que la définition de colonne elle-même ne soit pas configurée comme auto_increment. Vérifiez la définition de la table avec: (en supposant MySQL)

DESCRIBE table_name; 

et assurez-vous que votre champ d'identification est marqué comme auto_increment. Si ce n'est pas Doctrine essayera d'obtenir le dernier identifiant de la table mais échouera car seules les colonnes auto_increment répondent à la fonction LAST_INSERT_ID() de MySQL.

0

Votre ID de la table Store n'est probablement pas défini sur auto-incrémentation. Dans ce cas, vous devez « dire » à modèle d'enregistrement de la doctrine par le paramètre d'option mixte utilisé dans la fonction hasColumn:

$this->hasColumn('id', 'integer', 11, array(
    'primary' => true, 
    'autoincrement' => false) 
    ); 

Ou définissez votre ID autoincrement si nécessaire.

0

Dans mon cas c'était un bug de pilote PDO.

1

Même problème pour moi avec Doctrine 1.2. Celui-ci ne fonctionne pas:

$this->hasColumn('id', 'int', null, array(
    'primary'  => true, 
    'autoincrement' => true 
)); 

Et celui-ci a fait:

$this->hasColumn('id', 'integer', 4, array(
     'type' => 'integer', 
     'length' => 4, 
     'unsigned' => true, 
     'primary' => true, 
     'autoincrement' => true, 
)); 

Je ne sais pas pourquoi la différence, mais elle pourra être utile.