ID nach neuem Datenbankeintrag sofort erhalten
Coatie
- datenbank
3 misterunknown2 dedlfix
Einen guten Tag allerseits,
und zwar habe ich folgende Frage.
Nachdem ich ein INSERT in meine Datenbank gemacht habe möchte ich sofort auch eine Wiedergabe der ID des neuen Eintrages erhalten. Ich weiß das es möglich ist, doch leider haben meine Google-Fertigkeiten nicht gereicht um rauszukriegen wie genau.
Das DBMS das ich verwende : MySQL (Version 5+)
Die Struktur der Tabelle sieht ungefähr wie folgt aus :
id - INT(11) - NOT NULL - AUTO INCREMENT - PRIMARY KEY
a - SMALLINT(6) - NULL
b - SMALLINT(6) - NULL
c - SMALLINT(6) - NULL
Mein PHP Statement mit dem ich das INSERT in die Datenbank einfüge sieht wie folgt aus :
$sql = "INSERT INTO `test` (id,a,b,c)
VALUES
(NULL,'". $a ."','". $b ."','". $c ."')";
$dbconn = mysqli_connect($hostname, $username, $password, $database);
$stmt = mysqli_prepare($dbconn, $sql);
mysqli_stmt_execute($stmt);
Nun möchte ich in einer andere Tabelle einen Eintrag machen in dem die ID des vorhergegangenen Querys eingetragen werden soll. Nun möchte ich diese erhalten OHNE ein Select auszuführen in dem ich nach dem letzten Datenbankeintrag einfach suche also der MAXID oder der ID mit den Werten a,b,c - weil dies zu Fehler führen könnte (es gibt mehr ID's mit a,b,c oder ein anderer Tabelleneintrag wurde von wem anders gleichzeitig erstellt und MAXID ist nun nicht mehr MAXID sondern MAXID-1 etc.)
Ich hoffe es kann mir jemand helfen :)
Liebe Grüße
Coatie
Moin,
können die Leute nicht mehr googlen? Ich habe das auch nicht gewusst. Aber:
Google
Erster Treffer (bei mir)
Die Lösung.
Grüße Marco
Hi!
Mein PHP Statement mit dem ich das INSERT in die Datenbank einfüge sieht wie folgt aus :
PHP-Statement? Das ist eine kreative Abkürzung für PHP-Code, der ein SQL-Statement erstellt und ausführt?
$sql = "INSERT INTO test
(id,a,b,c)
VALUES
(NULL,'". $a ."','". $b ."','". $c ."')";
$dbconn = mysqli_connect($hostname, $username, $password, $database);
$stmt = mysqli_prepare($dbconn, $sql);
mysqli_stmt_execute($stmt);
Wenn du schon mit den Funktionen für Prepared Statements hantierst, dann solltest du das richtig tun, also mit Platzhaltern im SQL-Statement und Werteübergabe per Bind-Funktion. Ansonsten bringt dir das nur Mehraufwand ohne Nutzen. Außerdem umgehst du dabei die Sicherheitsprobleme, die beim Nichtbeachten des [Kontextwechsels](http://wiki.selfhtml.org/wiki/Artikel:Kontextwechsel) entstehen.
Die Spalte id in der Aufzählung und den Wert NULL kannst du ganz weglassen, das hat exakt dieselbe Wirkung. Weiterhin sehe ich keine Fehlerbehandlung in deinem Code, was auch eine schwere Unterlassungssünde ist.
> Nun möchte ich in einer andere Tabelle einen Eintrag machen in dem die ID des vorhergegangenen Querys eingetragen werden soll.
MySQLs Funktion LAST\_INSERT\_ID() liefert diesen Wert ohne Umwege in weitere Statements. Wenn du den auch noch außerhalb benötigst, dann gibt es eine ähnlich lautende PHP-Funktion.
> Nun möchte ich diese erhalten OHNE ein Select auszuführen in dem ich nach dem letzten Datenbankeintrag einfach suche also der MAXID oder der ID mit den Werten a,b,c - weil dies zu Fehler führen könnte (es gibt mehr ID's mit a,b,c oder ein anderer Tabelleneintrag wurde von wem anders gleichzeitig erstellt und MAXID ist nun nicht mehr MAXID sondern MAXID-1 etc.)
Genau das ist das Problem an einem Ermitteln des größten ID-Wertes, das die oben genannten Funktionen umgehen.
Lo!