CI4连不上MySQL八成是.env中hostname、database、username配错或用户未授权;需核对cPanel全名(含前缀)、密码逐字符确认、权限手动绑定,并确保.env位置正确且执行php spark cache:clear。

CI4 连不上 MySQL,八成是 .env 里配错了 hostname、database、username 这三项,或者没给数据库用户授权——先别动代码,从这三处死磕。
确认你的数据库凭证完全匹配 cPanel 或主机后台显示的值
共享主机(比如 Namecheap)会强制给数据库名和用户名加前缀,例如你在 cPanel 里看到的数据库名是 youruser_ci4db,那就必须填这个全名,不能只写 ci4db;同理,用户名是 youruser_ci4user,不是你本地习惯用的 root 或 admin。密码要逐字符核对,注意大小写和特殊符号是否被 URL 编码或复制遗漏。
常见错误现象:Access denied for user 'xxx'@'localhost' 或 Unknown database 'xxx' —— 基本就是这里错了。
- hostname 大部分情况填
"localhost"就行,不要改成127.0.0.1(Unix socket 和 TCP 不等价) - 空密码必须写成
"",不能留空、不能写null或false - database 和 username 字段必须带主机商分配的前缀,不带前缀=连不上
检查 .env 文件格式和位置是否正确
CI4 默认读取项目根目录下的 .env 文件,不是 app/Config/Database.php。如果你改了后者却没删掉 .env 里的配置,.env 会优先生效并覆盖类配置。
正确写法示例(注意等号前后无空格,值用双引号包裹):
database.default.hostname = "localhost" database.default.database = "youruser_ci4db" database.default.username = "youruser_ci4user" database.default.password = "your_actual_password" database.default.DBDriver = "MySQLi"
关键点:
- DBDriver 必须是
"MySQLi"或"PDO","mysql"在 CI4 中已彻底弃用 - 如果用 PDO,必须额外补上
database.default.DSN,例如:"mysql:host=localhost;dbname=youruser_ci4db;charset=utf8mb4" - 修改后必须运行
php spark cache:clear,否则旧缓存配置仍生效
验证数据库用户是否真正绑定了目标库并授予权限
很多新手建完库、建完用户就以为完了,但 cPanel 的「MySQL Databases」页面里还有一道关:必须在「Add User to Database」环节手动把用户和库关联,并至少勾选 SELECT、INSERT、UPDATE、DELETE 权限(开发阶段直接选 ALL PRIVILEGES 更省事)。
不关联 = 用户存在但对库无任何操作权 = 连接被拒。
快速验证方法:在子域名根目录放一个 test_db.php,内容为:
<?php
$conn = mysqli_connect("localhost", "youruser_ci4user", "your_actual_password", "youruser_ci4db");
if (!$conn) {
die("连接失败: " . mysqli_connect_error());
}
echo "连接成功!";
mysqli_close($conn);
?>
能跑通这个,说明数据库本身没问题,问题一定出在 CI4 配置或路径上。
部署结构错位会导致 .env 根本不被加载
CI4 要求 .env 在项目根目录(即包含 app/、public/、system/ 的那一层),而 web 服务器入口必须指向 public/ 目录。Namecheap 子域名默认根目录是 /home/user/example.tgsoftware.services,你要把 public/ 下所有文件移到这里,再把 app/、system/、.env 等放在上一级(/home/user/),最后修改 public/index.php 中的 $pathsPath 指向正确的 app/Config/Paths.php 路径。
路径一错,CI4 找不到 .env,就会 fallback 到默认配置(全是空值或 localhost/root),必然报错。
最容易被忽略的是:哪怕 .env 写对了,如果它不在 CI4 启动时能访问到的根目录下,就等于没写。


















