使用mysqli_data_seek及Do While循环复用结果集时首条记录出现空数组偏移访问警告的技术求助
问题分析与解决方案
我来帮你排查这个问题!出现这个警告的原因其实和do-while循环的执行逻辑以及$row3变量的状态有关:
错误原因拆解
- 第一个
do-while循环结束时,mysqli_fetch_assoc($result3)会返回null(因为已经遍历完所有记录),此时$row3被赋值为null。 - 你调用
mysqli_data_seek($result3, 0)重置了结果集指针,但**$row3的当前值还是null**。 - 第二个
do-while循环是先执行循环体代码,再判断循环条件——也就是说,第一次进入循环体时,你直接去访问$row3['nama_p'],但此时$row3还是null,自然就触发了“访问null的数组偏移”警告。
解决方案
推荐两种处理方式,优先选第一种(更安全易维护):
方案1:提前将结果集转为数组(最优解)
直接把结果集的所有数据读取到一个数组中,之后复用这个数组生成下拉框,完全不用操作结果集指针,避免指针相关的坑:
// 在第一次使用结果集前,先把所有数据存入数组 $provinceList = []; while ($row = mysqli_fetch_assoc($result3)) { $provinceList[] = $row; }
然后用这个数组生成第一个下拉框:
<option value="">-</option> <?php foreach ($provinceList as $row3) {?> <option value="<?php echo $row3['nama_p'];?>" <?php if($row3['nama_p'] === $row2['prov_domisili']) echo 'selected="selected"'; ?>><?php echo $row3['nama_p'];?></option> <?php }?> </select></td>
第二个下拉框同样复用这个数组:
<select name="textfield14" id="textfield14"> <option value="">-</option> <?php foreach ($provinceList as $row3) {?> <option value="<?php echo $row3['nama_p'];?>" <?php if($row3['nama_p'] === $row2['prov_ktp']) echo 'selected="selected"'; ?>><?php echo $row3['nama_p'];?></option> <?php }?> </select>
这种方式的好处是代码更清晰,不用关心指针位置,而且如果结果集为空,也不会出现错误(只会显示默认的-选项)。
方案2:修正第二个do-while的执行逻辑
如果一定要复用原结果集指针,需要在第二个do-while循环前,先手动获取第一条记录,确保$row3不是null再进入循环:
<?php mysqli_data_seek($result3, 0); // 先获取第一条记录,给$row3赋值 $row3 = mysqli_fetch_assoc($result3); ?> <select name="textfield14" id="textfield14"> <option value="">-</option> <?php do { // 加个判断,避免结果集为空的情况 if ($row3) { ?> <option value="<?php echo $row3['nama_p'];?>" <?php if($row3['nama_p'] === $row2['prov_ktp']) echo 'selected="selected"'; ?>><?php echo $row3['nama_p'];?></option> <?php } } while ($row3 = mysqli_fetch_assoc($result3));?> </select>
不过这种方式需要额外处理结果集为空的情况,不如方案1省心。
内容的提问来源于stack exchange,提问作者Aresta kuroryu
相关产品推荐
相关产品推荐

