W3docs

Cómo obtener el último ID insertado en PHP y MySQL

Aprende a recuperar el último ID insertado en PHP y MySQL usando MySQLi y PDO, con ejemplos completos y buenas prácticas.

Cuando insertas una fila en una tabla MySQL cuya clave primaria es una columna AUTO_INCREMENT, la base de datos genera el nuevo ID automáticamente. PHP te ofrece una forma de leer ese ID inmediatamente después de la inserción, sin necesidad de ejecutar una segunda consulta SELECT. Esta página muestra cómo hacerlo con las extensiones MySQLi y PDO, por qué el valor es confiable y los errores comunes a evitar.

El último ID insertado se usa con mayor frecuencia para vincular registros relacionados: insertar un nuevo user, obtener su ID y luego insertar filas en orders o profiles que lo referencien como clave foránea.

Cómo funciona

Ambas funciones descritas a continuación devuelven el ID generado por el INSERT exitoso más reciente en la conexión actual a la base de datos:

  • mysqli_insert_id($conn) — MySQLi (procedimental u orientado a objetos).
  • PDO::lastInsertId() — PDO.

Dos detalles importantes:

  • El valor es por conexión. Aunque otros usuarios inserten filas al mismo tiempo, siempre obtendrás el ID generado por tu conexión, por lo que no hay condición de carrera.
  • Solo devuelve un valor distinto de cero cuando la tabla insertada tiene una columna AUTO_INCREMENT. Si la tabla no tiene clave de auto-incremento, obtienes 0.

Requisitos previos

Antes de comenzar, hay algunos requisitos previos que debes tener en su lugar:

  • Un servidor web con PHP instalado
  • Una base de datos MySQL
  • Acceso a la interfaz phpMyAdmin o una herramienta de gestión de bases de datos similar
  • Una tabla con una clave primaria AUTO_INCREMENT. Los ejemplos siguientes asumen esta:
CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50),
    email VARCHAR(100)
);

Consulta Create a MySQL Table para más información sobre la definición de tablas.

Establecer una conexión

El primer paso para recuperar el último ID insertado es establecer una conexión con la base de datos. Con MySQLi esto se hace usando la función mysqli_connect(), que requiere los siguientes parámetros:

  • El nombre del servidor de base de datos
  • El nombre de usuario para acceder a la base de datos
  • La contraseña del usuario de la base de datos
  • El nombre de la base de datos a la que conectarse

Aquí hay un ejemplo de cómo establecer una conexión con una base de datos:

<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";

$conn = mysqli_connect($server, $username, $password, $database);

if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>

Para un análisis más detallado sobre la conexión, consulta Connect to a MySQL Database.

Escribir la instrucción SQL

Una vez establecida la conexión con la base de datos, el siguiente paso es escribir la instrucción SQL que se utilizará para insertar los datos en la base de datos.

Aquí hay un ejemplo de una instrucción SQL que inserta datos en una tabla de base de datos:

INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');

Ejecutar la instrucción SQL

Una vez escrita la instrucción SQL, el siguiente paso es ejecutarla. Esto se hace usando la función mysqli_query(), que requiere los siguientes parámetros:

  • La conexión a la base de datos
  • La instrucción SQL a ejecutar

Aquí hay un ejemplo de cómo ejecutar la instrucción SQL:

<?php
$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";

if (mysqli_query($conn, $sql)) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
?>

Nota de seguridad: En entornos de producción, utiliza siempre sentencias preparadas para prevenir ataques de inyección SQL.

Recuperar el último ID insertado

Una vez insertados los datos en la base de datos, el siguiente paso es recuperar el ID del último registro insertado. Esto se hace usando la función mysqli_insert_id(), que requiere el siguiente parámetro:

  • La conexión a la base de datos

Aquí hay un ejemplo de cómo recuperar el último ID insertado:

<?php
$last_id = mysqli_insert_id($conn);
echo "Last inserted ID is: " . $last_id;
?>

Cerrar la conexión

Una vez recuperado el último ID insertado, es importante cerrar la conexión con la base de datos para evitar riesgos de seguridad. Esto se hace usando la función mysqli_close(), que requiere el siguiente parámetro:

  • La conexión a la base de datos

Aquí hay un ejemplo de cómo cerrar la conexión con la base de datos:

<?php
mysqli_close($conn);
?>

Ejemplo completo (MySQLi, sentencia preparada)

En código real deberías pasar los datos del usuario a través de una sentencia preparada en lugar de concatenarlos en la cadena SQL. El patrón es idéntico: ejecutar la inserción y luego leer el ID. Aquí se muestra todo unido:

<?php
$conn = mysqli_connect("localhost", "root", "password", "database_name");
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);

$name = "Jane Doe";
$email = "[email protected]";
mysqli_stmt_execute($stmt);

$last_id = mysqli_insert_id($conn);
echo "New user inserted with ID: " . $last_id;

mysqli_stmt_close($stmt);
mysqli_close($conn);
?>

Tras completarse la inserción, $last_id contiene el valor que MySQL generó para la columna id — por ejemplo 1 en la primera inserción, 2 en la siguiente, y así sucesivamente.

Obtener el último ID con PDO

Si te conectas con PDO en lugar de MySQLi, utiliza el método lastInsertId() en el objeto de conexión:

<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "root", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(["John Doe", "[email protected]"]);

$last_id = $pdo->lastInsertId();
echo "New user inserted with ID: " . $last_id;
?>

Ten en cuenta que PDO::lastInsertId() devuelve el ID como un string, así que conviértelo con (int) si necesitas un tipo numérico.

Errores comunes a evitar

  • Llámalo justo después de la inserción. Ejecuta mysqli_insert_id() / lastInsertId() antes de ejecutar cualquier otra consulta en la misma conexión — un INSERT posterior sobrescribe el valor almacenado.
  • Sin columna de auto-incremento → 0. La función devuelve 0 (no un error) cuando la tabla en la que insertaste no tiene columna AUTO_INCREMENT.
  • UPDATE y DELETE no lo modifican. Solo las instrucciones INSERT que crean un valor de auto-incremento actualizan el resultado.
  • No uses SELECT MAX(id). Un error común es leer el ID más alto con SELECT MAX(id) FROM users. Con inserciones concurrentes, esto puede devolver la fila de otro usuario. Las funciones dedicadas están limitadas al ámbito de la conexión y son seguras.

Conclusión

En este artículo, te hemos mostrado cómo recuperar el último ID insertado en PHP y MySQL. Siguiendo estos pasos, deberías poder recuperar el ID del último registro insertado en tu base de datos. Para mejores resultados, inserta siempre los datos mediante sentencias preparadas y lee el ID en la misma conexión inmediatamente después de la inserción.

Capítulos relacionados: Insert Data into MySQL, Prepared Statements y Select Data from MySQL.

Práctica

Práctica
¿Qué métodos se pueden usar para obtener el último ID insertado en PHP y MySQL?
¿Qué métodos se pueden usar para obtener el último ID insertado en PHP y MySQL?
Was this page helpful?