数据库连接是 PHP 开发中最基础也最关键的一环。无论是用户系统、商品管理还是内容平台,所有数据都依赖数据库支撑。很多初学者在这一阶段容易遇到报错页面、连接失败或驱动未开启等问题,本质上往往是对 PDO 的理解不够系统。
围绕数据库连接,常见疑问通常包括:
- 能否同时支持 MySQL 和 PostgreSQL?
下面围绕这些问题,系统梳理 PDO 的使用方式、推荐配置以及常见问题排查思路。
为什么选择 PDO,而不是 mysqli?
在 PHP 中,连接数据库主要有两种方式:mysqli 和 PDO。
mysqli 只能用于 MySQL,而 PDO (PHP Data Objects) 支持多种数据库,包括 MySQL、PostgreSQL、SQLite 等。PDO 的核心价值在于它提供了统一的接口结构,也就是所谓的“数据库抽象层”。
这意味着:
- 如果未来从 MySQL 切换到 PostgreSQL,只需修改 DSN。
相比之下,使用 mysqli 时,一旦更换数据库,代码往往需要重写。从长期维护和扩展性考虑,PDO 更具优势。
使用 PDO 连接 MySQL
建立数据库连接前,需要准备四项信息:主机名(host)、数据库名称(dbname)、用户名、密码。
<?php$dsn = 'mysql:dbname=my_database;host=localhost;charset=utf8mb4';$user = 'db_user';$password = 'password123';try {$dbh = new PDO($dsn, $user, $password);echo"数据库连接成功"; // 可选:释放连接$dbh = null;} catch (PDOException $e) {echo"数据库连接失败"; // 调试阶段可输出: // echo$e->getMessage();exit();}
关键点说明
1. DSN(数据源名称)
DSN 是一个字符串,用于定义数据库类型与连接参数,例如:mysql:dbname=数据库名;host=主机;charset=utf8mb4。建议始终指定 charset=utf8mb4,避免乱码问题,并确保字符集完整支持。
2. 必须使用 try-catch
数据库连接失败的原因可能包括:用户名或密码错误、数据库不存在、数据库服务未启动、权限不足等。使用 try-catch 可以避免程序直接报致命错误,并允许你进行统一处理。
3. 生产环境不要输出详细错误
不要在正式环境中直接输出 $e->getMessage()。错误信息可能包含数据库主机名或账号信息,应记录到日志中,而不是展示给用户。
推荐的 PDO 标准配置
在实际项目中,建议传入第四个参数 —— 选项数组,用于统一控制 PDO 行为。
<?php$options = [ PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false,];try {$dbh = new PDO($dsn, $user, $password, $options);echo"使用标准配置连接成功";} catch (PDOException $e) { error_log($e->getMessage());}
三个核心配置解释
| |
|---|
PDO::ATTR_ERRMODE | 设置为 PDO::ERRMODE_EXCEPTION,让所有 SQL 错误抛出异常,便于统一捕获。 |
PDO::ATTR_DEFAULT_FETCH_MODE | 设置为 PDO::FETCH_ASSOC,默认返回关联数组,避免数据冗余。 |
PDO::ATTR_EMULATE_PREPARES | 设置为 false,关闭模拟预处理,强制使用原生预处理,提高安全性。 |
使用 PDO 连接 PostgreSQL
PDO 的结构是统一的,切换数据库时通常只需要修改 DSN。示例:
$dsn = 'pgsql:dbname=my_database;host=localhost;port=5432';$user = 'postgres_user';$password = 'password123';
主要区别在于前缀从 mysql: 改为 pgsql:,且默认端口不同(MySQL 为 3306,PostgreSQL 为 5432)。其余代码保持一致。
常见错误排查清单
- 连接信息是否正确: 检查数据库名拼写、用户权限及密码。
- 主机与端口是否正确: Docker 或远程服务器中,
localhost 可能无效。 - 是否启用 PDO 扩展: 在
php.ini 中确认 extension=pdo_mysql 或 extension=pdo_pgsql 是否已取消注释。 - localhost 与 127.0.0.1 的区别: 在 Linux/macOS 中,
localhost 走 Unix Socket,而 127.0.0.1 走 TCP/IP。
总结
PDO 是当前 PHP 中进行数据库交互的主流方案。它提供统一接口、支持多种数据库,并且具备更清晰的异常机制和更安全的预处理支持。在需要长期维护的项目中,优先使用 PDO 是更合理的技术选择。