推荐用环境变量管理数据库配置,因其可避免凭据硬编码导致的泄露风险,实现配置与代码分离,便于多环境切换并符合 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 = DotenvDotenv::createImmutable(__DIR__); $dotenv->safeLoad(); // 自动加载 .env 文件,跳过已存在的环境变量
.env 文件内容示例:
立即学习“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






























