Comment récupérer le dernier ID inséré en PHP et MySQL
Apprenez à récupérer le dernier ID inséré en PHP et MySQL avec MySQLi et PDO, avec des exemples pratiques et les erreurs courantes à éviter.
Lorsque vous insérez une ligne dans une table MySQL dont la clé primaire est une colonne AUTO_INCREMENT, la base de données génère le nouvel ID à votre place. PHP vous permet de lire cet ID immédiatement après l'insertion, sans exécuter une seconde requête SELECT. Cette page montre comment procéder avec les extensions MySQLi et PDO, pourquoi la valeur est fiable, et les pièges à éviter.
Le dernier ID inséré est le plus souvent utilisé pour relier des enregistrements associés : insérer un nouvel user, récupérer son ID, puis insérer des lignes dans orders ou profiles qui y font référence en tant que clé étrangère.
Fonctionnement
Les deux fonctions décrites ci-dessous renvoient l'ID généré par le plus récent INSERT réussi sur la connexion de base de données en cours :
mysqli_insert_id($conn)— MySQLi (procédural ou orienté objet).PDO::lastInsertId()— PDO.
Deux détails importants :
- La valeur est par connexion. Même si d'autres utilisateurs insèrent des lignes en même temps, vous obtenez toujours l'ID généré par votre connexion, il n'y a donc pas de condition de concurrence.
- Elle ne renvoie une valeur non nulle que lorsque la table insérée possède une colonne
AUTO_INCREMENT. Si la table ne possède pas de clé auto-incrémentée, vous obtenez0.
Prérequis
Avant de commencer, quelques prérequis doivent être en place :
- Un serveur web avec PHP installé
- Une base de données MySQL
- L'accès à l'interface phpMyAdmin ou à un outil de gestion de base de données similaire
- Une table avec une clé primaire
AUTO_INCREMENT. Les exemples ci-dessous supposent celle-ci :
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100)
);Consultez Créer une table MySQL pour plus d'informations sur la définition des tables.
Établir une connexion
La première étape pour récupérer le dernier ID inséré consiste à établir une connexion à la base de données. Avec MySQLi, cela se fait via la fonction mysqli_connect(), qui requiert les paramètres suivants :
- Le nom du serveur de base de données
- Le nom d'utilisateur utilisé pour accéder à la base de données
- Le mot de passe de l'utilisateur de la base de données
- Le nom de la base de données à laquelle se connecter
Voici un exemple de connexion à une base de données :
<?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";
?>Pour une présentation plus approfondie de la connexion, consultez Se connecter à une base de données MySQL.
Rédiger l'instruction SQL
Une fois la connexion à la base de données établie, l'étape suivante consiste à rédiger l'instruction SQL qui sera utilisée pour insérer les données dans la base de données.
Voici un exemple d'instruction SQL qui insère des données dans une table de base de données :
INSERT INTO table_name (column1, column2, column3)
VALUES ('value1', 'value2', 'value3');Exécuter l'instruction SQL
Une fois l'instruction SQL rédigée, l'étape suivante consiste à l'exécuter. Cela se fait via la fonction mysqli_query(), qui requiert les paramètres suivants :
- La connexion à la base de données
- L'instruction SQL à exécuter
Voici un exemple d'exécution de l'instruction 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);
}
?>Note de sécurité : Dans les environnements de production, utilisez toujours des instructions préparées pour prévenir les attaques par injection SQL.
Récupérer le dernier ID inséré
Une fois les données insérées dans la base de données, l'étape suivante consiste à récupérer l'ID du dernier enregistrement inséré. Cela se fait via la fonction mysqli_insert_id(), qui requiert le paramètre suivant :
- La connexion à la base de données
Voici un exemple de récupération du dernier ID inséré :
<?php
$last_id = mysqli_insert_id($conn);
echo "Last inserted ID is: " . $last_id;
?>Fermer la connexion
Une fois le dernier ID inséré récupéré, il est important de fermer la connexion à la base de données pour éviter tout risque de sécurité. Cela se fait via la fonction mysqli_close(), qui requiert le paramètre suivant :
- La connexion à la base de données
Voici un exemple de fermeture de la connexion à la base de données :
<?php
mysqli_close($conn);
?>Exemple complet (MySQLi, instruction préparée)
Dans un vrai code, vous devriez passer les données utilisateur via une instruction préparée plutôt que de les concaténer dans la chaîne SQL. Le principe est identique : exécuter l'insertion, puis lire l'ID. Voici tout assemblé :
<?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);
?>Après la réussite de l'insertion, $last_id contient la valeur que MySQL a générée pour la colonne id — par exemple 1 lors de la première insertion, 2 lors de la suivante, et ainsi de suite.
Obtenir le dernier ID avec PDO
Si vous vous connectez avec PDO au lieu de MySQLi, utilisez la méthode lastInsertId() sur l'objet de connexion :
<?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;
?>Notez que PDO::lastInsertId() renvoie l'ID sous forme de string, donc utilisez un cast (int) si vous avez besoin d'un type numérique.
Erreurs courantes
- Appelez-la juste après l'insertion. Exécutez
mysqli_insert_id()/lastInsertId()avant d'exécuter toute autre requête sur la même connexion — unINSERTultérieur écrase la valeur stockée. - Pas de colonne auto-incrémentée →
0. La fonction renvoie0(pas une erreur) lorsque la table dans laquelle vous avez inséré n'a pas de colonneAUTO_INCREMENT. UPDATEetDELETEne la modifient pas. Seules les instructionsINSERTqui créent une valeur auto-incrémentée mettent à jour le résultat.- N'utilisez pas
SELECT MAX(id). Une erreur fréquente consiste à lire l'ID le plus élevé avecSELECT MAX(id) FROM users. Lors d'insertions simultanées, cela peut renvoyer la ligne d'un autre utilisateur. Les fonctions dédiées sont limitées à la connexion et sans risque de concurrence.
Conclusion
Dans cet article, nous vous avons montré comment récupérer le dernier ID inséré en PHP et MySQL. En suivant ces étapes, vous devriez être en mesure de récupérer l'ID du dernier enregistrement inséré dans votre base de données. Pour de meilleurs résultats, insérez toujours les données via des instructions préparées et lisez l'ID sur la même connexion immédiatement après l'insertion.
Chapitres associés : Insérer des données dans MySQL, Instructions préparées et Sélectionner des données depuis MySQL.