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

187 line
8.1KB

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