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

217 lines
9.6KB

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