国内流行的内容管理系统(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.

269 lines
11KB

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