PDO ottiene l'ultimo ID inserito


158

Ho una query e voglio inserire l'ultimo ID inserito. L'ID campo è la chiave primaria e l'incremento automatico.

So che devo usare questa affermazione:

LAST_INSERT_ID()

Tale affermazione funziona con una query come questa:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";

Ma se voglio ottenere l'ID usando questa affermazione:

$ID = LAST_INSERT_ID();

Ottengo questo errore:

Fatal error: Call to undefined function LAST_INSERT_ID()

Che cosa sto facendo di sbagliato?

Risposte:


367

Questo perché è una funzione SQL, non PHP. È possibile utilizzare PDO::lastInsertId().

Piace:

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();

Se vuoi farlo con SQL invece dell'API PDO, lo faresti come una normale query di selezione:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();

1
si hai ragione, l'ho trovato e funziona, grazie, accetterò la risposta
William Kinaan,

7
@ rybo111, prima lo è Screaming snake case. secondo, è la convenzione di denominazione di MySQL e non è PHP
azerafati,

2
@ rybo111, hmm SELECT LAST_INSERT_ID()è una funzione MySQL
azerafati,

32
Quindi forse questa è una domanda stupida, ma voglio solo esserne certo. Quando faccio affidamento su lastInsertId () restituisce l'ultimo ID inserito che è accaduto nel mio codice attualmente in esecuzione in quel momento? O restituisce l'ultimo ID inserito dal mio database? Ad esempio, se ho un sito Web pesantemente trafficato e inserisco qualcosa durante lo script di accesso e utilizzo lastInsertId () per ottenere l'iD inserito, ma molte persone accedono contemporaneamente, sono sicuro di fare affidamento su lastInsertId ( ) per ottenere l'ultimo ID inserito da quella specifica istanza di esecuzione del codice? O corro un rischio
Art Geigel,

41
@ArtGeigel Sarà l'ultimo ID inserito della connessione alla base dell'istanza PDO. In altre parole, è sicuro nello scenario che hai descritto poiché le query simultanee avrebbero luogo in connessioni separate.
Corbin,

15

lastInsertId () funziona solo dopo la query INSERT.

Corretta:

$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
                              VALUES(?,?,?);");
$sonuc = $stmt->execute([$username,$email,$pass]);
$LAST_ID = $this->conn->lastInsertId();

non corretto:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0

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.