PDO执行SQL如何获取行数

浅枫大大_3563

浅枫大大_3563

2026-08-22

877人浏览

原创

pdo::rowcount() 对 select 不可靠,应改用 count(*) 单独查询总数;仅当结果极小且需多次遍历时才可用 fetchall()+count()。

pdo执行sql如何获取行数

PDO::rowCount() 对 SELECT 语句不可靠

直接调用 PDOStatement::rowCount() 获取 SELECT 查询的行数,在大多数 PDO 驱动(如 mysqlpgsqlsqlsrv)下返回的是 0 或未定义值,不是真实结果集行数。这是 PDO 规范明确允许的行为——它只保证对 INSERTUPDATEDELETE 返回准确影响行数,而对 SELECT 不作承诺。

常见错误现象:
- 执行 $stmt->execute(); var_dump($stmt->rowCount()); 输出 0,即使查询返回了 100 行;
- 在 MySQL 中启用 PDO::MYSQL_ATTR_USE_BUFFERED_QUERY 后看似能返回正确值,但这是驱动特例,不能跨数据库移植;
- 依赖 rowCount() 做分页判断或空结果处理,导致逻辑错乱。

安全可靠的方法:用 COUNT(*) 单独查总数

真正可移植、高效、不加载数据到内存的方式,是把“查数据”和“查总行数”拆成两个独立 SQL:

  • 先执行 SELECT COUNT(*) FROM table WHERE ... 获取精确总数,再用 fetchColumn() 提取数值;
  • 再执行实际的 SELECT * FROM table WHERE ... LIMIT ... 拿分页数据;
  • 避免在 PHP 层用 fetchAll() + count(),尤其当结果可能上万行时,会吃光内存并拖慢响应。

示例:

$countStmt = $pdo->prepare("SELECT COUNT(*) FROM users WHERE status = ?");
$countStmt->execute([1]);
$total = (int) $countStmt->fetchColumn();
<p>$dataStmt = $pdo->prepare("SELECT id, name FROM users WHERE status = ? ORDER BY id LIMIT 20 OFFSET 0");
$dataStmt->execute([1]);
$rows = $dataStmt->fetchAll(PDO::FETCH_ASSOC);
</p>

何时可以放心用 fetchAll() + count()

仅当满足以下全部条件时,才考虑一次性拉取再统计:

Musico
Musico

Musico是一款可实时生成自适应音乐的 AI 作曲引擎。

下载
  • 业务确定结果集极小(比如固定配置表,最多几十行);
  • 后续还需反复遍历该结果集多次(否则单次 fetch() 循环更省内存);
  • 不介意多一次数据传输和 PHP 数组构造开销;
  • 你用的是 sqlite 或某些老版本 mysql 驱动,且已实测 rowCount() 确实返回了正确值(但别写死逻辑)。

示例(仅限小数据):

$stmt = $pdo->query("SELECT name FROM countries");
$rows = $stmt->fetchAll(PDO::FETCH_COLUMN);
$cnt = count($rows); // 安全,因为 $rows 是明确的数组

注意 sqlsrv 和 pgsql 的特殊行为

SQL Server(sqlsrv)和 PostgreSQL(pgsql)驱动在默认游标模式下,rowCount()SELECT 通常返回 -1,表示“无法确定”。如果你启用了客户端游标(如 PDO::ATTR_CURSOR => PDO::CURSOR_SCROLL),部分版本可能返回正确值,但:

  • 这会显著增加数据库连接资源占用;
  • PHP 层仍需调用 fetch() 多次才能“推进”游标,实际并未节省操作;
  • 一旦切换数据库类型(比如从 SQL Server 迁移到 MySQL),代码立即失效。

所以不要为兼容某一个驱动去调整游标模式来“修复” rowCount() —— 本质是误用 API。

最易被忽略的一点:很多人以为 PDO::exec() 能用于 SELECT,但它根本不会返回结果集,调用后只会报错或静默失败。查行数这件事,必须区分清楚“执行无结果语句”和“执行有结果查询”两种场景。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4034

6

Aionclaw智能助手介绍
Aionclaw智能助手介绍

本专题汇总了AionClaw(AI龙虾助手)的功能介绍与在线使用入口。AionClaw是杭州趣猿人工智能有限公司推出的桌面级AI智能体,能直接在电脑上读写文件、运行脚本、操作浏览器,自动交付Word、PPT、Excel等成品。

2026.09.20

0

13

AionClaw AI智能体与电脑自动化任务执行功能使用教程
AionClaw AI智能体与电脑自动化任务执行功能使用教程

AionClaw专题整理AI智能体与电脑自动化相关功能使用教程,涵盖安装部署、AI任务执行、Skills技能、文件处理、浏览器控制、电脑操作、持久记忆、聊天工具连接以及办公、编程和内容创作等功能,帮助用户快速掌握AionClaw的实际使用方法。

2026.09.20

0

15

AI视频生成软件推荐
AI视频生成软件推荐

本专题汇总了当前主流的AI视频生成软件推荐与排行榜单,涵盖seko、AniShort、剧云、Lovart、LiblibAI及立刻mv等热门工具。同时整理了各软件在文生视频、图生视频、时长限制、画质表现及免费额度等方面的差异对比,助您快速选对适合创作需求的AI视频生成工具。

2026.09.16

160

9

ai生成视频的工具免费版合集
ai生成视频的工具免费版合集

本专题汇总了当前免费AI生成视频工具的排行榜与推荐清单,涵盖seko、讯飞智作、AniShort及剧云、Lovart等多模型集成平台。同时整理了各工具的免费额度、输出时长、水印政策及适用场景差异,助您快速选择合适工具开启AI视频创作。

2026.09.16

60

10

Pandas时间序列分析与可视化报表
Pandas时间序列分析与可视化报表

本专题整理Pandas日期转换、时间索引、重采样、滚动窗口、时区处理、plot绘图、Styler表格样式和报表输出方法。

2026.09.16

80

23

Pandas数据筛选索引与清洗处理
Pandas数据筛选索引与清洗处理

本专题整理Pandas中的loc、iloc、条件筛选、query查询、缺失值处理、重复值删除、类型转换和字符串列清洗方法。

2026.09.16

60

25

Pandas数据读取导入与文件导出处理
Pandas数据读取导入与文件导出处理

本专题整理Pandas读取CSV、Excel、JSON、SQL、Parquet等文件的方法,以及to_csv、to_excel、to_sql和to_parquet等常用数据导出流程。

2026.09.16

40

27

GDB怎么设置断点
GDB怎么设置断点

本专题介绍GDB按照函数名、源代码行号和文件位置设置断点的方法,详细说明run、continue、next、step等命令的配合使用,帮助定位程序崩溃、逻辑异常及代码未按预期执行的问题。

2026.09.11

380

28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133万人学习