自从从 php 5 升级到 8 以来,当使用 mysqli_fetch_array 运行可能返回或不返回任何结果的查询时,我开始收到很多“警告:尝试访问 null 类型值的数组偏移量”(如果它们返回结果也没关系)不要!)。
我明白为什么会发生这种情况,并且看到了各种建议在尝试使用结果之前先测试结果的线程,这对于个别实例来说非常有用。但我有很多关于这个问题的页面,而且可能还有很多我还没有找到。所以我正在寻找一种方法来停止错误,而不是编辑每个页面。
执行此操作的明显方法似乎是我是否可以禁用该特定警告...但不确定这是否可能?
您可以定义自定义错误处理程序来拦截该特定警告并忽略它。
set_error_handler(
static fn (int $errno, string $errstr): bool =>
$errstr === 'Trying to access array offset on value of type null'
);
如果自定义错误处理程序已处理错误,则应返回
true
;如果应将错误传递给本机错误处理程序,则应返回 false
。该处理程序基本上只是假装处理该非常具体的警告,并将其他所有内容传递给默认处理程序。
编辑:需要明确的是:这不是一个永久的解决方案。有志者事竟成,但这种方式就是疯狂。
像这样的唯一可能的用例正是OP的用例:当从PHP 5升级到PHP 8时,你将受到错误、警告和通知的轰炸。如果特定警告出现数百或数千次,您可能需要“暂时”隐藏它,以便可以首先专注于修复其他更重要的警告。 这并不意味着您不应该修复此问题:出于某种原因,这是一个警告级别的事件。您的代码可能会以意想不到的方式运行,这可能会在未来的 PHP 版本中成为错误级别事件。
保留此错误处理程序来隐藏警告意味着您不再意识到问题,当您升级到较新的 PHP 版本时,更大的龙会咬您,而这种情况现在是一个错误。
在最好的情况下,这个错误处理程序只在生产环境中实现,这样它的硬盘就不会被警告日志填满,而在开发环境上,这个错误处理程序不存在,这样开发人员就会遇到这些警告作为解决问题的提醒。