MySQLi执行SQL如何获取影响行数

千敏小哥_3163

千敏小哥_3163

2026-08-18

594人浏览

原创

能,但必须确保query()执行的是非SELECT语句;SELECT类语句应使用$result->num_rows,而INSERT/UPDATE/DELETE等用$mysqli->affected_rows,其返回-1表示不适用或出错,0表示执行成功但无实际变更。

mysqli执行sql如何获取影响行数

mysqli_query() 后不能直接用 mysqli_affected_rows()?

能,但必须确保 query() 执行的是非 SELECT 语句。对 SELECT、SHOW、DESCRIBE 等返回结果集的语句,$mysqli->affected_rows 恒为 -1;此时该用 $result->num_rows。

常见错误是写完 $mysqli->query("SELECT ...") 就立刻查 affected_rows,结果得到 -1 还以为出错了。

  • INSERT / UPDATE / DELETE / REPLACE:查 $mysqli->affected_rows
  • SELECT / EXPLAIN:查 $result->num_rows(需先判断 $result 是否为 mysqli_result 对象)
  • 执行失败时(如语法错、字段不存在),$mysqli->affected_rows 也是 -1,但此时更应优先检查 $mysqli->errno 和 $mysqli->error

为什么 $mysqli->affected_rows 有时返回 0?

0 表示语句执行成功,但没实际变更任何行——这不等于失败,而是真实业务状态。比如:

  • UPDATE users SET status=1 WHERE id=999,但 id=999 不存在 → 返回 0
  • UPDATE users SET name='alice' WHERE id=123,但当前 name 已是 'alice' → MySQL 优化后不触发更新,也返回 0
  • DELETE FROM logs WHERE created_at ,匹配到 100 行但全被 WHERE 过滤掉 → 仍为 0

所以不能仅靠是否为 0 判断逻辑错误,得结合业务意图。登录验证时查不到用户,affected_rows 是 0,但这是预期行为;而批量发通知后返回 0,就该告警。

mysqli_affected_rows() 和 ROW_COUNT() 函数的区别

PHP 层的 $mysqli->affected_rows 底层调用的就是 MySQL 的 ROW_COUNT() 函数,二者行为完全一致。但要注意:

MySQL
MySQL

编写正确的MySQL查询,避免字符集、索引和锁方面的常见陷阱。

下载
  • 它反映的是存储引擎层面“真实变更量”,不是 SQL 语法上“WHERE 匹配了多少行”
  • INSERT ... ON DUPLICATE KEY UPDATE:无冲突插入 → 返回 1;有冲突且更新字段值变化 → 返回 1;有冲突但更新字段值未变 → 返回 0
  • REPLACE INTO:删除 + 插入共 2 行变更 → 返回 2
  • INSERT IGNORE:插入成功 → 1;主键/唯一键冲突跳过 → 0

别把 affected_rows 当成“WHERE 条件命中数”来用,尤其在带条件的 UPDATE 场景下,容易误判。

事务中怎么安全获取影响行数?

在事务里执行多条语句时,$mysqli->affected_rows 始终只反映**上一条** query() 的结果,不会累积或清空。但它有个关键限制:

  • 如果上一条是 SELECT,affected_rows 是 -1,后续语句不受影响
  • 但如果上一条是 INSERT/UPDATE/DELETE,再执行 SELECT 后,affected_rows 会变成 -1,且**无法自动恢复前值**
  • 因此,需要立即保存: $rows = $mysqli->affected_rows; $mysqli->query("SELECT ..."); // 此后 $mysqli->affected_rows 变为 -1

最容易被忽略的是:事务提交(commit)或回滚(rollback)本身不改变 affected_rows,但它们之后的任何新查询都会覆盖它。所以涉及多步变更的逻辑,每步都得当场捕获并存变量。

相关文章

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

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

下载

相关标签:

mysql

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

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

2026.10.22

40

15

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

2026.10.22

320

12

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

2026.10.22

40

16

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 192人学习