PHP连接MySQL失败的根本原因是配置、网络和权限三者未对齐:需确保端口为整数且MySQL监听该端口,bind-address设为0.0.0.0并重启服务,创建'phpuser'@'%'授权并刷新权限,PHP中使用虚拟机真实IP而非localhost,同时放行防火墙3306端口并确保宿主机telnet可达。
根本原因不是端口本身,而是配置、网络和权限三者没对齐——缺一不可。
端口写错或类型不匹配导致静默失败
PHP 对数字型 port 和字符串型 port 处理不同:port 必须是整数(如 3307),若写成字符串 '3307',PHP 会转为 0,连接直接落到默认端口,报错却显示为 #2003 或 #2002。
-
$cfg['Servers'][2]['port'] = 3307;✅ 正确 -
$cfg['Servers'][2]['port'] = '3307';❌ 导致连接发往 0 端口,MySQL 拒绝 - 若目标 MySQL 启用 socket(如
/var/run/mysqld/mysqld.sock),host = 'localhost'会强制走 socket,忽略port—— 此时必须改用host = '127.0.0.1'强制走 TCP
远程 MySQL 未监听该端口或绑错地址
即使 phpMyAdmin 配了 3307,如果 MySQL 服务本身没在那个端口监听,连接必然失败。常见陷阱:
-
bind-address = 127.0.0.1在my.cnf中 → 只响应本地回环,远程 IP 连不上 - 改成了
bind-address = 0.0.0.0却没重启 MySQL(sudo systemctl restart mysql) - 防火墙(ufw/firewalld/Windows 防火墙)拦了非标端口,比如只放行了
3306,但3307被 DROP - 用
mysql -h 192.168.5.10 -P 3307 -u user -p命令行验证不通,就别调 phpMyAdmin
用户权限没覆盖到实际来源 IP + 端口组合
MySQL 的用户授权是 'user'@'host' 二维匹配,和端口无关,但和客户端发起连接的 IP 强相关:
- phpMyAdmin 所在机器 IP 是
192.168.10.5,但 MySQL 用户只有'pma'@'localhost'→ 拒绝 - 正确做法:创建
'pma'@'192.168.10.5'或更宽松的'pma'@'192.168.10.%' - 执行
SELECT host, user FROM mysql.user;确认该用户记录存在且host字段匹配真实来源 - 别漏
FLUSH PRIVILEGES;,否则新权限不生效
SSL 或安全策略拦截非标端口连接
某些生产环境 MySQL 启用了 require_secure_transport = ON,此时未启用 SSL 的连接会被直接拒绝,错误可能不明确:
立即学习“PHP免费学习笔记(深入)”;
- 若远程 MySQL 要求 SSL,必须在 phpMyAdmin 配置中显式开启:
$cfg['Servers'][2]['ssl'] = true; - 不加这行,连接会在 TLS 握手阶段失败,phpMyAdmin 可能只报泛泛的
#2002 - 同时确认 PHP 的
mysqli或PDO_MySQL扩展已启用,并支持 SSL(检查phpinfo()中mysqli.ssl_version)
最容易被忽略的是:改完 config.inc.php 后没清浏览器 cookie 或 session,导致仍用旧服务器缓存登录;或者 $cfg['ServerDefault'] 没设为 0,下拉菜单不出现,误以为“没配上”。



















