DiscuzX/utility/update.php

2303 lines
98 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
/**
* [Discuz!] (C)2001-2099 Comsenz Inc.
* This is NOT a freeware, use is subject to license terms
*
* $Id: update.php 36348 2017-01-13 06:36:44Z nemohou $
*/
include_once('../source/class/class_core.php');
include_once('../source/function/function_core.php');
@set_time_limit(0);
$cachelist = array();
$discuz = C::app();
$discuz->cachelist = $cachelist;
$discuz->init_cron = false;
$discuz->init_setting = true;
$discuz->init_user = false;
$discuz->init_session = false;
$discuz->init_misc = false;
$discuz->init();
$config = array(
'dbcharset' => $_G['config']['db']['1']['dbcharset'],
'charset' => $_G['config']['output']['charset'],
'tablepre' => $_G['config']['db']['1']['tablepre']
);
$theurl = 'update.php';
$_G['siteurl'] = preg_replace('/\/install\/$/i', '/', $_G['siteurl']);
if($_GET['from']) {
if(md5($_GET['from'].$_G['config']['security']['authkey']) != $_GET['frommd5']) {
$refererarr = parse_url(dreferer());
list($dbreturnurl, $dbreturnurlmd5) = explode("\t", authcode($_GET['from']));
if(md5($dbreturnurl) == $dbreturnurlmd5) {
$dbreturnurlarr = parse_url($dbreturnurl);
} else {
$dbreturnurlarr = parse_url($_GET['from']);
}
parse_str($dbreturnurlarr['query'], $dbreturnurlparamarr);
$operation = $dbreturnurlparamarr['operation'];
$version = $dbreturnurlparamarr['version'];
$release = $dbreturnurlparamarr['release'];
if(!$operation || !$version || !$release) {
show_msg('请求的参数不正确');
}
$time = $_G['timestamp'];
dheader('Location: '.$_G['siteurl'].basename($refererarr['path']).'?action=upgrade&operation='.$operation.'&version='.$version.'&release='.$release.'&ungetfrom='.$time.'&ungetfrommd5='.md5($time.$_G['config']['security']['authkey']));
}
}
$lockfile = DISCUZ_ROOT.'./data/update.lock';
if(file_exists($lockfile) && !$_GET['from']) {
show_msg('请您先登录服务器ftp手工删除 ./data/update.lock 文件,再次运行本文件进行升级。');
}
$devmode = file_exists(DISCUZ_ROOT.'./install/data/install_dev.sql');
$sqlfile = DISCUZ_ROOT.($devmode ? './install/data/install_dev.sql' : './install/data/install.sql');
if(!file_exists($sqlfile)) {
show_msg('SQL文件 '.$sqlfile.' 不存在');
}
$first_to_2_5 = !C::t('common_setting')->skey_exists('strongpw');
$first_to_3_0 = !C::t('common_setting')->skey_exists('antitheft');
if($_POST['delsubmit']) {
if(!empty($_POST['deltables'])) {
foreach ($_POST['deltables'] as $tname => $value) {
DB::query("DROP TABLE `".DB::table($tname)."`");
}
}
if(!empty($_POST['delcols'])) {
foreach ($_POST['delcols'] as $tname => $cols) {
foreach ($cols as $col => $indexs) {
if($col == 'PRIMARY') {
DB::query("ALTER TABLE ".DB::table($tname)." DROP PRIMARY KEY", 'SILENT');
} elseif($col == 'KEY' || $col == 'UNIQUE') {
foreach ($indexs as $index => $value) {
DB::query("ALTER TABLE ".DB::table($tname)." DROP INDEX `$index`", 'SILENT');
}
} else {
DB::query("ALTER TABLE ".DB::table($tname)." DROP `$col`");
}
}
}
}
show_msg('删除表和字段操作完成了', $theurl.'?step=style');
}
function waitingdb($curstep, $sqlarray) {
global $theurl;
foreach($sqlarray as $key => $sql) {
$sqlurl .= '&sql[]='.md5($sql);
$sendsql .= '<img width="1" height="1" src="'.$theurl.'?step='.$curstep.'&waitingdb=1&sqlid='.$key.'">';
}
show_msg("优化数据表", $theurl.'?step=waitingdb&nextstep='.$curstep.$sqlurl.'&sendsql='.base64_encode($sendsql), 5000, 1);
}
if(empty($_GET['step'])) $_GET['step'] = 'start';
if($_GET['step'] == 'start') {
include_once('../config/config_ucenter.php');
include_once('../uc_client/client.php');
$version = uc_check_version();
$version = $version['db'];
if(!$devmode && !C::t('common_setting')->fetch('bbclosed')) {
C::t('common_setting')->update('bbclosed', 1);
require_once libfile('function/cache');
updatecache('setting');
show_msg('您的站点未关闭,正在关闭,请稍后...', $theurl.'?step=start', 5000);
}
if(version_compare($version, '1.5.2') <= 0) {
show_msg('请先升级 UCenter 到 1.6.0 以上版本。<br>如果使用为Discuz! X自带UCenter请先下载 UCenter 1.6.0, 在 utilities 目录下找到对应的升级程序,复制或上传到 Discuz! X 的 uc_server 目录下,运行该程序进行升级');
} else {
show_msg('说明:<br>本升级程序会参照最新的SQL文件对数据库进行同步升级。<br>
请确保当前目录下 ./data/install.sql 文件为最新版本。<br><br>
升级完成后会关闭所有插件以确保正常运行,请站长逐个开启每一个插件检测是否兼容新版本。<br><br>
<a href="'.$theurl.'?step=prepare'.($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '').'">准备完毕,升级开始</a>');
}
} elseif ($_GET['step'] == 'waitingdb') {
$query = DB::fetch_all("SHOW FULL PROCESSLIST");
foreach($query as $row) {
if(in_array(md5($row['Info']), $_GET['sql'])) {
$list .= '[时长]:'.$row['Time'].'秒 [状态]:<b>'.$row['State'].'</b>[信息]:'.$row['Info'].'<br><br>';
}
}
if(empty($list) && empty($_GET['sendsql'])) {
$msg = '准备进入下一步操作,请稍后...';
$notice = '';
$url = "?step=$_GET[nextstep]";
$time = 5;
} else {
$msg = '正在升级数据,请稍后...';
$notice = '<br><br><b>以下是正在执行的数据库升级语句:</b><br>'.$list.base64_decode($_GET['sendsql']);
$sqlurl = implode('&sql[]=', $_GET['sql']);
$url = "?step=waitingdb&nextstep=$_GET[nextstep]&sql[]=".$sqlurl;
$time = 20;
}
show_msg($msg, $theurl.$url, $time*1000, 0, $notice);
} elseif ($_GET['step'] == 'prepare') {
if(!C::t('common_setting')->skey_exists('group_recommend')) {
C::t('forum_groupinvite')->truncate();
}
if(DB::fetch_first("SHOW COLUMNS FROM ".DB::table('forum_activityapply')." LIKE 'contact'")) {
$query = DB::query("UPDATE ".DB::table('forum_activityapply')." SET message=CONCAT_WS(' 联系方式:', message, contact) WHERE contact<>''");
DB::query("ALTER TABLE ".DB::table('forum_activityapply')." DROP contact");
}
if($row = DB::fetch_first("SHOW COLUMNS FROM ".DB::table('forum_postcomment')." LIKE 'authorid'")) {
if(strstr($row['Type'], 'unsigned')) {
DB::query("ALTER TABLE ".DB::table('forum_postcomment')." CHANGE authorid authorid mediumint(8) NOT NULL default '0'");
DB::query("UPDATE ".DB::table('forum_postcomment')." SET authorid='-1' WHERE authorid='0'");
}
}
if(!$row = DB::fetch_first("SHOW COLUMNS FROM ".DB::table('common_failedlogin')." LIKE 'username'")) {
DB::query("TRUNCATE ".DB::table('common_failedlogin'));
DB::query("ALTER TABLE ".DB::table('common_failedlogin')." ADD username char(32) NOT NULL default '' AFTER ip");
DB::query("ALTER TABLE ".DB::table('common_failedlogin')." DROP PRIMARY KEY");
DB::query("ALTER TABLE ".DB::table('common_failedlogin')." ADD PRIMARY KEY ipusername (ip,username)");
}
if(!$row = DB::fetch_first("SHOW COLUMNS FROM ".DB::table('forum_forumfield')." LIKE 'seodescription'")) {
DB::query("ALTER TABLE ".DB::table('forum_forumfield')." ADD seodescription text NOT NULL default '' COMMENT '版块seo描述' AFTER keywords");
DB::query("UPDATE ".DB::table('forum_forumfield')." SET seodescription=description WHERE membernum='0'");
}
if(DB::fetch_first("SHOW TABLES LIKE '".DB::table('common_tagitem')."'")) {
$noexist_itemkey = true;
$query = DB::query("SHOW INDEX FROM ".DB::table('common_tagitem'));
while($row = DB::fetch($query)) {
if($row['Key_name'] == 'item') {
$noexist_itemkey = false;
break;
}
}
if($noexist_itemkey) {
$query = DB::query("SELECT *, count(idtype) AS rcount FROM ".DB::table('common_tagitem')." GROUP BY tagid,itemid,idtype ORDER BY rcount DESC");
while($row = DB::fetch($query)) {
if($row['rcount'] > 1) {
DB::query("DELETE FROM ".DB::table('common_tagitem')." WHERE tagid='$row[tagid]' AND itemid='$row[itemid]' AND idtype='$row[idtype]' LIMIT ".($row['rcount'] - 1));
} else {
break;
}
}
}
}
$posttables = get_special_tables_array('forum_post');
$posttables[] = 'forum_post';
foreach($posttables as $post_tablename) {
if(!DB::fetch_first("SHOW COLUMNS FROM ".DB::table($post_tablename)." LIKE 'position'")) {
$sql[] = "ALTER TABLE ".DB::table($post_tablename)." ORDER BY tid ASC, first DESC, pid ASC";
$replycreditsql = '';
if(DB::fetch_first("SHOW COLUMNS FROM ".DB::table($post_tablename)." LIKE 'replycredit'")) {
$replycreditsql = "CHANGE `replycredit` `replycredit` int(10) NOT NULL default '0',";
}
$sql[] = "ALTER TABLE ".DB::table($post_tablename)." CHANGE `pid` `pid` INT(10) UNSIGNED NOT NULL,$replycreditsql CHANGE `status` `status` int(10) NOT NULL default '0', ADD UNIQUE KEY pid (pid), DROP PRIMARY KEY, ADD `position` INT(8) UNSIGNED NOT NULL AUTO_INCREMENT, ADD PRIMARY KEY(`tid`, `position`), DROP INDEX authorid, ADD INDEX authorid (authorid,invisible)";
if(!$_GET['waitingdb']) {
waitingdb('prepare', $sql);
} else {
if($sql[$_GET[sqlid]]) {
DB::query($sql[$_GET[sqlid]], array(), false, true);
}
}
exit();
}
}
$diydata = array('common_diy_data' => 0, 'common_template_block' => 0);
foreach(DB::fetch_all('SHOW KEYS FROM '.DB::table('common_diy_data')) as $_key) {
if($_key['Key_name'] == 'PRIMARY') {
$diydata['common_diy_data']++;
}
}
foreach(DB::fetch_all('SHOW KEYS FROM '.DB::table('common_template_block')) as $_key) {
if($_key['Key_name'] == 'PRIMARY') {
$diydata['common_template_block']++;
}
}
if($diydata['common_diy_data'] == 1) {
DB::query('ALTER TABLE '.DB::table('common_diy_data').' DROP PRIMARY KEY');
}
if($diydata['common_template_block'] == 2) {
DB::query('ALTER TABLE '.DB::table('common_template_block').' DROP PRIMARY KEY');
}
show_msg('准备完毕,进入下一步数据库结构升级', $theurl.'?step=sql');
} elseif ($_GET['step'] == 'sql') {
$sql = implode('', file($sqlfile));
preg_match_all("/CREATE\s+TABLE.+?pre\_(.+?)\s*\((.+?)\)\s*(ENGINE|TYPE)\s*=\s*(\w+)/is", $sql, $matches);
$newtables = empty($matches[1])?array():$matches[1];
$newsqls = empty($matches[0])?array():$matches[0];
if(empty($newtables) || empty($newsqls)) {
show_msg('SQL文件内容为空请确认');
}
$i = empty($_GET['i'])?0:intval($_GET['i']);
$count_i = count($newtables);
if($i>=$count_i) {
show_msg('数据库结构升级完毕,进入下一步数据升级操作', $theurl.'?step=data');
}
$newtable = $newtables[$i];
$specid = intval($_GET['specid']);
if($specid && in_array($newtable, array('forum_post', 'forum_thread'))) {
$spectable = $newtable;
$newtable = get_special_table_by_num($newtable, $specid);
}
$newcols = getcolumn($newsqls[$i]);
if(!$query = DB::query("SHOW CREATE TABLE ".DB::table($newtable), 'SILENT')) {
preg_match("/(CREATE TABLE .+?)\s*(ENGINE|TYPE)\s*=\s*(\w+)/is", $newsqls[$i], $maths);
$maths[3] = strtoupper($maths[3]);
if($maths[3] == 'MEMORY' || $maths[3] == 'HEAP') {
$type = helper_dbtool::dbversion() > '4.1' ? " ENGINE=MEMORY".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ): " TYPE=HEAP";
} else {
$type = helper_dbtool::dbversion() > '4.1' ? " ENGINE=MYISAM".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ): " TYPE=MYISAM";
}
$usql = $maths[1].$type;
$usql = str_replace("CREATE TABLE IF NOT EXISTS pre_", 'CREATE TABLE IF NOT EXISTS '.$config['tablepre'], $usql);
$usql = str_replace("CREATE TABLE pre_", 'CREATE TABLE '.$config['tablepre'], $usql);
if(!DB::query($usql, 'SILENT')) {
show_msg('添加表 '.DB::table($newtable).' 出错,请手工执行以下SQL语句后,再重新运行本升级程序:<br><br>'.dhtmlspecialchars($usql));
} else {
$msg = '添加表 '.DB::table($newtable).' 完成';
}
} else {
$value = DB::fetch($query);
$oldcols = getcolumn($value['Create Table']);
$updates = array();
$allfileds =array_keys($newcols);
foreach ($newcols as $key => $value) {
if($key == 'PRIMARY') {
if($value != $oldcols[$key]) {
if(!empty($oldcols[$key])) {
$usql = "RENAME TABLE ".DB::table($newtable)." TO ".DB::table($newtable.'_bak');
if(!DB::query($usql, 'SILENT')) {
show_msg('升级表 '.DB::table($newtable).' 出错,请手工执行以下升级语句后,再重新运行本升级程序:<br><br><b>升级SQL语句</b>:<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\">'.dhtmlspecialchars($usql)."</div><br><b>Error</b>: ".DB::error()."<br><b>Errno.</b>: ".DB::errno());
} else {
$msg = '表改名 '.DB::table($newtable).' 完成!';
show_msg($msg, $theurl.'?step=sql&i='.$_GET['i']);
}
}
$updates[] = "ADD PRIMARY KEY $value";
}
} elseif ($key == 'KEY') {
foreach ($value as $subkey => $subvalue) {
if(!empty($oldcols['KEY'][$subkey])) {
if($subvalue != $oldcols['KEY'][$subkey]) {
$updates[] = "DROP INDEX `$subkey`";
$updates[] = "ADD INDEX `$subkey` $subvalue";
}
} else {
$updates[] = "ADD INDEX `$subkey` $subvalue";
}
}
} elseif ($key == 'UNIQUE') {
foreach ($value as $subkey => $subvalue) {
if(!empty($oldcols['UNIQUE'][$subkey])) {
if($subvalue != $oldcols['UNIQUE'][$subkey]) {
$updates[] = "DROP INDEX `$subkey`";
$updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
}
} else {
$usql = "ALTER TABLE ".DB::table($newtable)." DROP INDEX `$subkey`";
DB::query($usql, 'SILENT');
$updates[] = "ADD UNIQUE INDEX `$subkey` $subvalue";
}
}
} else {
if(!empty($oldcols[$key])) {
if(strtolower($value) != strtolower($oldcols[$key])) {
$updates[] = "CHANGE `$key` `$key` $value";
}
} else {
$i = array_search($key, $allfileds);
$fieldposition = $i > 0 ? 'AFTER `'.$allfileds[$i-1].'`' : 'FIRST';
$updates[] = "ADD `$key` $value $fieldposition";
}
}
}
if(!empty($updates)) {
$usql = "ALTER TABLE ".DB::table($newtable)." ".implode(', ', $updates);
if(!DB::query($usql, 'SILENT')) {
show_msg('升级表 '.DB::table($newtable).' 出错,请手工执行以下升级语句后,再重新运行本升级程序:<br><br><b>升级SQL语句</b>:<div style=\"position:absolute;font-size:11px;font-family:verdana,arial;background:#EBEBEB;padding:0.5em;\">'.dhtmlspecialchars($usql)."</div><br><b>Error</b>: ".DB::error()."<br><b>Errno.</b>: ".DB::errno());
} else {
$msg = '升级表 '.DB::table($newtable).' 完成!';
}
} else {
$msg = '检查表 '.DB::table($newtable).' 完成,不需升级,跳过';
}
}
if($specid) {
$newtable = $spectable;
}
if(get_special_table_by_num($newtable, $specid+1)) {
$next = $theurl . '?step=sql&i='.($_GET['i']).'&specid='.($specid + 1);
} else {
$next = $theurl.'?step=sql&i='.($_GET['i']+1);
}
show_msg("[ $i / $count_i ] ".$msg, $next);
} elseif ($_GET['step'] == 'data') {
if(empty($_GET['op']) || $_GET['op'] == 'realname') {
$nextop = 'profile';
$p = 1000;
$i = !empty($_GET['i']) ? intval($_GET['i']) : 0;
$n = 0;
if($i==0) {
$value = DB::fetch_first('SELECT * FROM '.DB::table('common_member_profile_setting')." WHERE fieldid = 'realname'");
if(!empty($value)) {
show_msg("实名功能升级完毕", "$theurl?step=data&op=$nextop");
}
DB::query("INSERT INTO ".DB::table('common_member_profile_setting')." VALUES ('realname', '1', '0', '1', '真实姓名', '', '0', '0', '0', '0', '1', 'text', '0', '', '', '0', '0')");
}
$t = DB::result_first('SELECT uid FROM '.DB::table('common_member')." ORDER BY uid DESC LIMIT 1");
$names = $uids = array();
$query = DB::query('SELECT * FROM '.DB::table('common_member')." WHERE uid>'$i' AND realname != '' LIMIT $p");
while($value=DB::fetch($query)) {
$n = intval($value['uid']);
$value['uid'] = intval($value['uid']);
$value['realname'] = $value['realname'];
C::t('common_member')->update($value['uid'], array('realname'=>''));
C::t('common_member_profile')->update($value['uid'], array('realname'=>$value['realname']));
$names[$value['uid']] = $value['realname'];
}
if($n>0) {
show_msg("实名功能升级中[$n/$t]", "$theurl?step=data&op=realname&i=$n");
} else {
show_msg("实名功能升级完毕", "$theurl?step=data&op=$nextop");
}
} elseif($_GET['op'] == 'profile') {
$nextop = 'setting';
$value = DB::result_first('SELECT count(*) FROM '.DB::table('common_member_profile_setting')." WHERE fieldid = 'birthdist'");
if(!$value) {
DB::query("INSERT INTO ".DB::table('common_member_profile_setting')." VALUES ('birthdist', 1, 0, 0, '出生县', '出生行政区/县', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '')");
DB::query("INSERT INTO ".DB::table('common_member_profile_setting')." VALUES ('birthcommunity', 1, 0, 0, '出生小区', '', 0, 0, 0, 0, 0, 0, 0, 'select', 0, '', '')");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='出生地' WHERE fieldid = 'birthcity'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='居住地' WHERE fieldid = 'residecity'");
}
$count = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_district')." WHERE `level`='1' AND `usetype`>'0'");
if(!$count) {
DB::query("UPDATE ".DB::table('common_district')." SET `usetype`='3' WHERE `level` = '1'");
}
$profile = DB::fetch_first('SELECT * FROM '.DB::table('common_member_profile_setting')." WHERE fieldid = 'birthday'");
if($profile['title'] == '出生日期') {
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='生日' WHERE fieldid = 'birthday'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='证件类型' WHERE fieldid = 'idcardtype'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='支付宝' WHERE fieldid = 'alipay'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='ICQ' WHERE fieldid = 'icq'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='QQ' WHERE fieldid = 'qq'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='MSN' WHERE fieldid = 'msn'");
DB::query("UPDATE ".DB::table('common_member_profile_setting')." SET title='阿里旺旺' WHERE fieldid = 'taobao'");
}
show_msg("用户栏目升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'setting') {
$nextop = 'admingroup';
$settings = $newsettings = array();
$settings = C::t('common_setting')->fetch_all();
if(!isset($settings['relatetime'])) {
$newsettings['relatetime'] = 60;
}
if(!isset($settings['portalstatus'])) {
$newsettings['portalstatus'] = 1;
}
if(!isset($settings['homestatus'])) {
$newsettings['homestatus'] = 1;
}
if(isset($settings['thumbsource']) && !$settings['sourcewidth'] && !$settings['sourceheight']) {
$newsettings['sourcewidth'] = $setting['thumbwidth'];
$newsettings['sourceheight'] = $setting['thumbheight'];
}
if(empty($settings['my_siteid']) && !empty($settings['connectsiteid'])) {
$newsettings['my_siteid'] = $settings['connectsiteid'];
C::t('common_setting')->delete('connectsiteid');
}
if(empty($settings['my_sitekey']) && !empty($settings['connectsitekey'])) {
$newsettings['my_sitekey'] = $settings['connectsitekey'];
C::t('common_setting')->delete('connectsitekey');
}
$newsettings['adminnotifytypes'] = 'verifythread,verifypost,verifyuser,verifyblog,verifydoing,verifypic,verifyshare,verifycommontes,verifyrecycle,verifyrecyclepost,verifyarticle,verifyacommont,verifymedal,verify_1,verify_2,verify_3,verify_4,verify_5,verify_6,verify_7';
if(!isset($settings['allowwidthauto'])) {
$newsettings['allowwidthauto'] = 1;
$newsettings['switchwidthauto'] = 1;
}
if(!$settings['activitypp']) {
$newsettings['activitypp'] = 8;
}
if(!$settings['followretainday']) {
$newsettings['followretainday'] = 7;
}
if(!isset($settings['allowpostcomment'])) {
$newsettings['allowpostcomment'] = array('1');
}
if(!isset($settings['styleid1'])) {
$newsettings['styleid1'] = 1;
}
if(!isset($settings['styleid2'])) {
$newsettings['styleid2'] = 1;
}
if(!isset($settings['styleid3'])) {
$newsettings['styleid3'] = 1;
}
if($settings['heatthread']) {
$settings['heatthread'] = dunserialize($settings['heatthread']);
if(empty($settings['heatthread']['type'])) {
$settings['heatthread']['type'] = 1;
$settings['heatthread']['period'] = 15;
}
if(empty($settings['heatthread']['guidelimit'])) {
$settings['heatthread']['guidelimit'] = 3;
}
$newsettings['heatthread'] = $settings['heatthread'];
}
if($settings['seotitle'] && dunserialize($settings['seotitle']) === FALSE) {
$rownew = array('forum' => $settings['seotitle']);
$newsettings['seotitle'] = $rownew;
}
if($settings['seokeywords'] && dunserialize($settings['seokeywords']) === FALSE) {
$rownew = array('forum' => $settings['seokeywords']);
$newsettings['seokeywords'] = $rownew;
}
if($settings['seodescription'] && dunserialize($settings['seodescription']) === FALSE) {
$rownew = array('forum' => $settings['seodescription']);
$newsettings['seodescription'] = $rownew;
}
if($settings['watermarkminheight'] && dunserialize($settings['watermarkminheight']) === FALSE) {
$rownew = array('portal' => $settings['watermarkminheight'], 'forum' => $settings['watermarkminheight'], 'album' => $settings['watermarkminheight']);
$newsettings['watermarkminheight'] = $rownew;
}
if($settings['watermarkminwidth'] && dunserialize($settings['watermarkminwidth']) === FALSE) {
$rownew = array('portal' => $settings['watermarkminwidth'], 'forum' => $settings['watermarkminwidth'], 'album' => $settings['watermarkminwidth']);
$newsettings['watermarkminwidth'] = $rownew;
}
if($settings['watermarkquality'] && dunserialize($settings['watermarkquality']) === FALSE) {
$rownew = array('portal' => $settings['watermarkquality'], 'forum' => $settings['watermarkquality'], 'album' => $settings['watermarkquality']);
$newsettings['watermarkquality'] = $rownew;
}
if($settings['watermarkstatus'] && dunserialize($settings['watermarkstatus']) === FALSE) {
$rownew = array('portal' => $settings['watermarkstatus'], 'forum' => $settings['watermarkstatus'], 'album' => $settings['watermarkstatus']);
$newsettings['watermarkstatus'] = $rownew;
}
if($settings['watermarktrans'] && dunserialize($settings['watermarktrans']) === FALSE) {
$rownew = array('portal' => $settings['watermarktrans'], 'forum' => $settings['watermarktrans'], 'album' => $settings['watermarktrans']);
$newsettings['watermarktrans'] = $rownew;
}
if($settings['watermarktype'] && dunserialize($settings['watermarktype']) === FALSE) {
$watermarktype_map = array(
0 => 'gif',
1 => 'png',
2 => 'text',
);
$rownew = array('portal' => $watermarktype_map[$settings['watermarktype']], 'forum' => $watermarktype_map[$settings['watermarktype']], 'album' => $watermarktype_map[$settings['watermarktype']]);
$newsettings['watermarktype'] = $rownew;
}
if($settings['watermarktext'] && dunserialize($settings['watermarktext']) === FALSE) {
$rownew = array();
$watermarktext = (array)dunserialize($settings['watermarktext']);
foreach($watermarktext as $data_k => $data_v) {
$rownew[$data_k]['portal'] = $data_v;
$rownew[$data_k]['forum'] = $data_v;
$rownew[$data_k]['album'] = $data_v;
}
$newsettings['watermarktext'] = $rownew;
}
if(!$settings['mobile']) {
$newsettings['mobile'] = array('allowmobile' => 0, 'mobilepreview' => 1);
}
if(!$settings['card']) {
$newsettings['card'] = array('open' => 0);
}
$newsettings['group_allowfeed'] = '1';
if(empty($settings['relatenum'])) {
$newsettings['relatenum'] = '10';
}
if(!isset($settings['profilegroup'])) {
$profilegroupnew = array(
'base' =>
array (
'available' => 1,
'displayorder' => 0,
'title' => '基本资料',
'field' =>
array (
'realname' => 'realname',
'gender' => 'gender',
'birthday' => 'birthday',
'birthcity' => 'birthcity',
'residecity' => 'residecity',
'residedist' => 'residedist',
'affectivestatus' => 'affectivestatus',
'lookingfor' => 'lookingfor',
'bloodtype' => 'bloodtype',
'field1' => 'field1',
'field2' => 'field2',
'field3' => 'field3',
'field4' => 'field4',
'field5' => 'field5',
'field6' => 'field6',
'field7' => 'field7',
'field8' => 'field8',
),
),
'contact' =>
array (
'title' => '联系方式',
'available' => '1',
'displayorder' => '1',
'field' =>
array (
'telephone' => 'telephone',
'mobile' => 'mobile',
'icq' => 'icq',
'qq' => 'qq',
'yahoo' => 'yahoo',
'msn' => 'msn',
'taobao' => 'taobao',
),
),
'edu' =>
array (
'available' => 1,
'displayorder' => 2,
'title' => '教育情况',
'field' =>
array (
'graduateschool' => 'graduateschool',
'education' => 'education',
),
),
'work' =>
array (
'available' => 1,
'displayorder' => 3,
'title' => '工作情况',
'field' =>
array (
'occupation' => 'occupation',
'company' => 'company',
'position' => 'position',
'revenue' => 'revenue',
),
),
'info' =>
array (
'title' => '个人信息',
'available' => '1',
'displayorder' => '4',
'field' =>
array (
'idcardtype' => 'idcardtype',
'idcard' => 'idcard',
'address' => 'address',
'zipcode' => 'zipcode',
'site' => 'site',
'bio' => 'bio',
'interest' => 'interest',
'sightml' => 'sightml',
'customstatus' => 'customstatus',
'timeoffset' => 'timeoffset',
),
),
);
$newsettings['profilegroup'] = $profilegroupnew;
}
if(!isset($settings['ranklist'])) {
$newsettings['ranklist'] = array(
'status' => '0',
'cache_time' => '1',
'index_select' => 'thisweek',
'member' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'thread' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'blog' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'poll' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'activity' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'picture' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'forum' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
'group' => array('available' => '0', 'cache_time' => '5', 'show_num' => '20',),
);
}
if(!isset($settings['ipregctrltime'])) {
$newsettings['ipregctrltime'] = '72';
}
DB::query("REPLACE INTO ".DB::table('common_setting')." VALUES ('regname', 'register')");
$newsettings['regname'] = 'register';
if(empty($settings['reglinkname'])) {
$newsettings['reglinkname'] = '注册';
}
if(empty($settings['domain'])) {
$newsettings['domain'] = array(
'defaultindex' => 'forum.php',
'holddomain' => 'www|*blog*|*space*',
'list' => array(),
'app' => array('portal' => '', 'forum' => '', 'group' => '', 'home' => '', 'default' => '',),
'root' => array('home' => '', 'group' => '', 'forum' => '', 'topic' => '', 'channel' => '',),
);
}
if(empty($settings['group_recommend'])) {
if($settings['newbiespan'] > 0) {
$newsettings['newbiespan'] = round($settings['newbiespan'] * 60);
}
DB::query("UPDATE ".DB::table('common_member_field_forum')." SET attentiongroup=''");
$query = DB::query("SELECT f.fid, f.name, ff.description, ff.icon FROM ".DB::table('forum_forum')." f LEFT JOIN ".DB::table('forum_forumfield')." ff USING(fid) WHERE f.status='3' AND f.type='sub' ORDER BY f.commoncredits desc LIMIT 8");
while($row = DB::fetch($query)) {
$row['name'] = addslashes($row['name']);
$settings['attachurl'] .= substr($settings['attachurl'], -1, 1) != '/' ? '/' : '';
if($row['icon']) {
$row['icon'] = $settings['attachurl'].'group/'.$row['icon'];
} else {
$row['icon'] = 'static/image/common/groupicon.gif';
}
$row['description'] = addslashes($row['description']);
$group_recommend[$row[fid]] = $row;
}
$newsettings['group_recommend'] = $group_recommend;
}
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_magic')." WHERE credit>'0'")) {
$creditstranssi = explode(',', $settings['creditstrans']);
$creditstran = $creditstranssi[3] ? $creditstranssi[3] : $creditstranssi[0];
DB::update('common_magic', array('credit' => $creditstran));
}
if(!isset($settings['allowviewuserthread'])) {
$allowviewuserthread = array('allow'=>'1','fids'=>array());
$query = DB::query('SELECT ff.fid,ff.viewperm FROM '.DB::table('forum_forum').' f LEFT JOIN '.DB::table('forum_forumfield')." ff ON f.fid = ff.fid WHERE f.status='1' AND f.type IN ('forum','sub')");
while($value = DB::fetch($query)) {
$arr = !empty($value['viewperm']) ? explode("\t", $value['viewperm']) : array();
if(empty($value['viewperm']) || in_array('7', $arr) || in_array($settings['newusergroupid'], $arr) ) {
$allowviewuserthread['fids'][] = $value['fid'];
}
}
$newsettings['allowviewuserthread'] = $allowviewuserthread;
}
if(!isset($settings['focus'])) {
$focusnew = array('title' => '站长推荐', 'cookie' => 1);
$newsettings['focus'] = $focusnew;
} else {
$focus = dunserialize($settings['focus']);
if(!isset($focus['cookie'])) {
$focus['cookie'] = 1;
$newsettings['focus'] = $focus;
}
}
if(!isset($settings['onlyacceptfriendpm'])) {
$onlyacceptfriendpmnew = '0';
$newsettings['onlyacceptfriendpm'] = $onlyacceptfriendpmnew;
}
if(!isset($settings['pmreportuser'])) {
$pmreportusernew = '1';
$newsettings['pmreportuser'] = $pmreportusernew;
}
if(!isset($settings['chatpmrefreshtime'])) {
$chatpmrefreshtimenew = '8';
$newsettings['chatpmrefreshtime'] = $chatpmrefreshtimenew;
}
if(!isset($settings['preventrefresh'])) {
$preventrefreshnew = '1';
$newsettings['preventrefresh'] = $preventrefreshnew;
}
if(!isset($settings['targetblank'])) {
$targetblanknew = '0';
$newsettings['targetblank'] = $targetblanknew;
}
if(!isset($settings['article_tags'])) {
$article_tagsnew = array(1 => '原创', 2 => '热点', 3 => '组图', 4 => '爆料', 5 => '头条', 6 => '幻灯', 7 => '滚动', 8 => '推荐');
$newsettings['article_tags'] = $article_tagsnew;
}
if(empty($settings['anonymoustext'])) {
$newsettings['anonymoustext'] = '匿名';
}
if(!$word_type_count = DB::result_first("SELECT count(*) FROM ".DB::table('common_word_type')."")) {
DB::query("INSERT INTO ".DB::table('common_word_type')." VALUES('1', '政治'),('2', '广告')");
}
if(!isset($settings['userreasons'])) {
$newsettings['userreasons'] = '很给力!\r\n神马都是浮云\r\n赞一个!\r\n山寨\r\n淡定';
}
if(!$forum_typevar_search = C::t('forum_typevar')->count_by_search(2)) {
C::t('forum_typevar')->update_by_search(1, array('search' => 3));
}
if(($seccodecheck = $settings['seccodestatus'])) {
if(!($seccodecheck & 16)) {
$seccodecheck = setstatus(5, 1, $seccodecheck);
$newsettings['seccodestatus'] = $seccodecheck;
}
}
$seccodedata = dunserialize($setting['seccodedata']);
if(!$seccodedata['rule']) {
$seccodestatuss = sprintf('%05b', $seccodecheck);
$seccodedata['rule']['register']['allow'] = $seccodestatuss{4};
$seccodedata['rule']['login']['allow'] = $seccodestatuss{3};
$seccodedata['rule']['post']['allow'] = $seccodestatuss{2};
$seccodedata['rule']['password']['allow'] = $seccodestatuss{1};
$seccodedata['rule']['card']['allow'] = $seccodestatuss{0};
$newsettings['seccodedata'] = serialize($seccodedata);
}
if(!isset($settings['collectionteamworkernum'])) {
$newsettings['collectionteamworkernum'] = '3';
}
if(!isset($settings['collectionnum'])) {
$newsettings['collectionnum'] = '5';
}
if(!$settings['numbercard']) {
$newsettings['numbercard'] = 'a:1:{s:3:"row";a:3:{i:1;s:7:"threads";i:2;s:5:"posts";i:3;s:7:"credits";}}';
}
if(!isset($settings['threadguestlite'])) {
$newsettings['threadguestlite'] = '1';
}
$settings['search'] = dunserialize($settings['search']);
if(!is_array($settings['search']['collection'])) {
$newsettings['search'] = $settings['search'];
$newsettings['search']['collection']['status'] = '1';
$newsettings['search']['collection']['searchctrl'] = '10';
$newsettings['search']['collection']['maxspm'] = '10';
$newsettings['search']['collection']['maxsearchresults'] = '500';
DB::query("UPDATE ".DB::table('common_usergroup_field')." SET allowsearch = allowsearch | 64 WHERE groupid<'4' OR groupid>'9'");
}
if(empty($settings['lazyload'])) {
$newsettings['lazyload'] = 0;
}
if(empty($settings['guide'])) {
$newsettings['guide'] = array('hotdt' => 604800, 'digestdt' => 604800);
}
$settings['memory'] = isset($settings['memory']) ? dunserialize($settings['memory']) : array();
if(empty($settings['memory']) || isset($settings['memory']['diyblock']['enable'])) {
$memory = array();
if(isset($settings['memory']['diyblock']['enable'])) {
foreach($settings['memory'] as $k => $v) {
if(!empty($v['enable'])) {
$memory['memory'][$k] = $v['ttl'];
}
}
}
unset($memory['forum_post']);
$newsettings['memory'] = array_merge(array('common_member' => 0,'common_member_count' => 0,'common_member_status' => 0,'common_member_profile' => 0,
'common_member_field_home' => 0,'common_member_field_forum' => 0,'common_member_verify' => 0,
'forum_thread' => 172800, 'forum_thread_forumdisplay' => 300, 'forum_collectionrelated' => 0, 'forum_postcache' => 300,
'forum_collection' => 300,'home_follow' => 86400, 'forumindex' => 30, 'diyblock' => 300, 'diyblockoutput' => 30), $memory);
}
if(!isset($settings['blockmaxaggregationitem'])) {
$newsettings['blockmaxaggregationitem'] = 20000;
}
if(!isset($settings['showfollowcollection'])) {
$newsettings['showfollowcollection'] = 8;
}
if(!isset($settings['antitheft'])) {
$newsettings['antitheft'] = array('allow' => 0, 'max' => 200);
}
if(!isset($settings['repliesrank'])) {
$newsettings['repliesrank'] = 1;
$newsettings['threadblacklist'] = 1;
$newsettings['threadhotreplies'] = 3;
$newsettings['threadfilternum'] = 10;
$newsettings['hidefilteredpost'] = 1;
$newsettings['nofilteredpost'] = 0;
$newsettings['filterednovote'] = 1;
}
$group_userperm = dunserialize($settings['group_userperm']);
if(!isset($group_userperm['allowlivethread'])) {
$group_userperm['allowlivethread'] = '1';
$newsettings['group_userperm'] = serialize($group_userperm);
}
if(!isset($settings['darkroom'])) {
$newsettings['darkroom'] = '1';
}
if(!isset($settings['showfjump'])) {
$newsettings['showfjump'] = 1;
}
if(!isset($settings['grid'])) {
$newsettings['grid'] = 'a:8:{s:8:"showgrid";s:1:"0";s:8:"gridtype";s:1:"0";s:8:"textleng";s:2:"30";s:4:"fids";a:1:{i:0;i:0;}s:9:"highlight";s:1:"1";s:11:"targetblank";s:1:"1";s:8:"showtips";s:1:"1";s:9:"cachelife";s:3:"600";}';
}
if(!empty($newsettings)) {
C::t('common_setting')->update_batch($newsettings);
}
if(!DB::result_first("SELECT allowreplycredit FROM ".DB::table('common_usergroup_field')." WHERE groupid = 1")) {
DB::query("UPDATE ".DB::table('common_usergroup_field')." SET allowreplycredit = '1' WHERE groupid = 1");
}
show_msg("配置项升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'admingroup') {
$nextop = 'updatethreadtype';
if(!DB::result_first("SELECT allowclearrecycle FROM ".DB::table('common_admingroup')." WHERE allowclearrecycle='1'")) {
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowclearrecycle='1' WHERE admingid='1' OR admingid='2'");
}
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowmanagetag='1' WHERE admingid IN ('1', '2', '3')");
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowlivethread='1' WHERE admingid IN ('1', '2', '3')");
DB::query('UPDATE '.DB::table('common_usergroup_field')." SET allowposttag='1' WHERE groupid=1");
if(DB::result_first("SELECT cpgroupid FROM ".DB::table('common_admincp_group')." WHERE cpgroupid='3'")) {
if(!DB::result_first("SELECT cpgroupid FROM ".DB::table('common_admincp_perm')." WHERE cpgroupid='3' AND perm='threads_group'")) {
DB::query("INSERT INTO ".DB::table('common_admincp_perm')." VALUES ('3', 'threads_group')");
DB::query("INSERT INTO ".DB::table('common_admincp_perm')." VALUES ('3', 'prune_group')");
DB::query("INSERT INTO ".DB::table('common_admincp_perm')." VALUES ('3', 'attach_group')");
DB::query("ALTER TABLE ".DB::table('common_admingroup')." DROP `disablepostctrl`");
DB::query("UPDATE ".DB::table('common_usergroup_field')." SET allowgroupdirectpost='3'");
DB::query("UPDATE ".DB::table('common_usergroup_field')." SET allowgroupposturl='3' WHERE groupid='1'");
}
}
if(DB::result_first("SELECT cpgroupid FROM ".DB::table('common_admincp_group')." WHERE cpgroupid='1'")) {
if(!DB::result_first("SELECT cpgroupid FROM ".DB::table('common_admincp_perm')." WHERE cpgroupid='1' AND perm='postcomment'")) {
DB::query("INSERT INTO ".DB::table('common_admincp_perm')." VALUES ('1', 'postcomment')");
}
}
if(!DB::result_first("SELECT allowbanvisituser FROM ".DB::table('common_admingroup')." WHERE allowbanvisituser='1'")) {
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowbanvisituser='1' WHERE admingid='1' OR admingid='2'");
}
if($first_to_2_5) {
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowmanagecollection='1' WHERE admingid='1' OR admingid='2'");
}
DB::query('UPDATE '.DB::table('common_admingroup')." SET allowmakehtml='1' WHERE admingid=1");
show_msg("管理组设置升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'updatethreadtype') {
$nextop = 'updatecron';
$selectoption = array();
$query = DB::query("SELECT * FROM ".DB::table('forum_typeoption')." WHERE type='select'");
while($typeoptionarr = DB::fetch($query)) {
$selectoption[] = $typeoptionarr['identifier'];
}
$query = C::t('forum_threadtype')->range();
foreach($query as $threadtypearr) {
if(DB::num_rows(DB::query("SHOW TABLES LIKE '".DB::table('forum_optionvalue')."$threadtypearr[typeid]'")) != 1) {
continue;
}
$varnames = array();
$queryoptionvalue = DB::query("SELECT * FROM ".DB::table('forum_optionvalue')."$threadtypearr[typeid] LIMIT 1");
if($optionvaluearr = DB::fetch($queryoptionvalue)) {
foreach($optionvaluearr as $key => $value) {
if(in_array($key, $selectoption)) {
$varnames[] = 'CHANGE `'.$key.'` `'.$key.'` VARCHAR(50) NOT NULL';
}
}
}
if(!empty($varnames)) {
DB::query("ALTER TABLE ".DB::table('forum_optionvalue')."$threadtypearr[typeid] ".implode(',', $varnames));
}
}
show_msg("分类信息升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'updatecron') {
$nextop = 'updatemagic';
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_cleanfeed.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('', '1','system','清理过期动态','cron_cleanfeed.php','1269746634','1269792000','-1','-1','0','0')");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_checkpatch_daily.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('', '1','system','每日获取安全补丁','cron_checkpatch_daily.php','1269746639','1269792000','-1','-1','2','22')");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_publish_halfhourly.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('', '1','system','定时发布主题','cron_publish_halfhourly.php','1269746639','1269792000','-1','-1','-1','0 30')");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_follow_daily.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('','1','system','每周广播归档','cron_follow_daily.php','1269746639','1269792000','-1','-1','02','0')");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_todayviews_daily.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('','1','system','更新每日查看数','cron_todayviews_daily.php','1321500558','1321556400','-1','-1','3','0 5 10 15 20 25 30 35 40 45 50 55')");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_member_optimize_daily.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('','0','system','每日用户表优化','cron_member_optimize_daily.php','1321500558','1321556400','-1','-1','2','0 5 10 15 20 25 30 35 40 45 50 55')");
}
if(DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_cron')." WHERE filename='cron_birthday_daily.php'")) {
DB::query("DELETE FROM ".DB::table('common_cron')." WHERE filename='cron_birthday_daily.php'");
}
if(!DB::result_first("SELECT filename FROM ".DB::table('common_cron')." WHERE filename='cron_todayheats_daily.php'")) {
DB::query("INSERT INTO ".DB::table('common_cron')." VALUES ('','1','system','统计今日热帖','cron_todayheats_daily.php','1269746623','1269792000','-1','-1','0','0')");
}
show_msg("计划任务升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'updatemagic') {
$nextop = 'updatereport';
if(DB::result_first("SELECT name FROM ".DB::table('common_magic')." WHERE identifier='highlight'")) {
DB::query("UPDATE ".DB::table('common_magic')." SET name='变色卡', description='可以将帖子或日志的标题高亮,变更颜色' WHERE identifier='highlight'");
}
if(DB::result_first("SELECT name FROM ".DB::table('common_magic')." WHERE identifier='namepost'")) {
DB::query("UPDATE ".DB::table('common_magic')." SET name='显身卡', description='可以查看一次匿名用户的真实身份。' WHERE identifier='namepost'");
}
if(DB::result_first("SELECT name FROM ".DB::table('common_magic')." WHERE identifier='anonymouspost'")) {
DB::query("UPDATE ".DB::table('common_magic')." SET name='匿名卡', description='在指定的地方,让自己的名字显示为匿名。' WHERE identifier='anonymouspost'");
}
show_msg("道具升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'updatereport') {
$nextop = 'myappcount';
if(!C::t('common_setting')->skey_exists('report_reward')) {
$report_uids = array();
$founders = $_G['config']['admincp']['founder'] !== '' ? explode(',', str_replace(' ', '', addslashes($_G['config']['admincp']['founder']))) : array();
if($founders) {
$founderexists = true;
$fuid = $fuser = array();
foreach($founders as $founder) {
if(is_numeric($founder)) {
$fuid[] = $founder;
} else {
$fuser[] = $founder;
}
}
$query = DB::query("SELECT uid, username FROM ".DB::table('common_member')." WHERE ".($fuid ? "uid IN (".dimplode($fuid).")" : '0')." OR ".($fuser ? "username IN (".dimplode($fuser).")" : '0'));
while($founder = DB::fetch($query)) {
$report_uids[] = $founder['uid'];
}
}
$query = DB::query("SELECT uid FROM ".DB::table('common_admincp_perm')." ap LEFT JOIN ".DB::table('common_admincp_member')." am ON am.cpgroupid=ap.cpgroupid where perm='report'");
while($user = DB::fetch($query)) {
if(empty($users[$user[uid]])) {
$report_uids[] = $user['uid'];
}
}
if($report_uids) {
$report_receive = array('adminuser' => $report_uids, 'supmoderator' => array());
C::t('common_setting')->update('report_receive', $report_receive);
}
$report_reward = array();
$report_reward['min'] = '-3';
$report_reward['max'] = '3';
C::t('common_setting')->update('report_reward', $report_receive);
}
show_msg("举报升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'myappcount') {
$nextop = 'nav';
$needupgrade = DB::query("SELECT COUNT(*) FROM ".DB::table('common_myapp_count'), 'SILENT');
if($needupgrade) {
DB::query("DROP TABLE `".DB::table('common_myapp_count')."`");
DB::query("DROP TABLE `".DB::table('home_userapp_stat')."`");
}
show_msg("漫游应用统计升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'nav') {
$nextop = 'forumstatus';
$parentids = $navs = $subnavs = array();
$query = DB::query("SELECT * FROM ".DB::table('common_nav')." WHERE navtype='0' AND parentid<>'0'");
while($nav = DB::fetch($query)) {
$parentids[$nav['parentid']] = $nav['parentid'];
}
$query = DB::query("SELECT * FROM ".DB::table('common_nav')." WHERE type='0'");
while($nav = DB::fetch($query)) {
if($nav['identifier'] == 5 && $nav['navtype'] == 0 && $nav['available'] == -1) {
$nav['available'] = 1;
}
$navs[] = $nav;
if($parentids[$nav['id']]) {
$subnavs[$nav['id']] = $nav['id'];
}
}
$navid = DB::result_first("SELECT id FROM ".DB::table('common_nav')." WHERE navtype=0 AND type=0 AND identifier=12");
DB::delete('common_nav', "type='0'");
DB::delete('common_nav', "name='{hr}'");
DB::delete('common_nav', "name='{userpanelarea1}'");
DB::delete('common_nav', "name='{userpanelarea2}'");
$sql = implode('', file(DISCUZ_ROOT.'./install/data/install_data.sql'));
preg_match("/\[update\_nav\](.+?)\[\/update\_nav\]/is", $sql, $a);
runquery($a[1]);
foreach($navs as $nav) {
if($nav['identifier']) {
if($nav['identifier'] == 4) {
$homestatus = C::t('common_setting')->fetch('homestatus');
$nav['available'] = $homestatus ? $nav['available'] : -1;
if(!$navid) {
DB::update('common_nav', array('available' => $homestatus ? 0 : -1),
"navtype IN(0, 2, 3) AND type=0 AND identifier IN('feed', 'blog', 'album', 'share', 'doing', 'wall', '12', '13', '14', '15')");
if($homestatus) {
DB::update('common_nav', array('available' => 1),
"navtype=2 AND type=0 AND identifier IN('feed', 'blog', 'album', 'share', 'doing', 'wall')");
}
DB::query("REPLACE INTO ".DB::table('common_setting')." VALUES ('homestyle', '1'),('homepagestyle', '1'),('feedstatus', '$homestatus'),('blogstatus', '$homestatus'),('doingstatus', '$homestatus'),('albumstatus', '$homestatus'),('sharestatus', '$homestatus'),('wallstatus', '$homestatus')");
}
}
DB::update('common_nav', array('name' => $nav['name'], 'available' => $nav['available'], 'displayorder' => $nav['displayorder']),
"navtype='$nav[navtype]' AND identifier='$nav[identifier]'");
if($subnavs[$nav['id']]) {
$parentid = DB::result_first("SELECT id FROM ".DB::table('common_nav')." WHERE navtype='$nav[navtype]' AND identifier='$nav[identifier]'");
DB::update('common_nav', array('parentid' => $parentid), "parentid='$nav[id]'");
}
}
}
show_msg("导航数据升级完成", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'forumstatus') {
$nextop = 'usergroup';
$query = DB::query("SELECT fid FROM ".DB::table('forum_forum')." WHERE status='2'");
if(DB::num_rows($query)) {
while($row = DB::fetch($query)) {
$fids[] = $row['fid'];
}
DB::update('forum_forum', array('status' => 1), "status='2'");
}
show_msg("版块状态升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'usergroup') {
$nextop = 'creditrule';
DB::update('common_usergroup', array('allowvisit' => 2), "groupid='1'");
DB::update('common_usergroup_field', array('allowbegincode' => 1), "groupid='1'");
if(DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_forum')." WHERE allowmediacode>'0'") &&
!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_usergroup_field')." WHERE allowmediacode>'0'")) {
DB::update('common_usergroup_field', array('allowmediacode' => 1), "groupid<'4' OR groupid>'9'");
}
show_msg("用户升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'creditrule') {
$nextop = 'bbcode';
$delrule = array('register', 'realname', 'invitefriend', 'report', 'uploadimage', 'editrealname', 'editrealemail', 'delavatar');
$count = DB::result(DB::query("SELECT COUNT(*) FROM ".DB::table('common_credit_rule')." WHERE action IN(".dimplode($delrule).")"),0);
if($count) {
DB::query("DELETE FROM ".DB::table('common_credit_rule')." WHERE action IN(".dimplode($delrule).")");
}
DB::update('common_credit_rule', array('rulename' => '每天登录'), "rulename='每天登陆'");
$count = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_credit_rule')." WHERE action='portalcomment'");
if(!$count) {
DB::query("INSERT INTO ".DB::table('common_credit_rule')." (`rulename`, `action`, `cycletype`, `cycletime`, `rewardnum`, `norepeat`, `extcredits1`, `extcredits2`, `extcredits3`, `extcredits4`, `extcredits5`, `extcredits6`, `extcredits7`, `extcredits8`, `fids`) VALUES ('文章评论','portalcomment','1','0','40','1','0','1','0','0','0','0','0','0','')");
}
$count = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_credit_rule')." WHERE action='followedcollection'");
if(!$count) {
DB::query("INSERT INTO ".DB::table('common_credit_rule')." (`rulename`, `action`, `cycletype`, `cycletime`, `rewardnum`, `norepeat`, `extcredits1`, `extcredits2`, `extcredits3`, `extcredits4`, `extcredits5`, `extcredits6`, `extcredits7`, `extcredits8`, `fids`) VALUES ('淘专辑被订阅','followedcollection','1','0','3','0','0','1','0','0','0','0','0','0','')");
}
show_msg("积分规则升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'bbcode') {
$nextop = 'stamp';
$allowcusbbcodes = array();
$query = DB::query("SELECT * FROM ".DB::table('common_usergroup_field'));
while($row = DB::fetch($query)) {
if($row['allowcusbbcode']) {
$allowcusbbcodes[] = $row['groupid'];
}
}
if($allowcusbbcodes) {
DB::query("UPDATE ".DB::table('forum_bbcode')." SET perm='".implode("\t", $allowcusbbcodes)."' WHERE perm=''");
}
show_msg("自定义代码权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'stamp') {
$nextop = 'block_item';
$stampnew = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_thread')." WHERE stamp>'0'");
if(!$stampnew) {
$query = DB::query("SELECT t.tid, tm.stamp FROM ".DB::table('forum_thread')." t
INNER JOIN ".DB::table('forum_threadmod')." tm ON t.tid=tm.tid AND tm.action='SPA'
WHERE t.status|16=t.status");
while($row = DB::fetch($query)) {
DB::query("UPDATE ".DB::table('forum_thread')." SET stamp='$row[stamp]' WHERE tid='$row[tid]'", 'UNBUFFERED');
}
}
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_smiley')." WHERE url='010.gif'")) {
DB::query("REPLACE INTO ".DB::table('common_smiley')." (typeid, displayorder, type, code, url) VALUES ('4','19','stamp','编辑采用','010.gif')");
}
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_smiley')." WHERE url='010.small.gif'")) {
DB::query("REPLACE INTO ".DB::table('common_smiley')." (typeid, displayorder, type, code, url) VALUES ('0','18','stamplist','编辑采用','010.small.gif')");
}
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_smiley')." WHERE url='011.small.gif'")) {
DB::query("REPLACE INTO ".DB::table('common_smiley')." (typeid, displayorder, type, code, url) VALUES ('0','20','stamplist','新人帖','011.small.gif')");
$setnewbie = true;
}
require_once libfile('function/cache');
updatecache('stamps');
updatecache('stamptypeid');
if($setnewbie) {
$id = DB::result_first("SELECT displayorder FROM ".DB::table('common_smiley')." WHERE url='011.small.gif'");
DB::query("REPLACE INTO ".DB::table('common_setting')." VALUES ('newbie', '$id')");
}
show_msg("鉴定图章升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'block_item') {
$nextop = 'block_permission';
$bids = $items = $blocks = array();
$query = DB::query("SELECT itemid, bid, pic, picflag, thumbpath FROM ".DB::table('common_block_item')." WHERE makethumb='1'");
while($row = DB::fetch($query)) {
if(empty($row['thumbpath'])) {
$bids[$row['bid']] = $row['bid'];
$items[] = $row;
}
}
if($bids) {
$query = DB::query("SELECT bid, picwidth, picheight FROM ".DB::table('common_block')." WHERE bid IN(".dimplode($bids).")");
while($value = DB::fetch($query)) {
$blocks[$value['bid']] = $value;
}
foreach($items as $item) {
$block = $blocks[$item['bid']];
$hash = md5($item['pic'].'-'.$item['picflag'].':'.$block['picwidth'].'|'.$block['picheight']);
$thumbpath = 'block/'.substr($hash, 0, 2).'/'.$hash.'.jpg';
DB::update('common_block_item', array('thumbpath' => $thumbpath), "itemid='$item[itemid]'");
}
}
show_msg("模块缩略图权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'block_permission') {
$nextop = 'portalcategory_permission';
if(!C::t('common_setting')->skey_exists('group_recommend')) {
DB::query("UPDATE ".DB::table('common_block_permission')." SET allowmanage=allowsetting,allowrecommend=allowdata");
}
if(!DB::result_first('SELECT inheritedtplname FROM '.DB::table('common_template_permission')." WHERE inheritedtplname != '' LIMIT 1")) {
$query = DB::query('SELECT * FROM '.DB::table('common_template_permission')." WHERE inheritedtplname = ''");
$templatearr = array();
while($value = DB::fetch($query)) {
$templatearr[$value['targettplname']][] = $value;
}
if(!empty($templatearr)) {
require_once libfile('class/blockpermission');
$tplpermissions = new template_permission();
foreach($templatearr as $tplname => $users) {
$tplpermissions->add_users($tplname, $users);
}
}
}
show_msg("模块权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'portalcategory_permission') {
$nextop = 'portal_comment';
if(!DB::result_first('SELECT inheritedcatid FROM '.DB::table('portal_category_permission')." WHERE inheritedcatid > '0' LIMIT 1")) {
$query = DB::query('SELECT * FROM '.DB::table('portal_category_permission')." WHERE inheritedcatid = '0'");
$catearr = array();
while($value = DB::fetch($query)) {
$catearr[$value['catid']][] = $value;
}
if(!empty($catearr)) {
require_once libfile('class/portalcategory');
$categorypermissions = new portal_category();
foreach($catearr as $catid => $users) {
$categorypermissions->add_users_perm($catid, $users);
}
}
}
show_msg("门户频道权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'portal_comment') {
$nextop = 'portal_article_cover_img';
$one = DB::fetch_first('SELECT * FROM '.DB::table('portal_comment')." WHERE id=0 AND idtype='' LIMIT 1");
if($one && isset($one['aid'])) {
DB::query("UPDATE ".DB::table('portal_comment')." SET id=aid,idtype='aid' WHERE aid>0");
}
show_msg("文章评论升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'portal_article_cover_img') {
$nextop = 'block_style';
$pic = DB::result_first('SELECT pic FROM '.DB::table('portal_article_title')." WHERE LENGTH(pic)>6 LIMIT 1");
if($pic && is_numeric(substr($pic, 0, strpos($pic,'/')))) {
DB::query("UPDATE ".DB::table('portal_article_title')." SET pic=CONCAT('portal/',pic) WHERE LENGTH(pic)>6");
}
show_msg("文章封面图升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'block_style') {
$nextop = 'block_script';
$sql = implode('', file(DISCUZ_ROOT.'./install/data/install_data.sql'));
preg_match("/\[block\_style\](.+?)\[\/block\_style\]/is", $sql, $a);
unset($sql);
preg_match_all("/\[key\:(.+?)\](.+?)\[\/key\]/is", $a[1], $aa);
$data = array();
if(!empty($aa[1])) {
foreach($aa[1] as $key => $value){
$data[$value] = $aa[2][$key];
}
$hashs = array_keys($data);
$query = DB::query('SELECT hash FROM '.DB::table('common_block_style')." WHERE hash IN (".dimplode($hashs).")");
while($value = DB::fetch($query)) {
unset($data[$value['hash']]);
}
if(!empty($data)) {
$sql = implode("\r\n", $data);
runquery($sql);
}
DB::query("UPDATE ".DB::table('common_block_style')." SET name = replace(`name`, 'X1.5', '内置')");
DB::query("UPDATE ".DB::table('common_block_style')." SET name = replace(`name`, 'X2.0', '内置')");
}
show_msg("模块模板升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'block_script') {
$nextop = 'common_usergroup_field';
include_once libfile('function/block');
$blocks = $styles = $styleids = array();
$query = DB::query('SELECT * FROM '.DB::table('common_block')." WHERE blockclass='forum_attachment' OR blockclass='group_attachment'");
while($value = DB::fetch($query)) {
$blocks[$value['bid']] = $value;
if(empty($value['blockstyle'])) {
$styleids[$value['styleid']] = $value['styleid'];
}
}
if($styleids) {
$query = DB::query('SELECT * FROM '.DB::table('common_block_style')." WHERE styleid IN (".dimplode($styleids).")");
while($value = DB::fetch($query)) {
$value['template'] = dunserialize($value['template']);
$styles[$value['styleid']] = $value;
}
}
foreach($blocks as $bid => $block) {
unset($block['bid']);
if(empty($block['blockstyle'])) {
$block['blockstyle'] = $styles[$block['styleid']];
} else {
$block['blockstyle'] = dunserialize($block['blockstyle']);
}
$block = block_conver_to_thread($block);
DB::update('common_block', $block, array('bid'=>$bid));
DB::query('DELETE FROM '.DB::table('common_block_style')." WHERE blockclass='forum_attachment' OR blockclass='group_attachment'");
$_G['block'][$bid] = $block;
block_updatecache($bid, true);
}
show_msg("模块脚本升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'common_usergroup_field') {
$nextop = 'group_index';
if(!C::t('common_setting')->skey_exists('group_recommend')) {
DB::query("UPDATE ".DB::table('common_usergroup_field')."
SET allowcommentarticle=allowcomment,allowblogmod=allowblog,allowdoingmod=allowdoing,allowuploadmod=allowupload,allowsharemod=allowshare,allowdownlocalimg=allowpostarticle");
}
$queryraterange = DB::query("SELECT groupid, raterange FROM ".DB::table('common_usergroup_field'));
while($usergroupfield = DB::fetch($queryraterange)) {
if($usergroupfield['raterange']) {
$raterangearray = array();
foreach(explode("\n", $usergroupfield['raterange']) as $range) {
$range = explode("\t", $range);
if(count($range) == 4) {
$raterangearray[$range[0]] = implode("\t", array($range[0], 'isself' => 0, 'min' => $range[1], 'max' => $range[2], 'mrpd' => $range[3]));
}
}
if(!empty($raterangearray)) {
DB::query("UPDATE ".DB::table('common_usergroup_field')." SET raterange='".implode("\n", $raterangearray)."' WHERE groupid='".$usergroupfield['groupid']."'");
}
}
}
if($first_to_2_5) {
DB::query('UPDATE '.DB::table('common_usergroup_field')." SET allowat='50' WHERE groupid=1");
DB::query('UPDATE '.DB::table('common_usergroup_field')." SET allowcreatecollection='5',allowcommentcollection='1',allowfollowcollection='30' WHERE groupid<'4' OR groupid>'9'");
}
show_msg("用户组权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'group_index') {
$nextop = 'domain';
if(!C::t('common_setting')->skey_exists('group_recommend')) {
$arr = array(
0 => array('importfile'=>'./data/group_index.xml','primaltplname'=>'group/index', 'targettplname'=>'group/index'),
);
foreach ($arr as $v) {
import_diy($v['importfile'], $v['primaltplname'], $v['targettplname']);
}
}
show_msg("群组首页升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'domain') {
$nextop = 'pm';
$newsettings = array();
if(!empty($_G['config']['app']['domain'])) {
$update = 0;
foreach($_G['config']['app']['domain'] as $key => $value) {
if($value && !$_G['setting']['domain']['app'][$key]) {
$update = 1;
}
}
if($update) {
$domain = array(
'defaultindex' => !empty($_G['config']['app']['default']) ? $_G['config']['app']['default'].'.php' : '',
'app' => $_G['config']['app']['domain'],
);
$newsettings['domain'] = $domain;
}
}
if(!empty($_G['config']['app']['default']) && !$_G['setting']['defaultindex']) {
$newsettings['defaultindex'] = $_G['config']['app']['default'].'.php';
}
if(!empty($_G['config']['home']['holddomain']) && !$_G['setting']['holddomain']) {
$holddomain = implode('|', explode(',', $_G['config']['home']['holddomain']));
$newsettings['holddomain'] = $holddomain;
}
if(!empty($_G['config']['home']['allowdomain']) && !$_G['setting']['allowspacedomain']) {
$newsettings['allowspacedomain'] = 1;
}
if(!DB::result_first("SELECT domain FROM ".DB::table('common_domain')." WHERE idtype='home'")) {
$domainroot = $_G['config']['home']['domainroot'] ? $_G['config']['home']['domainroot'] : '';
DB::query("INSERT INTO ".DB::table('common_domain')." (domain, domainroot, id, idtype) SELECT domain, '$domainroot', uid, 'home' FROM ".DB::table('common_member_field_home')." WHERE domain<>''");
}
if(!empty($newsettings)) {
C::t('common_setting')->update_batch($newsettings);
}
show_msg("域名设置升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'pm') {
$nextop = 'allowgetimage';
DB::query("UPDATE ".DB::table('common_member')." SET newpm='0', newprompt='0'");
show_msg("新短消息状态重置完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'allowgetimage') {
$nextop = 'verify';
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_usergroup_field')." WHERE allowgetimage='1'")) {
$query = DB::query("SELECT groupid, allowgetattach FROM ".DB::table('common_usergroup_field'));
while($row = DB::fetch($query)) {
DB::query('UPDATE '.DB::table('common_usergroup_field')." SET allowgetimage='".intval($row['allowgetattach'])."' WHERE groupid='$row[groupid]'");
}
$query = DB::query("SELECT uid, allowgetattach FROM ".DB::table('forum_access'));
while($row = DB::fetch($query)) {
DB::query('UPDATE '.DB::table('forum_access')." SET allowgetimage='".intval($row['allowgetattach'])."' WHERE uid='$row[uid]'");
}
}
show_msg("查看图片权限升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'verify') {
$nextop = 'threadimage';
$settings = $verifys = array();
$settings = C::t('common_setting')->fetch_all(array('verify', 'realname', 'videophoto', 'video_allowviewspace'));
$verifys = (array)dunserialize($settings['verify']);
$updateverify = $_GET['updateverify'] ? true : false;
if(!isset($verifys[6])) {
$verifys[6] = array(
'title' => '实名认证',
'available' => $settings['realname'],
'showicon' => 0,
'viewrealname' => 0,
'field' => array('realname' => realname),
'icon' => ''
);
$verifys[7] = array(
'title' => '视频认证',
'available' => $settings['videophoto'],
'showicon' => 0,
'viewvideophoto' => $settings['video_allowviewspace'],
'icon' => ''
);
if($verifys['enabled'] && ($settings['realname'] || $settings['videophoto'])) {
$verifys['enabled'] = 1;
}
C::t('common_setting')->update('verify', $verifys);
$updateverify = true;
}
if($updateverify) {
$p = 1000;
$i = !empty($_GET['i']) ? intval($_GET['i']) : 0;
$n = 0;
$t = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_member_profile')." WHERE realname != ''");
if($t) {
$query = DB::query('SELECT mp.realname, m.* FROM '.DB::table('common_member_profile')." mp LEFT JOIN ".DB::table('common_member')." m USING(uid) WHERE mp.uid>'$i' AND mp.realname != '' LIMIT $p");
while($value=DB::fetch($query)) {
$n = intval($value['uid']);
$havauser = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_member_verify')." WHERE uid='$n'");
$data = array(
'verify6' => '1',
'verify7' => $value['videophotostatus'] ? 1 : 0,
);
if($havauser) {
DB::update('common_member_verify', $data, array('uid' => $n));
} else {
$data['uid'] = $n;
DB::insert('common_member_verify', $data);
}
}
if($n) {
show_msg("实名认证升级中[$n/$t]", "$theurl?step=data&op=verify&i=$n&updateverify=true");
}
}
}
show_msg("认证数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'forumattach') {
$nextop = 'forumstatlog';
$limit = 10000;
$start = !empty($_GET['start']) ? $_GET['start'] : 0;
$needupgrade = DB::query("SELECT COUNT(*) FROM ".DB::table('forum_attachmentfield'), 'SILENT');
$count = DB::result_first("SELECT COUNT(*) FROM ".DB::table('forum_attachment'));
if($needupgrade && $count) {
if(!$start) {
for($i = 0;$i < 10;$i++) {
DB::query("TRUNCATE ".DB::table('forum_attachment_'.$i));
}
}
$query = DB::query("SELECT a.*,af.description FROM ".DB::table('forum_attachment')." a
LEFT JOIN ".DB::table('forum_attachmentfield')." af USING(aid)
ORDER BY aid LIMIT $start, $limit");
if(DB::num_rows($query)) {
while($row = DB::fetch($query)) {
$tid = (string)$row['tid'];
$tableid = $tid{strlen($tid)-1};
DB::update('forum_attachment', array('tableid' => $tableid), array('aid' => $row['aid']));
DB::insert('forum_attachment_'.$tableid, array(
'aid' => $row['aid'],
'tid' => $row['tid'],
'pid' => $row['pid'],
'uid' => $row['uid'],
'dateline' => $row['dateline'],
'filename' => $row['filename'],
'filesize' => $row['filesize'],
'attachment' => $row['attachment'],
'remote' => $row['remote'],
'description' => $row['description'],
'readperm' => $row['readperm'],
'price' => $row['price'],
'isimage' => $row['isimage'],
'width' => $row['width'],
'thumb' => $row['thumb'],
'picid' => $row['picid'],
));
}
$start += $limit;
show_msg("论坛附件表升级中 ... $start/$count", "$theurl?step=data&op=forumattach&start=$start");
}
DB::query("DROP TABLE `".DB::table('forum_attachmentfield')."`");
$dropsql = array();
$dropfields = array('width', 'dateline', 'readperm', 'price', 'filename', 'filetype', 'filesize', 'attachment', 'isimage', 'thumb', 'remote', 'picid');
$query = DB::query('SHOW COLUMNS FROM `'.DB::table('forum_attachment').'`');
while($field = DB::fetch($query)) {
if(in_array($field['Field'], $dropfields, true)) {
$dropsql[] = 'DROP `'.$field['Field'].'`';
}
}
if($dropsql) {
DB::query("ALTER TABLE ".DB::table('forum_attachment').' '.implode(', ', $dropsql));
}
}
show_msg("论坛附件表升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'forumstatlog') {
$nextop = 'moderate';
DB::query('DELETE FROM '.DB::table('forum_statlog')." WHERE logdate='0000-00-00'");
show_msg("论坛版块统计数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'threadimage') {
$nextop = 'forumattach';
$defaultmonth = 10;
$limit = 1000;
$start = !empty($_GET['start']) ? $_GET['start'] : 0;
$needupgraded = DB::query("SELECT COUNT(*) FROM ".DB::table('forum_attachmentfield'), 'SILENT');
if($needupgraded) {
$cachefile = DISCUZ_ROOT.'./data/threadimage.cache';
if(!file_exists($cachefile)) {
$dateline = time() - 86400 * $defaultmonth * 30;
$query = DB::query("SELECT tid from ".DB::table('forum_thread')." WHERE dateline>'$dateline' AND attachment='2' AND posttableid='0'");
$data = array();
while($row = DB::fetch($query)) {
$data[] = $row['tid'];
}
if($data && @$fp = fopen($cachefile, 'w')) {
fwrite($fp, implode('|', $data));
fclose($fp);
} else {
show_msg("主题图片表无法处理,跳过", "$theurl?step=data&op=$nextop");
}
} else {
$data = @file($cachefile);
if(!$data) {
show_msg("主题图片表无法处理,跳过", "$theurl?step=data&op=$nextop");
}
$data = explode('|', $data[0]);
}
$tids = array_slice($data, $start, $limit);
if(!$tids) {
@unlink($cachefile);
show_msg("主题图片表处理完毕", "$theurl?step=data&op=$nextop");
}
$insertsql = array();
foreach(C::t('forum_post')->fetch_all_by_tid(0, $tids, false, '', 0, 0, 1) as $row) {
$threadimage = DB::fetch_first("SELECT attachment, remote FROM ".DB::table(getattachtablebytid($row['tid']))." WHERE pid='$row[pid]' AND isimage IN ('1', '-1') ORDER BY width DESC LIMIT 1");
if($threadimage['attachment']) {
$threadimage = daddslashes($threadimage);
$insertsql[$row['tid']] = "('$row[tid]', '$threadimage[attachment]', '$threadimage[remote]')";
}
}
if($insertsql) {
DB::query("INSERT INTO ".DB::table('forum_threadimage')." (`tid`, `attachment`, `remote`) VALUES ".implode(',', $insertsql));
}
$start += $limit;
show_msg("主题图片表处理中 ... $start ", "$theurl?step=data&op=threadimage&start=$start");
} else {
show_msg("主题图片表无法处理,跳过", "$theurl?step=data&op=$nextop");
}
} elseif($_GET['op'] == 'moderate') {
$nextop = 'moderate_update';
if(DB::fetch_first("SHOW TABLES LIKE '".DB::table('common_moderate')."'")) {
$modcount = DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_moderate'), array(), true);
} else {
$modcount = false;
}
if(!$modcount) {
$query = DB::query("SELECT tid FROM ".DB::table('forum_thread')." WHERE displayorder='-2'");
while($row = DB::fetch($query)) {
updatemoderate('tid', $row['tid']);
}
loadcache('posttable_info');
$posttables = array();
if(!empty($_G['cache']['posttable_info']) && is_array($_G['cache']['posttable_info'])) {
foreach($_G['cache']['posttable_info'] as $posttableid => $data) {
$posttables[] = $posttableid;
}
} else {
$posttables[] = 0;
}
foreach($posttables as $postableid) {
$query = DB::query("SELECT pid FROM ".DB::table(getposttable($postableid))." WHERE invisible='-2' AND first='0'");
while($row = DB::fetch($query)) {
updatemoderate('pid', $row['pid']);
}
}
$query = DB::query("SELECT blogid FROM ".DB::table('home_blog')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate('blogid', $row['blogid']);
}
$query = DB::query("SELECT doid FROM ".DB::table('home_doing')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate('doid', $row['doid']);
}
$query = DB::query("SELECT picid FROM ".DB::table('home_pic')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate('picid', $row['picid']);
}
$query = DB::query("SELECT sid FROM ".DB::table('home_share')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate('sid', $row['sid']);
}
$query = DB::query("SELECT idtype, cid FROM ".DB::table('home_comment')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate($row['idtype'].'_cid', $row['cid']);
}
$query = DB::query("SELECT aid FROM ".DB::table('portal_article_title')." WHERE status='1'");
while($row = DB::fetch($query)) {
updatemoderate('aid', $row['aid']);
}
$query = DB::query("SELECT cid FROM ".DB::table('portal_comment')." WHERE idtype='aid' AND status='1'");
while($row = DB::fetch($query)) {
updatemoderate('aid_cid', $row['cid']);
}
$query = DB::query("SELECT cid FROM ".DB::table('portal_comment')." WHERE idtype='topic' AND status='1'");
while($row = DB::fetch($query)) {
updatemoderate('topicid_cid', $row['cid']);
}
}
show_msg("审核数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'moderate_update') {
$nextop = 'founder';
if($first_to_2_5 && DB::fetch_first("SHOW TABLES LIKE '".DB::table('common_moderate')."'")) {
$tables = array(
'tid' => 'forum_thread_moderate',
'pid' => 'forum_post_moderate',
'blogid' => 'home_blog_moderate',
'picid' => 'home_pic_moderate',
'doid' => 'home_doing_moderate',
'sid' => 'home_share_moderate',
'aid' => 'portal_article_moderate',
'aid_cid' => 'portal_article_comment_moderate',
'topicid_cid' => 'portal_comment_moderate',
'uid_cid' => 'home_comment_moderate',
'blogid_cid' => 'home_comment_moderate',
'sid_cid' => 'home_comment_moderate',
'picid_cid' => 'home_comment_moderate',
);
$query = DB::query("SELECT * FROM ".DB::table('common_moderate'));
while($row = DB::fetch($query)) {
if(isset($tables[$row['idtype']])) {
$row = daddslashes($row);
$table = $tables[$row['idtype']];
if($table != 'home_comment_moderate') {
unset($row['idtype']);
}
DB::insert($table, $row, false, true);
}
}
}
show_msg("审核数据转换完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'founder') {
$nextop = 'threadprofile';
$founders = explode(',', str_replace(' ', '', $_G['config']['admincp']['founder']));
if($founders) {
foreach($founders as $founder) {
if(is_numeric($founder)) {
$fuid[] = $founder;
} else {
$fuser[] = $founder;
}
}
$query = DB::query("SELECT uid FROM ".DB::table('common_member')." WHERE ".($fuid ? "uid IN (".dimplode($fuid).")" : '0')." OR ".($fuser ? "username IN (".dimplode($fuser).")" : '0'));
$founders = array();
while($founder = DB::fetch($query)) {
$founders[] = $founder['uid'];
}
if($founders) {
C::t('common_member')->update_admincp_manage($founders);
}
}
show_msg("创始人数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'threadprofile') {
$nextop = 'plugin';
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table("forum_threadprofile")." WHERE global=1")) {
DB::query("INSERT INTO ".DB::table("forum_threadprofile")." (`id`, `name`, `template`, `global`) VALUES
(1, '默认方案', 'a:2:{s:4:\"left\";s:399:\"{numbercard}\r\n{groupicon}<p>{*}</p>{/groupicon}\r\n{authortitle}<p><em>{*}</em></p>{/authortitle}\r\n{customstatus}<p class=\"xg1\">{*}</p>{/customstatus}\r\n{star}<p>{*}</p>{/star}\r\n{upgradeprogress}<p>{*}</p>{/upgradeprogress}\r\n<dl class=\"pil cl\">\r\n\t<dt>{baseinfo=credits,1}</dt><dd>{baseinfo=credits,0}</dd>\r\n</dl>\r\n{medal}<p class=\"md_ctrl\">{*}</p>{/medal}\r\n<dl class=\"pil cl\">{baseinfo=field_qq,0}</dl>\";s:3:\"top\";s:82:\"<dl class=\"cl\">\r\n<dt>{baseinfo=credits,1}</dt><dd>{baseinfo=credits,0}</dd>\r\n</dl>\";}', 1);");
DB::query("REPLACE INTO ".DB::table("forum_bbcode")." VALUES ('2','2','qq','bb_qq.gif','<a href=\"http://wpa.qq.com/msgrd?v=3&uin={1}&amp;site=[Discuz!]&amp;from=discuz&amp;menu=yes\" target=\"_blank\"><img src=\"static/image/common/qq_big.gif\" border=\"0\"></a>','[qq]688888[/qq]','显示 QQ 在线状态,点这个图标可以和他(她)聊天','1','请输入 QQ 号码:<a href=\"\" class=\"xi2\" onclick=\"this.href=\'http://wp.qq.com/set.html?from=discuz&uin=\'+$(\'e_cst1_qq_param_1\').value\" target=\"_blank\" style=\"float:right;\">设置QQ在线状态&nbsp;&nbsp;</a>','1','21','1 2 3 10 11 12 13 14 15 16 17 18 19');");
}
show_msg("布局方案设置升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'plugin') {
$nextop = 'notification';
loadcache('pluginlanguage_script');
loadcache('pluginlanguage_template');
loadcache('pluginlanguage_install');
if(!$_G['cache']['pluginlanguage_script'] && !$_G['cache']['pluginlanguage_template'] && !$_G['cache']['pluginlanguage_install']) {
$query = DB::query("SELECT identifier, pluginid, modules FROM ".DB::table('common_plugin'));
while($plugin = DB::fetch($query)) {
$plugin['modules'] = dunserialize($plugin['modules']);
if(!empty($plugin['modules']['extra']['langexists'])) {
@include DISCUZ_ROOT.'./data/plugindata/'.$plugin['identifier'].'.lang.php';
if(!empty($scriptlang)) {
$_G['cache']['pluginlanguage_script'][$plugin['identifier']] = $scriptlang[$plugin['identifier']];
}
if(!empty($templatelang)) {
$_G['cache']['pluginlanguage_template'][$plugin['identifier']] = $templatelang[$plugin['identifier']];
}
if(!empty($installlang)) {
$_G['cache']['pluginlanguage_install'][$plugin['identifier']] = $installlang[$plugin['identifier']];
}
}
}
savecache('pluginlanguage_script', $_G['cache']['pluginlanguage_script']);
savecache('pluginlanguage_template', $_G['cache']['pluginlanguage_template']);
savecache('pluginlanguage_install', $_G['cache']['pluginlanguage_install']);
}
show_msg("插件语言包数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'notification') {
$nextop = 'medal';
if(!DB::result_first("SELECT id FROM ".DB::table('home_notification')." WHERE category>0")) {
$_G['notice_structure']['follow'] = array('follow');
$_G['notice_structure']['follower'] = array('follower');
foreach($_G['notice_structure'] as $key => $val) {
switch ($key) {
case 'mypost' : $category = 1; break;
case 'interactive' : $category = 2; break;
case 'system' : $category = 3; break;
case 'manage' : $category = 4; break;
case 'follow' : $category = 5; break;
case 'follower' : $category = 6; break;
default : $category = 0;
}
if($category) {
DB::query("UPDATE ".DB::table('home_notification')." SET category=$category WHERE type IN(".dimplode($val).")");
}
}
DB::query("UPDATE ".DB::table('home_notification')." SET category=2,type='comment' WHERE type IN('piccomment','blogcomment','sharecomment','doing')");
DB::query("UPDATE ".DB::table('home_notification')." SET category=3,type='click' WHERE type IN('clickblog','clickarticle','clickpic')");
}
show_msg("提醒数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'medal') {
$nextop = 'closeswitch';
if(!DB::result_first("SELECT COUNT(*) FROM ".DB::table('common_member_medal'))) {
$query = DB::query("SELECT uid, medals FROM ".DB::table('common_member_field_forum')." WHERE medals != ''");
while($member = DB::fetch($query)) {
$medals = explode("\t", $member['medals']);
foreach($medals as $medalid) {
$medalid = intval($medalid);
DB::insert('common_member_medal', array(
'uid' => $member['uid'],
'medalid' => $medalid
), 0, 1);
}
}
}
show_msg("用户勋章数据升级完毕", "$theurl?step=data&op=$nextop");
} elseif($_GET['op'] == 'closeswitch') {
$nextop = 'end';
if($first_to_2_5) {
$newsettings = array();
$newsettings['strongpw'] = 0;
$newsettings['pwlength'] = 0;
C::t('common_setting')->update_batch($newsettings);
}
show_msg("数据升级结束", "$theurl?step=data&op=$nextop");
} else {
$deletevar = array('app', 'home');//config中需要删除的项目
$default_config = $_config = array();
$default_configfile = DISCUZ_ROOT.'./config/config_global_default.php';
if(!file_exists($default_configfile)) {
exit('config_global_default.php was lost, please reupload this file.');
} else {
include $default_configfile;
$default_config = $_config;
}
$configfile = DISCUZ_ROOT.'./config/config_global.php';
include $configfile;
DB::query("UPDATE ".DB::table('common_plugin')." SET available='0' WHERE modules NOT LIKE '%s:6:\"system\";i:2;%'");
if(save_config_file($configfile, $_config, $default_config, $deletevar)) {
show_msg("数据处理完成", "$theurl?step=delete");
} else {
show_msg('"config/config_global.php" 文件已更新,由于 "config/" 目录不可写入,我们已将更新的文件保存到 "data/" 目录下,请通过 FTP 软件将其转移到 "config/" 目录下覆盖源文件。<br /><br /><a href="'.$theurl.'?step=delete">当您完成上述操作后点击这里继续</a>');
}
}
}elseif ($_GET['step'] == 'delete') {
if(!$devmode) {
show_msg("数据删除不处理,进入下一步", "$theurl?step=style");
}
$oldtables = array();
$query = DB::query("SHOW TABLES LIKE '$config[tablepre]%'");
while ($value = DB::fetch($query)) {
$values = array_values($value);
$oldtables[] = $values[0];
}
$sql = implode('', file($sqlfile));
preg_match_all("/CREATE\s+TABLE.+?pre\_(.+?)\s+\((.+?)\)\s*(ENGINE|TYPE)\s*\=/is", $sql, $matches);
$newtables = empty($matches[1])?array():$matches[1];
$connecttables = array('common_member_connect', 'common_uin_black', 'connect_feedlog', 'connect_memberbindlog', 'connect_tlog', 'connect_tthreadlog', 'common_connect_guest', 'connect_disktask');
$newsqls = empty($matches[0])?array():$matches[0];
$deltables = array();
$delcolumns = array();
foreach ($oldtables as $tname) {
$tname = substr($tname, strlen($config['tablepre']));
if(in_array($tname, $newtables)) {
$query = DB::query("SHOW CREATE TABLE ".DB::table($tname));
$cvalue = DB::fetch($query);
$oldcolumns = getcolumn($cvalue['Create Table']);
$i = array_search($tname, $newtables);
$newcolumns = getcolumn($newsqls[$i]);
foreach ($oldcolumns as $colname => $colstruct) {
if($colname == 'UNIQUE' || $colname == 'KEY') {
foreach ($colstruct as $key_index => $key_value) {
if(empty($newcolumns[$colname][$key_index])) {
$delcolumns[$tname][$colname][$key_index] = $key_value;
}
}
} else {
if(empty($newcolumns[$colname])) {
$delcolumns[$tname][] = $colname;
}
}
}
} else {
if(!strexists($tname, 'uc_') && !strexists($tname, 'ucenter_') && !preg_match('/forum_(thread|post)_(\d+)$/i', $tname) && !in_array($tname, $connecttables)) {
$deltables[] = $tname;
}
}
}
show_header();
echo '<form method="post" autocomplete="off" action="'.$theurl.'?step=delete'.($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '').'">';
$deltablehtml = '';
if($deltables) {
$deltablehtml .= '<table>';
foreach ($deltables as $tablename) {
$deltablehtml .= "<tr><td><input type=\"checkbox\" name=\"deltables[$tablename]\" value=\"1\"></td><td>{$config['tablepre']}$tablename</td></tr>";
}
$deltablehtml .= '</table>';
echo "<p>以下 <strong>数据表</strong> 与标准数据库相比是多余的:<br>您可以根据需要自行决定是否删除</p>$deltablehtml";
}
$delcolumnhtml = '';
if($delcolumns) {
$delcolumnhtml .= '<table>';
foreach ($delcolumns as $tablename => $cols) {
foreach ($cols as $coltype => $col) {
if (is_array($col)) {
foreach ($col as $index => $indexvalue) {
$delcolumnhtml .= "<tr><td><input type=\"checkbox\" name=\"delcols[$tablename][$coltype][$index]\" value=\"1\"></td><td>{$config['tablepre']}$tablename</td><td>索引($coltype) $index $indexvalue</td></tr>";
}
} else {
$delcolumnhtml .= "<tr><td><input type=\"checkbox\" name=\"delcols[$tablename][$col]\" value=\"1\"></td><td>{$config['tablepre']}$tablename</td><td>字段 $col</td></tr>";
}
}
}
$delcolumnhtml .= '</table>';
echo "<p>以下 <strong>字段</strong> 与标准数据库相比是多余的:<br>您可以根据需要自行决定是否删除</p>$delcolumnhtml";
}
if(empty($deltables) && empty($delcolumns)) {
echo "<p>与标准数据库相比,没有需要删除的数据表和字段</p><a href=\"$theurl?step=style".($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '')."\">请点击进入下一步</a></p>";
} else {
echo "<p><input type=\"submit\" name=\"delsubmit\" value=\"提交删除\"></p><p>您也可以忽略多余的表和字段<br><a href=\"$theurl?step=style".($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '')."\">直接进入下一步</a></p>";
}
echo '</form>';
show_footer();
exit();
} elseif ($_GET['step'] == 'style') {
if(empty($_GET['confirm'])) {
show_msg("请确认是否要恢复默认风格?<br /><br /><a href=\"$theurl?step=style&confirm=yes".($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '')."\">[ 是 ]</a>&nbsp;&nbsp;<a href=\"$theurl?step=cache".($_GET['from'] ? '&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : '')."\">[ 否 ]</a>", '');
}
define('IN_ADMINCP', true);
require_once libfile('function/admincp');
require_once libfile('function/importdata');
$dir = DB::result_first("SELECT t.directory FROM ".DB::table('common_style')." s LEFT JOIN ".DB::table('common_template')." t ON t.templateid=s.templateid WHERE s.styleid='1'");
import_styles(1, $dir, 1, 0, 0);
C::t('common_setting')->update('styleid', 1);
show_msg("默认风格已恢复,进入下一步", "$theurl?step=cache");
} elseif ($_GET['step'] == 'cache') {
$appService = Cloud::loadClass('Service_App');
try {
$cloudstatus = $appService->checkCloudStatus();
} catch (Exception $e) {
}
$result = false;
if($cloudstatus == 'cloud' && !$appService->getCloudAppStatus('search')) {
try{
$cloudAppService = Cloud::loadClass('Service_Client_Cloud');
$result = $cloudAppService->appOpen();
} catch(Exception $e) {
}
}
if($result == true) {
$opensoso = '<br><br>友情提示:<br>为更好的降低论坛搜索时的数据压力,本次升级已经帮本站开通纵横搜索服务。<br>你可以在 <a href=\\\'../admin.php?frames=yes&action=cloud&operation=search\\\' target=\\\'_blank\\\'>站点后台-&gt;应用-&gt;纵横搜索 进行管理</a>。';
}
if(!$devmode && @$fp = fopen($lockfile, 'w')) {
fwrite($fp, ' ');
fclose($fp);
}
dir_clear(ROOT_PATH.'./data/template');
dir_clear(ROOT_PATH.'./data/cache');
dir_clear(ROOT_PATH.'./data/threadcache');
dir_clear(ROOT_PATH.'./uc_client/data');
dir_clear(ROOT_PATH.'./uc_client/data/cache');
savecache('setting', '');
if($_GET['from']) {
show_msg('<span id="finalmsg">缓存更新中,请稍候 ...</span><iframe src="../misc.php?mod=initsys" style="display:none;" onload="window.location.href=\''.$_GET['from'].'\'"></iframe>');
} else {
show_msg('<span id="finalmsg">缓存更新中,请稍候 ...</span><iframe src="../misc.php?mod=initsys" style="display:none;" onload="document.getElementById(\'finalmsg\').innerHTML = \'恭喜,数据库结构升级完成!为了数据安全,请删除本文件。'.$opensoso.'\'"></iframe>');
}
}
function has_another_special_table($tablename, $key) {
if(!$key) {
return $tablename;
}
$tables_array = get_special_tables_array($tablename);
if($key > count($tables_array)) {
return FALSE;
} else {
return TRUE;
}
}
function get_special_tables_array($tablename) {
$tablename = DB::table($tablename);
$tablename = str_replace('_', '\_', $tablename);
$query = DB::query("SHOW TABLES LIKE '{$tablename}\_%'");
$dbo = DB::object();
$tables_array = array();
while($row = $dbo->fetch_array($query, $dbo->drivertype == 'mysqli' ? MYSQLI_NUM : MYSQL_NUM)) {
if(preg_match("/^{$tablename}_(\\d+)$/i", $row[0])) {
$prefix_len = strlen($dbo->tablepre);
$row[0] = substr($row[0], $prefix_len);
$tables_array[] = $row[0];
}
}
return $tables_array;
}
function get_special_table_by_num($tablename, $num) {
$tables_array = get_special_tables_array($tablename);
$num --;
return isset($tables_array[$num]) ? $tables_array[$num] : FALSE;
}
function getcolumn($creatsql) {
$creatsql = preg_replace("/ COMMENT '.*?'/i", '', $creatsql);
preg_match("/\((.+)\)\s*(ENGINE|TYPE)\s*\=/is", $creatsql, $matchs);
$cols = explode("\n", $matchs[1]);
$newcols = array();
foreach ($cols as $value) {
$value = trim($value);
if(empty($value)) continue;
$value = remakesql($value);
if(substr($value, -1) == ',') $value = substr($value, 0, -1);
$vs = explode(' ', $value);
$cname = $vs[0];
if($cname == 'KEY' || $cname == 'INDEX' || $cname == 'UNIQUE') {
$name_length = strlen($cname);
if($cname == 'UNIQUE') $name_length = $name_length + 4;
$subvalue = trim(substr($value, $name_length));
$subvs = explode(' ', $subvalue);
$subcname = $subvs[0];
$newcols[$cname][$subcname] = trim(substr($value, ($name_length+2+strlen($subcname))));
} elseif($cname == 'PRIMARY') {
$newcols[$cname] = trim(substr($value, 11));
} else {
$newcols[$cname] = trim(substr($value, strlen($cname)));
}
}
return $newcols;
}
function remakesql($value) {
$value = trim(preg_replace("/\s+/", ' ', $value));
$value = str_replace(array('`',', ', ' ,', '( ' ,' )', 'mediumtext'), array('', ',', ',','(',')','text'), $value);
return $value;
}
function show_msg($message, $url_forward='', $time = 1, $noexit = 0, $notice = '') {
if($url_forward) {
$url_forward = $_GET['from'] ? $url_forward.'&from='.rawurlencode($_GET['from']).'&frommd5='.rawurlencode($_GET['frommd5']) : $url_forward;
$message = "<a href=\"$url_forward\">$message (跳转中...)</a><br>$notice<script>setTimeout(\"window.location.href ='$url_forward';\", $time);</script>";
}
show_header();
print<<<END
<table>
<tr><td>$message</td></tr>
</table>
END;
show_footer();
!$noexit && exit();
}
function show_header() {
global $config;
$nowarr = array($_GET['step'] => ' class="current"');
if(in_array($_GET['step'], array('waitingdb','prepare'))) {
$nowarr = array('sql' => ' class="current"');
}
print<<<END
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=$config[charset]" />
<title> 数据库升级程序 </title>
<style type="text/css">
* {font-size:12px; font-family: Verdana, Arial, Helvetica, sans-serif; line-height: 1.5em; word-break: break-all; }
body { text-align:center; margin: 0; padding: 0; background: #F5FBFF; }
.bodydiv { margin: 40px auto 0; width:720px; text-align:left; border: solid #86B9D6; border-width: 5px 1px 1px; background: #FFF; }
h1 { font-size: 18px; margin: 1px 0 0; line-height: 50px; height: 50px; background: #E8F7FC; color: #5086A5; padding-left: 10px; }
#menu {width: 100%; margin: 10px auto; text-align: center; }
#menu td { height: 30px; line-height: 30px; color: #999; border-bottom: 3px solid #EEE; }
.current { font-weight: bold; color: #090 !important; border-bottom-color: #F90 !important; }
input { border: 1px solid #B2C9D3; padding: 5px; background: #F5FCFF; }
#footer { font-size: 10px; line-height: 40px; background: #E8F7FC; text-align: center; height: 38px; overflow: hidden; color: #5086A5; margin-top: 20px; }
</style>
</head>
<body>
<div class="bodydiv">
<h1>数据库升级工具</h1>
<div style="width:90%;margin:0 auto;">
<table id="menu">
<tr>
<td{$nowarr[start]}>升级开始</td>
<td{$nowarr[sql]}>数据库结构添加与更新</td>
<td{$nowarr[data]}>数据更新</td>
<td{$nowarr[delete]}>数据库结构删除</td>
<td{$nowarr[cache]}>升级完成</td>
</tr>
</table>
<br>
END;
}
function show_footer() {
print<<<END
</div>
<div id="footer">&copy; Comsenz Inc. 2001-2017 http://www.comsenz.com</div>
</div>
<br>
</body>
</html>
END;
}
function runquery($sql) {
global $_G;
$tablepre = $_G['config']['db'][1]['tablepre'];
$dbcharset = $_G['config']['db'][1]['dbcharset'];
$sql = str_replace("\r", "\n", str_replace(array(' {tablepre}', ' cdb_', ' `cdb_', ' pre_', ' `pre_'), array(' '.$tablepre, ' '.$tablepre, ' `'.$tablepre, ' '.$tablepre, ' `'.$tablepre), $sql));
$ret = array();
$num = 0;
foreach(explode(";\n", trim($sql)) as $query) {
$queries = explode("\n", trim($query));
foreach($queries as $query) {
$ret[$num] .= $query[0] == '#' || $query[0].$query[1] == '--' ? '' : $query;
}
$num++;
}
unset($sql);
foreach($ret as $query) {
$query = trim($query);
if($query) {
if(substr($query, 0, 12) == 'CREATE TABLE') {
$name = preg_replace("/CREATE TABLE ([a-z0-9_]+) .*/is", "\\1", $query);
DB::query(create_table($query, $dbcharset));
} else {
DB::query($query);
}
}
}
}
function import_diy($importfile, $primaltplname, $targettplname) {
global $_G;
$css = $html = '';
$arr = array();
$content = file_get_contents(realpath($importfile));
if (empty($content)) return $arr;
require_once DISCUZ_ROOT.'./source/class/class_xml.php';
$diycontent = xml2array($content);
if ($diycontent) {
foreach ($diycontent['layoutdata'] as $key => $value) {
if (!empty($value)) getframeblock($value);
}
$newframe = array();
foreach ($_G['curtplframe'] as $value) {
$newframe[] = $value['type'].random(6);
}
$mapping = array();
if (!empty($diycontent['blockdata'])) {
$mapping = block_import($diycontent['blockdata']);
unset($diycontent['blockdata']);
}
$oldbids = $newbids = array();
if (!empty($mapping)) {
foreach($mapping as $obid=>$nbid) {
$oldbids[] = 'portal_block_'.$obid;
$newbids[] = 'portal_block_'.$nbid;
}
}
require_once DISCUZ_ROOT.'./source/class/class_xml.php';
$xml = array2xml($diycontent['layoutdata'],true);
$xml = str_replace($oldbids, $newbids, $xml);
$xml = str_replace((array)array_keys($_G['curtplframe']), $newframe, $xml);
$diycontent['layoutdata'] = xml2array($xml);
$css = str_replace($oldbids, $newbids, $diycontent['spacecss']);
$css = str_replace((array)array_keys($_G['curtplframe']), $newframe, $css);
$arr['spacecss'] = $css;
$arr['layoutdata'] = $diycontent['layoutdata'];
$arr['style'] = $diycontent['style'];
save_diy_data($primaltplname, $targettplname, $arr, true);
}
return $arr;
}
function save_config_file($filename, $config, $default, $deletevar) {
$config = setdefault($config, $default, $deletevar);
$date = gmdate("Y-m-d H:i:s", time() + 3600 * 8);
$content = <<<EOT
<?php
\$_config = array();
EOT;
$content .= getvars(array('_config' => $config));
$content .= "\r\n// ".str_pad(' THE END ', 50, '-', STR_PAD_BOTH)." //\r\n\r\n?>";
if(!is_writable($filename) || !($len = file_put_contents($filename, $content))) {
file_put_contents(DISCUZ_ROOT.'./data/config_global.php', $content);
return 0;
}
return 1;
}
function setdefault($var, $default, $deletevar = array()) {
foreach ($default as $k => $v) {
if(!isset($var[$k])) {
$var[$k] = $default[$k];
} elseif(is_array($v)) {
$var[$k] = setdefault($var[$k], $default[$k]);
}
}
foreach ($deletevar as $k) {
unset($var[$k]);
}
return $var;
}
function getvars($data, $type = 'VAR') {
$evaluate = '';
foreach($data as $key => $val) {
if(!preg_match("/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/", $key)) {
continue;
}
if(is_array($val)) {
$evaluate .= buildarray($val, 0, "\${$key}")."\r\n";
} else {
$val = addcslashes($val, '\'\\');
$evaluate .= $type == 'VAR' ? "\$$key = '$val';\n" : "define('".strtoupper($key)."', '$val');\n";
}
}
return $evaluate;
}
function buildarray($array, $level = 0, $pre = '$_config') {
static $ks;
if($level == 0) {
$ks = array();
$return = '';
}
foreach ($array as $key => $val) {
if($level == 0) {
$newline = str_pad(' CONFIG '.strtoupper($key).' ', 70, '-', STR_PAD_BOTH);
$return .= "\r\n// $newline //\r\n";
if($key == 'admincp') {
$newline = str_pad(' Founders: $_config[\'admincp\'][\'founder\'] = \'1,2,3\'; ', 70, '-', STR_PAD_BOTH);
$return .= "// $newline //\r\n";
}
}
$ks[$level] = $ks[$level - 1]."['$key']";
if(is_array($val)) {
$ks[$level] = $ks[$level - 1]."['$key']";
$return .= buildarray($val, $level + 1, $pre);
} else {
$val = is_string($val) || strlen($val) > 12 || !preg_match("/^\-?[1-9]\d*$/", $val) ? '\''.addcslashes($val, '\'\\').'\'' : $val;
$return .= $pre.$ks[$level - 1]."['$key']"." = $val;\r\n";
}
}
return $return;
}
function dir_clear($dir) {
global $lang;
if($directory = @dir($dir)) {
while($entry = $directory->read()) {
$filename = $dir.'/'.$entry;
if(is_file($filename)) {
@unlink($filename);
}
}
$directory->close();
@touch($dir.'/index.htm');
}
}
function block_conver_to_thread($block){
if($block['blockclass'] == 'forum_attachment') {
$block['blockclass'] = 'forum_thread';
$block['script'] = 'thread';
} else if($block['blockclass'] == 'group_attachment') {
$block['blockclass'] = 'group_thread';
$block['script'] = 'groupthread';
}
$block['param'] = is_array($block['param']) ? $block['param'] : (array)dunserialize($block['param']);
unset($block['param']['threadmethod']);
$block['param']['special'] = array(0);
$block['param']['picrequired'] = 1;
$block['param'] = serialize($block['param']);
$block['styleid'] = 0;
$block['blockstyle'] = block_style_conver_to_thread($block['blockstyle'], $block['blockclass']);
return $block;
}
function block_style_conver_to_thread($style, $blockclass) {
$template = block_build_template($style['template']);
$search = array('threadurl', 'threadsubject', 'threadsummary', 'filesize', 'downloads');
$replace = array('url', 'title', 'summary', '');
$template = str_replace($search, $replace, $template);
$arr = array(
'name' => '',
'blockclass' => $blockclass,
);
block_parse_template($template, $arr);
$arr['fields'] = dunserialize($arr['fields']);
$arr['template'] = dunserialize($arr['template']);
$arr = serialize($arr);
return $arr;
}
function create_table($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', 'MEMORY')) ? $type : 'MYISAM';
return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU", "\\1", $sql).
(helper_dbtool::dbversion() > '4.1' ? " ENGINE=$type DEFAULT CHARSET=".$dbcharset : " TYPE=$type");
}
?>