PHP连不上MySQL时,典型错误如“Could not connect”等表明连接层问题,需检查扩展启用、MySQL服务状态、连接参数、用户权限及防火墙设置。

PHP 连不上 MySQL 时的典型错误信息
看到 Could not connect、Connection refused、Access denied for user 或 mysqli_connect(): (HY000/2002),基本可锁定是连接层问题,不是 SQL 语法或业务逻辑问题。
这类报错不意味着数据库挂了,更可能是配置错、服务没启、权限没开、网络不通,或者 PHP 扩展根本没装。
检查 mysqli/pdo_mysql 扩展是否启用
PHP 默认不自动加载数据库扩展。没启用 mysqli 或 PDO_MYSQL,连尝试连接的机会都没有。
- 运行
php -m | grep -i mysql,确认输出含mysqli或pdo_mysql - 若无,编辑
php.ini,取消注释(去掉分号):extension=mysqli或extension=pdo_mysql - 改完后必须重启 Web 服务(如
sudo systemctl restart apache2或sudo systemctl restart php-fpm),仅 reload 不生效 - 用
phpinfo()页面验证扩展是否真加载成功 —— 光改配置 ≠ 生效
验证 MySQL 服务状态与连接参数
常见误区:以为 localhost 和 127.0.0.1 完全等价。实际在 Linux 下,localhost 触发 Unix socket 连接,而 127.0.0.1 走 TCP;socket 文件路径不对或权限不足也会直接报 “Connection refused”。
立即学习“PHP免费学习笔记(深入)”;
- 先确认 MySQL 进程在跑:
sudo systemctl status mysql(或mariadb) - 用命令行手动测连:
mysql -u root -p -h 127.0.0.1(强制走 TCP)和mysql -u root -p -h localhost(走 socket),看哪个通 - PHP 中统一用
127.0.0.1可绕过 socket 配置问题;若坚持用localhost,需确认mysqli.default_socket在php.ini中指向正确的 socket 文件(如/var/run/mysqld/mysqld.sock) - 检查
mysqli_connect()四个参数顺序是否正确:mysqli_connect($host, $user, $password, $database, $port);漏传端口(尤其非 3306)或把密码当数据库名,会静默失败
用户权限与防火墙干扰
MySQL 用户默认只允许从 localhost 连,且可能未授权对应数据库。另外,UFW、iptables 或云平台安全组也可能拦掉 3306 端口。
- 登录 MySQL 后执行:
SELECT User, Host FROM mysql.user;,确认你用的用户名对应 Host 是'localhost'、'127.0.0.1'还是'%' - 如果 PHP 用的是
127.0.0.1,但用户只允许localhost,就会报Access denied—— 这俩在 MySQL 权限系统里是不同 host - 授予权限示例:
GRANT ALL ON mydb.* TO 'myuser'@'127.0.0.1' IDENTIFIED BY 'mypass'; FLUSH PRIVILEGES; - 检查防火墙:
sudo ufw status,若 3306 被 deny,且你确需远程连(不推荐开发环境开远程),再放行;本地调试建议关防火墙或只允 127.0.0.1
真正卡住的地方往往不是代码写错,而是 MySQL 用户 Host 匹配失败、socket 路径不一致、扩展没重启生效这三类——它们不会报具体原因,只甩一句 “could not connect”。盯住 mysqli_connect_error() 的返回值,比盲猜快十倍。











