【问题标题】:mysqli - handling errors with transactions [duplicate]mysqli - 处理事务错误[重复]
【发布时间】:2012-03-10 03:55:13
【问题描述】:

使用mysqli时如何正确处理事务和prepared statements的错误?

片段:

<?php
$conn = require_once 'dbconn.php';
$conn->autocommit(FALSE);

$stmt_ins_option = $conn->prepare('INSERT INTO options(option_name) VALUES(?)');
$option_name = 'foo';
$stmt_ins_option->bind_param('s', $option_name);
$stmt_ins_option->execute();
$conn->commit();
if($conn->errno) {
    $conn->rollback();
    echo $conn->error;
}

它不会再次添加它,因为该列上有一个 UNIQUE 约束。

但是脚本也不会报告任何错误。

我错过了什么?

【问题讨论】:

    标签: php transactions mysqli prepared-statement


    【解决方案1】:

    execute 在失败时返回 false,因此您可能需要在提交之前检查它。此外,回滚代码没有任何效果,因为您之前提交了事务。我会写类似的东西

    try
    {
      ....
      if (!$stmt_ins_option->execute())
      {
       throw new Exception("Cannot insert record. Reason :".$stmt_ins_option->error);
       // surely, it's better to define your own exception hierarchy
      }
      $conn->commit();
    }
    catch (Exception $e)
    {
       $conn->rollback();
       // display error/re-raise/ or whatever you think makes sense for your function
    }
    

    【讨论】:

    • 有什么办法可以让mysqli类抛出异常,而不是我每次都要检查错误?
    • @Flavius:我没有这么瘦(我可能错了,我有一段时间没有使用 php)。但是,您始终可以选择编写自己的类,该类继承自 mysqli 并覆盖几个方法,以便它们抛出异常。
    【解决方案2】:

    有什么方法可以让mysqli类抛出异常,而不是我每次都检查错误

    根据this answer,您可以使用以下调用来启用此类错误的异常:

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    mysqli_driver::$report_mode

    【讨论】:

      猜你喜欢
      • 2016-09-08
      • 2013-01-14
      • 2011-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-02-07
      • 2021-02-17
      • 2019-07-29
      • 2023-03-25
      相关资源
      最近更新 更多