1

这是我的 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 值。

我怎样才能解决这个问题?谢谢。

4

6 回答 6

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."%";
   }
}
于 2013-05-01T19:08:18.097 回答
1

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

于 2013-05-01T19:08:27.127 回答
1

首先:这些mysql_*函数已被弃用,将在 PHP 5.5 中删除。考虑改用mysqliPDO

话虽如此; 回到你的问题:

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

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

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

于 2013-05-01T19:09:10.727 回答
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)
}

注意1,这个SO问题/答案帮助我找到了用于重置指针的功能。

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

另一种选择是将结果保存到数组中,并且每次都循环遍历数组:

$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;
}

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

但我希望这会有所帮助!

干杯!

编辑

根据@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 的获取对象和指针重置版本。

于 2013-05-01T19:30:42.483 回答
0

在第一个循环之后,query2 不再返回任何结果。所以whilefalse在每个额外的循环中。您可能希望使用单独的数组来重置查询mysqli_data_seek或将所有数据存储在一个单独的数组中,然后循环遍历该数组。

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

mysql 扩展自 PHP 5.5.0 起已弃用,将来将被删除。相反,应该使用 MySQLi 或 PDO_MySQL 扩展

于 2013-05-01T19:08:18.020 回答
0

当您调用 $row2 = mysql_fetch_object($query2) 时,您可能一无所获,这将为您提供所获得的输出。

于 2013-05-01T19:08:23.640 回答