0

我有两个 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>";
    }
}
4

1 回答 1

1

mysqli_fetch_array类似于array_pop()一旦它获取结果,它就不会再次获取该结果。

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

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

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

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

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

一个警告说明:然而,这种结构的方式似乎可以通过一些更好的查询来更好地执行——我不知道你的应用程序的细节,但是当你在 PHP 中匹配来自两个 SQL 查询的值时循环,这种匹配通常可以由数据库更快、更有效地完成。

于 2013-07-11T23:55:27.130 回答