2

我以前见过这个问题,在尝试了多种解决方案后我无法让它正常工作。问题是我无法将数据正确导出为 csv 格式。在我添加我的 ob_end_clean 之前,它会导出到带有 html 的 csv,现在它没有给我一个 csv,只是文本。

这是我在所需文件上的代码。

if (isset($_POST["hidden"])) {

$list = array (
    array('aaa', 'bbb', 'ccc', 'dddd'),
    array('123', '456', '789'),
    array('"aaa"', '"bbb"')
);

    $fp = fopen('php://output','w');

    foreach ($list as $row) {
        ob_end_clean();
        fputcsv($fp, $row);
    }

    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename=data.csv');

}

现在,当我进行导出时,数据会以类似于 var_dump() 的方式重新显示在屏幕上。我只是想让它转到一个 csv 文件,而不是整个 html。

4

3 回答 3

22

得到它的工作!

我在页面上的任何内容之前调用了我的 csv 代码。:) 然后我连接到我的桌子,然后为我的代码做了我的逻辑。我的主文件上没有 ob_start 或 ob_flush ,这有很大的不同。我在while循环之前有ob_clean,然后在声明标题后我做了一个exit()。希望这能很好地解释它。

这是我的代码。

if (isset($_POST["hidden"])) {
    $sql = "SELECT * FROM `newsletter`";
    $result = mysql_query($sql);

    ob_end_clean();

    $fp = fopen('php://output','w');

    while ($list = mysql_fetch_assoc($result)) {
        fputcsv($fp, $list);
    }

    header('Content-Type: text/csv; charset=utf-8');
    header('Content-Disposition: attachment; filename=data.csv');

    exit();
}
于 2012-11-09T22:16:18.507 回答
3

地点,ob_end_clean(); 在输出 csv 之前。

ob_end_clean() 含义:“清理(擦除)输出缓冲区并关闭输出缓冲” - PHP 手册。

于 2017-03-16T18:10:02.750 回答
2

它工作的逻辑是构建您的 php 脚本,以便它:

  1. 首先回显所有用于浏览器页面的 html/javascript... 内容echo "<html...>;"(这已经在幕后使用了 php 的输出缓冲区)
  2. 之后,到目前为止清理了 php 的输出缓冲区,使用ob_end_clean()(取决于 ob_start() 的调用方式,这可能会阻止先前的导出)或者ob_clean()只是将内容发送到浏览器并清理缓冲区而不将其关闭。
  3. 最后再次使用这个干净的输出缓冲区将任何进一步的内容(在我们的例子中作为可下载的 csv)导出到浏览器,如 wowzuzz 所示。因此,如果此后脚本回显了任何 html,它也将包含在 csv 中。
于 2017-05-03T07:43:21.180 回答