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

350 lines
12KB

  1. <?php
  2. /**
  3. * 数据库操作
  4. *
  5. * @version $Id: sys_data_done.php 1 17:19 2010年7月20日Z tianya $
  6. * @package DedeCMS.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. {
  28. if(empty($tablearr))
  29. {
  30. ShowMsg('你没选中任何表!', 'javascript:;');
  31. exit();
  32. }
  33. if(!is_dir($bkdir))
  34. {
  35. MkdirAll($bkdir, $cfg_dir_purview);
  36. CloseFtp();
  37. }
  38. //初始化使用到的变量
  39. $tables = explode(',', $tablearr);
  40. if(!isset($isstruct))
  41. {
  42. $isstruct = 0;
  43. }
  44. if(!isset($startpos))
  45. {
  46. $startpos = 0;
  47. }
  48. if(!isset($iszip))
  49. {
  50. $iszip = 0;
  51. }
  52. if(empty($nowtable))
  53. {
  54. $nowtable = '';
  55. }
  56. if(empty($fsize))
  57. {
  58. $fsize = 2048;
  59. }
  60. $fsizeb = $fsize * 1024;
  61. //第一页的操作
  62. if($nowtable=='')
  63. {
  64. $tmsg = '';
  65. $dh = dir($bkdir);
  66. while($filename = $dh->read())
  67. {
  68. if(!preg_match("#txt$#", $filename))
  69. {
  70. continue;
  71. }
  72. $filename = $bkdir."/$filename";
  73. if(!is_dir($filename))
  74. {
  75. unlink($filename);
  76. }
  77. }
  78. $dh->close();
  79. $tmsg .= "清除备份目录旧数据完成...<br />";
  80. if($isstruct==1)
  81. {
  82. $bkfile = $bkdir."/tables_struct_".substr(md5(time().mt_rand(1000,5000).$cfg_cookie_encode),0,16).".txt";
  83. $mysql_version = $dsql->GetVersion();
  84. $fp = fopen($bkfile, "w");
  85. foreach($tables as $t)
  86. {
  87. fwrite($fp, "DROP TABLE IF EXISTS `$t`;\r\n\r\n");
  88. $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$t);
  89. $dsql->Execute('me');
  90. $row = $dsql->GetArray('me', MYSQL_BOTH);
  91. //去除AUTO_INCREMENT
  92. $row[1] = preg_replace("#AUTO_INCREMENT=([0-9]{1,})[ \r\n\t]{1,}#i", "", $row[1]);
  93. //4.1以下版本备份为低版本
  94. if($datatype==4.0 && $mysql_version > 4.0)
  95. {
  96. $eng1 = "#ENGINE=MyISAM[ \r\n\t]{1,}DEFAULT[ \r\n\t]{1,}CHARSET=".$cfg_db_language."#i";
  97. $tableStruct = preg_replace($eng1, "TYPE=MyISAM", $row[1]);
  98. }
  99. //4.1以下版本备份为高版本
  100. else if($datatype==4.1 && $mysql_version < 4.1)
  101. {
  102. $eng1 = "#ENGINE=MyISAM DEFAULT CHARSET={$cfg_db_language}#i";
  103. $tableStruct = preg_replace("TYPE=MyISAM", $eng1, $row[1]);
  104. }
  105. //普通备份
  106. else
  107. {
  108. $tableStruct = $row[1];
  109. }
  110. fwrite($fp,''.$tableStruct.";\r\n\r\n");
  111. }
  112. fclose($fp);
  113. $tmsg .= "备份数据表结构信息完成...<br />";
  114. }
  115. $tmsg .= "<font color='red'>正在进行数据备份的初始化工作,请稍后...</font>";
  116. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
  117. <input type='hidden' name='isstruct' value='$isstruct' />
  118. <input type='hidden' name='dopost' value='bak' />
  119. <input type='hidden' name='fsize' value='$fsize' />
  120. <input type='hidden' name='tablearr' value='$tablearr' />
  121. <input type='hidden' name='nowtable' value='{$tables[0]}' />
  122. <input type='hidden' name='startpos' value='0' />
  123. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  124. PutInfo($tmsg, $doneForm);
  125. exit();
  126. }
  127. //执行分页备份
  128. else
  129. {
  130. $j = 0;
  131. $fs = array();
  132. $bakStr = '';
  133. //分析表里的字段信息
  134. $dsql->GetTableFields($nowtable);
  135. $intable = "INSERT INTO `$nowtable` VALUES(";
  136. while($r = $dsql->GetFieldObject())
  137. {
  138. $fs[$j] = trim($r->name);
  139. $j++;
  140. }
  141. $fsd = $j-1;
  142. //读取表的内容
  143. $dsql->SetQuery("SELECT * FROM `$nowtable` ");
  144. $dsql->Execute();
  145. $m = 0;
  146. $bakfilename = "$bkdir/{$nowtable}_{$startpos}_".substr(md5(time().mt_rand(1000,5000).$cfg_cookie_encode),0,16).".txt";
  147. while($row2 = $dsql->GetArray())
  148. {
  149. if($m < $startpos)
  150. {
  151. $m++;
  152. continue;
  153. }
  154. //检测数据是否达到规定大小
  155. if(strlen($bakStr) > $fsizeb)
  156. {
  157. $fp = fopen($bakfilename,"w");
  158. fwrite($fp,$bakStr);
  159. fclose($fp);
  160. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  161. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
  162. <input type='hidden' name='isstruct' value='$isstruct' />
  163. <input type='hidden' name='dopost' value='bak' />
  164. <input type='hidden' name='fsize' value='$fsize' />
  165. <input type='hidden' name='tablearr' value='$tablearr' />
  166. <input type='hidden' name='nowtable' value='$nowtable' />
  167. <input type='hidden' name='startpos' value='$m' />
  168. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  169. PutInfo($tmsg,$doneForm);
  170. exit();
  171. }
  172. //正常情况
  173. $line = $intable;
  174. for($j=0; $j<=$fsd; $j++)
  175. {
  176. if($j < $fsd)
  177. {
  178. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."',";
  179. }
  180. else
  181. {
  182. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."');\r\n";
  183. }
  184. }
  185. $m++;
  186. $bakStr .= $line;
  187. }
  188. //如果数据比卷设置值小
  189. if($bakStr!='')
  190. {
  191. $fp = fopen($bakfilename,"w");
  192. fwrite($fp,$bakStr);
  193. fclose($fp);
  194. }
  195. for($i=0; $i<count($tables); $i++)
  196. {
  197. if($tables[$i] == $nowtable)
  198. {
  199. if(isset($tables[$i+1]))
  200. {
  201. $nowtable = $tables[$i+1];
  202. $startpos = 0;
  203. break;
  204. }else
  205. {
  206. PutInfo("完成所有数据备份!","");
  207. exit();
  208. }
  209. }
  210. }
  211. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  212. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=bak'>
  213. <input type='hidden' name='isstruct' value='$isstruct' />
  214. <input type='hidden' name='fsize' value='$fsize' />
  215. <input type='hidden' name='tablearr' value='$tablearr' />
  216. <input type='hidden' name='nowtable' value='$nowtable' />
  217. <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n";
  218. PutInfo($tmsg,$doneForm);
  219. exit();
  220. }
  221. //分页备份代码结束
  222. }
  223. /*-------------------------
  224. 还原数据
  225. function __re_data();
  226. -------------------------*/
  227. else if($dopost=='redat')
  228. {
  229. if($bakfiles=='')
  230. {
  231. ShowMsg('没指定任何要还原的文件!', 'javascript:;');
  232. exit();
  233. }
  234. $bakfilesTmp = $bakfiles;
  235. $bakfiles = explode(',', $bakfiles);
  236. if(empty($structfile))
  237. {
  238. $structfile = "";
  239. }
  240. if(empty($delfile))
  241. {
  242. $delfile = 0;
  243. }
  244. if(empty($startgo))
  245. {
  246. $startgo = 0;
  247. }
  248. if($startgo==0 && $structfile!='')
  249. {
  250. $tbdata = '';
  251. $fp = fopen("$bkdir/$structfile", 'r');
  252. while(!feof($fp))
  253. {
  254. $tbdata .= fgets($fp, 1024);
  255. }
  256. fclose($fp);
  257. $querys = explode(';', $tbdata);
  258. foreach($querys as $q)
  259. {
  260. $dsql->ExecuteNoneQuery(trim($q).';');
  261. }
  262. if($delfile==1)
  263. {
  264. @unlink("$bkdir/$structfile");
  265. }
  266. $tmsg = "<font color='red'>完成数据表信息还原,准备还原数据...</font>";
  267. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  268. <input type='hidden' name='startgo' value='1' />
  269. <input type='hidden' name='delfile' value='$delfile' />
  270. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  271. </form>\r\n{$dojs}\r\n";
  272. PutInfo($tmsg, $doneForm);
  273. exit();
  274. }
  275. else
  276. {
  277. $nowfile = $bakfiles[0];
  278. $bakfilesTmp = preg_replace("#".$nowfile."[,]{0,1}#", "", $bakfilesTmp);
  279. $oknum=0;
  280. if( filesize("$bkdir/$nowfile") > 0 )
  281. {
  282. $fp = fopen("$bkdir/$nowfile", 'r');
  283. while(!feof($fp))
  284. {
  285. $line = trim(fgets($fp, 512*1024));
  286. if($line=="") continue;
  287. $rs = $dsql->ExecuteNoneQuery($line);
  288. if($rs) $oknum++;
  289. }
  290. fclose($fp);
  291. }
  292. if($delfile==1)
  293. {
  294. @unlink("$bkdir/$nowfile");
  295. }
  296. if($bakfilesTmp=="")
  297. {
  298. ShowMsg('成功还原所有的文件的数据!', 'javascript:;');
  299. exit();
  300. }
  301. $tmsg = "成功还原{$nowfile}的{$oknum}条记录<br/><br/>正在准备还原其它数据...";
  302. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  303. <input type='hidden' name='startgo' value='1' />
  304. <input type='hidden' name='delfile' value='$delfile' />
  305. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  306. </form>\r\n{$dojs}\r\n";
  307. PutInfo($tmsg, $doneForm);
  308. exit();
  309. }
  310. }
  311. function PutInfo($msg1,$msg2)
  312. {
  313. global $cfg_dir_purview,$cfg_soft_lang;
  314. $msginfo = "<html>\n<head>
  315. <meta http-equiv='Content-Type' content='text/html; charset={$cfg_soft_lang}' />
  316. <title>DEDECMS 提示信息</title>
  317. <base target='_self'/>\n</head>\n<body leftmargin='0' topmargin='0'>\n<center>
  318. <br/>
  319. <div style='width:400px;padding-top:4px;height:24;font-size:10pt;border-left:1px solid #cccccc;border-top:1px solid #cccccc;border-right:1px solid #cccccc;background-color:#DBEEBD;'>DEDECMS 提示信息!</div>
  320. <div style='width:400px;height:100px;font-size:10pt;border:1px solid #cccccc;background-color:#F4FAEB'>
  321. <span style='line-height:160%'><br/>{$msg1}</span>
  322. <br/><br/></div>\r\n{$msg2}";
  323. echo $msginfo."</center>\n</body>\n</html>";
  324. }
  325. function RpLine($str)
  326. {
  327. $str = str_replace("\r", "\\r", $str);
  328. $str = str_replace("\n", "\\n", $str);
  329. return $str;
  330. }