再分析一下 员组的 据表记录,想 技术的可以认 了。格东站长网 会员组,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的字段。这个字段是一个格式化的数组记录,打开看时是这样的:格东站长网 - 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表的记录也更新为正确。 数据表记录正确之后,前台的会员组显示就是正确的了。 你读懂了吗? |