国内流行的内容管理系统(CMS)多端全媒体解决方案 https://www.dedebiz.com
您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

169 行
7.3KB

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