这段代码几乎解决了我通过.csv
将查询保存到php
的问题 - 但我无法理解为什么当它提示我保存为export.csv
时,该文件会打开空白,而file.csv
与我需要的数据同时完美保存。我确信它的标题显而易见。有人可以帮忙吗?
***编辑下面的建议让我进入这个状态,它不再保存文件并提示空白,但现在正确的文件显示HTML垃圾。这个脚本中没有其他HTML - 我已经尝试过许多其他帖子的建议。我怎么解决?
$query = "SELECT * from Table";
$result = mysqli_query($connS, $query);
$headers = $result->fetch_fields();
foreach($headers as $header) {
$head[] = $header->name;
}
$fp = fopen('php://output', 'w');
header('Content-Disposition: attachment; filename="export.csv"');
header('Content-Description: File Transfer');
header('Content-Type: text/csv');
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
fputcsv($fp, array_values($head));
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
$fp = fopen('file.csv', 'w');
readfile($fp);
fclose($fp);
end();
答案 0 :(得分:0)
您目前只将内容保存到文件,而不是将其发送到用户的浏览器。也许在readfile
声明之前尝试添加对die
的调用。
所以你的最后一行看起来像这样:
while ($row = $result->fetch_array(MYSQLI_NUM)) {
fputcsv($fp, array_values($row));
}
readfile($fp);
die;
}
Readfile读取文件并将其写入输出缓冲区。您可以在readfile
函数here找到更多信息。
请注意您当前正在进行此操作的方式(在用户可以下载之前保存到文件中),如果两个用户同时点击该页面,他们可能会踩到彼此。脚趾(并创建两个创建的CSV的奇数混合)。您可能只想使用接受的答案中的代码来尝试outputting the CSV contents directly to the user's browser。如果您在标题之后执行此操作,则应该导致浏览器将其视为要下载的文件。