我在导出使用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";
答案 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)
要考虑三件事:
您正在发送标题,表明用户将要下载CSV文件,但是您发送了创建链接以下载它?这是不正确的,您应该链接到此页面,然后仅在标题后输出CSV数据。
MySQL能够生成CSV输出,你绝对应该利用这一点而不是试图自己做。您可以使用SELECT INTO ... OUTFILE执行此操作。
如果您必须使用PHP创建CSV,请使用fputcsv
来执行此操作。这将处理CSV的所有复杂性,例如转义和正确格式化。由于fputcsv
写入文件,您可以将其写入临时文件,然后在发送标题后输出,或使用以下技巧直接输出:
发送标题后执行此操作:
$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
值得一看
问候
安德烈亚斯