You need to enable JavaScript to run this app. PHP MYSQLI嵌套fetch_assoc时内层while循环仅执行一次问题求助
优惠活动
大模型
产品
解决方案
定价
更多

PHP MYSQLI嵌套fetch_assoc时内层while循环仅执行一次问题求助

问题原因

fetch_assoc() 方法会移动MySQLi结果集的内部读取指针,逐行向后读取。第一次外层循环执行时,内层while循环会把$sqlRespostas结果集的指针移动到最后一行末尾,后续再调用fetch_assoc()会一直返回false,因此外层第二次及之后迭代时,内层循环都不会触发。

解决方案

方案1:重置结果集指针

每次内层循环执行完成后,将$sqlRespostas的指针重置到第一行位置,适合结果集数据量较大的场景:
在内层while循环结束后添加一行代码:

$sqlRespostas->data_seek(0);

修改后的内层逻辑示例:

while($respostas = $sqlRespostas->fetch_assoc()) {
    // 原有switch逻辑保持不变
}
$sqlRespostas->data_seek(0); // 新增指针重置代码
$conta++;
// 后续progress计算逻辑保持不变

方案2:提前预加载结果到数组

如果结果集数据量不大,提前把所有结果读取到数组中,后续直接遍历数组即可,无需处理指针问题,执行效率更高:
在外层$firstSurvey循环之前,先预加载应答数据:

// 预加载所有应答数据到数组
$allRespostas = [];
while($row = $sqlRespostas->fetch_assoc()) {
    $allRespostas[] = $row;
}

然后把内层的while循环替换为数组遍历:

foreach($allRespostas as $respostas) {
    // 原有switch逻辑保持不变
}
额外逻辑提示

你当前代码中$conta = 2定义在外层循环内部,$conta++写在内层循环结束后,意味着每次外层循环迭代时,$conta都会被重置为2,内层循环中读取的永远是resposta2字段,不符合预期的话可以调整$conta的定义位置。

内容的提问来源于stack exchange,提问作者Rafael Moreira

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 21:00:01