[英]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中刪除它們。 考慮使用mysqli或PDO 。
話雖如此; 回到你的問題:
每個結果集都包含一個指向結果集中某個記錄的內部指針。 最初,此指針指向第一個記錄,並在每次調用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)
}
注意,缺點是你正在調用一個創建對象的函數,每次運行時都會產生處理開銷。
另一個選項是將結果保存到數組中,每次只循環遍歷數組:
$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.