You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP使用带时间的date格式生成CSV文件名时fopen报错

问题产生原因

报错由两个直接原因导致:

  1. 文件名包含Windows系统非法字符:Windows强制规定半角冒号:、/、*、?等字符不能出现在文件名中,冒号会被系统识别为盘符类的路径分隔标记。你用date("Y-m-d H:i:s")生成的时间串带12:51:28这类冒号,系统不会把它当文件名的一部分,反而会解析成不存在的嵌套路径,所以fopen会报“找不到文件或目录”的警告。之前只用date("Y-m-d")时文件名没有特殊字符,符合命名规则,所以能正常运行。
  2. 缺少必要的错误判断:fopen打开文件失败时会返回false,不是合法的文件资源。你的代码没校验这个返回值,直接把false传给要求资源类型参数的fputcsv,就触发了后面的类型致命错误。
修复方法

调整两处代码即可解决问题:

  • 把时间格式里的冒号换成系统允许的字符,比如下划线、短横杠,推荐用Y-m-d_H-i-s格式,生成的文件名类似csv_2022-06-23_12-51-28.csv,完全符合命名规范。
  • 给fopen加返回值校验,打开失败就中断后续逻辑,避免触发致命错误,也方便排查权限、路径类问题。

修复后的可运行代码:

public function exportCSV()
{
    try {
        $this->db_table = $this->get_data_from_query('SELECT * FROM klassenraeume  ORDER BY id asc');

        if($this->db_table->num_rows > 0)
        {
            $folder = "exportiert/";
            // 替换时间格式,移除非法冒号字符
            $exported_file = $folder."csv_".date("Y-m-d_H-i-s").".csv";
            $file_creater = fopen($exported_file, 'w');
            
            // 校验文件是否创建成功
            if (!$file_creater) {
                throw new Exception("文件创建失败,请检查exportiert目录的读写权限");
            }

            foreach ($this->db_table as $data)
            {
                fputcsv($file_creater, $data);
            }

            fclose($file_creater);
            echo "<p style='-webkit-text-fill-color: #26f308; font-size: 2em; '>Daten erfolgreich exportiert!</p>";
        }
    }
    catch (Exception $e)
    {
        echo "Error: " . $e->getMessage();
    }
}

额外说明:原代码里写完文件后调用fseek($file_creater, '0')没有实际作用,写入完成后直接用fclose关闭文件句柄即可。


内容的提问来源于stack exchange,提问作者Elly_G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 23:57:14