这是我的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值。
我该如何解决这个问题?感谢。
答案 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中删除。请考虑改为使用mysqli或PDO。
有人说;回到你的问题:
每个结果集都包含一个指向结果集中某个记录的内部指针。最初,此指针指向第一条记录,并在每次调用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)时,你可能没有得到任何东西,这会给你输出的结果。