mysqli::$insert_id

mysqli_insert_id

(PHP 5, PHP 7, PHP 8)

mysqli::$insert_id -- mysqli_insert_idDevuelve el valor generado para una columna AUTO_INCREMENT por la última consulta

Descripción

Estilo orientado a objetos

Estilo por procedimientos

mysqli_insert_id(mysqli $mysql): int|string

Devuelve el ID generado por una consulta INSERT o UPDATE en una tabla con una columna que tiene el atributo AUTO_INCREMENT. En el caso de consultas multilínea INSERT, esto devuelve el primer valor generado automáticamente que fue insertado con éxito.

Ejecutar una consulta INSERT o UPDATE utilizando la función MySQL LAST_INSERT_ID() modificará también el valor devuelto por mysqli_insert_id(). Si LAST_INSERT_ID(expr) se ha utilizado para generar el valor de AUTO_INCREMENT, esto devuelve el valor de la última expr en lugar del valor generado de AUTO_INCREMENT.

Devuelve 0 si la consulta anterior no ha cambiado el valor de AUTO_INCREMENT. mysqli_insert_id() debe ser llamado inmediatamente después de que la consulta haya generado el valor.

Parámetros

link

Sólo estilo por procediminetos: Un identificador de enlace devuelto por mysqli_connect() o mysqli_init()

Valores devueltos

El valor del campo AUTO_INCREMENT modificado por la última consulta. Devuelve cero si no ha habido consulta en la conexión o si la última consulta no ha modificado el valor del AUTO_INCREMENT.

Solo las consultas emitidas por la conexión actual afectan el valor de retorno. El valor no se ve afectado por las consultas que utilizan otras conexiones o clientes.

Nota:

Si el número es mayor que el valor máximo de un integer, será devuelto como un string

Ejemplos

Ejemplo #1 Ejemplo con $mysqli->insert_id

Estilo orientado a objetos

<?php
mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$mysqli->query("CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
$mysqli->query($query);

printf("El nuevo registro tiene ID %d.\n", $mysqli->insert_id);

/* eliminar tabla */
$mysqli->query("DROP TABLE myCity");
?>

Estilo por procedimientos

<?php
mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$link = mysqli_connect("localhost", "my_user", "my_password", "world");

mysqli_query($link, "CREATE TABLE myCity LIKE City");

$query = "INSERT INTO myCity VALUES (NULL, 'Stuttgart', 'DEU', 'Stuttgart', 617000)";
mysqli_query($link, $query);

printf("El nuevo registro tiene ID %d.\n", mysqli_insert_id($link));

/* eliminar tabla */
mysqli_query($link, "DROP TABLE myCity");
?>

El resultado de los ejemplos sería:

El nuevo registro tiene ID 1.
add a note

User Contributed Notes 8 notes

up
45
will at phpfever dot com
19 years ago
I have received many statements that the insert_id property has a bug because it "works sometimes". Keep in mind that when using the OOP approach, the actual instantiation of the mysqli class will hold the insert_id.

The following code will return nothing.
<?php
$mysqli
= new mysqli('host','user','pass','db');
if (
$result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
echo
'The ID is: '.$result->insert_id;
}
?>

This is because the insert_id property doesn't belong to the result, but rather the actual mysqli class. This would work:

<?php
$mysqli
= new mysqli('host','user','pass','db');
if (
$result = $mysqli->query("INSERT INTO t (field) VALUES ('value');")) {
echo
'The ID is: '.$mysqli->insert_id;
}
?>
up
17
mmulej at gmail dot com
4 years ago
There has been no examples with prepared statements yet.

```php
$u_name = "John Doe";
$u_email = "johndoe@example.com";

$stmt = $connection->prepare(
"INSERT INTO users (name, email) VALUES (?, ?)"
);
$stmt->bind_param('ss', $u_name, $u_email);
$stmt->execute();

echo $stmt->insert_id;
```

For UPDATE you simply change query string and binding parameters accordingly, the rest stays the same.

Of course the table needs to have AUTOINCREMENT PRIMARY KEY.
up
6
bert at nospam thinc dot nl
16 years ago
Watch out for the oo-style use of $db->insert_id. When the insert_id exceeds 2^31 (2147483648) fetching the insert id renders a wrong, too large number. You better use the procedural mysqli_insert_id( $db ) instead.

[EDIT by danbrown AT php DOT net: This is another prime example of the limits of 32-bit signed integers.]
up
1
adrian dot nesse dot wiik at gmail dot com
2 years ago
If you try to INSERT a row using ON DUPLICATE KEY UPDATE, be aware that insert_id will not update if the ON DUPLICATE KEY UPDATE clause was triggered.

When you think about it, it's actually very logical since ON DUPLICATE KEY UPDATE is an UPDATE statement, and not an INSERT.

In a worst case scenario, if you're iterating over something and doing INSERTs while relying on insert_id in later code, you could be pointing at the wrong row on iterations where ON DUPLICATE KEY UPDATE is triggered!
up
6
Nick Baicoianu
18 years ago
When running extended inserts on a table with an AUTO_INCREMENT field, the value of mysqli_insert_id() will equal the value of the *first* row inserted, not the last, as you might expect.

<?
//mytable has an auto_increment field
$db->query("INSERT INTO mytable (field1,field2,field3) VALUES ('val1','val2','val3'),
('val1','val2','val3'),
('val1','val2','val3')");

echo $db->insert_id; //will echo the id of the FIRST row inserted
?>
up
2
www dot wesley at gmail dot com
6 years ago
When using "INSERT ... ON DUPLICATE KEY UPDATE `id` = LAST_INSERT_ID(`id`)", the AUTO_INCREMENT will increase in an InnoDB table, but not in a MyISAM table.
up
0
jpage at chatterbox dot fyi
2 years ago
What is unclear is how concurrency control affects this function. When you make two successive calls to mysql where the result of the second depends on the first, another user may have done an insert in the meantime.

The documentation is silent on this, so I always determine the value of an auto increment before and after an insert to guard against this.
up
0
alan at commondream dot net
20 years ago
I was having problems with getting the inserted id, and did a bit of testing. It ended up that if you commit a transaction before getting the last inserted id, it returns 0 every time, but if you get the last inserted id before committing the transaction, you get the correct value.
To Top