mysqli-> ошибка:Это только для последнего запроса или для последней ошибки из группы запросов?
-
11-07-2019 - |
Вопрос
Я новичок в 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;
}
}