W3docs

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 ottiene 0.

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 successivo INSERT sovrascrive il valore memorizzato.
  • Nessuna colonna auto-increment → 0. La funzione restituisce 0 (non un errore) quando la tabella in cui si è inserito non ha una colonna AUTO_INCREMENT.
  • UPDATE e DELETE non lo modificano. Solo le istruzioni INSERT che creano un valore auto-increment aggiornano il risultato.
  • Non usare SELECT MAX(id). Un errore comune è leggere l'ID più alto con SELECT 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.

Pratica

Pratica
Quali metodi possono essere utilizzati per ottenere l'ultimo ID inserito in PHP e MySQL?
Quali metodi possono essere utilizzati per ottenere l'ultimo ID inserito in PHP e MySQL?
Was this page helpful?