Recibir el último ID de una inserción con PHP y MySQL

  • Por
Código para conseguir el último ID de inserción de una tupla.

Creamos este artículo para responder una duda que nos han preguntado alguna vez en nuestro correo. Se trata sobre conseguir el último identificador de un registro insertado en la base de datos, programando con PHP y con la base de datos MySQL.

Realmente es una duda muy sencilla de solucionar, gracias al rico juego de funciones de PHP para trabajar con bases de datos MySQL. Existe una función que nos devuelve directamente el identificador de la última inserción, utilizando la conexión a la base de datos que se le pase por parámetro, o la última conexión utilizada en caso de que no se le indique parámetro.

mysql_insert_id($connectid)

Ejemplo de utilización

Veamos un ejemplo de la utilización de esta función, en el que se realizan las acciones necesarias para insertar un elemento en la base de datos. En este ejemplo utilizaremos una base de datos llamada "test" y la tabla "cliente".

//conecto con la base de datos 
$connectid = mysql_connect("localhost","root",""); 

//selecciono la base de datos a utilizar 
mysql_select_db("test",$connectid); 

//Sentencia de inserción del elemento 
$ssql = "INSERT INTO cliente (nombre_cliente, cif, direccion, email) VALUES ('xxx Nombre empresa', 'B3331113', 'C/ Corona 2', 'eepe@relll.com')"; 

//lo inserto en la base de datos 
if (mysql_query($ssql,$connectid)){ 

   	//recibo el último id
   	$ultimo_id = mysql_insert_id($connectid); 
   	echo $ultimo_id; 
}else{ 
   	echo "La inserción no se realizó"; 
}

Primero se conecta con MySQL y se selecciona la base de datos a utilizar. Luego se genera una sentencia SQL de inserción en una supuesta tabla de clientes. Si la ejecución de esta sentencia es correcta se recibe el último ID con la función insert_id(). Si la ejecución de la sentencia falla, muestra un mensaje de error.

Fijémonos que insert_id() recibe el identificador de la conexión, devuelto por mysql_connect() y no el identificador de resultado de la consulta, que devuelve mysql_query() cuando se ejecutan sentencias de selección en la base de datos.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Jose Corbacho

13/4/2004
Para evitar posibles problemas de concurrencia siempre es recomendable antes de un insert o update realizar mysql_query("LOCK TABLES mitabla WRITE",$link) y una vez hecha la consulta desbloquear las tablas mysql_query("UNLOCK TABLES",$link)

Un saludo

Jorge

12/6/2004
En la descripción de la funcion se especifica claramente que devuelve el valor del ULTIMO ID INSERTADO.

Que sucede si al mismo tiempo se insertan dos IDS? que garantiza q el q estemos recibiendo es el q le corresponde a un usuario en particular? podría recibir el de otra conexion?

Jesús Genicio

30/11/2004
Estimados amigos:

De seguro soy un poco burro. Estoy usando esta función para vinvular una tuplas a otra, y me daba error.

al leer el artículo, me di cuenta de que estaba haciendo:

$resultado=mysql_query($sql,$link);
$id= mysql_insert_id($resultado);

cuando debí hacer
$resultado=mysql_query($sql,$link);
$id= mysql_insert_id($link);

Muchas gracias amigos.

Alex Tierno

10/12/2004
En principio, utilizando el método LOCK/UNLOCK no hay problema de confusión de id's siempre y cuando se haga la consulta "mysql_insert_id($link)" antes del UNLOCK

Oloranube

28/11/2005
Leyendo un poco la documentación de la función mysql_insert_id() he sacado la conclusión de que no hay problemas con la concurrencia porque dicha función debe recibir el identificador de la conexión a la base de datos y devuelve el identificador de la última inserción producida en esa conexión. El identificador devuelto es el valor de un campo del tipo AUTO_INCREMENT o cero si no existe un campo con estas características.

PD: Como estoy aprendiendo les diré que no me hagan mucho caso, pero eso me ha parecido que cuenta la documentación. Espero haber leído bien.

Henry

21/4/2006
Si la instrucción mysql_insert_id me devuelve el ultimo registro guardado, que pasa si yo estoy digitando junto con otros usuarios en la misma aplicación?
Lo que pasa es que A CADA USUARIO le debe traer el ultimo registro insertado por el para incrementar un campo de ese usuario?

Javier

03/5/2006
Hola.

A la función mysql_insert_id() se le pasa como parámtero la ID de la conexión a la base de datos. Esta ID es única para cada conexión (si simultáneamente se estan ejecutando dos script que tienen realizada una conexión a MySQL, cada uno tendrá una ID única), por tanto, lo que devuelve la función mysql_insert_id() sólo es de nuestra conexión.

Espero que les sirva.

Un saludo.

JC

14/2/2007
hola:

hice el ejemplo pero con mas campos y tablas diferentes, revise cada punto que tocan ustedes respecto a los posibles errores, todo indica que esta bien, pero segun el resultado es "la insercion no se realizo" no se cual puede ser el problema, lo que deseo es que no me aprezaca este comentario y que realmente se guarde ya intenete muchas veces y no lo consigo.... tengo un campo autoincrementable.

spawnid

09/5/2007
que sucede si en ese momento se insertan concurrente mente varios registros a la misma tabla

gracias

rubi

05/11/2009
repeto a la conxxion
a mi me manda dierecto a q no se pudo enviar infomacion por que com lo evito

Juan

30/5/2010
Igual artículo
Agradecido por la luz!
Más allá del código, lo q más me orientó fué la explicación al final
Por favor sigan siendo didacticos!
SALUDOS

Gustavo72

26/11/2011
mysql_insert_id devuelve el id del último registro insertdo sin importar la conexión
Hice una pequeña prueba que desmiente lo que muchos han afirmado aquí:

Teniendo una tabla que llamé "prueba" con dos campos: "id" y "Texto" (con id como AUTO_INCREMENT, PRIMARY KEY), y estando la tabla vacía, acabo de probar lo siguiente:

$db_link1=mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_NAME, $db_link1);

$db_link2=mysql_connect(DB_HOST, DB_USER, DB_PASS);
mysql_select_db(DB_NAME, $db_link2);

mysql_query("INSERT INTO prueba (Texto) VALUES ('Texto 1')", $db_link1);
mysql_query("INSERT INTO prueba (Texto) VALUES ('Texto 2')", $db_link2);
echo mysql_insert_id($db_link1);

y el resultado es... "2" y no "1".

Esto quiere decir que se devuelve el último registro insertado independiente mente de la conexión que se utilice para leerlo.

anthonyernestoruiz

26/4/2013
como mostrar los procesos de nuevos insert que realizan mis usuarios de mi web
Buenos dias necesito que me ayuden, hacerca de una duda que tengo de como mostrar los procesos de inserciones que se estan ejecutando en mi base de datos mysql algo similar a lo que hace show process list, osea que me muestre los detalles de los insert que han echo los usuarios de mi web

chicharophp

11/7/2013
Una duda...
El ejemplo es muy ilustrativo, al menos para el propósito de este, pero mi duda es que yo tengo 6 tablas una que quiero utilizar como base y las 5 restantes que se inserten datos después de la 1, y así hasta completar con las 5 que quedan....seguire leyendo haber si me cae el veinte

erika

06/8/2015
recuperar id para enviarlo por correo
Hola como estan, estoy checando el tutorial porque me surgio el problema de que al insertar los datos en el formulario me guarda el autonumerico sin problemas pero necesito recuperarlo para enviarlo por correo, seria posible que me pudieran orientar como hacerlo

deu

17/11/2016
Obtener el ultimo ID
Hola.
Funciona muy bien, pero obtengo el ultimo id, aunque existe un problema ejemplo...
id
1
2
3 //el id que sigue seria el 4, sin embargo si borramos el 3, nos devuelve un 3 y no el 4 (que es el id que corresponde)

Francisco

16/12/2016
Gracias
unicamente para agradecer, me sirvio bastante el código

tania

15/3/2017
siempre me devuelve 0
No se que pase pero siempre me devuelve 0 y esta inmediatamente después de una inserción