复制 mysql 结果以循环两次


duplicate mysql result to cycle it twice

我需要循环两次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
}

数据行由 mysql_fetch_array($result) 语句检索。如果复制$result则只是复制句柄(资源 ID),而不是数据。

因此,您要么重复 while 循环,要么重复您在 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 ...
    }
}
?>

因为您的$result存储了Resource id

all记录,这就是为什么

我建议你必须使用clone来创建$result_copy。原因(来自 PHP5 手册):

从 PHP5 开始,对象变量不再包含对象本身作为值。它只包含一个对象标识符,允许对象访问器查找实际对象。当一个对象通过参数发送、返回或分配给另一个变量时,不同的变量不是别名:它们保存标识符的副本,该标识符指向同一对象。

所以这就是为什么指针在最后一个位置的原因。

我认为这是因为

mysql_query()返回一个名为resource的内部数据结构,该结构包含指向当前处理的行的指针。当你这样做时$result_copy = $result;你不是在制作副本,你只是将其指针分配给另一个变量。

使用mysql_data_seek($result, 0)是正确的。

原因是基于mysql_fetch_array的文档

返回与读取的行对应的数组,并移动 前方的内部数据指针