簡體   English   中英

PHP While循環只回顯一次

[英]PHP While loop only echoes once

這是我的PHP代碼:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
}

我希望它輸出例如: *1*%1%%2%%3%%4%*2*%1%%2%%3%%4%*3*%1%%2%%3%%4%

但這個循環輸出的是: *1*%1%%2%%3%%4%*2**3*

(它只輸出$ row1的第一個循環中的$ row2值。

我怎樣才能解決這個問題? 謝謝。

問題是,一旦你完全遍歷$query2 ,那就是結果的結束。 下一次通過你的$row1循環,你仍然在$query2的末尾並且沒有結果。 嘗試使用mysql_data_seek返回結果的開頭:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   mysql_data_seek($query2, 0);
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
}

如果你真的需要多次重復你的第二個查詢數據,先把它放到數組中,然后根據需要循環遍歷這個數組。

首先: 不推薦使用 mysql_*函數,將在PHP 5.5中刪除它們。 考慮使用mysqliPDO

話雖如此; 回到你的問題:

每個結果集都包含一個指向結果集中某個記錄的內部指針。 最初,此指針指向第一個記錄,並在每次調用mysql_fetch_object前進。

在第一個內部循環之后, $query2結果集的內部指針已經位於列表的末尾,因此后續調用mysql_fetch_object將僅返回FALSE

如果內部查詢依賴於$row1值,則需要在外部循環中重新執行第二個查詢。 否則,您可以使用mysql_data_seek重置結果指針。

有關mysql_fetch_object()一些注意事項。 從PHP文檔:

警告:自PHP 5.5.0起,不推薦使用此擴展

請注意上面。

返回一個對象,該對象具有與獲取的行對應的屬性,並向前移動內部數據指針。

請注意我加粗的內容。

$result對象(在你的代碼中這將是$query2 )是一個迭代對象,它有一個指向當前項的指針。

Current Item
 |
 v
[1][2][3][4]

當你的第一個循環命中你的第二個循環時,它會迭代整個事物,這樣最后,對象現在看起來像這樣:

         Current Item
          |
          v
[1][2][3][4]

對於第一個循環的每次迭代,在第一次之后, mysql_fetch_object()函數基本上如下所示:

mysql_fetch_object() ~
  1. Get the next time
  2. Uh, there are no more objects because we're at item [4].  Return done.

那么,你如何讓它發揮作用? 您可以簡單地將結果保存到數組中,然后遍歷該數組,或者您可以使用mysql_data_seek()重置指針mysql_data_seek()從5.5開始也不推薦使用)。

要重置數據指針,它將是這樣的:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
   // put the result pointer back to the front
   mysql_data_seek($query2, 0)
}

注1,這個SO問題/答案幫助我找到了用於重置指針的函數。

注意,缺點是你正在調用一個創建對象的函數,每次運行時都會產生處理開銷。

另一個選項是將結果保存到數組中,每次只循環遍歷數組:

$secondary_result = array();
while ($row2 = mysql_fetch_object($query2)) {
  $secondary_result[] = $row2;
}

while($row1 = mysql_fetch_object($query1)) {
    echo "*".$row1->id."*";
    foreach($secondary_result as $row2) {
        echo "%".$row2->id."%";
    }
}

請注意,此方法將創建額外的內存使用,將對象存儲在數組中,但它會節省CPU處理,因為您不是一遍又一遍地重新創建對象,以及調用函數。

如果您只是打印輸出,則可以考慮先保存結果。 無論現在多次循環$secondary_result ,最終結果將始終相同(根據您的代碼,第一個循環顯示沒有直接影響第二個結果的跡象)。

在這種情況下,這更有意義

$buffer = '';
while ($row2 = mysql_fetch_object($query2)) {
  $buffer .= "%".$row2->id."%";
}

while($row1 = mysql_fetch_object($query1)) {
    echo "*".$row1->id."*";
    echo $buffer;
}

但我真的不知道你為什么那樣做。 如果你正在進行嵌套循環,通常是因為第一個循環的結果影響了第二個循環。

但我希望有所幫助!

干杯!

編輯

Per @ Blazemonger關於展望未來的評論,PDO等價物將是: MySqli:Fetch-Object

當你有一個使用PDO函數的結果對象時,你會像這樣循環:

while($row1 = $query1->fetch_object()) {
   echo "*".$row1->id."*";
   while ($row2 = $query1->fetch_object()) {
      echo "%".$row2->id."%";
   }
   // put the result pointer back to the front
   $query2->data_seek(0);
}

上面的示例顯示了MySqli的獲取對象和指針重置版本。

在第一個循環之后,沒有更多結果可以返回query2。 因此,在每個額外的循環中,while都是false 您可能希望使用mysqli_data_seek重置查詢,或者將所有數據存儲在單獨的數組中並循環使用它。

另請注意:根據文檔http://us2.php.net/manual/en/function.mysql-fetch-object.php

從PHP 5.5.0開始,不推薦使用mysql擴展,將來會刪除它。 相反,應該使用MySQLi或PDO_MySQL擴展

也許你在調用$ row2 = mysql_fetch_object($ query2)時沒有得到任何東西,這會給你輸出的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM