mysqli中有一个名为mysqli_report()
的函数,它看起来像是PDO的setAttribute()
方法的对应函数,其ERRMODE_*
常量。手册says:
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
的情况下抛出异常?
答案 0 :(得分:13)
经过一番研究后,我终于知道函数的参数是一个位掩码,并且必须组合几个值才能得到所需的结果。最终的组合不是过于逻辑,但它按预期工作,在忽略警告的同时对查询错误抛出异常。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
将产生所需的结果:
致命错误:未捕获异常'mysqli_sql_exception',并显示消息'您的SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在第1行''/ p>附近的'foo'附近使用正确的语法
答案 1 :(得分:10)
这不是一个错误,这是一个功能。 ;)
默认情况下,PHP不会报告mysqli或PDO错误,因为该信息非常敏感,将其显示给用户是了解如何注入恶意数据的好方法。
MYSQLI_REPORT_ERROR告诉它打开错误,MYSQLI_REPORT_STRICT告诉它将这些错误转换为异常。这将为您提供错误消息的完整报告,因此请勿在生产环境中执行此操作。
使用管道符号|允许您在大多数PHP方法和函数中设置多个常量。 PDO,mysqli,filter_var等都使用管道来设置相同类型的多个可选参数,或者标记的"按位分离"使用它的花哨术语。懒人的数组参数。