如何在MySQL中存储NULL日期?解决CodeIgniter日期选择器存默认值问题
解决未选择日期时存储NULL而非1970-01-01的问题
你的问题出在代码逻辑顺序错误,以及对strtotime处理空值的行为不了解。让我一步步帮你修正:
问题根源分析
当用户未选择日期时,$userInfo['ac_date_of_birth']是空字符串。你先执行了strtotime(''),这个函数会返回false,接着date('Y-m-d', false)会把false当作时间戳0处理,生成1970-01-01。虽然你后面判断为空时把变量设为NULL,但空字符串的判断逻辑不够严谨(比如DatePicker可能返回空格而非纯空),导致最终还是存储了错误的默认日期。
修正后的CodeIgniter代码
调整逻辑顺序,先判断输入是否为空,再处理日期转换,同时用更可靠的方式处理dd/mm/yyyy格式的转换:
$userInfo = $this->input->post(); $ac_date_of_birth = NULL; // 默认设为NULL // 仅当输入不为空且格式有效时,才进行转换 $raw_date = trim($userInfo['ac_date_of_birth'] ?? ''); if (!empty($raw_date)) { // 用DateTime类处理格式转换,比strtotime更可靠(避免dd/mm/yyyy被误判为mm/dd/yyyy) $date_obj = DateTime::createFromFormat('d/m/Y', $raw_date); if ($date_obj) { $ac_date_of_birth = $date_obj->format('Y-m-d'); } // 也可以用字符串拆分的方式: // $date_parts = explode('/', $raw_date); // if (count($date_parts) === 3) { // $ac_date_of_birth = "{$date_parts[2]}-{$date_parts[1]}-{$date_parts[0]}"; // } } // 后续存入数据库的操作 // $this->db->set('ac_date_of_birth', $ac_date_of_birth); // ...
额外注意事项
- 数据库字段配置:确保MySQL中
ac_date_of_birth字段设置为DATE NULL(允许NULL值),否则即使PHP传递NULL,数据库可能会自动转为0000-00-00或1970-01-01。 - 前端优化:给DatePicker添加清空按钮,方便用户明确清除选择,确保未选择时输入框为空:
$('#ac_date_of_birth').datepicker({ uiLibrary: 'bootstrap4', format:'dd/mm/yyyy', clearButton: true, // 显示清空按钮 onClear: function() { $(this).val(''); // 清空输入框值 } }); - 输入验证:在CodeIgniter中添加表单验证,过滤无效日期格式:
$this->form_validation->set_rules( 'ac_date_of_birth', 'Date of Birth', 'trim|regex_match[/^\d{2}\/\d{2}\/\d{4}$/]|callback_validate_date' ); // 自定义日期验证回调 function validate_date($date) { $date_obj = DateTime::createFromFormat('d/m/Y', $date); return $date_obj && $date_obj->format('d/m/Y') === $date; }
这样修改后,当用户未选择日期时,$ac_date_of_birth会保持为NULL,存入数据库时就会正确存储NULL值了。
内容的提问来源于stack exchange,提问作者Shareque




