尝试克隆一个无法克隆的mysqli_result类对象

3
以下错误被抛出:
致命错误:尝试克隆mysqli_result类的不可克隆对象
当我直接使用克隆来进行mysql查询结果时。
$result = mysqli_query($con, $query);
$resultsClone = clone $result;

有没有一种方法可以克隆mysqli对象?


在极端情况下,有这个可怕的事物:$clone = unserialize(serialize($target)); 我们假设$target可以被序列化,这是另外一回事。 - Christian
4个回答

3

正如KingCrunch已经解释的那样, 克隆数据库结果指针没有太多用处 - 它们在其生存的有限上下文中具有相应的局限性,就像任何指针或资源一样。

但是根据你想要做什么,你可以再次运行查询:

$result      = mysqli_query($con, $query);
$resultClone = mysqli_query($con, $query);

或者您可以封装获取逻辑,这样根据您的应用程序状态,您可以在同一资源上重新开始。


这样做会很昂贵。 我所做的解决方法是通过循环第一次提取我想要重复使用的数据,然后在第二个循环输出并使用data_seek重置指针。 - 3emad
@3emad:这就是我所说的更加封装的东西。 - hakre

3

无法克隆不可克隆的对象,正如其名称所示。

仅仅是为了多加说明:在这种特定情况下,mysqli结果(或多或少 - 我不知道确切的细节)是指向某个结果“在其他地方”的指针。克隆意味着两个指针引用相同的结果“在其他地方”,这可能会导致严重的副作用,因为从一个结果中获取结果肯定会影响另一个结果。


0

当我尝试使用MySQL结果的输出作为字典来获取基于ID的标题时,我遇到了类似的问题。

由于mysqli_result充当指向存储在服务器上的mysqli_query输出的指针,这意味着一旦它被提取,再次访问它时(多次迭代或其他情况)将无法找到它并返回NULL。我能够克服这个问题的方法之一是将mysqli_result提取到JSON数组中,这使其可以充当字典(无限次迭代)。

$result = mysqli_query($con, $query);
while($row = mysqli_fetch_assoc($result )) {
    $results_clone[] = $row ; 
}

现在,您应该可以无限制地使用/访问$results_clone。示例代码:

for($i=0;$i<count($results_clone);$i++){
    $results_clone[$i];
}

这与对象克隆有什么关系? - Dharman
1
这个问题涉及克隆/复制 mysqli_result 以供使用。我的答案是一个解决方法,可以提供类似的输出,特别是因为 mysqli_result 不能被克隆,一旦提取就会返回 null。 - Osama Hussein

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接