mysqli中有一个名为mysqli_report()
的函数,它类似于PDO的setAttribute()
方法及其errmode_*
常量。 手册说:
MYSQLI_REPORT_STRICT抛出mysqli_sql_exception以查找错误而不是警告
因此,考虑到pdo::errmode_exception
,我尝试了以下代码
mysqli_report(MYSQLI_REPORT_STRICT);
$mysqli->query("foo");
但是,令我失望的是,它没有产生任何例外,也没有任何警告。
那么,问题来了:有没有一种方法可以告诉mysqli在不使用mysqli_report_all
的情况下抛出异常?
经过一些研究,我终于了解到函数的参数是位掩码,必须将几个值组合起来才能得到所需的结果。 最后的组合并不是过于合乎逻辑,但它按照预期工作,在查询错误时抛出异常,同时忽略警告。
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
将产生期望的结果:
致命错误:未捕获异常“mysqli_sql_exception”,消息为“您的SQL语法中有错误; 查看与您的MySQL server版本相对应的手册,以确定在第1行“foo”附近使用的正确语法。
那不是bug,那是一个功能。 ;)
PHP默认情况下不报告mysqli或PDO错误,因为这些信息是高度敏感的,向用户显示这些信息是学习如何注入恶意数据的好方法。
MYSQLI_REPORT_ERROR告诉它打开错误,MYSQLI_REPORT_STRICT告诉它将这些错误转换为异常。 这将为您提供错误消息的完整报告,因此如果您在生产中这样做,请确保不将其显示给最终用户。
使用管道符号允许您在大多数PHPs方法和函数中设置多个常量。 PDO,mysqli,filter_var等都使用管道来设置多个相同类型的可选参数,或者使用“标志的位析取”来表示它。 懒人的数组参数。