Hallo,

angenommen ich habe eine php Website mit einer Registrierung. In meiner MySQL Datenbank befinden sich die Tabellen User und wohntIn.

Ein User kann sich registrieren mit Angabe seines Namen und seines Wohnorts und bestätigt mit einem Button Klick.



In PHP würde ich jetzt zwei INSERT Statements benutzen um den User zu registrieren.

Code:
INSERT INTO `User` (`Name`) VALUES (AngegebenerName);
INSERT INTO `wohntIn` (`UID`, `Stadt`) VALUES (LAST_INSERT_ID() , AngegebeneStadt);
Jetzt kann es natürlich zu einigen Problemen kommen:


  • Aus irgendeinem Grund kann der Name nicht in die User Table eingetragen werden. Der zweite Befehl läuft durch. Abgesehen davon dass sich LAST_INSERT_ID() womöglich auf eine ganze andere ID bezieht, die nichts mit einem User zu tun hat, existiert jetzt ein Eintrag in wohntIn, der keinem User zuzuordnen ist.
  • Der erste Befehl läuft durch und der zweite nicht. Jetzt existiert ein User ohne Wohnort.


Deswegen bin auf der Suche nach so eine "Alles oder nichts"-Aktion. Nur wenn alle Statements fehlerfrei durchlaufen können, sollen sie es auch tun. Scheitert es an einer Stelle, müssen alle bisher ausgeführten Befehle rückgängig gemacht werden.
Instinktiv würde ich vor dem zweiten INSERT prüfen, ob ein Eintrag in USER existiert mit dieser LAST_INSERT_ID(), und falls ja, kann der zweite INSERT durchgeführt werden. So kann man allerdings auch TRUE zurückbekommen, ohne es zu wollen. Wenn z.B. der erste Befehl scheiterte und sich deshalb LAST_INSERT_ID() auf eine ganze andere ID bezieht, die zufällig aber auch die ID eines User ist.
Außerdem könnte das prüfen an sich ja auch scheitern usw...

Ich bin sicher, dass es da schon eine Logik in SQL geben muss, die sich diesem Problem annimmt.

Vielen Dank!