You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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-001970-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

火山引擎 最新活动