PHP While循环只回显一次

时间:2013-05-01 19:02:42

标签: php loops

这是我的PHP代码:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
}

我希望它输出例如:*1*%1%%2%%3%%4%*2*%1%%2%%3%%4%*3*%1%%2%%3%%4%

但是这个循环输出的是:*1*%1%%2%%3%%4%*2**3*

(它只输出$ row1的第一个循环中的$ row2值。

我该如何解决这个问题?感谢。

6 个答案:

答案 0 :(得分:1)

问题在于,一旦完全迭代$query2,那就是结果的结束。下次通过$row1循环时,您仍然在$query2的末尾,并且没有任何结果。尝试使用mysql_data_seek返回结果的开头:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   mysql_data_seek($query2, 0);
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
}

答案 1 :(得分:1)

如果确实需要多次重复您的第二个查询数据,请先将其放入数组,然后根据需要循环遍历此数组。

答案 2 :(得分:1)

首先:mysql_*函数为deprecated,将在PHP 5.5中删除。请考虑改为使用mysqliPDO

有人说;回到你的问题:

每个结果集都包含一个指向结果集中某个记录的内部指针。最初,此指针指向第一条记录,并在每次调用mysql_fetch_object时前进。

在第一个内部循环之后,$query2结果集的内部指针已经位于列表的末尾,因此对mysql_fetch_object的后续调用只会返回FALSE。< / p>

如果内部查询依赖于$row1的值,则需要在外部循环中重新执行第二个查询。否则,您可以使用mysql_data_seek重置结果指针。

答案 3 :(得分:1)

有关mysql_fetch_object()的一些注意事项。从PHP文档:

  

警告:自PHP 5.5.0起,此扩展程序已弃用

请注意上面的内容。

  

返回一个对象,其属性与获取的行相对应, 将向前移动内部数据指针。

请注意我的粗体。

$result对象(在您的代码中这将是$query2)是一个迭代对象,其指针指向当前项。

Current Item
 |
 v
[1][2][3][4]

当你的第一个循环击中你的第二个循环时,它会遍历整个事物,这样最后,对象现在看起来像这样:

         Current Item
          |
          v
[1][2][3][4]

对于第一个循环的每次迭代,在第一次之后,mysql_fetch_object()函数基本上是这样的:

mysql_fetch_object() ~
  1. Get the next time
  2. Uh, there are no more objects because we're at item [4].  Return done.

那么,你如何让它发挥作用?您可以简单地将结果保存到数组中,然后遍历该数组,或者可以使用mysql_data_seek()重置指针(从5.5开始也不推荐使用)。

要重置数据指针,它将是这样的:

while($row1 = mysql_fetch_object($query1)) {
   echo "*".$row1->id."*";
   while ($row2 = mysql_fetch_object($query2)) {
      echo "%".$row2->id."%";
   }
   // put the result pointer back to the front
   mysql_data_seek($query2, 0)
}

Note1, This SO question/answer helped me find the function to use to reset the pointer.

注意,缺点是你正在调用一个创建对象的函数,每次运行时都会产生处理开销。

另一个选项是将结果保存到数组中,每次只循环遍历数组:

$secondary_result = array();
while ($row2 = mysql_fetch_object($query2)) {
  $secondary_result[] = $row2;
}

while($row1 = mysql_fetch_object($query1)) {
    echo "*".$row1->id."*";
    foreach($secondary_result as $row2) {
        echo "%".$row2->id."%";
    }
}

请注意,此方法将创建额外的内存使用,将对象存储在数组中,但它会节省CPU处理,因为您不是一遍又一遍地重新创建对象,以及调用函数。

如果您只是打印输出,您可以考虑先保存结果。无论现在多次循环$secondary_result,最终结果总是相同的(根据您的代码,第一个循环没有显示直接影响第二个结果的迹象)。

在这种情况下,这更有意义

$buffer = '';
while ($row2 = mysql_fetch_object($query2)) {
  $buffer .= "%".$row2->id."%";
}

while($row1 = mysql_fetch_object($query1)) {
    echo "*".$row1->id."*";
    echo $buffer;
}

但我真的不知道你为什么那样做。如果你正在进行嵌套循环,通常是因为第一个循环的结果影响了第二个循环。

但我希望有所帮助!

干杯!

编辑

Per @ Blazemonger关于展望未来的评论,PDO等价物将是:MySqli:Fetch-Object

当你有一个使用PDO函数的结果对象时,你会像这样循环:

while($row1 = $query1->fetch_object()) {
   echo "*".$row1->id."*";
   while ($row2 = $query1->fetch_object()) {
      echo "%".$row2->id."%";
   }
   // put the result pointer back to the front
   $query2->data_seek(0);
}

以上示例显示了MySqli的获取对象和指针重置版本。

答案 4 :(得分:0)

在第一个循环之后,没有更多结果可以返回query2。因此,每个附加循环中的while为false。您可能希望使用mysqli_data_seek重置查询,或者将所有数据存储在单独的数组中并循环显示。

请注意: 根据文档http://us2.php.net/manual/en/function.mysql-fetch-object.php

  

自PHP 5.5.0起,不推荐使用mysql扩展,并将其删除   在将来。相反,MySQLi或PDO_MySQL扩展应该是   使用

答案 5 :(得分:0)

当你调用$ row2 = mysql_fetch_object($ query2)时,你可能没有得到任何东西,这会给你输出的结果。