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

206 lines
8.5KB

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