2009-05-22 18 views
182

El campo 'id' de mi tabla auto aumenta cuando inserto una fila. Quiero insertar una fila y luego obtener esa ID.PHP/MySQL insert row then get 'id'

Lo haría tal como lo dije, pero ¿hay alguna manera de hacerlo sin preocuparme por el tiempo entre insertar la fila y obtener la identificación?

Sé que puedo consultar la base de datos de la fila que coincide con la información que se ingresó, pero hay un gran cambio habrá duplicados, con la única diferencia es la identificación.

Respuesta

239
$link = mysqli_connect('127.0.0.1', 'my_user', 'my_pass', 'my_db'); 
mysqli_query($link, "INSERT INTO mytable (1, 2, 3, 'blah')"); 
$id = mysqli_insert_id($link); 

Ver mysqli_insert_id().

Haga lo que haga, no inserte y haga un "SELECT MAX(id) FROM mytable". Como dices, es una condición de carrera y no es necesario. mysqli_insert_id() ya tiene esta funcionalidad.

+54

El equivalente de PDO es PDO :: lastInsertId (http://us3.php.net/manual/en/pdo.lastinsertid.php). –

+0

Cool - ¡No sabía que esto existía! –

+0

el enlace me lleva a la versión rusa de mysql_insert_id @ php.net: P – Alisso

37

La función MySQL LAST_INSERT_ID() hace justo lo que necesita: recupera la identificación que se insertó durante esta sesión. Por lo tanto, es seguro de usar, incluso si hay otros procesos (otras personas que llaman el mismo guión, por ejemplo) insertando valores en la misma tabla.

La función PHP mysql_insert_id() hace lo mismo que llamar SELECT LAST_INSERT_ID() con mysql_query().

+2

NB 'eco mysql_insert_id();. mysql_query ('SELECT LAST_INSERT_ID (600)'); eco mysql_insert_id(); mysql_query ('SELECT LAST_INSERT_ID()'); ' El segundo' mysql_insert_id() 'no refleja 600, donde como' mysql_query ('SELECT LAST_INSERT_ID()') '. Para obtener el' mysql_insert_id() 'para reflejar el cambio, primero tiene que hacer un insertar o una actualización (que puede afectar 0 filas). Ver el último párrafo de: [http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id] (http://dev.mysql.com/doc /refman/5.0/en/information-functions.html#function_last-insert-id) – Cliffordlife

+2

esto debería ser aceptado como respuesta, junto con @Cliffordlife's 'NB' – RozzA

25

En cuanto al sitio web de PHP, mysql_insert_id ahora está en desuso y debemos usar PDO. Para hacer esto con DOP, proceder de la siguiente manera:

$db = new PDO('mysql:dbname=database;host=localhost', 'user', 'pass'); 
$statement = $db->prepare('INSERT INTO people(name, city) VALUES(:name, :city)'); 
$statement->execute(array(':name' => 'Bob', ':city' => 'Montreal')); 

echo $db->lastInsertId(); 
+4

Tenemos la opción de usar ya sea PDO * o * MySQLi (que Lo describo en otra respuesta aquí). Una buena comparación: http://code.tutsplus.com/tutorials/pdo-vs-mysqli-which-should-you-use--net-24059 – Luke

7

sólo quiero añadir un pequeño detalle en relación con lastInsertId();

Al ingresar más de una fila a la vez, no devuelve el último Id, sino el primer Id de la colección de las últimas inserciones.

Considere el siguiente ejemplo

$sql = 'INSERT INTO my_table (varNumb,userid) VALUES 
    (1, :userid), 
    (2, :userid)'; 
$sql->addNewNames = $db->prepare($sql); 
addNewNames->execute(array(':userid' => $userid)); 

echo $db->lastInsertId(); 

Lo que sucede aquí es que empujo en my_table dos nuevas filas. La identificación de la tabla es autoincremental. Aquí, para el mismo usuario, agrego dos filas con un varNumb diferente.

El valor se hizo eco en el extremo será igual al ID de la fila en la varNumb=1, lo que no significa que el ID de la última fila, pero el ID de la primera fila que se añadió en la última solicitud.

+0

se adhieren a una operación a la vez: parece ser la respuesta general para todos los métodos utilizados, para evitar comportamientos inesperados – RozzA

19

Como @NaturalBornCamper dijo, mysql_insert_id is now deprecated y debería no ser utilizado. Las opciones ahora son usar PDO o mysqli. NaturalBornCamper explicó PDO en su respuesta, así que mostraré cómo hacerlo con MySQLi (MySQL Improved) usando mysqli_insert_id.

// First, connect to your database with the usual info... 
$db = new mysqli($hostname, $username, $password, $databaseName); 
// Let's assume we have a table called 'people' which has a column 
// called 'people_id' which is the PK and is auto-incremented... 
$db->query("INSERT INTO people (people_name) VALUES ('Mr. X')"); 
// We've now entered in a new row, which has automatically been 
// given a new people_id. We can get it simply with: 
$lastInsertedPeopleId = $db->insert_id; 
// OR 
$lastInsertedPeopleId = mysqli_insert_id($db); 

Mira la documentación de PHP para más ejemplos: http://php.net/manual/en/mysqli.insert-id.php

+0

Gracias por capturar eso. Realmente prefiero la notación de puntos de Javascript sobre la notación de flechas de PHP. :/ – Luke

+0

Esto es lo que generalmente uso – JVE999

1

Un ejemplo.

$query_new = "INSERT INTO students(courseid, coursename) VALUES ('', ?)"; 
    $query_new = $databaseConnection->prepare($query_new); 
    $query_new->bind_param('s', $_POST['coursename']); 
    $query_new->execute(); 
    $course_id = $query_new->insert_id; 
    $query_new->close(); 

línea El código $course_id = $query_new->insert_id; mostrará el identificador de la última fila insertada. Espero que esto ayude.

1

Trate como esto se puede obtener la respuesta:

<?php 
$con=mysqli_connect("localhost","root","","new"); 
// Check connection 
if (mysqli_connect_errno()) 
    { 
    echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
    } 

mysqli_query($con,"INSERT INTO new values('nameuser','2015-09-12')"); 

// Print auto-generated id 
echo "New record has id: " . mysqli_insert_id($con); 

mysqli_close($con); 
?> 

Tener un vistazo a los siguientes enlaces:

http://www.w3schools.com/php/func_mysqli_insert_id.asp

http://php.net/manual/en/function.mysql-insert-id.php

También satisfaga tienen una nota que esta extensión era obsoleto en PHP 5.5 y eliminado en PHP 7.0

-1

Otra posible respuesta será:

Cuando se define la tabla, con las columnas y los datos que va a tener. La identificación de la columna puede tener la propiedad AUTO_INCREMENT.

Mediante este método, usted no tiene que preocuparse por el Identificación, es ll ser realizado de forma automática.

Por ejemplo (tomado de w3schools)

CREATE TABLE Persons 
(
ID int NOT NULL AUTO_INCREMENT, 
LastName varchar(255) NOT NULL, 
FirstName varchar(255), 
Address varchar(255), 
City varchar(255), 
PRIMARY KEY (ID) 
) 

la esperanza que esto sea útil para alguien.

Editar: Esta es solo la parte donde se define cómo generar una identificación automática, para obtenerla después de creada, las respuestas anteriores son correctas.

+0

esto no es una respuesta posible en absoluto, OP ya indica que están usando el auto-incremento (aumentos automáticos). OP quiere recuperar esa identificación generada automáticamente. – RozzA

+0

Lo siento, pero ¿qué quiere decir con OP? – neoSmith

+0

la persona que hizo la pregunta - cartel original – RozzA