我有两个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;
答案 0 :(得分: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);
答案 1 :(得分:4)
您已经遍历了结果行,所以它在最后并返回FALSE
。 (这就是它第一次退出循环的原因。)
要将内部指针重置为结果集的开头,请使用mysql_data_seek()
。
mysql_data_seek($result_work_id, 0);
答案 2 :(得分:4)
在第一个while()
循环完成后,MySQL结果中的内部指针位于其自身的末尾。您需要告诉它在第一个和第二个循环之间使用mysql_data_seek()
返回到开头:
mysql_data_seek($result_work_id, 0);
答案 3 :(得分: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))) {
}
答案 4 :(得分:1)
根据您发布的代码,您的SQL将类似于:
SELECT title FROM works WHERE OR '1'
该查询将导致错误,因此您的脚本不应超过该点。
即使它确实如此,你的第二个循环:
while ($row = mysql_fetch_assoc($result_work_id))
正在使用已经被第一个循环完全迭代的结果句柄。到第二个循环尝试使用它时,mysql_fetch_assoc
将返回FALSE
,因为没有更多行要提取。这将导致第二个循环立即退出。
如果两个while
循环都需要访问相同的行,请合并它们的逻辑,这样行只需要迭代一次。
答案 5 :(得分:0)
mysql_fetch_assoc逐步完成结果吧?它已经在第二个while循环结束时,所以它什么也没做。