PHP / MYSQL到CSV导出代码打印到屏幕而不是CSV文件

时间:2014-01-28 01:42:25

标签: php mysql csv export-to-csv

我无法让浏览器提示下载。输出显示在屏幕上。我在这个网站上尝试了很多关于这个主题的其他主题,但无济于事。我可以将fopen("php://output","w")更改为fopen("export.csv","w"),但这会在服务器上保存export.csv文件的副本,这是我不想要的。我希望将文件下载到客户端而不将其保存在服务器上。这是我的代码:

$sql = mysql_query($_SESSION["export-query"]);
$fields = mysql_num_fields($sql);
$header = array();

for ($i = 0; $i < $fields; $i++) {
    $header[] = mysql_field_name($sql, $i);
}

$f = fopen("php://output","w"); 
header('Content-Type: text/csv');
header('Content-Disposition: attachment; filename=export.csv');
header('Pragma: public');
header('Expires: 0');
header('Cache-Control: must-revalidate');
fputcsv($f, $header);

while ($row = mysql_fetch_row($sql)) {
    fputcsv($f, $row);
}
fclose($f);

请帮忙!非常感谢。

2 个答案:

答案 0 :(得分:0)

你的代码非常接近我,但我有这个

header("Content-type: application/vnd.ms-excel");

表示内容类型。我认为这是有效的,因为浏览器知道如何处理text / csv,但他们不知道如何处理excel。它会提示下载,因为它本身不会打开这种类型的文件。

我也没有“必须重新验证”,但我认为这不会有所作为。

编辑:

这是我的完整标题,它已经100%的时间工作。与你的不同之处,可能其中一个就是原因。

    header("Content-type: application/vnd.ms-excel");
    header("Content-disposition: attachment; filename=".$filename.".csv");
    header("Pragma: no-cache");
    header("Expires: 0");

编辑2:

从您对答案的评论来判断,您将所有这些代码作为一个ajax调用放在div中。不起作用的原因是您只能在初始调用页面时设置标题。在ajax调用上设置标头将被忽略。

以下是我的系统如何处理csv生成。因为我需要在不同的csv文件之间有所不同的特定信息,所以我将生成器文件的名称放入表单的“action”中并提供了一个提交按钮:

<form action="thegeneratorpage.php" method="get"><fieldset>
     <p>Download [...] in .csv (Excel) form.  You can narrow by [...].</p>
     <!-- code here that allows users to narrow down what is in the csv -->
     <input type="submit" value="Download" />
</fieldset></form>

如果信息不变,您可以这样做:

<a href="thegeneratorpage.php">Download CSV</a>

我们讨论的所有代码都在thegeneratorpage.php

答案 1 :(得分:-1)

我建议只使用fputcsv函数回复CSV文件的行(请注意我使用的标题与您的标题略有不同):

header("Pragma: public");
header("Expires: 0");
header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
header("Cache-Control: private",false);
header("Content-Type: application/octet-stream");
header("Content-Disposition: attachment; filename={$fileName}");
header("Content-Transfer-Encoding: binary");
while ($row = mysql_fetch_row($sql)) {
    // optionally enclose data if necessary
    foreach ($row as $k => $v) {
        if (strpos($v, ',') !== false) {
            $row[$k] = '"' . $v . '"';
        }
    }
    echo implode(',', array_values($row));
}