PHP PDOStatement::rowCount 教程
最后修改于 2025 年 4 月 19 日
PDOStatement::rowCount 方法返回上次 SQL 语句影响的行数。这对于检查操作的影响非常有用。
基本定义
PDOStatement::rowCount 返回上次 DELETE、INSERT 或 UPDATE 语句影响的行数。对于 SELECT 语句,行为有所不同。
语法:public PDOStatement::rowCount(): int。返回受影响的行数,类型为整数。并非所有数据库都支持 SELECT 语句的行数统计。
更新后计算受影响的行数
这显示了如何获取 UPDATE 语句修改的行数。
<?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 来验证删除。
<?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 准确地反映了已删除的行数。
计算已插入的行数
演示如何使用单个语句验证插入的行数。
<?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 语句的不一致行为。
<?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 在提交更改之前的事务中的工作方式。
<?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 的行为。
<?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 的行为。
<?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。这可用于检测操作是否未影响任何数据库行。
最佳实践
- DML 使用:最适合 INSERT、UPDATE、DELETE。
- SELECT 注意:行为因数据库驱动程序而异。
- 错误检查:验证操作是否影响了预期的行数。
- 事务:计数反映未提交的更改。
- 性能:rowCount 没有明显的额外开销。
来源
本教程介绍了 PDOStatement::rowCount 方法,并通过实际示例展示了其在不同数据库操作场景下的用法。
作者
列出 所有 PHP PDO 函数。