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 函数。