Inserisci riga PHP / MySQL quindi ottieni 'id'


192

Il campo "id" della mia tabella aumenta automaticamente quando inserisco una riga. Voglio inserire una riga e quindi ottenere quell'ID.

Lo farei proprio come l'ho detto, ma c'è un modo in cui posso farlo senza preoccuparmi del tempo che intercorre tra l'inserimento della riga e l'identificazione?

So che posso interrogare il database per la riga che corrisponde alle informazioni che sono state immesse, ma c'è una grande modifica ci saranno duplicati, con l'unica differenza che è l'id.

Risposte:


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

Vedere mysqli_insert_id().

Qualunque cosa tu faccia, non inserire e quindi fare un " SELECT MAX(id) FROM mytable". Come dici tu, è una condizione di gara e non è necessario. mysqli_insert_id()ha già questa funzionalità.


58
L'equivalente DOP è PDO :: lastInsertId ( us3.php.net/manual/en/pdo.lastinsertid.php ).
Matthew Flaschen,

11
Funziona ancora se ci saranno 10000 inserti asincroni contemporaneamente?
zie1ony,

16
@ zie1ony Sì, funzionerebbe per un milione di inserti asincroni perché MySQL è compatibile ACID. Ogni singolo inserto dai molti inserti asincroni si trova all'interno della propria sessione isolata , da cui proviene l'ID quando chiami mysql_insert_id () dal tuo PHP (o LAST_INSERT_ID () in MySQL)
rodrigo-silveira

7
Nel documento c'è qualcosa da notare: 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

7
Ho bisogno di riscrivere tutto ciò che ho mai scritto -_-
de_nuit

39

La funzione MySQL LAST_INSERT_ID()fa proprio quello che ti serve: recupera l'id che è stato inserito durante questa sessione . Quindi è sicuro da usare, anche se ci sono altri processi (ad esempio altre persone che chiamano lo stesso script esatto) inserendo valori nella stessa tabella.

La funzione PHP mysql_insert_id()fa lo stesso di chiamare 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()'); Il secondo mysql_insert_id()non riflette 600, dove come mysql_query('SELECT LAST_INSERT_ID()')sarà. Per ottenere il mysql_insert_id()riflesso del cambiamento devi prima fare un inserimento o un aggiornamento (che può influenzare 0 righe). Vedi l'ultimo paragrafo di: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id
Cliffordlife

28

Per quanto riguarda il sito Web di PHP, mysql_insert_id è ora obsoleto e dobbiamo usare DOP. Per fare ciò con DOP, procedere come segue:

$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
Abbiamo la possibilità di utilizzare PDO o MySQLi (che descriverò in un'altra risposta qui). Un buon confronto: code.tutsplus.com/tutorials/…
Luca

20

Come diceva @NaturalBornCamper, mysql_insert_id è ora obsoleto e non deve essere utilizzato. Le opzioni ora sono usare PDO o mysqli. NaturalBornCamper ha spiegato DOP nella sua risposta, quindi mostrerò come farlo 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);

Consulta la documentazione di PHP per ulteriori esempi: http://php.net/manual/en/mysqli.insert-id.php


Grazie per averlo colto. Preferisco davvero la notazione a punti di Javascript rispetto alla notazione a freccia di PHP. : /
Luca

7

Voglio solo aggiungere un piccolo dettaglio riguardante lastInsertId();

Quando si immette più di una riga alla volta, non restituisce l'ultimo ID , ma il primo ID della raccolta degli ultimi inserti.

Considera il seguente esempio

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

Quello che succede qui è che spingo in my_tabledue nuove righe. L'id della tabella è auto-incremento. Qui, per lo stesso utente, aggiungo due righe con una diversa varNumb.

Il valore echo alla fine sarà uguale all'id della riga where varNumb=1, il che significa non l'id dell'ultima riga, ma l'id della prima riga che è stata aggiunta nell'ultima richiesta.


attenersi a un'operazione alla volta - sembra essere la risposta globale per tutti i metodi utilizzati, per evitare comportamenti imprevisti
RozzA

1

Un esempio.

    $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 riga di codice $course_id = $query_new->insert_id;visualizzerà l'ID dell'ultima riga inserita. Spero che questo ti aiuti.


1

Prova in questo modo puoi ottenere la risposta:

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

Dai un'occhiata ai seguenti link:

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

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

Inoltre, tieni presente che questa estensione è stata deprecata in PHP 5.5 e rimossa in PHP 7.0



0

Prova questo ... ha funzionato per me!

$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

Un'altra possibile risposta sarà:

Quando definisci la tabella, con le colonne e i dati che avrà. L'ID colonna può avere la proprietà AUTO_INCREMENT .

Con questo metodo, non devi preoccuparti dell'ID , verrà creato automaticamente .

Ad esempio (tratto da 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)
)

Spero che questo sia utile per qualcuno.

Modifica: questa è solo la parte in cui si definisce come generare un ID automatico, per ottenerlo dopo averlo creato, le risposte precedenti prima sono giuste.


questa non è una possibile risposta, OP afferma già che stanno usando l'auto-incremento (aumenti automatici). OP vuole recuperare quell'ID generato automaticamente.
RozzA

Ok, dopo aver letto di nuovo ho notato che il problema non è solo la generazione dell'ID, ma anche OP vuole ottenere quell'id. Grazie per la definizione: D
neoSmith
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.