如何使用MYSQLI_REPORT_STRICT使mysqli抛出异常?

You*_*nse 6 php mysql mysqli exception

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");
Run Code Online (Sandbox Code Playgroud)

但是,令我失望的是,它没有产生任何例外或警告.

所以,这里有一个问题:有没有办法告诉mysqli在不使用的情况下抛出异常MYSQLI_REPORT_ALL

You*_*nse 14

经过一些研究,我终于知道函数的参数是一个位掩码,并且必须组合几个值才能得到所需的结果.最终组合不是过于合乎逻辑,但它按预期工作,在忽略警告时抛出查询错误的异常.

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
Run Code Online (Sandbox Code Playgroud)

将产生预期的结果:

致命错误:未捕获异常'mysqli_sql_exception',消息'您的SQL语法有错误; 查看与您的MySQL服务器版本对应的手册,以便在第1行'foo'附近使用正确的语法


Mic*_*eau 10

这不是一个错误,这是一个功能.;)

默认情况下,PHP不会报告mysqli或PDO错误,因为该信息非常敏感,将其显示给用户是学习如何注入恶意数据的好方法.

MYSQLI_REPORT_ERROR告诉它打开错误,MYSQLI_REPORT_STRICT告诉它将这些错误转换为异常.这将为您提供错误消息的完整报告,因此请勿在生产环境中执行此操作.

使用管道符号| 允许您在大多数PHP方法和函数中设置多个常量.PDO,mysqli,filter_var等都使用管道来设置相同类型的多个可选参数,或者使用"按位分离标志"来使用它的奇特术语.懒人的数组参数.

  • 阻止人们默认报告错误(尤其是例外情况)确实是一种误导。关闭“display_errors”后,错误、警告和未捕获的异常将对用户隐藏。建议:您应该尽可能打开异常(它们是现代 PHP 中的标准做法)并在生产中关闭“display_errors”。顺便说一句,您最喜欢的框架可能会为您设置一个未捕获的异常处理程序,以显示一个漂亮的错误页面,向您发送警报等等。 (4认同)