error("数据库管理插件只允许在开发环境下使用"); } return parent::_initialize(); } /** * 查看 */ public function index() { $tables_data_length = $tables_index_length = $tables_free_length = $tables_data_count = 0; $tables = $list = []; $list = Db::query("SHOW TABLES"); foreach ($list as $key => $row) { $tables[] = ['name' => reset($row), 'rows' => 0]; } $data['tables'] = $tables; $data['saved_sql'] = []; $this->view->assign($data); return $this->view->fetch(); } /** * SQL查询 */ public function query() { $do_action = $this->request->post('do_action'); echo ''; if ($do_action == '') { exit(__('Invalid parameters')); } $tablename = $this->request->post("tablename/a", []); if (in_array($do_action, array('doquery', 'optimizeall', 'repairall'))) { $this->$do_action(); } elseif (count($tablename) == 0) { exit(__('请选中表后再进行操作')); } else { foreach ($tablename as $table) { $this->$do_action($table); echo "
"; } } } private function viewinfo($name) { $row = Db::query("SHOW CREATE TABLE `{$name}`"); $row = array_values($row[0]); $info = $row[1]; echo "{$info};"; } private function viewdata($name = '') { $sqlquery = "SELECT * FROM `{$name}`"; $this->doquery($sqlquery); } private function optimize($name = '') { if (Db::execute("OPTIMIZE TABLE `{$name}`")) { echo __('Optimize table %s done', $name); } else { echo __('Optimize table %s fail', $name); } } private function optimizeall($name = '') { $list = Db::query("SHOW TABLES"); foreach ($list as $key => $row) { $name = reset($row); if (Db::execute("OPTIMIZE TABLE {$name}")) { echo __('Optimize table %s done', $name); } else { echo __('Optimize table %s fail', $name); } echo "
"; } } private function repair($name = '') { if (Db::execute("REPAIR TABLE `{$name}`")) { echo __('Repair table %s done', $name); } else { echo __('Repair table %s fail', $name); } } private function repairall($name = '') { $list = Db::query("SHOW TABLES"); foreach ($list as $key => $row) { $name = reset($row); if (Db::execute("REPAIR TABLE {$name}")) { echo __('Repair table %s done', $name); } else { echo __('Repair table %s fail', $name); } echo "
"; } } private function doquery($sql = null) { $sqlquery = $sql ? $sql : $this->request->post('sqlquery'); if ($sqlquery == '') { exit(__('SQL can not be empty')); } $sqlquery = str_replace('__PREFIX__', config('database.prefix'), $sqlquery); $sqlquery = str_replace("\r", "", $sqlquery); $sqls = preg_split("/;[ \t]{0,}\n/i", $sqlquery); $maxreturn = 100; $r = ''; foreach ($sqls as $key => $val) { if (trim($val) == '') { continue; } $val = rtrim($val, ';'); $r .= "SQL:{$val} "; if (preg_match("/^(select|explain)(.*)/i ", $val)) { Debug::remark("begin"); $limit = stripos(strtolower($val), "limit") !== false ? true : false; try { $count = Db::execute($val); if ($count > 0) { $resultlist = Db::query($val . (!$limit && $count > $maxreturn ? ' LIMIT ' . $maxreturn : '')); } else { $resultlist = []; } } catch (\PDOException $e) { continue; } Debug::remark("end"); $time = Debug::getRangeTime('begin', 'end', 4); $usedseconds = __('Query took %s seconds', $time) . "
"; if ($count <= 0) { $r .= __('Query returned an empty result'); } else { $r .= (__('Total:%s', $count) . (!$limit && $count > $maxreturn ? ',' . __('Max output:%s', $maxreturn) : "")); } $r = $r . ',' . $usedseconds; $j = 0; foreach ($resultlist as $m => $n) { $j++; if (!$limit && $j > $maxreturn) { break; } $r .= "
"; $r .= "" . __('Row:%s', $j) . "
"; foreach ($n as $k => $v) { $r = $r . "" . htmlentities($k) . ":" . htmlentities($v) . "
\r\n"; } } } else { try { Debug::remark("begin"); $count = Db::getPdo()->exec($val); Debug::remark("end"); } catch (\PDOException $e) { continue; } $time = Debug::getRangeTime('begin', 'end', 4); $r .= __('Query affected %s rows and took %s seconds', $count, $time) . "
"; } } echo $r; } }