在Discuz!X 1.5中,康盛恢复了在线时间这一功能,但有不少站长报告说会员的在线时间并不见更新。当然,一如既往的,官方没有承认此错误,同时还有一位官方人员对DzX的在线时间机制做了个解析(传送门在此)。那么实际上是不是真的没有bug呢?必然不可能没有拉,如果真没有那谈何修复,就更没有这篇文章了。。。
在康盛官方人员的那篇帖子中我们也可以看到,更新用户的在线时间是在updatesession()这个函数(位于source/function/function_core.php)中实现的。下面我来分析下其中关于在线时间的代码(注释为蝦米所加,所参考版本为DzX2 110629,SVN ID:function_core.php 22982 2011-06-13 01:52:33Z zhangguosheng )
if($_G['uid'] && TIMESTAMP - $_G['member']['lastactivity'] > 21600) {//如果用户已经登陆,并且当前时间与数据库中记录的用户上次活动时间之差大于6小时 if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) { //如果在线时间功能开启,并且当前时间与用户上次活动时间之差大于12小时 $total = DB::result_first("SELECT total FROM ".DB::table('common_onlinetime')." WHERE uid='$_G[uid]'"); DB::update('common_member_count', array('oltime' => round(intval($total) / 60)), "uid='$_G[uid]'", 1); //那么对在线时间进行更新 } DB::update('common_member_status', array('lastip' => $_G['clientip'], 'lastactivity' => TIMESTAMP, 'lastvisit' => TIMESTAMP), "uid='$_G[uid]'", 1); //更新数据库中的用户上次活动时间 } |
也许细心的站长已经发现了其中的问题,如果一个会员他很活跃,任意2次访问间隔时间均不超过12小时,岂不是他的在线时间再也不会更新了?
既然找到了问题,那修复就很简单了,将
if($oltimespan && TIMESTAMP - $_G['member']['lastactivity'] > 43200) { |
一行替换为
if($oltimespan) { |
保存即可。
其实又是一个很低级的逻辑上的错误,那么多报告bug的难道Discuz官方就不能进行下确认吗?这个问题并不难发现,我也是别人找了我说有这个问题想让我帮忙看下才发现的。吐槽的话已不想多说,就这样子吧。
This entry was posted in discuz and tagged discuzX, 漏洞 by 江湖大虾仁 and comments are closed.
还是有部份会员不更新…!!
略缩图也是的
图片扩展模式,设置版图判断公式出现两个一样的,判断宽度的条件,正确来说应该是 宽 高进行判断