Я пытаюсь превратить ошибки запросов 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(); }