mysqli-> ошибка:Это только для последнего запроса или для последней ошибки из группы запросов?

StackOverflow https://stackoverflow.com/questions/319423

Вопрос

Я новичок в 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
}
Это было полезно?

Решение

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

Другие советы

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

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

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