Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

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

[复制链接]
degmd 发表于 2006-9-20 19:08:25 | 显示全部楼层 |阅读模式
参考: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的论坛:
//这里原来的一部分文件不用了,我新做了一个,传上来自己看看!

  1. <?php
  2. include "./config.inc.php";

  3. //变量初始化
  4. if(isset($_POST['from']) && isset($_POST['to'])){
  5.         $from = $_POST['from'];
  6.         $to = $_POST['to'];       
  7. } else {
  8.         $from = "";
  9.         $to = "";
  10. }

  11. $ModTable = <<<EOT
  12. cdb_access,
  13. cdb_activities,
  14. cdb_activityapplies,
  15. cdb_adminsessions,
  16. cdb_attachments,
  17. cdb_blogcaches,
  18. cdb_buddys,
  19. cdb_creditslog,
  20. cdb_favorites,
  21. cdb_memberfields,
  22. cdb_members,
  23. cdb_moderators,
  24. cdb_modworks,
  25. cdb_myposts,
  26. cdb_mythreads,
  27. cdb_onlinetime,
  28. cdb_orders,
  29. cdb_paymentlog,
  30. cdb_pmsearchindex,
  31. cdb_promotions,
  32. cdb_ratelog,
  33. cdb_searchindex,
  34. cdb_sessions,
  35. cdb_subscriptions,
  36. cdb_threadsmod,
  37. cdb_validating
  38. EOT;

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

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


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

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

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

  65.         echo "<div style="margin:0 auto;text-align:center;font-size:12px;">更改成功!<br /><p><a href="./reuse_uid.php">点击返回继续更改!</a></p></div>";
  66. } else {
  67. ?>
  68. <html>
  69. <head><title>UID复用 BY 瑞志(http://www.ewjy.com)</title>
  70. </head>
  71. <body>
  72. <div style="margin:0px auto;text-align:center;">
  73. <form method="POST" action="reuse_uid.php">
  74. <p><span style="font-size:12px;font-weight:bold;">现在使用的UID<span>
  75. <input type="text" name="from" size=20 maxlength=100 /></p>
  76. <p><span style="font-size:12px;font-weight:bold;">将要改成的UID</span>
  77. <input type="text" name="to" size=20 maxlength=100 /></p>
  78. <input type="submit" name="sub1" value=" OK " />
  79. </form>
  80. </div>
  81. </body>
  82. </html>
  83. <?php
  84. }
  85. ?>
复制代码


//第二次更新文件
  1. <html>
  2. <head><title>闲置UID检查 BY 瑞志(http://www.ewjy.com)</title>
  3. </head>
  4. <body style="text-align:center;">
  5. <div style="margin:0px auto;border-top:1px solid #AAD0E6;border-left:1px solid #AAD0E6;border-right:1px solid #AAD0E6;width:100px;">
  6. <?php
  7. include "./config.inc.php";

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

  10. $cuid = 0;
  11. $flag = "";

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

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

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

  27. ?>
  28. </div>
  29. </body>
  30. </html>
复制代码


//第三次更新的文件

下面的文件保存为php放在根目录下用,请慎用!
  1. <?php
  2. include "./config.inc.php";
  3. $connection = @mysql_connect($dbhost,$dbuser,$dbpw) or die(mysql_error());
  4. $db = @mysql_select_db($dbname, $connection) or die(mysql_error());

  5. $ModTable = <<<EOT
  6. cdb_access,
  7. cdb_activities,
  8. cdb_activityapplies,
  9. cdb_adminsessions,
  10. cdb_attachments,
  11. cdb_blogcaches,
  12. cdb_buddys,
  13. cdb_creditslog,
  14. cdb_favorites,
  15. cdb_memberfields,
  16. cdb_members,
  17. cdb_moderators,
  18. cdb_modworks,
  19. cdb_myposts,
  20. cdb_mythreads,
  21. cdb_onlinetime,
  22. cdb_orders,
  23. cdb_paymentlog,
  24. cdb_pmsearchindex,
  25. cdb_promotions,
  26. cdb_ratelog,
  27. cdb_searchindex,
  28. cdb_sessions,
  29. cdb_subscriptions,
  30. cdb_threadsmod,
  31. cdb_validating
  32. EOT;

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

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

  38. $cuid = 0;

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

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

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

  54. $sql3 = "SELECT uid FROM `cdb_members` ORDER BY `uid` DESC LIMIT 0 , 1;";
  55. $result = @mysql_query($sql3,$connection) or die(mysql_error());
  56. while ($field = mysql_fetch_array($result)) {
  57.         $lastuid = $field['uid'];
  58. }
  59. @mysql_query("ALTER TABLE `cdb_members` AUTO_INCREMENT = $lastuid;",$connection) or die(mysql_error());
  60. ?>
复制代码



你也可以下载文件,然后放在根目录下进行设置!请用完后删除,以免留下安全隐患

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

本帖子中包含更多资源

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

x
H5N1 发表于 2006-9-20 20:22:36 | 显示全部楼层
记号!
回复

使用道具 举报

H5N1 发表于 2006-9-20 20:28:14 | 显示全部楼层
说详细一点啦,还是有点不明白哦!
加上操作数据库不明白不敢搞哦。
回复

使用道具 举报

visk 发表于 2006-9-20 20:31:48 | 显示全部楼层
cdb_posts
cdb_threads
????
回复

使用道具 举报

 楼主| degmd 发表于 2006-9-20 20:46:06 | 显示全部楼层
原帖由 H5N1 于 2006-9-20 20:28 发表
说详细一点啦,还是有点不明白哦!
加上操作数据库不明白不敢搞哦。

就是说,先执行UPDATE语句,将会员UID换成以前空缺的UID
然后用ALTER语句将UID的递增起点设置成当前的最后一位UID的下一位

前面第一个链接,不访多看下,就会明白了
回复

使用道具 举报

5025488.net 发表于 2006-9-20 20:47:47 | 显示全部楼层
支持
回复

使用道具 举报

H5N1 发表于 2006-9-20 20:54:41 | 显示全部楼层
不如写一个程序或者插件,导入数据库后全部自动完美搞定的啦。
回复

使用道具 举报

 楼主| degmd 发表于 2006-9-20 20:57:42 | 显示全部楼层
原帖由 H5N1 于 2006-9-20 20:54 发表
不如写一个程序或者插件,导入数据库后全部自动完美搞定的啦。

我好懒啊!嘿嘿,其实想过了的
回复

使用道具 举报

H5N1 发表于 2006-9-20 21:02:36 | 显示全部楼层
原帖由 degmd 于 2006-9-20 20:57 发表

我好懒啊!嘿嘿,其实想过了的


写啦!如果我会的早写了,问题是狗屁不懂呢!
我支持你!!!!
那些注册机害人不浅哦!!
回复

使用道具 举报

e_zailai 发表于 2006-9-20 21:08:26 | 显示全部楼层
支持!!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2025-4-19 16:43 , Processed in 0.094321 second(s), 17 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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