返回列表 回复 发帖

基于ODBC的通用数据库管理程序

作者:zengh
整理:小歪歪
email: annysun@163.net
日期:00-7-5 下午 02:14:04
  1. #!/usr/bin/perl
  2. print "Content-type: text/html\n\n";
  3. #setver
  4. $http = "http://$ENV{';SERVER_NAME';}$server_port";
  5. $cgiurl = "$http/cgi-bin/test4.pl"; #cgi的URL exp :http://ssl
  6. ($disk,$root,$script) =split(/\\/,__FILE__);
  7. $filehead = "$disk\/$root\/$script"; #exp:d:/inetpub/cgi-bin
  8. $allow_html = 0; # 1=允许使用html语法 0=no
  9. $time_miss = +0; # Server时区调整
  10. #program
  11. &get_form;
  12. &set_var;
  13. use Win32::ODBC;
  14. #$DSN = "mdbtest" if (!$DSN);
  15. $DSN = "DSN eq test;UID eq test;PWD eq test;" if (!$DSN); #i use sqlserver
  16. $DSN1=$DSN;
  17. $DSN=~s / eq /=/g;
  18. $DSN1=~s / /%20/g;
  19. #创建一个DSN文件头
  20. my $db = Win32::ODBC->new($DSN);
  21. #测试是否存在此DSN
  22. if (! $db){
  23. print "Failed to Connect $DSN\n";
  24. Win32::ODBC::DumpError();
  25. #如果不存在则退出程序
  26. die;
  27. }#else{print "联结正确!";exit;}
  28. $DSN=$DSN1;
  29. if ($job eq "look") {
  30. &look;
  31. $db->Close();
  32. exit;
  33. }elsif ($job eq "type"){
  34. &type;
  35. $db->Close();
  36. exit;
  37. }elsif ($job eq "stat"){
  38. &stat;
  39. $db->Close();
  40. exit;
  41. }elsif ($job eq "help"){
  42. &help;
  43. $db->Close();
  44. exit;
  45. }elsif ($job eq "log"){
  46. &log;
  47. $db->Close();
  48. exit;
  49. }
  50. &main;
  51. $db->Close();
  52. exit;
  53. sub log{
  54. $sql="select usedate as 时间,host as 使用者,sqlcommand as SQL命令 from log order by usedate";
  55. &look;
  56. }
  57. sub help{
  58. print <<"EOF";
  59. <html><body>
  60. <pre>
  61. sql语句简介:
  62. select [ALL|DISTINCT|DISTINCTROW|[TOP n ]字段列表|* from 表名
  63. [where 条件]
  64. [order by 字段名 [DESC]]
  65. [group by 字段名]
  66. 其中:条件 数字型 字段名 操作符 值(lt < ,gt >,eq =, le <=,ge >=,ne <>)
  67. 字符型 字段名 like ';值'; 如加%号为模糊条件
  68. 日期型 TO_CHAR(字段名,';YYYYMMDD HH24:MI:SS';) > ';20000120 09:01:00';
  69. 谓词 ALL 返回所有数据,默认值
  70. DISTINCT 省略选择字段中包含重复数据的记录
  71. DISTINCTROW 省略基于整个重复记录的数据,而不只是基于重复字段的数据。
  72. TOP n 返回指定记录数
  73. 标头 用于代替字段名,语法: 字段名 as 标头
  74. CREATE TABLE 表名(字段名 字段类型(长度)[,字段名 字段类型(长度)...])
  75. drop table 表名 用途:删除表 注:删除后无法恢复
  76. TRUNCATE TABLE 表名 用途:清除表中的所有数据但不删除这个表
  77. ALTER TABLE 表名 ADD 字段名 字段类型 NULL
  78. 用途:给指定的表增加一个字段,注意:NULL参数是必须有的
  79. INSERT INTO 表名 (字段列表) VALUES (字段值列表) 用途:增加记录,分隔用,分隔
  80. DELETE * from 表名 WHERE 条件 用途:删除符合条件的记录 注意:如不提供条件,将删除所有记录
  81. update 表名 set 字段=字段值[,字段=字段值] where 条件
  82. 用途:更新符合条件的记录值,注意:如不提供条件将更新所有记录
  83. SELECT *|字段列表 INTO 新表名 FROM 旧表名 用途:拷贝整个表或指定字段的表
  84. 字段类型:
  85. 数据类型 存储大小 描述
  86. BINARY 每个字符占一个字节 任何类型的数据都可存储在这种类型的字段中。不需数据转换(例如,转换到文本数据)。数据输入二进制字段的方式决定了它的输出方式。
  87. BIT 1 个字节 Yes 和 No ,以及只包含这两个数值之一的字段。
  88. BYTE 1 个字节 介于 0 到 255 之间的整型数。
  89. COUNTER 4 个字节 每当有新记录添加至表中时,由 Microsoft Jet 数据库引擎自动增加数值。在 Microsoft Jet 数据库引擎中,此数值的数据类型为 Long。
  90. CURRENCY 8 个字节 介于 ?-?922,337,203,685,477.5808 到 922,337,203,685,477.5807 之间的符号整数。
  91. DATETIME
  92. (清参阅 DOUBLE ) 8 个字节 介于 100 到 9999 年的日期或时间数值。
  93. GUID 128 个位 用于远程过程调用的唯一识别数字。
  94. SINGLE 4 个字节 单精度浮点数,负数范围是从 -3.402823E38 到 -1.401298E-45,正数从1.401298E-45 到 3.402823E38,和 0。
  95. DOUBLE 8 个字节 双精度浮点数,负数范围是从 -1.79769313486232E308 到 -4.94065645841247E-324,正数从 4.94065645841247E-324 到 1.79769313486232E308,和 0。
  96. SHORT 2 个字节 介于 -32,768 到 32,767 的短整型数。
  97. LONG 4 个字节 介于 -2,147,483,648 到 2,147,483,647 的长整型数。
  98. LONGTEXT 每个字符占一个字节 从零到最大 1.2 千兆字节。
  99. LONGBINARY 视实际需要而定 从零到最大 1.2 千兆字节。用于 OLE 对象。
  100. TEXT 每个字符占一个字节 长度从 0 到 255 个字符。
  101. 标准函数:avg(),count(),sum(),max(),min() 括号内为字段名
  102. 技巧:
  103. vote BETWEEN 7 AND 10 等同于vote>6 and vote<11
  104. username IN (';Bill Gates';,';President Clinton';)只取其中之一
  105. CONVERT(CHAR(8),price) 将其它类型的数据转型为指定长度的字符型
  106. site_name LIKE ';[A-M]%'; 则只取首字符为A至M的记录
  107. site_name LIKE ';[ABC]%'; 则只取首字符为A或B或C的记录
  108. site_name LIKE ';[C-FY]%'; 则只取首字符为C至F或Y的记录
  109. site_name LIKE ';[^Y]%'; 要得到那些名字不以Y开头的记录
  110. site_name LIKE ';M_crosoft'; 通过使用下划线字符(_),你可以匹配任何单个字符
  111. 如果你想匹配百分号或下划线字符本身,你需要把它们括在方括号中。如果你想匹配连字
  112. 符(-),应把它指定为方括号中的第一个字符。如果你想匹配方括号,应把它们也括在方括号中。
  113. TTRIM()和LTRIM(),可以用来从字符串中剪掉空格。函数LTRIM()去除应该字符串前面的
  114. 所有空格;函数RTRIM()去除一个字符串尾部的所有空格。
  115. 日期型常数应形式为 &#35;12/25/2000 11:25:32&#35;
  116. <center><font color=red>(C)Copyright by zengh 1999-2000</font></center>
  117. </pre>
  118. </body></html>
  119. EOF
  120. }
  121. sub stat {
  122. @tables=sort &#36;db->TableList;
  123. print "<html><body><center><h4>数据表
  124. (共&#36;&#35;tables个)</h4></center><hr>";
  125. &#36;yes=0;
  126. foreach (@tables) {
  127. if (&#36;_ ne ';log';) {
  128. print "<a href=&#36;cgiurl?job=look&dsn=&#36;DSN&sql=select%20top%20100%20*%20%20from%20&#36;_ target=look>&#36;_</a>
  129. \n";
  130. }else{&#36;yes=1;}
  131. }
  132. if (&#36;yes=0) {&#35;如果不存在LOG这个表则建立
  133. &#36;sql="create table log (usedate datetime,host char(20),sqlcommand char(255))";
  134. if (&#36;db->Sql(&#36;sql)) {
  135. print "sql错误:&#36;sql\n
  136. ";
  137. &#36;db->DumpError();
  138. &#36;db->Close();
  139. exit;
  140. }
  141. }
  142. print "<hr>点击表名显示其记录<hr>";
  143. print "</body></html>";
  144. }
  145. sub look{
  146. @tables=sort &#36;db->TableList;
  147. if (!&#36;sql) {
  148. &#36;table=@tables[0];
  149. &#36;table=@tables[1] if (&#36;&#35;tables>=1 and @tables[0] eq "log");
  150. &#36;sql="select top 100 * from ".&#36;table;
  151. }
  152. &#36;sql=~s / eq /=/g;
  153. &#36;sql=~s / ne /<>/g;
  154. &#36;sql=~s / lt /</g;
  155. &#36;sql=~s / gt />/g;
  156. &#36;sql=~s / le /<=/g;
  157. &#36;sql=~s / ge />=/g;
  158. if (&#36;db->Sql(&#36;sql)) {
  159. print "sql错误:&#36;sql\n
  160. ";
  161. &#36;db->DumpError();
  162. &#36;db->Close();
  163. exit;
  164. }
  165. if (! (&#36;sql=~/select|into|/i)) {
  166. print "&#36;sql语句执行成功!!";
  167. &#36;db->Close();
  168. exit;
  169. }
  170. @fieldname=&#36;db->FieldNames();
  171. print "<html><body><center><h2>返回状态情况<h2></center><hr>";
  172. print "<table width=100% border=1><tr><td>no.</td>";
  173. foreach (@fieldname) {
  174. print "<td>&#36;_</td>";
  175. }
  176. print "</tr>";
  177. &#36;i=0;
  178. while (&#36;db->FetchRow()){
  179. &#36;i++;
  180. %fieldmemo=&#36;db->DataHash;
  181. print "<tr><td>&#36;i</td>";
  182. foreach (@fieldname) {
  183. print "<td>&#36;fieldmemo{&#36;_}</td> ";
  184. }
  185. print "</tr>";
  186. }
  187. print "</table>";
  188. print "<hr>表属性";
  189. print "<table border=1>";
  190. my(%type) = &#36;db->ColAttributes(&#36;db->SQL_COLUMN_TYPE);
  191. my(%len) = &#36;db->ColAttributes(&#36;db->SQL_COLUMN_LENGTH);
  192. my(%null) = &#36;db->ColAttributes(&#36;db->SQL_COLUMN_NULLABLE);
  193. foreach &#36;field (sort @fieldname) {
  194. if (&#36;type{&#36;field}==12) {&#36;fieldtype="文本";}
  195. elsif (&#36;type{&#36;field}==-1){&#36;fieldtype="备注/超级链接";}
  196. elsif (&#36;type{&#36;field}==4){&#36;fieldtype="数字/自动编号";}
  197. elsif (&#36;type{&#36;field}==11){&#36;fieldtype="日期/时间";}
  198. elsif (&#36;type{&#36;field}==2){&#36;fieldtype="货币";}
  199. elsif (&#36;type{&#36;field}==-7){&#36;fieldtype="是/否";}
  200. elsif (&#36;type{&#36;field}==-4){&#36;fieldtype="OLE对象";}
  201. elsif (&#36;type{&#36;field}==1){&#36;fieldtype="文本";}
  202. else{&#36;fieldtype=&#36;type{&#36;field};}
  203. print "<TR><TD>&#36;field</td><TD>&#36;fieldtype</td><TD>&#36;len{&#36;field}</td><TD></tr>";
  204. }
  205. print "</table>";
  206. print "</body></html>";
  207. if (&#36;sql ne "select usedate as 时间,host as 使用者,sqlcommand as SQL命令 from log order by usedate" and &#36;sql !=~"select top 100 * from") {
  208. &#36;sql1="insert into log (usedate,host,sqlcommand) values (';&#36;daten &#36;timen';,';&#36;userip';,';&#36;sql';)";
  209. if (&#36;db->Sql(&#36;sql1)) {
  210. print "sql错误:&#36;sql\n
  211. ";
  212. &#36;db->DumpError();
  213. &#36;db->Close();
  214. exit;
  215. }
  216. }
  217. }
  218. sub type{
  219. print <<"EOF";
  220. <html><body>
  221. <FORM METHOD=POST ACTION="&#36;cgiurl?job=look&dsn=&#36;DSN" target="look">
  222. SQL语句:<INPUT TYPE="text" NAME="sql" size=60>
  223. <INPUT TYPE="submit" value="确定"><INPUT TYPE="reset" value="重写">
  224. </FORM>
  225. <a href=&#36;cgiurl?job=stat&dsn=&#36;DSN target="stat">刷性状态</a>-----
  226. <a href=&#36;cgiurl?job=help target="look">帮助</a>-----
  227. <a href=&#36;cgiurl?job=log&dsn=&#36;DSN target="look">日志</a>
  228. </body></html>
  229. EOF
  230. }
  231. sub main {
  232. print <<"EOF";
  233. <html>
  234. <head>
  235. <title>odbc test</title>
  236. <meta name="GENERATOR" content="Microsoft FrontPage 3.0">
  237. </head>
  238. <frameset cols="643,*">
  239. <frameset rows="*,25%">
  240. <frame name="look" src="&#36;cgiurl?job=look&dsn=&#36;DSN">
  241. <frame name="type" target="look" src="&#36;cgiurl?job=type&dsn=&#36;DSN">
  242. </frameset>
  243. <frame name="stat" src="&#36;cgiurl?job=stat&dsn=&#36;DSN">
  244. <noframes>
  245. <body>
  246. <p>This page uses frames, but your browser doesn';t support them.</p>
  247. </body>
  248. </noframes>
  249. </frameset>
  250. </html>
  251. EOF
  252. }
  253. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  254. &#35;subs program
  255. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  256. sub set_var {
  257. &#36;job =&get_var(';job'; ,';\n|‖';);
  258. &#36;sql =&get_var(';sql'; ,';\n';);
  259. &#36;DSN =&get_var(';dsn'; ,';\n';);
  260. &#36;userip=&#36;ENV{';REMOTE_ADDR';};
  261. (&#36;secn,&#36;minn,&#36;hourn,&#36;dayn,&#36;monn,&#36;yearn,&#36;weekn,&#36;yeardayn,&#36;isdst) = localtime(time+(3600*&#36;time_miss));
  262. &#36;monn=&#36;monn+1;
  263. if (&#36;monn<10) {&#36;monn="0&#36;monn";}
  264. if (&#36;dayn<10) {&#36;dayn="0&#36;dayn";}
  265. if (&#36;hourn<10) {&#36;hourn="0&#36;hourn";}
  266. if (&#36;minn<10) {&#36;minn="0&#36;minn";}
  267. if (&#36;secn<10) {&#36;secn="0&#36;secn";}
  268. &#36;yearn+=1900;
  269. &#36;daten="&#36;monn/&#36;dayn/&#36;yearn";
  270. &#36;timen="&#36;hourn\:&#36;minn\:&#36;secn";
  271. }
  272. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  273. sub get_form {
  274. @querys = split(/&/, &#36;ENV{';QUERY_STRING';});
  275. foreach (@querys) {
  276. (&#36;name,&#36;value) = split(/=/, &#36;_);
  277. &#36;value = &decode(&#36;value);
  278. &#36;value = &filterhtml(&#36;value);
  279. &setvaluetoform(&#36;name, &#36;value);
  280. }
  281. read(STDIN, &#36;buffer, &#36;ENV{';CONTENT_LENGTH';});
  282. @pairs = split(/&/, &#36;buffer);
  283. foreach (@pairs) {
  284. (&#36;name, &#36;value) = split(/=/, &#36;_);
  285. &#36;value = &decode(&#36;value);
  286. &#36;value = &filterhtml(&#36;value);
  287. &setvaluetoform(&#36;name, &#36;value);
  288. }
  289. @cookies = split(/; /, &#36;ENV{HTTP_COOKIE});
  290. foreach &#36;cookies (@cookies) {
  291. (&#36;name, &#36;value) = split(/=/, &#36;cookies);
  292. &#36;value = &decode(&#36;value);
  293. &#36;value = &filterhtml(&#36;value);
  294. &setvaluetoform(&#36;name, &#36;value);
  295. }
  296. }
  297. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  298. sub decode {
  299. local(&#36;return)=&#36;_[0];
  300. &#36;return =~ tr/+/ /;
  301. &#36;return =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex(&#36;1))/eg;
  302. return &#36;return;
  303. }
  304. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  305. sub filterhtml {
  306. local(&#36;return)=&#36;_[0];
  307. &#36;return =~ s/<!--(.|\n)*-->//g;
  308. if (&#36;allow_html != 1) {
  309. &#36;return =~s/<([>]|\n)*>//g;
  310. }
  311. return &#36;return;
  312. }
  313. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  314. sub setvaluetoform {
  315. if (&#36;FORM{&#36;_[0]}) {
  316. print "\&#36;_[0]=&#36;_[0]\n
  317. ";
  318. print "\&#36;_[1]=&#36;_[1]\n
  319. ";
  320. &#36;FORM{&#36;_[0]}="&#36;FORM{&#36;_[0]}§&#36;_[1]";
  321. print "\&#36;FORM{\&#36;_[0]}=&#36;FORM{&#36;_[0]}\n
  322. ";
  323. }
  324. else {
  325. &#36;FORM{&#36;_[0]}=&#36;_[1];
  326. }
  327. }
  328. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  329. sub get_var {
  330. local(&#36;return)="";
  331. &#36;return="&#36;FORM{&#36;_[0]}" if (&#36;FORM{&#36;_[0]});
  332. &#36;return=~ s/&#36;_[1]//g;
  333. return &#36;return;
  334. }
  335. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  336. sub readtxtfile {
  337. open(READTXTFILE,"&#36;_[0]");
  338. @readtxtfile=<READTXTFILE>;
  339. close(READTXTFILE);
  340. return @readtxtfile;
  341. }
  342. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  343. sub checkempty {
  344. local(&#36;chkval)=&#36;_[0];
  345. &#36;chkval =~ s/ |
  346. |\n//g;
  347. &error(&#36;_[1]) if (&#36;chkval eq "");
  348. }
  349. &#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;&#35;
  350. sub outhtml {
  351. print "<html><head>\n";
  352. print "</head><body >\n";
  353. print "&#36;_[0]\n";
  354. print "</body></html>\n";
  355. exit 0;
  356. }
复制代码

                     我是一个呼吸着现在的空气而生活在过去的人
               这样的注定孤独,孤独的身处闹市却犹如置身于荒漠
                                     我已习惯了孤独,爱上孤独
                                 他让我看清了自我,还原了自我
                             让我再静静的沉思中得到快乐和满足
                                   再孤独的世界里我一遍又一遍
                                   不厌其烦的改写着自己的过去
                                             延伸到现在与未来
                                       然而那只是泡沫般的美梦
                                 产生的时刻又伴随着破灭的到来
                         在灰飞烟灭的瞬间我看到的是过程的美丽
                                      而不是结果的悲哀。。。
返回列表