【问题标题】:Second while loop not running. Why?第二个while循环没有运行。为什么?
【发布时间】:2011-11-30 21:25:58
【问题描述】:

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

【问题讨论】:

    标签: php loops while-loop


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:

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

      要将内部指针重置为结果集的开头,请使用mysql_data_seek()

      mysql_data_seek($result_work_id, 0);
      

      【讨论】:

        【解决方案3】:

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

        mysql_data_seek($result_work_id, 0);
        

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            SELECT title FROM works WHERE OR '1'

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

            即使是这样,你的第二个循环:

            while ($row = mysql_fetch_assoc($result_work_id))

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

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

            【讨论】:

              【解决方案6】:

              mysql_fetch_assoc 遍历结果,对吗?它已经在第二个 while 循环的末尾,所以它什么也不做。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2021-10-16
                • 2017-03-13
                • 1970-01-01
                • 1970-01-01
                • 2020-02-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多