Come ottengo l'ultimo ID inserito di una tabella MySQL in PHP?


93

Ho una tabella in cui vengono inseriti frequentemente nuovi dati. Ho bisogno dell'ultimo ID del tavolo. Come posso fare questo?

È simile a SELECT MAX(id) FROM table?


1
sì, questa query restituirà l'ultimo id della tabella. Ma una condizione è che l'ID deve essere la chiave primaria. Così puoi evitare il pentimento.
satish

7
@sathish: il problema principale di questo metodo è la concorrenza .
CMS

3
Per elaborare: il problema è che se qualcun altro inserisce qualcosa nella tabella tra il tuo INSERTe la query per MAX(id), potresti ottenere un id che non è il tuo ultimo ID.
inganno

3
@Jocelyn quella domanda è stata posta un anno dopo con migliaia di visualizzazioni in meno rispetto a questa domanda.
Naftali aka Neal

3
@Neal, hai ragione. L'altra domanda dovrebbe essere chiusa come duplicato di questa.
Jocelyn

Risposte:


133

Se stai usando PDO, usa PDO::lastInsertId.

Se stai usando Mysqli, usa mysqli::$insert_id.

Se stai ancora usando Mysql:

Per favore, non usare mysql_*funzioni nel nuovo codice . Non vengono più mantenuti e sono ufficialmente deprecati . Vedi la scatola rossa ? Imparainvece le dichiarazioni preparate e usa PDO o MySQLi : questo articolo ti aiuterà a decidere quali. Se scegli PDO, ecco un buon tutorial .

Ma se devi, usa mysql_insert_id.


Il problema con questo è che se si verificano molti inserimenti (ad esempio, anche il database registra qualcosa) è possibile ottenere l'ID sbagliato.
Mike

@Mike Not se usi mysql_insert_id subito dopo il tuo mysql_query. Se ovviamente esegui diverse altre query sulla stessa connessione in mezzo, beh, non c'è nulla che possa aiutarti.
inganno

7
Per garantire che non otterrai MAI un ID sbagliato, racchiudi il tuo codice con una TRANSAZIONE .
Marcelo Assis

28
mysql si assicura che questo sia l'ultimo id DELLA CONNESSIONE CORRENTE, quindi non ci saranno problemi se metti questa istruzione subito dopo la query di inserimento. Nessuna preoccupazione per altri processi che eseguono inserimenti, non è necessario racchiudere questo in una transazione. Il manuale di mysql dice: "L'ID che è stato generato viene mantenuto nel server in base alla connessione. Ciò significa che il valore restituito dalla funzione a un determinato client è il primo valore AUTO_INCREMENT generato per la dichiarazione più recente che influisce su una colonna AUTO_INCREMENT da quel client . Questo è il motivo per cui non dovresti utilizzare select MAX (ID)
woens

1
@deceze, che cos'è questo PDOpregiudizio che vediamo ovunque? Diamo un'occhiata di nuovo al confronto delle funzionalità . È chiaro che mysqliè il vincitore quando devi sporcarti le mani con cose di basso livello. In altre parole, anche se uno sceglie il DOP, alla fine dovrà mysqlicomunque usarlo .
Pacerier

53

c'è una funzione per sapere qual era l'ultimo id inserito nella connessione corrente

mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();

inoltre l'utilizzo di max è una cattiva idea perché potrebbe portare a problemi se il codice viene utilizzato contemporaneamente in due sessioni diverse.

Questa funzione si chiama mysql_insert_id


2
mysql _ (...) è deprecato nella versione PHP> = 5.5.
Iago

Sì, lo sto solo ricordando. :)
Iago



8

Ciò che hai scritto ti darebbe il massimo idsupponendo che fossero unici e auto-incrementati, il che andrebbe bene supponendo che tu stia bene con l'invito a problemi di concorrenza.
Dato che stai usando MySQL come database, esiste una funzione specifica LAST_INSERT_ID()che funziona solo sulla connessione corrente che ha eseguito l'inserimento.
PHP offre una funzione specifica anche per quella chiamata mysql_insert_id.


6

Prova questo dovrebbe funzionare bene:

$link = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "INSERT blah blah blah...";
$result = mysqli_query($link, $query);

echo mysqli_insert_id($link);

1
Grazie per averlo notato. Ho modificato il codice, in realtà è $ link (variabile che contiene la connessione)
Sandhu

3

Puoi ottenere l'ultimo ID inserito dalla funzione php incorporata mysql_insert_id();

$id = mysql_insert_id();

puoi anche ottenere l'ultimo ID da

$id = last_insert_id();

4
Inoltre, questo è sbagliato perché suggerisce di utilizzare una libreria deprecata. Veramente, cancellalo
STT LCU

@STTLCU Quale snippet qui è deprecato?
TheBlackBenzKid

@TheBlackBenzKid entrambi, perché sono basati sulle funzioni mysql_ *
STT LCU

@Rahul $ id = last_insert_id (); non funziona in quanto potrebbe essere deprecato.
Esha

3

Per ottenere l'ultimo ID inserito in codeigniter Dopo aver eseguito la query di inserimento basta usare una funzione chiamata insert_id()sul database, restituirà l'ultimo ID inserito

Ex:

$this->db->insert('mytable',$data);
echo $this->db->insert_id(); //returns last inserted id

in una riga

echo $this->db->insert('mytable',$data)->insert_id();

3

Va bene da usare mysql_insert_id(), ma c'è una nota specifica sull'uso, devi chiamarlo dopo aver eseguito la query INSERT, significa nella stessa sessione di script. Se lo usi altrimenti non funzionerebbe correttamente.


2

Pulito e semplice -

$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];

1

NOTA: se esegui più inserimenti con una sola istruzione mysqli :: insert_id non sarà corretto.

La tavola:

create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));

Ora se lo fai:

insert into xyz (name) values('one'),('two'),('three');

Il mysqli :: insert_id sarà 1 e non 3.

Per ottenere il valore corretto fare:

mysqli::insert_id + mysqli::affected_rows) - 1

Questo è stato un documento ma è un po 'oscuro.


1

Preferisco usare una sintassi MySQL pura per ottenere l'ultimo id auto_increment della tabella che desidero.

php mysql_insert_id () e mysql last_insert_id () forniscono solo l'ID dell'ultima transazione.

Se vuoi l'ultimo ID auto_incrementato di qualsiasi tabella nel tuo schema (non solo l'ultima transazione), puoi usare questa query

SELECT AUTO_INCREMENT FROM information_schema.TABLES
    WHERE TABLE_SCHEMA = 'my_database' 
    AND TABLE_NAME = 'my_table_name';

Questo è tutto.


Sono dubbioso su questo, poiché questo SQL è semplicemente sbagliato nel contesto della domanda ... Anche questo metodo sembra incline a possibili condizioni di gara quando due o più client eseguono questo SQL nello stesso momento ... non sono sicuro quanto velocemente i dati di questa colonna vengono aggiornati dopo un inserimento che mi rende dubbioso ... Le funzioni PHP che possono ottenere l'ultimo ID si basano sul livello di connessione / sessione (fa più o meno lo stesso di LAST_INSERT_ID () di MySQL ), il che rende il salvataggio delle condizioni di gara
Raymond Nijland

1

È triste non vedere risposte con un esempio.

Utilizzando Mysqli :: $ insert_id :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id; // returns last ID

Utilizzo di PDO :: lastInsertId :

$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId(); // returns last ID

0

Usando la MySQLitransazione a volte non ero in grado di ottenere mysqli::$insert_id, perché restituiva 0. Soprattutto se stavo usando stored procedure, che eseguivano INSERTs. Quindi c'è un altro modo all'interno della transazione:

<?php

function getInsertId(mysqli &$instance, $enforceQuery = false){
    if(!$enforceQuery)return $instance->insert_id;

    $result = $instance->query('SELECT LAST_INSERT_ID();');

    if($instance->errno)return false;

    list($buffer) = $result->fetch_row();

    $result->free();

    unset($result);

    return $buffer;
}

?>

0

Usa mysqli poiché mysql è deprecato

<?php
$mysqli = new mysqli("localhost", "yourUsername", "yourPassword", "yourDB");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
// Conside employee table with id,name,designation
$query = "INSERT INTO myCity VALUES (NULL, 'Ram', 'Developer')";
$mysqli->query($query);

printf ("New Record has id %d.\n", $mysqli->insert_id);

/* close connection */
$mysqli->close();
?>

0

Provai

mysqli_insert_id ($ dbConnectionObj)

Questo restituisce l'ultimo ID inserito della connessione corrente, quindi se stai gestendo correttamente le tue connessioni dovrebbe funzionare. Almeno per me ha funzionato.


0

Si prega di utilizzare PDP e quindi provare questo

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();


-1

Da tutta questa discussione presumo che il motivo per controllare max id sia sapere quale id dovrebbe essere il prossimo .. (se il mio max id è 5, il prossimo sarà 5 + 1 = 6).

>> Se questo non è il motivo, le mie migliori scuse

Caso in cui qualcun altro INSERISCE le informazioni tra CHECK e INSERT ti darebbe un ID sbagliato.

Quindi può essere risolto se crei hash che potrebbe includere timestamp o altro valore univoco.

Quindi nella stessa funzione puoi inserire le tue informazioni con valori vuoti e il tuo hash. Ciò creerebbe un ID se hai selezionato AUTO_INCRECEMENT.

Quindi nella stessa funzione avresti ancora il tuo hash e potresti cercare id con lo stesso hash. E poi potresti completare l'inserimento di valori vuoti con mysql UPDATE.

Questo include un po 'più di connessioni, ma è ancora un modo per farlo ...

Buona fortuna a risolverlo.


-2

Se la tua tabella ha una colonna AUTO INCREMENT come UserID, Emp_ID, .. allora puoi usare questa query per ottenere l'ultimo record inserito SELECT * FROM table_name dove UserID = (seleziona MAX (UserID) da table_name) Nel codice PHP:

$con = mysqli_connect('localhost', 'userid', 'password', 'database_name');
                                if (!$con) {
                                    die('Could not connect: ' . mysqli_error($con));
                                }
                                $sql = "SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
                                $result = mysqli_query($con, $sql);

Quindi puoi utilizzare i dati recuperati come requisito


Non crittografare le password , quando l'aggressore ottiene il DB riceverà anche la chiave di crittografia.
Zaph

-3
mysql_query("INSERT INTO mytable (product) values ('kossu')");

printf("Last inserted record has id %d\n", ***mysql_insert_id()***);
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.