Превращение ошибок запроса в Исключения в MySQLi
Я пытаюсь превратить ошибки запросов MySQLi в Exceptions, но не смог - mysqli_sql_exception вызывается только в том случае, если ему не удалось подключить БД.
Я использовал mysqli_report(MYSQLI_REPORT_STRICT)
и процедурные функции MySQLi, встроенные в класс пользовательских оболочек.
Бывший код:
public function mysqlQuery($SQL) {
$this->Result = mysqli_query($this->DBlink, $SQL);
if($this->Result === false)
throw new MySQLiQueryException($SQL, mysqli_error($this->DBlink), mysqli_errno($this->DBlink));
return $this->Result;
}
Вопрос: Нормально ли не предупреждение или исключение возникает при сбое запроса, поэтому мне нужно проверить, вернётся ли mysqli_query() false?
Ответы
Ответ 1
Некоторое время назад мне удалось разобраться в этом вопросе. Как было указано в другом ответе,
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
- это правильный способ сказать mysqli для исключения исключений.
Однако, если вы обертываете mysqli-функции в своей собственной оболочке (как и все должны!) - это не делает слишком большой разницы. В любом случае вам нужно будет добавить код для проверки успеха - будь то if
или catch
. Тем не менее, будет очень ограниченное количество вызовов, поэтому это не вызовет слишком много проблем.
Но все эти люди, которые "перемещаются" из mysql в mysqli из-за всего этого увлечения (но оставляя подход одинаковым и имея функции mysqli по всему коду), извлекут выгоду из этого параметра (если они выиграют) t следует общей привычке обертывать каждый вызов функции в try-catch, что было бы бесполезно).
Ответ 2
Нужно ли проверять, возвращалось ли mysqli_query() false?
Нет.
Вы должны иметь возможность делать то, что вам нужно, и инструктировать драйвер mysqli для исключения исключений из SQL-ошибок, но вам нужно включить MYSQLI_REPORT_ERROR
, если он еще не был...
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT)
mysqli_query()
должен теперь генерировать исключения при ошибке. Вам не нужно проверять возвращаемое значение для отказа (что не произойдет в любом случае, поскольку выбрано исключение).
public function mysqlQuery($SQL) {
try {
$this->Result = mysqli_query($this->DBlink, $SQL);
} catch (mysqli_sql_exception $e) {
throw new MySQLiQueryException($SQL, $e->getMessage(), $e->getCode());
}
return $this->Result;
}
(NB: я изменил $this->SQL
на $SQL
в повторном исключении.)
Ответ 3
Я знаю это немного позже, но ради потомства. Я считаю, что MYSQLI_REPORT_STRICT должен быть ограниченным, некоторые исключения, если их не поднимать, и, следовательно, они не могут быть обработаны блоком catch.
mysqli_report(MYSQLI_REPORT_ALL); // Traps all mysqli error
try {
$mysqli = new mysqli('localhost','user,'pwd','db');
/* I don't need to explicitly throw an exception as this is being
done automatically */
} catch(Exception $e) {
echo $e->getMessage();
}