先做裸连测试:用mysqli_connect()直连,若失败则查环境(服务、权限、socket路径等),成功则查ci配置加载、驱动、前缀或认证插件兼容性问题。

90% 的 Unable to connect to your database server using the provided settings 错误,根本没走到 CodeIgniter 的配置加载逻辑——它卡在 PHP 尝试建立 MySQL 连接那一瞬间。别急着改 database.php 或 .env,先做裸连测试。
用 mysqli_connect() 直接测通不通
写个 test_db.php 放到 Web 可访问目录,内容就三行:
<?php $conn = mysqli_connect("127.0.0.1", "your_user", "your_pass", "your_db");
if (!$conn) die("连接失败: " . mysqli_connect_error());
echo "连接成功";
?>
运行它,结果分两种:
- 报错(比如
(HY000/2002): No such file or directory)→ 问题在环境:MySQL 服务没开、账号密码错、用户没授权、或 socket 路径不对 - 显示“连接成功”→ 问题在 CI 自身:配置没加载、路径错、驱动不匹配、缓存没清
localhost 和 127.0.0.1 不是等价的
Linux 下 localhost 强制走 Unix socket,但 PHP 可能找不到 /var/run/mysqld/mysqld.sock;Windows 或 Docker 里也可能因 hosts 解析出歧义。直接换掉:
- CI3:
$db['default']['hostname'] = '127.0.0.1'; - CI4:
database.default.hostname = "127.0.0.1"(.env)或'hostname' => '127.0.0.1'(app/Config/Database.php)
顺手检查 PHP 是否真启用了扩展:php -m | grep -i mysqli(CLI)和 phpinfo()(Web)可能加载不同 php.ini,用 php --ini 看实际路径。
Namecheap 或 cPanel 主机上必须带前缀
cPanel 创建数据库时,database name 和 username 都强制加了你的 cPanel 用户名前缀。比如你登录用户名是 abc123,那:
- 真实数据库名不是
myapp,而是abc123_myapp - 真实用户名不是
myuser,而是abc123_myuser - 建完后必须进「Add User To Database」手动关联,并勾选
SELECT、INSERT、UPDATE、DELETE权限
漏掉任意一步,裸连都会失败——这不是 CI 的锅,是权限没给够。
CI4 的 .env 没生效?先看 index.php 路径
共享主机部署 CI4 常见错误:把整个项目(含 app、system、.env)一股脑扔进子域名根目录,导致 .env 被 Web 直接暴露,或 index.php 根本读不到它。
正确结构是:
-
/home/abc123/example.tgsoftw/(存放app、system、.env等核心文件) -
/home/abc123/example.tgsoftw/public/(所有文件移到子域名根目录) - 修改根目录下的
index.php,确保$pathsPath指向/home/abc123/example.tgsoftw/app/Config/Paths.php
改完记得清缓存:php spark cache:clear,否则新配置不会生效。
最常被忽略的是:MySQL 8.0+ 默认用 caching_sha2_password 认证插件,而旧版 PHP 的 mysqli 不支持。裸连报 Client does not support authentication protocol 就是它——得在 MySQL 里执行 ALTER USER 'xxx'@'%' IDENTIFIED WITH mysql_native_password BY 'yyy';,或者升级 PHP。











