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

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

谢谢!

$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
}
有帮助吗?

解决方案

mysqli_errno - 返回错误代码的最近的函数调用

其他提示

没有 - 它报告最后的mysqli函数调用的错误代码。零意味着最后一个函数调用没有发生错误。所以,如果一个在中间失败了,你不会知道它仅在最后检查。

在换句话说,是的,你需要每个函数调用后检查错误代码。请注意,错误是由$mysqli->query()的返回值指示为好。从转述的例子中的 mysqli_errno DOC:

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

没有,你必须每个查询之间办理入住手续,因为它总是给你只剩下最后的查询错误...所以,如果你的第一个查询失败,最后的正确执行,那么你不会得到错误......所有查询后,所以检查逐个不最后...

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;
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top