Come ottenere l'ultimo ID di riga inserito dal database di WordPress?


94

Il mio plugin WordPress ha una tabella con un campo chiave primaria AUTO_INCREMENT chiamato ID. Quando una nuova riga viene inserita nella tabella, vorrei ottenere il valore ID dell'inserimento.

La caratteristica consiste nell'usare AJAX per inviare i dati al server da inserire nel DB. Il nuovo ID riga viene restituito nella risposta AJAX per aggiornare lo stato del client. È possibile che più client inviino dati al server contemporaneamente. Quindi, devo assicurarmi che ogni richiesta AJAX ottenga il nuovo ID di riga ESATTO in risposta.

In PHP esiste un metodo chiamato mysql_insert_id per questa funzione, ma è valido per la race condition solo se l'argomento è link_identifier dell'ultima operazione. La mia operazione con il database è su $ wpdb. Come estrarre l'identificativo_connessione da $ wpdb per assicurarsi che il lavoro mysql_insert_id? C'è un altro modo per ottenere l'ID dell'ultima riga inserita da $ wpdb?

Grazie.


Il link | la risorsa è memorizzata $wpdb->dbh, ma è definita come protected $dbh;... quindi non puoi accedervi direttamente, quindi usa la risposta sotto :)
jave.web

Risposte:


191

Subito dopo l' $wpdb->insert()inserto, fai questo:

$lastid = $wpdb->insert_id;

Maggiori informazioni su come fare le cose in modo WordPress possono essere trovate nel codice WordPress. I dettagli sopra sono stati trovati qui nella pagina della classe wpdb


E 'in questo modo: $lastid = $wpdb->$insert_id ?
Francisco Corrales Morales

"Questa funzione restituisce false se la riga non può essere inserita. In caso contrario, restituisce il numero di righe interessate (che sarà sempre 1)." Da: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
@unbreak - funzione sbagliata lì ... stai leggendo di wpdb-> insert ($ table, $ data, $ format);
jsnfwlr

4
È anche utile sapere che se usi $ wpdb-> query, assegnerà comunque insert_id.
Dave Scotese

2
non era necessario, ma penso che migliori un po ', istruzione evidenziata e rimossa l'indentazione poiché non è richiesta per una singola riga.
kamal pal

14

Ecco come l'ho fatto, nel mio codice

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

Più variabili di classe


1
"Questa funzione restituisce false se la riga non può essere inserita. In caso contrario, restituisce il numero di righe interessate (che sarà sempre 1)." da: codex.wordpress.org/Function_Reference/wpdb_Class#INSERT_rows
unbreak

1
Funziona. I $wpdb->queryrendimenti del len di righe colpite e $wpdb->insert_idha l'ultima id inserito. Grazie!
Fabio Montefuscolo

Questo è meglio per me, perché desidero acquisire inserti che altrimenti restituiranno un errore a causa di valori di colonna duplicati su una colonna univoca. Non c'è modo per INSERT IGNOREcon $wpdb->insertpurtroppo.
Solomon Closson

@unbreak - Sembra che mi restituisca il insert_id, non il numero di righe interessate.
Solomon Closson

0

Qualcosa di simile dovrebbe farlo anche:

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

10
Questo non creerebbe un problema se due record fossero inseriti quasi nello stesso momento da due processi diversi? Entrambi i processi possono essere inseriti nello stesso momento (o abbastanza vicino allo stesso tempo) in modo che auto_increment restituisca lo stesso numero per entrambi i processi.
Michael Khalili

0

Avevo bisogno dell'ultimo modo di identificazione dopo averlo inserito, quindi

$lastid = $wpdb->insert_id;

Non era un'opzione.

Ha fatto il seguente:

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

-6

Mettere la chiamata mysql_insert_id()all'interno di una transazione, dovrebbe farlo:

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

4
Questo non lo fa usando l'oggetto $ wpdb come è stato menzionato nell'OP.
jsnfwlr
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.