【问题标题】:Stop and revert if one of multiple prepared statements fail如果多个准备好的语句之一失败,则停止并恢复
【发布时间】:2016-04-18 15:33:11
【问题描述】:

我有一个类数据库,它有多种方法,一些执行准备好的语句以在我的表中创建新行。目前,一切正常,但如果出现问题,有没有办法停止进一步的查询并恢复之前的查询。

这只是我的表单当前处理方式的一个小例子:

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 个中的任何一个失败,我想恢复所有查询并退出此表单处理。谢谢!

【问题讨论】:

    标签: php mysql mysqli


    【解决方案1】:
    1. 通过在 mysqli 连接之前添加此行将 mysqli 置于异常模式

      mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
      
    2. 将您的查询封装在一个事务
    3. 将事务包装在 try..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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 2014-01-29
      • 2019-12-12
      • 2014-03-16
      • 1970-01-01
      • 2015-05-27
      相关资源
      最近更新 更多