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

CodeIgniter4+MySQL日期格式转换插入数据库报错求助

解决DateTime::createFromFormat传null的报错问题

问题根源

你的代码存在两个核心问题:

  1. 未从当前循环行获取日期值:循环内使用的$date变量没有关联到$row中的日期数据,导致传入DateTime::createFromFormat的参数为null,触发了PHP 8.0+的弃用警告。
  2. 未处理转换失败场景:即使日期值存在,若格式不匹配,createFromFormat会返回false,后续调用format会直接抛出错误。

解决方案

修改代码,确保从当前行获取日期、添加空值校验和转换结果检查:

foreach($worksheet_arr as $row){
    // 从当前行获取原始日期,根据实际列索引调整(示例为$row[2])
    $originalDate = $row[2] ?? null;
    $formattedDate = null;
    
    if ($originalDate) {
        // 去除日期字符串前后空格,避免格式匹配失败
        $trimmedDate = trim($originalDate);
        $newDate = DateTime::createFromFormat("m/d/Y", $trimmedDate);
        
        // 验证转换是否成功
        if ($newDate instanceof DateTime) {
            $formattedDate = $newDate->format("Y-m-d");
        } else {
            // 记录无效日期日志,方便排查数据问题
            log_message('warning', "无法转换的日期格式:{$trimmedDate}");
        }
    }
    
    // 执行插入,formattedDate为null时需确保DATE字段允许空值
    $this->db->query("INSERT IGNORE INTO efakturheaderone (BRANCH, REFERENCE, DATE) VALUES (?, ?, ?)", [$row[0], $row[1], $formattedDate]);
}

关键说明

  • 正确获取日期:必须从循环的$row中提取对应列的日期值,替换示例中的$row[2]为你实际的日期列索引。
  • 空值与格式校验:用?? null处理可能的未定义列,再通过instanceof DateTime验证转换结果,避免后续调用format报错。
  • 日志记录:转换失败时记录警告日志,便于定位不符合格式的原始数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 22:02:07