PHP代码循环执行后出现致命错误的问题求助
解决PDO循环中fetchAll()调用失败及数组越界问题
看起来你遇到的是典型的数组越界导致的致命错误,咱们先拆解问题根源:
你定义的$query数组只有从1到25的键,但你的while循环会持续让$q递增,直到$q=26时,$query[26]根本不存在,值为null。这时候尝试调用null->fetchAll(),自然触发了致命错误,同时弹出数组键未定义的警告——原来的循环写法先执行$query[$q]->fetchAll()再判断条件,完全没检查当前$q对应的元素是否存在。
下面给你两种可行的修复方案:
方案一:用foreach遍历数组(强烈推荐)
foreach是PHP遍历数组最安全的方式,它会自动遍历数组内的每一个元素,完全不用担心越界问题。同时咱们可以用计数器记录查询编号:
$z = 1; foreach ($query as $stmt) { echo('<div class="wyniki">'); echo("<b>Zapytanie nr. ".$z.":</b><br>"); $z++; // 指定FETCH_NUM只返回索引数组,简化后续遍历逻辑 $ass = $stmt->fetchAll(PDO::FETCH_NUM); $num = count($ass); // 处理空结果的情况 if ($num === 0) { echo "Brak wyników<br>"; echo"</div>"; continue; } // 用两层foreach替代嵌套while,代码更简洁 foreach ($ass as $row) { foreach ($row as $value) { echo $value . " "; } echo "<br>"; } echo"</div>"; }
这里还做了两个关键优化:
- 用
PDO::FETCH_NUM指定只返回索引数组,避免了原代码中混合数组导致的列数计算错误 - 用foreach替代嵌套while,代码可读性大幅提升
方案二:修复while循环的终止条件
如果你坚持要用while循环,一定要先检查当前索引对应的元素是否存在,再执行查询操作:
$q = 1; $z = 1; // 先确认$query[$q]存在,再进入循环 while (isset($query[$q])) { $stmt = $query[$q]; $ass = $stmt->fetchAll(PDO::FETCH_NUM); echo('<div class="wyniki">'); echo("<b>Zapytanie nr. ".$z.":</b><br>"); $z++; $num = count($ass); if ($num === 0) { echo "Brak wyników<br>"; echo"</div>"; $q++; continue; } $b = 0; $realnum = $num - 1; while($b <= $realnum){ $row = $ass[$b]; $c = 0; $colCount = count($row); while ($c < $colCount){ echo $row[$c] . " "; $c++; } echo("<br>"); $b++; } echo"</div>"; $q++; };
这里通过isset($query[$q])确保只有当前索引存在时才执行循环,彻底避免了越界问题。
另外补充:你原代码中的列数计算$count= count(array_keys($asscount)); $realcount= $count/2-1;是错误的——因为PDO默认返回关联数组+索引数组的混合模式(PDO::FETCH_BOTH),所以count结果是列数的2倍。用PDO::FETCH_NUM或者直接遍历当前行元素就能解决这个问题。
内容的提问来源于stack exchange,提问作者Kacper Zyberski
相关产品推荐
相关产品推荐

