php mysqli连接失败90%因权限与环境配置,非代码错误;先依错误关键词(如connection refused、access denied)定位,再依次检查服务状态、网络连通性、用户host绑定、mysql 8+认证插件兼容性及mysqli扩展启用情况。

PHP mysqli 连接数据库失败,90% 问题出在权限配置和编码环境上,不是代码写错了。先看错误提示关键词,再按顺序查这几点,多数 3–5 分钟就能定位。
看错误信息锁定方向
错误不是模糊的“连接失败”,而是有明确含义的字符串:
- Connection refused → MySQL 没启动,或端口(默认 3306)被防火墙拦了,或 PHP 尝试连错地址(比如填了 localhost 却因 socket 路径不匹配失败)
- Access denied for user 'xxx'@'yyy' → 用户存在但 host 不匹配(如 'user'@'localhost' 无法用 127.0.0.1 连),或密码错,或 MySQL 8+ 认证插件不兼容
- Unknown MySQL server host → $host 值拼错(比如多写了 mysql://、容器名打错、DNS 解析失败)
- Can't connect to local MySQL server → MySQL 服务根本没运行,或 bind-address 配置成 127.0.0.1 但 PHP 走的是 socket(尤其 Windows 或某些 Docker 环境)
确认 MySQL 服务与网络通路
别跳过这步——很多“权限问题”其实是服务没起来或连不通:
- Linux 上执行 sudo systemctl status mysqld(CentOS/RHEL)或 sudo service mysql status(Ubuntu/Debian),显示 active (running) 才算正常;否则先 sudo systemctl start mysqld
- Windows 上打开“服务”管理器,确认 MySQL80 或对应服务状态是“正在运行”
- 在 PHP 所在服务器上执行 nc -zv 127.0.0.1 3306 或 telnet 127.0.0.1 3306,能通说明端口可达;不通就先查服务、防火墙、SELinux
- 远程连接时,检查 MySQL 配置文件(my.cnf)中 bind-address = 0.0.0.0,且用户 host 是 '%' 或具体 IP
核对用户权限与 Host 绑定
MySQL 的权限控制精确到 “用户名@主机”,localhost 和 127.0.0.1 在 MySQL 看来是两个不同 host:
- 登录 MySQL 后执行 SELECT User, Host FROM mysql.user;,确认你要用的用户(如 'appuser')对应 Host 是否允许当前连接方式(比如你用 127.0.0.1 连,就要有 'appuser'@'127.0.0.1' 或 'appuser'@'%')
- 如果只有 'appuser'@'localhost',而 PHP 用的是 127.0.0.1,就创建新用户:CREATE USER 'appuser'@'127.0.0.1' IDENTIFIED BY 'xxx';
- 授予权限:GRANT ALL ON yourdb.* TO 'appuser'@'127.0.0.1'; FLUSH PRIVILEGES;
- MySQL 8+ 默认用 caching_sha2_password 插件,老版 PHP(如 7.3)不支持 → 改认证方式:ALTER USER 'appuser'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'xxx'; FLUSH PRIVILEGES;
检查 PHP 扩展与字符集设置
mysqli 扩展没启用,或连接后没设字符集,也会导致看似“连上却读不出数据”:
- 运行 php -m | grep -i "mysqli",必须看到 mysqli;没有就编辑 php.ini,取消 extension=mysqli 前的分号,重启 Apache 或 PHP-FPM
- 连接成功后立刻设字符集,避免中文乱码或查询失败:$conn->set_charset('utf8mb4');
- mysqli_connect() 第五个参数是端口,不要把端口塞进 host 字符串(如不要写 "localhost:3306"),应分开传:new mysqli('localhost', $u, $p, $db, 3306);
- 确保 PHP 错误报告开启:error_reporting(E_ALL); ini_set('display_errors', 1);,并查看 php_error.log(路径见 phpinfo() 中 error_log 项)
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











