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