提问者:小点点

如何使用mysqli_report_strict使mysqli抛出异常? [副本]


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的情况下抛出异常?


共2个答案

匿名用户

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

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等都使用管道来设置多个相同类型的可选参数,或者使用“标志的位析取”来表示它。 懒人的数组参数。