insert_id
En este artículo, analizamos la función mysqli_insert_id() en PHP, que se usa para obtener el ID generado por la consulta INSERT anterior.
Cuando insertas una fila en una tabla que tiene una clave primaria AUTO_INCREMENT (o SERIAL), la base de datos genera el nuevo ID por ti. La función mysqli_insert_id() te permite leer ese valor generado de vuelta en PHP inmediatamente después de la inserción, para que puedas usarlo como clave foránea, devolverlo en una respuesta de API o redirigir al usuario al nuevo registro.
Este artículo explica qué devuelve mysqli_insert_id(), tanto la sintaxis procedural como la orientada a objetos, y los errores comunes que llevan a que devuelva un valor incorrecto (o 0).
Qué devuelve mysqli_insert_id()
mysqli_insert_id() devuelve el ID generado por la última consulta que insertó en una columna AUTO_INCREMENT, para la conexión dada.
- Si la consulta anterior almacenó un valor en una columna
AUTO_INCREMENT, devuelve ese valor. - Si la consulta anterior no fue un
INSERT/UPDATEque afectó a una columnaAUTO_INCREMENT, devuelve0. - El valor está limitado a la conexión actual, por lo que las inserciones concurrentes de otros clientes nunca afectan lo que obtienes. Esto lo hace seguro incluso en un servidor con mucha carga.
Nota: el valor refleja el primer id generado automáticamente por la instrucción. Para una inserción de una sola fila, ese es el id de la fila; para una inserción de múltiples filas, es el id de la primera fila.
Sintaxis
mysqli_insert_id() toma la conexión MySQLi como único argumento:
int|string mysqli_insert_id(mysqli $mysql)En PHP moderno (8.1+), si una consulta falla, MySQLi lanza una mysqli_sql_exception en lugar de devolver false, por lo que los ejemplos a continuación asumen que los errores se mostrarán como excepciones.
Ejemplo procedural
Este es el estilo más común que verás en tutoriales y bases de código más antiguas:
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
mysqli_query(
$mysqli,
"INSERT INTO users (name, email) VALUES ('Ada', '[email protected]')"
);
$id = mysqli_insert_id($mysqli);
echo "Last inserted ID is: " . $id;
mysqli_close($mysqli);
?>Aquí abrimos una conexión con mysqli_connect(), ejecutamos un INSERT con mysqli_query() y luego leemos el id generado con mysqli_insert_id() antes de cerrar la conexión.
Ejemplo orientado a objetos
La misma lógica con la interfaz OOP, que usa la mayor parte del código nuevo. El id generado se expone como la propiedad insert_id:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
$mysqli->query(
"INSERT INTO users (name, email) VALUES ('Ada', '[email protected]')"
);
echo "Last inserted ID is: " . $mysqli->insert_id;
$mysqli->close();
?>Uso con sentencias preparadas
En aplicaciones reales debes insertar datos de usuario con una sentencia preparada para evitar la inyección SQL. El id de inserción sigue estando disponible después, ya sea desde la conexión o desde el objeto de sentencia:
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "Grace";
$email = "[email protected]";
$stmt->execute();
echo "New user id: " . $stmt->insert_id; // same as $mysqli->insert_id here
$stmt->close();
$mysqli->close();
?>Errores comunes
- Léelo inmediatamente. El valor refleja solo la última inserción en la conexión. Si ejecutas otro
INSERT(incluso en una tabla no relacionada) antes de leerlo, obtendrás el id de ese en su lugar. Captúralo en una variable justo después de la inserción. - Sin columna
AUTO_INCREMENTsignifica0. Si la clave primaria de tu tabla se establece manualmente, no se genera nada, por lo que la función devuelve0. UPDATEySELECTrestablecen las expectativas. UnUPDATEexitoso que no toca una columna auto-increment, o cualquierSELECT, no deja ningún id generado nuevo, y la función devuelve0.- Las inserciones de múltiples filas devuelven el primer id. Después de
INSERT INTO t VALUES (...),(...),(...), obtienes el id de la primera fila insertada; el resto sigue secuencialmente.
Funciones relacionadas
mysqli_affected_rows()— cuántas filas modificó la última consulta.mysqli_query()— ejecuta elINSERTcuyo id lees.- Descripción general de PHP MySQLi — la extensión MySQLi completa.
- Insertar datos en MySQL — un recorrido completo de inserción.
Conclusión
mysqli_insert_id() es la forma estándar de recuperar la clave primaria autogenerada justo después de una inserción. Léela inmediatamente después del INSERT, recuerda que es por conexión (por lo que es segura en cuanto a concurrencia) y espera 0 cuando la última instrucción no generó un valor auto-increment.