2016-04-18 12 views
2

Ich habe eine Klasse Datenbank, die mehrere Methoden hat, wobei einige vorbereitete Anweisungen zum Erstellen neuer Zeilen in meinen Tabellen ausführen. Momentan funktioniert alles gut, aber wenn etwas fehlschlagen sollte, gibt es eine Möglichkeit, weitere Abfragen zu stoppen und frühere Abfragen rückgängig zu machen.Stoppen und zurücksetzen, wenn eine der mehreren vorbereiteten Anweisungen fehlschlägt

Hier ist nur ein kleines Beispiel dafür, wie meine Form gerade verarbeitet:

if(isset($_POST["someSubmitName"]) : 
//post variables 
.... 
// Start Queries 
$db->address_table_insert_statement($firstName, $lastName, $companyName, $streetAddress, $streetAddress2, $streetAddress3, $city, $state, $zip, $country, $phone, $fax, $email, $date, $date); 
$addressId = mysqli_insert_id($db->connection); 
$db->address_table_insert_statement($firstName, $lastName, $companyName, $billingStreetAddress, $billingStreetAddress2, $billingStreetAddress3, $billingCity, $billingState, $billingZipCode, $billingCountry, $billingPhone, $billingFax, $billingEmail, $date, $date); 
$billingAdressId = mysqli_insert_id($db->connection); 
$db->account_table_insert_statement($active, $addressId, $billingAddressId, $dateCreated, $dateModified); 
endif; 

Noch einmal, wenn irgendwelche von denen 3 scheitern ich alle Anfragen rückgängig machen will und diese Form der Verarbeitung zu beenden. Vielen Dank!

Antwort

3
  1. put mysqli in Ausnahmemodus, indem Sie diese Zeile hinzufügen, bevor Mysqli

    verbinden
    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
    
  2. Wickeln Sie Ihre Abfragen in einer Transaktion
  3. Wickeln Sie Ihre Transaktion in einer try..catch Anweisung und fügen Sie ein Rollback-Anruf innerhalb.

So würde der Code so etwas wie

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 
$db = new mysqli(...); 
... 
try { 
    $db->autocommit(FALSE); 

    $db->address_table_insert_statement($firstName, $lastName, $companyName, $streetAddress, $streetAddress2, $streetAddress3, $city, $state, $zip, $country, $phone, $fax, $email, $date, $date); 
    $addressId = mysqli_insert_id($db->connection); 
    $db->address_table_insert_statement($firstName, $lastName, $companyName, $billingStreetAddress, $billingStreetAddress2, $billingStreetAddress3, $billingCity, $billingState, $billingZipCode, $billingCountry, $billingPhone, $billingFax, $billingEmail, $date, $date); 
    $billingAdressId = mysqli_insert_id($db->connection); 
    $db->account_table_insert_statement($active, $addressId, $billingAddressId, $dateCreated, $dateModified); 

    $db->commit(); 
} catch (\Exception $e) { 
    $db->rollback(); 
    throw $e; 
} 
+1

Thank you! Upvote und Frage gelöst. –

Verwandte Themen