2013-07-11 40 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