PHP7.4访问MySQLi结果集触发null值数组偏移报错原因及解决
报错触发原因
这个提示是PHP 7.4版本新增的语法校验规则触发的:
- 7.2及更早版本中,对
null、布尔值、整数这类非数组类型的值使用数组下标访问,不会抛出任何提示,属于静默容错逻辑 - 7.4版本开始,这类非法数组访问操作会抛出
Trying to access array offset on value of type null提示,到PHP 8.0及以上版本,这个错误的等级会进一步提升为警告,甚至会中断执行
你贴的for循环逻辑,是靠mysqli_fetch_row($result)[0]的赋值结果作为循环终止条件:当结果集所有行遍历完成后,mysqli_fetch_row($result)会返回null,此时你直接对这个null值取[0]下标,就正好触发了上述提示。
脚本之所以能正常执行完成,是因为null赋值给$resultArray[$i]后会被判定为假值,for循环正常终止,业务流程没有中断,告警仅在最后一次遍历到结果集末尾时触发一次。
无报错的等价实现
你可以根据自己的代码习惯选下面任意一种改法,最终实现的效果和原有逻辑完全一致,且全版本兼容不会触发告警:
- 调整原有for循环的判断逻辑,先拿查询返回行再做下标取值,从根源避免对null取下标:
for($i = 0; $row = mysqli_fetch_row($result); $i++) { $resultArray[$i] = $row[0]; }
- 如果仅需要提取结果集第一列的所有值,不需要自定义循环逻辑,直接用mysqli内置函数批量取值即可,代码更简洁:
$resultArray = array_column(mysqli_fetch_all($result), 0);
注意:如果后续计划升级到PHP 8.x最新正式版,不要用加错误抑制符
@的方式临时屏蔽报错,上述两种改法可以直接兼容PHP 8.0+版本,不需要二次调整。
内容的提问来源于stack exchange,提问作者James Matthews
相关产品推荐
相关产品推荐

