在使用 PHP 的 PDO 操作数据库时,PDOStatement::rowCount() 是一个常见却常被误解的方法。尤其是在执行 UPDATE 或 DELETE 语句后,我们常用它来判断是否真的“更新”或“删除”了数据。但你知道它背后的行为细节吗?
$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() 获取实际影响的行数。
只对 DML 有效:rowCount() 在 INSERT、UPDATE 和 DELETE 后能正确返回受影响行数。但对 SELECT,MySQL 驱动通常返回 0。
与数据变更有关:如果目标行数据没有真正变化(即新值和旧值一样),rowCount() 可能返回 0。这是 MySQL 的行为,而不是 PDO 的问题。
不等于“匹配行数”:它统计的是“实际发生变化的行数”,而非“符合 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。