Start · Sprachen · PHP · Referenz · mysql_insert_id

mysql_insert_id

Funktion

Liefert die automatisch generierte ID (AUTO_INCREMENT) des letzten INSERT-Befehls der aktuellen Verbindung.

seit PHP 4.0.0 Kategorie: db

Signatur

mysql_insert_id(resource $link_identifier = NULL): int

Beschreibung

mysql_insert_id() gibt die ID zurück, die MySQL beim letzten INSERT-Befehl für eine Spalte mit dem Attribut AUTO_INCREMENT erzeugt hat. Die Funktion ist an eine bestimmte Datenbankverbindung gebunden und gibt immer den Wert der letzten erfolgreichen INSERT-Operation auf dieser Verbindung zurück.

Wird kein $link_identifier angegeben, verwendet PHP die zuletzt geöffnete MySQL-Verbindung. Die Funktion entspricht der MySQL-Funktion LAST_INSERT_ID() und liest intern denselben verbindungslokalen Wert aus, sodass sie auch bei gleichzeitigen Verbindungen anderer Clients korrekte Ergebnisse liefert.

Gibt die Funktion 0 zurück, wurde im letzten INSERT kein AUTO_INCREMENT-Feld befüllt, oder es wurde kein INSERT ausgeführt. Bei sehr großen IDs (größer als der PHP-int-Bereich), wird der Wert als String zurückgegeben – in diesem Fall empfiehlt sich die Verwendung von mysql_query('SELECT LAST_INSERT_ID()').

Achtung: Die gesamte mysql_*-Erweiterung ist seit PHP 5.5.0 als veraltet markiert und wurde in PHP 7.0.0 vollständig entfernt. Für neue Projekte sollte stattdessen mysqli_insert_id() oder PDO::lastInsertId() verwendet werden.

Parameter

Name Typ Default Beschreibung
$link_identifier resource NULL Eine MySQL-Verbindungsressource, die mit mysql_connect() erzeugt wurde. Wird der Parameter weggelassen, wird die zuletzt geöffnete Verbindung verwendet. Existiert keine offene Verbindung, wird versucht, eine neue mit den Standardparametern zu erstellen.

Rückgabewert

Typ
int
Beschreibung
Gibt die ID zurück, die beim letzten INSERT-Befehl für ein AUTO_INCREMENT-Feld erzeugt wurde. Gibt 0 zurück, wenn kein AUTO_INCREMENT-Feld befüllt wurde. Bei IDs, die den PHP-Integer-Bereich überschreiten, wird der Wert als String zurückgegeben.

Beispiele

Neue Datensatz-ID nach einem INSERT ermitteln

<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('shop', $link);

$sql = "INSERT INTO kunden (name, email) VALUES ('Max Mustermann', 'max@example.com')";
mysql_query($sql, $link);

$neue_id = mysql_insert_id($link);
echo 'Der neue Kunde wurde mit der ID ' . $neue_id . ' gespeichert.';

mysql_close($link);
?>
Der neue Kunde wurde mit der ID 42 gespeichert.

Verknüpften Datensatz nach INSERT anlegen (1:n-Relation)

<?php
$link = mysql_connect('localhost', 'benutzer', 'passwort');
mysql_select_db('shop', $link);

// Bestellung anlegen
$sql = "INSERT INTO bestellungen (datum, status) VALUES (NOW(), 'offen')";
mysql_query($sql, $link);

$bestell_id = mysql_insert_id($link);

// Bestellposition mit der ermittelten Bestell-ID speichern
$sql2 = "INSERT INTO bestellpositionen (bestell_id, artikel_id, menge)
         VALUES (" . (int)$bestell_id . ", 7, 3)";
mysql_query($sql2, $link);

echo 'Bestellung ' . $bestell_id . ' mit Position gespeichert.';

mysql_close($link);
?>
Bestellung 17 mit Position gespeichert.

// Wichtig · Fallstricke

Veraltet/Entfernt: Die mysql_*-Erweiterung ist seit PHP 5.5.0 als deprecated markiert und seit PHP 7.0.0 nicht mehr verfügbar. Bestehende Anwendungen sollten auf mysqli_insert_id() oder PDO::lastInsertId() migriert werden.

Reihenfolge beachten: mysql_insert_id() muss unmittelbar nach dem INSERT-Befehl aufgerufen werden. Jede weitere Abfrage, die ein AUTO_INCREMENT-Feld beschreibt, überschreibt den intern gespeicherten Wert.

Kein AUTO_INCREMENT: Wenn der INSERT-Befehl keinen Wert in einem AUTO_INCREMENT-Feld erzeugt (z. B. weil die Tabelle kein solches Feld hat oder der Wert explizit angegeben wurde), gibt die Funktion 0 zurück.

Große IDs: Überschreitet die generierte ID den Wertebereich von PHP-Integer (auf 32-Bit-Systemen ca. 2 Milliarden), wird die ID als String zurückgegeben. Für solche Fälle ist mysql_query('SELECT LAST_INSERT_ID()') zuverlässiger.