【问题标题】:fputcsv doesn't write any data in a CSV filefputcsv 不会在 CSV 文件中写入任何数据
【发布时间】:2012-07-17 23:06:59
【问题描述】:

在我的网站中,我正在从 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 文件,但是它是空的! 数据可能是错误的,所以不会有任何东西,但至少我应该有标题名称。

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

谢谢。

【问题讨论】:

  • 数据文件中是否存在标题行,还是整个文件为空?
  • 你检查fputcsv的返回值了吗?
  • 您检查文件是否已打开? $fp 在失败时将是布尔值 false。
  • 所有文件都是空的,我没有刷新页面,而是再次进入页面,现在我有了标题。但也没有数据:/

标签: php csv fputcsv


【解决方案1】:

首先,改变

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

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

如果这不能解决问题,那么您的代码中有错字,这对我来说并不明显。

【讨论】:

    【解决方案2】:

    这对我来说很好:

    $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 的情况下进行开发!

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多