Превращение ошибок запроса в Исключения в MySQLi

Я пытаюсь превратить ошибки запросов MySQLi в Exceptions, но не смог – mysqli_sql_exception выбрасывается, только если ему не удалось подключить БД.

Я использовал mysqli_report(MYSQLI_REPORT_STRICT) и процедурные функции MySQLi, встроенные в класс пользовательских mysqli_report(MYSQLI_REPORT_STRICT) .

Бывший код:

 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?

Некоторое время назад мне удалось разобраться в этом. Как было указано в другом ответе ,

 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); 

это правильный способ сказать mysqli для исключения исключений.

Однако, если вы обертываете функции mysqli в своей собственной оболочке (как и все должны!) – это не имеет особого значения. В любом случае вам нужно будет добавить код для проверки успеха – будь то или catch . Тем не менее, будет очень ограниченное количество звонков, так что это не вызовет особых проблем.

Но все эти люди, которые «перемещаются» от mysql к mysqli из-за всего этого увлечения движением (но оставляя подход одинаковым и имея функции mysqli по всему коду), извлекут выгоду из этого параметра резко (если они не будут следовать обычная привычка обертывать каждый вызов функции в try-catch, что было бы бесполезно).

Должен ли я проверить, возвращается ли 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 в повторном исключении).

Я знаю, что это слишком поздно, но ради потомства. Я считаю, что 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(); }