有几点需要注意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 的获取对象和指针重置版本。