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

178 lines
7.9KB

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