ZetCode

PHP PDOStatement::rowCount 教程

最后修改于 2025 年 4 月 19 日

PDOStatement::rowCount 方法返回上次 SQL 语句影响的行数。这对于检查操作的影响非常有用。

基本定义

PDOStatement::rowCount 返回上次 DELETE、INSERT 或 UPDATE 语句影响的行数。对于 SELECT 语句,行为有所不同。

语法:public PDOStatement::rowCount(): int。返回受影响的行数,类型为整数。并非所有数据库都支持 SELECT 语句的行数统计。

更新后计算受影响的行数

这显示了如何获取 UPDATE 语句修改的行数。

pdo_rowcount_update.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('UPDATE users SET active = 1 WHERE last_login > ?');
    $stmt->execute([strtotime('-30 days')]);
    
    $count = $stmt->rowCount();
    echo "Updated $count user records";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此示例更新用户记录并显示修改了多少条。rowCount 方法返回 UPDATE 操作更改的行数。

计算已删除的行数

演示在 DELETE 操作后使用 rowCount 来验证删除。

pdo_rowcount_delete.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('DELETE FROM temp_sessions WHERE expires < ?');
    $stmt->execute([time()]);
    
    $deleted = $stmt->rowCount();
    echo "Deleted $deleted expired sessions";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此示例删除过期的会话并报告删除了多少条。在此情况下,rowCount 准确地反映了已删除的行数。

计算已插入的行数

演示如何使用单个语句验证插入的行数。

pdo_rowcount_insert.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('INSERT INTO log_entries (message) VALUES (?), (?), (?)');
    $stmt->execute(['Startup', 'Initialization', 'Ready']);
    
    $inserted = $stmt->rowCount();
    echo "Inserted $inserted log entries";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

此示例使用一个语句插入多行。rowCount 返回插入的总行数,在本例中为 3。

SELECT 语句行为

演示 rowCount 与 SELECT 语句的不一致行为。

pdo_rowcount_select.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->query('SELECT * FROM products WHERE stock > 0');
    $rows = $stmt->fetchAll();
    
    echo "Fetched " . count($rows) . " products\n";
    echo "rowCount reports: " . $stmt->rowCount() . " products";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

对于 MySQL,rowCount 可能不会返回 SELECT 结果计数。请始终使用 fetchAll 或类似方法来可靠地计数 SELECT 结果。

事务和 rowCount

演示 rowCount 在提交更改之前的事务中的工作方式。

pdo_rowcount_transaction.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $pdo->beginTransaction();
    
    $stmt = $pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE user_id = ?');
    $stmt->execute([100, 1]);
    $affected = $stmt->rowCount();
    
    echo "Temporarily affected $affected rows (not committed yet)";
    
    $pdo->commit();
} catch (PDOException $e) {
    $pdo->rollBack();
    echo "Error: " . $e->getMessage();
}

rowCount 会立即报告受影响的行数,即使在事务中也是如此。计数反映了如果提交将会发生的变化,但这些变化尚未永久保存。

多个语句

演示执行多个语句时 rowCount 的行为。

pdo_rowcount_multiple.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt1 = $pdo->prepare('UPDATE products SET views = views + 1 WHERE id = ?');
    $stmt1->execute([5]);
    echo "Updated " . $stmt1->rowCount() . " product\n";
    
    $stmt2 = $pdo->prepare('DELETE FROM cart_items WHERE session_id = ?');
    $stmt2->execute(['old_session']);
    echo "Deleted " . $stmt2->rowCount() . " cart items";
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

每个语句都有自己的行数计数。计数是每个 PDOStatement 对象特有的,彼此之间不会相互干扰。

零行受影响

演示当没有行匹配操作标准时 rowCount 的行为。

pdo_rowcount_zero.php
<?php

declare(strict_types=1);

try {
    $pdo = new PDO('mysql:host=localhost;dbname=testdb', 'user', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    
    $stmt = $pdo->prepare('UPDATE users SET status = ? WHERE user_id = ?');
    $stmt->execute(['inactive', 9999]);
    
    if ($stmt->rowCount() === 0) {
        echo "No user with ID 9999 exists";
    } else {
        echo "Updated user status";
    }
} catch (PDOException $e) {
    echo "Error: " . $e->getMessage();
}

当没有行匹配操作标准时,rowCount 返回 0。这可用于检测操作是否未影响任何数据库行。

最佳实践

来源

PHP rowCount 文档

本教程介绍了 PDOStatement::rowCount 方法,并通过实际示例展示了其在不同数据库操作场景下的用法。

作者

我叫 Jan Bodnar,是一名热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直撰写编程文章。迄今为止,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP PDO 函数