PHP连不上MySQL时,典型错误如“Could not connect”等表明连接层问题,需检查扩展启用、MySQL服务状态、连接参数、用户权限及防火墙设置。
看到 Could not connect、Connection refused、Access denied for user 或 mysqli_connect(): (HY000/2002),基本可锁定是连接层问题,不是 SQL 语法或业务逻辑问题。
这类报错不意味着数据库挂了,更可能是配置错、服务没启、权限没开、网络不通,或者 PHP 扩展根本没装。
PHP 默认不自动加载数据库扩展。没启用 mysqli 或 PDO_MYSQL,连尝试连接的机会都没有。
php -m | grep -i mysql,确认输出含 mysqli 或 pdo_mysql
php.ini,取消注释(去掉分号):extension=mysqli 或 extension=pdo_mysql
sudo systemctl restart apache2 或 sudo systemctl re
start php-fpm),仅 reload 不生效phpinfo() 页面验证扩展是否真加载成功 —— 光改配置 ≠ 生效常见误区:以为 localhost 和 127.0.0.1 完全等价。实际在 Linux 下,localhost 触发 Unix socket 连接,而 127.0.0.1 走 TCP;socket 文件路径不对或权限不足也会直接报 “Connection refused”。
sudo systemctl status mysql(或 mariadb)mysql -u root -p -h 127.0.0.1(强制走 TCP)和 mysql -u root -p -h localhost(走 socket),看哪个通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 端口。
SELECT User, Host FROM mysql.user;,确认你用的用户名对应 Host 是 'localhost'、'127.0.0.1' 还是 '%'
127.0.0.1,但用户只允许 localhost,就会报 Access denied —— 这俩在 MySQL 权限系统里是不同 hostGRANT 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() 的返回值,比盲猜快十倍。