我需要循环两次mysql结果。 所以我决定将其结果复制到一个新变量中:
$result = mysql_query($query, $db);
$result_copy = $result;
然后我循环我的$result
并打印数据
但是,当我尝试循环$result_copy
时,while
将无效
我可以使用mysql_data_seek($result_copy, 0)
来解决问题,但我想理解为什么副本不会从[0]开始
提前谢谢!
-----------------------
我发布了更长版本的代码:
$query = [...];
$result = mysql_query($query, $db);
$result_copy = $result;
while ($row = mysql_fetch_array($result)) {
[...] // this outputs the data
}
while ($row = mysql_fetch_array($result_copy)) {
[...] // No data are shown here. Pointer is at the end of $result_copy
}
答案 0 :(得分:2)
数据行由 mysql_fetch_array($ result)语句检索。 如果您复制 $ result ,您只需复制句柄(资源ID),而不是数据。
所以,你要么重复 while 循环,要么重复在循环时所采取的行动:
<?php
$query = [...];
$result = mysql_query($query, $db);
// $result_copy = $result;
while ($row = mysql_fetch_array($result)) {
// We got a row here ...
foreach($row as key => $value)
[...] // Do this ...
[...] // Do that again ...
}
}
?>
答案 1 :(得分:1)
因为您的$result
存储了Resource id
不是all
记录的原因
答案 2 :(得分:1)
我建议你必须使用clone
来创建$ result_copy。
原因(来自PHP5手册):
从PHP5开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问者查找实际对象。当一个对象通过参数发送,返回或分配给另一个变量时,不同的变量不是别名:它们包含标识符的副本,它指向同一个对象。
所以这就是指针在最后位置的原因。
答案 3 :(得分:0)
我认为这是因为mysql_query()
返回一个名为resource
的内部数据结构,它保存了自己指向当前处理行的指针。当你执行$result_copy = $result;
时,你没有复制,你只需将其指针指向另一个变量。
使用mysql_data_seek($result, 0)
是正确的。
答案 4 :(得分:0)
原因是基于docs of mysql_fetch_array
返回与获取的行对应的数组并移动 提前内部数据指针。