mysqli->error:是仅针对最后一个查询,还是针对查询组中的最后一个错误?

mysqli->error: Is it for the last query only, or for the last error from the query group?

提问人:Eli 提问时间:11/26/2008 最后编辑:Eli 更新时间:3/19/2013 访问量:4717

问:

我是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 事务

评论


答:

4赞 Bill Karwin 11/26/2008 #1

否 -- 它报告上次 mysqli 函数调用的错误代码。零表示上次函数调用时未发生错误。因此,如果中间的一个失败了,您不会通过最后检查来了解它。

换句话说,是的,您需要在每次函数调用后检查错误代码。请注意,错误也由 的返回值指示。转述mysqli_errno文档中的示例:$mysqli->query()

if (!$mysqli->query("INSERT ...")) {
    printf("Errorcode: %d\n", $mysqli->errno);
}
3赞 Ray 11/26/2008 #2

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

1赞 Dev 2/22/2011 #3

不,您必须在每个查询之间签入,因为它总是只会在最后一个查询中给您错误......因此,如果您的第一个查询失败,最后一个查询正确执行,那么您不会收到错误......所以检查毕竟一个一个地查询,而不是最后......

1赞 user2176127 3/19/2013 #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;
    }
}