insert_id
Dans cet article, nous explorons la fonction mysqli_insert_id() en PHP, utilisée pour récupérer l'ID généré par la dernière requête INSERT.
Lorsque vous insérez une ligne dans une table dont la clé primaire est de type AUTO_INCREMENT (ou SERIAL), la base de données génère automatiquement le nouvel ID pour vous. La fonction mysqli_insert_id() vous permet de lire cette valeur générée directement en PHP immédiatement après l'insertion, afin de l'utiliser comme clé étrangère, de la renvoyer dans une réponse API, ou de rediriger l'utilisateur vers le nouvel enregistrement.
Cet article explique ce que renvoie mysqli_insert_id(), aussi bien avec la syntaxe procédurale qu'orientée objet, ainsi que les pièges courants qui amènent la fonction à retourner une mauvaise valeur (ou 0).
Ce que renvoie mysqli_insert_id()
mysqli_insert_id() renvoie l'ID généré par la dernière requête ayant inséré dans une colonne AUTO_INCREMENT, pour la connexion donnée.
- Si la requête précédente a stocké une valeur dans une colonne
AUTO_INCREMENT, elle retourne cette valeur. - Si la requête précédente n'était pas un
INSERT/UPDATEayant touché une colonneAUTO_INCREMENT, elle retourne0. - La valeur est limitée à la connexion courante, de sorte que les insertions simultanées d'autres clients n'affectent jamais ce que vous récupérez. Cela la rend sûre même sur un serveur très sollicité.
Remarque : la valeur reflète le premier ID automatiquement généré par l'instruction. Pour une insertion d'une seule ligne, c'est l'ID de cette ligne ; pour une insertion multi-lignes, c'est l'ID de la première ligne.
Syntaxe
mysqli_insert_id() prend la connexion MySQLi comme seul argument :
int|string mysqli_insert_id(mysqli $mysql)En PHP moderne (8.1+), si une requête échoue, MySQLi lève une exception mysqli_sql_exception plutôt que de retourner false, donc les exemples ci-dessous supposent que les erreurs seront remontées sous forme d'exceptions.
Exemple procédural
Il s'agit du style le plus courant dans les anciens tutoriels et bases de code :
<?php
$mysqli = mysqli_connect("localhost", "username", "password", "database");
mysqli_query(
$mysqli,
"INSERT INTO users (name, email) VALUES ('Ada', '[email protected]')"
);
$id = mysqli_insert_id($mysqli);
echo "Last inserted ID is: " . $id;
mysqli_close($mysqli);
?>Ici, nous ouvrons une connexion avec mysqli_connect(), exécutons un INSERT avec mysqli_query(), puis lisons l'ID généré avec mysqli_insert_id() avant de fermer la connexion.
Exemple orienté objet
La même logique avec l'interface OOP, utilisée par la plupart des nouveaux codes. L'ID généré est exposé via la propriété insert_id :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
$mysqli->query(
"INSERT INTO users (name, email) VALUES ('Ada', '[email protected]')"
);
echo "Last inserted ID is: " . $mysqli->insert_id;
$mysqli->close();
?>Utilisation avec des requêtes préparées
Dans les applications réelles, il est recommandé d'insérer les données utilisateur avec une requête préparée pour éviter les injections SQL. L'ID d'insertion reste disponible ensuite, soit depuis la connexion, soit depuis l'objet statement :
<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
$stmt = $mysqli->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
$name = "Grace";
$email = "[email protected]";
$stmt->execute();
echo "New user id: " . $stmt->insert_id; // same as $mysqli->insert_id here
$stmt->close();
$mysqli->close();
?>Pièges courants
- Lisez-le immédiatement. La valeur ne reflète que le dernier insert sur la connexion. Si vous exécutez un autre
INSERT(même dans une table sans rapport) avant de lire, vous obtiendrez l'ID de celui-ci à la place. Capturez-le dans une variable juste après l'insertion. - Pas de colonne
AUTO_INCREMENTsignifie0. Si la clé primaire de votre table est définie manuellement, rien n'est généré, donc la fonction retourne0. UPDATEetSELECTréinitialisent les attentes. UnUPDATEréussi qui ne touche pas de colonne auto-increment, ou toutSELECT, ne laisse aucun ID généré, et la fonction retourne0.- Les insertions multi-lignes renvoient le premier ID. Après
INSERT INTO t VALUES (...),(...),(...), vous obtenez l'ID de la première ligne insérée ; les suivantes s'incrémentent séquentiellement.
Fonctions associées
mysqli_affected_rows()— combien de lignes la dernière requête a modifiées.mysqli_query()— exécute l'INSERTdont vous lisez l'ID.- Vue d'ensemble de PHP MySQLi — l'extension MySQLi complète.
- Insérer des données dans MySQL — un guide complet d'insertion.
Conclusion
mysqli_insert_id() est le moyen standard pour récupérer la clé primaire auto-générée immédiatement après une insertion. Lisez-la dès après l'INSERT, rappelez-vous qu'elle est par connexion (donc sûre en concurrence), et attendez-vous à obtenir 0 chaque fois que la dernière instruction n'a pas généré de valeur auto-increment.