W3docs

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/UPDATE que afectó a una columna AUTO_INCREMENT, devuelve 0.
  • 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_INCREMENT significa 0. Si la clave primaria de tu tabla se establece manualmente, no se genera nada, por lo que la función devuelve 0.
  • UPDATE y SELECT restablecen las expectativas. Un UPDATE exitoso que no toca una columna auto-increment, o cualquier SELECT, no deja ningún id generado nuevo, y la función devuelve 0.
  • 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

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.

Práctica

Práctica
¿Qué hace la función PHP mysqli_insert_id?
¿Qué hace la función PHP mysqli_insert_id?
Was this page helpful?