Fila de inserción de PHP / MySQL luego obtenga 'id'


192

El campo 'id' de mi tabla automática aumenta cuando inserto una fila. Quiero insertar una fila y luego obtener esa 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 en la base de datos la fila que coincide con la información que se ingresó, pero hay un gran cambio, habrá duplicados, y la única diferencia será la identificación.

Respuestas:


255
$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().

Hagas lo que hagas, no insertes y luego haz un " SELECT MAX(id) FROM mytable". Como dices, es una condición de carrera y no hay necesidad. mysqli_insert_id()Ya tiene esta funcionalidad.


58
El PDO equivalente es PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen

11
¿Sigue funcionando si habrá 10000 inserciones asíncronas al mismo tiempo?
zie1ony

16
@ zie1ony Sí, funcionaría para un millón de inserciones asíncronas porque MySQL es compatible con ACID. Cada inserción individual de las muchas inserciones asíncronas está dentro de su propia sesión aislada , que es de donde proviene el ID cuando llama a mysql_insert_id () desde su PHP (o LAST_INSERT_ID () en MySQL)
rodrigo-silveira

77
En el documento hay algo para tener en cuenta: mysql_insert_id() will convert the return type of the native MySQL C API function mysql_insert_id() to a type of long (named int in PHP). If your AUTO_INCREMENT column has a column type of BIGINT (64 bits) the conversion may result in an incorrect value. Instead, use the internal MySQL SQL function LAST_INSERT_ID() in an SQL query. For more information about PHP's maximum integer values, please see the integer documentation.\
Elbek

77
necesito reescribir todo lo que he escrito -_-
de_nuit

39

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 exactamente el mismo script, 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 echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID(600)'); echo mysql_insert_id(); mysql_query('SELECT LAST_INSERT_ID()'); El segundo mysql_insert_id()no refleja 600, donde como lo mysql_query('SELECT LAST_INSERT_ID()')hará. Para mysql_insert_id()que refleje el cambio, primero debe hacer una inserción o una actualización (que puede afectar a 0 filas). Vea el último párrafo de: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

En cuanto al sitio web de PHP, mysql_insert_id ahora está en desuso y debemos usar PDO. Para hacer esto con PDO, proceda 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();

44
Tenemos la opción de usar PDO o MySQLi (que describo en otra respuesta aquí). Una buena comparación: code.tutsplus.com/tutorials/…
Luke

20

Como dijo @NaturalBornCamper, mysql_insert_id ahora está en desuso y no debe usarse. Las opciones ahora son usar PDO o mysqli. NaturalBornCamper explicó PDO en su respuesta, así que le 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);

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


Gracias por atrapar eso. Realmente prefiero la notación de puntos de Javascript sobre la notación de flecha de PHP. : /
Luke

7

Solo quiero agregar un pequeño detalle sobre 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 presiono my_tabledos filas nuevas. La identificación de la tabla es de incremento automático. Aquí, para el mismo usuario, agrego dos filas con una diferente varNumb.

El valor repetido al final será igual a la identificación de la fila donde varNumb=1, lo que significa no la identificación de la última fila, sino la identificación de la primera fila que se agregó en la última solicitud.


apegarse a una operación a la vez - parece ser la respuesta general para todos los métodos utilizados, para evitar comportamientos inesperados
RozzA

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();

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


1

Intenta así, puedes 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);
?>

Echa 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 tenga en cuenta que esta extensión fue obsoleta en PHP 5.5 y eliminada en PHP 7.0



0

Prueba esto ... ¡funcionó para mí!

$sql = "INSERT INTO tablename (row_name) VALUES('$row_value')";
    if (mysqli_query($conn, $sql)) {
    $last_id = mysqli_insert_id($conn);
    $msg1 = "New record created successfully. Last inserted ID is: " . $last_id;
} else {
    $msg_error = "Error: " . $sql . "<br>" . mysqli_error($conn);
    }

-1

Otra posible respuesta será:

Cuando defina la tabla, con las columnas y los datos que tendrá. El ID de la columna puede tener la propiedad AUTO_INCREMENT .

Por este método, no tiene que preocuparse por la identificación , se realizará automáticamente .

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)
)

Espero que esto sea útil para alguien.

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


esta no es una respuesta posible en absoluto, OP ya afirma que están utilizando el incremento automático (aumentos automáticos). OP quiere recuperar esa identificación generada automáticamente.
RozzA

De acuerdo, después de leer nuevamente, me di cuenta de que el problema no solo es generar la identificación, sino que OP también quiere obtener esa identificación. Gracias por la definición: D
neoSmith
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.