【问题标题】:Nested While loop only runs inside loop correctly嵌套的 While 循环仅在循环内正确运行
【发布时间】:2013-07-11 23:46:54
【问题描述】:

我有两个 while 循环用于运行一些 MySQL 数据。

第一个 while 循环遍历一堆报告并检查存储在表中的“状态”(如美国)。

在该循环中,我正在使用 while 循环检查第二个表的“状态”,如果状态匹配,则我将一些信息推送到数组。为了简单起见,我在这里删除了其他代码。

基本上,我从第一个 while 循环开始,并将所有信息记录到控制台,并成功循环遍历表中的所有条目。

然后我将嵌套的 while 循环放在那里,当我尝试警告或将其记录到控制台时,它只循环通过父循环中第一个条目的实例。

我的意思是,在 $row_wind 循环中,第一个条目是 CT(康涅狄格州)。当我注销父循环时,它会记录该表中的所有内容(CT 是第一个)。当我使用下面的代码时,它只记录 CT,然后记录子循环中的所有条目,但之后不会对抗父循环。我不能嵌套 while 循环吗?

while($row_wind = mysqli_fetch_array($sql_wind_result)){
    while($row_alert = mysqli_fetch_array($result_user_alerts)){
        echo "<script>alert('".$row_wind['state']." ".$row_alert['state']."');</script>";
    }
}

【问题讨论】:

    标签: php mysql while-loop


    【解决方案1】:

    mysqli_fetch_arrayarray_pop() 类似,一旦获取结果,就不会再次获取该结果。

    所以我的猜测是你的$row_wind 循环实际上运行得很好,但是第二次通过$row_alert 循环寻找更多结果,发现它已经通过它们(在循环中$row_wind = 'CT' )。

    如果您将一些调试信息放在 $row_wind 循环内但在 $row_alert 循环外,您应该会看到差异。

    要解决此问题,您必须在内部循环之前重新运行 $result_user_alerts 查询,或者 - 如果内部查询不依赖于状态,可能会更好 - 事先运行 mysqli_fetch_all() 以获取所有前面的内部循环的结果,然后使用foreach()while() 使用内部循环遍历结果数组。这样你只需要获取它们一次。

    如果您没有mysqli_fetch_all() 可用,您可以手动循环:

    $user_alerts = array();
    while($row_alert = mysqli_fetch_array($result_user_alerts)){
        $user_alerts[] = $row_alert;
    }
    

    注意事项:但是,这种结构的方式似乎可以通过一些更好的查询来更好地执行 - 我不知道您的应用程序的详细信息,但是当您匹配来自两个 SQL 查询的值时在 PHP 循环中,数据库通常可以更快更有效地完成匹配。

    【讨论】:

    • 这完全有道理。我从来没有这样想过。我将研究一个单独的解决方案,这让我指出了正确的方向。谢谢!
    • mysqli_fetch_all() 似乎不再有效。还有其他类似的函数可以将所有信息存储到数组中吗?
    • 我自己使用 PDO,但看起来您必须设置一些其他东西才能使用 fetch_all。您仍然可以循环遍历它并手动构建一个数组。我在回答中添加了一个例子。
    • 我还发现,如果我在父 while 循环内但在嵌套循环外进行新的 SQL 查询,它将正确运行。我假设这是因为它是新查询上的全新 fetch_array 并且它有效。这适用于我现在正在做的事情,因为它不是每次运行时都会查询的大量数据。
    • 是的,新的 sql 查询当然会重新获取行并重新填充查询池。我在回答中也提到了这一点,但由于数据库的负载,不建议这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多