已排期 xiunox 1.1.10 版块帖子计数错误 [复制链接]

二级用户组

后附修复压缩包,压缩包有需要上传的文件及修复说明,修复仅供参考,具体修复以XIUNOX官方社区为主。

根因分析

版块页显示的"帖子数"来自 forum 表的 threads 冗余计数字段(view/htm/forum.htm:81、forum_index.htm:47 直接读取 $forum['threads']),并非实时统计。该值存在数据库中,因此清缓存无法修复。

代码中有两处移动帖子的路径未同步维护该计数,长期积累导致数字漂移:

  1. 版主批量移动帖子(route/mod.php 约 253 行) 直接 db_update('thread', ..., array('fid'=>$newfid)) 绕过模型层:

    • 源版块 threads 不减少

    • 目标版块 threads 不增加

    • 置顶关系表 thread_top.fid 不同步(置顶帖会在新旧版块间错乱)

  2. 单个移动主题(model/thread.func.php thread_update() 约 279 行) 更换 fid 时无条件 +1 / -1:待审、已软删的帖子创建时从未计入计数,被移动后却被加进目标版块,造成多计。

修复内容

文件

操作

说明

route/mod.php

覆盖

批量移动后按源版块汇总减量、目标版块加量(只统计 audit_status=1 且 is_deleted=0 的帖子,与发帖/删帖口径一致),并同步 thread_top.fid

model/thread.func.php

覆盖

thread_update 移动分支仅对已计入的帖子调整计数

tool/recount_forum_stats.php

新增

存量数据修复脚本(CLI),重算版块 threads 并清理 forumlist 缓存

上线步骤

  1. 备份站点原 route/mod.php、model/thread.func.php 及数据库;

  2. 用本包中的文件覆盖对应路径,并把 tool/recount_forum_stats.php 上传到 tool/ 目录;

  3. 在网站根目录执行(可只修出问题的版块):

    cd /www/wwwroot/你的目录
    
    # 只重算 fid 1、6、10
    php tool/recount_forum_stats.php 1 6 10
    
    # 或不带参数,重算全部版块
    php tool/recount_forum_stats.php
    

    脚本会逐版块打印:fid | 版块名称 | 旧计数 | 实际数 | 修正差值;

  4. 若站点使用 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 版块帖子计数错误
错误信息:
错误日志:
xiunox 1.1.10 版块帖子计数错误修复包.zip 33.2KB
最新回复
  • xiunox 一级用户组

    感谢这么详尽的排查,根因定位(冗余计数 + 两条移动路径未同步)是准确的,先给个赞。

    补充几点供参考:

    1. 计数的增减散落在多处才是本质问题。建议收敛为统一入口(如 forum_threads_adjust($fid, $delta)),并用 UPDATE forum SET threads = threads + ? WHERE fid = ? 原子自增,避免先读后写在高并发下丢更新。
    2. 直接覆盖 route/mod.php、model/thread.func.php 会给后续升级带来合并成本,建议整理成最小 diff 或插件形式提交,便于官方采纳。
    3. 大站跑 recount 建议分批处理并加锁,防止超时或与线上写入打架。
    4. 除移动外,版块合并/删除等路径是否也漏维护了计数?可一并核对。

    另建议显式声明兼容的 PHP/MySQL 版本,方便他人验证。【 AI 自动回复,仅供参考】

    1小时前

请先登录后再回复 登录