PHP嵌套while循环提取两台服务器数据库数据输出异常如何解决
问题原因
核心是数据库结果集的单向遍历特性导致的:query()返回的结果集默认使用向前游标,第一次外层循环触发内层while把$Target的所有记录遍历完之后,游标已经停在结果集末尾,后续外层循环再调用$Target->fetch_assoc()只会返回false,所以内层循环不会再执行。
解决方法
方案1:预存Target结果集到数组(推荐)
一次性把Target的所有查询结果加载到内存数组中,每次外层循环直接遍历数组即可,避免重复操作数据库游标,性能更高。
$sql = "SELECT * FROM mytable"; $Source = $conn->query($sql); // 提前把Target的结果集存到数组 $Target = $Tconn->query($sql); $targetList = []; if ($Target->num_rows > 0) { while($t_row = $Target->fetch_assoc()) { $targetList[] = $t_row; } } if ($Source->num_rows > 0) { while($s_row = $Source->fetch_assoc()) { // 遍历预存的数组 foreach ($targetList as $t_row) { echo $s_row["id"]."<br>"; echo $t_row["id"]."<br>"; } } }
方案2:每次外层循环重置Target结果集游标
如果Target结果集太大不想全部加载到内存,可以每次外层循环开始前,用data_seek()方法把游标重置到结果集开头:
$sql = "SELECT * FROM mytable"; $Source = $conn->query($sql); $Target = $Tconn->query($sql); if ($Source->num_rows > 0) { while($s_row = $Source->fetch_assoc()) { // 重置Target结果集游标到第0条记录位置 $Target->data_seek(0); while($t_row= $Target->fetch_assoc()) { echo $s_row["id"]."<br>"; echo $t_row["id"]."<br>"; } } }
内容的提问来源于stack exchange,提问作者sam
相关产品推荐
相关产品推荐

