網友zengh寫的基於ODBC的通用數據庫管理程序 - 中國WEB開發者網絡 (http://www.webasp.net) -- 技術教程 (http://www.webasp.net/article/) --- 網友zengh寫的基於ODBC的通用數據庫管理程序 (http://www.webasp.net/article/8/7767.htm) |
| -- 作者:未知 -- 發佈日期: 2003-09-13 |
| #!/usr/bin/perl print "Content-type: text/html\n\n"; #setver $http = "http://$ENV{'SERVER_NAME'}$server_port"; $cgiurl = "$http/cgi-bin/test4.pl"; #cgi的URL exp :http://ssl ($disk,$root,$script) =split(/\\/,__FILE__); $filehead = "$disk\/$root\/$script"; #exp:d:/inetpub/cgi-bin $allow_html = 0; # 1=允許使用html語法 0=no $time_miss = +0; # Server時區調整 #program &get_form; &set_var; use Win32::ODBC; #$DSN = "mdbtest" if (!$DSN); $DSN = "DSN eq test;UID eq test;PWD eq test;" if (!$DSN); #i use sqlserver $DSN1=$DSN; $DSN=~s / eq /=/g; $DSN1=~s / /%20/g; #創建一個DSN文件頭 my $db = Win32::ODBC->new($DSN); #測試是否存在此DSN if (! $db){ print "Failed to Connect $DSN\n"; Win32::ODBC::DumpError(); #如果不存在則退出程序 die; }#else{print "聯結正確!";exit;} $DSN=$DSN1; if ($job eq "look") { &look; $db->Close(); exit; }elsif ($job eq "type"){ &type; $db->Close(); exit; }elsif ($job eq "stat"){ &stat; $db->Close(); exit; }elsif ($job eq "help"){ &help; $db->Close(); exit; }elsif ($job eq "log"){ &log; $db->Close(); exit; } &main; $db->Close(); exit; sub log{ $sql="select usedate as 時間,host as 使用者,sqlcommand as SQL命令 from log order by usedate"; &look; } sub help{ print <<"EOF"; <html><body> <pre> sql語句簡介: select [ALL|DISTINCT|DISTINCTROW|][TOP n ]字段列表|* from 表名 [where 條件] [order by 字段名 ][DESC]] [group by 字段名] 其中:條件 數字型 字段名 操作符 值(lt < ,gt >,eq =, le <=,ge >=,ne <>) 字符型 字段名 like '值' 如加%號為模糊條件 日期型 TO_CHAR(字段名,'YYYYMMDD HH24:MI:SS') > '20000120 09:01:00' 謂詞 ALL 返回所有數據,默認值 DISTINCT 省略選擇字段中包含重複數據的記錄 DISTINCTROW 省略基於整個重複記錄的數據,而不只是基於重複字段的數據。 TOP n 返回指定記錄數 標頭 用於代替字段名,語法: 字段名 as 標頭 CREATE TABLE 表名(字段名 字段類型(長度)[,字段名 字段類型(長度)...]) drop table 表名 用途:刪除表 注:刪除後無法恢復 TRUNCATE TABLE 表名 用途:清除表中的所有數據但不刪除這個表 ALTER TABLE 表名 ADD 字段名 字段類型 NULL 用途:給指定的表增加一個字段,注意:NULL參數是必須有的 INSERT INTO 表名 (字段列表) VALUES (字段值列表) 用途:增加記錄,分隔用,分隔 DELETE * from 表名 WHERE 條件 用途:刪除符合條件的記錄 注意:如不提供條件,將刪除所有記錄 update 表名 set 字段=字段值[,字段=字段值] where 條件 用途:更新符合條件的記錄值,注意:如不提供條件將更新所有記錄 SELECT *|字段列表 INTO 新表名 FROM 舊表名 用途:拷貝整個表或指定字段的表 字段類型: 數據類型 存儲大小 描述 BINARY 每個字符佔一個字節 任何類型的數據都可存儲在這種類型的字段中。不需數據轉換(例如,轉換到文本數據)。數據輸入二進制字段的方式決定了它的輸出方式。 BIT 1 個字節 Yes 和 No ,以及只包含這兩個數值之一的字段。 BYTE 1 個字節 介於 0 到 255 之間的整型數。 COUNTER 4 個字節 每當有新記錄添加至表中時,由 Microsoft Jet 數據庫引擎自動增加數值。在 Microsoft Jet 數據庫引擎中,此數值的數據類型為 Long。 CURRENCY 8 個字節 介於 ?-?922,337,203,685,477.5808 到 922,337,203,685,477.5807 之間的符號整數。 DATETIME (清參閱 DOUBLE ) 8 個字節 介於 100 到 9999 年的日期或時間數值。 GUID 128 個位 用於遠程過程調用的唯一識別數字。 SINGLE 4 個字節 單精度浮點數,負數範圍是從 -3.402823E38 到 -1.401298E-45,正數從1.401298E-45 到 3.402823E38,和 0。 DOUBLE 8 個字節 雙精度浮點數,負數範圍是從 -1.79769313486232E308 到 -4.94065645841247E-324,正數從 4.94065645841247E-324 到 1.79769313486232E308,和 0。 SHORT 2 個字節 介於 -32,768 到 32,767 的短整型數。 LONG 4 個字節 介於 -2,147,483,648 到 2,147,483,647 的長整型數。 LONGTEXT 每個字符佔一個字節 從零到最大 1.2 千兆字節。 LONGBINARY 視實際需要而定 從零到最大 1.2 千兆字節。用於 OLE 對象。 TEXT 每個字符佔一個字節 長度從 0 到 255 個字符。 標準函數:avg(),count(),sum(),max(),min() 括號內為字段名 技巧: vote BETWEEN 7 AND 10 等同於vote>6 and vote<11 username IN ('Bill Gates','President Clinton')只取其中之一 CONVERT(CHAR(8),price) 將其它類型的數據轉型為指定長度的字符型 site_name LIKE '[A-M]%' 則只取首字符為A至M的記錄 site_name LIKE '[ABC]%' 則只取首字符為A或B或C的記錄 site_name LIKE '[C-FY]%' 則只取首字符為C至F或Y的記錄 site_name LIKE '[^Y]%' 要得到那些名字不以Y開頭的記錄 site_name LIKE 'M_crosoft' 通過使用下劃線字符(_),你可以匹配任何單個字符 如果你想匹配百分號或下劃線字符本身,你需要把它們括在方括號中。如果你想匹配連字 符(-),應把它指定為方括號中的第一個字符。如果你想匹配方括號,應把它們也括在方括號中。 TTRIM()和LTRIM(),可以用來從字符串中剪掉空格。函數LTRIM()去除應該字符串前面的 所有空格;函數RTRIM()去除一個字符串尾部的所有空格。 日期型常數應形式為 #12/25/2000 11:25:32# <center><font color=red>(C)Copyright by zengh 1999-2000</font></center> </pre> </body></html> EOF } sub stat { @tables=sort $db->TableList; print "<html><body><center><h4>數據表 (共$#tables個)</h4></center><hr>"; $yes=0; foreach (@tables) { if ($_ ne 'log') { print "<a href=$cgiurl?job=look&dsn=$DSN&sql=select%20top%20100%20*%20%20from%20$_ target=look>$_</a> \n"; }else{$yes=1;} } if ($yes=0) {#如果不存在LOG這個表則建立 $sql="create table log (usedate datetime,host char(20),sqlcommand char(255))"; if ($db->Sql($sql)) { print "sql錯誤:$sql\n "; $db->DumpError(); $db->Close(); exit; } } print "<hr>點擊表名顯示其記錄<hr>"; print "</body></html>"; } sub look{ @tables=sort $db->TableList; if (!$sql) { $table=@tables[0]; $table=@tables[1] if ($#tables>=1 and @tables[0] eq "log"); $sql="select top 100 * from ".$table; } $sql=~s / eq /=/g; $sql=~s / ne /<>/g; $sql=~s / lt /</g; $sql=~s / gt />/g; $sql=~s / le /<=/g; $sql=~s / ge />=/g; if ($db->Sql($sql)) { print "sql錯誤:$sql\n "; $db->DumpError(); $db->Close(); exit; } if (! ($sql=~/select|into|/i)) { print "$sql語句執行成功!!"; $db->Close(); exit; } @fieldname=$db->FieldNames(); print "<html><body><center><h2>返回狀態情況<h2></center><hr>"; print "<table width=100% border=1><tr><td>no.</td>"; foreach (@fieldname) { print "<td>$_</td>"; } print "</tr>"; $i=0; while ($db->FetchRow()){ $i++; %fieldmemo=$db->DataHash; print "<tr><td>$i</td>"; foreach (@fieldname) { print "<td>$fieldmemo{$_}</td> "; } print "</tr>"; } print "</table>"; print "<hr>表屬性"; print "<table border=1>"; my(%type) = $db->ColAttributes($db->SQL_COLUMN_TYPE); my(%len) = $db->ColAttributes($db->SQL_COLUMN_LENGTH); my(%null) = $db->ColAttributes($db->SQL_COLUMN_NULLABLE); foreach $field (sort @fieldname) { if ($type{$field}==12) {$fieldtype="文本";} elsif ($type{$field}==-1){$fieldtype="備註/超級鏈接";} elsif ($type{$field}==4){$fieldtype="數字/自動編號";} elsif ($type{$field}==11){$fieldtype="日期/時間";} elsif ($type{$field}==2){$fieldtype="貨幣";} elsif ($type{$field}==-7){$fieldtype="是/否";} elsif ($type{$field}==-4){$fieldtype="OLE對像";} elsif ($type{$field}==1){$fieldtype="文本";} else{$fieldtype=$type{$field};} print "<TR><TD>$field</td><TD>$fieldtype</td><TD>$len{$field}</td><TD></tr>"; } print "</table>"; print "</body></html>"; if ($sql ne "select usedate as 時間,host as 使用者,sqlcommand as SQL命令 from log order by usedate" and $sql !=~"select top 100 * from") { $sql1="insert into log (usedate,host,sqlcommand) values ('$daten $timen','$userip','$sql')"; if ($db->Sql($sql1)) { print "sql錯誤:$sql\n "; $db->DumpError(); $db->Close(); exit; } } } sub type{ print <<"EOF"; <html><body> <FORM METHOD=POST ACTION="$cgiurl?job=look&dsn=$DSN" target="look"> SQL語句:<INPUT TYPE="text" NAME="sql" size=60> <INPUT TYPE="submit" value="確定"><INPUT TYPE="reset" value="重寫"> </FORM> <a href=$cgiurl?job=stat&dsn=$DSN target="stat">刷性狀態</a>----- <a href=$cgiurl?job=help target="look">幫助</a>----- <a href=$cgiurl?job=log&dsn=$DSN target="look">日誌</a> </body></html> EOF } sub main { print <<"EOF"; <html> <head> <title>odbc test</title> <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> </head> <frameset cols="643,*"> <frameset rows="*,25%"> <frame name="look" src="$cgiurl?job=look&dsn=$DSN"> <frame name="type" target="look" src="$cgiurl?job=type&dsn=$DSN"> </frameset> <frame name="stat" src="$cgiurl?job=stat&dsn=$DSN"> <noframes> <body> <p>This page uses frames, but your browser doesn't support them.</p> </body> </noframes> </frameset> </html> EOF } ########## #subs program ########## sub set_var { $job =&get_var('job' ,'\n|∥'); $sql =&get_var('sql' ,'\n'); $DSN =&get_var('dsn' ,'\n'); $userip=$ENV{'REMOTE_ADDR'}; ($secn,$minn,$hourn,$dayn,$monn,$yearn,$weekn,$yeardayn,$isdst) = localtime(time+(3600*$time_miss)); $monn=$monn+1; if ($monn<10) {$monn="0$monn";} if ($dayn<10) {$dayn="0$dayn";} if ($hourn<10) {$hourn="0$hourn";} if ($minn<10) {$minn="0$minn";} if ($secn<10) {$secn="0$secn";} $yearn+=1900; $daten="$monn/$dayn/$yearn"; $timen="$hourn\:$minn\:$secn"; } ############ sub get_form { @querys = split(/&/, $ENV{'QUERY_STRING'}); foreach (@querys) { ($name,$value) = split(/=/, $_); $value = &decode($value); $value = &filterhtml($value); &setvaluetoform($name, $value); } read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'}); @pairs = split(/&/, $buffer); foreach (@pairs) { ($name, $value) = split(/=/, $_); $value = &decode($value); $value = &filterhtml($value); &setvaluetoform($name, $value); } @cookies = split(/; /, $ENV{HTTP_COOKIE}); foreach $cookies (@cookies) { ($name, $value) = split(/=/, $cookies); $value = &decode($value); $value = &filterhtml($value); &setvaluetoform($name, $value); } } ############ sub decode { local($return)=$_[0]; $return =~ tr/+/ /; $return =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; return $return; } ########## sub filterhtml { local($return)=$_[0]; $return =~ s/<!--(.|\n)*-->//g; if ($allow_html != 1) { $return =~s/<([>]|\n)*>//g; } return $return; } ########## sub setvaluetoform { if ($FORM{$_[0]}) { print "\$_[0]=$_[0]\n "; print "\$_[1]=$_[1]\n "; $FORM{$_[0]}="$FORM{$_[0]}§$_[1]"; print "\$FORM{\$_[0]}=$FORM{$_[0]}\n "; } else { $FORM{$_[0]}=$_[1]; } } ######### sub get_var { local($return)=""; $return="$FORM{$_[0]}" if ($FORM{$_[0]}); $return=~ s/$_[1]//g; return $return; } ######### sub readtxtfile { open(READTXTFILE,"$_[0]"); @readtxtfile=<READTXTFILE>; close(READTXTFILE); return @readtxtfile; } ############# sub checkempty { local($chkval)=$_[0]; $chkval =~ s/ | |\n//g; &error($_[1]) if ($chkval eq ""); } ########## sub outhtml { print "<html><head>\n"; print "</head><body >\n"; print "$_[0]\n"; print "</body></html>\n"; exit 0; } |
| webasp.net |