嵌套While循环仅在循环内正确运行

时间:2013-07-11 23:46:54

标签: php mysql while-loop

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

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

在该循环中,我正在检查第二个表,其中一个while循环用于'state',如果状态匹配,那么我将一些信息推送到一个数组。为了简单起见,我在这里摆脱了其他代码。

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

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

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

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>";
    }
}

1 个答案:

答案 0 :(得分:1)

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

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

如果你在$ row_wind循环中放入一些调试信息但在$ row_alert循环之外你应该看到差异。

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

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

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

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