📄 database.inc.php
字号:
<?php
/*
[Discuz!] (C)2001-2006 Comsenz Inc.
This is NOT a freeware, use is subject to license terms
$RCSfile: database.inc.php,v $
$Revision: 1.39.2.4 $
$Date: 2006/09/26 08:27:30 $
*/
if(!defined('IN_DISCUZ') || !isset($PHP_SELF) || !preg_match("/[\/\\\\]admincp\.php$/", $PHP_SELF)) {
exit('Access Denied');
}
require_once DISCUZ_ROOT.'./include/attachment.func.php';
cpheader();
if(!isfounder()) cpmsg('noaccess');
if($action == 'export') {
if(!submitcheck('exportsubmit', 1)) {
$shelldisabled = function_exists('shell_exec') ? '' : 'disabled';
$sqlcharsets = "<input class=\"radio\" type=\"radio\" name=\"sqlcharset\" value=\"\" checked> $lang[default]".
($dbcharset ? " <input class=\"radio\" type=\"radio\" name=\"sqlcharset\" value=\"$dbcharset\"> ".strtoupper($dbcharset) : '').
($db->version() > '4.1' && $dbcharset != 'utf8' ? " <input class=\"radio\" type=\"radio\" name=\"sqlcharset\" value='utf8'> UTF-8</option>" : '');
$tables = $tablelist = '';
$query = $db->query("SELECT value FROM {$tablepre}settings WHERE variable='custombackup'");
if($tables = $db->fetch_array($query)) {
$tables = unserialize($tables['value']);
$tables = is_array($tables) ? $tables : '';
}
$query = $db->query("SHOW TABLE STATUS LIKE '$tablepre%'");
$rowcount = 0;
while($table = $db->fetch_array($query)) {
$checked = $tables && in_array($table['Name'], $tables) ? 'checked' : '';
$tablelist .= ($rowcount % 4 ? '' : '</tr><tr>')."<td><input class=\"checkbox\" type=\"checkbox\" name=\"customtables[]\" value=\"$table[Name]\" $checked> $table[Name]</td>\n";
$rowcount++;
}
$tablelist .= '</tr>';
if(!empty($supe_tablepre)) {
$rowcount =0;
$tablelist .='<tr><td colspan="4"><b>'.$lang['database_export_supe_table'].'</b> <input type="checkbox" name="chkall2" onclick="checkall(this.form, \'supetables\', \'chkall2\')" class="checkbox"> <b>'.$lang['database_export_custom_select_all'].'</td></tr>';
$query = $db->query("SHOW TABLE STATUS LIKE '$supe_tablepre%'");
while($table = $db->fetch_array($query)) {
$checked = $tables && in_array($table['Name'], $tables) ? 'checked' : '';
$tablelist .= ($rowcount % 4 ? '' : '</tr><tr>')."<td><input class=\"checkbox\" type=\"checkbox\" name=\"supetables[]\" value=\"$table[Name]\" $checked> $table[Name]</td>\n";
$rowcount++;
}
}
shownav('menu_database_export');
showtips('database_export_tips');
?>
<form name="backup" method="post" action="admincp.php?action=export">
<input type="hidden" name="formhash" value="<?=FORMHASH?>">
<input type="hidden" name="setup" value="1">
<table width="100%" border="0" cellpadding="0" cellspacing="0" class="tableborder">
<tr class="header"><td colspan="2"><?=$lang['database_export_type']?></td></tr>
<tr>
<td class="altbg1" width="40%"><input class="radio" type="radio" value="full" name="type" onclick="$('showtables').style.display='none'"> <?=$lang['database_export_full']?></td>
<td class="altbg2" width="60%"><?=$lang['database_export_full_comment']?></td></tr>
<tr>
<td class="altbg1"><input class="radio" type="radio" value="standard" checked name="type" onclick="$('showtables').style.display='none'"> <?=$lang['database_export_standard']?></td>
<td class="altbg2"><?=$lang['database_export_standard_comment']?></td></tr>
<tr>
<td class="altbg1"><input class="radio" type="radio" value="mini" name="type" onclick="$('showtables').style.display='none'"> <?=$lang['database_export_mini']?></td>
<td class="altbg2"><?=$lang['database_export_mini_comment']?></td></tr>
<tr>
<td class="altbg1"><input class="radio" type="radio" value="custom" name="type" onclick="$('showtables').style.display=''"> <?=$lang['database_export_custom']?></td>
<td class="altbg2"><?=$lang['database_export_custom_comment']?></td></tr>
<tbody id="showtables" style="display:none">
<tr>
<td class="altbg2" colspan="2">
<table cellspacing="0" cellpadding="0" border="0" width="100%">
<tr><td colspan="4"><b><?=$lang['database_export_discuz_table']?></b> <input class="checkbox" type="checkbox" name="chkall" onclick="checkall(this.form, 'customtables')"> <b><?=$lang['database_export_custom_select_all']?></b>
</td>
<?=$tablelist?>
</table>
</td>
</tr>
</tbody>
<tr class="header"><td colspan="2"><?=$lang['database_export_method']?></td></tr>
<tr>
<td class="altbg1"><input class="radio" type="radio" name="method" value="shell" <?=$shelldisabled?> onclick="if(<?=intval($db->version() < '4.1')?>) {if(this.form.sqlcompat[2].checked==true) this.form.sqlcompat[0].checked=true; this.form.sqlcompat[2].disabled=true; this.form.sizelimit.disabled=true;} else {this.form.sqlcharset[0].checked=true; for(var i=1; i<=5; i++) {if(this.form.sqlcharset[i]) this.form.sqlcharset[i].disabled=true;}}"> <?=$lang['database_export_shell']?></td>
<td class="altbg2"> </td>
</tr>
<tr>
<td class="altbg1"><input class="radio" type="radio" name="method" value="multivol" checked onclick="this.form.sqlcompat[2].disabled=false; this.form.sizelimit.disabled=false; for(var i=1; i<=5; i++) {if(this.form.sqlcharset[i]) this.form.sqlcharset[i].disabled=false;}"> <?=$lang['database_export_multivol']?></td>
<td class="altbg2"><input type="text" size="40" name="sizelimit" value="2048"></td>
</tr>
<tr class="header"><td colspan="2"><?=$lang['database_export_options']?></td></tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_options_extended_insert']?></td>
<td class="altbg2"><input class="radio" type="radio" name="extendins" value="1"> <?=$lang['yes']?> <input class="radio" type="radio" name="extendins" value="0" checked> <?=$lang['no']?></td>
</tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_options_add_set_names']?></td>
<td class="altbg2"><input class="radio" type="radio" name="addsetnames" value="1"> <?=$lang['yes']?> <input class="radio" type="radio" name="addsetnames" value="0" checked> <?=$lang['no']?></td>
</tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_options_sql_compatible']?></td>
<td class="altbg2"><input class="radio" type="radio" name="sqlcompat" value="" checked> <?=$lang['default']?> <input class="radio" type="radio" name="sqlcompat" value="MYSQL40"> MySQL 3.23/4.0.x <input class="radio" type="radio" name="sqlcompat" value="MYSQL41"> MySQL 4.1.x/5.x
</td>
</tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_options_charset']?></td>
<td class="altbg2"><?=$sqlcharsets?>
</td>
</tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_usehex']?></td>
<td class="altbg2"><input class="radio" type="radio" name="usehex" value="1"> <?=$lang['yes']?> <input class="radio" type="radio" name="usehex" value="0" checked> <?=$lang['no']?></td>
</td>
</tr>
<tr>
<td class="altbg1"> <?=$lang['database_export_filename']?></td>
<td class="altbg2"><input type="text" size="40" name="filename" value="./forumdata/<?=date('ymd').'_'.random(8)?>.sql" onclick="alert('<?=$lang['database_export_filename_confirm']?>');"></td>
</tr>
</table><br><center>
<input class="button" type="submit" name="exportsubmit" value="<?=$lang['submit']?>"></center></form>
<?
} else {
if(!$filename || preg_match("/(\.)(exe|jsp|asp|aspx|cgi|fcgi|pl)(\.|$)/i", $filename)) {
cpmsg('database_export_filename_invalid');
}
$time = gmdate("$dateformat $timeformat", $timestamp + $timeoffset * 3600);
if($type == 'full') {
$tables = array('access', 'activities', 'activityapplies', 'adminactions', 'admingroups', 'adminnotes',
'adminsessions', 'advertisements', 'announcements', 'attachments', 'attachtypes', 'banned',
'bbcodes', 'blogcaches', 'buddys', 'creditslog', 'crons', 'failedlogins', 'favorites',
'forumfields', 'forumlinks', 'forums', 'medals', 'memberfields', 'members', 'moderators',
'modworks', 'myposts', 'mythreads', 'onlinelist', 'onlinetime', 'orders', 'paymentlog',
'pluginhooks', 'plugins', 'pluginvars', 'pms', 'pmsearchindex', 'polloptions', 'polls',
'posts', 'profilefields', 'promotions', 'pushedthreads', 'ranks', 'ratelog', 'regips',
'relatedthreads', 'rewardlog', 'rsscaches', 'searchindex', 'sessions', 'settings',
'smilies', 'stats', 'statvars', 'styles', 'stylevars', 'subscriptions', 'templates',
'threads', 'threadsmod', 'threadtypes', 'tradelog', 'trades', 'usergroups', 'validating',
'words');
} elseif($type == 'standard') {
$tables = array('access', 'activities', 'activityapplies', 'adminactions', 'admingroups', 'adminnotes',
'adminsessions', 'advertisements', 'announcements', 'attachments', 'attachtypes', 'banned',
'bbcodes', 'buddys', 'creditslog', 'crons', 'favorites', 'forumfields', 'forumlinks', 'forums',
'medals', 'memberfields', 'members', 'moderators', 'modworks', 'onlinelist', 'onlinetime',
'orders', 'paymentlog', 'pluginhooks', 'plugins', 'pluginvars', 'polloptions', 'polls',
'posts', 'profilefields', 'ranks', 'ratelog', 'rewardlog', 'settings', 'smilies', 'stats',
'styles', 'stylevars', 'templates', 'threads', 'threadsmod', 'threadtypes', 'tradelog',
'trades', 'usergroups', 'validating', 'words');
} elseif($type == 'mini') {
$tables = array('access', 'adminactions', 'admingroups', 'adminnotes', 'advertisements', 'announcements',
'attachtypes', 'bbcodes', 'buddys', 'crons', 'forumfields', 'forumlinks', 'forums', 'medals',
'memberfields', 'members', 'moderators', 'onlinelist', 'onlinetime', 'pluginhooks', 'plugins',
'pluginvars', 'profilefields', 'ranks', 'settings', 'smilies', 'stats', 'styles', 'stylevars',
'templates', 'threadtypes', 'usergroups', 'words');
} elseif($type == 'custom') {
$tables = array();
if(empty($setup)) {
$query = $db->query("SELECT value FROM {$tablepre}settings WHERE variable='custombackup'");
if($tables = $db->fetch_array($query)) {
$tables = unserialize($tables['value']);
}
} else {
$customtables= array_merge(empty($customtables) ? array() : $customtables, empty($supetables) ? array() : $supetables);
$customtablesnew = empty($customtables)? '' : addslashes(serialize($customtables));
$db->query("REPLACE INTO {$tablepre}settings (variable, value) VALUES ('custombackup', '$customtablesnew')");
$tables = & $customtables;
}
if( !is_array($tables) || empty($tables)) {
cpmsg('database_export_custom_invalid');
}
}
if($type == 'full' || $type == 'standard') {
$query = $db->query("SELECT datatables FROM {$tablepre}plugins WHERE datatables<>''");
while($plugin = $db->fetch_array($query)) {
foreach(explode(',', $plugin['datatables']) as $table) {
if($table = trim($table)) {
$tables[] = $table;
}
}
}
}
$volume = intval($volume) + 1;
$idstring = '# Identify: '.base64_encode("$timestamp,$version,$type,$method,$volume")."\n";
if($volume == 1) {
$db->query("TRUNCATE TABLE {$tablepre}relatedthreads", 'UNBUFFERED');
$db->query("TRUNCATE TABLE {$tablepre}pmsearchindex", 'UNBUFFERED');
$db->query("TRUNCATE TABLE {$tablepre}searchindex", 'UNBUFFERED');
}
$dumpcharset = $sqlcharset ? $sqlcharset : str_replace('-', '', $GLOBALS['charset']);
$setnames = $addsetnames || ($db->version() > '4.1' && (!$sqlcompat || $sqlcompat == 'MYSQL41')) ? "SET NAMES '$dumpcharset';\n\n" : '';
if($db->version() > '4.1') {
if($sqlcharset) {
$db->query("SET NAMES '".$sqlcharset."';\n\n");
}
if($sqlcompat == 'MYSQL40') {
$db->query("SET SQL_MODE='MYSQL40'");
}
}
if($method == 'multivol') {
$sqldump = '';
$tableid = $tableid ? $tableid - 1 : 0;
$startfrom = intval($startfrom);
for($i = $tableid; $i < count($tables) && strlen($sqldump) < $sizelimit * 1000; $i++) {
$sqldump .= sqldumptable(($type != 'custom' ? $tablepre : '').$tables[$i], $startfrom, strlen($sqldump));
$startfrom = 0;
}
$tableid = $i;
$dumpfile = substr($filename, 0, strrpos($filename, '.'))."-%s".strrchr($filename, '.');
if(trim($sqldump)) {
$sqldump = "$idstring".
"# <?exit();?>\n".
"# Discuz! Multi-Volume Data Dump Vol.$volume\n".
"# Version: Discuz! $version\n".
"# Time: $time\n".
"# Type: $type\n".
"# Table Prefix: $tablepre\n".
"#\n".
"# Discuz! Home: http://www.discuz.com\n".
"# Please visit our website for newest infomation about Discuz!\n".
"# --------------------------------------------------------\n\n\n".
"$setnames".
$sqldump;
@$fp = fopen(($method == 'multivol' ? sprintf($dumpfile, $volume) : $filename), 'wb');
@flock($fp, 2);
if(@!fwrite($fp, $sqldump)) {
@fclose($fp);
cpmsg('database_export_file_invalid');
} else {
cpmsg('database_export_multivol_redirect', "admincp.php?action=export&type=".rawurlencode($type)."&saveto=".rawurlencode(server)."&filename=".rawurlencode($filename)."&method=".rawurlencode(multivol)."&sizelimit=".rawurlencode($sizelimit)."&volume=".rawurlencode($volume)."&tableid=".rawurlencode($tableid)."&startfrom=".rawurlencode($startrow)."&extendins=".rawurlencode($extendins)."&sqlcharset=".rawurlencode($sqlcharset)."&sqlcompat=".rawurlencode($sqlcompat)."&exportsubmit=yes&usehex=$usehex");
}
} else {
$volume--;
$filelist = '<ul>';
for($i = 1; $i <= $volume; $i++) {
$filename = sprintf($dumpfile, $i);
$filelist .= "<li><a href=\"$filename\">$filename\n";
}
cpheader();
cpmsg('database_export_multivol_succeed');
}
} else {
$tablesstr = '';
foreach($tables as $table) {
$tablesstr .= '"'.($type != 'custom' ? $tablepre : '').$table.'" ';
}
require './config.inc.php';
list($dbhost, $dbport) = explode(':', $dbhost);
$query = $db->query("SHOW VARIABLES LIKE 'basedir'");
list(, $mysql_base) = $db->fetch_array($query, MYSQL_NUM);
$dumpfile = addslashes(dirname(dirname(__FILE__))).'/'.$filename;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -