W3docs

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/UPDATE ayant touché une colonne AUTO_INCREMENT, elle retourne 0.
  • 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_INCREMENT signifie 0. Si la clé primaire de votre table est définie manuellement, rien n'est généré, donc la fonction retourne 0.
  • UPDATE et SELECT réinitialisent les attentes. Un UPDATE réussi qui ne touche pas de colonne auto-increment, ou tout SELECT, ne laisse aucun ID généré, et la fonction retourne 0.
  • 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

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.

Practice

Pratique
Que fait la fonction PHP mysqli_insert_id ?
Que fait la fonction PHP mysqli_insert_id ?
Was this page helpful?