当前位置: 首页> 最新文章列表> 如何通过 PDOStatement::rowCount 获取影响的行数进行条件判断

如何通过 PDOStatement::rowCount 获取影响的行数进行条件判断

gitbox 2025-05-28

在使用 PHP 操作数据库时,我们经常需要知道某条 SQL 语句执行后究竟影响了多少行数据。比如,在执行 UPDATEDELETE 或某些 INSERT 操作时,了解受影响的行数有助于我们判断操作是否成功,或者是否需要进行下一步处理。

这时,PDOStatement::rowCount() 函数就派上用场了。本文将介绍如何使用 rowCount() 方法,并结合实际代码示例演示如何根据返回的行数进行条件判断。

一、什么是 PDOStatement::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();
}
?>

三、常见场景与使用技巧

1. 删除操作后确认删除数量

$sql = "DELETE FROM users WHERE last_login < NOW() - INTERVAL 1 YEAR";
$stmt = $pdo->prepare($sql);
$stmt->execute();

if ($stmt->rowCount() > 0) {
    echo "已成功删除不活跃用户。";
} else {
    echo "没有找到需要删除的用户。";
}

2. 批量插入后检查是否插入成功

某些数据库(如 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 "日志写入失败或不完整。";
}

四、注意事项

  1. 对于 SELECT 查询,rowCount() 行为不确定:通常建议配合 fetchAll()fetch() 来判断是否有结果。

  2. 使用正确的数据库驱动:有些数据库(如 SQLite)在某些操作中对 rowCount() 的支持有限。

  3. 不要误认为 rowCount() 是执行成功的唯一标志:它只表示“受影响的行数”,并不等于“操作成功”,因为更新相同的数据可能不会改变行数。