Wie erhalte ich die zuletzt eingefügte Zeilen-ID aus der WordPress-Datenbank?

94

Mein WordPress-Plugin hat eine Tabelle mit einem AUTO_INCREMENT- Primärschlüsselfeld namens ID. Wenn eine neue Zeile in die Tabelle eingefügt wird, möchte ich den ID-Wert der Einfügung erhalten.

Die Funktion besteht darin, AJAX zu verwenden, um Daten zum Einfügen in die Datenbank an den Server zu senden. Die neue Zeilen-ID wird in der AJAX-Antwort zurückgegeben, um den Client-Status zu aktualisieren. Es ist möglich, dass mehrere Clients gleichzeitig Daten an den Server senden. Daher muss ich sicherstellen, dass jede AJAX-Anforderung als Antwort die GENAUE neue Zeilen-ID erhält.

In PHP gibt es für diese Funktion eine Methode namens mysql_insert_id . Sie ist jedoch nur dann für die Race-Bedingung gültig, wenn das Argument link_identifier der letzten Operation lautet . Meine Operation mit Datenbank ist auf $ wpdb. Wie extrahiere ich den link_identifier aus $ wpdb, um sicherzustellen, dass mysql_insert_id funktioniert? Gibt es eine andere Möglichkeit, die zuletzt eingefügte Zeilen-ID von $ wpdb abzurufen?

Vielen Dank.

Morgan Cheng
quelle
Die Link | Ressource ist in gespeichert $wpdb->dbh, aber sie ist definiert als protected $dbh;... Sie können nicht direkt darauf zugreifen, verwenden Sie daher die Antwort unten :)
jave.web

Antworten:

191

Führen $wpdb->insert()Sie dies direkt nach dem Einfügen aus:

$lastid = $wpdb->insert_id;

Weitere Informationen dazu, wie man Dinge auf WordPress-Art macht, finden Sie im WordPress-Codex. Die obigen Details wurden hier auf der wpdb-Klassenseite gefunden

jsnfwlr
quelle
Ist es so : $lastid = $wpdb->$insert_id ?
Francisco Corrales Morales
"Diese Funktion gibt false zurück, wenn die Zeile nicht eingefügt werden konnte. Andernfalls wird die Anzahl der betroffenen Zeilen zurückgegeben (die immer 1 sein wird)." Von: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak
1
@unbreak - falsche Funktion dort ... Sie lesen über wpdb-> insert ($ table, $ data, $ format);
jsnfwlr
3
Es ist auch nützlich zu wissen, dass bei Verwendung von $ wpdb-> query weiterhin insert_id zugewiesen wird.
Dave Scotese
2
war nicht notwendig, aber ich denke, es verbessert sich ein wenig, die Anweisung wird hervorgehoben und der Einzug wird entfernt, da er für eine einzelne Zeile nicht erforderlich ist.
Kamal Kumpel
14

So habe ich es in meinem Code gemacht

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

Weitere Klassenvariablen

Francisco Corrales Morales
quelle
1
"Diese Funktion gibt false zurück, wenn die Zeile nicht eingefügt werden konnte. Andernfalls wird die Anzahl der betroffenen Zeilen zurückgegeben (die immer 1 sein wird)." von: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
Unbreak
1
Es klappt. Das $wpdb->querygibt die Länge der betroffenen Zeilen zurück und $wpdb->insert_idhat die zuletzt eingefügte ID. Vielen Dank!
Fabio Montefuscolo
Dies ist besser für mich, da ich Einfügungen erfassen möchte, die andernfalls einen Fehler aufgrund doppelter Spaltenwerte in einer eindeutigen Spalte zurückgeben. Es gibt keine Möglichkeit, INSERT IGNOREmit $wpdb->insertleider.
Solomon Closson
@unbreak - Sieht so aus, als würde es das insert_idan mich zurückgeben, nicht die Anzahl der betroffenen Zeilen.
Solomon Closson
0

So etwas sollte es auch tun:

$last = $wpdb->get_row("SHOW TABLE STATUS LIKE 'table_name'");
$lastid = $last->Auto_increment;
Martin
quelle
10
Wäre dies nicht problematisch, wenn zwei Datensätze von zwei verschiedenen Prozessen fast genau zur gleichen Zeit eingefügt würden? Beide Prozesse können zur gleichen Zeit (oder nahe genug zur gleichen Zeit) eingefügt werden, sodass das auto_increment für beide Prozesse dieselbe Nummer zurückgibt.
Michael Khalili
0

Ich musste den letzten Ausweis nach dem Einfügen erhalten, also

$lastid = $wpdb->insert_id;

War keine Option.

Hat folgendes gemacht:

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

Wenn Sie den Anruf mysql_insert_id()innerhalb einer Transaktion tätigen, sollten Sie Folgendes tun:

mysql_query('BEGIN');
// Whatever code that does the insert here.
$id = mysql_insert_id();
mysql_query('COMMIT');
// Stuff with $id.
Ollie Saunders
quelle
4
Dies geschieht nicht mit dem Objekt $ wpdb, wie im OP erwähnt.
jsnfwlr