【问题标题】:Export CSV from Mysql从 Mysql 导出 CSV
【发布时间】:2011-06-04 04:32:09
【问题描述】:

我在导出使用 php 从我的一个 mysql 表创建的 csv 文件时遇到了一些问题。

我使用的代码打印了正确的数据,但我看不到如何在 csv 文件中下载这些数据,并提供了指向所创建文件的下载链接。我认为浏览器应该自动提供文件以供下载,但事实并非如此。 (会不会是因为下面的代码是用ajax调用的?)

非常感谢任何帮助 - 下面的代码,S.

include('../cofig/config.php');    //db connection settings
$query = "SELECT * FROM isregistered";
$export = mysql_query($query) or die("Sql error : " . mysql_error());
$fields = mysql_num_fields($export);
for ($i = 0; $i < $fields; $i++) {
    $header .= mysql_field_name($export, $i) . "\t";
}
while ($row = mysql_fetch_row($export)) {
    $line = '';
    foreach ($row as $value) {
        if ((!isset($value) ) || ( $value == "" )) {
            $value = "\t";
        } else {
            $value = str_replace('"', '""', $value);
            $value = '"' . $value . '"' . "\t";
        }
        $line .= $value;
    }
    $data .= trim($line) . "\n";
}
$data = str_replace("\r", "", $data);

if ($data == "") {
    $data = "\n(0) Records Found!\n";
}
//header("Content-type: application/octet-stream"); //have tried all of these at sometime
//header("Content-type: text/x-csv");
header("Content-type: text/csv");
//header("Content-type: application/csv");
header("Content-Disposition: attachment; filename=export.csv");
//header("Content-Disposition: attachment; filename=export.xls");
header("Pragma: no-cache");
header("Expires: 0");

echo '<a href="">Download Exported Data</a>'; //want my link to go in here...

print "$header\n$data";

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    本质上,您无法一次性输出 CSV 文件及其链接。 (您需要引入页面“模式”的概念并通过 ...pagename.php?mode=download 或类似的方式激活下载模式。然后您可以使用 PHP 的 switch 语句打开 $_GET['mode']在你的脚本中。)

    也就是说,您使用的 text/csv 内容类型标头是正确的,尽管您可能还想输出 Content-Length 和 Content-Disposition 标头。输出文件数据后,还要确保通过 PHP 的 exit 函数停止任何额外的脚本处理。

    此外,使用 MySQL SELECT ... INTO OUTFILE 工具(如果您有权限)而不是使用 PHP 来收集数据可能会少很多麻烦(并且肯定会更快/内存效率更高)。

    【讨论】:

      【解决方案2】:

      您不能在同一页面上同时拥有文本和下载内容。您需要有一个指向下载区域的链接,这可能只是一个通向一个函数的 GET 参数,然后该函数会执行所有处理、显示标题并回显 CSV 的内容。

      例如,您可以拥有&lt;a href="foo.php?action=download"&gt;Click here to download CSV&lt;/a&gt;,然后在您的代码中拥有if ($_GET['action'] === 'download'),从数据库中获取数据,对其进行格式化,发送标题,然后回显数据。然后die(),因为这部分脚本不能再完成了。

      【讨论】:

        【解决方案3】:

        您不应将链接放在生成 csv 的同一文件中,因为该链接不会在 csv 本身中!

        执行以下操作:

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

        它应该可以工作

        【讨论】:

        • 然后使用正确的内容类型:application/vnd.ms-excel 和 .xls 文件。
        • @Andrew Sledge:你为什么要使用这种内容类型?如果我没有安装 Office,会发生什么? text/csv 是他应该使用的。
        • 我认为 Andrew Sledge 是在说,对于 xls 文件的注释行,请使用正确的类型。
        【解决方案4】:

        需要考虑的三件事:

        1. 您发送的标头表明用户将下载 CSV 文件,但随后您发送了创建链接来下载它?这是不正确的,您应该链接到此页面,然后仅在标题之后输出 CSV 数据本身。

        2. MySQL 具有生成 CSV 输出的能力,您绝对应该利用这一点,而不是自己尝试。您可以使用SELECT INTO ... OUTFILE 来执行此操作。

        3. 如果您必须使用 PHP 创建 CSV,请使用fputcsv 执行此操作。这将处理 CSV 的所有复杂性,例如转义和正确格式化。由于fputcsv 写入文件,您可以将其写入临时文件,然后在发送标头后将其输出,或者使用以下技巧直接输出:

        在发送标头后执行此操作:

        $fp = fopen('php://output', 'w');
        while( $row = mysql_fetch_row( $export ) ) {
            fputcsv($fp, $row);
        }
        

        【讨论】:

          【解决方案5】:

          我认为 mySQL => CSV 是每个 PHP 论坛的常见问题。 我尝试以通用方式解决此问题并实施免费导出 PHP 的 lib,与 Google AppInventor 的理念非常相似。 拖放并隐藏编码的东西。

          使用该库并通过 Click&Point 创建您的导出。

          常见演示:http://www.freegroup.de/software/phpBlocks/demo.html 编辑链接:http://www.freegroup.de/test/editor/editor.php?xml=demo_sql.xml

          值得一看

          问候

          安德烈亚斯

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2010-10-12
            • 1970-01-01
            • 1970-01-01
            • 2011-10-09
            • 2015-06-01
            • 2017-02-12
            • 1970-01-01
            相关资源
            最近更新 更多