从Mysql导出CSV

时间:2011-01-05 17:48:00

标签: php mysql

我在导出使用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";

5 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

你不应该把链接放在生成csv的同一个文件中,因为链接不在csv本身!

做类似的事情:

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

它应该有效

答案 2 :(得分:0)

您无法在同一页面上显示文字和下载内容。您需要有一个指向下载区域的链接,该链接可能只是一个导致函数的GET参数,然后执行所有处理,显示标题并回显CSV的内容。

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

答案 3 :(得分:0)

要考虑三件事:

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

  2. MySQL能够生成CSV输出,你绝对应该利用这一点而不是试图自己做。您可以使用SELECT INTO ... OUTFILE执行此操作。

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

  4. 发送标题后执行此操作:

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

答案 4 :(得分:0)

我认为mySQL =&gt; CSV是常见问题,是每个PHP论坛的一部分。 我试图以一种常见的方式解决这个问题并实现免费导出 用于PHP的lib与Google AppInventor哲学非常相似。 DragDrop并隐藏编码内容。

使用lib并通过Click&amp; Point创建导出。

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

值得一看

问候

安德烈亚斯