PHP PDO连接数据库操作示例具体步骤是怎样的?
- 虚拟主机
- 2025-12-18
- 5
PHP PDO(PHP Data Objects)提供了一种统一的方式访问多种数据库,它支持多种数据库驱动,如MySQL、PostgreSQL、SQLite等,使用PDO可以避免SQL载入攻破,提高数据库操作的安全性和灵活性,下面将详细介绍如何使用PHP PDO进行数据库连接和操作,包括连接数据库、执行查询、预处理语句、事务处理等常用操作。
PDO连接数据库
使用PDO连接数据库需要指定数据源名称(DSN)、用户名和密码,DSN的格式因数据库类型而异,例如MySQL的DSN格式为”mysql:host=localhost;dbname=testdb”,以下是一个连接MySQL数据库的示例代码:

在上述代码中,PDO::ATTR_ERRMODE设置为PDO::ERRMODE_EXCEPTION,表示启用异常模式,当发生错误时会抛出异常;PDO::ATTR_DEFAULT_FETCH_MODE设置为PDO::FETCH_ASSOC,表示默认以关联数组形式获取结果;PDO::ATTR_EMULATE_PREPARES设置为false,表示使用原生预处理语句,提高安全性。
执行查询操作
PDO提供了query()和prepare()+execute()两种方式执行查询操作。query()适用于无参数的查询,而prepare()+execute()适用于有参数的查询,可以有效防止SQL载入。

使用query()执行查询
<?php try { $stmt = $pdo>query("SELECT * FROM users"); while ($row = $stmt>fetch()) { echo $row['id'] . " " . $row['name'] . "<br>"; } } catch (PDOException $e) { echo "查询失败:" . $e>getMessage(); } ?>
使用prepare()和execute()执行预处理查询
<?php $id = 1; try { $stmt = $pdo>prepare("SELECT * FROM users WHERE id = :id"); $stmt>bindParam(':id', $id, PDO::PARAM_INT); $stmt>execute(); $user = $stmt>fetch(); echo "用户名:" . $user['name']; } catch (PDOException $e) { echo "查询失败:" . $e>getMessage(); } ?>
在上述代码中,bindParam()方法用于绑定参数,PDO::PARAM_INT表示参数类型为整数,也可以使用bindValue()方法直接绑定值,或者使用execute()数组参数绑定:

$stmt = $pdo>prepare("SELECT * FROM users WHERE id = ?"); $stmt>execute([$id]);
插入、更新和删除数据
PDO同样支持使用预处理语句进行插入、更新和删除操作,这些操作通常使用execute()方法执行。
插入数据
<?php $name = 'John Doe'; $email = 'john@example.com'; try { $stmt = $pdo>prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); $stmt>bindParam(':name', $name); $stmt>bindParam(':email', $email); $stmt>execute(); echo "插入成功,ID:" . $pdo>lastInsertId(); } catch (PDOException $e) { echo "插入失败:" . $e>getMessage(); } ?>
更新数据
<?php $id = 1; $name = 'Jane Doe'; try { $stmt = $pdo>prepare("UPDATE users SET name = :name WHERE id = :id"); $stmt>bindParam(':id', $id, PDO::PARAM_INT); $stmt>bindParam(':name', $name); $stmt>execute(); echo "更新成功,影响行数:" . $stmt>rowCount(); } catch (PDOException $e) { echo "更新失败:" . $e>getMessage(); } ?>
删除数据
<?php $id = 1; try { $stmt = $pdo>prepare("DELETE FROM users WHERE id = :id"); $stmt>bindParam(':id', $id, PDO::PARAM_INT); $stmt>execute(); echo "删除成功,影响行数:" . $stmt>rowCount(); } catch (PDOException $e) { echo "删除失败:" . $e>getMessage(); } ?>
事务处理
事务处理确保一组操作要么全部成功,要么全部失败,PDO提供了beginTransaction()、commit()和rollBack()方法来管理事务。
<?php try { $pdo>beginTransaction(); $stmt = $pdo>prepare("INSERT INTO users (name, email) VALUES (:name, :email)"); $stmt>execute(['name' => 'Alice', 'email' => 'alice@example.com']); $stmt = $pdo>prepare("UPDATE accounts SET balance = balance 100 WHERE user_id = :user_id"); $stmt>execute(['user_id' => 1]); $pdo>commit(); echo "事务提交成功!"; } catch (Exception $e) { $pdo>rollBack(); echo "事务回滚:" . $e>getMessage(); } ?>
PDO常用方法归纳
| 方法 | 描述 |
|---|---|
| query() | 执行SQL语句,返回PDOStatement对象 |
| prepare() | 准备SQL语句,返回PDOStatement对象 |
| execute() | 执行预处理语句 |
| fetch() | 获取结果集的一行 |
| fetchAll() | 获取结果集的所有行 |
| bindParam() | 绑定参数到预处理语句 |
| bindValue() | 绑定值到预处理语句 |
| rowCount() | 返回受影响的行数 |
| lastInsertId() | 返回最后插入行的ID |
| beginTransaction() | 开始事务 |
| commit() | 提交事务 |
| rollBack() | 回滚事务 |
相关问答FAQs
问题1:PDO和MySQLi有什么区别?
答:PDO(PHP Data Objects)和MySQLi都是PHP中用于数据库操作的扩展,但主要区别在于:
- 支持数据库类型:PDO支持多种数据库(MySQL、PostgreSQL、SQLite等),而MySQLi仅支持MySQL;
- API风格:PDO提供统一的API,MySQLi的API更接近MySQL原生函数;
- 预处理语句:PDO的预处理语句更灵活,支持命名参数(如name),MySQLi仅支持问号占位符;
- 面向对象:PDO完全面向对象,MySQLi同时支持面向过程和面向对象。
问题2:如何使用PDO处理大量数据?
答:处理大量数据时,可以使用PDO的fetchAll()方法一次性获取所有数据,但要注意内存消耗;对于大数据集,建议使用fetch()逐行处理,或使用PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL启用滚动游标,可以通过调整PDO::ATTR_FETCH_TABLE_NAMES等属性优化查询性能,并确保数据库索引合理。