mysqli_connect() 返回 false 时必须立即用 mysqli_connect_error() 输出具体错误,常见原因包括 connection refused(服务未运行或端口不通)、access denied(用户 host 不匹配)及 unknown mysql server host(docker 环境服务名错误或 dns 解析失败)。

mysqli_connect() 返回 false 时必须立刻查 mysqli_connect_error()
phpEnv 环境下连接 MySQL 失败,第一反应不是改配置,而是看错误到底说什么。直接写 mysqli_connect() 不加判断,等于把问题藏起来。
常见错误文本本身就在指路:
-
Connection refused→ MySQL 进程没跑、端口没监听、或防火墙拦了 3306 -
Access denied for user 'xxx'@'localhost'→ 用户存在但 host 不匹配,比如代码连的是localhost,而 MySQL 里只有'xxx'@'127.0.0.1' -
Unknown MySQL server host 'mysql'→ phpEnv 的 docker-compose.yml 里服务名写错,或 DNS 解析失败(Alpine 镜像常缺/etc/resolv.conf)
实操建议:在连接后强制加判断
if (!$conn) {
die('连接失败: ' . mysqli_connect_error());
}
phpEnv 默认用 Docker,host 不能填 localhost
本地装的 XAMPP 或 WAMP 里填 localhost 没问题,但 phpEnv 是容器化环境,PHP 和 MySQL 在不同容器里。此时 localhost 指的是 PHP 容器自身,不是 MySQL 容器。
正确做法是用 docker network 内的服务名(通常是 mysql 或 db),由 docker dns 自动解析:
- 检查
docker-compose.yml中 MySQL 服务的service name,比如services:mysql:→ host 就该填mysql - Mac/Windows 用户若用
localhost测试 CLI 命令,得换host.docker.internal;Linux 则需额外配置--add-host=host.docker.internal:host-gateway - 别在 PHP 代码里硬编码 IP,容器 IP 每次重启都可能变
MySQL 8+ 用户权限要显式建 'user'@'%',不能只靠 root@localhost
phpEnv 启的 MySQL 容器默认是 8.0+,用户体系是 user@host 二元组。即使你用 root,root@localhost 和 root@mysql(容器内网)是两个账号。
进 MySQL 容器执行:
mysql -u root -p > SELECT User, Host FROM mysql.user;
如果没看到你代码里用的用户名对应 % 或具体容器名(如 php),就补一条:
CREATE USER 'app'@'%' IDENTIFIED BY 'pass123'; GRANT ALL ON mydb.* TO 'app'@'%'; FLUSH PRIVILEGES;
注意:app@localhost 对容器内 PHP 无效;app@127.0.0.1 也不行——容器间通信走的是 docker 网络,不是 loopback。
phpEnv 的 mysqli 扩展默认启用,但 CLI 和 Web 的 php.ini 可能不一致
运行 php --ini 查 CLI 加载的配置路径,再开个 phpinfo(); 页面看 Web SAPI 实际加载的 php.ini。两者常不同。
确认 mysqli 是否真启用:
-
php -m | grep mysqli—— CLI 下有输出才说明扩展加载成功 - Web 下
phpinfo()页面搜 “mysqli” ,看 “mysqli support” 是否为 enabled - 若没启用,检查对应
php.ini是否含extension=mysqli(Linux/macOS)或extension=php_mysqli.dll(Windows)
phpEnv 的 Docker 镜像一般已配好,但如果自己改过 Dockerfile 或用了精简版镜像,就得手动装 php-mysql 包(Debian/Ubuntu)或确保编译时带 --with-mysqli。
最易被忽略的一点:MySQL 容器启动后,需要等几秒才真正 ready,phpEnv 的 PHP 容器可能在 MySQL 还没 listen 时就发起连接,导致首次请求必报 Connection refused。加健康检查或启动脚本里加 wait-for-it.sh 类工具,比反复刷新页面更可靠。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











