ci4数据库连接失败主因是$db['default']['hostname']配错、$active_group指向不存在组或dbdriver误写为mysql(已弃用),占80%以上;须确认ci3/ci4版本差异,ci4必须用mysqli或pdo驱动并正确配置dsn,且修改后需执行php spark cache:clear清缓存。

$db['default']['hostname'] 配错、$active_group 指向不存在的组、或 dbdriver 写成 mysql(CI4 已弃用)——这三类问题占连不上 MySQL 的 80% 以上。直接改对配置,基本就能通。
确认你用的是 CI3 还是 CI4
两者数据库配置差异极大,混用必报错:
• CI3 仍支持 mysql 驱动,但仅限旧版 PHP(≤5.6),且不支持原生 prepared statement;
• CI4 必须用 mysqli 或 pdo(推荐 pdo,兼容性更好,支持命名参数);
• CI4 的配置文件路径是 app/Config/Database.php,不是 application/config/database.php;
• CI3 中加载数据库靠 $this->load->database(),CI4 是自动注入或通过 service('database') 获取实例。
CI3:检查 application/config/database.php 的关键字段
以下五项必须准确无误,缺一不可:
• $db['default']['hostname'] 值为 IP 或域名(别写 127.0.0.1 却在 MySQL 绑定里只监听 localhost,Unix socket 和 TCP 是两回事);
• $db['default']['username'] 和 $db['default']['password'] 要与 MySQL 实际账号一致(注意空密码不是 null,得是空字符串 "");
• $db['default']['database'] 必须是已创建且权限授予该用户的库名;
• $db['default']['dbdriver'] 在 CI3 中可填 mysql 或 mysqli,但强烈建议用 mysqli(PHP 7+ 已移除 mysql_* 函数);
• $active_group = 'default'; 这行不能注释掉,也不能拼错成 'defalut' 这类低级错误。
CI4:改 app/Config/Database.php 并验证 PDO DSN
CI4 使用类配置,重点看 public $default 属性:
• 'DBDriver' 设为 'MySQLi' 或 'PDO'(大小写敏感);
• 'hostname'、'username'、'password'、'database' 同 CI3;
• 若用 PDO,务必补全 'DSN' 字段,例如:'mysql:host=localhost;dbname=your_db;charset=utf8mb4';
• 'DBDebug' 设为 true 可暴露连接失败的具体原因(如“Access denied for user”或“Connection refused”);
• 修改后清缓存:php spark cache:clear,否则配置可能不生效。
连上但查不出数据?先跑个最简诊断
不要急着写 Model,用控制器快速验证底层通不通:
• CI3 中写:var_dump($this->db->query("SELECT 1")->row());;
• CI4 中写:var_dump(db()->query("SELECT 1")->getRow());;
• 如果返回 NULL 或报错,说明连接成功但权限/字符集/SQL mode 有坑;
• 常见隐形坑:char_set 设成 utf8(CI3)或 charset 设成 utf8(CI4)会导致某些中文插入失败,必须用 utf8mb4;
• MySQL 8.0+ 默认认证插件是 caching_sha2_password,PHP 7.4+ 才原生支持,旧版本需在 MySQL 里执行:ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass';
'user'@'127.0.0.1' ≠ 'user'@'localhost')、或 SELinux / 防火墙拦了 3306 端口——这些比框架配置更难一眼发现。











