PHP PDO 类
最后修改于 2025 年 4 月 19 日
PHP PDO(PHP Data Objects)类提供了一个在 PHP 中访问数据库的一致接口。它支持多种数据库系统,并使用相同的方法。
基本定义
PDO 是一个数据库访问层,提供了一种访问多个数据库的统一方法。它不提供特定于数据库的语法,但允许使用预处理语句。
语法:new PDO(string $dsn, string $username = null, string $password = null, array $options = null)
。DSN 包含数据库类型、主机和数据库名称。
PDO 连接示例
这展示了如何使用 PDO 连接到 MySQL 数据库。
<?php declare(strict_types=1); $host = 'localhost'; $dbname = 'testdb'; $user = 'user'; $pass = 'password'; try { $pdo = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); echo "Connected successfully"; } catch (PDOException $e) { echo "Connection failed: " . $e->getMessage(); }
这创建了一个到 MySQL 数据库的连接。`setAttribute` 调用配置 PDO 在出错时抛出异常。始终在 PDO 操作中使用 try-catch。
PDO 查询示例
这演示了使用 PDO 执行一个简单的 SQL 查询。
<?php declare(strict_types=1); try { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->query('SELECT * FROM users'); while ($row = $stmt->fetch()) { echo "ID: {$row['id']}, Name: {$row['name']}\n"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这执行一个 SELECT 查询并逐行获取结果。`query` 方法返回一个 PDOStatement 对象。`fetch()` 从结果中检索下一行。
PDO 预处理语句
预处理语句可防止 SQL 注入并提高性能。
<?php declare(strict_types=1); try { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)'); $stmt->execute(['John Doe', 'john@example.com']); echo "New record created successfully"; } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这使用了带有位置占位符的预处理语句。`prepare` 方法创建语句模板。`execute` 使用提供的值运行它。
PDO 命名参数
命名参数使预处理语句更具可读性和可维护性。
<?php declare(strict_types=1); try { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email'); $stmt->execute(['email' => 'john@example.com']); $user = $stmt->fetch(); if ($user) { echo "User found: {$user['name']}"; } else { echo "User not found"; } } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这在预处理语句中使用了命名参数。冒号前缀标识参数。`execute` 方法接受一个关联数组的值。
PDO 事务
事务确保多个操作作为一个单一的原子单元执行。
<?php declare(strict_types=1); try { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $pdo->beginTransaction(); $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1"); $pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE user_id = 2"); $pdo->commit(); echo "Transaction completed successfully"; } catch (PDOException $e) { $pdo->rollBack(); echo "Transaction failed: " . $e->getMessage(); }
这演示了一个资金转账事务。`beginTransaction` 启动它。`commit` 使更改永久生效。`rollBack` 在失败时撤销更改。
PDO 获取模式
PDO 提供了从查询中获取结果集的不同方式。
<?php declare(strict_types=1); try { $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password'); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // Fetch as associative array $stmt = $pdo->query('SELECT * FROM users LIMIT 1'); $user = $stmt->fetch(PDO::FETCH_ASSOC); // Fetch all as objects $stmt = $pdo->query('SELECT * FROM users'); $users = $stmt->fetchAll(PDO::FETCH_OBJ); // Fetch column $stmt = $pdo->query('SELECT name FROM users'); $names = $stmt->fetchAll(PDO::FETCH_COLUMN); } catch (PDOException $e) { echo "Error: " . $e->getMessage(); }
这展示了不同的获取模式。`FETCH_ASSOC` 返回关联数组。`FETCH_OBJ` 返回 `stdClass` 对象。`FETCH_COLUMN` 获取单个列。
最佳实践
- 使用预处理语句:始终用于用户输入。
- 错误处理:对数据库错误使用异常。
- 关闭连接:让 PDO 自动处理。
- 绑定参数:对复杂查询显式绑定。
- 字符集:在 DSN 中设置或连接后设置。
来源
本教程介绍了 PHP PDO 类,并通过实际示例展示了不同场景下的数据库操作。
作者
列出 所有 PHP PDO 函数。