推荐用环境变量管理数据库配置,因其可避免凭据硬编码导致的泄露风险,实现配置与代码分离,便于多环境切换并符合12-factor app原则;开发用phpdotenv加载.env文件,生产由服务器或docker注入环境变量,php通过getenv()或$_env读取,再构建pdo连接并启用异常模式确保安全。

PHP 连接数据库时,把数据库配置(如主机、用户名、密码)硬编码在代码里是不安全也不灵活的做法。推荐用环境变量管理敏感配置,再通过 PHP 读取并建立连接。
为什么用环境变量管理数据库配置
把数据库凭据写死在代码中,容易意外提交到 Git、被日志打印、或在错误页面暴露。环境变量将配置与代码分离,便于多环境(开发/测试/生产)切换,也符合 12-Factor App 原则。
- 开发环境用
.env文件本地加载,生产环境由服务器(如 Nginx/Apache)或容器(如 Docker)注入系统级环境变量 - PHP 通过
$_ENV或getenv()读取,无需修改代码即可切换数据库地址或账号 -
phpdotenv是常用库,能安全加载.env文件(仅限非生产环境)
典型实践:使用 vlucas/phpdotenv(开发阶段)
安装后,在入口文件(如 index.php 或 public/index.php)顶部加载:
require_once __DIR__.'/vendor/autoload.php'; $dotenv = Dotenv\Dotenv::createImmutable(__DIR__); $dotenv->safeLoad(); // 自动加载 .env 文件,跳过已存在的环境变量
.env 文件内容示例:
SmartB2B 是一款基于PHP、MySQL、Smarty的B2B行业电子商务网站管理系统,系统提供了供求模型、企业模型、产品模型、人才招聘模型、资讯模型等模块,适用于想在行业里取得领先地位的企业快速假设B2B网站,可以运行于Linux与Windows等多重服务器环境,安装方便,使用灵活。 系统使用当前流行的PHP语言开发,以MySQL为数据库,采用B/S架构,MVC模式开发。融入了模型化、模板
立即学习“PHP免费学习笔记(深入)”;
DB_HOST=localhost DB_PORT=3306 DB_NAME=myapp DB_USER=root DB_PASS=secret123
之后可用 getenv('DB_HOST') 或 $_ENV['DB_HOST'] 获取值。
建立 PDO 连接(带错误处理)
用读取到的环境变量创建 PDO 实例,启用异常模式便于统一处理错误:
$host = getenv('DB_HOST') ?: 'localhost';
$port = getenv('DB_PORT') ?: '3306';
$dbname = getenv('DB_NAME') ?: 'test';
$user = getenv('DB_USER') ?: 'root';
$pass = getenv('DB_PASS') ?: '';
try {
$dsn = "mysql:host={$host};port={$port};dbname={$dbname};charset=utf8mb4";
$pdo = new PDO($dsn, $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
error_log('Database connection failed: ' . $e->getMessage());
throw new RuntimeException('Service unavailable', 503);
}
注意:生产环境应禁用 .env 加载,改由 Web 服务器或运行时注入环境变量(例如 Docker 的 -e DB_HOST=...),避免文件被意外访问。
安全提醒与检查点
-
.env文件必须加入.gitignore,禁止提交到版本库 - Web 根目录不能被直接浏览,确保
.env不可通过 HTTP 下载(Apache/Nginx 需配置禁止访问.env) - 避免在错误响应中输出数据库密码等敏感信息,
PDO::ATTR_ERRMODE设为EXCEPTION后自行捕获并记录,不直接抛出给前端 - 生产环境建议使用更严格的权限控制:数据库用户仅授予必要表的
SELECT/INSERT/UPDATE权限,禁用DROP或FILE










