Comment obtenir la dernière ID de ligne insérée à partir de la base de données WordPress?

95

Mon plugin WordPress a une table avec un champ de clé primaire AUTO_INCREMENT appelé ID. Lorsqu'une nouvelle ligne est insérée dans le tableau, j'aimerais obtenir la valeur ID de l'insertion.

La fonctionnalité consiste à utiliser AJAX pour publier des données sur le serveur à insérer dans la base de données. Le nouvel ID 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. Je dois donc m'assurer que chaque requête AJAX obtienne le nouvel ID de ligne EXACT en réponse.

En PHP, il existe une méthode appelée mysql_insert_id pour cette fonctionnalité, mais elle n'est valide pour la condition de concurrence 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 s'assurer que mysql_insert_id fonctionne? Existe-t-il un autre moyen d'obtenir l'ID de la dernière ligne insérée à partir de $ wpdb?

Merci.

Morgan Cheng
la source
Le lien | ressource est stocké dans $wpdb->dbh, mais il est défini comme protected $dbh;... sou vous ne pouvez pas y accéder directement, par conséquent, utilisez la réponse ci-dessous :)
jave.web

Réponses:

191

Juste après le $wpdb->insert()qui fait l'insertion, faites ceci:

$lastid = $wpdb->insert_id;

Vous trouverez plus d'informations sur la façon de faire les choses à la manière de WordPress dans le codex WordPress. Les détails ci-dessus ont été trouvés ici sur la page de la classe wpdb

jsnfwlr
la source
Est-ce comme ça $lastid = $wpdb->$insert_id :?
Francisco Corrales Morales
"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: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
déverrouiller
1
@unbreak - mauvaise fonction ici ... vous lisez à propos de wpdb-> insert ($ table, $ data, $ format);
jsnfwlr
4
Il est également utile de savoir que si vous utilisez la requête $ wpdb->, elle affectera toujours insert_id.
Dave Scotese
2
n'était pas nécessaire, mais je pense que cela améliore un peu, la déclaration est mise en évidence et l'indentation supprimée car elle n'est pas requise pour une seule ligne.
kamal pal
14

C'est comme ça que je l'ai fait, dans mon code

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

Plus de variables de classe

Francisco Corrales Morales
la source
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: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
déverrouiller
1
Ça marche. Le $wpdb->queryrenvoie le len des lignes affectées et $wpdb->insert_ida le dernier identifiant inséré. Merci!
Fabio Montefuscolo
C'est mieux pour moi, car je souhaite capturer des insertions qui renverront autrement une erreur en raison de valeurs de colonne en double sur une colonne unique. Il n'y a aucun moyen de INSERT IGNOREavec $wpdb->insertmalheureusement.
Solomon Closson
@unbreak - On dirait que cela insert_idme renvoie le , pas le nombre de lignes affectées.
Solomon Closson
0

Quelque chose comme ça devrait le faire aussi:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;
Martin
la source
10
Cela ne poserait-il pas un problème si deux enregistrements étaient insérés presque exactement au même moment par deux processus différents? Les deux processus pourraient s'insérer en même temps (ou assez près du même moment) pour que l'auto_increment renvoie le même nombre pour les deux processus.
Michael Khalili
0

J'avais besoin d'obtenir le dernier moyen d'identification après l'avoir inséré, alors

$lastid = $wpdb->insert_id;

Ce n'était pas une option.

A fait ce qui suit:

global $wpdb;
$id = $wpdb->get_var( 'SELECT id FROM ' . $wpdb->prefix . 'table' . ' ORDER BY id DESC LIMIT 1');
Marco Floriano
la source
-6

Mettre l'appel à l' mysql_insert_id()intérieur d'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.
Ollie Saunders
la source
4
Cela ne le fait pas en utilisant l'objet $ wpdb comme cela a été mentionné dans l'OP.
jsnfwlr