如何在PHP的Do While循环内执行函数且不丢失变量
解决Do While循环调用函数后变量丢失的问题
遇到这种循环里调用函数后原变量“消失”的情况,大概率是下面两个原因之一,咱们一步步来解决:
1. 函数内部操作了原数据库结果集
如果你的comprobe()函数里执行了数据库查询,尤其是用了和主循环相同的数据库连接/结果集变量(比如老的mysql_*扩展或者共享的mysqli结果集),就会导致结果集的指针被移动,主循环里的$row_DatosConsulta就取不到后续数据了。
最稳妥的解决办法:先把所有查询结果一次性读到数组里,再循环数组操作,彻底和数据库结果集解绑:
// 先把查询结果全部存入数组 $allData = []; while ($row = mysqli_fetch_assoc($DatosConsulta)) { $allData[] = $row; } // 循环数组处理 foreach ($allData as $row_DatosConsulta) { comprobe($row_DatosConsulta['strCod']); ?> <tr class="edit"> <td class="text-center"><?php echo $row_DatosConsulta['strCod']; ?></td> <td class="text-center"><?php echo $row_DatosConsulta['strNombre'] . ' ' . $row_DatosConsulta['strApellido']; ?></td> <td class="text-center"><?php echo $row_DatosConsulta['strMedidor']; ?></td> <!-- 其他列内容 --> </tr> <?php }
2. 函数修改了$row_DatosConsulta变量
如果comprobe()函数里不小心修改了全局的$row_DatosConsulta(比如用了global关键字,或者引用传递参数),也会导致原变量被覆盖。
快速临时解决:在调用函数前,把需要的字段值先存到独立变量里,避免被函数影响:
do { // 先把要用的值存到临时变量 $cod = $row_DatosConsulta['strCod']; $fullName = $row_DatosConsulta['strNombre'] . ' ' . $row_DatosConsulta['strApellido']; $medidor = $row_DatosConsulta['strMedidor']; // 调用函数 comprobe($cod); ?> <tr class="edit"> <td class="text-center"><?php echo $cod; ?></td> <td class="text-center"><?php echo $fullName; ?></td> <td class="text-center"><?php echo $medidor; ?></td> <!-- 其他列内容 --> </tr> <?php } while ($row_DatosConsulta = mysqli_fetch_assoc($DatosConsulta));
根治建议:检查comprobe()函数的代码,看看有没有:
- 使用
global $row_DatosConsulta这类全局变量 - 对传入的参数用了引用传递(比如
function comprobe(&$cod)) - 直接操作主循环用的数据库结果集变量
如果有这些情况,改成传值操作或者使用独立的数据库连接/变量就可以彻底解决问题了。
内容的提问来源于stack exchange,提问作者Alv Raf Alc Mir
相关产品推荐
相关产品推荐

