今天上午好友colin电话过来大呼救急,原来他昨天晚上不知为何把Discuz论坛中的会员用户组除了“新手上路”和“注册会员”之外的用户组都删除了,删除之后发现有许多会员出现了异常:有的出现禁言,有的出现未验证等等。
论坛的版本是Discuz 6,首先在后台将论坛暂时关闭,避免因为新的数据而造成更多的冲突。然后使用SQLyog将原来的数据都备份下来,避免操作数据库出现失误之后可以方便恢复数据。上面这两个前期工作非常重要,事实上在后面的一次操作中就将会员数据给破坏掉了,然后使用备份恢复之后又重新进行操作的。
接下来分析Discuz的数据库,首先查找到记录会员用户组的表名为 cdb_usergroups (前缀cdb_为默认的,或许与你的不同),接下来使用一条查询语句检查一下会员中的group属性:
结果发现很多会员的groupid还是保留的被删除的会员用户组id,找到了问题的原因之后就好办了。
首先恢复默认的会员用户组的数据,打开Discuz6安装包中的upload/install/discuz.sql文件,找到下面一行
然后将这行连同下面创建表结果及插入默认数据的sql语句复制下来在MySQL中执行,这样就将会员用户组中的数据恢复到了默认状态。
然后就是需要查看会员表(cdb_members)中的groupid是否都存在于会员组中,查看所有的groupid是否都在cdb_usergroups.id的范围之内(1-15):
如果执行之后发现没有数据则表示一切OK了,如果发现有的话则说明肯定添加过新的会员用户组,这个时候需要对会员中的groupid进行整理:
update cdb_members set groupid=10 where (credits>0 and credits<50) and groupid>8;
update cdb_members set groupid=11 where (credits>50 and credits<200) and groupid>8;
update cdb_members set groupid=12 where (credits>200 and credits<500) and groupid>8;
update cdb_members set groupid=13 where (credits>500 and credits<1000) and groupid>8;
update cdb_members set groupid=14 where (credits>1000 and credits<3000) and groupid>8;
update cdb_members set groupid=15 where (credits>3000 and credits<6000) and groupid>8;
update cdb_members set groupid=16 where (credits>6000 and credits<999999) and groupid>8;
因为groupid为8以下的都为系统组,不需要进行整理。这样整理之后一切都OK了,重新打开论坛。~~