第11章:PDO 数据库操作
本章学习目标
- 掌握PDO的基本概念和优势
- 学会使用PDO连接不同类型的数据库
- 熟练运用PDO进行CRUD操作
- 理解预处理语句的工作原理
- 掌握事务处理技术
- 学会数据库操作的安全编程
本章内容概览
本章将深入学习PHP数据对象(PDO)的使用,PDO是PHP提供的数据库抽象层,支持多种数据库系统。通过学习PDO,你将能够编写安全、高效、可移植的数据库操作代码。
PDO简介
PDO(PHP Data Objects)是PHP5中引入的数据库抽象层,提供了一致的接口来访问多种数据库系统。
PDO的优势
- 数据库无关性:统一接口支持多种数据库
- 安全性:内置预处理语句防止SQL注入
- 性能:原生驱动,性能优异
- 错误处理:完善的异常处理机制
- 功能丰富:支持事务、存储过程等高级特性
支持的数据库
- MySQL
- PostgreSQL
- SQLite
- SQL Server
- Oracle
- Firebird
- IBM DB2
- 等多种数据库
PDO核心概念
DSN(数据源名称)
DSN是连接数据库的字符串,包含数据库类型、主机、数据库名等信息。
// MySQL DSN
$dsn = "mysql:host=localhost;dbname=test;charset=utf8mb4";
// PostgreSQL DSN
$dsn = "pgsql:host=localhost;dbname=test";
// SQLite DSN
$dsn = "sqlite:/path/to/database.db";
连接选项
PDO支持丰富的连接选项,用于控制连接行为。
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
错误处理模式
PDO提供三种错误处理模式:
- PDO::ERRMODE_SILENT:静默模式(默认)
- PDO::ERRMODE_WARNING:警告模式
- PDO::ERRMODE_EXCEPTION:异常模式(推荐)
PDO与MySQLi的比较
| 特性 | PDO | MySQLi |
|---|---|---|
| 数据库支持 | 多种数据库 | 仅MySQL |
| 面向对象 | 支持 | 支持 |
| 面向过程 | 不支持 | 支持 |
| 预处理语句 | 支持 | 支持 |
| 命名参数 | 支持 | 不支持 |
| 事务支持 | 支持 | 支持 |
| 存储过程 | 支持 | 支持 |
PDO工作原理
PDO的工作流程如下:
- 加载驱动:根据DSN加载相应的数据库驱动
- 建立连接:创建到数据库的连接
- 准备语句:预处理SQL语句
- 执行查询:执行SQL语句
- 获取结果:获取查询结果
- 关闭连接:释放资源
// PDO工作流程示例
try {
// 1. 加载驱动 + 2. 建立连接
$pdo = new PDO($dsn, $username, $password, $options);
// 3. 准备语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
// 4. 执行查询
$stmt->execute(['id' => $userId]);
// 5. 获取结果
$user = $stmt->fetch();
} catch (PDOException $e) {
// 错误处理
echo "错误: " . $e->getMessage();
}
// 6. 关闭连接(自动执行)
$pdo = null;
PDO安全特性
预处理语句
预处理语句是PDO最重要的安全特性,有效防止SQL注入攻击。
// 不安全的SQL拼接(容易受到SQL注入攻击)
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
// 安全的预处理语句
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
参数绑定
PDO支持位置参数和命名参数两种绑定方式。
// 位置参数
$stmt = $pdo->prepare("SELECT * FROM users WHERE age > ? AND status = ?");
$stmt->execute([18, 'active']);
// 命名参数
$stmt = $pdo->prepare("SELECT * FROM users WHERE age > :min_age AND status = :status");
$stmt->execute(['min_age' => 18, 'status' => 'active']);
本章实践项目
在本章中,我们将通过一个完整的学生管理系统来实践PDO的各种功能:
- 数据库连接配置
- 学生信息的CRUD操作
- 预处理语句的应用
- 事务处理示例
- 错误处理机制
学习路径建议
为了更好地掌握本章内容,建议按照以下顺序学习:
- 首先理解PDO的基本概念和优势
- 学习PDO的连接和配置
- 掌握基本的查询和操作方法
- 深入学习预处理语句
- 理解事务处理机制
- 通过实际项目巩固知识
最佳实践提示
- 始终使用预处理语句:防止SQL注入
- 使用异常处理:更好地管理错误
- 合理使用事务:保证数据一致性
- 及时关闭连接:释放系统资源
- 使用命名参数:提高代码可读性
- 验证用户输入:在绑定参数前验证数据
后续学习内容
掌握PDO基础后,可以继续学习:
- 数据库设计优化
- 查询性能调优
- 连接池和缓存技术
- 数据库安全防护
- NoSQL数据库操作
通过本章的学习,你将能够使用PDO构建安全、高效、可维护的数据库操作代码,为后续的Web应用开发打下坚实的基础。