|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- <?php
- /**
- * 数据库操作
- *
- * @version $Id: sys_data_done.php 1 17:19 2010年7月20日Z tianya $
- * @package DedeBIZ.Administrator
- * @copyright Copyright (c) 2022, DedeBIZ.COM
- * @license https://www.dedebiz.com/license
- * @link https://www.dedebiz.com
- */
- @ob_start();
- @set_time_limit(0);
- ini_set('memory_limit', '-1');
- require_once(dirname(__FILE__).'/config.php');
- CheckPurview('sys_Data');
- if (empty($dopost)) $dopost = '';
- $bkdir = DEDEDATA.'/'.$cfg_backup_dir;
- //跳转到一下页的js
- $gotojs = "function GotoNextPage(){document.gonext."."submit();}"."\r\nset"."Timeout('GotoNextPage()',500);";
- $dojs = "<script>$gotojs</script>";
- /*--------------------
- 备份数据
- function __bak_data();
- --------------------*/
- if ($dopost == 'bak') {
- if (empty($tablearr)) {
- ShowMsg('您没选中数据表', 'javascript:;');
- exit();
- }
- if (!is_dir($bkdir)) {
- MkdirAll($bkdir, $cfg_dir_purview);
- CloseFtp();
- }
- //初始化使用到的变量
- $tables = explode(',', $tablearr);
- if (!isset($isstruct)) {
- $isstruct = 0;
- }
- if (!isset($startpos)) {
- $startpos = 0;
- }
- if (!isset($iszip)) {
- $iszip = 0;
- }
- if (empty($nowtable)) {
- $nowtable = '';
- }
- if (empty($fsize)) {
- $fsize = 2048;
- }
- $fsizeb = $fsize * 1024;
- //第一页的操作
- if ($nowtable == '') {
- $tmsg = '';
- $dh = dir($bkdir);
- while ($filename = $dh->read()) {
- if (!preg_match("#txt$#", $filename)) {
- continue;
- }
- $filename = $bkdir."/$filename";
- if (!is_dir($filename)) {
- unlink($filename);
- }
- }
- $dh->close();
- $tmsg .= "清除备份目录旧数据完成";
- if ($isstruct == 1) {
- $bkfile = $bkdir."/tables_struct_".substr(md5(time().mt_rand(1000, 5000).$cfg_cookie_encode), 0, 16).".txt";
- $mysql_version = $dsql->GetVersion();
- $fp = fopen($bkfile, "w");
- foreach ($tables as $t) {
- fwrite($fp, "DROP TABLE IF EXISTS `$t`;\r\n\r\n");
- $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$t);
- $dsql->Execute('me');
- $row = $dsql->GetArray('me', MYSQL_BOTH);
- //去除AUTO_INCREMENT
- $row[1] = preg_replace("#AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}#i", "", $row[1]);
- $eng1 = "#ENGINE=MyISAM[ \r\n\t]{1,}DEFAULT[ \r\n\t]{1,}CHARSET=".$cfg_db_language."#i";
- $tableStruct = preg_replace($eng1, "TYPE=MyISAM", $row[1]);
- fwrite($fp, ''.$tableStruct.";\r\n\r\n");
- }
- fclose($fp);
- $tmsg .= "备份数据表结构信息完成";
- }
- $tmsg .= "正在进行数据备份初始化工作,请稍后";
- $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
- <input type='hidden' name='isstruct' value='$isstruct' />
- <input type='hidden' name='dopost' value='bak' />
- <input type='hidden' name='fsize' value='$fsize' />
- <input type='hidden' name='tablearr' value='$tablearr' />
- <input type='hidden' name='nowtable' value='{$tables[0]}' />
- <input type='hidden' name='startpos' value='0' />
- <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
- PutInfo($tmsg, $doneForm);
- exit();
- }
- //执行分页备份
- else {
- $j = 0;
- $fs = array();
- $bakStr = '';
- //分析表里的字段信息
- $dsql->GetTableFields($nowtable);
- $intable = "INSERT INTO `$nowtable` VALUES(";
- while ($r = $dsql->GetFieldObject()) {
-
- $fs[$j] = trim($r->name);
- $j++;
- }
- $fsd = $j - 1;
- //读取表的内容
- $dsql->SetQuery("SELECT * FROM `$nowtable` ");
- $dsql->Execute();
- $m = 0;
- $bakfilename = "$bkdir/{$nowtable}_{$startpos}_".substr(md5(time().mt_rand(1000, 5000).$cfg_cookie_encode), 0, 16).".txt";
- while ($row2 = $dsql->GetArray()) {
- if ($m < $startpos) {
- $m++;
- continue;
- }
- //检测数据是否达到规定大小
- if (strlen($bakStr) > $fsizeb) {
- $fp = fopen($bakfilename, "w");
- fwrite($fp, $bakStr);
- fclose($fp);
- $tmsg = "完成到{$m}条数据备份,继续备份{$nowtable}";
- $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
- <input type='hidden' name='isstruct' value='$isstruct' />
- <input type='hidden' name='dopost' value='bak' />
- <input type='hidden' name='fsize' value='$fsize' />
- <input type='hidden' name='tablearr' value='$tablearr' />
- <input type='hidden' name='nowtable' value='$nowtable' />
- <input type='hidden' name='startpos' value='$m' />
- <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
- PutInfo($tmsg, $doneForm);
- exit();
- }
- //正常情况
- $line = $intable;
- for ($j = 0; $j <= $fsd; $j++) {
- if ($j < $fsd) {
- $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."',";
- } else {
- $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."');\r\n";
- }
- }
- $m++;
- $bakStr .= $line;
- }
- //如果数据比卷设置值小
- if ($bakStr != '') {
- $fp = fopen($bakfilename, "w");
- fwrite($fp, $bakStr);
- fclose($fp);
- }
- for ($i = 0; $i < count($tables); $i++) {
- if ($tables[$i] == $nowtable) {
- if (isset($tables[$i + 1])) {
- $nowtable = $tables[$i + 1];
- $startpos = 0;
- break;
- } else {
- PutInfo("完成所有数据备份", "");
- exit();
- }
- }
- }
- $tmsg = "完成到{$m}条数据备份,继续备份{$nowtable}";
- $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=bak'>
- <input type='hidden' name='isstruct' value='$isstruct' />
- <input type='hidden' name='fsize' value='$fsize' />
- <input type='hidden' name='tablearr' value='$tablearr' />
- <input type='hidden' name='nowtable' value='$nowtable' />
- <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n";
- PutInfo($tmsg, $doneForm);
- exit();
- }
- //分页备份代码结束
- }
- /*-------------------------
- 还原数据
- function __re_data();
- -------------------------*/
- else if ($dopost == 'redat') {
- if ($bakfiles == '') {
- ShowMsg('没指定任何要还原数据', 'javascript:;');
- exit();
- }
- $bakfilesTmp = $bakfiles;
- $bakfiles = explode(',', $bakfiles);
- if (empty($structfile)) {
- $structfile = "";
- }
- if (empty($delfile)) {
- $delfile = 0;
- }
- if (empty($startgo)) {
- $startgo = 0;
- }
- if ($startgo == 0 && $structfile != '') {
- $tbdata = '';
- $fp = fopen("$bkdir/$structfile", 'r');
- while (!feof($fp)) {
- $tbdata .= fgets($fp, 1024);
- }
- fclose($fp);
- $querys = explode(';', $tbdata);
- foreach ($querys as $q) {
- $q = preg_replace("#TYPE=MyISAM#i","ENGINE=MyISAM DEFAULT CHARSET=".$cfg_db_language, $q);
- $rs = $dsql->ExecuteNoneQuery(trim($q).';');
- }
- if ($delfile == 1) {
- @unlink("$bkdir/$structfile");
- }
- $tmsg = "完成数据表还原,继续还原数据";
- $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
- <input type='hidden' name='startgo' value='1' />
- <input type='hidden' name='delfile' value='$delfile' />
- <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
- </form>\r\n{$dojs}\r\n";
- PutInfo($tmsg, $doneForm);
- exit();
- } else {
- $nowfile = $bakfiles[0];
- $bakfilesTmp = preg_replace("#".$nowfile."[,]{0,1}#", "", $bakfilesTmp);
- $oknum = 0;
- if (filesize("$bkdir/$nowfile") > 0) {
- $fp = fopen("$bkdir/$nowfile", 'r');
- while (!feof($fp)) {
- $line = trim(fgets($fp, 512 * 1024));
- if ($line == "") continue;
- $rs = $dsql->ExecuteNoneQuery($line);
- if ($rs) $oknum++;
- }
- fclose($fp);
- }
- if ($delfile == 1) {
- @unlink("$bkdir/$nowfile");
- }
- if ($bakfilesTmp == "") {
- ShowMsg('成功还原所有的文件数据', 'javascript:;');
- exit();
- }
- $tmsg = "成功还原{$nowfile}文件{$oknum}条数据,正在继续还原其它数据";
- $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
- <input type='hidden' name='startgo' value='1' />
- <input type='hidden' name='delfile' value='$delfile' />
- <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
- </form>\r\n{$dojs}\r\n";
- PutInfo($tmsg, $doneForm);
- exit();
- }
- }
- function PutInfo($msg1, $msg2)
- {
- global $cfg_soft_lang;
- $msginfo = "<html><head><meta charset='{$cfg_soft_lang}'><meta name='viewport' content='width=device-width,initial-scale=1,shrink-to-fit=no'><link rel='stylesheet' href='../static/css/bootstrap.min.css'><title>提示信息</title><base target='_self'></head><body><main class='container'><div class='modal' style='display:block'><div class='modal-dialog'><div class='modal-content'><div class='modal-header'><h6 class='modal-title'>提示信息</h6></div><div class='modal-body'>{$msg1}</div></div></div></div></main>{$msg2}";
- echo $msginfo."</body></html>";
- }
- function RpLine($str)
- {
- $str = str_replace("\r", "\\r", $str);
- $str = str_replace("\n", "\\n", $str);
- return $str;
- }
|