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

218 lines
8.9KB

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