Database.php 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. <?php
  2. namespace app\admin\controller\general;
  3. use app\common\controller\Backend;
  4. use think\Db;
  5. use think\Debug;
  6. /**
  7. * 数据库管理
  8. *
  9. * @icon fa fa-database
  10. * @remark 可在线进行一些简单的数据库表优化或修复,查看表结构和数据。也可以进行SQL语句的操作
  11. */
  12. class Database extends Backend
  13. {
  14. /**
  15. * 查看
  16. */
  17. function index()
  18. {
  19. $tables_data_length = $tables_index_length = $tables_free_length = $tables_data_count = 0;
  20. $tables = $list = [];
  21. $list = Db::query("SHOW TABLES");
  22. foreach ($list as $key => $row)
  23. {
  24. $tables[] = ['name' => reset($row), 'rows' => 0];
  25. }
  26. $data['tables'] = $tables;
  27. /*
  28. $one = Db::table('configvalue')->where('name', 'sql')->find();
  29. $saved_sql = [];
  30. if ($one && $one['content'])
  31. $saved_sql = explode('###', $one['content']);
  32. $data['saved_sql'] = array_values(array_filter($saved_sql));
  33. * */
  34. $data['saved_sql'] = [];
  35. $this->view->assign($data);
  36. return $this->view->fetch();
  37. }
  38. /**
  39. * SQL查询
  40. */
  41. public function query()
  42. {
  43. $do_action = $this->request->post('do_action');
  44. echo '<style type="text/css">
  45. xmp,body{margin:0;padding:0;line-height:18px;font-size:12px;font-family:"Helvetica Neue", Helvetica, Microsoft Yahei, Hiragino Sans GB, WenQuanYi Micro Hei, sans-serif;}
  46. hr{height:1px;margin:5px 1px;background:#e3e3e3;border:none;}
  47. </style>';
  48. if ($do_action == '')
  49. exit(__('Invalid parameters'));
  50. $tablename = $this->request->post("tablename/a");
  51. if (in_array($do_action, array('doquery', 'optimizeall', 'repairall')))
  52. {
  53. $this->$do_action();
  54. }
  55. else if (count($tablename) == 0)
  56. {
  57. exit(__('Invalid parameters'));
  58. }
  59. else
  60. {
  61. foreach ($tablename as $table)
  62. {
  63. $this->$do_action($table);
  64. echo "<br />";
  65. }
  66. }
  67. }
  68. private function viewinfo($name)
  69. {
  70. $row = Db::query("SHOW CREATE TABLE `{$name}`");
  71. $row = array_values($row[0]);
  72. $info = $row[1];
  73. echo "<xmp>{$info};</xmp>";
  74. }
  75. private function viewdata($name = '')
  76. {
  77. $sqlquery = "SELECT * FROM `{$name}`";
  78. $this->doquery($sqlquery);
  79. }
  80. private function optimize($name = '')
  81. {
  82. if (Db::execute("OPTIMIZE TABLE `{$name}`"))
  83. {
  84. echo __('Optimize table %s done', $name);
  85. }
  86. else
  87. {
  88. echo __('Optimize table %s fail', $name);
  89. }
  90. }
  91. private function optimizeall($name = '')
  92. {
  93. $list = Db::query("SHOW TABLES");
  94. foreach ($list as $key => $row)
  95. {
  96. $name = reset($row);
  97. if (Db::execute("OPTIMIZE TABLE {$name}"))
  98. {
  99. echo __('Optimize table %s done', $name);
  100. }
  101. else
  102. {
  103. echo __('Optimize table %s fail', $name);
  104. }
  105. echo "<br />";
  106. }
  107. }
  108. private function repair($name = '')
  109. {
  110. if (Db::execute("REPAIR TABLE `{$name}`"))
  111. {
  112. echo __('Repair table %s done', $name);
  113. }
  114. else
  115. {
  116. echo __('Repair table %s fail', $name);
  117. }
  118. }
  119. private function repairall($name = '')
  120. {
  121. $list = Db::query("SHOW TABLES");
  122. foreach ($list as $key => $row)
  123. {
  124. $name = reset($row);
  125. if (Db::execute("REPAIR TABLE {$name}"))
  126. {
  127. echo __('Repair table %s done', $name);
  128. }
  129. else
  130. {
  131. echo __('Repair table %s fail', $name);
  132. }
  133. echo "<br />";
  134. }
  135. }
  136. private function doquery($sql = null)
  137. {
  138. $sqlquery = $sql ? $sql : $this->request->post('sqlquery');
  139. if ($sqlquery == '')
  140. exit(__('SQL can not be empty'));
  141. $sqlquery = str_replace("\r", "", $sqlquery);
  142. $sqls = preg_split("/;[ \t]{0,}\n/i", $sqlquery);
  143. $maxreturn = 100;
  144. $r = '';
  145. foreach ($sqls as $key => $val)
  146. {
  147. if (trim($val) == '')
  148. continue;
  149. $val = rtrim($val, ';');
  150. $r .= "SQL:<span style='color:green;'>{$val}</span> ";
  151. if (preg_match("/^(select|explain)(.*)/i ", $val))
  152. {
  153. Debug::remark("begin");
  154. $limit = stripos(strtolower($val), "limit") !== false ? true : false;
  155. $count = Db::execute($val);
  156. if ($count > 0)
  157. {
  158. $resultlist = Db::query($val . (!$limit && $count > $maxreturn ? ' LIMIT ' . $maxreturn : ''));
  159. }
  160. else
  161. {
  162. $resultlist = [];
  163. }
  164. Debug::remark("end");
  165. $time = Debug::getRangeTime('begin', 'end', 4);
  166. $usedseconds = __('Query took %s seconds', $time) . "<br />";
  167. if ($count <= 0)
  168. {
  169. $r .= __('Query returned an empty result');
  170. }
  171. else
  172. {
  173. $r .= (__('Total:%s', $count) . (!$limit && $count > $maxreturn ? ',' . __('Max output:%s', $maxreturn) : ""));
  174. }
  175. $r = $r . ',' . $usedseconds;
  176. $j = 0;
  177. foreach ($resultlist as $m => $n)
  178. {
  179. $j++;
  180. if (!$limit && $j > $maxreturn)
  181. break;
  182. $r .= "<hr/>";
  183. $r .= "<font color='red'>" . __('Row:%s', $j) . "</font><br />";
  184. foreach ($n as $k => $v)
  185. {
  186. $r .= "<font color='blue'>{$k}:</font>{$v}<br/>\r\n";
  187. }
  188. }
  189. }
  190. else
  191. {
  192. Debug::remark("begin");
  193. $count = Db::execute($val);
  194. Debug::remark("end");
  195. $time = Debug::getRangeTime('begin', 'end', 4);
  196. $r .= __('Query affected %s rows and took %s seconds', $count, $time) . "<br />";
  197. }
  198. }
  199. echo $r;
  200. }
  201. }