【问题标题】:mysqli->error: Is it for the last query only, or for the last error from the query group?mysqli->error: 是只针对最后一个查询,还是针对查询组的最后一个错误?
【发布时间】:2008-11-26 01:05:29
【问题描述】:

我是 mysqli 的新手,并试图确认如果我像下面这样,errno 将被设置为最后一个错误,如果有的话,而不是最后一个查询的错误。

这是一种体面的做法,还是我应该在每次查询之间检查错误?

谢谢!

$mysqli->autocommit(FALSE);

$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");
$mysqli->query("INSERT INTO .....");

if ( 0==$mysqli->errno ) {
    $mysqli->commit();
} else {
    $mysqli->rollback();
    // Handle error
}

【问题讨论】:

    标签: php mysql mysqli transactions


    【解决方案1】:

    否——它报告最后一次mysqli函数调用的错误代码。零表示最后一次函数调用没有发生错误。所以如果中间的一个失败了,你不会通过只在最后检查来知道它。

    也就是说,是的,你需要在每次函数调用后检查错误代码。请注意,$mysqli->query() 的返回值也指示错误。解释mysqli_errno 文档中的示例:

    if (!$mysqli->query("INSERT ...")) {
        printf("Errorcode: %d\n", $mysqli->errno);
    }
    

    【讨论】:

      【解决方案2】:

      mysqli_errno — 返回最近一次函数调用的错误代码。

      【讨论】:

        【解决方案3】:

        不,您必须在每个查询之间进行检查,因为它总是会给您最后一次查询的错误...所以如果您的第一个查询失败并且最后一次正确执行,那么您将不会收到错误...所以在所有查询后检查一个一个终于不行了……

        【讨论】:

          【解决方案4】:

          IMO 捕获所有错误的最佳和最简单的方法是扩展 mysqli 类:

          class DBException extends Exception {
          }
          class DBConnectException extends DBException {
          }
          class DBQueryException extends DBException {
          }
          
          class DB extends MySQLi {
              private static $instance = null;
          
              private function __construct() {
                  parent::__construct('host',
                                      'username',
                                      'passwd',
                                      'dbname');
          
                  if ($this->connect_errno) {
                      throw new DBConnectException($this->connect_error, $this->connect_errno);
                  }
              }
          
              private function __destructor() {
                  parent::close();
              }
          
              private function __clone() {
              }
          
              public static function getInstance() {
                  if (self::$instance == null) {
                      self::$instance = new self();
                  }
                  return self::$instance;
              }
          
              public function query($query, $resultmode = MYSQLI_STORE_RESULT) {
                  $result = parent::query($query, $resultmode);
                  if (!$result) {
                      // or do whatever you wanna do when an error occurs
                      throw new DBQueryException($this->error, $this->errno);
                  }
                  return $result;
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2010-12-30
            • 2018-08-11
            • 2018-05-04
            • 1970-01-01
            • 1970-01-01
            • 2020-04-26
            • 1970-01-01
            • 2021-07-03
            • 2021-06-09
            相关资源
            最近更新 更多