database error需分三层排查:一查连接是否建立,用mysql命令行直连或var_dump($this->db->conn_id);二验ci3配置是否加载,检查database.php输出及mysqli扩展;三盯操作失败细节,核对字符集、sql模式、字段约束与ci3语法。

遇到“Database Error”提示,核心不是掩盖错误,而是快速定位到底是连不上、连上了但操作失败,还是配置根本没生效。下面分三类情况直接给可操作的排查路径。
一看连接是否建立成功
别只盯着页面报错——先确认数据库服务本身通不通:
- 用命令行直连测试:
mysql -u用户名 -p -h127.0.0.1 数据库名,能进说明服务和账号没问题 - 在控制器里加两行调试代码:
$this->load->database();<br>var_dump($this->db->conn_id);
返回 bool(false) 就是连接失败,不用往下查插入逻辑 - 检查
application/config/database.php中的hostname:本地开发尽量写'127.0.0.1'而非'localhost',避免 Unix socket 路径不一致问题
二查配置是否真正加载
CI3 加载数据库前就可能出错,错误信息根本不会走到你的控制器。所以要验证配置是否被读取:
- 在
database.php文件末尾加:echo '<pre class="brush:php;toolbar:false;">'; print_r($db['default']); die();</pre>
刷新页面,看输出的数组里 hostname、username、database 是否是你填的值 - 确认
db_debug设为TRUE,否则错误会被静默吞掉 - 检查 PHP 是否启用了 mysqli 扩展:
php -m | grep mysqli(Linux/macOS)或php --ini看实际加载的 php.ini 路径,再确认里面extension=mysqli没被注释
三盯住“连上了却写不进”的细节
如果 conn_id 是资源对象,但新增/更新失败,重点看这几项:
- 字符集不匹配:MySQL 5.7+ 默认用
utf8mb4,CI3 配置中要显式写:'char_set' => 'utf8mb4',<br>'dbcollat' => 'utf8mb4_unicode_ci'
- SQL 模式太严格:执行
SELECT @@sql_mode;,若含STRICT_TRANS_TABLES,可在数据库配置中临时加'stricton' => FALSE(仅用于验证) - 字段约束冲突:比如 datetime 字段设了
NOT NULL,但你传了空字符串或 null;或者主键重复、唯一索引冲突 - CI3 语法陷阱:新增必须用
$this->db->insert()或$this->db->set()->insert(),混用原生query()且没做escape()容易被过滤
错误提示本身只是入口,关键在分清层级:连不上 → 查网络、权限、扩展;连得上但报错 → 看 SQL 日志、字符集、表结构;连得上也没报错但没数据 → 用 $this->db->last_query() 把实际执行的 SQL 打出来,贴到 MySQL 客户端里手动跑一遍。











