如果多个准备好的语句中有一个失败,请停止并还原


Stop and revert if one of multiple prepared statements fail

我有一个类Database,它有多个方法,其中一些方法执行准备好的语句,用于在表中创建新行。目前,一切都很好,但如果出现故障,有没有办法停止进一步的查询并恢复以前的查询。

以下只是我的表单当前处理方式的一个小示例:

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;

同样,如果这3个中的任何一个失败,我希望恢复所有查询并退出此表单处理。谢谢

  1. 通过在mysqli连接之前添加此行,使mysqli处于异常模式

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    
  2. 将查询包装在事务中
  3. 尝试结束交易。。catch语句,并在其中添加回滚调用

所以代码应该是类似的东西

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;
}