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

时间:2013-08-27 05:44:08

标签: php mysql exception mysqli

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

2 个答案:

答案 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等都使用管道来设置相同类型的多个可选参数,或者标记的"按位分离"使用它的花哨术语。懒人的数组参数。