¿Cómo obtengo el último ID insertado de una tabla MySQL en PHP?


Tengo una tabla en la que se insertan con frecuencia nuevos datos. Necesito la última identificación de la mesa. ¿Cómo puedo hacer esto?

Es similar a SELECT MAX(id) FROM table?

 85
Author: TRiG, 2009-11-06

22 answers

Si está utilizando DOP, use PDO::lastInsertId.

Si está utilizando Mysqli, utilice mysqli::$insert_id.

Si todavía estás usando Mysql:

Por Favor, no utilice mysql_* funciones en el nuevo código. Ya no se mantienen y están oficialmente en desuso. Ver el caja roja? Más información sobre declaraciones preparadas en su lugar, y utilizar DOP o MySQLi - este artículo te ayudará a decidir que. Si elige DOP, aquí hay un buen tutorial.

Pero si tienes que hacerlo, usa mysql_insert_id.

 122
Author: deceze,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:06

Existe una función para saber cuál fue el último id insertado en la conexión actual

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

Además usar max es una mala idea porque podría dar lugar a problemas si su código se usa al mismo tiempo en dos sesiones diferentes.

Esa función se llama mysql_insert_id

 50
Author: RageZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-06 06:54:49

Está bien. También puedes usar LAST_INSERT_ID()

 21
Author: x2.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-06 06:53:04

Con DOP :

$pdo->lastInsertId();

Con Mysqli:

$mysqli->insert_id;

Por Favor, no utilice mysql_* funciones en el nuevo código. Ya no se mantienen y están oficialmente en desuso. Ver el caja roja? Más información sobre declaraciones preparadas en su lugar, y utilizar DOP o MySQLi - este artículo te ayudará a decidir cuál. Si elige DOP, aquí hay un buen tutorial.

 18
Author: Neal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:34:34

Use mysql_insert_id() función.

Ver pregunta similar aquí

 9
Author: NawaMan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 10:31:29

Lo que escribiste te daría el mayor id asumiendo que fueran únicos y auto-incrementados eso estaría bien asumiendo que estás de acuerdo con invitar problemas de concurrencia.
Dado que está utilizando MySQL como su base de datos, existe la función específicaLAST_INSERT_ID() que solo funciona en la conexión actual que hizo la inserción.
PHP ofrece una función específica para eso también llamada mysql_insert_id.

 7
Author: dlamblin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-06 06:57:02

Puede obtener el último id insertado por la función php incorporada mysql_insert_id();

$id = mysql_insert_id();

También obtendrá la última id por

$id = last_insert_id();
 4
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-01 14:08:57

Para obtener el último id insertado en codeigniter Después de ejecutar insert query solo use una función llamada insert_id() en la base de datos, devolverá el último id insertado

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

En una línea

echo $this->db->insert('mytable',$data)->insert_id();
 3
Author: Narsimha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-04-06 13:05:17

Está bien usar mysql_insert_id(), pero hay una nota específica sobre su uso, debe llamarlo después de la consulta de INSERCIÓN ejecutada, significa en la misma sesión de script. Si lo usas de otra manera no funcionaría correctamente.

 3
Author: Mihail Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 06:45:22

Intenta que esto funcione bien:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);
 3
Author: Sandhu,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 09:42:28

NOTA: si hace varias inserciones con una instrucción mysqli::insert_id no será correcta.

La tabla:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Ahora si lo haces:

insert into xyz (name) values('one'),('two'),('three');

El mysqli::insert_id será 1 no 3.

Para obtener el valor correcto haga:

mysqli::insert_id + mysqli::affected_rows) - 1

Esto ha sido un documento, pero es un poco oscuro.

 1
Author: bartonlp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-14 19:49:48

Prefiero usar una sintaxis MySQL pura para obtener el último auto_increment id de la tabla que quiero.

Php mysql_insert_id() y mysql last_insert_id() dan solo el último ID de transacción.

Si desea el último ID auto_incremented de cualquier tabla en su esquema (no solo la última transacción), puede usar esta consulta

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Eso es todo.

 1
Author: syjust,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 12:34:47

Es triste no ver ninguna respuesta con un ejemplo.

Usando Mysqli:: inser insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Utilizando DOP:: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID
 1
Author: user3284463,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-04-21 13:41:59

Limpio y simple -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
 1
Author: Hitesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-18 07:52:53

Usando la transacción MySQLi a veces no pude obtener mysqli::$insert_id, porque devolvía 0. Especialmente si estaba utilizando procedimientos almacenados, que la ejecución INSERT s. Así que hay otra manera dentro de la transacción:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>
 0
Author: BlitZ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-17 03:16:31

Use mysqli como mysql es deprimente

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>
 0
Author: Poorna Rao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-28 04:43:11

Lo intenté

mysqli_insert_id($dbConnectionObj)

Esto devuelve el último id insertado de la conexión actual, por lo que si está administrando sus conexiones correctamente, esto debería funcionar. Al menos funcionó para mí.

 0
Author: user2166373,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-27 20:07:31

Por favor, use PDP y luego intente esto

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();
 0
Author: Humphrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-01 15:29:57

$lastid = mysql_insert_id ();

 -1
Author: Treby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-06 09:17:30

Por toda esta discusión asumo que la razón para comprobar max id es saber qué id debe ser el siguiente.. (si mi id máximo es 5, lo siguiente será 5 + 1 = 6).

>>Si esta no es la razón, mis mejores disculpas

Caso si alguien más inserta información entre su CHEQUE e INSERTAR le daría una identificación incorrecta.

Por lo que se puede resolver si se crea hash que podría incluir marca de tiempo u otro valor único.

Entonces en la misma función puede insertar su información con valores vacíos y tu hash. Eso crearía ID si tiene seleccionado AUTO_INCRECEMENT.

Entonces en la misma función todavía tendría su hash y podría buscar id con el mismo hash. Y entonces usted podría completar rellenar valores vacíos con mysql UPDATE.

Esto incluye un poco más de conexiones, pero sigue siendo una forma de hacerlo...

Buena suerte solucionándolo.

 -1
Author: Aurimas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-08 22:30:20

Si su tabla tiene una columna de INCREMENTO AUTOMÁTICO como userId, Emp_ID,.. a continuación, puede utilizar esta consulta para obtener el último registro insertado SELECT * FROM table_name where userId=(select MAX (userId)from table_name) En código PHP:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

a Continuación, puede utilizar los datos recuperados como su requisito

 -2
Author: Naveen1425,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-28 06:53:33
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
 -3
Author: khamar Balkrishna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-31 06:45:53