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

168 lines
7.4KB

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