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.

Hintswen
fuente

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.

cletus
fuente
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().

soulmerge
fuente
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();
NaturalBornCamper
fuente
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

Luke
fuente
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.

leMoisela
fuente
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.

usuario1012181
fuente
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

Murali
fuente
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);
    }
uriateho
fuente
-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.

neoSmith
fuente
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