Start · Sprachen · PHP · Referenz · mysqli_stmt_insert_id

mysqli_stmt_insert_id

Funktion

Gibt die automatisch generierte ID zurück, die beim letzten INSERT-Vorgang über ein vorbereitetes Statement erzeugt wurde.

seit PHP 5.0.0 Kategorie: db

Signatur

mysqli_stmt_insert_id(mysqli_stmt $statement): int|string

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

Typ
int|string
Beschreibung
Die automatisch generierte ID der zuletzt über dieses Statement eingefügten Zeile. Gibt 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();
Neu angelegter Benutzer hat die ID: 42

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();
Bestellung 101 mit Position erfolgreich angelegt.

// 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.