必须用循环生成$cfg['Servers']数组且索引从1开始连续,设$cfg['ServerDefault']=0、auth_type统一为'cookie',否则后续项被跳过或服务器不显示。
config.inc.php里$cfg['Servers']索引不连续导致跳过后续项
phpmyadmin遍历$cfg['servers']时,遇到第一个空值或语法错误就中止,不会继续读后面。常见写法是手动写$cfg['servers'][1]、$cfg['servers'][2],但一旦漏掉[2]、重复用[1]、或在if块里分段递增$i,就会让数组中间断档。
必须确保索引从 1 开始、严格递增、无跳号无重复。推荐用循环生成:
$hosts = [
['host' => '192.168.1.10', 'port' => 3306],
['host' => '172.18.0.2', 'port' => 3307],
];
$i = 0;
foreach ($hosts as $host) {
$i++;
$cfg['Servers'][$i]['host'] = $host['host'];
$cfg['Servers'][$i]['port'] = $host['port'];
$cfg['Servers'][$i]['auth_type'] = 'cookie';
}
- 别在
$cfg['Servers'][$i]定义前加注释行(如// dev server),PHP 会把注释当字符串拼进数组,直接报语法错误 - 每个子数组至少含
host和auth_type,缺一不可;socket和port不能共存 - 删掉所有
$cfg['Servers'][0]——这个索引 phpMyAdmin 不认
$cfg['ServerDefault']没设成0,登录页默认只显示一个服务器
即使$cfg['Servers'][1]到[5]全配对了,如果$cfg['ServerDefault']没显式设为0,phpMyAdmin 就不会渲染下拉菜单,而是直接进入单服务器登录流程。
必须加这一行,且只能是数字0,不是false、空字符串或注释掉:
$cfg['ServerDefault'] = 0;
- 设成
1或2:登录页直接跳转到对应服务器,不出现下拉列表 - 留空或注释掉:行为等同于
1,仍只显示一个入口 - 这个配置必须放在
$cfg['Servers']数组定义之后,否则可能被覆盖
auth_type不是'cookie',服务器条目被忽略
用auth_type = 'http'时,phpMyAdmin 不走自己的登录页,而是依赖 Web 服务器做 Basic Auth,结果它根本收不到用户选的是哪台 MySQL,所有服务器都指向同一套凭据——登录页看似有下拉,点哪个都连向同一个实例。
auth_type = 'config'更隐蔽:它不进下拉列表,只在首次访问时自动连接,你根本看不到它。
- 多服务器场景唯一可靠的是
auth_type = 'cookie' - 此时
$cfg['Servers'][$i]['user']和$cfg['Servers'][$i]['password']可留空,由用户登录时输入 - 务必同步设置
$cfg['LoginCookieValidity'] = 86400;,否则 cookie 半小时就失效,频繁掉线
浏览器缓存或服务端 cache/ 目录残留旧 JS
配置改对了,但登录页还是只显示一个选项?大概率是前端没加载新配置的 JS 脚本。phpMyAdmin 登录页的服务器列表由 JS 渲染,而 JS 是从js/config.js.php动态生成并缓存的。
- 先强制刷新页面:
Ctrl+Shift+R(Windows/Linux)或Cmd+Shift+R(macOS) - 再清空 phpMyAdmin 的
cache/目录(路径通常是/usr/share/phpmyadmin/cache/或phpmyadmin/cache/) - 最后确认 Web 服务器(Apache/Nginx)没启用 aggressive 缓存规则,比如对
.php后缀加了Cache-Control: public, max-age=3600
最易被忽略的是$cfg['blowfish_secret']复用——多个服务器共用同一个密钥,会导致 cookie 凭据互相覆盖,登录 Server B 后瞬间跳回 Server A 的库列表,看起来像“列表没生效”,其实是认证逻辑在后台悄悄串了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











