Signatur
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
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);
?>
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);
?>
// 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.