最简单可靠的方式是在phpMyAdmin界面顶部添加固定定位的环境警示条;它不依赖标签页、不干扰连接逻辑、无需修改MySQL权限或后端配置,且能避免弹窗遮盖问题。

直接在 phpMyAdmin 界面顶部加一条固定定位的环境警示条,是最简单、最可靠的方式——它不依赖浏览器标签页(根本改不了)、不干扰数据库连接逻辑、也不需要动 MySQL 权限或后端配置。
为什么不能靠修改 document.title 或标签页颜色
浏览器标签页背景色无法用 CSS 控制,document.title 加前缀(如 [PROD] phpMyAdmin)容易被忽略,尤其当用户开十几个标签时。更关键的是:phpMyAdmin 本身没有运行时环境感知能力,process.env.NODE_ENV 这类前端变量在纯 PHP 后端服务里根本不存在。强行注入 JS 脚本去读取环境,得改入口 HTML 或通过 Nginx 变量透传,维护成本高、易出错。
推荐做法:用 Nginx 反向代理注入环境类名到 <html>
在 Nginx 配置中,根据上游服务或请求头判断环境,用 sub_filter 把 <html> 替换为带 class 的版本:
location / {
proxy_pass http://phpmyadmin_backend;
sub_filter '<html>' '<html class="env-production">';
sub_filter_once on;
}
如果是测试库反向代理,就换成 env-test。然后在自定义 CSS(通过 $cfg['NavigationLogoLink'] 或独立 <link> 引入)里写:
立即学习“PHP免费学习笔记(深入)”;
.env-production .topmenu { background-color: #d32f2f !important; }
.env-test .topmenu { background-color: #388e3c !important; }
.topmenu { color: white !important; font-weight: bold; }
注意:.topmenu 是 phpMyAdmin 顶部导航栏的原生 class,直接复用最稳;!important 在这里可接受,因为只覆盖一层背景,且避免被框架内联样式压制。
如果无法改 Nginx,用 PHP 方式动态写入 class
编辑 config.inc.php,在文件末尾加一段输出脚本:
ob_start();
function injectEnvClass() {
$env = $_SERVER['APP_ENV'] ?? 'development';
echo '<script>document.documentElement.classList.add("env-' . htmlspecialchars($env) . '");</script>';
}
add_action('phpmyadmin_after_html', 'injectEnvClass');
但这个方式有坑:
- 必须确保
$_SERVER['APP_ENV']真实存在(比如通过 systemd 环境变量、Nginxfastcgi_param或 Dockerenv注入) - phpMyAdmin 没有
add_action这种钩子——这是伪代码,实际得 hack 入口文件index.php或用ob_start()拦截输出,风险高 - JS 注入时机可能晚于 DOM 渲染,导致闪烁或失效
所以优先走 Nginx 方案,次选是直接在 phpMyAdmin 所在服务器的 PHP 配置里设 putenv("APP_ENV=production"),再用 getenv() 读取并 echo 到 HTML 中。
别碰 body 背景色和弹窗遮罩层
有人试过 document.body.style.backgroundColor = "#d32f2f",结果发现:phpMyAdmin 的“执行 SQL”弹窗、导入导出浮层、甚至左侧数据库树的下拉菜单,全用 createPortal 渲染到 document.body 底部,z-index 默认极高,会完全盖住红色背景。真正要做的不是“染红页面”,而是让那条横条永远钉在最上面、谁都盖不住——所以必须用 position: fixed; top: 0; z-index: 9999;,并且挂载在 <body> 开头,而不是塞进某个 div 里。



















