|
|
7#

楼主 |
发表于 2001-9-30 12:04:35
|
只看该作者
CGI简明教程
第六章
投票程序
一.你喜欢谁?
张德陪
阿加西
桑普拉斯
贝克
顾懿
查询选举投票结果 CGI程序:--vote.pl #!perl print"Content-type:text/html\n\n"; print"投票系统"; if($ENV{'REQUEST_METHOD'}eq"POST"){ read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }elsif($ENV{'REQUEST_METHOD'}eq"GET"){ $buffer=$ENV{'QUERY_STIRNG'}; } @pairs=split(/&/,$buffer); foreach $pair(@pairs){ ($name,$value)=split(/=/,$pair); $value=~tr/+//; $value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg; $FORM{$name}=$value;} $filename="/vote.dat"; %NAME=("A","张德陪","B","阿加西","C","桑普拉斯","D","贝克","E","顾懿"); if($ENV{'REQUEST_METHOD'}eq"POST"){ print"Content-type:text/html\n\n"; print"投票系统"; print"
投票系统的例子
"; open(FILE,"<$filename")||die"不能打开文件,请和管理员联系\n"; for($i=0;$i<2;$i++){ $file[$i]=; $file[$i]=~s/\n$//; } close(FILE); @item=split(/:/,$file[0]); @vote=split(/:/,$file[1]); for($i=0;$i<@item;$i++){ if($FORM{'idol'}eq$item[$i]){ $vote[$i]++; last; } } open(FILE,">filename")||die"Can't Open the file"; $item=join(":",@item); $vote=join(":",@vote); pirnt FILE "$item\n"; print FILE "$vote\n"; close (FILE); print"
您是投票给$NAME{$FORM{'idol'],谢谢您的选票!
"; print"查询投票结果系统"; } if($FORM{'command'}eq"view"){ print "HTTP/1.0 200\n"; print "Content-type:text/html\n\n"; print""; print"
投票结果
"; open (FILE,"$filename")||die"文件打开错误"; for($i=0;$i<2;$i++){ $file[$i]=; $file[$i]=~s/\n$//; } close(FILE); @item=split(/:/,$file[0]); @vote=split(/:/,$file[1]); print""; for($i=0;$i<@item;$i++){ print" 姓名 $NAME{$item[$i]} 票数 ,td>$vote[$i]
"; } print "
"; } 这个程序是要各位学习Perl的分解字符串的功能。在Perl中,字符串操作是非常简单的。我对几句重要语句做一个分析: if($ENV{'REQUEST_METHOD'}eq"POST"){ read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); }elsif($ENV{'REQUEST_METHOD'}eq"GET"){ $buffer=$ENV{'QUERY_STIRNG'}; } 这是一个非常常见的功能块,几乎所有的CGI程序都会用到它。它判断页面使用何种方式提交变量。如果是post,就从STDIN里把变量读出,存到变量buffer里。注意在perl里,变量是用$开头的。而$ENV{'CONTENT_LENGTH'}则是读出该变量的长度,请注意CONTENT_LENGTH 是一个环境变量。第二个if则处理get情况,在get情况下,页面提交的信息是存放在环境变量QUERY_STIRNG中的。所以$buffer也就是页面提交的信息。环境变量REQUEST_METHOD表示方式,它的值是一个字符串,前面加上$ENV则表示读出该变量的值。 @pairs=split(/&/,$buffer); foreach $pair(@pairs){ ($name,$value)=split(/=/,$pair); $value=~tr/+//; $value=~s/%([a-f A-F 0-9][a-f A-f 0-9])/pack("C",hex($1))/eg; $FORM{$name}=$value;} 以上功能?
槭且桓龇纸夤獭R趁嫘畔⒌奶峤煌且浴懊?值”的形式,比如本例子中就是以“idol=顾懿”这样的形式提交的,所以我们要去掉字符串中的"="等等信息,但同时要保留“idol”和"顾懿"之间的对应关系。$FORM{$name}=$value做到这一点,这是一个关联数组。具体其中的语法,请各位自行查书。接下来的就是文件的操作,但那已经不是本课的重点。所以就不多说了。
我想各位敏感的朋友又要问我关于安全性能的问题了。实际上CGI是比较安全的,至少比那些没有数字签名的ActiveX控件要安全的多。除非你有意在程序里加入了破坏Server的命令,否则一般不会有什么严重的后果。而个人网站不向大众开放CGI目录,则因为怕各位学习不精,无端增加服务器的负担,所以一般不提供。
小结: 本章讲述了CGI基本概念,也说明了各种编程语言的优缺点,同时解释了为什么个人网站不提供CGI的原因。接下来我们开始正式学习。 |
|