PDO erhält die zuletzt eingefügte ID

158

Ich habe eine Abfrage und möchte, dass die letzte ID eingefügt wird. Die Feld-ID ist der Primärschlüssel und wird automatisch erhöht.

Ich weiß, dass ich diese Aussage verwenden muss:

LAST_INSERT_ID()

Diese Anweisung funktioniert mit einer Abfrage wie der folgenden:

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

Aber wenn ich die ID mit dieser Anweisung erhalten möchte:

$ID = LAST_INSERT_ID();

Ich erhalte diesen Fehler:

Fatal error: Call to undefined function LAST_INSERT_ID()

Was mache ich falsch?

William Kinaan
quelle

Antworten:

367

Das liegt daran, dass dies eine SQL-Funktion ist, nicht PHP. Sie können verwenden PDO::lastInsertId().

Mögen:

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

Wenn Sie dies mit SQL anstelle der PDO-API tun möchten, würden Sie es wie eine normale Auswahlabfrage tun:

$stmt = $db->query("SELECT LAST_INSERT_ID()");
$lastId = $stmt->fetchColumn();
Corbin
quelle
1
Ja, Sie haben Recht, ich habe es gefunden und es funktioniert. Danke, ich werde die Antwort akzeptieren
William Kinaan
7
@ Rybo111, zuerst ist es Screaming snake case.
Zweitens
2
@ Rybo111, hmm SELECT LAST_INSERT_ID()ist eine MySQL-Funktion
Azerafati
32
Vielleicht ist dies eine dumme Folgefrage, aber ich möchte nur sicher sein. Wenn ich mich auf lastInsertId () verlasse, wird die zuletzt eingefügte ID zurückgegeben, die gerade in meinem aktuell ausgeführten Code aufgetreten ist? Oder gibt es die zuletzt eingefügte ID aus meiner Datenbank zurück? Wenn ich beispielsweise eine stark frequentierte Website habe und während meines Anmeldeskripts etwas einfüge und lastInsertId () verwende, um die eingefügte iD abzurufen, sich aber viele Personen gleichzeitig anmelden, kann ich mich sicher auf lastInsertId ( ) um die zuletzt eingefügte ID von dieser bestimmten Instanz des ausgeführten Codes zu erhalten? Oder gehe ich ein Risiko ein
Art Geigel
41
@ArtGeigel Dies ist die zuletzt eingefügte ID der Verbindung, die der PDO-Instanz zugrunde liegt. Mit anderen Worten, es ist in dem von Ihnen beschriebenen Szenario sicher, da gleichzeitige Abfragen in separaten Verbindungen stattfinden würden.
Corbin
15

lastInsertId () funktioniert nur nach der INSERT-Abfrage.

Richtig:

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

Falsch:

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

Sie können die ID der letzten Transaktion abrufen, indem Sie die Methode lastInsertId () für das Verbindungsobjekt ($ conn) ausführen.

So $ deckel = $ conn-> lastInsertId ();

Bitte lesen Sie die Dokumente https://www.php.net/manual/en/language.oop5.basic.php

Kanton Samad
quelle
2
Willkommen bei Stack Overflow. Wir schätzen nützliche Beiträge, aber bitte duplizieren Sie vorhandene Antworten nicht.
Ihr