第11章:PDO 数据库操作

本章学习目标

  • 掌握PDO的基本概念和优势
  • 学会使用PDO连接不同类型的数据库
  • 熟练运用PDO进行CRUD操作
  • 理解预处理语句的工作原理
  • 掌握事务处理技术
  • 学会数据库操作的安全编程

本章内容概览

本章将深入学习PHP数据对象(PDO)的使用,PDO是PHP提供的数据库抽象层,支持多种数据库系统。通过学习PDO,你将能够编写安全、高效、可移植的数据库操作代码。

PDO简介

PDO(PHP Data Objects)是PHP5中引入的数据库抽象层,提供了一致的接口来访问多种数据库系统。

PDO的优势

  1. 数据库无关性:统一接口支持多种数据库
  2. 安全性:内置预处理语句防止SQL注入
  3. 性能:原生驱动,性能优异
  4. 错误处理:完善的异常处理机制
  5. 功能丰富:支持事务、存储过程等高级特性

支持的数据库

  • 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提供三种错误处理模式:

  1. PDO::ERRMODE_SILENT:静默模式(默认)
  2. PDO::ERRMODE_WARNING:警告模式
  3. PDO::ERRMODE_EXCEPTION:异常模式(推荐)

PDO与MySQLi的比较

特性PDOMySQLi
数据库支持多种数据库仅MySQL
面向对象支持支持
面向过程不支持支持
预处理语句支持支持
命名参数支持不支持
事务支持支持支持
存储过程支持支持

PDO工作原理

PDO的工作流程如下:

  1. 加载驱动:根据DSN加载相应的数据库驱动
  2. 建立连接:创建到数据库的连接
  3. 准备语句:预处理SQL语句
  4. 执行查询:执行SQL语句
  5. 获取结果:获取查询结果
  6. 关闭连接:释放资源
// 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操作
  • 预处理语句的应用
  • 事务处理示例
  • 错误处理机制

学习路径建议

为了更好地掌握本章内容,建议按照以下顺序学习:

  1. 首先理解PDO的基本概念和优势
  2. 学习PDO的连接和配置
  3. 掌握基本的查询和操作方法
  4. 深入学习预处理语句
  5. 理解事务处理机制
  6. 通过实际项目巩固知识

最佳实践提示

  1. 始终使用预处理语句:防止SQL注入
  2. 使用异常处理:更好地管理错误
  3. 合理使用事务:保证数据一致性
  4. 及时关闭连接:释放系统资源
  5. 使用命名参数:提高代码可读性
  6. 验证用户输入:在绑定参数前验证数据

后续学习内容

掌握PDO基础后,可以继续学习:

  • 数据库设计优化
  • 查询性能调优
  • 连接池和缓存技术
  • 数据库安全防护
  • NoSQL数据库操作

通过本章的学习,你将能够使用PDO构建安全、高效、可维护的数据库操作代码,为后续的Web应用开发打下坚实的基础。