国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

290 lines
11KB

  1. <?php
  2. /**
  3. * 数据库操作
  4. *
  5. * @version $Id: sys_data_done.php 1 17:19 2010年7月20日Z tianya $
  6. * @package DedeBIZ.Administrator
  7. * @copyright Copyright (c) 2020, DedeBIZ.COM
  8. * @license https://www.dedebiz.com/license
  9. * @link https://www.dedebiz.com
  10. */
  11. @ob_start();
  12. @set_time_limit(0);
  13. require_once(dirname(__FILE__) . '/config.php');
  14. CheckPurview('sys_Data');
  15. if (empty($dopost)) $dopost = '';
  16. $bkdir = DEDEDATA . '/' . $cfg_backup_dir;
  17. //跳转到一下页的JS
  18. $gotojs = "function GotoNextPage(){
  19. document.gonext." . "submit();
  20. }" . "\r\nset" . "Timeout('GotoNextPage()',500);";
  21. $dojs = "<script language='javascript'>$gotojs</script>";
  22. /*--------------------
  23. 备份数据
  24. function __bak_data();
  25. --------------------*/
  26. if ($dopost == 'bak') {
  27. if (empty($tablearr)) {
  28. ShowMsg('你没选中任何表!', 'javascript:;');
  29. exit();
  30. }
  31. if (!is_dir($bkdir)) {
  32. MkdirAll($bkdir, $cfg_dir_purview);
  33. CloseFtp();
  34. }
  35. //初始化使用到的变量
  36. $tables = explode(',', $tablearr);
  37. if (!isset($isstruct)) {
  38. $isstruct = 0;
  39. }
  40. if (!isset($startpos)) {
  41. $startpos = 0;
  42. }
  43. if (!isset($iszip)) {
  44. $iszip = 0;
  45. }
  46. if (empty($nowtable)) {
  47. $nowtable = '';
  48. }
  49. if (empty($fsize)) {
  50. $fsize = 2048;
  51. }
  52. $fsizeb = $fsize * 1024;
  53. //第一页的操作
  54. if ($nowtable == '') {
  55. $tmsg = '';
  56. $dh = dir($bkdir);
  57. while ($filename = $dh->read()) {
  58. if (!preg_match("#txt$#", $filename)) {
  59. continue;
  60. }
  61. $filename = $bkdir . "/$filename";
  62. if (!is_dir($filename)) {
  63. unlink($filename);
  64. }
  65. }
  66. $dh->close();
  67. $tmsg .= "清除备份目录旧数据完成...<br />";
  68. if ($isstruct == 1) {
  69. $bkfile = $bkdir . "/tables_struct_" . substr(md5(time() . mt_rand(1000, 5000) . $cfg_cookie_encode), 0, 16) . ".txt";
  70. $mysql_version = $dsql->GetVersion();
  71. $fp = fopen($bkfile, "w");
  72. foreach ($tables as $t) {
  73. fwrite($fp, "DROP TABLE IF EXISTS `$t`;\r\n\r\n");
  74. $dsql->SetQuery("SHOW CREATE TABLE " . $dsql->dbName . "." . $t);
  75. $dsql->Execute('me');
  76. $row = $dsql->GetArray('me', MYSQL_BOTH);
  77. // 去除AUTO_INCREMENT
  78. $row[1] = preg_replace("#AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}#i", "", $row[1]);
  79. $eng1 = "#ENGINE=MyISAM[ \r\n\t]{1,}DEFAULT[ \r\n\t]{1,}CHARSET=" . $cfg_db_language . "#i";
  80. $tableStruct = preg_replace($eng1, "TYPE=MyISAM", $row[1]);
  81. fwrite($fp, '' . $tableStruct . ";\r\n\r\n");
  82. }
  83. fclose($fp);
  84. $tmsg .= "备份数据表结构信息完成...<br />";
  85. }
  86. $tmsg .= "<font color='red'>正在进行数据备份的初始化工作,请稍后...</font>";
  87. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
  88. <input type='hidden' name='isstruct' value='$isstruct' />
  89. <input type='hidden' name='dopost' value='bak' />
  90. <input type='hidden' name='fsize' value='$fsize' />
  91. <input type='hidden' name='tablearr' value='$tablearr' />
  92. <input type='hidden' name='nowtable' value='{$tables[0]}' />
  93. <input type='hidden' name='startpos' value='0' />
  94. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  95. PutInfo($tmsg, $doneForm);
  96. exit();
  97. }
  98. //执行分页备份
  99. else {
  100. $j = 0;
  101. $fs = array();
  102. $bakStr = '';
  103. //分析表里的字段信息
  104. $dsql->GetTableFields($nowtable);
  105. $intable = "INSERT INTO `$nowtable` VALUES(";
  106. while ($r = $dsql->GetFieldObject()) {
  107. $fs[$j] = trim($r->name);
  108. $j++;
  109. }
  110. $fsd = $j - 1;
  111. //读取表的内容
  112. $dsql->SetQuery("SELECT * FROM `$nowtable` ");
  113. $dsql->Execute();
  114. $m = 0;
  115. $bakfilename = "$bkdir/{$nowtable}_{$startpos}_" . substr(md5(time() . mt_rand(1000, 5000) . $cfg_cookie_encode), 0, 16) . ".txt";
  116. while ($row2 = $dsql->GetArray()) {
  117. if ($m < $startpos) {
  118. $m++;
  119. continue;
  120. }
  121. //检测数据是否达到规定大小
  122. if (strlen($bakStr) > $fsizeb) {
  123. $fp = fopen($bakfilename, "w");
  124. fwrite($fp, $bakStr);
  125. fclose($fp);
  126. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  127. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
  128. <input type='hidden' name='isstruct' value='$isstruct' />
  129. <input type='hidden' name='dopost' value='bak' />
  130. <input type='hidden' name='fsize' value='$fsize' />
  131. <input type='hidden' name='tablearr' value='$tablearr' />
  132. <input type='hidden' name='nowtable' value='$nowtable' />
  133. <input type='hidden' name='startpos' value='$m' />
  134. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  135. PutInfo($tmsg, $doneForm);
  136. exit();
  137. }
  138. //正常情况
  139. $line = $intable;
  140. for ($j = 0; $j <= $fsd; $j++) {
  141. if ($j < $fsd) {
  142. $line .= "'" . RpLine(addslashes($row2[$fs[$j]])) . "',";
  143. } else {
  144. $line .= "'" . RpLine(addslashes($row2[$fs[$j]])) . "');\r\n";
  145. }
  146. }
  147. $m++;
  148. $bakStr .= $line;
  149. }
  150. //如果数据比卷设置值小
  151. if ($bakStr != '') {
  152. $fp = fopen($bakfilename, "w");
  153. fwrite($fp, $bakStr);
  154. fclose($fp);
  155. }
  156. for ($i = 0; $i < count($tables); $i++) {
  157. if ($tables[$i] == $nowtable) {
  158. if (isset($tables[$i + 1])) {
  159. $nowtable = $tables[$i + 1];
  160. $startpos = 0;
  161. break;
  162. } else {
  163. PutInfo("完成所有数据备份!", "");
  164. exit();
  165. }
  166. }
  167. }
  168. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  169. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=bak'>
  170. <input type='hidden' name='isstruct' value='$isstruct' />
  171. <input type='hidden' name='fsize' value='$fsize' />
  172. <input type='hidden' name='tablearr' value='$tablearr' />
  173. <input type='hidden' name='nowtable' value='$nowtable' />
  174. <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n";
  175. PutInfo($tmsg, $doneForm);
  176. exit();
  177. }
  178. //分页备份代码结束
  179. }
  180. /*-------------------------
  181. 还原数据
  182. function __re_data();
  183. -------------------------*/ else if ($dopost == 'redat') {
  184. if ($bakfiles == '') {
  185. ShowMsg('没指定任何要还原的文件!', 'javascript:;');
  186. exit();
  187. }
  188. $bakfilesTmp = $bakfiles;
  189. $bakfiles = explode(',', $bakfiles);
  190. if (empty($structfile)) {
  191. $structfile = "";
  192. }
  193. if (empty($delfile)) {
  194. $delfile = 0;
  195. }
  196. if (empty($startgo)) {
  197. $startgo = 0;
  198. }
  199. if ($startgo == 0 && $structfile != '') {
  200. $tbdata = '';
  201. $fp = fopen("$bkdir/$structfile", 'r');
  202. while (!feof($fp)) {
  203. $tbdata .= fgets($fp, 1024);
  204. }
  205. fclose($fp);
  206. $querys = explode(';', $tbdata);
  207. foreach ($querys as $q) {
  208. $dsql->ExecuteNoneQuery(trim($q) . ';');
  209. }
  210. if ($delfile == 1) {
  211. @unlink("$bkdir/$structfile");
  212. }
  213. $tmsg = "<font color='red'>完成数据表信息还原,准备还原数据...</font>";
  214. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  215. <input type='hidden' name='startgo' value='1' />
  216. <input type='hidden' name='delfile' value='$delfile' />
  217. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  218. </form>\r\n{$dojs}\r\n";
  219. PutInfo($tmsg, $doneForm);
  220. exit();
  221. } else {
  222. $nowfile = $bakfiles[0];
  223. $bakfilesTmp = preg_replace("#" . $nowfile . "[,]{0,1}#", "", $bakfilesTmp);
  224. $oknum = 0;
  225. if (filesize("$bkdir/$nowfile") > 0) {
  226. $fp = fopen("$bkdir/$nowfile", 'r');
  227. while (!feof($fp)) {
  228. $line = trim(fgets($fp, 512 * 1024));
  229. if ($line == "") continue;
  230. $rs = $dsql->ExecuteNoneQuery($line);
  231. if ($rs) $oknum++;
  232. }
  233. fclose($fp);
  234. }
  235. if ($delfile == 1) {
  236. @unlink("$bkdir/$nowfile");
  237. }
  238. if ($bakfilesTmp == "") {
  239. ShowMsg('成功还原所有的文件的数据!', 'javascript:;');
  240. exit();
  241. }
  242. $tmsg = "成功还原{$nowfile}的{$oknum}条记录<br/><br/>正在准备还原其它数据...";
  243. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  244. <input type='hidden' name='startgo' value='1' />
  245. <input type='hidden' name='delfile' value='$delfile' />
  246. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  247. </form>\r\n{$dojs}\r\n";
  248. PutInfo($tmsg, $doneForm);
  249. exit();
  250. }
  251. }
  252. function PutInfo($msg1, $msg2)
  253. {
  254. global $cfg_soft_lang;
  255. $msginfo = "<html>\n<head>
  256. <meta http-equiv='Content-Type' content='text/html; charset={$cfg_soft_lang}' />
  257. <meta name='viewport' content='width=device-width, initial-scale=1, shrink-to-fit=no'>
  258. <link rel='stylesheet' href='../static/css/bootstrap.min.css'>
  259. <title>DedeBIZ 提示信息</title>
  260. <base target='_self'/>\n</head>\n<body leftmargin='0' topmargin='0'>\n<main class='container'><div class='modal' tabindex='-1' role='dialog' style='display:block'><div class='modal-dialog'><div class='modal-content'><div class='modal-header'><h6 class='modal-title'>DedeBIZ 提示信息!</h6></div><div class='modal-body'>{$msg1}</div></div></div></div></main>{$msg2}";
  261. echo $msginfo . "\n</body>\n</html>";
  262. }
  263. function RpLine($str)
  264. {
  265. $str = str_replace("\r", "\\r", $str);
  266. $str = str_replace("\n", "\\n", $str);
  267. return $str;
  268. }