You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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>";
}

这里还做了两个关键优化:

  1. 用PDO::FETCH_NUM指定只返回索引数组,避免了原代码中混合数组导致的列数计算错误
  2. 用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 03:22:32