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?

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();

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.