首页 > 解决方案 > 用于在 php 中提取 db 数据的嵌套 while 循环

问题描述

$sql = "SELECT * FROM mytable";
$Source = $conn->query($sql);
$Target= $Tconn->query($sql);
if ($Source->num_rows > 0) {
 while($s_row = $Source->fetch_assoc()) {
     while($t_row= $Target->fetch_assoc()) {
        echo $s_row["id"]."<br>";
        echo $t_row["id"]."<br>";
        }
    }
    } 

嗨,我正在尝试使用嵌套的 while 循环从 2 个不同的服务器回显数据库表数据。我能够连接并回显数据,但输出不是我所期望的。在上面的代码中,您可以看到有 2 个 while 循环,因此对于第一个 while 循环的每个值,必须执行第二个 while 循环,假设 $s_row 具有值 [1,2] 并且 $t_row 具有值 [10,20] 然后输出应该是 1 10 1 20 2 10 2 20 但目前,我得到的输出是 1 10 1 20。这意味着第二个 while 循环没有采用第一个循环的第二行值。

谁能帮我解决这个问题,谢谢。

标签: phpdatabaseapisoap

解决方案


一旦到达末尾$Target,任何将来对 fetch 的调用都将返回false,因此内部循环将不会运行。

您需要回到结果的开头以再次处理它们。

if ($Source->num_rows > 0) {
    while($s_row = $Source->fetch_assoc()) {
        $Target->data_seek(0);
        while($t_row= $Target->fetch_assoc()) {
            echo $s_row["id"]."<br>";
            echo $t_row["id"]."<br>";
        }
    }
} 

除非返回的数据太多,否则将结果放在列表中并进行处理会更有效。

if ($Source->num_rows > 0) {
    $Target_data = $Target->fetch_all(MYSQL_ASSOC);
    while($s_row = $Source->fetch_assoc()) {
        foreach ($Target_data as $t_row) {
            echo $s_row["id"]."<br>";
            echo $t_row["id"]."<br>";
        }
    }
} 

推荐阅读