PDO obtener la última identificación insertada

158

Tengo una consulta y quiero insertar el último ID. El ID de campo es la clave principal y el incremento automático.

Sé que tengo que usar esta declaración:

LAST_INSERT_ID()

Esa declaración funciona con una consulta como esta:

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

Pero si quiero obtener la identificación usando esta declaración:

$ID = LAST_INSERT_ID();

Me sale este error:

Fatal error: Call to undefined function LAST_INSERT_ID()

¿Qué estoy haciendo mal?

William Kinaan
fuente

Respuestas:

367

Eso es porque es una función SQL, no PHP. Puedes usar PDO::lastInsertId().

Me gusta:

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

Si desea hacerlo con SQL en lugar de la API PDO, lo haría como una consulta de selección normal:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Corbin
fuente
1
sí, está bien, lo encontré y funciona, gracias, aceptaré la respuesta
William Kinaan
77
@ rybo111, primero lo es Screaming snake case. segundo, es la convención de nomenclatura de MySQL y no es PHP
azerafati
2
@ rybo111, hmm SELECT LAST_INSERT_ID()es una función MySQL
azerafati
32
Quizás esta sea una pregunta tonta de seguimiento, pero solo quiero estar seguro. Cuando confío en lastInsertId (), ¿devuelve el último ID insertado que ocurrió dentro de mi código actualmente en ejecución en ese momento? ¿O devuelve el último ID insertado de mi base de datos? Por ejemplo, si tengo un sitio web con mucho tráfico e inserto algo durante mi secuencia de comandos de inicio de sesión y uso lastInsertId () para obtener el iD insertado, pero muchas personas inician sesión al mismo tiempo, ¿puedo confiar en lastInsertId ( ) para obtener la última ID insertada de esa instancia específica de ejecución de código? ¿O corro un riesgo?
Art Geigel
41
@ArtGeigel Será la última ID insertada de la conexión subyacente a la instancia de PDO. En otras palabras, es seguro en el escenario que describió, ya que las consultas concurrentes tendrían lugar en conexiones separadas.
Corbin
15

lastInsertId () solo funciona después de la consulta INSERT.

Correcto:

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

Incorrecto:

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

Puede obtener la identificación de la última transacción ejecutando el método lastInsertId () en el objeto de conexión ($ conn).

Al igual que $ lid = $ conn-> lastInsertId ();

Consulte los documentos https://www.php.net/manual/en/language.oop5.basic.php

Kanton Samad
fuente
2
Bienvenido a Stack Overflow. Valoramos las contribuciones útiles, pero no duplique las respuestas existentes.
Su sentido común