insert_id
Dieser Artikel erklärt die PHP-Funktion mysqli_insert_id(), mit der die vom letzten INSERT generierte ID abgerufen wird.
Wenn Sie eine Zeile in eine Tabelle einfügen, die einen AUTO_INCREMENT- (oder SERIAL-) Primärschlüssel besitzt, generiert die Datenbank die neue ID für Sie. Die Funktion mysqli_insert_id() ermöglicht es Ihnen, diesen generierten Wert direkt nach dem Einfügen in PHP auszulesen, damit Sie ihn als Fremdschlüssel verwenden, in einer API-Antwort zurückgeben oder den Benutzer zum neuen Datensatz weiterleiten können.
Dieser Artikel erläutert, was mysqli_insert_id() zurückgibt, zeigt sowohl die prozedurale als auch die objektorientierte Syntax und beschreibt häufige Fallstricke, die dazu führen, dass die Funktion den falschen Wert (oder 0) zurückgibt.
Was mysqli_insert_id() zurückgibt
mysqli_insert_id() gibt die ID zurück, die von der letzten Abfrage generiert wurde, die in eine AUTO_INCREMENT-Spalte eingefügt hat – bezogen auf die angegebene Verbindung.
- Hat die vorherige Abfrage einen Wert in eine
AUTO_INCREMENT-Spalte gespeichert, wird dieser Wert zurückgegeben. - War die vorherige Abfrage kein
INSERT/UPDATE, das eineAUTO_INCREMENT-Spalte berührt hat, wird0zurückgegeben. - Der Wert ist auf die aktuelle Verbindung beschränkt, sodass gleichzeitige Einfügungen anderer Clients niemals das Ergebnis beeinflussen. Das macht die Funktion auch auf stark ausgelasteten Servern sicher.
Hinweis: Der Wert entspricht der ersten automatisch generierten ID der Anweisung. Bei einer Einzelzeilen-Einfügung ist das die ID dieser Zeile; bei einer Mehrfachzeilen-Einfügung ist es die ID der ersten Zeile.
Syntax
mysqli_insert_id() erwartet die MySQLi-Verbindung als einziges Argument:
int|string mysqli_insert_id(mysqli $mysql)In modernem PHP (8.1+) wirft MySQLi bei einem fehlgeschlagenen Query eine mysqli_sql_exception anstatt false zurückzugeben. Die folgenden Beispiele gehen daher davon aus, dass Fehler als Ausnahmen ausgelöst werden.
Prozedurales Beispiel
Dies ist der am häufigsten anzutreffende Stil in älteren Tutorials und Codebasen:
<?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);
?>Hier öffnen wir eine Verbindung mit mysqli_connect(), führen ein INSERT mit mysqli_query() aus und lesen die generierte ID anschließend mit mysqli_insert_id() aus, bevor wir die Verbindung schließen.
Objektorientiertes Beispiel
Die gleiche Logik mit dem OOP-Interface, das in neuem Code bevorzugt wird. Die generierte ID ist als Eigenschaft insert_id verfügbar:
<?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();
?>Verwendung mit Prepared Statements
In echten Anwendungen sollten Sie Benutzerdaten mit einem Prepared Statement einfügen, um SQL-Injection zu vermeiden. Die Einfüge-ID ist danach weiterhin verfügbar – entweder über das Verbindungsobjekt oder das Statement-Objekt:
<?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();
?>Häufige Fallstricke
- Sofort auslesen. Der Wert entspricht nur dem letzten Einfügevorgang auf der Verbindung. Wenn Sie vor dem Auslesen ein weiteres
INSERTausführen (auch in eine unrelated Tabelle), erhalten Sie stattdessen dessen ID. Speichern Sie den Wert unmittelbar nach dem Einfügen in einer Variable. - Keine
AUTO_INCREMENT-Spalte bedeutet0. Wenn der Primärschlüssel Ihrer Tabelle manuell gesetzt wird, wird nichts generiert, und die Funktion gibt0zurück. UPDATEundSELECTsetzen Erwartungen zurück. Ein erfolgreichesUPDATE, das keine Auto-Increment-Spalte berührt, oder ein beliebigesSELECThinterlässt keine neue generierte ID, und die Funktion gibt0zurück.- Mehrfachzeilen-Einfügungen geben die erste ID zurück. Nach
INSERT INTO t VALUES (...),(...),(...)erhalten Sie die ID der ersten eingefügten Zeile; die übrigen folgen sequenziell.
Verwandte Funktionen
mysqli_affected_rows()— wie viele Zeilen die letzte Abfrage geändert hat.mysqli_query()— führt dasINSERTaus, dessen ID Sie auslesen.- PHP MySQLi overview — die vollständige MySQLi-Erweiterung.
- Insert data into MySQL — eine vollständige Anleitung zum Einfügen von Daten.
Fazit
mysqli_insert_id() ist der Standardweg, um den automatisch generierten Primärschlüssel direkt nach einem Einfügevorgang abzurufen. Lesen Sie ihn unmittelbar nach dem INSERT aus, beachten Sie, dass er verbindungsspezifisch ist (und damit nebenläufigkeitssicher), und erwarten Sie 0, wenn die letzte Anweisung keinen Auto-Increment-Wert generiert hat.