codeigniter 4 通过模型的 $usetimestamps = true 及 createdfield、updatedfield 配置可自动写入 created_at 和 updated_at 字段,无需手动干预;需确保字段存在、类型匹配(如 datetime)且不在验证规则中设为 required。

CodeIgniter 的 created_at 和 updated_at 字段怎么自动写入
CodeIgniter 本身不内置自动时间戳填充(如 Laravel 的 $fillable + timestamps),必须手动干预。常见做法是在模型的 insert() 和 update() 方法中注入时间值,或在控制器层统一处理。
推荐在模型基类(如 MY_Model)中统一控制,避免每个模型重复写逻辑:
- 检查字段是否存在:
if ($this->has_field('created_at')) { $data['created_at'] = date('Y-m-d H:i:s'); } - 对
update()操作,只覆盖updated_at:if ($this->has_field('updated_at')) { $data['updated_at'] = date('Y-m-d H:i:s'); } - 注意:不要在插入时也设
updated_at,否则语义错乱;两者应独立赋值
用 set_value() 填充表单时,时间字段显示为空怎么办
set_value() 只对 POST 数据有效,而时间字段(如 created_at)通常由数据库或 PHP 自动生成,不会出现在用户提交的 POST 中 —— 所以它永远拿不到值,直接显示为空是正常现象。
解决方法不是依赖 set_value(),而是分场景处理:
- 新增表单:留空或预设
date('Y-m-d H:i:s'),用form_input('created_at', date('Y-m-d H:i:s')) - 编辑表单:从数据库查出原值,传入视图:
form_input('created_at', $row->created_at) - 若字段设为
NOT NULL DEFAULT CURRENT_TIMESTAMP,PHP 层可完全不传该字段,让 MySQL 自行填充
MySQL 的 CURRENT_TIMESTAMP 和 PHP date() 时间不一致怎么调
典型表现是数据库里存的是 UTC,而 PHP 输出的是本地时区(如 Asia/Shanghai),导致前后端看到的时间差 8 小时。
关键不是“选哪个”,而是保持全程一致:
- 确认 MySQL 时区:
SELECT @@global.time_zone, @@session.time_zone;,建议设为+08:00或'SYSTEM'并确保系统时区正确 - PHP 中统一用
date_default_timezone_set('Asia/Shanghai'),且必须在加载 CodeIgniter 前执行(例如放在index.php顶部) - 避免混用:
NOW()(MySQL 函数)和date()(PHP 函数)不能交叉假设时区,选一边到底
自动填充 item_number 这类自增编号字段要小心主键冲突
业务上常见的“按上一条记录 +1”逻辑(比如商品编号 ITEM-000101),绝不能靠 MAX(id)+1 直接查写,高并发下必然重复。
稳妥做法只有两种:
- 用数据库自增主键(
id)生成编号,例如:'ITEM-' . str_pad($insert_id, 6, '0', STR_PAD_LEFT),前提是插入后能立刻拿到$this->db->insert_id() - 用唯一约束 + 重试机制:先生成编号,
INSERT,捕获1062 Duplicate entry错误,再重试生成新编号(适合低频场景) - 绝对不要在事务外查
MAX(item_number)再加一 —— 这是典型的竞态漏洞,线上出过事故
strtotime($row->created_at) 却没校验 $row->created_at 是否为空或非法格式,一出错就崩掉整个列表页。填之前先 !empty() + strtotime() !== false 多包一层,比事后 debug 强十倍。











