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

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