Я начал использовать OO-MySQLi после процедурного MySQL, и у меня есть проблема.
В рабочей среде моя система отображает все ошибки как пользовательскую страницу. Ошибки MySQLi также являются «ошибкой», и я хочу их поймать, но в документации описывается только один способ сделать это:
if (!$mysqli->query("SET a=1")) { exit('An error occurred: ' . $mysqli->error); }
(например, например). Это очень плохо, потому что в моей системе я делаю много вещей, когда произошла ошибка, например, журнал, вызывающие события и т. Д.
Конечно, я могу расширить класс mysqli, например:
class myMysqli { public function __construct(/* ... */) { parent::__construct(/* ... */); } public function query(/* .. */) { parent::query(/* ... */); if($this->errno !== 0) { // An error occurred } } } $mysqli = new myMysqli(/* ... */); $mysqli->query(/* ... */);
Но таким образом мне нужно расширить почти ВСЕ методы, где может возникнуть ошибка. Кроме того, MySQLi предоставляет подготовленные операторы (класс mysqli_stmt), который имеет свои собственные ошибки!
Можете ли вы узнать лучший способ справиться с ошибками MySQLi? Заранее спасибо.
добавленной
Об исключениях: правильно ли я понимаю, что с исключениями мне нужно сделать что-то вроде этого:
try { $mysqli->query(/* ... */); } catch (Exception $e) { // An error occurred }
Но это похоже на
if(!$mysqli->query(/* ... */)) { // An error occured }
Какая разница?
Прежде всего, ваш старый подход был неправильным.
exit('An error occurred: ' . $mysqli->error);
является плохой практикой в целом и не должен использоваться с mysqli.
Вы действительно хотите обработчик ошибок / исключений. Где вы можете делать такие вещи, как ведение журнала, вызывать события, показывать страницы.
Исключение лучше, чем регулярная ошибка. Поэтому установите mysqli в режиме исключения, как показано в другом ответе, а затем поймайте все ошибки в обработчике ошибок. Хотя try..catch следует использовать только тогда, когда у вас есть определенное конкретное действие для обработки ошибки.
Я использую метод try … catch …
try { // get result of record from 'id' $query = "SELECT * FROM models WHERE id =$id"; $result = $mysqli->query($query); if (!$result) { throw new Exception($mysqli->error()); } $row = $result->fetch_array(); } catch (Exception $e) { echo "We are currently experiencing issues. Please try again later."; echo $e->getMessage(); } finally { $result->free(); }
Это вообще помогает?
Вы используете «try» для проверки условия и генерирования исключения, если он возвращает true (! $ Result). И используйте «catch», чтобы поймать все остальное, что может случиться!