2009-10-16 9 views
62

Mon plugin wordpress a une table avec un champ clé primaire AUTO_INCREMENT appelé ID. Quand une nouvelle ligne est insérée dans la table, j'aimerais obtenir la valeur d'ID de l'insertion.Comment obtenir le dernier ID de ligne inséré à partir de la base de données wordpress?

La fonctionnalité consiste à utiliser AJAX pour publier des données sur le serveur à insérer dans la base de données. Le nouvel identifiant de ligne est renvoyé dans la réponse AJAX pour mettre à jour l'état du client. Il est possible que plusieurs clients publient des données sur le serveur en même temps. Donc, je dois m'assurer que chaque requête AJAX reçoive le nouvel identifiant de ligne EXACT en réponse.

En PHP, il y a une méthode appelée mysql_insert_id pour cette feature.But, il est valable pour la condition de course que si l'argument est link_identifier de la dernière opération. Mon opération avec la base de données est sur $ wpdb. Comment extraire le link_identifier de $ wpdb pour vous assurer que mysql_insert_id fonctionne? Existe-t-il un autre moyen d'obtenir l'ID de dernière ligne insérée à partir de $ wpdb?

Merci.

+0

Le link | resource est stocké dans '$ wpdb-> dbh', mais il est défini comme' protected $ dbh; '... vous ne pouvez pas y accéder directement, par conséquent, utilisez la réponse ci-dessous :) –

Répondre

128

droit après la $wpdb->insert() qui fait l'insert, faites ceci:

$lastid = $wpdb->insert_id; 

Plus d'informations sur la façon de faire les choses la manière de wordpress peut être trouvée dans le codex de wordpress. Les détails ci-dessus ont été trouvés ici sur l'wpdb class page

+0

Est-ce comme ceci: '$ lastid = $ wpdb -> $ insert_id'? –

+0

"Cette fonction renvoie false si la ligne n'a pas pu être insérée, sinon elle renvoie le nombre de lignes affectées (qui sera toujours 1)." De: http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak

+1

@unbreak - mauvaise fonction là ... vous lisez à propos de wpdb-> insert ($ table, $ data, $ format); – jsnfwlr

-2

Mettre l'appel à mysql_insert_id() dans une transaction, devrait le faire:

mysql_query('BEGIN'); 
// Whatever code that does the insert here. 
$id = mysql_insert_id(); 
mysql_query('COMMIT'); 
// Stuff with $id. 
+4

That's n ot le faire en utilisant l'objet $ wpdb comme cela a été mentionné dans le PO. – jsnfwlr

0

Quelque chose comme ça devrait le faire aussi:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'"); 
$lastid = $last->Auto_increment; 
+7

Cela ne poserait-il pas problème si deux enregistrements étaient insérés presque exactement au même moment par deux processus différents? Les deux processus peuvent être insérés en même temps (ou suffisamment proches l'un de l'autre) pour que l'auto_increment renvoie le même nombre pour les deux processus. –

7

Voilà comment je l'ai fait, dans mon code

... 
global $wpdb; 
$query = "INSERT INTO... VALUES(...)" ; 
$wpdb->query(
     $wpdb->prepare($query) 
); 
return $wpdb->insert_id; 
... 

More Class Variables

+1

"Cette fonction renvoie false si la ligne n'a pas pu être insérée, sinon elle renvoie le nombre de lignes affectées (qui sera toujours 1)." de: http://codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows – unbreak

+1

Cela fonctionne. La requête '$ wpdb-> renvoie la ligne des lignes affectées et' $ wpdb-> insert_id' a le dernier identifiant inséré. Merci! –

+0

Ceci est mieux pour moi, car je veux capturer des insertions qui sinon retourneraient une erreur due à des valeurs de colonne en double sur une colonne unique. Il n'y a aucun moyen de 'INSERT IGNORE' avec' $ wpdb-> insert' malheureusement. –

Questions connexes