复制/复制/克隆mysql_result对象

时间:2019-07-09 11:09:30

标签: php mysql object clone

我正尝试将mysql SELECT查询保存到文件中,如下所示:

$result = mysqli_query($db,$sql);

$out = fopen('tmp/csv.csv', 'w');
while ($row = $result -> fetch_row()) {
fputcsv($out,$row);
    }
fclose($out);

保存后,我需要在页面上发布如下内容:

while ($row = mysqli_fetch_assoc($result)) {
//embed html code
}

问题在于,每当我运行$ result-> fetch_row()时,数据记录都会丢失。我需要能够在代码中至少运行两次fetch_object并保存数据。我认为克隆将是一个很好的解决方案,但事实并非如此。

除了在sql数据库上执行2次查询外,是否还有其他提示?

3 个答案:

答案 0 :(得分:1)

我相信另一个可行的解决方案是使用mysqli_data_seek

mysqli_result对象是一个指针,每次调用fetch_row()时都会在数据中移动,但是您可以通过调用将指针移回到开头

mysqli_data_seek($result, 0);

现在,结果照原样被“重置”了,您可以再次使用它。

在此处了解更多信息:

https://www.php.net/manual/en/mysqli-result.data-seek.php

答案 1 :(得分:0)

如果需要重复使用数据,请将其加载到数组中-或在同一循环中执行所有逻辑。

例如,

$data = []:
$result = $mysqli->query("...");
while ($row = mysqli_fetch_assoc($result)) {
    $data[] = $row;
}

$out = fopen('tmp/csv.csv', 'w');
foreach ($data as $row) {
    fputcsv($out, $row);
}
fclose($out);

// ...

foreach ($data as $row) {
    //embed html code
}

或者在同一循环中完成所有操作(这可能并不总是可能的,因此,如果不能,请使用上面的选项)。

$result = mysqli_query($db, $sql);

$out = fopen('tmp/csv.csv', 'w');
while ($row = $result->fetch_row()) {
    fputcsv($out,$row);
    // embed HTML

}
fclose($out);

答案 2 :(得分:0)

如果您已将mysqlind作为PHP MySQL基础结构的一部分安装,请使用fetch_all()将所有结果放入一个数组中。然后,您可以根据需要多次使用该数组。

$result = mysqli_query($db,$sql);
$all_results = $result->fetch_all();

$out = fopen('tmp/csv.csv', 'w');

foreach ( $all_results as $row){
    fputcsv($out,$row);
}
fclose($out);

// now to reuse the array for your HTML output
foreach ($all_results as $row) {
    //embed html code
}

然后您可以重复使用$all_results

如果您没有mysqlind,请编写一个简单的循环以使用结果集中的所有结果手动加载数组

$result = mysqli_query($db,$sql);
$all_results = [];
while ($row = $result -> fetch_assoc()) {
    $all_results[] = $row;
}

$out = fopen('tmp/csv.csv', 'w');

foreach ( $all_results as $row){
    fputcsv($out,$row);
}
fclose($out);

// now to reuse the array for your HTML output
foreach ($all_results as $row) {
    //embed html code
}