codeigniter连接云数据库失败,首要排查环境、配置、权限三者是否对齐:先用裸连test_db.php验证基础连通性(hostname用127.0.0.1、确认mysqli扩展启用),再核对云平台白名单、用户前缀、ssl等特殊规则,接着检查ci配置文件是否生效及mysql 8.0认证兼容性,最后确认用户权限、字符集与sql模式匹配。

CodeIgniter连接云服务器数据库失败,多数情况不是代码写错了,而是环境、配置、权限三者没对齐。别急着改database.php或.env,先确认底层能不能通。
第一步:用裸连测试验证基础连通性
写一个独立的test_db.php文件,放在能被Web访问的目录下(比如public/),内容如下:
<?php <br> $conn = mysqli_connect("127.0.0.1", "your_user", "your_pass", "your_db");<br> if (!$conn) {<br> die("连接失败: " . mysqli_connect_error());<br> }<br> echo "连接成功!";<br> mysqli_close($conn);<br>?>
重点注意三点:
- hostname务必用
127.0.0.1,不用localhost——云服务器上localhost常走 Unix socket,而 PHP 可能找不到 socket 文件路径,直接报错(HY000/2002): No such file or directory - 账号密码必须是云服务器数据库实际创建的凭证,不是本地开发用的那一套
- 运行前确认 PHP 已启用
mysqli扩展:php -m | grep -i mysqli(Linux/macOS)或php --ini查真实加载的php.ini路径,再检查其中extension=mysqli是否启用
第二步:核对云服务商的特殊规则
不同云平台有各自的命名和授权限制,常见坑点:
-
Namecheap共享主机:数据库名和用户名都强制带 cPanel 用户名前缀,比如你登录账号是
abc123,那实际数据库名是abc123_myapp,用户是abc123_myuser;只建库建用户不行,必须进 cPanel →「MySQL Databases」→「Add User To Database」手动绑定并勾选SELECT, INSERT, UPDATE, DELETE权限 -
阿里云RDS / 腾讯云CDB:默认禁止外网访问,需在控制台开通白名单——把你的服务器公网IP或
0.0.0.0/0(仅测试用)加到安全组或IP白名单中;同时确认RDS实例的“网络类型”是VPC内网还是支持公网,公网地址通常形如xxx.mysql.rds.aliyuncs.com:3306,不能填localhost -
AWS RDS:检查安全组入站规则是否开放了3306端口,且源IP范围包含你的应用服务器;另外确认RDS参数组中
require_secure_transport是否为0,否则强制要求SSL连接,而CI默认不启用
第三步:检查CI自身配置加载是否生效
裸连成功但CI仍报错,说明问题出在框架侧。重点排查:
-
CI4 的
.env是否被正确读取:确认.env文件放在项目根目录(与app/、public/同级),权限为644,且public/index.php中$pathsPath指向正确的../app/Config/Paths.php;如果部署在子域名,不要把整个CI项目扔进web根目录,应只放public/内容进去,核心文件保留在上层 -
CI3 的
database.php是否被覆盖或未生效:在文件末尾临时加print_r($db['default']); die();,看输出的配置是不是你改过的值;检查是否因缓存或CDN导致旧配置被读取 -
MySQL 8.0+ 认证协议不兼容:若报错
Client does not support authentication protocol requested by server,说明用户用了caching_sha2_password插件。登录MySQL执行:ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass';
第四步:确认连接后能否正常执行操作
连上了不代表能写入。常见“连得上但新增失败”的原因:
- 数据库用户只有
SELECT权限,没给INSERT/UPDATE等;可在cPanel或云控制台重新授权 - 表字符集不匹配:CI3默认用
utf8,但云数据库可能默认utf8mb4,导致插入emoji或长中文时报错;在database.php中显式设'char_set' => 'utf8mb4'和'dbcollat' => 'utf8mb4_unicode_ci' - SQL模式太严格:云MySQL常启用
STRICT_TRANS_TABLES,字段为NOT NULL却传了空值就会静默失败;可在CI配置中加'stricton' => FALSE临时绕过(上线前建议修复数据逻辑)











