参考:https://discuz.dismall.com/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 编辑 ] |   
 
 
 
 |