在维护或审计一套已有的PHP系统时,我们常常需要确认程序到底连接了哪一个数据库。不同于运行时直接登入数据库查看,从源码层面定位数据库名既能帮我们理解项目结构,也能在缺乏线上账号时提供关键线索。下面整理几种在PHP源码中查看数据库名的常用技巧。
一、框架项目的配置文件查找
现代PHP开发大多基于框架,而框架通常将数据库连接信息集中放在配置目录中。以Laravel为例,根目录下的.env文件定义了环境变量,其中DB_DATABASE就是数据库名。若.env被忽略或不存在,还可查看config/database.php里的connections配置数组。
ThinkPHP则在config/database.php中通过database键名指定库名。原生写法或小众框架往往把信息写进入口文件、公共函数或db.ini之类的自定义配置。掌握这些路径后,用编辑器全局搜索文件名就能快速命中。
<?php
// Laravel 的 .env 片段示例
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=shop_prod
DB_USERNAME=root
DB_PASSWORD=secret
// ThinkPHP 的 database.php 片段
return [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'shop_prod',
'username' => 'root',
'password' => 'secret',
];
二、原生PHP代码中的连接函数定位
如果拿到的是早期手写代码或轻量脚本,数据库名常直接出现在mysqli_connect、mysqli_select_db或PDO构造参数里。这类代码未必有统一配置,可能分散在多个文件,因此需要借助内容搜索。
建议使用支持正则的编辑器(如VS Code、PHPStorm)全局检索(mysqli_connect|new PDO|mysql_select_db),然后逐个查看传入的字符串参数。注意有的项目会把库名拼进DSN,例如mysql:host=127.0.0.1;dbname=shop_prod,此时要提取dbname后面的值。
<?php
// 原生 mysqli 写法
$conn = mysqli_connect('127.0.0.1', 'root', 'secret', 'shop_prod');
// PDO 写法,库名在 DSN 中
$dsn = 'mysql:host=127.0.0.1;port=3306;dbname=shop_prod;charset=utf8';
$pdo = new PDO($dsn, 'root', 'secret');
// 另一种先连后选库
$link = mysqli_connect('127.0.0.1', 'root', 'secret');
mysqli_select_db($link, 'shop_prod');
三、利用关键词与正则精准搜索
当目录结构混乱、配置文件名不直观时,直接搜数据库名相关关键词效率更高。常用的英文标识有database、dbname、DB_NAME、db_name。使用正则(database|dbname|DB_NAME)=?可一次性覆盖多种命名风格。
需避免只搜localhost或root这类通用词,它们会返回大量非连接代码。配合文件过滤(如只搜*.php、*.env、*.ini)能进一步缩小范围。下表列出常见框架与对应搜索目标:
| 项目类型 | 优先查看文件 | 关键字段 |
|---|---|---|
| Laravel | .env / config/database.php | DB_DATABASE |
| ThinkPHP | config/database.php | database |
| 原生PHP | 入口或 db 类文件 | mysqli_connect 第4参 |
| Yii2 | config/db.php | dbname |
四、动态拼接与常量定义的特殊处理
部分项目为了多环境切换,会把数据库名定义为常量或在运行时拼接。例如通过define('DB_NAME', 'shop_' . ENV_SUFFIX),或在容器化部署时从环境变量读取。此时静态搜索可能只看到变量名,需要顺藤摸瓜找到赋值位置。
可在本地临时打印连接信息来辅助确认:在初始化后添加var_dump($pdo->query('select database()')->fetchColumn());,运行一次即可知道真实库名。但该方法仅适合开发环境,切勿在生产代码中长期保留。
<?php
// 常量拼接示例
define('ENV_SUFFIX', 'prod');
define('DB_NAME', 'shop_' . ENV_SUFFIX);
$conn = mysqli_connect('127.0.0.1', 'root', 'secret', DB_NAME);
// 运行时确认当前库
$pdo = new PDO('mysql:host=127.0.0.1;dbname=shop_prod', 'root', 'secret');
echo $pdo->query('select database()')->fetchColumn();
五、总结与排查思路
从PHP源码查看数据库名的核心逻辑是:先判断项目是否使用框架,再直奔对应配置文件;若为原生代码,则搜索连接函数与关键词。遇到动态定义时,结合常量追踪或小范围运行验证。
这套思路不仅能定位库名,还能顺带梳理数据库连接方式、账号权限与表前缀习惯,为后续做数据迁移、SQL审计或性能优化打下基础。熟练之后,即便面对几百个文件的旧系统,也能在几分钟内摸清它的数据入口。