2016-03-20 11 views
0

So habe ich diese PHP Service, die Verbindung zu meiner Android App ist und es führt 2 Abfragen auf einmal. Ich habe gelesen, wie man erkennt, wenn einer fehlschlägt, und ich weiß, dass einer von mir scheitert, weil EventSlots bereits 0 ist und ein INT unsigned ist.PHP PDO - Mehrere Anweisungen - wenn 1 fehlschlägt, führen Sie nicht die anderen

Die andere Anweisung ist jedoch erfolgreich und wird ausgeführt. Offensichtlich möchte ich nur beide ausführen, und wenn 1 fehlschlägt, don't execute anything at all aber einen Fehler für meine App zurückgeben.

Wie würde ich erkennen, wenn eine der Anweisungen fehlgeschlagen und STOP the other ausführen? Ich kann wahrscheinlich vermeiden, mehrere Anweisungen zu verwenden, und tun Sie 1, überprüfen Sie, ob es OK war, und führen Sie erst dann das andere aus. Kann ich das mit mehreren Aussagen erreichen?

Abfrage:

"INSERT INTO GuestList(EventID, AccountID) VALUES (7, (SELECT AccountID FROM Accounts WHERE Username = 'test')); 
UPDATE Events SET EventSlots = EventSlots-1 WHERE EventID = 7 ;" 
+0

Verwenden Sie eine Transaktion http://php.net/manual/en/pdo.begintransaction.php – JimL

+0

Wenn Sie wissen, warum die erste Anweisung fehlschlägt (wie Sie geschrieben haben), warum müssen Sie überhaupt etwas ausführen? Sie wissen, dass _prior_ es ausführt, da Sie alle beteiligten Informationen haben. – arkascha

+0

Danke @JimL Ich wusste nicht einmal von denen. Scheint sehr nützlich, ich werde diese jetzt ausprobieren. Und 'arkascha', das weiß ich, weil ich diesen speziellen Use Case teste. Ich setze die EventSlots auf 0, um einen Handler in meiner App zu implementieren, wenn ein Benutzer versucht, an einem Event teilzunehmen, das bereits 0 Slots zur Verfügung hat (das weiß ich, aber er würde es nicht tun). – iBobb

Antwort

1

Verwendung PDO Transaktionen http://php.net/manual/en/pdo.transactions.php. Eine Transaktion stellt eine Reihe von Abfragen dar, die auf atomare Weise ausgeführt werden müssen. Wenn während der Transaktion ein Fehler auftritt, wird automatisch ein Rollback auf den ursprünglichen Zustand ausgeführt.