【问题标题】:How to deal with mysqli problems? mysqli_fetch_array(): Argument #1 must be of type mysqli_result如何使用 MYSQLI_REPORT_STRICT 使 mysqli 抛出异常? [复制]
【发布时间】:2021-06-10 19:50:10
【问题描述】:

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

【问题讨论】:

    标签: php mysql exception mysqli


    【解决方案1】:

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

    mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
    

    会产生预期的结果:

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

    【讨论】:

    • 那个“PHP 错误”是什么 - 它似乎没有包含任何有用的信息?
    【解决方案2】:

    这不是错误,这是一项功能。 ;)

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

    MYSQLI_REPORT_ERROR 告诉它打开错误,MYSQLI_REPORT_STRICT 告诉它将这些错误转换为异常。这将为您提供错误消息的完整报告,因此如果您在生产中执行此操作,请确保不要将其显示给最终用户。

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

    【讨论】:

    • 不鼓励人们默认报告错误(尤其是作为例外)确实是一种误导。关闭display_errors 后,错误、警告和未捕获的异常对用户隐藏。建议:您应该尽可能打开异常(它们是现代 PHP 的标准做法)并在生产中关闭 display_errors。顺便说一句,您最喜欢的框架可能会为您设置一个未捕获的异常处理程序,以显示一个漂亮的错误页面,向您发送警报等等。
    • @Benjamin 正确,我正在编辑它。我的意思是你永远不应该向最终用户显示该错误消息。
    猜你喜欢
    • 2020-06-22
    • 2016-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-22
    相关资源
    最近更新 更多