第二个while循环没有运行。为什么?

时间:2011-11-30 21:25:59

标签: php loops while-loop

我有两个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;

6 个答案:

答案 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循环结束时,所以它什么也没做。