CodeIgniter4+MySQL日期格式转换插入数据库报错求助
解决DateTime::createFromFormat传null的报错问题
问题根源
你的代码存在两个核心问题:
- 未从当前循环行获取日期值:循环内使用的
$date变量没有关联到$row中的日期数据,导致传入DateTime::createFromFormat的参数为null,触发了PHP 8.0+的弃用警告。 - 未处理转换失败场景:即使日期值存在,若格式不匹配,
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
相关产品推荐
相关产品推荐

