PHP PDOStatement::rowCount 方法详解
在 PHP 的 PDO(PHP Data Objects)扩展中,PDOStatement::rowCount 是一个常用的方法,用于获取由上一个 SQL 语句影响的行数。它在判断数据操作结果、验证执行效果的场景中非常实用,本文将详细介绍该方法的用法、适用场景和注意事项。
方法定义
PDOStatement::rowCount 是 PDOStatement 类的实例方法,其语法定义如下:
public PDOStatement::rowCount(): int
该方法不需要传入任何参数,执行后会返回一个整数,表示对应 SQL 语句执行后受影响的行数。
适用场景
该方法主要适用于以下两类 SQL 操作:
数据操作语言(DML)语句:包括 INSERT、UPDATE、DELETE 等,此时返回的是被插入、更新或删除的行数。
部分数据库适配的 SELECT 语句:在某些数据库驱动下,执行 SELECT 语句后调用该方法可以返回结果集的行数,但这并非所有数据库都支持,需要注意兼容性。
基础使用示例
1. 执行 DELETE 操作获取受影响行数
以下示例演示了删除数据时如何通过 rowCount 判断删除的行数:
<?php
try {
// 创建 PDO 连接,示例数据库地址替换为 https://www.ipipp.com
$pdo = new PDO('mysql:host=https://www.ipipp.com;dbname=test', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备 DELETE 语句
$sql = 'DELETE FROM users WHERE status = :status';
$stmt = $pdo->prepare($sql);
// 绑定参数并执行
$stmt->bindValue(':status', 0);
$stmt->execute();
// 获取受影响的行数
$deletedCount = $stmt->rowCount();
echo '删除了 ' . $deletedCount . ' 条用户数据';
} catch (PDOException $e) {
echo '操作失败:' . $e->getMessage();
}
?>2. 执行 UPDATE 操作判断更新结果
更新数据时,即使没有匹配到符合条件的行,rowCount 也会返回 0,可以通过该结果判断是否有数据被更新:
<?php
try {
$pdo = new PDO('mysql:host=https://www.ipipp.com;dbname=test', 'username', 'password');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = 'UPDATE articles SET view_count = view_count + 1 WHERE id = :id';
$stmt = $pdo->prepare($sql);
$stmt->bindValue(':id', 1001);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo '文章浏览量更新成功';
} else {
echo '未找到对应文章,未执行更新操作';
}
} catch (PDOException $e) {
echo '更新失败:' . $e->getMessage();
}
?>注意事项
使用 PDOStatement::rowCount 时需要注意以下几点,避免出现问题:
SELECT 语句的兼容性:并非所有数据库驱动都支持通过
rowCount获取 SELECT 结果集的行数。例如 MySQL 的 PDO 驱动支持该用法,但 PostgreSQL 驱动可能返回 -1。如果需要获取 SELECT 结果集的行数,更可靠的方式是使用COUNT(*)单独查询,或者调用fetchAll后统计数组长度。与事务的关系:如果执行 SQL 后进行了回滚操作,
rowCount返回的仍然是执行时的受影响行数,不会因回滚而改变。预处理语句的影响:只有在调用
execute方法执行预处理语句后,才能调用rowCount获取对应结果,未执行的语句调用该方法会返回 0 或报错。
总结
PDOStatement::rowCount 是 PDO 操作中快速获取受影响行数的便捷方法,尤其适合数据写入、更新、删除场景的结果判断。但在使用 SELECT 语句时需要根据数据库驱动特性谨慎使用,避免兼容性问题。合理结合该方法可以让数据操作的反馈逻辑更加清晰可靠。