Как заставить mysqli генерировать исключения, используя MYSQLI_REPORT_STRICT?

В mysqli есть функция, которая называется mysqli_report(), который выглядит как аналог для PDO setAttribute() метод с его ERRMODE_* константы. В руководстве сказано:

MYSQLI_REPORT_STRICT Throw mysqli_sql_exception for errors instead of warnings

Итак, имея PDO::ERRMODE_EXCEPTION в виду, я попробовал этот код

mysqli_report(MYSQLI_REPORT_STRICT);
$mysqli->query("foo");

но, к моему разочарованию, это не произвело ни исключения, ни предупреждения вообще.

Итак, здесь возникает вопрос: есть ли способ сказать MySQL бросить исключения без использования MYSQLI_REPORT_ALL?

2 ответа

Решение

После некоторых исследований я наконец узнал, что параметр функции является битовой маской, и для получения желаемого результата нужно объединить несколько значений. Окончательная комбинация не слишком логична, но она работает как задумано, создавая исключение из-за ошибки запроса, игнорируя предупреждения.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);

даст желаемый результат:

Неустранимая ошибка: необработанное исключение "mysqli_sql_exception" с сообщением "В синтаксисе SQL есть ошибка; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'foo' в строке 1'.

Это не ошибка, это особенность.;)

По умолчанию PHP не сообщает об ошибках mysqli или PDO, потому что эта информация очень чувствительна, ее отображение пользователю является отличным способом научиться внедрять вредоносные данные.

MYSQLI_REPORT_ERROR говорит ему включить ошибки, а MYSQLI_REPORT_STRICT говорит ему преобразовывать эти ошибки в исключения. Это даст вам полный отчет об ошибке, поэтому никогда не делайте этого в производственных средах.

Используя символ трубы | позволяет установить несколько констант в большинстве методов и функций PHP. PDO, mysqli, filter_var и т. Д. Все используют канал, чтобы установить несколько необязательных аргументов одного и того же типа, или "побитовое разделение флагов", чтобы использовать для этого причудливый термин. Аргумент массива ленивого человека.

Другие вопросы по тегам