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

240 lines
9.7KB

  1. <?php
  2. /**
  3. * 系统修复工具
  4. *
  5. * @version $Id: sys_repair.php 1 22:28 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. require_once(dirname(__FILE__).'/config.php');
  12. CheckPurview('sys_ArcBatch');
  13. require_once(dirname(__FILE__).'/../include/oxwindow.class.php');
  14. //ShowMsg("目前暂不需要此工具,以后有需要系统会进行自动升级这个程序!<br /><a href='index_body.php'>&lt;&lt;点击此返回&gt;&gt;</a>", "javascript:;");
  15. //exit();
  16. if(empty($dopost))
  17. {
  18. $win = new OxWindow();
  19. $win->Init("sys_repair.php", "js/blank.js", "POST' enctype='multipart/form-data' ");
  20. $win->mainTitle = "系统修复工具";
  21. $wecome_info = "<a href='index_body.php'>系统主页</a> &gt;&gt; 系统错误修复工具";
  22. $win->AddTitle('本工具用于检测和修复你的系统可能存在的错误');
  23. $msg = "
  24. <table width='98%' border='0' cellspacing='0' cellpadding='0' align='center'>
  25. <tr>
  26. <td height='250' valign='top'>
  27. <br />
  28. 由于手动升级时用户没运行指定的SQL语句,或自动升级的遗漏处理或处理出错,可能会导致一些错误,使用本工具会自动检测并处理。<br /><br />
  29. <b>本工具目前主要执行下面动作:</b><br />
  30. 1、修复/优化数据表;<br />
  31. 2、更新系统缓存;<br />
  32. 3、检测系统变量一致性。<br />
  33. 4、检测微表与主表数据一致性。<br />
  34. <br />
  35. <br />
  36. <a href='sys_repair.php?dopost=1' style='font-size:18px;color:red'><b>点击此开始进行常规检测&gt;&gt;</b></a>
  37. <br /><br /><br />
  38. </td>
  39. </tr>
  40. </table>
  41. ";
  42. $win->AddMsgItem("<div style='padding-left:20px;line-height:150%'>$msg</div>");
  43. $winform = $win->GetWindow('hand','');
  44. $win->Display();
  45. exit();
  46. }
  47. /*-------------------
  48. 数据结构常规检测
  49. function 1_test_db() { }
  50. --------------------*/
  51. else if($dopost==1)
  52. {
  53. $win = new OxWindow();
  54. $win->Init("sys_repair.php", "js/blank.js", "POST' enctype='multipart/form-data' ");
  55. $win->mainTitle = "系统修复工具";
  56. $wecome_info = "<a href='sys_repair.php'>系统错误修复工具</a> &gt;&gt; 检测数据结构";
  57. $win->AddTitle('本工具用于检测和修复你的系统可能存在的错误');
  58. $msg = "
  59. <table width='98%' border='0' cellspacing='0' cellpadding='0' align='center'>
  60. <tr>
  61. <td height='250' valign='top'>
  62. <b><font color='green'>已完成数据结构完整性检测!</font></b>
  63. <hr size='1'/>
  64. <br />
  65. <b>如果你系统有下面几种问题之一,请检测微表正确性:</b><br />
  66. 1、无法获得主键,因此无法进行后续操作<br />
  67. 2、更新数据库archives表时出错<br />
  68. 3、列表显示数据目与实际文档数不一致<br />
  69. <br />
  70. <a href='sys_repair.php?dopost=2' style='font-size:18px;'><b>点击此检测微表正确性&gt;&gt;</b></a>
  71. <br /><br /><br />
  72. </td>
  73. </tr>
  74. </table>
  75. ";
  76. $win->AddMsgItem("<div style='padding-left:20px;line-height:150%'>$msg</div>");
  77. $winform = $win->GetWindow('hand','');
  78. $win->Display();
  79. exit();
  80. }
  81. /*-------------------
  82. 检测微表正确性并尝试修复
  83. function 2_test_arctiny() { }
  84. --------------------*/
  85. else if($dopost==2)
  86. {
  87. $msg = '';
  88. $allarcnum = 0;
  89. $row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__archives` ");
  90. $allarcnum = $arcnum = $row['dd'];
  91. $msg .= "·#@__archives 表总记录数: {$arcnum} <br />";
  92. $shtables = array();
  93. $dsql->Execute('me', " SELECT addtable FROM `#@__channeltype` WHERE id < -1 ");
  94. while($row = $dsql->GetArray('me') )
  95. {
  96. $addtable = strtolower(trim(str_replace('#@__', $cfg_dbprefix, $row['addtable'])));
  97. if(empty($addtable))
  98. {
  99. continue;
  100. }
  101. else
  102. {
  103. if( !isset($shtables[$addtable]) )
  104. {
  105. $shtables[$addtable] = 1;
  106. $row = $dsql->GetOne("SELECT COUNT(aid) AS dd FROM `$addtable` ");
  107. $msg .= "·{$addtable} 表总记录数: {$row['dd']} <br />";
  108. $allarcnum += $row['dd'];
  109. }
  110. }
  111. }
  112. $msg .= "※总有效记录数: {$allarcnum} <br /> ";
  113. $errall = "<a href='index_body.php' style='font-size:14px;'><b>完成修正或无错误返回&gt;&gt;</b></a>";
  114. $row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__arctiny` ");
  115. $msg .= "※微统计表记录数: {$row['dd']}<br />";
  116. if($row['dd']==$allarcnum)
  117. {
  118. $msg .= "<p style='color:green;font-size:16px'><b>两者记录一致,无需修正!</b></p><br />";
  119. }
  120. else
  121. {
  122. $sql = " TRUNCATE TABLE `#@__arctiny`";
  123. $dsql->ExecuteNoneQuery($sql);
  124. $msg .= "<font color='red'>两者记录不一致,尝试进行简单修正...</font><br />";
  125. //导入普通模型微数据
  126. $sql = "INSERT INTO `#@__arctiny`(id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid)
  127. SELECT id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid FROM `#@__archives` ";
  128. $dsql->ExecuteNoneQuery($sql);
  129. //导入单表模型微数据
  130. foreach($shtables as $tb=>$v)
  131. {
  132. $sql = "INSERT INTO `#@__arctiny`(id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid)
  133. SELECT aid, typeid, 0, arcrank, channel, senddate, 0, mid FROM `$tb` ";
  134. $rs = $dsql->ExecuteNoneQuery($sql);
  135. $doarray[$tb] = 1;
  136. }
  137. $row = $dsql->GetOne("SELECT COUNT(*) AS dd FROM `#@__arctiny` ");
  138. if($row['dd']==$allarcnum)
  139. {
  140. $msg .= "<p style='color:green;font-size:16px'><b>修正记录成功!</b></p><br />";
  141. }
  142. else
  143. {
  144. $msg .= "<p style='color:red;font-size:16px'><b>修正记录失败,建议进行高级综合检测!</b></p><br />";
  145. $errall = " <a href='sys_repair.php?dopost=3' style='font-size:14px;'><b>进行高级结合性检测&gt;&gt;</b></a> ";
  146. }
  147. }
  148. UpDateCatCache();
  149. $win = new OxWindow();
  150. $win->Init("sys_repair.php", "js/blank.js", "POST' enctype='multipart/form-data' ");
  151. $win->mainTitle = "系统修复工具";
  152. $wecome_info = "<a href='sys_repair.php'>系统错误修复工具</a> &gt;&gt; 检测微表正确性";
  153. $win->AddTitle('本工具用于检测和修复你的系统可能存在的错误');
  154. $msg = "
  155. <table width='98%' border='0' cellspacing='0' cellpadding='0' align='center'>
  156. <tr>
  157. <td height='250' valign='top'>
  158. {$msg}
  159. <hr />
  160. <br />
  161. {$errall}
  162. </td>
  163. </tr>
  164. </table>
  165. ";
  166. $win->AddMsgItem("<div style='padding-left:20px;line-height:150%'>$msg</div>");
  167. $winform = $win->GetWindow('hand','');
  168. $win->Display();
  169. exit();
  170. }
  171. /*-------------------
  172. 高级方式修复微表(会删除不合法主键的内容)
  173. function 3_re_arctiny() { }
  174. --------------------*/
  175. else if($dopost==3)
  176. {
  177. $errnum = 0;
  178. $sql = " TRUNCATE TABLE `#@__arctiny`";
  179. $dsql->ExecuteNoneQuery($sql);
  180. $sql = "SELECT arc.id, arc.typeid, arc.typeid2, arc.arcrank, arc.channel, arc.senddate, arc.sortrank,
  181. arc.mid, ch.addtable FROM `#@__archives` arc LEFT JOIN `#@__channeltype` ch ON ch.id=arc.channel ";
  182. $dsql->Execute('me', $sql);
  183. while($row = $dsql->GetArray('me') )
  184. {
  185. $sql = "INSERT INTO `#@__arctiny`(id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid)
  186. VALUES('{$row['id']}','{$row['typeid']}','{$row['typeid2']}','{$row['arcrank']}',
  187. '{$row['channel']}','{$row['senddate']}','{$row['sortrank']}','{$row['mid']}'); ";
  188. $rs = $dsql->ExecuteNoneQuery($sql);
  189. if(!$rs)
  190. {
  191. $addtable = trim($addtable);
  192. $errnum ++;
  193. $dsql->ExecuteNoneQuery("DELETE FROM `#@__archives` WHERE id='{$row['id']}' ");
  194. if(!empty($addtable)) $dsql->ExecuteNoneQuery("DELETE FROM `$addtable` WHERE id='{$row['id']}' ");
  195. }
  196. }
  197. //导入单表模型微数据
  198. $dsql->SetQuery("SELECT id,addtable FROM `#@__channeltype` WHERE id < -1 ");
  199. $dsql->Execute();
  200. $doarray = array();
  201. while($row = $dsql->GetArray())
  202. {
  203. $tb = str_replace('#@__', $cfg_dbprefix, $row['addtable']);
  204. if(empty($tb) || isset($doarray[$tb]) )
  205. {
  206. continue;
  207. }
  208. else
  209. {
  210. $sql = "INSERT INTO `#@__arctiny`(id, typeid, typeid2, arcrank, channel, senddate, sortrank, mid)
  211. SELECT aid, typeid, 0, arcrank, channel, senddate, 0, mid FROM `$tb` ";
  212. $rs = $dsql->ExecuteNoneQuery($sql);
  213. $doarray[$tb] = 1;
  214. }
  215. }
  216. $win = new OxWindow();
  217. $win->Init("sys_repair.php","js/blank.js","POST' enctype='multipart/form-data' ");
  218. $win->mainTitle = "系统修复工具";
  219. $wecome_info = "<a href='sys_repair.php'>系统错误修复工具</a> &gt;&gt; 高级综合检测修复";
  220. $win->AddTitle('本工具用于检测和修复你的系统可能存在的错误');
  221. $msg = "
  222. <table width='98%' border='0' cellspacing='0' cellpadding='0' align='center'>
  223. <tr>
  224. <td height='250' valign='top'>
  225. 完成所有修复操作,移除错误记录 {$errnum} 条!
  226. <hr />
  227. <br />
  228. <a href='index_body.php' style='font-size:14px;'><b>完成修正或无错误返回&gt;&gt;</b></a>
  229. </td>
  230. </tr>
  231. </table>
  232. ";
  233. $win->AddMsgItem("<div style='padding-left:20px;line-height:150%'>$msg</div>");
  234. $winform = $win->GetWindow('hand','');
  235. $win->Display();
  236. exit();
  237. }