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

195 lines
8.2KB

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