关闭警告:尝试访问 null 类型值的数组偏移量

Turn off Warning: Trying to access array offset on value of type null

提问人:A1Dan 提问时间:10/12/2023 最后编辑:ADysonA1Dan 更新时间:10/12/2023 访问量:151

问:

自从从 php 5 升级到 8 以来,我开始收到很多“警告:尝试访问 null 类型值的数组偏移量”,当使用 mysqli_fetch_array 运行查询时,这些查询可能会或可能不会返回任何结果(如果它们不返回也没关系!

我明白为什么会发生这种情况,并且看到各种线程建议在尝试使用它之前只测试结果,这对于个别实例非常有用。但是我有很多关于这个问题的页面,可能还有很多我还没有找到。因此,我正在寻找一种阻止错误的方法,而不是编辑每个页面。

执行此操作的明显方法似乎是,如果我可以禁用该特定警告......不确定这是否可行?

PHP 错误处理 mysqli

评论

0赞 Barmar 10/12/2023
使用错误抑制运算符。@
0赞 Barmar 10/12/2023
AFAIK,PHP没有提供任何全局抑制特定错误的方法。
0赞 A1Dan 10/12/2023
我认为@抑制运算符仍然需要在每个错误实例中实现,而不是全局实现,这是对的吗?
1赞 mickmackusa 10/12/2023
相关:在 PHP 7.4 中无法捕获弃用警告
1赞 mickmackusa 10/12/2023
我不确定我是否想通过静音/抑制警告和通知来向 PHP 的脸上吐口水。如果你想享受PHP的现代版本,那么改进你的代码以消除异味和破损。

答:

-2赞 rickdenhaan 10/12/2023 #1

您可以定义自定义错误处理程序来拦截该特定警告并忽略它。

set_error_handler(
    static fn (int $errno, string $errstr): bool =>
        $errstr === 'Trying to access array offset on value of type null'
);

如果自定义错误处理程序已处理错误,并且应将错误传递给本机错误处理程序,则应返回。这个处理程序基本上只是假装处理那个非常具体的警告,并将其他所有内容传递给默认处理程序。truefalse

工作示例:https://3v4l.org/SgZ7f0


编辑:需要明确的是:这不是一个永久的解决方案。有志者事竟成,但这种方式就是疯狂。

唯一可能的用例是 OP 的确切用例:当从 PHP 5 升级到 PHP 8 时,您将受到错误、警告和通知的轰炸。如果特定警告出现数百次或数千次,您可能希望暂时隐藏它,以便您可以先专注于修复其他更重要的警告。

这并不意味着你不应该解决这个问题:这是一个警告级别的事件是有原因的。您的代码可能以意想不到的方式运行,这可能会在将来的 PHP 版本中成为 ERROR 级别的事件。

保留此错误处理程序来隐藏警告意味着您不再意识到问题,并且当您升级到更新的 PHP 版本时,一条更大的龙会咬您,这种情况现在是一个错误。

在最好的情况下,此错误处理程序仅在生产环境中实现,因此其硬盘驱动器不会被警告日志填满,而在开发环境中,此错误处理程序不存在,因此开发人员会遇到这些警告作为解决问题的提醒。

评论

0赞 Your Common Sense 10/12/2023
这是一个真正可怕的解决方案,它将错误扫地出门,而不是让开发人员修复它们。
0赞 rickdenhaan 10/12/2023
@YourCommonSense 哦,我完全同意,应该修复代码以不引发警告。我只是在证明这是可以做到的。这应该是一个临时的黑客攻击,以防止服务器的 HDD 在 OP 修复其代码时被日志文件填满。
0赞 A1Dan 10/13/2023
是的,指出了这一点,实际上只是为了在测试时暂时清除该错误......虽然认识我,但我可能会忘记恢复它!
2赞 Dharman 10/12/2023 #2

不要忽略错误。PHP 通过抛出警告来提供帮助。您应该将每个警告视为错误或编码错误。它们不容忽视。

最近的 PHP 版本改进了错误报告。如果您现在才知道这些错误,那么是时候在发布新版本的产品之前修复它们了。如果找不到出现这些警告的所有位置,请监视错误日志一段时间,并修复出现此警告的所有实例。

不要寻求禁用警告的方法!

评论

0赞 A1Dan 10/13/2023
是的,公平点,只是为了方便,同时管理升级。理想情况下,我想记录但不显示非致命警告,这样就可以在不干扰用户的情况下对其进行调查。我刚刚意识到,我不确定如何做到这一点,同时仍然在屏幕上显示致命错误......大概是可行的?
0赞 Dharman 10/14/2023
永远不应向用户显示错误。如果向用户显示错误或警告,则表示服务器上配置错误。禁用display_errors指令。
0赞 Dharman 10/14/2023
您的用户应该只会看到一个不错的错误 500 页面。实际错误将由PHP记录在服务器上。