phpMyAdmin 多服务器配置必须用循环动态生成 $cfg['Servers'] 数组,索引从1开始连续递增,每个服务器块需含 host、auth_type='cookie'、verbose;$cfg['ServerDefault']=0 必须显式设置,且 MySQL 服务端需同步授权远程访问。
config.inc.php 必须用循环生成 $cfg['Servers'] 数组
硬编码多个 $cfg['servers'][1]、$cfg['servers'][2] 看似简单,但极易因索引跳号、重复或语法错误导致后续服务器完全不加载——phpmyadmin 遍历 $cfg['servers'] 时,遇到第一个空值或解析失败就中止。
官方唯一推荐且稳定的方式是:定义一个 $hosts 数组,再用 foreach 或 for 动态填充 $cfg['Servers'][$i]。
- 索引必须从
1开始,不能用0;$i必须严格递增,不能在if/else里分段写 -
$hosts数组下标也建议从1开始,避免count()和循环错位 - 每个服务器块必须包含
host(或socket)、auth_type、verbose(可选但推荐),否则可能被跳过 - 别在配置块里写注释行(如
// First server)后直接跟 PHP 代码,PHP 会把注释当字符串拼进数组,引发语法错误
auth_type 必须统一设为 'cookie'
auth_type = 'http' 在多服务器场景下基本不可用。它把认证交给 Web 服务器(Apache/Nginx),phpMyAdmin 拿不到用户选的是哪台 MySQL,所有服务器只能共用同一套 HTTP 凭据,且无法透传 SSL 参数。一旦目标 MySQL 启用了 require_secure_transport=ON,连接必然失败。
正确做法是统一用 auth_type = 'cookie',登录页靠下拉列表选服务器,凭据由 session 管理,切换服务器无需退出重登。
-
$cfg['ServerDefault'] = 0必须显式设置,否则新服务器不会出现在登录页下拉列表 - 若用
'cookie',$cfg['Servers'][$i]['user']和$cfg['Servers'][$i]['password']可留空,实际凭据由登录时输入决定 - 务必设置
$cfg['LoginCookieValidity'] = 86400,否则 cookie 过期太快,频繁掉线 -
$cfg['blowfish_secret']不能为空,至少填 8 位随机字符串,否则报“配置文件现在需要绝密的短语密码”
远程服务器权限必须在 MySQL 服务端同步开通
光改 config.inc.php,不授权,#2002 Cannot log in to the MySQL server 错误照常出现。phpMyAdmin 配置只是“客户端”一端,MySQL 服务端必须允许对应账号从 phpMyAdmin 所在机器的 IP 远程登录。
立即学习“PHP免费学习笔记(深入)”;
- 典型授权命令(在目标 MySQL 中执行):
GRANT ALL PRIVILEGES ON *.* TO 'pma_user'@'192.168.1.100' IDENTIFIED BY 'strong_password'; FLUSH PRIVILEGES; - 检查
bind-address是否为0.0.0.0(非仅127.0.0.1),否则拒绝外部连接 - 确认防火墙放行对应端口(默认
3306),且目标 MySQL 已启用远程访问 - 如果用 Docker,注意宿主机网络模式、端口映射和容器内 MySQL 的
skip-networking设置
常见错误现象与定位线索
只显示一个服务器、下拉列表为空、页面白屏——这些表象背后,90% 是 $cfg['Servers'] 索引没从 1 开始连续,或某一项里漏了 host、auth_type 等必需键。
- 用
var_dump($cfg['Servers']); exit;插入 config.inc.php 末尾,直接看数组结构是否符合预期 - 检查 PHP 错误日志,常见报错如
PHP Parse error: syntax error, unexpected '}',往往来自注释混入数组赋值 - 确认没有重复定义
$i = 0多次,或在循环外手动写了$cfg['Servers'][1]又在循环里从$i = 1开始 - 修改完 config.inc.php 后,必须重启 Web 服务(如
systemctl restart apache2或nginx),否则配置不生效
配置真正难的不是写几行 PHP,而是让所有服务器在同一个数组里「对齐」:索引连续、键名完整、权限真实可达。少一个 verbose 字段,可能只是名字不显示;漏一次 $cfg['ServerDefault'] = 0,整个下拉框就消失。



















