PHP PDO(PHP Data Objects)提供了一种轻量级、一致的接口来访问多种数据库,包括MySQL,相比传统的MySQLi扩展,PDO具有更好的可移植性和预处理语句支持,能有效防止SQL注入攻击,下面将详细介绍如何使用PDO操作MySQL数据库。

需要建立与MySQL数据库的连接,连接时需指定数据源名称(DSN)、用户名和密码,DSN的格式为mysql:host=主机名;dbname=数据库名;charset=字符集。
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8';
$username = 'root';
$password = '';
try {
$pdo = new PDO($dsn, $username, $password);
$pdo>setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
die('连接失败: ' . $e>getMessage());
}
这里设置了错误模式为ERRMODE_EXCEPTION,使PDO在发生错误时抛出异常,便于错误处理。
接下来是执行SQL语句,PDO支持多种执行方式,包括查询(query())和执行(exec())。query()用于返回结果集的查询(如SELECT),而exec()用于执行无返回结果的语句(如INSERT、UPDATE、DELETE)。
// 插入数据
$sql = "INSERT INTO users (name, email) VALUES ('John', 'john@example.com')";
$affectedRows = $pdo>exec($sql);
echo "影响了 $affectedRows 行数据";
预处理语句是PDO的重要特性,能有效防止SQL注入,使用预处理语句时,需先准备SQL语句,然后绑定参数并执行。
$stmt = $pdo>prepare("INSERT INTO users (name, email) VALUES (:name, :email)");
$stmt>bindParam(':name', $name);
$stmt>bindParam(':email', $email);
$name = 'Alice';
$email = 'alice@example.com';
$stmt>execute();
也可以使用问号占位符:

$stmt = $pdo>prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt>execute(['Bob', 'bob@example.com']);
查询数据时,可以使用fetch()方法逐行获取结果,或fetchAll()获取所有结果,常见的获取模式有:
PDO::FETCH_ASSOC:返回关联数组PDO::FETCH_NUM:返回索引数组PDO::FETCH_OBJ:返回对象
$stmt = $pdo>query("SELECT * FROM users");
while ($row = $stmt>fetch(PDO::FETCH_ASSOC)) {
echo $row['name'] . ': ' . $row['email'] . '<br>';
}
事务处理也是PDO的重要功能,通过beginTransaction()、commit()和rollBack()方法,可以确保一组SQL语句要么全部执行,要么全部回滚。
try {
$pdo>beginTransaction();
$pdo>exec("UPDATE accounts SET balance = balance 100 WHERE id = 1");
$pdo>exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
$pdo>commit();
} catch (Exception $e) {
$pdo>rollBack();
echo '事务失败: ' . $e>getMessage();
}
以下是PDO常用方法的归纳:
| 方法 | 功能 |
|---|---|
query() |
执行SQL查询并返回结果集 |
exec() |
执行SQL语句并受影响的行数 |
prepare() |
准备SQL语句并返回PDOStatement对象 |
bindParam() |
绑定参数到预处理语句 |
execute() |
执行预处理语句 |
fetch() |
获取结果的一行 |
fetchAll() |
获取结果的所有行 |
beginTransaction() |
开始事务 |
commit() |
提交事务 |
rollBack() |
回滚事务 |
使用完毕后应关闭连接:
$pdo = null;
相关问答FAQs:

-
问:PDO与MySQLi有什么区别?
答:PDO支持多种数据库(如MySQL、PostgreSQL、SQLite等),而MySQLi仅支持MySQL,PDO的预处理语句语法更统一,且支持命名占位符(如name),而MySQLi仅支持问号占位符,PDO的API设计更简洁,错误处理更灵活。 -
问:如何使用PDO处理大量数据以提高性能?
答:对于大量数据操作,可以采用以下方法优化性能:- 使用
PDO::ATTR_EMULATE_PREPARES为false,让数据库直接执行预处理语句; - 分批处理数据,避免一次性加载过多记录;
- 禁用自动提交(
$pdo>setAttribute(PDO::ATTR_AUTOCOMMIT, false)),手动控制事务提交; - 使用
PDO::FETCH_COLUMN模式仅获取需要的列,减少内存消耗。
- 使用
原创文章,发布者:酷盾叔,转转请注明出处:https://www.kd.cn/ask/302564.html