在使用 PHP 操作数据库时,我们经常需要知道某条 SQL 语句执行后究竟影响了多少行数据。比如,在执行 UPDATE、DELETE 或某些 INSERT 操作时,了解受影响的行数有助于我们判断操作是否成功,或者是否需要进行下一步处理。
这时,PDOStatement::rowCount() 函数就派上用场了。本文将介绍如何使用 rowCount() 方法,并结合实际代码示例演示如何根据返回的行数进行条件判断。
rowCount() 是 PDOStatement 类的一个方法,用于返回最后一次执行的 SQL 语句所影响的行数。这个函数的返回值通常用于判断数据是否真正被更新或删除。
public int PDOStatement::rowCount();
注意:rowCount() 在不同数据库驱动下的行为可能略有不同,尤其是用于 SELECT 查询时可能不返回预期结果。
以下是一个更新数据库中用户信息的示例。在执行 SQL 后,我们使用 rowCount() 判断是否有数据被真正修改。
<?php
// 数据库连接信息
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8';
$username = 'dbuser';
$password = 'dbpass';
try {
// 创建 PDO 实例
$pdo = new PDO($dsn, $username, $password);
// 设置异常错误处理
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// 准备 SQL 更新语句
$sql = "UPDATE users SET email = :email WHERE id = :id";
$stmt = $pdo->prepare($sql);
// 绑定参数
$stmt->bindValue(':email', '[email protected]');
$stmt->bindValue(':id', 1);
// 执行语句
$stmt->execute();
// 获取受影响的行数
$affectedRows = $stmt->rowCount();
// 条件判断
if ($affectedRows > 0) {
echo "用户信息已更新,共影响 {$affectedRows} 行。";
} else {
echo "没有用户信息被修改,可能是因为数据没有变化。";
}
} catch (PDOException $e) {
echo "数据库错误:" . $e->getMessage();
}
?>
$sql = "DELETE FROM users WHERE last_login < NOW() - INTERVAL 1 YEAR";
$stmt = $pdo->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() > 0) {
echo "已成功删除不活跃用户。";
} else {
echo "没有找到需要删除的用户。";
}
某些数据库(如 MySQL)允许批量插入后使用 rowCount() 返回受影响的行数:
$sql = "INSERT INTO logs (message, created_at) VALUES
('操作1', NOW()),
('操作2', NOW())";
$stmt = $pdo->prepare($sql);
$stmt->execute();
if ($stmt->rowCount() >= 2) {
echo "日志已批量写入。";
} else {
echo "日志写入失败或不完整。";
}
对于 SELECT 查询,rowCount() 行为不确定:通常建议配合 fetchAll() 或 fetch() 来判断是否有结果。
使用正确的数据库驱动:有些数据库(如 SQLite)在某些操作中对 rowCount() 的支持有限。
不要误认为 rowCount() 是执行成功的唯一标志:它只表示“受影响的行数”,并不等于“操作成功”,因为更新相同的数据可能不会改变行数。