Signatur
Beschreibung
mysqli_stmt_insert_id() liefert den Wert, der von einer AUTO_INCREMENT-Spalte beim letzten erfolgreichen INSERT-Statement generiert wurde. Die Funktion entspricht mysqli_insert_id(), arbeitet jedoch explizit auf einem vorbereiteten Statement (mysqli_stmt-Objekt), was sie in Kombination mit mysqli_prepare() und mysqli_stmt_execute() zur bevorzugten Wahl macht.
Typischerweise wird diese Funktion eingesetzt, wenn nach dem Einfügen eines Datensatzes sofort die neu entstandene Primärschlüssel-ID benötigt wird – etwa um zugehörige Datensätze in anderen Tabellen zu verknüpfen (Fremdschlüsselbeziehungen). Wurde kein AUTO_INCREMENT-Wert erzeugt oder wurde zuletzt kein INSERT ausgeführt, gibt die Funktion 0 zurück.
Bei sehr großen Tabellen, in denen die generierte ID den Wertebereich eines int überschreitet, wird der Wert als string zurückgegeben, um Präzisionsverlust zu vermeiden. In der objektorientierten Schreibweise steht die Eigenschaft $stmt->insert_id zur Verfügung.
Zu beachten ist, dass der Rückgabewert nur für das zuletzt ausgeführte Statement gilt und durch nachfolgende Datenbankoperationen überschrieben wird. Er sollte daher unmittelbar nach mysqli_stmt_execute() abgerufen werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $statement Pflicht | mysqli_stmt | Das vorbereitete Statement-Objekt, das von mysqli_prepare() zurückgegeben wurde und nach mysqli_stmt_execute() ausgewertet wird. |
Rückgabewert
0 zurück, wenn kein AUTO_INCREMENT-Wert erzeugt wurde. Bei sehr großen IDs (außerhalb des int-Bereichs) wird ein string zurückgegeben.Beispiele
Neue Benutzer-ID nach INSERT abrufen
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
if ($mysqli->connect_errno) {
die('Verbindungsfehler: ' . $mysqli->connect_error);
}
$stmt = $mysqli->prepare('INSERT INTO users (username, email) VALUES (?, ?)');
$stmt->bind_param('ss', $username, $email);
$username = 'max_mustermann';
$email = 'max@example.com';
$stmt->execute();
$newId = mysqli_stmt_insert_id($stmt);
echo 'Neu angelegter Benutzer hat die ID: ' . $newId;
$stmt->close();
$mysqli->close();
Verknüpfung zweier Tabellen über die generierte ID
<?php
$mysqli = new mysqli('localhost', 'user', 'password', 'testdb');
// Bestellung anlegen
$stmtOrder = $mysqli->prepare('INSERT INTO orders (customer_id, total) VALUES (?, ?)');
$stmtOrder->bind_param('id', $customerId, $total);
$customerId = 7;
$total = 149.99;
$stmtOrder->execute();
// ID der soeben angelegten Bestellung abrufen
$orderId = mysqli_stmt_insert_id($stmtOrder);
$stmtOrder->close();
// Bestellposition zur Bestellung hinzufügen
$stmtItem = $mysqli->prepare('INSERT INTO order_items (order_id, product_id, qty) VALUES (?, ?, ?)');
$stmtItem->bind_param('iii', $orderId, $productId, $qty);
$productId = 15;
$qty = 3;
$stmtItem->execute();
echo 'Bestellung ' . $orderId . ' mit Position erfolgreich angelegt.';
$stmtItem->close();
$mysqli->close();
// Wichtig · Fallstricke
Reihenfolge beachten: mysqli_stmt_insert_id() muss unmittelbar nach mysqli_stmt_execute() aufgerufen werden, da weitere Datenbankoperationen (auch auf demselben Objekt) den internen Wert überschreiben können.
Nur bei AUTO_INCREMENT: Wenn die Tabelle keine AUTO_INCREMENT-Spalte hat oder der eingefügte Wert explizit angegeben wurde (kein NULL / kein Auslassen der Spalte), wird 0 zurückgegeben.
OOP-Äquivalent: In der objektorientierten Schreibweise kann alternativ die Eigenschaft $stmt->insert_id gelesen werden – das Ergebnis ist identisch.