2 Stimmen

Wie kann man sicherstellen, dass zwei MySQL-Abfragen erfolgreich sind?

Ich habe zwei MySQL-Abfragen in meinem PHP-Code.

Grundsätzlich müssen die beiden Abfragen ausgeführt werden (es sind zwei INSERT-Abfragen) und beide müssen erfolgreich sein. Wenn zum Beispiel query1 erfolgreich ist, aber query2 nicht erfolgreich ist, muss ich query1 zurücksetzen, da beide Abfragen erfolgreich sein müssen.

Ich verwende MyISAM und ich weiß, dass ich keine Rollbacks usw. tun kann, aber gibt es eine Möglichkeit, wie ich mein Problem (eine andere Lösung) überwinden kann, um zu tun, was ich will?

Beide sind voneinander abhängig, da Abfrage 1 Daten aus dem Formular speichert und Abfrage 2 einige andere Details in eine andere Tabelle einfügt (im Grunde ist es ein Zähler), der die Gesamtzahlen für ein Empfehlungssystem verfolgt.

3voto

rael_kid Punkte 11140

Eine Möglichkeit wäre, die ID des eingefügten Datensatzes in der ersten Tabelle zu speichern. Wenn die zweite Abfrage fehlschlägt, verwenden Sie eine Löschabfrage, um den durch die erste Abfrage eingefügten Datensatz zu entfernen. Ich würde Ihnen jedoch raten, die Engine auf InnoDB zu ändern, damit Sie Transaktionen verwenden können. Oder haben Sie einen bestimmten Grund, MyISAM zu verwenden (z. B. Volltextsuche)?

3voto

fin1te Punkte 4159

Nach dem ersten Einfügen können Sie die ID mit mysql_insert_id() und speichern.

Wenn Sie dann die zweite Abfrage durchführen, erhalten Sie auch diese ID. Wenn die ID null ist, bedeutet dies, dass die Abfrage nicht erfolgreich war, und Sie haben die alte ID, die Sie dann löschen können, etwa so

DELETE FROM table WHERE id='$insertId'

Bearbeiten:

Nur ein Hinweis, dies ist keine vollständige Lösung, die einzige echte Möglichkeit wäre, zu InnoDB konvertieren

1voto

maple_shaft Punkte 10389

Für mich klingt das, als bräuchten Sie Transaktionen.

http://www.techrepublic.com/article/implement-mysql-based-transactions-with-a-new-set-of-php-extensions/6085922

Sie ermöglichen das Rollback einer ganzen Reihe von Datenbankänderungen innerhalb einer einzigen Transaktion.

1voto

Transaktionen sind die Antwort. Wenn die von Ihnen gewählte Speicher-Engine diese nicht unterstützt und Sie dieses Szenario haben, dann haben Sie wahrscheinlich die falsche Speicher-Engine gewählt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X