mysqli-> error: только для последнего запроса или для последней ошибки в группе запросов? - PullRequest
1 голос
/ 26 ноября 2008

Я новичок в 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
}

Ответы [ 4 ]

4 голосов
/ 26 ноября 2008

Нет - он сообщает код ошибки последнего вызова функции mysqli. Ноль означает отсутствие ошибки при последнем вызове функции. Поэтому, если кто-то посередине потерпит неудачу, вы не узнаете об этом, проверив только в конце.

Другими словами, да, вам нужно проверять код ошибки после каждого вызова функции. Обратите внимание, что ошибка также указывается в возвращаемом значении $mysqli->query(). Перефразируя пример из mysqli_errno doc:

if (!$mysqli->query("INSERT ...")) {
    printf("Errorcode: %d\n", $mysqli->errno);
}
3 голосов
/ 26 ноября 2008

mysqli_errno - возвращает код ошибки для самого последнего вызова функции .

1 голос
/ 19 марта 2013

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;
    }
}
1 голос
/ 22 февраля 2011

Нет, вы должны проверять между каждым запросом, потому что он всегда будет выдавать ошибку только для последнего запроса ... Так что, если ваш первый запрос был неудачным и последний выполнялся правильно, вы не получите ошибку ... так что проверяйте все запросы один за другим, не наконец ...

...