插件作者的标准出来了!Manyou诚邀开发者加盟!
“互联网平台开发者”特刊 有奖征集开发者
立即免费下载 Discuz!6.1.0正式版
Discuz! 6.1.0 使用说明
Discuz!NT2.5正式版发布
开放源码下载
UCenter Home 1.2 正式版发布
官方站 | 帮助文档
基于ECShop的网店托管-卖否
PHP就业培训直通车 | LAMP培训大连
Discuz!收费服务内容及价格
“感谢有你同行”手握手2008年数万元重奖志愿者
Discuz!/ECShop 专用官方虚拟主机
亿声传媒(Insenz)中秋祝福发送中
Comsenz 招聘信息
网店系统ECShop v2.6.0正式版火热发布
基于Discuz!的免费论坛空间5D6D
参与有奖社区调查 赢取台湾5日游
发新话题
打印

[插件] discuz论坛UID复用的解决方案[三次更新]

discuz论坛UID复用的解决方案[三次更新]

参考:http://www.discuz.net/thread-375965-1-1.html
首发:http://www.ewjy.com/read.php?137

说明:有没有用,试了再说话。首先备份好,或在本机调试一下。
更新:cdb_posts和cdb_thread表漏掉了!现在补上,顺便做了一个文件,直接修改UID,不必要再亲自操作数据库了!以下颜色为green的为我新更新的内容!
第二次更新:
加入检查空闲UID的文件count_uid.php
第三次更新:
加入UID重排,建议不要随便用哦!备份好数据库
事实上这三个文件中有很多共同的部分,而且自动化做的不好,有时间完美一下,集成到一个文件中更好。其实这三个文件有很多关于UID的功能的,只是要看你会不会改了。我本机太缺少数据了,测试做的不好,希望数据量大的论坛,可以帮忙测试(当然是在本机测试)。


针对discuz论坛的5.0.0版本,其它版可以参考自行修改

UID的修改非同小可,可能一不小心,将导致论坛无法使用,轻则也会出现论坛用户资料错乱。所以在执行以下更改前确定你已经对论坛做好了备份。

在discuz5.0.0版本中,涉及到UID字段的有以下一些表:
cdb_access
cdb_activities
cdb_activityapplies
cdb_adminsessions
cdb_attachments
cdb_blogcaches
cdb_buddys
cdb_creditslog
cdb_favorites
cdb_memberfields
cdb_members
cdb_moderators
cdb_modworks
cdb_myposts
cdb_mythreads
cdb_onlinetime
cdb_orders
cdb_paymentlog
cdb_pmsearchindex
cdb_posts
cdb_promotions
cdb_ratelog
cdb_searchindex
cdb_sessions
cdb_subscriptions
cdb_thread
cdb_threadsmod
cdb_validating

只要在这些表中一起改动UID,就行!
比如我想改动UID为4的用户,使其UID为3,只需要在数据库中执行以下几句就行了:
UPDATE `cdb_access` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_activities` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_activityapplies` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_adminsessions` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_attachments` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_blogcaches` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_buddys` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_creditslog` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_favorites` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_memberfields` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_members` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_moderators` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_modworks` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_myposts` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_mythreads` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_onlinetime` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_orders` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_paymentlog` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_pmsearchindex` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_promotions` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_ratelog` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_searchindex` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_sessions` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_subscriptions` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_threadsmod` SET `uid`=3 WHERE `uid`=4;
UPDATE `cdb_validating` SET `uid`=3 WHERE `uid`=4;

UPDATE `cdb_posts` SET `authorid` = 3 WHERE `authorid` = 4;
UPDATE `cdb_threads` SET `authorid` = 3 WHERE `authorid` = 4;


此时,用户的UID可以成功转换,但是新注册的UID将不会从4开始,而是从5开始(这是城我假设的是原来只注册了4个会员)。
必须在最后执行:[所以SQL语句执行完之后执行]
ALTER TABLE `cdb_members` AUTO_INCREMENT =UID
红色的部分改成想让UID从什么地方开始。

按以上步骤,我在本机试验是成功的。

我自己用了一个小文件来产生以上的那些SQL语句,比较方便,适合需要大量手动更改UID的论坛:
//这里原来的一部分文件不用了,我新做了一个,传上来自己看看!
复制内容到剪贴板
代码:
<?php
include "./config.inc.php";

//变量初始化
if(isset($_POST['from']) && isset($_POST['to'])){
        $from = $_POST['from'];
        $to = $_POST['to'];       
} else {
        $from = "";
        $to = "";
}

$ModTable = <<<EOT
cdb_access,
cdb_activities,
cdb_activityapplies,
cdb_adminsessions,
cdb_attachments,
cdb_blogcaches,
cdb_buddys,
cdb_creditslog,
cdb_favorites,
cdb_memberfields,
cdb_members,
cdb_moderators,
cdb_modworks,
cdb_myposts,
cdb_mythreads,
cdb_onlinetime,
cdb_orders,
cdb_paymentlog,
cdb_pmsearchindex,
cdb_promotions,
cdb_ratelog,
cdb_searchindex,
cdb_sessions,
cdb_subscriptions,
cdb_threadsmod,
cdb_validating
EOT;

$splits = explode(',',$ModTable);
$n = count($splits);

for($i =0;$i<$n;$i++){
        $splits[$i] = trim($splits[$i]);
}


if($from && $to) {
        $connection = @mysql_connect($dbhost,$dbuser,$dbpw) or die(mysql_error());
        $db = @mysql_select_db($dbname, $connection) or die(mysql_error());
        $sql = "";
        for($j=0; $j<$n; $j++){
                $sql = "UPDATE `$splits[$j]` SET `uid`=$to WHERE `uid`=$from;";               
                @mysql_query($sql,$connection) or die(mysql_error());
        }
        //更改cdb_posts表
        $sql1 = "UPDATE `cdb_posts` SET `authorid` = $to WHERE `authorid` = $from;";
        @mysql_query($sql1,$connection) or die(mysql_error());

        //更改cdb_thread表
        $sql2 = "UPDATE `cdb_threads` SET `authorid` = $to WHERE `authorid` = $from;";
        @mysql_query($sql2,$connection) or die(mysql_error());

        $sql3 = "SELECT uid FROM `cdb_members` ORDER BY `uid` DESC LIMIT 0 , 1;";
        $result = @mysql_query($sql3,$connection) or die(mysql_error());
        while ($field = mysql_fetch_array($result)) {
                $lastuid = $field['uid'];
        }
       
        @mysql_query("ALTER TABLE `cdb_members` AUTO_INCREMENT = $lastuid;",$connection) or die(mysql_error());

        echo "<div style=\"margin:0 auto;text-align:center;font-size:12px;\">更改成功!<br /><p><a href=\"./reuse_uid.php\">点击返回继续更改!</a></p></div>";
} else {
?>
<html>
<head><title>UID复用 BY 瑞志(http://www.ewjy.com)</title>
</head>
<body>
<div style="margin:0px auto;text-align:center;">
<form method="POST" action="reuse_uid.php">
<p><span style="font-size:12px;font-weight:bold;">现在使用的UID<span>
<input type="text" name="from" size=20 maxlength=100 /></p>
<p><span style="font-size:12px;font-weight:bold;">将要改成的UID</span>
<input type="text" name="to" size=20 maxlength=100 /></p>
<input type="submit" name="sub1" value=" OK " />
</form>
</div>
</body>
</html>
<?php
}
?>
//第二次更新文件
复制内容到剪贴板
代码:
<html>
<head><title>闲置UID检查 BY 瑞志(http://www.ewjy.com)</title>
</head>
<body style="text-align:center;">
<div style="margin:0px auto;border-top:1px solid #AAD0E6;border-left:1px solid #AAD0E6;border-right:1px solid #AAD0E6;width:100px;">
<?php
include "./config.inc.php";

$connection = @mysql_connect($dbhost,$dbuser,$dbpw) or die(mysql_error());
$db = @mysql_select_db($dbname, $connection) or die(mysql_error());

$cuid = 0;
$flag = "";

$sql = "select uid from cdb_members;";
$result = @mysql_query($sql,$connection) or die(mysql_error());

while($value = mysql_fetch_array($result)) {
        $cuid++;
        if($cuid != $value['uid']){
                $flag = "瑞志(http://www.ewjy.com),嘿嘿,此处是广告,哈哈!";
                $step = $value['uid']-$cuid;
                for($j =0; $j< $step;$j++,$cuid++){
                        echo "<div style=\"border-bottom:1px solid #AAD0E6;font-size:12px;width:100px;\">$cuid</div>";
                }
        }
}

if($flag == "") {
        echo "<div style=\"border-bottom:1px solid #AAD0E6;font-size:12px;width:100px;padding:4px;\">无闲置UID</div>";
}

?>
</div>
</body>
</html>
//第三次更新的文件

下面的文件保存为php放在根目录下用,请慎用!
复制内容到剪贴板
代码:
<?php
include "./config.inc.php";
$connection = @mysql_connect($dbhost,$dbuser,$dbpw) or die(mysql_error());
$db = @mysql_select_db($dbname, $connection) or die(mysql_error());

$ModTable = <<<EOT
cdb_access,
cdb_activities,
cdb_activityapplies,
cdb_adminsessions,
cdb_attachments,
cdb_blogcaches,
cdb_buddys,
cdb_creditslog,
cdb_favorites,
cdb_memberfields,
cdb_members,
cdb_moderators,
cdb_modworks,
cdb_myposts,
cdb_mythreads,
cdb_onlinetime,
cdb_orders,
cdb_paymentlog,
cdb_pmsearchindex,
cdb_promotions,
cdb_ratelog,
cdb_searchindex,
cdb_sessions,
cdb_subscriptions,
cdb_threadsmod,
cdb_validating
EOT;

$splits = explode(',',$ModTable);
$n = count($splits);

for($i =0;$i<$n;$i++){
        $splits[$i] = trim($splits[$i]);
}

$cuid = 0;

$sql = "select uid from cdb_members;";
$result = @mysql_query($sql,$connection) or die(mysql_error());

while($value = mysql_fetch_array($result)) {
        $cuid++;
        if($cuid != $value['uid']){
                for($j=0; $j<$n; $j++){
                        $sql = "UPDATE `$splits[$j]` SET `uid`=$cuid WHERE `uid`=$value[uid];";               
                        @mysql_query($sql,$connection) or die(mysql_error());
                }
                $sql1 = "UPDATE `cdb_posts` SET `authorid` = $cuid WHERE `authorid` = $value[uid];";
                @mysql_query($sql1,$connection) or die(mysql_error());

                $sql2 = "UPDATE `cdb_threads` SET `authorid` = $cuid WHERE `authorid` = $value[uid];";
                @mysql_query($sql2,$connection) or die(mysql_error());
        }
}

$sql3 = "SELECT uid FROM `cdb_members` ORDER BY `uid` DESC LIMIT 0 , 1;";
$result = @mysql_query($sql3,$connection) or die(mysql_error());
while ($field = mysql_fetch_array($result)) {
        $lastuid = $field['uid'];
}
@mysql_query("ALTER TABLE `cdb_members` AUTO_INCREMENT = $lastuid;",$connection) or die(mysql_error());
?>
你也可以下载文件,然后放在根目录下进行设置!请用完后删除,以免留下安全隐患

[ 本帖最后由 degmd 于 2006-9-22 15:31 编辑 ]

附件

reuse_uid.rar (1.2 KB)

2006-9-21 17:17, 下载次数: 360

count_uid.rar (647 Bytes)

2006-9-22 12:53, 下载次数: 201

记号!
说详细一点啦,还是有点不明白哦!
加上操作数据库不明白不敢搞哦。
cdb_posts
cdb_threads
????
引用:
原帖由 H5N1 于 2006-9-20 20:28 发表
说详细一点啦,还是有点不明白哦!
加上操作数据库不明白不敢搞哦。
就是说,先执行UPDATE语句,将会员UID换成以前空缺的UID
然后用ALTER语句将UID的递增起点设置成当前的最后一位UID的下一位

前面第一个链接,不访多看下,就会明白了
支持
不如写一个程序或者插件,导入数据库后全部自动完美搞定的啦。
引用:
原帖由 H5N1 于 2006-9-20 20:54 发表
不如写一个程序或者插件,导入数据库后全部自动完美搞定的啦。
我好懒啊!嘿嘿,其实想过了的
引用:
原帖由 degmd 于 2006-9-20 20:57 发表

我好懒啊!嘿嘿,其实想过了的
写啦!如果我会的早写了,问题是狗屁不懂呢!
我支持你!!!!
那些注册机害人不浅哦!!
支持!!!!
欢迎光临 玫瑰天空个人综合网站
http://www.rosesky.name/bbs/[收藏有大量风格及插件]
发新话题
版块跳转