phpmyadmin 的 hide_db 配置按服务器独立生效,不跨实例共享;必须为每个 $cfg['servers'][$i] 单独设置,否则隐藏无效;它仅前端过滤,非权限控制,后端访问仍取决于 mysql 用户权限。
phpmyadmin 在多服务器模式下“无法识别隐藏的数据库”这个说法本身不准确——它根本不会去“识别”或“处理”其他服务器的 hide_db 配置,因为每个服务器的 $cfg['servers'][$i]['hide_db'] 只作用于自己连接的那个 mysql 实例的数据库列表。
hide_db 是按服务器独立生效的,不是全局过滤器
你配置了 3 个服务器(A、B、C),只在 $cfg['Servers'][1] 里写了 $cfg['Servers'][1]['hide_db'] = '^test$',那这个正则只影响服务器 A 的左侧数据库列表;服务器 B 和 C 的列表完全不受影响,哪怕它们连的是同一个 MySQL 实例(比如都连 localhost:3306),也不会共享或继承这个规则。
常见误解是以为设一次就能统一屏蔽,实际必须为每个 $cfg['Servers'][$i] 单独配置。
- 每个服务器配置块是完全隔离的,
hide_db不跨索引生效 - 即使两个
$cfg['Servers'][$i]指向同一物理 MySQL 实例,它们的hide_db仍各自解析、各自过滤 - 没有“主配置继承”机制,复制粘贴时漏掉某一项是高频失误点
多服务器配置中 hide_db 失效的典型原因
你以为配好了,但列表里该隐藏的库还在,大概率不是正则写错,而是配置没落到目标服务器上。
- 你在循环生成服务器配置时,把
hide_db写在了foreach外部,结果只有最后一个服务器生效 - 用了类似
$cfg['Servers'][$i]['hide_db'] = $common_hide_rule;,但$common_hide_rule变量在循环外未定义或为空 - 配置文件里存在多个
Servers段,后加载的覆盖了前一个(比如 Debian 系统同时读取/etc/phpmyadmin/config.inc.php和/usr/share/phpmyadmin/libraries/vendor_config.php) -
auth_type是'config',但你改的是登录页输的账号,实际连接用户是配置文件里硬编码的$cfg['Servers'][$i]['user'],而这个用户根本没权限看那些库——hide_db前端过滤根本没机会触发
想让多个服务器共用一套隐藏规则?得手动同步
没有自动同步机制,但可以结构化写法减少出错:
$common_hide_db = '^(?:information_schema|performance_schema|sys|phpmyadmin)$';
$i = 0;
$hosts = [
['host' => 'localhost', 'port' => 3306],
['host' => '172.18.0.1', 'port' => 3307],
];
foreach ($hosts as $h) {
$i++;
$cfg['Servers'][$i]['host'] = $h['host'];
$cfg['Servers'][$i]['port'] = $h['port'];
// … 其他必要项
$cfg['Servers'][$i]['hide_db'] = $common_hide_db; // 关键:每一项都显式赋值
}
注意:$common_hide_db 必须是字符串字面量或已定义变量,不能是函数调用或动态拼接后未检查的表达式。
最易被忽略的一点:hide_db 不等于权限控制
哪怕你在所有服务器上都配了 hide_db,只要用户有对应数据库的 SELECT 权限,他依然能通过 SQL 栏执行 USE xxx; 或 SELECT * FROM xxx.table;。它只是前端 DOM 过滤,不改变任何后端行为。真正要限制访问,必须在 MySQL 层用 GRANT/REVOKE 控制用户权限——这点在多服务器场景下尤其容易混淆,因为不同服务器可能连不同权限的账号。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











