Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Discuz! X2复制主题时积分bug问题分析

[复制链接]
otherbank 发表于 2011-9-8 21:18:46 | 显示全部楼层 |阅读模式
本帖最后由 otherbank 于 2011-9-9 09:04 编辑

经测试Discuz! X2系统有一个积分BUG:就是你从一个版块复制主题到另一个版块时给发帖者的积分是按照原版块积分规则增加,按道理说应该按照新版块的积分规则来增加。
BUG分析:
1,在帖子页点击复制按钮,弹出复制选择框,用chrome浏览器审查元素,截图如下:

form表单的提交位置:
  1. <form id="topicadminform" method="post" autocomplete="off" action="forum.php?mod=topicadmin&amp;action=copy&amp;modsubmit=yes&amp;infloat=yes&amp;modclick=yes" onsubmit="ajaxpost('topicadminform', 'return_mods', 'return_mods', 'onerror');return false;" fwin="mods">
复制代码
可知表单以post的方式提交给forum.php页面;forum.php页面引入了核心类并实例化,还引入了核心函数和论坛处理函数。
2,由forum.php?mod=topicadmin&action=copy&modsubmit=yes&infloat=yes&modclick=yes参数可知调用的是source/module/forum/forum_topicadmin.php 这个模组,source/module/forum/forum_topicadmin.php 引入了require_once libfile('function/post')也就是source/function/function_post.php函数;
其中它的67行代码--71行代码如下:
  1. if(preg_match('/^\w+$/', $_G['gp_action']) && file_exists($topicadminfile = libfile('topicadmin/'.$_G['gp_action'], 'include'))) {
  2. require_once $topicadminfile;
  3. } else {
  4. showmessage('undefined_action', NULL);
  5. }
复制代码
可知文件调用到source/include/topicadmin/topicadmin_copy.php文件
3,可见source/include/topicadmin/topicadmin_copy.php文件是处理复制主题这个操作的程序文件,下面就是分析这个页面哪个函数调用了积分操作,source/include/topicadmin/topicadmin_copy.php程序文件中有一个函数:
  1. updatepostcredits('+', $post['authorid'], 'post', $_G['fid']);
复制代码
经搜索这个函数来自,上一个页面source/module/forum/forum_topicadmin.php 调用的source/function/function_post.phpp函数,于是去这个函数中查询updatepostcredits()的作用。
4,source/function/function_post.phpp文件中updatepostcredits()函数又调用的开始引入的核心类中的函数updatecreditbyaction(),到此才看到核心类的代码:
  1. function updatecreditbyaction($action, $uid = 0, $extrasql = array(), $needle = '', $coef = 1, $update = 1, $fid = 0) {

  2. include_once libfile('class/credit');
  3. $credit = & credit::instance();
  4. if($extrasql) {
  5. $credit->extrasql = $extrasql;
  6. }
  7. return $credit->execrule($action, $uid, $needle, $coef, $update, $fid);
  8. }
复制代码
可以看出函数引用了真正的分数处理类source/class/class_credit.php.
5,到类source/class/class_credit.php中看到类实例化中改变积分的函数是updatemembercount();代码是function_credit.php的270-271行:
  1. if($sql) {
  2. DB::query("UPDATE ".DB::table('common_member_count')." SET ".implode(',', $sql)." WHERE uid IN (".dimplode($uids).")", 'UNBUFFERED');
  3. }
复制代码
整理下参数传递步骤:forum.php -->source/module/forum/forum_topicadmin.php  -->source/include/topicadmin/topicadmin_copy.php -->source/function/function_post.phpp -->source/class/class_core.php-->source/class/class_credit.php

仔细研究代码,积分规则的参数传递来源源自source/include/topicadmin/topicadmin_copy.php 文件函数 updatepostcredits('+', $post['authorid'], 'post', $_G['fid']);而这个$_G['fid']的数值就是当前版块也就是主题转出前版块的fid值,后面的函数会以这个参数输出积分规则。而这个地方我们需要的是转入版块的fid指,也就是从表单提交上来的copyto的值,所以这样修改一下就OK了:
updatepostcredits('+', $post['authorid'], 'post', $copyto);

问题处理很简单,步骤如下,只需要修改一行代码即可:
source/include/topicadmin/topicadmin_copy.php文件81行代码
  1. updatepostcredits('+', $post['authorid'], 'post', $_G['fid']);
复制代码
修改为:
  1. updatepostcredits('+', $post['authorid'], 'post', $copyto);
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
64243354 发表于 2011-9-8 21:29:05 | 显示全部楼层
老大 你牛了 第一天來说不太认识现在可出了那么爽的教程 学習了
回复

使用道具 举报

 楼主| otherbank 发表于 2011-9-8 21:51:15 | 显示全部楼层
64243354 发表于 2011-9-8 21:29
老大 你牛了 第一天來说不太认识现在可出了那么爽的教程 学習了

兄台夸奖了,目前还是很肤浅,自己只是爱学一点;希望能和大家一起有更多的进步。
回复

使用道具 举报

【许昌品牌空间_ 发表于 2011-9-8 21:53:36 | 显示全部楼层
好大的BUG啊。多谢楼主搭救{:soso_e120:}
回复

使用道具 举报

64243354 发表于 2011-9-8 22:40:50 | 显示全部楼层
otherbank 发表于 2011-9-8 21:51
兄台夸奖了,目前还是很肤浅,自己只是爱学一点;希望能和大家一起有更多的进步。

等著更多的教程出现哈哈~
回复

使用道具 举报

eqmz 发表于 2011-9-13 16:54:09 | 显示全部楼层
多谢分享!!!!!!!!
回复

使用道具 举报

wdblog 发表于 2011-9-14 10:40:02 | 显示全部楼层
很厉害 改了  www.7cov.com
回复

使用道具 举报

ARCHY` 发表于 2011-9-21 10:41:18 | 显示全部楼层
学习了哦
回复

使用道具 举报

xipick 发表于 2011-9-27 20:16:17 | 显示全部楼层
坐等升级包,发现楼主是个可造之才啊
回复

使用道具 举报

 楼主| otherbank 发表于 2011-9-27 21:49:41 | 显示全部楼层
xipick 发表于 2011-9-27 20:16
坐等升级包,发现楼主是个可造之才啊

多谢夸奖,造一下那将是“难得之才”啊! 呵呵
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-15 20:53 , Processed in 0.027887 second(s), 4 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表