CodeIgniter连不上MySQL报Access denied,主因是'user'@'host'不匹配或CI3/CI4驱动配置错误:需确认CI版本、严格比对MySQL用户表中的User/Host组合、修正DBDriver(CI4禁用mysql)、并确保hostname与MySQL监听地址一致。

CodeIgniter 连不上 MySQL 并报 Access denied for user,绝大多数情况不是密码错了,而是 CI 配置和 MySQL 权限两头没对上——一边填了 localhost,另一边只开了 root@127.0.0.1;一边写了 mysql 驱动,另一边是 CI4 环境根本不认。找准匹配点,改两处就能通。
先确认你用的是 CI3 还是 CI4
CI3 和 CI4 的数据库配置结构、驱动名、文件路径、加载方式全都不兼容,混用必报错:
- CI3 支持
mysql(已废弃)和mysqli,配置在application/config/database.php,靠$this->load->database()加载 - CI4 必须用
MySQLi或PDO(推荐 PDO),配置在app/Config/Database.php,通过service('database')获取实例 - CI4 若选 PDO,
DSN字段必须手动补全,例如:'mysql:host=localhost;dbname=testdb;charset=utf8mb4' - 改完配置后,务必执行
php spark cache:clear,否则旧缓存会掩盖新设置
检查 CI 配置里的关键字段是否写对
不管 CI3 还是 CI4,以下五项必须字面精确、无空格、无拼写错误:
将 WCAG 2 AA 无障碍标准应用于设计系统、UI 组件和网页——通过可运行的验证器进行对比度计算,采用设计 token 模式使颜色天生可访问,设定排版和焦点状态规则,并提供语义检查清单。适用于构建或审查 UI。
-
hostname:别写127.0.0.1却指望它连上localhost——MySQL 把这两者当不同主机处理;Unix socket(localhost)和 TCP(127.0.0.1)不互通 -
username和password:空密码要写成'',不能写null或留空 -
database:库名必须已存在,且该用户有权限访问 -
DBDriver(CI4)或dbdriver(CI3):CI4 写mysql直接失败,只能填MySQLi或PDO(注意大小写)
验证 MySQL 侧的 'user'@'host' 是否匹配
错误信息里写的 'root'@'localhost' 或 'app'@'192.168.1.100' 就是你要死磕的目标——MySQL 不做模糊匹配,只找完全一致的记录:
- 登录 MySQL 执行:
SELECT User, Host FROM mysql.user WHERE User = 'root';,看输出里有没有和报错一模一样的Host - 如果只有
root@localhost,但你是用mysql -h 127.0.0.1 -u root连的,就必然失败——得补一条root@127.0.0.1 - 远程连接时,
root@'%'无法匹配 IPv6 的::1,需单独加root@'::1' - MySQL 8.0+ 默认用
caching_sha2_password插件,老版 PHP 或 CI 驱动可能不支持,临时切回:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'yourpwd'; FLUSH PRIVILEGES;
排查 MySQL 服务层是否拦住了请求
哪怕账号密码全对,也可能根本连不到鉴权环节:
- 检查
bind-address:若 my.cnf 里是bind-address = 127.0.0.1,远程 TCP 请求会被内核丢弃,MySQL 压根不响应 - 查监听状态:
ss -tlnp | grep :3306,输出中必须含*:3306或具体外网 IP,不能只有127.0.0.1:3306 - 云服务器记得开安全组,放行 3306 入方向;本地防火墙(如 ufw、Windows Defender)也要确认端口开放
- MySQL 日志最准:
tail -n 30 /var/log/mysql/error.log或journalctl -u mysqld -n 30,看有没有 “Host is not allowed” 或 “Access denied” 的原始记录

















