📄 upgrade7.php
字号:
EOT;
$upgrademsg = array(
1 => '论坛升级第 1 步: 增加基本设置<br>',
2 => '论坛升级第 2 步: 调整论坛数据表结构<br>',
3 => '论坛升级第 3 步: 调整会员数据表结构<br>',
4 => '论坛升级第 4 步: 增加主题数据表结构<br>',
5 => '论坛升级第 5 步: 增加附件数据表结构<br>',
6 => '论坛升级第 6 步: 新增部分数据表<br>',
7 => '论坛升级第 7 步: 转换投票数据,如果您的投票主题比较多,此步骤需要较长时间<br>',
8 => '论坛升级第 8 步: 转换附件数据,如果您的附件比较多,此步骤需要较长时间<br>',
9 => '论坛升级第 9 步: 转换论坛栏目资料,如果您的论坛栏目比较多,此步骤需要较长时间<br>',
10 => '论坛升级第 10 步: 增加 X-Space 和 SupeSite 支持<br>',
11 => '论坛升级第 11 步: 升级全部完毕<br>',
);
if(!$action) {
echo "本程序用于升级 $version_old 到 $version_new,请确认之前已经顺利安装 $version_old <br><br><br>",
"<b><font color=\"red\">本升级程序只能从 $version_old 升级到 $version_new ,运行之前,请确认已经上传 $version_new 的全部文件和目录</font></b><br>",
"<b><font color=\"red\">升级前请打开浏览器 JavaScript 支持,整个过程是自动完成的,不需人工点击和干预.<br>升级之前务必备份数据库资料,否则可能产生无法恢复的后果!<br></font></b><br><br>",
"正确的升级方法为:<br><ol><li>关闭原有论坛,上传 $version_new 的全部文件和目录,覆盖服务器上的 $version_old <li>上传本程序到 Discuz! 目录中,并确认已经重新配置好 config.inc.php <li>运行本程序,直到出现升级完成的提示</ol><br>",
"<a href=\"$PHP_SELF?action=upgrade&step=1\">如果您已确认完成上面的步骤,请点这里升级</a>";
} else {
$db = new dbstuff;
$db->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
$db->select_db($dbname);
unset($dbhost, $dbuser, $dbpw, $dbname, $pconnect);
$step = intval($step);
echo $upgrademsg[$step];
flush();
if($step == 1) {
dir_clear('./forumdata/cache');
dir_clear('./forumdata/templates');
if(!dir_writeable('./forumdata/threadcaches')) {
echo '升级检测失败,无法建立目录 /forumdata/threadcaches,请手工建立此目录,然后重新运行升级程序';
exit;
}
runquery($upgrade1);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 2) {
runquery($upgrade2);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 3) {
runquery($upgrade3);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 4) {
runquery($upgrade4);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 5) {
runquery($upgrade5);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 6) {
runquery($upgrade6);
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
} elseif($step == 7) {
$limit = 500; // 每次升级多少投票主题
$start = intval($start);
$next = FALSE;
$query = $db->query("SELECT tid, pollopts from {$tablepre}polls_temp LIMIT $start, $limit");
while($array = $db->fetch_array($query)) {
$next = TRUE;
$polltid = $array['tid'];
$pollopts = unserialize($array['pollopts']);
foreach($pollopts['options'] as $temp_options) {
$db->query("REPLACE INTO {$tablepre}polloptions (tid, votes, polloption) VALUES ('$polltid', '$temp_options[1]', '$temp_options[0]')");
}
if($pollopts['multiple']) {
$maxchoices = 0;
} else {
$maxchoices = 1;
}
$closedquery = $db->query("SELECT closed FROM {$tablepre}threads WHERE tid='$polltid'");
$closed = $db->result($closedquery, 0);
$expiration = $closed ? $timestamp : 0;
$db->query("REPLACE INTO {$tablepre}polls (tid, multiple, visible, maxchoices, expiration) VALUES ('$polltid', '$pollopts[multiple]', '1', '$maxchoices', '$expiration')");
}
if($next) {
echo "正在进行第 $step 步升级 起始列数: $start<br><br>";
redirect("?action=upgrade&step=$step&start=".($start+$limit));
} else {
$db->query("DROP TABLE IF EXISTS cdb_polls_temp");
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
}
} elseif($step == 8) {
$limit = 500; // 每次升级多少附件
$next = FALSE;
$start = $start ? intval($start) : 0;
$query = $db->query("SELECT a.aid, a.filetype, p.authorid FROM {$tablepre}attachments a, {$tablepre}posts p WHERE a.pid=p.pid LIMIT $start, $limit");
while($data = $db->fetch_array($query)) {
$next = TRUE;
$isimage = substr($data['filetype'], 0, 5) == 'image' ? '1' : '0';
$db->query("UPDATE {$tablepre}attachments SET isimage='$isimage', uid='$data[authorid]' WHERE aid='$data[aid]'");
}
if($next) {
redirect("?action=upgrade&step=$step&start=".($start + $limit));
} else {
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
}
} elseif($step == 9) {
$limit = 100; // 每次升级多少栏目板块
$next = FALSE;
$start = $start ? intval($start) : 0;
$query = $db->query("SELECT fid, threadtypes FROM {$tablepre}forumfields WHERE 1 LIMIT $start, $limit");
while($forum = $db->fetch_array($query)) {
$next = TRUE;
$forum['threadtypes'] = unserialize($forum['threadtypes']);
if(!empty($forum['threadtypes']['types'])) {
$newthreadtypes = addslashes(serialize(array
(
'required' => (bool)$forum['threadtypes']['required'],
'listable' => (bool)$forum['threadtypes']['listable'],
'prefix' => (bool)$forum['threadtypes']['prefix'],
'types' => $forum['threadtypes']['types'],
'selectbox' => '',
'flat' => $forum['threadtypes']['types'],
)));
} else {
$newthreadtypes = '';
}
$db->query("UPDATE {$tablepre}forumfields SET threadtypes='$newthreadtypes' WHERE fid='$forum[fid]'");
}
if($next) {
redirect("?action=upgrade&step=$step&start=".($start + $limit));
} else {
echo "第 $step 步升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
}
} elseif($step == 10) {
$start = $start ? intval($start) : 1;
if($start == 1) {
$supe = array();
$query = $db->query("SELECT * FROM {$tablepre}settings WHERE variable IN ('supe_maxupdateusers', 'supe_status', 'supe_siteurl', 'supe_sitename', 'supe_tablepre')");
while($setting = $db->fetch_array($query)) {
$supe[$setting['variable']] = $setting['value'];
}
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('supe_maxupdateusers', '$supe[supe_maxupdateusers]')");
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('supe_status', '$supe[supe_status]')");
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('supe_siteurl', '$supe[supe_siteurl]')");
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('supe_sitename', '$supe[supe_sitename]')");
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('supe_tablepre', '$supe[supe_tablepre]')");
$db->query("ALTER TABLE {$tablepre}forumfields ADD supe_pushsetting TEXT NOT NULL", 'SILENT');
$db->query("ALTER TABLE {$tablepre}admingroups ADD supe_allowpushthread tinyint(1) NOT NULL default '0'", 'SILENT');
$db->query("UPDATE {$tablepre}admingroups SET supe_allowpushthread='1' WHERE admingid='1'", 'SILENT');
echo "第 $step 步 步骤[ $start ] 升级成功<br><br>";
redirect("?action=upgrade&step=$step&start=2");
} else {
$db->query("ALTER TABLE {$tablepre}members ADD xspacestatus tinyint(1) NOT NULL default '0'", 'SILENT');
$db->query("ALTER TABLE {$tablepre}threads ADD itemid mediumint(8) unsigned NOT NULL default '0'", 'SILENT');
$db->query("ALTER TABLE {$tablepre}threads ADD supe_pushstatus tinyint(1) NOT NULL default '0'", 'SILENT');
echo "第 $step 步 步骤[ $start ] 升级成功<br><br>";
redirect("?action=upgrade&step=".($step+1));
}
} else {
echo '<br>恭喜您论坛数据升级成功,接下来请您:<ol><li><b>必删除本程序</b>'.
'<li>使用管理员身份登录论坛,进入后台,更新缓存'.
'<li>进行论坛注册、登录、发贴等常规测试,看看运行是否正常'.
'<li>如果您希望启用 <b>'.$version_new.'</b> 提供的新功能,你还需要对于论坛基本设置、栏目、会员组等等进行重新设置</ol><br><br>'.
'<b>感谢您选用我们的产品!</b>';
exit;
}
}
function dir_clear($dir) {
$directory = dir($dir);
while($entry = $directory->read()) {
$filename = $dir.'/'.$entry;
if(is_file($filename)) {
@unlink($filename);
}
}
$directory->close();
}
function dir_writeable($dir) {
if(!is_dir($dir)) {
@mkdir($dir, 0777);
}
if(is_dir($dir)) {
if($fp = @fopen("$dir/test.test", 'w')) {
@fclose($fp);
@unlink("$dir/test.test");
$writeable = 1;
} else {
$writeable = 0;
}
}
return $writeable;
}
function daddslashes($string) {
if(is_array($string)) {
foreach($string as $key => $val) {
$string[$key] = daddslashes($val, $force);
}
} else {
$string = addslashes($string);
}
return $string;
}
function loginit($log) {
global $lang;
$fp = @fopen('./forumdata/'.$log.'.php');
@fwrite($fp, "<?PHP exit(\"Access Denied\"); ?>\n");
@fclose($fp);
}
function runquery($query) {
global $db, $tablepre, $dbcharset;
$expquery = explode(";", $query);
foreach($expquery as $sql) {
$sql = trim($sql);
if($sql == '' || $sql[0] == '#') continue;
$sql = str_replace(' cdb_', ' '.$tablepre, $sql);
if(strtoupper(substr($sql, 0, 12)) == 'CREATE TABLE') {
$db->query(createtable($sql, $dbcharset));
} else {
$db->query($sql);
}
}
}
function redirect($url) {
echo "<script>",
"function redirect() {window.location.replace('$url');}\n",
"setTimeout('redirect();', 500);\n",
"</script>",
"<br><br><a href=\"$url\">浏览器会自动跳转页面,无需人工干预。<br>除非当您的浏览器没有自动跳转时,请点击这里</a>";
flush();
}
function createtable($sql, $dbcharset) {
$type = strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU", "\\2", $sql));
$type = in_array($type, array('MYISAM', 'HEAP')) ? $type : 'MYISAM';
return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql).
(mysql_get_server_info() > '4.1' ? " ENGINE=$type default CHARSET=$dbcharset" : " TYPE=$type");
}
?>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -