PHP连不上MySQL的首要原因是mysqli或PDO_mysql扩展未启用,需检查php.ini配置并重启Web服务;其次确认MySQL进程运行、监听地址及端口开放;最后排查用户权限与认证插件兼容性。
mysqli 或 PDO_mysql 扩展是否启用绝大多数“连不上”的问题,根源不在密码或地址,而在 PHP 根本没加载数据库驱动。Windows 下常见于 php.ini 中扩展被注释;Linux 下则可能是扩展未安装或配置路径错误。
php -m | grep -i mysql(Linux/macOS)或 php -m(Windows 查看输出),确认列表中含 mysqli 和/或 pdo_mysql
php.ini,取消注释对应行:;extension=mysqli→ 改为
extension=mysqli(Windows);Linux 常需
sudo apt install php-mysql 后重启 Web 服务apache2 / nginx + php-fpm),仅重启 PHP 进程无效Connection refused 或 Can't connect to local MySQL server
说明 PHP 尝试连接 MySQL,但 MySQL 进程未监听指定地址或端口,或被防火墙拦截。
sudo systemctl status mysql(Linux)或任务管理器查 mysqld.exe(Windows)mysql -u root -p -e "SHOW VARIABLES LIKE 'bind_address';"。若值为 127.0.0.1,则只接受本地 IPv4;若为 ::1,可能拒绝 IPv4 连接 —— PHP 中显式用 '127.0.0.1' 而非 'localhost' 可绕过 socket 机制telnet 127.0.0.1 3306(Linux/macOS 可用 nc -zv 127.0.0.1 3306)。失败则检查 skip-networking 是否被启用(my.cnf 中需注释掉该行)Access denied for user
不是密码错了,就是用户权限没给对——MySQL 8+ 默认认证插件变更,是高频踩坑点。
SELECT host, user, plugin FROM mysql.user WHERE user = 'your_user';,重点看
plugin 列。若为 caching_sha2_password(MySQL 8.0.4+ 默认),而 PHP 版本 openssl 扩展,就会拒连ALTER USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; FLUSH PRIVILEGES;
GRANT ALL ON *.* TO 'user'@'127.0.0.1' 和 GRANT ALL ON *.* TO 'user'@'localhost' 是两条独立权限,不能互相替代写死 localhost、忽略端口、不设字符集,这三处出错不会直接报错,但会导致中文乱码、超时或莫名
断连。
$mysqli = new mysqli('127.0.0.1', 'user', 'pass', 'db', 3307);
$mysqli->set_charset('utf8mb4');(注意是 utf8mb4,不是 utf8);charset=utf8mb4,并设置 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,否则错误静默失败MySQL 的权限模型和 PHP 扩展加载机制是两套独立系统,排查时别混在一起判断。一个 phpinfo() 页面就能快速定位是驱动缺失还是连接参数错,比反复改密码有效得多。