2011-11-30 146 views
2

我有兩個while循環依次運行(不在彼此的內部) - 我簡化了代碼,以便只列出其中的重要部分。當我比較兩個回顯查詢時出現問題,因爲第二個while循環顯然根本沒有運行。第二次while循環未運行。爲什麼?

我在某處讀到某人通過爲第二個循環使用for循環解決了這個問題,但我想深入瞭解爲什麼第二個while循環沒有在我的代碼中運行。

$query_work_title = "SELECT title FROM works WHERE "; 
while ($row = mysql_fetch_assoc($result_work_id)) { 
    $query_work_title .= "OR '$work_id' "; 
} 
echo $query_work_title; 
echo '<br />'; 
$result_work_title = mysql_query($query_work_title) or 
    die(mysql_error($cn)); 

// retrieve the authors for each work in the following query 
$query_author_id = "SELECT author_id FROM works_and_authors WHERE "; 
while ($row = mysql_fetch_assoc($result_work_id)) { 
    $query_author_id .= "work_id = 'hello' "; 
} 
echo $query_author_id; 

回答

5

MySQL擴展跟蹤每個結果的內部行指針。它會在每次調用mysql_fetch_assoc()之後遞增這個指針,並且允許您在不指定何時停止的情況下使用while循環。如果你打算通過一個結果集循環不止一次,你需要把這個內部行指針重置爲0。

要做到這一點,你會在第一循環結束後mysql_data_seek()

while ($row = mysql_fetch_assoc($result_work_id)) { 
    $query_work_title .= "OR '$work_id' "; 
} 
mysql_data_seek($result_work_id, 0); 
0

mysql_fetch_assoc步驟通過結果吧?它已經在第二個while循環的末尾,所以它什麼都不做。

4

你已經循環遍歷結果行,所以它在最後並返回FALSE。 (這就是爲什麼它第一次退出循環。)

要將內部指針重置爲結果集的開頭,請使用mysql_data_seek()

mysql_data_seek($result_work_id, 0); 
1

根據您發佈的代碼,你的SQL看起來像:

SELECT title FROM works WHERE OR '1'

該查詢會導致錯誤使你的腳本不應該讓過去的那一點。

即使是這樣,你的第二個循環:

while ($row = mysql_fetch_assoc($result_work_id))

是使用已經由第一回路被完全重複的結果句柄。到第二次循環嘗試使用它時,mysql_fetch_assoc將返回FALSE,因爲沒有更多行要讀取。這將導致第二個循環立即退出。

如果兩個while循環都需要訪問相同的行,請合併它們的邏輯,這樣行只需要迭代一次。

4

在第一個while()循環完成之後,MySQL結果中的內部指針位於其結尾。你需要告訴它要回去使用第一和第二環路之間mysql_data_seek()開頭:

mysql_data_seek($result_work_id, 0); 
2

你已經達到了你的結果集的末尾,但您可以使用mysql_data_seek重置。

// query your database 
$result = mysql_query(...); 
// loop through results 
while(($row = mysql_fetch_assoc($result))) { 
} 
// reset result set 
mysql_data_seek($result,0); 
// loop again 
while(($row = mysql_fetch_assoc($result))) { 
} 
相關問題