2013-07-11 145 views
0

我有两个while循环,我用它来运行一些MySQL数据。嵌套虽然循环只能在循环内正确运行

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

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

基本上,我从第一个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

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

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

+0

这样做总的感觉。我从来没有这样想过。我会研究一个单独的解决方案,这让我指出了正确的方向。谢谢! – MillerMedia

+0

mysqli_fetch_all()似乎不再有效。有没有其他的功能可以将所有的信息存储到数组中? – MillerMedia

+0

我自己使用PDO,但它看起来像你必须有一些其他的东西设置使用fetch_all。你仍然可以通过它循环并手动建立一个数组。我在我的答案中添加了一个例子。 – cincodenada