Come recuperare l'ultimo ID inserito in PHP e MySQL
Guida al recupero dell'ultimo ID inserito in PHP e MySQL con MySQLi e PDO, con esempi pratici e suggerimenti sulle insidie comuni.
Quando si inserisce una riga in una tabella MySQL la cui chiave primaria è una colonna AUTO_INCREMENT, il database genera automaticamente il nuovo ID. PHP offre un modo per leggere quell'ID subito dopo l'inserimento, senza dover eseguire una seconda query SELECT. Questa pagina mostra come farlo con le estensioni MySQLi e PDO, perché il valore è affidabile e quali sono le insidie da evitare.
L'ultimo ID inserito viene usato più spesso per collegare record correlati: si inserisce un nuovo user, si ottiene il suo ID e poi si inseriscono righe in orders o profiles che vi fanno riferimento come chiave esterna.
Come funziona
Entrambe le funzioni descritte di seguito restituiscono l'ID generato dal più recente INSERT eseguito con successo sulla connessione al database corrente:
mysqli_insert_id($conn)— MySQLi (procedurale o orientato agli oggetti).PDO::lastInsertId()— PDO.
Due dettagli importanti:
- Il valore è per connessione. Anche se altri utenti inseriscono righe contemporaneamente, si ottiene sempre l'ID generato dalla propria connessione, quindi non esiste alcuna race condition.
- Restituisce un valore diverso da zero solo quando la tabella in cui si è inserito dispone di una colonna
AUTO_INCREMENT. Se la tabella non ha una chiave auto-increment, si ottiene0.
Prerequisiti
Prima di iniziare, è necessario disporre di alcuni prerequisiti:
- Un server web con PHP installato
- Un database MySQL
- Accesso all'interfaccia phpMyAdmin o a uno strumento di gestione del database equivalente
- Una tabella con una chiave primaria
AUTO_INCREMENT. Gli esempi di seguito assumono questa struttura:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);Consulta Creare una tabella MySQL per ulteriori informazioni sulla definizione delle tabelle.
Stabilire una connessione
Il primo passo per recuperare l'ultimo ID inserito è stabilire una connessione al database. Con MySQLi questo si fa usando la funzione mysqli_connect(), che richiede i seguenti parametri:
- Il nome del server del database
- Il nome utente utilizzato per accedere al database
- La password dell'utente del database
- Il nome del database a cui connettersi
Ecco un esempio di come stabilire una connessione a un database:
<?php
$server = "localhost";
$username = "root";
$password = "password";
$database = "database_name";
$conn = mysqli_connect($server, $username, $password, $database);
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
echo "Connected successfully";
?>Per un approfondimento sulla connessione, consulta Connettersi a un database MySQL.
Scrivere l'istruzione SQL
Una volta stabilita la connessione al database, il passo successivo è scrivere l'istruzione SQL che verrà usata per inserire i dati nel database.
Ecco un esempio di istruzione SQL che inserisce dati in una tabella del database:
INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');Eseguire l'istruzione SQL
Una volta scritta l'istruzione SQL, il passo successivo è eseguirla. Questo si fa usando la funzione mysqli_query(), che richiede i seguenti parametri:
- La connessione al database
- L'istruzione SQL da eseguire
Ecco un esempio di come eseguire l'istruzione SQL:
<?php
$sql = "INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3')";
if (mysqli_query($conn, $sql)) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . mysqli_error($conn);
}
?>Nota sulla sicurezza: Negli ambienti di produzione, usa sempre le prepared statement per prevenire gli attacchi di SQL injection.
Recuperare l'ultimo ID inserito
Una volta inseriti i dati nel database, il passo successivo è recuperare l'ID dell'ultimo record inserito. Questo si fa usando la funzione mysqli_insert_id(), che richiede il seguente parametro:
- La connessione al database
Ecco un esempio di come recuperare l'ultimo ID inserito:
<?php
$last_id = mysqli_insert_id($conn);
echo "Last inserted ID is: " . $last_id;
?>Chiudere la connessione
Una volta recuperato l'ultimo ID inserito, è importante chiudere la connessione al database per evitare rischi di sicurezza. Questo si fa usando la funzione mysqli_close(), che richiede il seguente parametro:
- La connessione al database
Ecco un esempio di come chiudere la connessione al database:
<?php
mysqli_close($conn);
?>Esempio completo (MySQLi, prepared statement)
Nel codice reale è opportuno passare i dati dell'utente attraverso una prepared statement anziché concatenarli nella stringa SQL. Lo schema è identico: si esegue l'inserimento e poi si legge l'ID. Qui tutto è messo insieme:
<?php
$conn = mysqli_connect("localhost", "root", "password", "database_name");
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}
$stmt = mysqli_prepare($conn, "INSERT INTO users (name, email) VALUES (?, ?)");
mysqli_stmt_bind_param($stmt, "ss", $name, $email);
$name = "Jane Doe";
$email = "[email protected]";
mysqli_stmt_execute($stmt);
$last_id = mysqli_insert_id($conn);
echo "New user inserted with ID: " . $last_id;
mysqli_stmt_close($stmt);
mysqli_close($conn);
?>Dopo che l'inserimento ha avuto successo, $last_id contiene il valore generato da MySQL per la colonna id — ad esempio 1 al primo inserimento, 2 al successivo e così via.
Ottenere l'ultimo ID con PDO
Se ci si connette con PDO invece di MySQLi, si usa il metodo lastInsertId() sull'oggetto connessione:
<?php
$pdo = new PDO("mysql:host=localhost;dbname=database_name", "root", "password");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(["John Doe", "[email protected]"]);
$last_id = $pdo->lastInsertId();
echo "New user inserted with ID: " . $last_id;
?>Nota che PDO::lastInsertId() restituisce l'ID come string, quindi occorre eseguire il cast con (int) se si ha bisogno di un tipo numerico.
Insidie comuni
- Chiamarlo subito dopo l'inserimento. Esegui
mysqli_insert_id()/lastInsertId()prima di eseguire qualsiasi altra query sulla stessa connessione — un successivoINSERTsovrascrive il valore memorizzato. - Nessuna colonna auto-increment →
0. La funzione restituisce0(non un errore) quando la tabella in cui si è inserito non ha una colonnaAUTO_INCREMENT. UPDATEeDELETEnon lo modificano. Solo le istruzioniINSERTche creano un valore auto-increment aggiornano il risultato.- Non usare
SELECT MAX(id). Un errore comune è leggere l'ID più alto conSELECT MAX(id) FROM users. In caso di inserimenti concorrenti, questo può restituire la riga di un altro utente. Le funzioni dedicate sono scoped alla connessione e sono sicure.
Conclusione
In questo articolo abbiamo mostrato come recuperare l'ultimo ID inserito in PHP e MySQL. Seguendo questi passaggi, dovresti essere in grado di recuperare l'ID dell'ultimo record inserito nel tuo database. Per ottenere i migliori risultati, inserisci sempre i dati tramite prepared statement e leggi l'ID sulla stessa connessione immediatamente dopo l'inserimento.
Capitoli correlati: Inserire dati in MySQL, Prepared Statement e Selezionare dati da MySQL.