后附修复压缩包,压缩包有需要上传的文件及修复说明,修复仅供参考,具体修复以XIUNOX官方社区为主。
根因分析
版块页显示的"帖子数"来自 forum 表的 threads 冗余计数字段(view/htm/forum.htm:81、forum_index.htm:47 直接读取 $forum['threads']),并非实时统计。该值存在数据库中,因此清缓存无法修复。
代码中有两处移动帖子的路径未同步维护该计数,长期积累导致数字漂移:
版主批量移动帖子(
route/mod.php约 253 行) 直接db_update('thread', ..., array('fid'=>$newfid))绕过模型层:源版块
threads不减少目标版块
threads不增加置顶关系表
thread_top.fid不同步(置顶帖会在新旧版块间错乱)
单个移动主题(
model/thread.func.phpthread_update()约 279 行) 更换 fid 时无条件+1 / -1:待审、已软删的帖子创建时从未计入计数,被移动后却被加进目标版块,造成多计。
修复内容
文件 | 操作 | 说明 |
|---|---|---|
| 覆盖 | 批量移动后按源版块汇总减量、目标版块加量(只统计 |
| 覆盖 |
|
| 新增 | 存量数据修复脚本(CLI),重算版块 |
上线步骤
备份站点原
route/mod.php、model/thread.func.php及数据库;用本包中的文件覆盖对应路径,并把
tool/recount_forum_stats.php上传到tool/目录;在网站根目录执行(可只修出问题的版块):
cd /www/wwwroot/你的目录 # 只重算 fid 1、6、10 php tool/recount_forum_stats.php 1 6 10 # 或不带参数,重算全部版块 php tool/recount_forum_stats.php脚本会逐版块打印:
fid | 版块名称 | 旧计数 | 实际数 | 修正差值;若站点使用 Redis / 文件缓存,再到后台「其他 → 缓存」清空一次,前台即显示正确数字。
兼容性说明
脚本仅允许 CLI 运行,浏览器访问会被拒绝,无后门风险,用完可保留也可删除;
自动检测
thread表的is_deleted/audit_status列,兼容旧库结构;forum.todayposts(今日回复)为每日重置计数,不受此 bug 影响,无需处理;移动帖子的回复数本就不计入
forum.threads,口径无需变动;全部文件已通过 PHP 8.3 语法校验。
Bug反馈
- 程序版本:
- Xiuno X 最新版
- PHP版本:
- php8.5
- MySql:
- 8.4
- 复现步骤:
-
版块页 / 首页显示的帖子数量与实际不符,后台清空缓存后依旧错误。
涉及版块示例:forum-1、forum-6、forum-10。 - 预期结果:
- Bug 描述:
- xiunox 1.1.10 版块帖子计数错误
- 错误信息:
- 错误日志:
-
如果不按照提示进行填写,复制粘贴相同信息,将会被删除并扣除金币。





