cachelist = $cachelist; $dzz->init_cron = false; $dzz->init_setting = true; $dzz->init_user = false; $dzz->init_session = false; $dzz->init_misc = false; $dzz->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 = DZZ_ROOT.'./data/update.lock'; if(file_exists($lockfile) && !$_GET['from']) { show_msg('请您先手工删除 ./data/update.lock 文件,再次运行本文件进行升级。'); } $sqlfile = 'data/install.sql'; if(!file_exists($sqlfile)) { show_msg('SQL文件 '.$sqlfile.' 不存在'); } 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=cache'); } function waitingdb($curstep, $sqlarray) { global $theurl; foreach($sqlarray as $key => $sql) { $sqlurl .= '&sql[]='.md5($sql); $sendsql .= ''; } 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') { if(!C::t('setting')->fetch('bbclosed')) { C::t('setting')->update('bbclosed', 1); require_once libfile('function/cache'); updatecache('setting'); show_msg('您的站点未关闭,正在关闭,请稍后...', $theurl.'?step=start', 5000); } show_msg('说明:
本升级程序会参照最新的SQL文件,对数据库进行同步升级。
请确保您已将最新版文件覆盖至本地文件。
升级会还原部分默认设置。

准备完毕,升级开始'); } 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'].'秒 [状态]:'.$row['State'].'[信息]:'.$row['Info'].'

'; } } if(empty($list) && empty($_GET['sendsql'])) { $msg = '准备进入下一步操作,请稍后...'; $notice = ''; $url = "?step=$_GET[nextstep]"; $time = 5; } else { $msg = '正在升级数据,请稍后...'; $notice = '

以下是正在执行的数据库升级语句:
'.$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') { $repeat=array(); /*//检查数据库表 app_market 中有无appurl重复的情况; foreach(DB::fetch_all("select appid,appurl from ".DB::table('app_market')." where 1") as $value){ if(in_array($value['appurl'],$repeat)){ C::t('app_market')->update($value['appid'],array('appurl'=>$value['appurl'].'&appid='.$value['appid'])); } $repeat[]=$value['appurl']; }*/ show_msg('准备完毕,进入下一步数据库结构升级', $theurl.'?step=sql'); } elseif ($_GET['step'] == 'sql') { $sql = implode('', file($sqlfile)); preg_match_all("/CREATE\s+TABLE.+?dzz\_(.+?)\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']); $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 = " ENGINE=MEMORY".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ); } else { $type =" ENGINE=MYISAM".(empty($config['dbcharset'])?'':" DEFAULT CHARSET=$config[dbcharset]" ); } $usql = $maths[1].$type; $usql = str_replace("CREATE TABLE IF NOT EXISTS dzz_", 'CREATE TABLE IF NOT EXISTS '.$config['tablepre'], $usql); $usql = str_replace("CREATE TABLE dzz_", 'CREATE TABLE '.$config['tablepre'], $usql); if(!DB::query($usql, 'SILENT')) { show_msg('添加表 '.DB::table($newtable).' 出错,请手工执行以下SQL语句后,再重新运行本升级程序:

'.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).' 出错,请手工执行以下升级语句后,再重新运行本升级程序:

升级SQL语句:
'.dhtmlspecialchars($usql)."

Error: ".DB::error()."
Errno.: ".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).' 出错,请手工执行以下升级语句后,再重新运行本升级程序:

升级SQL语句:
'.dhtmlspecialchars($usql)."

Error: ".DB::error()."
Errno.: ".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(!$_GET['dp']){ if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','fileVersion'))){ C::t('setting')->update('fileVersion', '1'); } if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','fileVersionNumber'))){ C::t('setting')->update('fileVersionNumber', '50'); } if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','default_mod'))){ C::t('setting')->update('default_mod', 'index'); } if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','forbiddentime'))){ C::t('setting')->update('forbiddentime', '900'); } if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','numberoflogins'))){ C::t('setting')->update('numberoflogins', '5'); } if(!DB::result_first("select COUNT(*) from %t where skey=%s",array('setting','notification'))){ C::t('setting')->update('notification', '60'); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{adminscript}?mod=appmanagement'))){ DB::delete('app_market', array('appurl' => '{dzzscript}?mod=appmanagement')); C::t('app_market')->insert(array('appname'=>'管理', 'appico'=>'appico/201712/21/184312rthhhg9oujti9tuu.png', 'appurl'=>'{adminscript}?mod=appmanagement', 'appdesc'=>'管理员应用集合,方便管理员管理各个管理应用', 'dateline'=>TIMESTAMP, 'disp'=>1, 'mid'=>1, 'vendor'=>'乐云网络', 'group'=>3, 'haveflash'=>0, 'isshow'=>1, 'hideInMarket'=>0, 'system'=>2, 'notdelete'=>1, 'position'=>1, 'open'=>1, 'app_path'=>'admin', 'identifier'=>'appmanagement', 'version'=>'2.0', 'check_upgrade_time'=>'20171115', 'available'=>1),0,1); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{dzzscript}?mod=DPlayer'))){ C::t('app_market')->insert(array('appname'=>'DPlayer', 'appico'=>'appico/202308/19/205443f8ucb4pueqebbrvp.png', 'appurl'=>'{dzzscript}?mod=DPlayer', 'appdesc'=>'DPlayer,支持MP3,mp4,flv,wav等格式', 'dateline'=>TIMESTAMP, 'disp'=>0, 'mid'=>0, 'vendor'=>'小胡', 'group'=>0, 'haveflash'=>0, 'isshow'=>0, 'hideInMarket'=>0, 'system'=>2, 'notdelete'=>1, 'position'=>1, 'open'=>1, 'app_path'=>'dzz', 'identifier'=>'DPlayer', 'version'=>'1.2', 'check_upgrade_time'=>'20230819', 'available'=>1),0,1); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{dzzscript}?mod=filemanage'))){ C::t('app_market')->insert(array('appname'=>'文件管理', 'appico'=>'appico/201712/21/175535t47bad99b7sssdwq.png', 'appurl'=>'{dzzscript}?mod=filemanage', 'appdesc'=>'管理和查看系统所有文件', 'dateline'=>TIMESTAMP, 'disp'=>6, 'mid'=>6, 'vendor'=>'乐云网络', 'haveflash'=>0, 'isshow'=>1, 'hideInMarket'=>0, 'group'=>1, 'position'=>1, 'system'=>2, 'notdelete'=>1, 'open'=>1, 'nodup'=>0, 'identifier'=>'filemanage', 'app_path'=>'dzz', 'available'=>1, 'version'=>'2.0', 'check_upgrade_time'=>'20180206'),0,1); } if(DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{adminscript}?mod=filemanage'))){ DB::delete('app_market', array('appurl' => '{adminscript}?mod=filemanage')); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{dzzscript}?mod=orguser'))){ C::t('app_market')->insert(array('appname'=>'机构用户', 'appico'=>'appico/201712/21/131016is1wjww2uwvljllw.png', 'appurl'=>'{dzzscript}?mod=orguser', 'appdesc'=>'', 'dateline'=>TIMESTAMP, 'disp'=>2, 'mid'=>2, 'vendor'=>'乐云网络', 'haveflash'=>0, 'isshow'=>1, 'hideInMarket'=>0, 'group'=>1, 'position'=>1, 'system'=>2, 'notdelete'=>1, 'open'=>1, 'nodup'=>0, 'identifier'=>'orguser', 'app_path'=>'dzz', 'available'=>1, 'version'=>'2.0', 'check_upgrade_time'=>'20220204'),0,1); } if(DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{adminscript}?mod=orguser'))){ DB::delete('app_market', array('appurl' => '{adminscript}?mod=orguser')); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{dzzscript}?mod=share'))){ C::t('app_market')->insert(array('appname'=>'分享管理', 'appico'=>'appico/201712/21/165535t47bad99b7qqqdwq.png', 'appurl'=>'{dzzscript}?mod=share', 'appdesc'=>'管理和查阅所有分享', 'dateline'=>TIMESTAMP, 'disp'=>7, 'mid'=>7, 'vendor'=>'乐云网络', 'haveflash'=>0, 'isshow'=>1, 'hideInMarket'=>0, 'group'=>1, 'position'=>1, 'system'=>2, 'notdelete'=>1, 'open'=>1, 'nodup'=>0, 'identifier'=>'share', 'app_path'=>'dzz', 'available'=>1, 'version'=>'2.0', 'check_upgrade_time'=>'20180206'),0,1); } if(DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{adminscript}?mod=share'))){ DB::delete('app_market', array('appurl' => '{adminscript}?mod=share')); } if(!DB::result_first("select COUNT(*) from %t where appurl=%s",array('app_market','{dzzscript}?mod=comment'))){ C::t('app_market')->insert(array('appname'=>'评论', 'appico'=>'appico/201712/21/128754pb0s666i6sjws1jc.png', 'appurl'=>'{dzzscript}?mod=comment', 'appdesc'=>'Dzz 系统评论组件,结合在其他应用使用,如新闻。其他开发者也可以为自己的应用调用这个通用评论插件', 'dateline'=>TIMESTAMP, 'disp'=>12, 'mid'=>12, 'vendor'=>'乐云网络', 'haveflash'=>0, 'isshow'=>1, 'hideInMarket'=>0, 'group'=>1, 'position'=>1, 'system'=>2, 'notdelete'=>1, 'open'=>1, 'nodup'=>0, 'identifier'=>'comment', 'app_path'=>'dzz', 'available'=>1, 'version'=>'2.0', 'check_upgrade_time'=>'20171115'),0,1); } //处理更新之后群组开关问题 DB::update('organization',array('manageon'=>1,'available'=>1,'syatemon'=>1),"1"); show_msg("基本设置修改完成", "$theurl?step=data&dp=1"); }elseif($_GET['dp']==1){ //转换机构和部门数据 $i = empty($_GET['i'])?0:intval($_GET['i']); $count_i = DB::result_first("select COUNT(*) from %t where 1 ",array('organization')); if($i>=$count_i) { show_msg('部门数据升级完成,进入下一步操作', $theurl.'?step=data&dp=2'); } if($orgid=DB::result_first("select orgid from %t where 1 order by orgid limit $i,1 ",array('organization'))){ C::t('organization')->setPathkeyByOrgid($orgid,1); } $i++; $msg='部门数据转换完成'; $next=$theurl.'?step=data&dp=1&i='.$i; show_msg("[ $i / $count_i ] ".$msg, $next); }elseif($_GET['dp']==2){ //修复目录gid $i = empty($_GET['i'])?0:intval($_GET['i']); $count_i = DB::result_first("select COUNT(*) from %t where gid>0 ",array('folder')); if($i>=$count_i) { show_msg('开始修复继承权限...', $theurl.'?step=data&dp=3'); } $arr=DB::fetch_first("select fid,pfid,gid,fname from %t where gid>0 order by fid limit $i,1",array('folder')); $gid=C::t('folder')->fetch_gid_by_fid($arr['fid']); if($gid!=$arr['gid']){ C::t('folder')->update($arr['fid'],array('gid'=>$gid)); DB::query("update %t set gid=%d where pfid=%d ",array('resources',$gid,$arr['fid'])); } $i++; $msg='部门文件夹修复完成'; $next=$theurl.'?step=data&dp=2&i='.$i; show_msg("[ $i / $count_i ] ".$msg, $next); }elseif($_GET['dp']==3){ //更新继承权限和路径 $i = empty($_GET['i'])?0:intval($_GET['i']); $count_i = DB::result_first("select COUNT(*) from %t",array('folder')); if($i>=$count_i) { show_msg('开始修复回收站...', $theurl.'?step=data&dp=4'); } $arr=DB::fetch_first("select fid from %t order by fid limit $i,1",array('folder')); $pdata = C::t('folder')->create_pathinfo_by_fid($arr['fid']); if($pdata){ if(!DB::result_first("select count(*) from %t where fid = %d",array('resources_path',$arr['fid']))){ $pdata['fid'] = $arr['fid']; DB::insert('resources_path',$pdata); }else{ DB::update('resources_path',$pdata,array('fid'=>$arr['fid'])); } } $perm_inherit=perm_check::getPerm1($arr['fid']); DB::update('folder',array('perm_inherit'=>$perm_inherit),"fid='{$arr[fid]}'"); $i++; $msg='继承权限修复'; $next=$theurl.'?step=data&dp=3&i='.$i; show_msg("[ $i / $count_i ] ".$msg, $next); }elseif($_GET['dp']==4){ //修改回收站相关 //回收站数据处理 $rids = $delfids = $delrids = array(); foreach(DB::fetch_all("select rid from %t where isdelete>0",array('resources')) as $v){ $delrids[] = $v['rid']; if($v['type'] == 'folder' && $v['oid']){ $delfids[] = $v['oid']; } } //更改resources表数据 if(count($delrids) > 0) DB::update("resources",array('pfid'=>-1),'rid in('.dimplode($delrids).')'); //更改folder表数据 if(count($delfids) > 0) DB::update("folder",array('pfid'=>-1),'fid in('.dimplode($delfids).')'); //清除回收站中的无用数据 DB::delete('resources_recyle','rid not in('.dimplode($delrids).')'); } show_msg("数据升级结束", "$theurl?step=delete"); }elseif ($_GET['step'] == 'delete') { $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.+?dzz\_(.+?)\s+\((.+?)\)\s*(ENGINE|TYPE)\s*\=/is", $sql, $matches); $newtables = empty($matches[1])?array():$matches[1]; $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 { } } show_header(); echo '
'; $deltablehtml = ''; if($deltables) { $deltablehtml .= ''; foreach ($deltables as $tablename) { $deltablehtml .= ""; } $deltablehtml .= '
{$config['tablepre']}$tablename
'; echo "

以下 数据表 与标准数据库相比是多余的:
您可以根据需要自行决定是否删除

$deltablehtml"; } $delcolumnhtml = ''; if($delcolumns) { $delcolumnhtml .= ''; foreach ($delcolumns as $tablename => $cols) { foreach ($cols as $coltype => $col) { if (is_array($col)) { foreach ($col as $index => $indexvalue) { $delcolumnhtml .= ""; } } else { $delcolumnhtml .= ""; } } } $delcolumnhtml .= '
{$config['tablepre']}$tablename索引($coltype) $index $indexvalue
{$config['tablepre']}$tablename字段 $col
'; echo "

以下 字段 与标准数据库相比是多余的:
您可以根据需要自行决定是否删除(建议删除)

$delcolumnhtml"; } if(empty($deltables) && empty($delcolumns)) { echo "

与标准数据库相比,没有需要删除的数据表和字段

请点击进入下一步

"; } else { echo "

您也可以忽略多余的表和字段
直接进入下一步

"; } echo '
'; show_footer(); exit(); } elseif ($_GET['step'] == 'cache') { if(@$fp = fopen($lockfile, 'w')) { fwrite($fp, ' '); fclose($fp); } //删除数据库恢复文件,防止一些安全问题; @unlink(DZZ_ROOT.'./data/restore.php'); dir_clear(DZZ_ROOT.'./data/template'); dir_clear(DZZ_ROOT.'./data/cache'); savecache('setting', ''); if($_GET['from']) { show_msg('缓存更新中,请稍候 ...'); } else { show_msg('缓存更新中,请稍候 ...'); } } 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 converttodzzcode($aid){ return 'path='.dzzencode('attach::'.$aid); } 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 = "$message (跳转中...)
$notice"; } show_header(); print<< $message 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<< 数据库升级程序

DzzOffice 小胡版 数据库升级工具

升级开始 数据库结构添加与更新 数据更新 数据库结构删除 升级完成
END; } function show_footer() { print<<

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}', ' dzz_', ' `dzz_'), array(' '.$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 save_config_file($filename, $config, $default, $deletevar) { $config = setdefault($config, $default, $deletevar); $date = gmdate("Y-m-d H:i:s", time() + 3600 * 8); $content = << $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(DZZ_ROOT.'./data/config.php', $content); return 0; } return 1; } function setdefault($var, $default, $deletevar) { 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 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). (" ENGINE=$type DEFAULT CHARSET=".$dbcharset); } ?>