2011-01-05 95 views
0

我在导出使用php从我的一个mysql表创建的csv文件时遇到了一些麻烦。从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"; 

回答

0

你不能有文本和在同一页面上下载。你需要有一个到下载区域的链接,这个链接可能只是一个GET参数,通过它可以完成所有的处理,显示标题并回显CSV的内容。

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

+0

非常感谢大家的帮助 - 非常感谢。 – ss888 2011-01-06 10:49:19

0

你不应该把链接在生成CSV相同的文件,因为链接不会在csv本身!

做这样的事情:

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

,它应该工作

+0

然后用正确的内容类型:application/vnd.ms-Excel的使用.xls文件。 – 2011-01-05 17:52:44

+0

@Andrew Sledge:你为什么要使用这种内容类型?如果我没有安装Office,会发生什么情况? 'text/csv'是他应该使用的。 – nico 2011-01-05 17:54:39

+0

我认为Andrew Sledge说过,对于有关xls文件的注释行,请使用正确的类型。 – Andrew 2011-01-06 14:03:12

1

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

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

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

0

三件事情要考虑:

  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); 
} 
0

我认为mySQL => CSV是每个PHP论坛的一部分的常见问题。 我试图用一种常见的方式解决这个问题,并为PHP实现了一个免费的导出 lib,它非常类似于Google AppInventor哲学。 DragDrop并隐藏编码的东西。

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

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

值得一看

问候

安德烈亚斯