【问题标题】:Nested while loops for db data extraction in php用于在 php 中提取 db 数据的嵌套 while 循环
【发布时间】:2021-10-05 09:33:06
【问题描述】:
$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循环没有取第一个循环的第二行值。

谁能帮帮我,谢谢。

【问题讨论】:

  • 您是否尝试分别运行每个while 循环以检查这些值是否真的是您期望的 [1,2] 和 [10,20]?也许s_row 的值不是 [1,2],而只是 [1]。

标签: php database api soap


【解决方案1】:

一旦到达$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>";
        }
    }
} 

【讨论】:

  • 谢谢,第一个解决方案对我有用。使用第二种解决方案,程序没有进入循环。我有大约 30k 条记录,必须经过上述过程。解决方案适合这么多数据吗?
  • 第二种方案是不是因为记录数的问题导致出错?那么第一个解决方案就是要走的路。
  • 感谢您的帮助。
猜你喜欢
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 2019-02-18
  • 2012-06-25
  • 2013-05-11
  • 2015-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多