fputcsv在CSV文件中不写入任何数据

3
在我的网站上,我正在从mysql数据创建一个表格,现在我想在表格底部添加一个导出按钮,以便用户可以将数据下载为CSV文件。为了实现这一点,我编写了一个虚拟表单:
<form action="<?=$_SERVER['PHP_SELF'];?>" method="post">
    <input type="submit" name="submit" value="Click Me">
</form>

在php文件的顶部我有:

if(isset($_POST['submit'])) {
    export();
}

在我的导出函数中,有一些关于mysql的东西。我正在创建一个数组并将数据推入它中,然后:
$header = array('name', 'date', 'total', 'success', 'opens', 'clicks', 'success_rate', 'open_rate', 'CTO', 'CTR')
$fp = fopen('exportme2.csv', 'w');
fputcsv($fp, $header);

foreach ($data as $lines) {
        fputcsv($fp, $lines);
}
fclose($fp);

当我点击导出按钮后,我会得到一个exportme2.csv文件,但是它是空的!数据可能有误,因此可能什么都不会显示,但至少应该有标题名称。

您能帮我解决这个问题吗?

谢谢。


数据文件中是否存在标题行,还是整个文件都为空? - Mike Brant
你有检查过fputcsv的返回值吗? - jeroen
你检查过文件是否已经打开了吗?如果失败,$fp将是布尔值false。 - Marc B
所有文件都是空的,我没有刷新页面,而是重新进入了页面,现在我有了标题。但是没有数据 :/ - CanCeylan
3个回答

2

首先,更改

$fp = fopen('exportme2.csv', 'w');

to

$fp = fopen('exportme2.csv', 'a');

当使用'w'时,文件将被截断,而使用'a'则会创建或追加文件。

然后您应该使用flock()来确保两个不同的用户(线程)不会同时写入文件:

if (!flock($fp, LOCK_EX)) {
    error_log('Cannot get lock!');
} else {
    fputcsv($fp, $header);

    foreach ($data as $lines) {
        fputcsv($fp, $lines);
    }
}

如果这不起作用,那么你的代码中有一个笔误,对我来说并不明显。

1

这对我来说运行良好:

$header = array('name', 'date', 'total', 'success', 'opens', 'clicks', 'success_rate', 'open_rate', 'CTO', 'CTR');
$fp = fopen('exportme2.csv', 'w');
fputcsv($fp, $header);

/*foreach ($data as $lines) {
    fputcsv($fp, $lines);
}*/
fclose($fp);

你上面的脚本在fclose之前停止了,所以它会影响你的文件... 你应该启用E_ALL E_STRICT进行开发!


0

它没有发布任何内容,因为它提交了页面,所以当页面刷新时,我的所有数组都变为空。


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