当前位置: 首页> 最新文章列表> 如何使用 PDOStatement::rowCount 获取 UPDATE 查询的实际影响行数

如何使用 PDOStatement::rowCount 获取 UPDATE 查询的实际影响行数

gitbox 2025-05-28

在使用 PHP 的 PDO 操作数据库时,PDOStatement::rowCount() 是一个常见却常被误解的方法。尤其是在执行 UPDATEDELETE 语句后,我们常用它来判断是否真的“更新”或“删除”了数据。但你知道它背后的行为细节吗?

基本用法

$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'password');
$sql = "UPDATE users SET status = 'active' WHERE last_login > :date";
$stmt = $pdo->prepare($sql);
$stmt->execute([':date' => '2024-01-01']);

echo "更新了 " . $stmt->rowCount() . " 行记录";

这段代码执行一条 UPDATE 语句,使用 rowCount() 获取实际影响的行数。

注意事项

  1. 只对 DML 有效rowCount()INSERTUPDATEDELETE 后能正确返回受影响行数。但对 SELECT,MySQL 驱动通常返回 0。

  2. 与数据变更有关:如果目标行数据没有真正变化(即新值和旧值一样),rowCount() 可能返回 0。这是 MySQL 的行为,而不是 PDO 的问题。

  3. 不等于“匹配行数”:它统计的是“实际发生变化的行数”,而非“符合 WHERE 条件的行数”。

示例:检测用户信息是否被更新

$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':email' => '[email protected]', ':id' => 1]);

if ($stmt->rowCount() > 0) {
    echo "用户信息已更新";
} else {
    echo "没有更新,可能是数据未变化或 ID 不存在";
}

掌握 rowCount() 的行为,可以让你的业务逻辑更严谨,避免误判数据库操作是否生效。更多实例可查看 https://gitbox.net/docs/pdo-update