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

347 lines
11KB

  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 - 2020, DesDev, Inc.
  8. * @license http://help.dedecms.com/usersguide/license.html
  9. * @link http://www.dedecms.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 = $bakStr = '';
  132. //分析表里的字段信息
  133. $dsql->GetTableFields($nowtable);
  134. $intable = "INSERT INTO `$nowtable` VALUES(";
  135. while($r = $dsql->GetFieldObject())
  136. {
  137. $fs[$j] = trim($r->name);
  138. $j++;
  139. }
  140. $fsd = $j-1;
  141. //读取表的内容
  142. $dsql->SetQuery("SELECT * FROM `$nowtable` ");
  143. $dsql->Execute();
  144. $m = 0;
  145. $bakfilename = "$bkdir/{$nowtable}_{$startpos}_".substr(md5(time().mt_rand(1000,5000).$cfg_cookie_encode),0,16).".txt";
  146. while($row2 = $dsql->GetArray())
  147. {
  148. if($m < $startpos)
  149. {
  150. $m++;
  151. continue;
  152. }
  153. //检测数据是否达到规定大小
  154. if(strlen($bakStr) > $fsizeb)
  155. {
  156. $fp = fopen($bakfilename,"w");
  157. fwrite($fp,$bakStr);
  158. fclose($fp);
  159. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  160. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php'>
  161. <input type='hidden' name='isstruct' value='$isstruct' />
  162. <input type='hidden' name='dopost' value='bak' />
  163. <input type='hidden' name='fsize' value='$fsize' />
  164. <input type='hidden' name='tablearr' value='$tablearr' />
  165. <input type='hidden' name='nowtable' value='$nowtable' />
  166. <input type='hidden' name='startpos' value='$m' />
  167. <input type='hidden' name='iszip' value='$iszip' />\r\n</form>\r\n{$dojs}\r\n";
  168. PutInfo($tmsg,$doneForm);
  169. exit();
  170. }
  171. //正常情况
  172. $line = $intable;
  173. for($j=0; $j<=$fsd; $j++)
  174. {
  175. if($j < $fsd)
  176. {
  177. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."',";
  178. }
  179. else
  180. {
  181. $line .= "'".RpLine(addslashes($row2[$fs[$j]]))."');\r\n";
  182. }
  183. }
  184. $m++;
  185. $bakStr .= $line;
  186. }
  187. //如果数据比卷设置值小
  188. if($bakStr!='')
  189. {
  190. $fp = fopen($bakfilename,"w");
  191. fwrite($fp,$bakStr);
  192. fclose($fp);
  193. }
  194. for($i=0; $i<count($tables); $i++)
  195. {
  196. if($tables[$i] == $nowtable)
  197. {
  198. if(isset($tables[$i+1]))
  199. {
  200. $nowtable = $tables[$i+1];
  201. $startpos = 0;
  202. break;
  203. }else
  204. {
  205. PutInfo("完成所有数据备份!","");
  206. exit();
  207. }
  208. }
  209. }
  210. $tmsg = "<font color='red'>完成到{$m}条记录的备份,继续备份{$nowtable}...</font>";
  211. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=bak'>
  212. <input type='hidden' name='isstruct' value='$isstruct' />
  213. <input type='hidden' name='fsize' value='$fsize' />
  214. <input type='hidden' name='tablearr' value='$tablearr' />
  215. <input type='hidden' name='nowtable' value='$nowtable' />
  216. <input type='hidden' name='startpos' value='$startpos'>\r\n</form>\r\n{$dojs}\r\n";
  217. PutInfo($tmsg,$doneForm);
  218. exit();
  219. }
  220. //分页备份代码结束
  221. }
  222. /*-------------------------
  223. 还原数据
  224. function __re_data();
  225. -------------------------*/
  226. else if($dopost=='redat')
  227. {
  228. if($bakfiles=='')
  229. {
  230. ShowMsg('没指定任何要还原的文件!', 'javascript:;');
  231. exit();
  232. }
  233. $bakfilesTmp = $bakfiles;
  234. $bakfiles = explode(',', $bakfiles);
  235. if(empty($structfile))
  236. {
  237. $structfile = "";
  238. }
  239. if(empty($delfile))
  240. {
  241. $delfile = 0;
  242. }
  243. if(empty($startgo))
  244. {
  245. $startgo = 0;
  246. }
  247. if($startgo==0 && $structfile!='')
  248. {
  249. $tbdata = '';
  250. $fp = fopen("$bkdir/$structfile", 'r');
  251. while(!feof($fp))
  252. {
  253. $tbdata .= fgets($fp, 1024);
  254. }
  255. fclose($fp);
  256. $querys = explode(';', $tbdata);
  257. foreach($querys as $q)
  258. {
  259. $dsql->ExecuteNoneQuery(trim($q).';');
  260. }
  261. if($delfile==1)
  262. {
  263. @unlink("$bkdir/$structfile");
  264. }
  265. $tmsg = "<font color='red'>完成数据表信息还原,准备还原数据...</font>";
  266. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  267. <input type='hidden' name='startgo' value='1' />
  268. <input type='hidden' name='delfile' value='$delfile' />
  269. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  270. </form>\r\n{$dojs}\r\n";
  271. PutInfo($tmsg, $doneForm);
  272. exit();
  273. }
  274. else
  275. {
  276. $nowfile = $bakfiles[0];
  277. $bakfilesTmp = preg_replace("#".$nowfile."[,]{0,1}#", "", $bakfilesTmp);
  278. $oknum=0;
  279. if( filesize("$bkdir/$nowfile") > 0 )
  280. {
  281. $fp = fopen("$bkdir/$nowfile", 'r');
  282. while(!feof($fp))
  283. {
  284. $line = trim(fgets($fp, 512*1024));
  285. if($line=="") continue;
  286. $rs = $dsql->ExecuteNoneQuery($line);
  287. if($rs) $oknum++;
  288. }
  289. fclose($fp);
  290. }
  291. if($delfile==1)
  292. {
  293. @unlink("$bkdir/$nowfile");
  294. }
  295. if($bakfilesTmp=="")
  296. {
  297. ShowMsg('成功还原所有的文件的数据!', 'javascript:;');
  298. exit();
  299. }
  300. $tmsg = "成功还原{$nowfile}的{$oknum}条记录<br/><br/>正在准备还原其它数据...";
  301. $doneForm = "<form name='gonext' method='post' action='sys_data_done.php?dopost=redat'>
  302. <input type='hidden' name='startgo' value='1' />
  303. <input type='hidden' name='delfile' value='$delfile' />
  304. <input type='hidden' name='bakfiles' value='$bakfilesTmp' />
  305. </form>\r\n{$dojs}\r\n";
  306. PutInfo($tmsg, $doneForm);
  307. exit();
  308. }
  309. }
  310. function PutInfo($msg1,$msg2)
  311. {
  312. global $cfg_dir_purview,$cfg_soft_lang;
  313. $msginfo = "<html>\n<head>
  314. <meta http-equiv='Content-Type' content='text/html; charset={$cfg_soft_lang}' />
  315. <title>DEDECMS 提示信息</title>
  316. <base target='_self'/>\n</head>\n<body leftmargin='0' topmargin='0'>\n<center>
  317. <br/>
  318. <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>
  319. <div style='width:400px;height:100px;font-size:10pt;border:1px solid #cccccc;background-color:#F4FAEB'>
  320. <span style='line-height:160%'><br/>{$msg1}</span>
  321. <br/><br/></div>\r\n{$msg2}";
  322. echo $msginfo."</center>\n</body>\n</html>";
  323. }
  324. function RpLine($str)
  325. {
  326. $str = str_replace("\r", "\\r", $str);
  327. $str = str_replace("\n", "\\n", $str);
  328. return $str;
  329. }