格东站长网

 找回密码
 注册

[发布] [会员] DZ论坛会员组过期不自动退出的代码BUG和解决思路

作者:magentoon    2016-11-6 14:55  查看: 2117|回复: 29  原创  

看DZ坛不少站反映们自己坛的收费员组或者某共用户组设置有效期,到期并不自动退出,就算是员本人登陆还是显示期的那个用户组,不切换回普通员组。 

 

 

有这个现象应该是对会员组的判断逻辑有问题。DZ的用户组在usergroups数据表中,用id来区别。如果是公共用户组或者被禁止,则增加一个有效期时间记录。本来这个有效期应该是每天由程序检查一遍,过了有效期就删除时间,同时把会员组变为原来的普通会员组。但似乎默认功能中并不做这个日常检查工作,在代码中只有这几个功能:格东站长网 

1、购买收费用户组,购买后积分扣除、增加有效时间、扩展用户组变为收费用户组,主组不变。 

 



  2、切换用户组,可以把主组与扩展组之间相互切换,手工操作。 

 

                   3、退出用户组,仅包括退出扩展用户组,手工操作。这个退出不管是不是收费组、是不是还没到期,只要会员点击“退出”按钮,扩展组就没了,变成只有主组了。 

  

 至于另外两个功能就没看到有代码,应该就是没有这些功能,包括:购买收费组之后自动把主组变成收费组、主组或扩展组过期后自动退回为普通用户组。 

         

 要修正这个漏洞是比较容易的,可以用两个方法办到:格东站长网 

1、添加一个计划任务,每天检查用户组的有效期,到期就升级一下用户组。这个适合于会员组变化很频繁、变化会员多的论坛,变化效果要第二天才能看到。 

                   

          2、不用计划任务,在member文件中添加一件判断代码,只要会员登陆就检查他的用户组情况,已过期的就升级一下。会员组变化不多的论坛可用这个,效果马上看到,但需要登陆。 

          

 如果既不用登陆就自动升级会员组,而且想会员本人能马上看到正确的会员组显示,把计划任务与member文件两者都要就最好。 

   

         

 

         

查代码发现其实DZ默认程序每天有检查会员组是否过期的。只不过这个检查仅限于禁言会员和禁止访问这两个会员组,也就是groupid为4和5的会员,其它的都不检查,所以如果是VIP会员、收费会员这些,就都更新不了过期时间。 

           

         如果要修改,只需要把默认的计划任务中的groupid这个限制删掉就可以了,不用另外写计划任务代码。所以更新一下源码文件。 

                                    

转载请注明 作者:magentoon 本文来自格东站长网

分享到:

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

x
DivivitYan 2016-11-7 02:34| 显示全部楼层

报名~格东站长网 

两个一起吧!

[楼主]magentoon 2016-11-28 19:55| 显示全部楼层

这个两天整一下代码

lwq842635 2016-12-11 14:26| 显示全部楼层

报个名两个都

[楼主]magentoon 2016-12-11 17:17| 显示全部楼层

再分析一下员组的据表记录,想技术的可以认了。格东站长网 

会员组,DZ系统搞得很复杂,在pre_common_member_field_forum和pre_common_member两个表中都有记录,可以说是重复记录的。相关的记录就更多了,自己去找。格东站长网 

其中pre_common_member这个表,有两个字段,一个是groupid,会员组ID,另一个是groupexpiry,有效期时间。每次在程序中判断会员组时,这两个字段是结合起来读的。也就是判断会员是哪个会员组,先读groupid再读groupexpiry,如果groupexpiry为0,groupid就正确了。如果groupexpiry不为0,就要判断这个时间记录是今天之前还是今天之后,如果是今天之前,算过期,要清除这个过期时间,并把会员组变为应该的组。如果是今天之后,就还有效,groupid继续着。 

  按说pre_common_member这一个表的记录就已经够用了,但是DZ的会员组特别复杂,除了主组,还有扩展组、有效期、过期后要变为哪个组这些东东,所以在pre_common_member_field_forum表里有个更复杂的记录,用的是groupterms的字段。这个字段是一个格式化的数组记录,打开看时是这样的: 

  

  

  1. a:2:{s:4:"main";a:3:{s:4:"time";i:1481644800;s:7:"adminid";i:-1;s:7:"groupid";s:2:"91";}s:3:"ext";a:2:{i:5;i:1481644800;i:88;i:1482163200;}}
复制代码
格东站长网 

看不懂了吧!格东站长网 

这个东东在程序中要做两步阅读,一是调出记录,二是用dunserialize()函数解析这个记录,变成一个数组。以上这条记录通过解析后变成的数组可能写成这样: 

            $groupterms['groupterms']['main']['groupid']; 

                                   

   $groupterms['groupterms']['main']['time'];格东站长网 

$groupterms['groupterms']['main']['adminid'];格东站长网 

$groupterms['groupterms']['ext'][$row['groupid']]; 

           这些具体的变量我们就能看明白了,无非就是记录的主组ID、有效时间、管理组、扩展组和有效期这些东东。其中扩展组会包括了现在的组,所以默认程序的会员组页面中的“切换”就是在读了这条记录之后,你可以在主组和多个扩展组中来回切--实际上根本就是多余! 

             而其中$groupterms['groupterms']['main']['time']跟会员表中的groupexpiry是一回事(默认程序肯定是一样,如果不一样,是自己哪里改坏了)。当升级会员组时,这两个记录是同时更新的。格东站长网 

格东站长网 

会员组过期时,正确应该的进程是这样的:格东站长网 

1、已经读取到会员组的时间过期了,这个有个全局变量$_G['member']['groupexpiry'],一看就能判断。 

             2、既然过期了,就读以上两个表,把相关字段全读出来。格东站长网 

3、解析groupterms字段后得到$groupterms['groupterms']['main']['groupid']和$groupterms['groupterms']['main']['time']两个变量,这两个,一个是过期时间,一个是过期后应该变成的会员组,也就是后台所选择的这个:格东站长网

 

   如果“过期后会员组变为”这里选择的跟“所属会员组”一样也是禁止发言,或者“会员组有效期”这里不填,提交后groupterms这个字段的main就会是空白内容,这是程序自动判断的,因为不需要记录过期时间和过期后的会员组。自己测试就知道了。 

              4、通过判断知道会员组有效期已经是今天之前的,过期了,正确情况应该是把groupterms这个字段的main记录变空白,但DZ程序的BUG就在这里,缺少这个判断。我补充的代码就是把$groupterms['groupterms']['main']['groupid']和$groupterms['groupterms']['main']['time']两个变量清空,然后把groupterms字段重新格式化(因为很可能还有扩展组的记录存在),用的是serialize()这个函数,更新pre_common_member_field_forum表。同时把pre_common_member表的记录也更新为正确。格东站长网 

数据表记录正确之后,前台的会员组显示就是正确的了。 

 

 你读懂了吗?格东站长网 

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

x
lwq842635 2016-12-12 15:28| 显示全部楼层

非常感谢!非常不错的干货。建议管员还是把支付宝即时到账申请下来 这样更佳的方便家。

[楼主]magentoon 2016-12-12 16:06| 显示全部楼层

6楼 lwq842635 2016-12-12 15:28 

  

 非常感谢!非常不错的干货。建议管理员还是把支付宝即时到账申请下来 这样更佳的方便大家。 ...

了一蚊子肉买个射炮?

lwq842635 2016-12-12 20:27| 显示全部楼层

也是哦

lwq842635 2016-12-12 22:26| 显示全部楼层

看了楼的代码 但是还有个问题,就是pre_common_member_field_forum表中不存在这个UID用户,在pre_common_member_field_forum_archive存档表中,还有一种况就是pre_common_member_field_forum表和pre_common_member_field_forum_archive存档表都不存这个UID用的话都是法执行的

评分    共评1次(金币+1 )评分记录
magentoon 金币+1
感谢反馈测试效果
[楼主]magentoon 2016-12-13 02:54| 显示全部楼层

9楼 lwq842635 2016-12-12 22:26格东站长网 

看了楼主的代码 但是还有个问题,就是pre_common_member_field_forum表中不存在这个UID用户,而在pre_commo ...

你说的这个,是自动冻结的会员,都已经冻结了就别搞什么升级了,先解冻吧格东站长网 

我很讨厌这个自动冻结功能,后台不要开启每日用户表优化的计划任务。 

  

   

           

 看了一下关于冻结会员的代码,远不止你讲的这一个表,包括这些全动了手脚:格东站长网 

  1. if(DB::query($movesql, array('common_member_archive', 'common_member'), false, true)) { 

    

     

     

  2.                                 DB::query($deletesql, array('common_member'), false, true); 

                

  3.                         }格东站长网 

  4.                         if(DB::query($movesql, array('common_member_profile_archive', 'common_member_profile'), false, true)) { 

             

    

  5.                                 DB::query($deletesql, array('common_member_profile'), false, true);格东站长网 

  6.                         }格东站长网 

  7.                         if(DB::query($movesql, array('common_member_field_forum_archive', 'common_member_field_forum'), false, true)) {格东站长网 

  8.                                 DB::query($deletesql, array('common_member_field_forum'), false, true); 

                        

  9.                         } 

     

             

  10.                         if(DB::query($movesql, array('common_member_field_home_archive', 'common_member_field_home'), false, true)) {格东站长网 

  11.                                 DB::query($deletesql, array('common_member_field_home'), false, true);格东站长网 

  12.                         }格东站长网 

  13.                         if(DB::query($movesql, array('common_member_status_archive', 'common_member_status'), false, true)) {格东站长网 

  14.                                 DB::query($deletesql, array('common_member_status'), false, true);格东站长网 

  15.                         } 

                      

           

  16.                         if(DB::query($movesql, array('common_member_count_archive', 'common_member_count'), false, true)) {格东站长网 

  17.                                 DB::query($deletesql, array('common_member_count'), false, true);格东站长网 

  18.                         }
复制代码

love168 2017-2-23 16:46| 显示全部楼层

好强! 

            好强

[楼主]magentoon 2017-4-22 01:12| 显示全部楼层

源码更新了一下,是查到DZ默认的计划任务中有每天检查禁言员的期,修改检查所有员就行了。

damngood 2017-4-25 10:19| 显示全部楼层

xmwalo 2017-4-27 17:01| 显示全部楼层

看看怎么用

421575110 2017-8-8 16:45| 显示全部楼层

研究下怎么使用

yihui 2017-9-6 08:54| 显示全部楼层

了一蚊子肉买个射炮? 

   

很幽默哦

hfjxu 2017-9-28 19:28| 显示全部楼层

很幽默哦楼很幽默哦

wuxinzi 2017-12-31 22:24| 显示全部楼层

没有币买不了

wuxinzi 2018-1-15 20:17| 显示全部楼层

到期用户还是法变换普通用户,登陆之卡死在到期页,怎么解?格东站长网 

现用户组是切换了,只是到期时间没有清0,导致VIP员到期切换到了应积分的用户组,但是依然卡死在到期页编辑用户现原因应该是VIP到期时间没有清空导致

[楼主]magentoon 2018-1-16 13:00| 显示全部楼层

19楼 wuxinzi 2018-1-15 20:17格东站长网 

到期用户还是无法变换为普通用户,登陆之后卡死在到期页面,无法进行其他操作,怎么解?发现用户组是切换 ...

什么叫卡死?什么叫到期页

wuxinzi 2018-1-18 19:21| 显示全部楼层

20楼 magentoon 2018-1-16 13:00 

                     

什么叫卡死?什么叫到期页面?

就是登陆以后只显示到期提醒页面,点其他都无权点不开了。格东站长网 

应该是VIP到期,切换到普通员组了,可是,员到期时间那里没有清空,还存在着VIP的到期时间,因此,导致切换到普通员组,普通员组也没限制了,变到期了

[楼主]magentoon 2018-1-18 20:53| 显示全部楼层

21楼 wuxinzi 2018-1-18 19:21格东站长网 

就是登陆以后只显示到期提醒页面,点其他都无权点不开了。应该是VIP到期后,切换到普通会员组了,可是,会 ...

到期没有自动更新数据。有两个可能:一是你的代码没改对,二是你的计划任务没执行。格东站长网 

据更新了,是不再提醒到期,是直接显示员组。

fen00 2018-1-21 00:03| 显示全部楼层

,需慢慢研究下

wuxinzi 2018-1-21 10:54| 显示全部楼层

22楼 magentoon 2018-1-18 20:53 

 

 

到期没有自动更新数据。有两个可能:一是你的代码没改对,二是你的计划任务没执行。如果数据更新了,是不 ...

修改哪几个文

[楼主]magentoon 2018-1-22 00:49| 显示全部楼层

24楼 wuxinzi 2018-1-21 10:54 

                   主要修改哪几个文件?

你到现在还不知道改哪几个文件?你这几天都在干嘛? 

         

你连文都没看的话,烦别再回这么多帖了。

wuxinzi 2018-2-13 07:24| 显示全部楼层

我按你压缩修改的啊,可是问题一直存在,才问你还修改那些文啊? 

  

   计划任务执行文,是不是:cron_cleanup_daily.php

[楼主]magentoon 2018-2-13 09:20| 显示全部楼层

26楼 wuxinzi 2018-2-13 07:24 

 

 我按你压缩包里面说明修改的啊,可是问题一直存在,才问你还要修改那些文件啊?计划任务执行文件,是不是: ...

你认为该改哪些文件,我会公开说一套、私下里再秘密有一套?格东站长网 

如果你按说明修改的,那就可能是没改好,继续好好核对。格东站长网 

且你一直说不行不行不行,我根本不道你哪里不行。一有效信息都没有,我话可答。

wuxinzi 2018-2-14 11:02| 显示全部楼层

上两张图给老,帮我解决下问题 

                     1:前台变成图片那样了 

          

  2.后台到期的VIP会员,居然变成了管理组 

   

 

 

           3.到期时间依然存在,没有清0格东站长网 

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

x
[楼主]magentoon 2018-2-14 15:33| 显示全部楼层

28楼 wuxinzi 2018-2-14 11:02格东站长网 

上两张图片给老大,帮我解决下问题1:前台变成图片那样了2.后台到期的VIP会员,居然变成了管理组

你代码怎么改的?

wuxinzi 2018-2-25 14:40| 显示全部楼层

按你压缩里说的修改了table_common_member.php 然覆盖了source/class/class_member.php文

源码出售与求购

  本版由magentoon出售的源码包括DZ、DEDE、ECSHOP三个程序的插件或模板代码,全部为原创,都经过实测。源码非独立插件,要修改程序原文件,不会与其它代码冲突或造成逻辑混乱。安装方式:或者覆盖原文件,或者按说明修改代码。          

  源码都有详细说明或效果截图,如果感觉功能与预期有出入,请原帖跟帖说明要求,看情况再决定是否推出新源码。如需代写/代改,请发帖商议好价格后补充金币,再通过“指定下载者”互传文件。。                 

  定制需求请发帖详细说明,包括达到的目标、模板大致样式、应用场合等,思路越清晰越利于沟通。         

  下载的源码请自用,不要网络传播,否则新代码肯定不会再有,最终大家共输。

 

  其它会员也可在本版出售源码,交易税为20%,出售附件时请把“指定下载”留空。非magentoon出售的源码,本站不审核质量,请下载者自己判断。

本帖二维码

小黑屋|手机版|Archiver| 帮助 | 格东站长网

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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