Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 第二个while循环未运行。为什么?_Php_Loops_While Loop - Fatal编程技术网

Php 第二个while循环未运行。为什么?

Php 第二个while循环未运行。为什么?,php,loops,while-loop,Php,Loops,While Loop,我有两个while循环一个接一个地运行(不是在彼此内部)——我对代码进行了一些简化,因此下面只列出了其中的重要部分。当我比较两个回显查询时,问题就出现了,因为第二个while循环显然根本没有运行 我在某个地方读到有人用for循环来解决第二个问题,但我想弄清楚为什么第二个while循环没有在我的代码中运行 $query_work_title = "SELECT title FROM works WHERE "; while ($row = mysql_fetch_assoc($result_wor

我有两个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;
$query\u work\u title=“从工作中选择标题”;
while($row=mysql\u fetch\u assoc($result\u work\u id)){
$query_work_title.=“或'$work_id'”;
}
echo$query\u work\u title;
回声“
”; $result\u work\u title=mysql\u query($query\u work\u title)或 die(mysql_错误($cn)); //检索以下查询中每个工作的作者 $query\u author\u id=“从works\u和\u authors WHERE中选择author\u id”; while($row=mysql\u fetch\u assoc($result\u work\u id)){ $query\u author\u id.=“work\u id=‘hello’”; } echo$query\u author\u id;
mysql\u fetch\u assoc逐步完成结果,对吗?它已经在第二个while循环的末尾,所以它什么也不做。

您已经循环了结果行,所以它在末尾并返回
FALSE
。(这就是它第一次退出循环的原因。)

要重置指向结果集开头的内部指针,请使用


根据您发布的代码,您的SQL将类似于:

从works WHERE或“1”中选择标题

该查询将导致错误,因此您的脚本不应超过该点

即使如此,您的第二个循环:

while($row=mysql\u fetch\u assoc($result\u work\u id))

正在使用已由第一个循环完全迭代的结果句柄。当第二个循环尝试使用它时,
mysql\u fetch\u assoc
将返回
FALSE
,因为没有更多的行要获取。这将导致第二个循环立即退出


如果两个
while
循环都需要访问相同的行,则组合它们的逻辑,这样这些行只需要迭代一次。

MySQL扩展跟踪每个结果的内部行指针。它在每次调用mysql_fetch_assoc()后递增该指针,并且允许您使用while循环,而无需指定何时停止。如果要在结果集中循环多次,则需要将此内部行指针重置回0

要执行此操作,请在第一个循环之后执行以下操作:

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

在第一个
while()
循环完成后,MySQL结果中的内部指针位于其自身的末尾。您需要在第一个循环和第二个循环之间告诉它返回到开始:

mysql_data_seek($result_work_id, 0);

您已经到达结果集的末尾,但是可以使用
mysql\u data\u 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))) {
}
// 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))) {
}