PHP 入门教程
PHP PDO 基础
本教程共 65 篇 · 第 49 篇 · 更新于 2026-07-24 · 约 7 分钟阅读
PHPPHP8PDO数据库抽象层DSN错误处理预处理
49. PHP PDO 基础
本节目标:理解 PDO 的设计思想,掌握 PDO 连接数据库的方式,能够配置不同的错误处理模式。
PDO(PHP Data Objects)是 PHP 内置的数据库抽象层。使用 PDO,你可以用同一套代码连接 MySQL、SQLite、PostgreSQL 等多种数据库。
1. 为什么选择 PDO
| 优势 | 说明 |
|---|---|
| 数据库无关 | 切换数据库只需改 DSN,业务代码不变 |
| 预处理语句 | 原生支持参数绑定,有效防止 SQL 注入 |
| 错误处理灵活 | 支持静默、警告、异常三种模式 |
| 面向对象 | 统一的 API,学习一次到处使用 |
Note如果项目确定只用 MySQL,
mysqli也是完全可行的选择。PDO 更适合需要兼容多种数据库的场景。
2. PDO 连接 MySQL
连接数据库需要 DSN(Data Source Name)字符串,包含数据库类型、主机、库名等信息。
<?php
$host = 'localhost';
$db = 'my_app';
$user = 'root';
$pass = '123456';
$charset = 'utf8mb4';
$dsn = "mysql:host=$host;dbname=$db;charset=$charset";
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
try {
$pdo = new PDO($dsn, $user, $pass, $options);
echo '连接成功';
} catch (PDOException $e) {
die('数据库连接失败:' . $e->getMessage());
}
常用 DSN 格式
| 数据库 | DSN 示例 |
|---|---|
| MySQL | mysql:host=localhost;dbname=test;charset=utf8mb4 |
| SQLite | sqlite:/path/to/database.db |
| PostgreSQL | pgsql:host=localhost;dbname=test |
3. 错误处理模式
PDO 提供三种错误处理模式,通过 PDO::ATTR_ERRMODE 设置。
异常模式(推荐)
<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 表不存在时会抛出 PDOException
$pdo->query("SELECT * FROM not_exist_table");
警告模式
<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
// 发出 E_WARNING 级别的警告,但不中断执行
$pdo->query("SELECT * FROM not_exist_table");
静默模式(默认)
<?php
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
// 不报错,需手动检查错误
$stmt = $pdo->query("SELECT * FROM not_exist_table");
if ($stmt === false) {
echo '错误:' . $pdo->errorInfo()[2];
}
Tip开发阶段使用
ERRMODE_EXCEPTION,生产环境也建议保持,配合try-catch统一处理异常。
4. 执行简单查询
<?php
$pdo = new PDO('mysql:host=localhost;dbname=my_app;charset=utf8mb4', 'root', '123456');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 查询
$stmt = $pdo->query('SELECT id, username FROM users');
while ($row = $stmt->fetch()) {
echo $row['username'] . "<br>";
}
// 获取单行
$id = 1;
$stmt = $pdo->query("SELECT * FROM users WHERE id = $id");
$user = $stmt->fetch();
Note上面的
query()示例直接将变量拼入 SQL,仅用于演示。实际开发必须使用预处理语句防止注入。
5. PDO 与 mysqli 对比
| 特性 | PDO | mysqli |
|---|---|---|
| 多数据库支持 | 是 | 仅 MySQL |
| 预处理语句 | 是 | 是 |
| 面向对象 | 是 | 是(也支持过程式) |
| 事务支持 | 是 | 是 |
| 存储过程 | 是 | 是 |
Note两种扩展各有优势,不存在谁绝对优于谁。选择依据是项目需求:只用 MySQL 时两者皆可,需要兼容多种数据库时选 PDO。详见第 48 章。
小结
PDO 提供了统一、安全的数据库访问层。掌握 DSN 格式和错误模式配置后,配合预处理语句,就能写出健壮的数据库代码。
来源:参考了 php-the-right-way「PDO Extension」、PHP 官方文档,改写后所得。