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?

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();

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

-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


2
Willkommen bei Stack Overflow. Wir schätzen nützliche Beiträge, aber bitte duplizieren Sie vorhandene Antworten nicht.
Ihr
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.