2011-11-30 106 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))) { 
}