参考: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 编辑 ] |