From 1791d7df3dccf8f79c3e8a6d695e8206cb5d7b0b Mon Sep 17 00:00:00 2001 From: tianya Date: Wed, 30 Apr 2025 21:20:32 +0800 Subject: [PATCH] =?UTF-8?q?SQL=E5=91=BD=E4=BB=A4=E5=B7=A5=E5=85=B7?= =?UTF-8?q?=E4=B8=8B=E6=96=B0=E5=A2=9E=E7=AB=99=E7=82=B9=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/admin/sys_data.php | 64 ++++++-- src/admin/sys_sql_query.php | 225 ++++++++++++++++++++++++--- src/admin/templets/index.htm | 16 +- src/admin/templets/sys_sql_query.htm | 2 +- 4 files changed, 259 insertions(+), 48 deletions(-) diff --git a/src/admin/sys_data.php b/src/admin/sys_data.php index b3fdf7c0..5e405945 100644 --- a/src/admin/sys_data.php +++ b/src/admin/sys_data.php @@ -15,22 +15,49 @@ if (DEDEBIZ_SAFE_MODE) { CheckPurview('sys_Data'); if (empty($dopost)) $dopost = ''; if ($cfg_dbtype == 'sqlite') { - showMsg("备份系统根目录下/data/".$cfg_dbname.".db文件即可", "javascript:;"); + showMsg("系统使用SQLite数据库,备份系统根目录下/data/".$cfg_dbname.".db文件即可", "javascript:;"); exit(); } //查看表结构 if ($dopost == "viewinfo") { - echo ""; - if (empty($tablename)) { - echo "没有指定表名"; + if ($cfg_dbtype == 'sqlite') { + echo "<xmp>"; + if (empty($tablename)) { + echo "没有指定表名"; + } else { + // 获取创建表的 SQL 语句 + $dsql->SetQuery("SELECT sql FROM sqlite_master WHERE type='table' AND name='$tablename'"); + $dsql->Execute('me'); + $row = $dsql->GetArray('me', SQLITE3_ASSOC); + if ($row) { + $createTableSql = $row['sql']; + echo "创建表的 SQL 语句:\n"; + echo trim($createTableSql) . "\n\n"; + } + + // 获取表的列信息 + $dsql->SetQuery("PRAGMA table_info($tablename)"); + $dsql->Execute('cols'); + echo "表的列信息:\n"; + while ($colRow = $dsql->GetArray('cols', SQLITE3_ASSOC)) { + echo "列名: " . $colRow['name'] . ", 类型: " . $colRow['type'] . ", 是否为主键: " . ($colRow['pk'] ? '是' : '否') . "\n"; + } + } + echo ''; + exit(); } else { - $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$tablename); - $dsql->Execute('me'); - $row2 = $dsql->GetArray('me', MYSQL_BOTH); - $ctinfo = $row2[1]; - echo trim($ctinfo); + echo ""; + if (empty($tablename)) { + echo "没有指定表名"; + } else { + $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$tablename); + $dsql->Execute('me'); + $row2 = $dsql->GetArray('me', MYSQL_BOTH); + $ctinfo = $row2[1]; + echo trim($ctinfo); + } + echo ''; } - echo ''; exit(); } //优化表 @@ -39,11 +66,20 @@ else if ($dopost == "opimize") { if (empty($tablename)) { echo "没有指定表名"; } else { - $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `$tablename`"); - if ($rs) { - echo "执行优化表".$tablename."完成
"; + if ($cfg_dbtype == 'sqlite') { + $rs = $dsql->ExecuteNoneQuery("VACUUM"); + if ($rs) { + echo "执行优化表 {$tablename} 完成
"; + } else { + echo "执行优化表 {$tablename} 失败,原因是:" . $dsql->GetError(); + } } else { - echo "执行优化表".$tablename."失败,原因是:".$dsql->GetError(); + $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `$tablename`"); + if ($rs) { + echo "执行优化表".$tablename."完成
"; + } else { + echo "执行优化表".$tablename."失败,原因是:".$dsql->GetError(); + } } } echo ''; diff --git a/src/admin/sys_sql_query.php b/src/admin/sys_sql_query.php index e2c56203..0c9c228a 100644 --- a/src/admin/sys_sql_query.php +++ b/src/admin/sys_sql_query.php @@ -17,14 +17,32 @@ if (empty($dopost)) $dopost = ''; //查看表结构 if ($dopost == "viewinfo") { CheckCSRF(); - if (empty($tablename)) { - echo "没有指定表名"; + if ($cfg_dbtype == 'sqlite') { + echo ""; + if (empty($tablename)) { + echo "没有指定表名"; + } else { + // 获取创建表的 SQL 语句 + $dsql->SetQuery("SELECT sql FROM sqlite_master WHERE type='table' AND name='$tablename'"); + $dsql->Execute('me'); + $row = $dsql->GetArray('me', SQLITE3_ASSOC); + if ($row) { + $createTableSql = str_replace(" ", "\r\n", $row['sql']); + echo trim($createTableSql) . "\n\n"; + } + } + echo ''; + exit(); } else { - $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$tablename); - $dsql->Execute('me'); - $row2 = $dsql->GetArray('me', MYSQL_BOTH); - $ctinfo = $row2[1]; - echo "".trim($ctinfo).""; + if (empty($tablename)) { + echo "没有指定表名"; + } else { + $dsql->SetQuery("SHOW CREATE TABLE ".$dsql->dbName.".".$tablename); + $dsql->Execute('me'); + $row2 = $dsql->GetArray('me', MYSQL_BOTH); + $ctinfo = $row2[1]; + echo "".trim($ctinfo).""; + } } exit(); } @@ -34,9 +52,18 @@ else if ($dopost == "opimize") { if (empty($tablename)) { echo "没有指定表名"; } else { - $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `$tablename`"); - if ($rs) echo "执行优化表".$tablename."完成
"; - else echo "执行优化表".$tablename."失败,原因是:".$dsql->GetError(); + if ($cfg_dbtype == 'sqlite') { + $rs = $dsql->ExecuteNoneQuery("VACUUM"); + if ($rs) { + echo "执行优化表 {$tablename} 完成
"; + } else { + echo "执行优化表 {$tablename} 失败,原因是:" . $dsql->GetError(); + } + } else { + $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `$tablename`"); + if ($rs) echo "执行优化表".$tablename."完成
"; + else echo "执行优化表".$tablename."失败,原因是:".$dsql->GetError(); + } } exit(); } @@ -45,39 +72,72 @@ else if ($dopost == "opimizeAll") { CheckCSRF(); $dsql->SetQuery("SHOW TABLES"); $dsql->Execute('t'); - while ($row = $dsql->GetArray('t', MYSQL_BOTH)) { - $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `{$row[0]}`"); + if ($cfg_dbtype == 'sqlite') { + $rs = $dsql->ExecuteNoneQuery("VACUUM"); if ($rs) { - echo "优化表{$row[0]}完成
"; + echo "执行数据库完成
"; } else { - echo "优化表{$row[0]}失败,原因是: ".$dsql->GetError(); + echo "执行数据库失败,原因是:" . $dsql->GetError(); + } + } else { + while ($row = $dsql->GetArray('t', MYSQL_BOTH)) { + $rs = $dsql->ExecuteNoneQuery("OPTIMIZE TABLE `{$row[0]}`"); + if ($rs) { + echo "优化表{$row[0]}完成
"; + } else { + echo "优化表{$row[0]}失败,原因是: ".$dsql->GetError(); + } } } exit(); } -//修复表 +// 修复表 else if ($dopost == "repair") { CheckCSRF(); if (empty($tablename)) { echo "没有指定表名"; } else { - $rs = $dsql->ExecuteNoneQuery("REPAIR TABLE `$tablename`"); - if ($rs) echo "修复表".$tablename."完成
"; - else echo "修复表".$tablename."失败,原因是:".$dsql->GetError(); + if ($cfg_dbtype =='sqlite') { + // SQLite 数据库使用 VACUUM 尝试修复和优化 + $rs = $dsql->ExecuteNoneQuery("VACUUM"); + if ($rs) { + echo "对表 {$tablename} 尝试修复和优化完成
"; + } else { + echo "对表 {$tablename} 尝试修复和优化失败,原因是:" . $dsql->GetError(); + } + } else { + // 非 SQLite 数据库(如 MySQL)使用 REPAIR TABLE 语句 + $rs = $dsql->ExecuteNoneQuery("REPAIR TABLE `{$tablename}`"); + if ($rs) { + echo "修复表 {$tablename} 完成
"; + } else { + echo "修复表 {$tablename} 失败,原因是:" . $dsql->GetError(); + } + } } exit(); } -//修复全部表 +// 修复全部表 else if ($dopost == "repairAll") { CheckCSRF(); - $dsql->SetQuery("Show Tables"); - $dsql->Execute('t'); - while ($row = $dsql->GetArray('t', MYSQL_BOTH)) { - $rs = $dsql->ExecuteNoneQuery("REPAIR TABLE `{$row[0]}`"); + if ($cfg_dbtype =='sqlite') { + // SQLite 数据库使用 VACUUM 尝试修复和优化整个数据库 + $rs = $dsql->ExecuteNoneQuery("VACUUM"); if ($rs) { - echo "修复表{$row[0]}完成
"; + echo "对所有表尝试修复和优化完成
"; } else { - echo "修复表{$row[0]}失败,原因是: ".$dsql->GetError(); + echo "对所有表尝试修复和优化失败,原因是:" . $dsql->GetError(); + } + } else { + $dsql->SetQuery("Show Tables"); + $dsql->Execute('t'); + while ($row = $dsql->GetArray('t', MYSQL_BOTH)) { + $rs = $dsql->ExecuteNoneQuery("REPAIR TABLE `{$row[0]}`"); + if ($rs) { + echo "修复表 {$row[0]} 完成
"; + } else { + echo "修复表 {$row[0]} 失败,原因是: " . $dsql->GetError(); + } } } exit(); @@ -149,6 +209,121 @@ else if ($dopost == "query") { echo $nerrCode; } exit(); +} else if ($dopost == "docs") { + if ($cfg_dbtype == 'sqlite') { + die("SQLite 数据库不支持此功能"); + } + CheckCSRF(); + $dsql->SetQuery("SHOW TABLES"); + $dsql->Execute('t'); + $output = ' + + + + + + + DedeBIZ数据库文档 + + + +
+ '; + + while ($row = $dsql->GetArray('t', MYSQL_BOTH)) { + $tableName = $row[0]; + $output .= '
+
+ 表名: ' . $tableName . ' +
+
'; + // 获取表的注释 + $dsql->SetQuery("SELECT TABLE_COMMENT FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '$tableName'"); + $dsql->Execute('c'); + $tableCommentRow = $dsql->GetArray('c', MYSQL_BOTH); + $tableComment = $tableCommentRow['TABLE_COMMENT']; + if (!empty($tableComment)) { + $output .= '

表注释: ' . $tableComment . '

'; + } + + // 获取表的字段信息 + $dsql->SetQuery("SELECT COLUMN_NAME, COLUMN_TYPE, IS_NULLABLE, COLUMN_DEFAULT, COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = '$tableName'"); + $dsql->Execute('col'); + $output .= ' + + + + + + + + + + '; + while ($colRow = $dsql->GetArray('col', MYSQL_BOTH)) { + $columnName = $colRow['COLUMN_NAME']; + $columnType = $colRow['COLUMN_TYPE']; + $isNullable = $colRow['IS_NULLABLE']; + $columnDefault = $colRow['COLUMN_DEFAULT']; + $columnComment = $colRow['COLUMN_COMMENT']; + + $output .= ' + + + + + + '; + } + $output .= ' +
字段名类型是否可为空默认值字段注释
' . $columnName . '' . $columnType . '' . $isNullable . '' . ($columnDefault!== null? $columnDefault : '无') . '' . $columnComment. '
+ +
+
'; + } + + $output .= '
+ + +'; + + // 输出 HTML 文档 + header('Content-Type: text/html'); + echo $output; + exit(); } make_hash(); include DedeInclude('templets/sys_sql_query.htm'); diff --git a/src/admin/templets/index.htm b/src/admin/templets/index.htm index 776d70a6..8e130638 100644 --- a/src/admin/templets/index.htm +++ b/src/admin/templets/index.htm @@ -25,17 +25,17 @@