PDO récupère le dernier identifiant inséré

158

J'ai une question et je souhaite insérer le dernier identifiant. L'ID de champ est la clé primaire et l'incrémentation automatique.

Je sais que je dois utiliser cette déclaration:

LAST_INSERT_ID()

Cette instruction fonctionne avec une requête comme celle-ci:

$query = "INSERT INTO `cell-place` (ID) VALUES (LAST_INSERT_ID())";

Mais si je veux obtenir l'ID en utilisant cette instruction:

$ID = LAST_INSERT_ID();

J'obtiens cette erreur:

Fatal error: Call to undefined function LAST_INSERT_ID()

Qu'est-ce que je fais mal?

William Kinaan
la source

Réponses:

367

C'est parce que c'est une fonction SQL, pas PHP. Vous pouvez utiliser PDO::lastInsertId().

Comme:

$stmt = $db->prepare("...");
$stmt->execute();
$id = $db->lastInsertId();

Si vous voulez le faire avec SQL au lieu de l'API PDO, vous le feriez comme une requête de sélection normale:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Corbin
la source
1
oui vous avez raison, je l'ai trouvé et ça marche, merci, j'accepterai la réponse
William Kinaan
7
@ rybo111, c'est d'abord Screaming snake case. deuxièmement, c'est la convention de dénomination MySQL et n'est pas PHP
azerafati
2
@ rybo111, hmm SELECT LAST_INSERT_ID()est une fonction MySQL
azerafati
32
C'est peut-être une question de suivi stupide, mais je veux juste être certain. Lorsque je compte sur lastInsertId (), est-ce qu'il renvoie le dernier ID inséré qui s'est produit dans mon code en cours d'exécution alors? Ou renvoie-t-il le dernier identifiant inséré dans ma base de données? Par exemple, si j'ai un site Web très fréquenté et que j'insère quelque chose pendant mon script de connexion et que j'utilise lastInsertId () pour obtenir l'iD inséré, mais que beaucoup de gens se connectent en même temps, suis-je sûr de me fier à lastInsertId ( ) pour obtenir le dernier ID inséré à partir de cette instance spécifique de code en cours d'exécution? Ou est-ce que je cours un risque
Art Geigel
41
@ArtGeigel Ce sera le dernier ID inséré de la connexion sous-jacente à l'instance PDO. En d'autres termes, il est sûr dans le scénario que vous avez décrit, car les requêtes simultanées auraient lieu dans des connexions séparées.
Corbin
15

lastInsertId () ne fonctionne qu'après la requête INSERT.

Correct:

$stmt = $this->conn->prepare("INSERT INTO users(userName,userEmail,userPass) 
                              VALUES(?,?,?);");
$sonuc = $stmt->execute([$username,$email,$pass]);
$LAST_ID = $this->conn->lastInsertId();

Incorrect:

$stmt = $this->conn->prepare("SELECT * FROM users");
$sonuc = $stmt->execute();
$LAST_ID = $this->conn->lastInsertId(); //always return string(1)=0
Ayhan Kesicioğlu
la source
-5

Vous pouvez obtenir l'id de la dernière transaction en exécutant la méthode lastInsertId () sur l'objet de connexion ($ conn).

Comme ceci $ lid = $ conn-> lastInsertId ();

Veuillez consulter la documentation https://www.php.net/manual/en/language.oop5.basic.php

Kanton Samad
la source
2
Bienvenue dans Stack Overflow. Nous apprécions les contributions utiles, mais veuillez ne pas dupliquer les réponses existantes.
Votre bon sens