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
相关产品推荐
相关产品推荐

