Как заставить 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");
но, к моему разочарованию, он не сделал никаких исключений и предупреждений вообще.
Итак, вот вопрос: есть ли способ сказать mysqli для генерации исключений без использования MYSQLI_REPORT_ALL
?
Ответы
Ответ 1
После некоторых исследований я наконец узнал, что параметр функции является битовой маской, и нужно объединить несколько значений для получения желаемого результата. Окончательная комбинация не слишком логична, но она работает по назначению, вызывая исключение при ошибке запроса при игнорировании предупреждений.
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
даст желаемый результат:
Неустранимая ошибка: исключение "mysqli_sql_exception" с сообщением "У вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с 'foo' в строке 1 '
Ответ 2
Это не ошибка, это особенность.;)
PHP не сообщает об ошибках mysqli или PDO по умолчанию, потому что эта информация очень чувствительна, отображение ее пользователю - отличный способ узнать, как вводить вредоносные данные.
MYSQLI_REPORT_ERROR сообщает об этом, чтобы включить ошибки, и MYSQLI_REPORT_STRICT сообщает об этом, чтобы преобразовать эти ошибки в Исключения. Это даст вам полный отчет об ошибке, поэтому никогда не делайте этого в производственных средах.
Использование символа трубы | позволяет устанавливать несколько констант в большинстве методов и функций PHP. PDO, mysqli, filter_var и т.д. Все используют канал для установки нескольких необязательных аргументов одного и того же типа или "поразрядной дизъюнкции флагов", чтобы использовать для этого причудливый термин. Аргумент массива ленивого пользователя.