📄 d60to70.php
字号:
if(file_exists(DISCUZ_ROOT.'forumdata/upgrademaxuid.log')) {
$maxuid = file(DISCUZ_ROOT.'forumdata/upgrademaxuid.log');
$maxuid = $maxuid[0];
instmsg('用户数据导入完毕。', '?step='.($maxuid > 0 ? 'merge' : '3').'&urladd='.$urladd.'&maxuid='.$maxuid);
}
if(!($maxuid = getmaxuid())) {
instmsg('准备导入用户数据 ...', '?step=2&start=0&urladd='.$urladd.'&maxuid='.$maxuid);
}
?>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>?step=2">
<table width="80%" cellspacing="1" bgcolor="#000000" border="0" align="center">
<tr bgcolor="#3A4273"><td style="color: #FFFFFF; padding-left: 10px" colspan="2">导入方法</td></tr>
<tr>
<td class="altbg1" width="100"><input name="method" onclick="$('maxuidtable').style.display=''" style="background:none" type="radio" value="0" checked> 标准方法</td>
<td class="altbg2">当 UCenter 中已存在用户数据,本论坛的用户 ID 会按照“用户 ID 起始值”进行提升追加在 UCenter 最大用户 ID 后。</td></tr>
<td class="altbg1" width="100"><input name="method" onclick="$('maxuidtable').style.display='none'" style="background:none" type="radio" value="1"> ECShop 方法</td>
<td class="altbg2">当 UCenter 中存在有 ECShop 用户数据,本论坛的用户 ID 不发生变化并将按照一一对应的方式导入关联。</td></tr>
<td class="altbg1" width="100"><input name="mergerepeat" style="background:none" type="checkbox" value="1"> 合并重复用户</td>
<td class="altbg2">当需要导入的用户在 UCenter 中已存在且密码相同,用户将会进行合并,使用已存在的用户 ID。(此操作会延长升级时间)</td></tr>
</table><br />
<span id="maxuidtable">
<table width="80%" cellspacing="1" bgcolor="#000000" border="0" align="center">
<tr bgcolor="#3A4273"><td style="color: #FFFFFF; padding-left: 10px" colspan="2">用户 ID 起始值</td></tr>
<tr>
<td class="altbg1">用户 ID 起始值:</td>
<td class="altbg2"><input onclick="alert('除非您非常了解此数值的作用,否则不建议您修改此默认值');this.onclick=null" class="txt" type="text" name="maxuidset" value="<?=$maxuid?>" size="10">
起始用户 ID 必须大于等于 <?=$maxuid?>。如填写 10000 那么,原 ID 为 888 的用户将变为 10888。</td>
</tr>
</table><br /></span>
<center>
<input type="button" name="ucsubmit" value=" <?=$lang['old_step']?> " style="height: 25" onclick="history.back()">
<input type="submit" name="ucsubmit" value=" <?=$lang['new_step']?> " style="height: 25"></center>
</center>
</form>
<?
instfooter();
exit;
}
$method = intval(isset($_POST['method']) ? $_POST['method'] : $_GET['method']);
$start = intval(getgpc('start'));
$mergerepeat = intval(isset($_POST['mergerepeat']) ? $_POST['mergerepeat'] : $_GET['mergerepeat']);
$limit = 5000;
$total = intval(getgpc('total'));
$maxuid = !$method ? intval(getgpc('maxuid')) : 0;
$lastuid = intval(getgpc('lastuid'));
if(!$total) {
if(!$method) {
$maxuid = getmaxuid();
$maxuidset = intval($_POST['maxuidset']);
if($maxuidset < $maxuid) {
@unlink(DISCUZ_ROOT.'forumdata/upgrademaxuid.log');
instmsg('起始用户 ID 必须大于等于 '.$maxuid.',请返回重新填写。', '?step=4&urladd='.$urladd);
} else {
$maxuid = $maxuidset;
}
} else {
$maxuid = getmaxuid();
}
$query = $db->query("SELECT COUNT(*) FROM {$tablepre}members");
$total = $db->result($query, 0);
$fp = @fopen(DISCUZ_ROOT.'forumdata/upgrademaxuid.log', 'w');
@fwrite($fp, $maxuid."\r\n此文件提供给论坛插件作者升级插件之用,以上数值为本论坛由 Discuz! 6.0.0 升级到 Discuz! 7.0.0 后 UID 的偏移量");
@fclose($fp);
if(!empty($forumfounders)) {
$discuzconfig = DISCUZ_ROOT.'./config.inc.php';
$s = file_get_contents($discuzconfig);
$s = trim($s);
$s = substr($s, -2) == '?>' ? substr($s, 0, -2) : $s;
$forumfounderarray = explode(',', $forumfounders);
foreach($forumfounderarray as $k => $u) {
$forumfounderarray[$k] = is_numeric($u) ? $u + $maxuid : $u;
}
$forumfounders = implode(',', $forumfounderarray);
$s = insertconfig($s, "/[$]forumfounders\s*\=\s*[\"'].*?[\"'];/is", "\$forumfounders = '$forumfounders';");
if(!($fp = @fopen($discuzconfig, 'w'))) {
instmsg('配置文件写入失败,请返回检查 ./config.inc.php 的权限是否为0777 ');
}
@fwrite($fp, $s);
@fclose($fp);
}
}
if($total == 0 || $total <= $start) {
$ucdb->query("ALTER TABLE ".UC_DBTABLEPRE."members AUTO_INCREMENT=".($lastuid + 1));
instmsg('用户数据导入完毕。', '?step='.($maxuid > 0 ? 'merge' : '3').'&urladd='.$urladd.'&maxuid='.$maxuid.'&mergerepeat='.$mergerepeat);
}
$query = $db->query("SELECT * FROM {$tablepre}members LIMIT $start, $limit");
if($ucdb->version() > '4.1' && $ucdb == $db && $dbname != UC_DBNAME) {
$ucdb->query("SET NAMES ".UC_DBCHARSET);
}
$repeatusers = array();
while($data = $db->fetch_array($query)) {
$salt = rand(100000, 999999);
$password = md5($data['password'].$salt);
$secques = $data['secques'];
$data['username'] = addslashes($data['username']);
$lastuid = $data['uid'] += $maxuid;
$queryuc = $ucdb->query("SELECT uid, salt, password FROM ".UC_DBTABLEPRE."members WHERE username='$data[username]'");
$ucdata = $ucdb->fetch_array($queryuc);
if(!$ucdata) {
$ucdb->query("INSERT LOW_PRIORITY INTO ".UC_DBTABLEPRE."members SET uid='$data[uid]', username='$data[username]', password='$password', secques='$secques',
email='$data[email]', regip='$data[regip]', regdate='$data[regdate]', salt='$salt'", 'SILENT');
$ucdb->query("INSERT LOW_PRIORITY INTO ".UC_DBTABLEPRE."memberfields SET uid='$data[uid]'",'SILENT');
} else {
if($mergerepeat) {
if(md5($data['password'].$ucdata['salt']) == $ucdata['password']) {
$repeatusers[] = $data['uid']."\t".$ucdata['uid'];
} else {
$ucdb->query("REPLACE INTO ".UC_DBTABLEPRE."mergemembers SET appid='".UC_APPID."', username='$data[username]'", 'SILENT');
}
} elseif(!$method) {
$ucdb->query("REPLACE INTO ".UC_DBTABLEPRE."mergemembers SET appid='".UC_APPID."', username='$data[username]'", 'SILENT');
}
}
}
if(!empty($repeatusers)) {
$fp = fopen(DISCUZ_ROOT.'forumdata/repeatuser.log', 'a+');
fwrite($fp, implode("\n", $repeatusers));
fclose($fp);
}
$end = $start + $limit;
instmsg("用户数据导入到 UCenter $start / $total ...", '?step=2&'.$urladd.'&start='.$end.'&total='.$total.'&maxuid='.$maxuid.'&lastuid='.$lastuid.'&method='.$method.'&mergerepeat='.$mergerepeat);
instfooter();
} elseif($step == 'merge') {
echo "<h4>合并用户数据</h4>";
$maxuid = intval(getgpc('maxuid'));
$mergerepeat = intval(getgpc('mergerepeat'));
$uidfields = getuidfields();
$start = intval(getgpc('start'));
$end = $start + 1;
$total = count($uidfields);
if($total == 0 || $total <= $start) {
if($mergerepeat) {
instmsg('用户数据合并完毕。', '?step=mergerepeat&urladd='.$urladd);
} else {
instmsg('用户数据合并完毕。', '?step=3&urladd='.$urladd);
}
}
$value = $uidfields[$start];
list($table, $field, $stepfield) = explode('|', $value);
$logs = array();
$logs = explode('|', @file_get_contents(DISCUZ_ROOT.'forumdata/upgrade.log'));
if(!in_array($table, $logs)) {
$fields = !$field ? array('uid') : explode(',', $field);
if($stepfield) {
$mlimit = 5000;
$mstart = intval(getgpc('mstart'));
$mtotal = intval(getgpc('total'));
if(!$mtotal) {
$query = $db->query("SELECT `$stepfield` FROM `{$tablepre}$table` ORDER BY `$stepfield` DESC LIMIT 1");
$mtotal = $db->result($query, 0);
}
if($mtotal != 0 && $mtotal > $mstart) {
$mend = $mstart + $mlimit;
$urladd = 'mstart='.$mend;
foreach($fields as $field) {
$db->query("UPDATE `{$tablepre}$table` SET `$field`=`$field`+$maxuid WHERE `$stepfield` >= $mstart AND `$stepfield` < $mend ORDER BY `$field` DESC");
}
instmsg("正在处理用户合并数据 {$tablepre}$table $mstart / $mtotal ...", '?step=merge&'.$urladd.'&start='.$start.'&maxuid='.$maxuid.'&mergerepeat='.$mergerepeat);
} else {
$fp = fopen(DISCUZ_ROOT.'forumdata/upgrade.log', 'a+');
fwrite($fp, $table."|");
fclose($fp);
}
} else {
foreach($fields as $field) {
$db->query("UPDATE `{$tablepre}$table` SET `$field`=`$field`+$maxuid ORDER BY `$field` DESC");
}
$fp = fopen(DISCUZ_ROOT.'forumdata/upgrade.log', 'a+');
fwrite($fp, $table."|");
fclose($fp);
}
}
instmsg("{$tablepre}$table 表合并完毕。", '?step=merge&'.$urladd.'&start='.$end.'&maxuid='.$maxuid.'&mergerepeat='.$mergerepeat);
} elseif($step == 'mergerepeat') {
echo "<h4>合并重复用户</h4>";
$start = intval(getgpc('start'));
$end = $start + 1;
$uids = @file(DISCUZ_ROOT.'forumdata/repeatuser.log');
$total = count($uids);
if($total == 0 || $total <= $start) {
@unlink(DISCUZ_ROOT.'forumdata/repeatuser.log');
instmsg('重复用户合并完毕。', '?step=3&urladd='.$urladd);
}
for($i = $start;$i < $end;$i++) {
if(empty($uids[$i])) {
break;
}
list($olduid, $newuid) = explode("\t", $uids[$i]);
$uidfields = getuidfields();
foreach($uidfields as $value) {
list($table, $field, $stepfield) = explode('|', $value);
$fields = !$field ? array('uid') : explode(',', $field);
foreach($fields as $field) {
$db->query("UPDATE `{$tablepre}$table` SET `$field`='$newuid' WHERE `$field`='$olduid'");
}
}
}
instmsg("正在处理重复用户的合并 $start / $total ...", '?step=mergerepeat&'.$urladd.'&start='.$end);
} elseif($step == 3) {
echo "<h4>导入好友数据</h4>";
$ucdb = new dbstuff();
$ucdb->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, 0, FALSE, UC_DBCHARSET);
$db->select_db($dbname);
$start = intval(getgpc('start'));
$limit = 5000;
$total = intval(getgpc('total'));
if(!$total) {
$query = $db->query("SELECT COUNT(*) FROM {$tablepre}buddys");
$total = $db->result($query, 0);
}
if($total == 0 || $total <= $start) {
instmsg('导入好友数据完毕。', '?step=4&urladd='.$urladd);
}
$query = $db->query("SELECT * FROM {$tablepre}buddys LIMIT $start, $limit");
if($ucdb->version() > '4.1' && $ucdb == $db && $dbname != UC_DBNAME) {
$ucdb->query("SET NAMES ".UC_DBCHARSET);
}
while($data = $db->fetch_array($query)) {
$ucdb->query("INSERT LOW_PRIORITY INTO ".UC_DBTABLEPRE."friends SET uid='$data[uid]', friendid='$data[buddyid]', direction='1',
version='0', delstatus='0', comment='$data[description]'", 'SILENT');
}
$end = $start + $limit;
instmsg("正在导入好友数据 $start / $total ...", '?step=3&'.$urladd.'&start='.$end.'&total='.$total);
instfooter();
} elseif($step == 4) {
$ucdbhost = $_POST['ucdbhost'];
$ucdbuser = $_POST['ucdbuser'];
$ucdbpw = $_POST['ucdbpw'];
$ucdbname = $_POST['ucdbname'];
$ucdbcharset = $_POST['ucdbcharset'];
$uctablepre = $_POST['uctablepre'];
echo "<h4>处理短消息数据</h4>";
$ucdb = new dbstuff();
$ucdb->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, 0, FALSE, UC_DBCHARSET);
$db->select_db($dbname);
$commonpm = getgpc('commonpm');
if(!$commonpm) {
$arr = $db->fetch_first("SELECT uid, username FROM {$tablepre}members WHERE adminid='1' LIMIT 1");
$query = $db->query("SELECT * FROM {$tablepre}announcements WHERE type='2'");
while($data = $db->fetch_array($query)) {
$data['subject'] = addslashes($data['subject']);
$data['message'] = addslashes($data['message']);
$ucdb->query("INSERT INTO ".UC_DBTABLEPRE."pms SET msgfrom='$arr[username]', msgfromid='$arr[uid]', msgtoid='0', folder='inbox', subject='$data[subject]', message='$data[message]', dateline='$data[dateline]'");
}
}
$start = intval(getgpc('start'));
$limit = 5000;
$total = intval(getgpc('total'));
if(!$total) {
$total = $db->result_first("SELECT COUNT(*) FROM {$tablepre}pms");
}
$ucdb = new dbstuff();
$ucdb->connect(UC_DBHOST, UC_DBUSER, UC_DBPW, UC_DBNAME, 0, FALSE, UC_DBCHARSET);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -