fputcsv将结果打印到屏幕而不是写入CSV文件

4

我正在尝试使用php将数据库数据导出为.csv文件。在一定长度的数据后,它不会将查询保存到.csv文件中,而是显示在屏幕上。看起来这与查询的记录无关,也似乎与任何特殊字符无关。

$handle = fopen("php://output", "w");
fputcsv($handle, array('Name','Text','Link','Category','Price','Package', 'Date of upload','Date of verification','Date of expiry','Status','Clk'));
for ($c=0; $c<$num_rows; $c++)
{
    $row2[$c][0] = iconv("UTF-8","WINDOWS-1257",html_entity_decode( $row2[$c][0] ,ENT_COMPAT,'utf-8'));
    $row2[$c][1] = iconv("UTF-8","WINDOWS-1257",html_entity_decode( $row2[$c][1] ,ENT_COMPAT,'utf-8'));
    fputcsv($handle, array($row2[$c][0], $row2[$c][1], $row2[$c][2], $row2[$c][3], $row2[$c][4], $row2[$c][5], $row2[$c][6], $row2[$c][7], $row2[$c][8], $row2[$c][9], $row2[$c][10]));
}
fclose($handle);

header('Content-Type: text/csv; utf-8');
header("Content-Disposition: attachment; filename=".$filename);
header("Pragma: no-cache");
header("Expires: 0");

11列,18条记录。有19条记录时就无法正常工作。

我是否错过了某些设置?

3个回答

3

将标题放置在输出之前!


如果要转换为 utf,请使用以下内容:

iconv("WINDOWS-1257", "UTF-8", ...

参数的顺序不正确。

头文件是问题所在。我没有使用 php://stdout,而是使用 php://output。使用 php://stdout 会得到一个空文件。另外,我的 utf 转换有什么问题吗? - erdomester
1
你可以通过设置utf8头将转换为Windows CP-1257。 - hek2mgl
1
使用 php://output 是非常好的,尤其是在处理操作流的函数时。您能详细说明一下,为什么在您看来它没有意义吗? - dev-null-dweller
@dev-null-dweller 我已经承认了这一点(通过删除评论中的那部分内容) - hek2mgl
那现在怎么办?将标题替换到顶部并正确使用iconv后,问题是否仍然存在? - hek2mgl
显示剩余5条评论

2

除了@hex2mgl提供的“在fopen()之前设置标题”的好答案,你还可以使用输出缓冲来防止fputcsv直接打印到屏幕而不是写入文件句柄:

ob_start();
$out = fopen('php://output', 'w');
$csv = ob_get_clean();
fclose($out);

更新:

刚刚发现新的PHP输入/输出php://temp表现更加出色,而且不需要输出缓冲。首先使用内存(最多5MB或您指定的大小),然后如有必要会转换到磁盘上:

$fiveMBs = 5 * 1024 * 1024;
$stream = fopen("php://temp/maxmemory:$fiveMBs", 'r+');

1
这里:
$handle = fopen("php://output", "w");

你正在获取标准输出的句柄(类似于文件)。
猜测你的意思是:
$handle = fopen($filename, "w");

这样我就得到了一个空的 .csv 文件。 - erdomester
如果你想让fputcsv打印到标准输出(stdout),那么你的问题非常误导人。你想让浏览器将它保存为*.csv文件而不是php文件。 - fsw
我正在尝试将数据库数据导出为 .csv 文件。- 这是为什么会误导人呢? - erdomester
"fputcsv将结果打印到屏幕而不是CSV文件中,您希望fputcsv打印出其结果,而不是写入文件,您只想让浏览器将服务器响应保存到文件中而不是显示它,PHP是服务器端语言。" - fsw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接