您的位置:首页东哥开发网电脑技术
内容搜索:
阅读内容
背景:#EDF0F5 #FAFBE6 #FFF2E2 #FDE6E0 #F3FFE1 #DAFAF3 #EAEAEF 默认  

CGI程序浅解

[日期:2008-06-26 ] [来源:思维电子技术工作室 作者:未知] [字体: (投递新闻)

下面是一段非常简单但又很实用的日历CGI程序,此程序在很多网站上都在使用。通过该程序我们可对CGI程序有一个进一步的认识,对CGI程序的入门者很有帮助。程序如下:
#!/usr/bin/perl #这是CGI解释程序的位置
($sec,$min,$hour,$day,$mon,$year,$wan)=localtime(time);#读系统时间并将秒赋值给变量$sec;将分赋值给变量$min
#将时赋值给变量$hour;将日赋值给变量$day;将月赋值给变量$mon;将年赋值给变量$year;将星期赋值给变量$wan
$year=$year+1900;#为解决千年问题所设。
$mon=$mon+1;#因为代表月数[0,11],要将$mon加一之后才能符合实际情况。
@Wanday=("星期日","星期一","星期二","星期三","星期四","星期五","星期六");#将星期日等7个字符串赋给数组@Wanday
$date=sprintf("%04d年%02d月",$year,$mon);#将4位数的年和2位数的月的显示格式的字串赋给变量$date
$Fontcolor="#FFCC99";#将颜色代码赋给变量$Fontcolor
if (($wan == 6)||($wan==0)) {$Fontcolor="#FF6633";}#盼断语句,当星期6或星期日(此时$wan=0)时,日期的显示颜色设置
print "Content-type:text/html","\n\n";#设置输出格式为html格式
print<<EOF;#输出(输出到浏览器)数据程序段。
<table width="67" border="1" cellspacing="0" cellpadding="0"><tr>
<td bgcolor="#00FF00" style="font-size: 9pt" width="65" height="70"><div align="center">$date<br>
<font color="$Fontcolor" size="5"><b>$day</b></font><br>$Wanday[$wan]</div></td></tr></table>
EOF


按这里试运行此程序,看看效果。思维稿

CGI调试中的绝对路径和相对路径
   现在网上有很多编写得非常出色的CGI程序,你如果下载了一个适合自己用的CGI程序并准备安装到自己的网站时,常常要对一些CGI调用程序的路径进行设置。这些CGI程序在编写时因人而异,有些要设置绝对路径,有些设置成相对路径,有些则用地址方式设置,对于地址,相信大家已经很熟识了我这里就不多说了。这些路径实际上都是相对于服务器硬盘而言的。
   绝对路径是指你的程序放置在服务器端硬盘的路径,如你的一个aaa.cgi程序放置在你的电脑的位置是c:\gzdzw\cgi-bin\chat\,那么这个位置也就是你将aaa.cgi文件放置在你的电脑中的绝对路径,服务器端的绝对路径的概念与此相同。服务器端的绝对路径通常可用一个称为探针的CGI程序(下载探针程序按这里)探测出来。
    相对路径则是相对于CGI程序而言的。比如你的CGI程序aaa.cgi放置在服务器的绝对路径/use/homnee/gzdzw/cgi-bin/下,而在这个绝对路径下还有txt,htm,dbf 三个子目录,那么这三个子目录就是aaa.cgi程序的相对路径,分别表示为"/txt; /thm; /dbf,总的来说相对路径是你要运行的CGI程序所在目录下的子目录。思维稿

cgi文件属性的设置
    CGI文件上传到服务器端后要使其能正常运行,还要对其属性(运行权限)进行设置。一般情况下(UNIX系统),将CGI文件的属性设置成“755”,那么“755”是什么含义呢?一般地在服务器端的权限有以下内容:读权限;写权限和执行权限。权限的设置对象有:系统;管理员和客户。属性为“755”的权限是:
1。系统:读写和执行均有效。
2。管理员:读和执行有效。
3。客户:读和执行有效。
对于数据库文件(即需要对其进行读写操作的文件)如*.pag;*.txt;*.dat等文件的属性均要设置成“666”,其权限是:
1。系统:读和写有效。
2。管理员:读和写有效。
3。客户:读和写有效。
    在cgi-bin(这是大多数网站放置CGI程序的专门目录)下的所有目录属性一般都要设置成“755”,但在有些服务器上对放置数据文件的目录的属性要设置为“777”,其权限内容是:
1。系统:读写和执行均有效。
2。管理员:读写和执行均有效。
3。客户:读写和执行均有效。
    现在很多的FTP软件均有对文件属性设置的功能,所以当我们用这些FTP软件上传完成后,就可对文件的属性进行设置了。这里我们以用得最多的FTP软件--CUTEFTP4.2为例加以说明。用鼠标选中你要修改属性的文件或目录,再按鼠标右键,此时回弹出一菜单,点击“CHMOD”这一栏,然后在数据输入框内输入属性代码(如输入:755)即可。(如右图所示)
思维稿

CGI编程心地之一
    本人是一个CGI程序爱好者,涉足CGI编程不到一年,本人编写的CGI程序有:会员管理与密码保护程序;站内页面访问分析统计程序;彩电维修案例搜索程序;晶体管参数查询程序;热点话题讨论程序,这几个程序现全部都在本站上应用,在这里我将本人学习CGI程序编程中的心得写出来,一来当做我的学习笔记,二来供网友们参考,或许对想学习CGI编程的朋友来说有所帮助。
    我们知道在互联网上要实现数据处理的程序有CGI,ASP,PHP等,而CGI程序是目前应用最广的程序,它的处理过程是这样的:用户在浏览器端以表单的形式输入数据(如输入要查找的关键字或程序要运算所需的各种参数),递交到服务器端的CGI程序,经CGI程序的解释运算再将结果返回到用户的浏览器上。这个过程我们称之为交互。通过这种交互性,使得网页不仅仅只是显示信息还可以处理信息,这样一来使网页的功能大增。要实现网页的互动性第一步就是要输入CGI程序运行所需要的各种参数(数据),在网页上完成这一功能的页面我们称为表单。在网页上我们称数据输入区为表单域。在HTML代码中,表单是以“form"开头,以"</form>"结束,在这两个代码之间(即表单内容)的每一个数据(又叫变量)都有一个名字(name)和取值(value)与属性(type)。下面是一段表单范例:
<form METHOD="POST" ACTION="http://gzdzw.51.net/cgi-bin/asd.cgi>
<input type="hidden" name="abcd" value="1234"> #隐含式语句
您的姓名:<input NAME="username" size="23"> #单行输入框
您的Email:<input Name="usermail"size="24"> #单行输入框
<input TYPE="radio" NAME="I_think_that" VALUE="很好"> #单选框
<input TYPE="radio" NAME="I_think_that" VALUE="还可以啦"> #单选框
<input TYPE="radio" NAME="I_think_that" VALUE="一般"> #单选框
<input type="checkbox" name="C1" value="ON1"> #复选框
<input type="checkbox" name="C2" value="ON2"> #复选框
<input type="checkbox" name="C3" value="ON3"> #复选框
<textarea NAME="comment" ROWS="6" COLS="60"></textarea> #多行输入框
<input TYPE="submit" VALUE="OK"> #提交按钮
<input TYPE="reset" VALUE="resert"> #清除按钮
</form>
     表单头语句是:<form METHOD="POST" ACTION="http://gzdzw.51.net/cgi-bin/asd.cgi>其中参数method是数据请求传送,有两个选项:POST和GET,一般为POST。
    参数ACTIOM是数据传送的对象,这里是将数据传送给在地址为:http://gzdzw.51.net/cgi-bin/下的asd.cgi程序处理。
语句中的TYPE是数据的属性(类型)
1。hidden(隐含式):这是传送固定数据的一种常用方式,只要按动“提交”按钮,此项数据将被传送出去。
2。checkbox(复选框):这是传送多个可选数据的方式,每个框代表一个可选数据,被选中的数据项框内有一个“√”符号表示。
3。radio(单选框):这是传送单个数据多项选择的方式,被选中的框内有一个“.”符号表示。
4。单行输入方式:此种方式下由客户输入数据,数据属性有三种:一种是TEXT格式(文本格式);一种是NUMBER(数字格式);一种是PASSWDRD(密码格式),此时不论输入任何字符都以“*”显示。
5。多行输入方式:此种方式也是由客户输入数据,此项语句是以textarea开头,以</textarea>结束。
6。下拉菜单输入方式:此种方式由编程者设定好多个数据供客户选择,这有点象复选框方式。此项语句是以select开头,以</select>结束,格式如下:

<select size="1" name="D1">
<option value="C56-402" selected>金星C56-402</option>
<option value="C54">金星C54**</option>
<option value="C6418">金星C6418</option>
<option value="C7458">金星C7458</option>
<option value="PCP63">飞利浦PCP63</option>
<option value="26C852">飞利浦26C852</option></select>

    最后是“提交”按钮,“提交”按钮的属性是:submit,按动此按钮将表单域内的所有数据传出。清除按钮的属性是:reset,按动此按钮,将清除表单域内所有的数据。
   另外,我们还可以用命令行方式给CGI程序递交参数,格式如下:
如<a hret=http://gzdzw.net/cgi-bin/bbs.cgi?id=思维&ddd=123>维修论坛</a>(GET方式递交)
   上面命令行的“?”号之后就是CGI程序运行的参数,等式的左边是变量名称(相当于表单的name),等式的右边是变量的值(相当于表单的VALUE),参数之间用&来分开。

还有一种是
JavaScript脚本方式的语句:
<script language="JavaScript"
src="
http://gzdzw.51.net/cgi-bin/ymcount.cgi?ID=tvwx&amp=2345"></script>。(程序范例)思维稿

在线人数统计CGI程序剖释
    在线人数统计CGI程序是很多网站都在使用的程序,此程序并不复杂,在这里我以逐行解释的方式来解剖此程序,希望对初学CGI编程的朋友有所帮助。
#!/usr/bin/perl #perl解释器路径
$path= "."; #默认当前主机的绝对路径
$overtime= 3000;#刷新时间, 单位秒,也就是说默认用户将在您的网站上停留多长时间
$buffer = $ENV{'QUERY_STRING'};#将由浏览器端递交来的参数(表单和包含URL中问号后面的参数)赋给变量$buffer。
@pairs = split(/&/, $buffer);
#由于递交来的参数都是用&来分隔的,所以将$buffer以&标志分割后赋给数组@pairs。
foreach $pair (@pairs) {
#进入循环
($name, $value) = split(/=/, $pair);
#由于在递交的参数时都是用name=value格式,所以这里以“=”标志来分割出参数名和参数的值分别赋给变量$name和$value。
############下面一段是对$value进行必要的处理和解码处理#########
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/<!--(.|\n)*-->//g;
$value =~ s/\t/--/g;
$value =~ s/>/&gt;/g;
$value =~ s/</&lt;/g;
$FORM{$name} = $value;
#用变量$FORM{$name}来对应$value的值。
}
#结束循环。
##############################################################
$people=1;#将变量变$people(在线人数值)赋值1
($sec,$min,$hour,$mday,$mon,$year,$wan) = localtime(time);#读系统时间并将秒赋值给变量$sec;将分赋值给变量$min;将时赋值给变量$hour;将日赋值给变量$mday;将月赋值给变量$mon;将年赋值给变量$year;将星期赋值给变量$wan
$mon++;#因为代表月数[0,11],要将$mon加一之后才能符合实际情况。
open (FILE,"$path/ip.txt");#以只读方式打开ip记录数据文件,此文件是记录访客ip地址和访问时间的数据文件,其记录格式是:202.163.444.231,21,46,30数据之间用“,”分开以利进行数据分割。
@LINES=<FILE>; #以行方式读取ip.txt内的数据并赋给数组成@LINE.
close(FILE);#关闭ip.txt文件
open (FILE,">$path/ip.txt");#以写入方式打开ip.txt文件,注意:用此方式打开时原数据将被清空。
$check=0;#将变量$check赋予0
foreach(@LINES)#进入循环并将数组@LINES内的数据一一指定给$_这个内定变量
{
($addr,$come_hour,$come_min,$come_sec)=split(/,/,$_);
#将变量$_内的信息以“,”号标志进行分割,并将分割后的ip地址赋值给变量$addr; 时赋值给变量$come_hour;分赋值给变量$come_min;秒赋值给变量$come_sec.
$flag=($hour-$come_hour)*3600+($min-$come_min)*60+($sec-$come_sec);#将现时的系统时间减记录中的时间
if ( $addr eq "$ENV{'REMOTE_ADDR'}" )#判断语句,如果现在访客返回的ip地址等于记录中的ip地址。
{
print FILE "$ENV{'REMOTE_ADDR'},$hour,$min,$sec\n";
将引号内字符串的值写入ip.txt文件中。并打出下一个空行,这里"\n"的意思是打出下一空行。
$check=1;#并将变量$check赋予1值
}
elsif ($flag < $overtime && $flag > 0)
#如果上一个判断语句不成立(新的ip地址时),则再来一个判断。如果$flag的值小于所设定的刷新时限且$flag大于0
{
print FILE $_;
#将当前项的原数据原封不动地重新写入ip.txt文件
$people++;#在线人数加1。(注意:如果上一条的判断语句没被执行,变量$check的值仍为0)
}
}
#循环结束
print FILE "$ENV{'REMOTE_ADDR'},$hour,$min,$sec\n" if ($check == 0);#判断语句,如果变量$check的值等于零,则将此时来访的ip地址和时间加入到ip.txt中。
close (FILE);#关闭ip.txt.
print "Content-type: text/html\n\n";
# 设定输出方式为html格式。
print "document.write('当前在线:$people人');\n";#将“当前在线:$people人”这条信息输出到浏览器的对应位置。
exit;#程序结束。
思维稿

数据库的数据修改与删除CGI程序范例
open(file,"data.txt");#以只读方式打开数据记录文件,设数据内容是:“黄山&男&广州市&未审核”。
@lins=<file>;#以行方式从打开的data.txt文件读出数据并赋给数组@lins.
close(file);#关闭data.txt文件。
open(file,">data.txt");#以写入方式打开数据文件data.txt.
注意:用此方式打开时原数据将被清空。
foreach(@lins){#进入循环并将数组@lins内的数据一一指定给$_这个内定变量
($a,$b,$c,$d)=split(/&/,$_);#以&为标志分割当行数据,此时$a="黄山";$b="男";$c="广州市";$d="未审核".
if($d eq"未审核"){#判断语句,如果$d="未审核".
$d="已审核 ";#将$d的值修改成“已审核”。
$_="$a&$b&$c&$d";}# 将修改后的数据重新赋给变量$_.
print file $_;#将作过修改的数据写入data.txt 文件。
}#结束循环
close(file);#关闭data.txt文件
exit;#程序结束
上面的程序段是一段修改数据的CGI程序范例,只要将它稍加修改就变成数据删除程序段,修改如下:
open(file,"data.txt");#以只读方式打开数据记录文件,设数据内容是:“黄山&男&广州市&未审核”。
@lins=<file>;#以行方式从打开的data.txt文件读出数据并赋给数组@lins.
close(file);#关闭data.txt文件。
open(file,">data.txt");#以写入方式打开数据文件data.txt.
注意:用此方式打开时原数据将被清空。
foreach(@lins){#进入循环并将数组@lins内的数据一一指定给$_这个内定变量
($a,$b,$c,$d)=split(/&/,$_);#以&为标志分割当行数据,此时$a="黄山";$b="男";$c="广州市";$d="未审核".
if($d eq"未审核"){#判断语句,如果$d="未审核".
$_="";}#将变量“$_”至空。
if($_ ne""){print file $_;}#如果"$_"不等于空,则将$_写入data.txt文件,如果"$_"为空则不写入(实际上起到删除了$d="未审核"的数据项。
}#结束循环
close(file);#关闭data.txt文件
exit;#程序结束      
思维稿

邮件发送CGI子程序范例
下面是一段完整的E-MAIL发送CGI程序,如你想编写一个邮件发送程序,这一段代码很有参考价值.这段代码我在网上运行通过.
sub mail2{
$mailprg= "/usr/sbin/sendmail";#邮件服务器位置
$rmail="swtvjsw\@163.net";#回复时的E-MAIL地址
$title="会员审核通过通知";#邮件标题
open(PSD,"$fddata")|| die $!;#以只读方式打开会员数据库文件
@lines1=<PSD>;#将数据以行方式读入数组@linesl
close(PSD);#关闭数据文件
foreach $line1 (@lines1) {#进入循环
($cnt,$msg,$name,$yum,$mm,$live,$email,$www,$url,$tel,$zczt,$sex,$yzpm,$time)=split(/↑/,$line1);#将每行数据以"↑"进行分割并分别赋给等式左边的14个变量,其中变量$email是会员的E-MAIL地址,变量$name是会员名字,变量$yum是会员登陆名,变量$mm是会员密码.
$email=~s/ //g;#去除变量$email的多余空格
if($zczt eq "已审核" && $name eq $FORM{'name'}){#如果变量$zczt等于"已审核"和变量$name等于由表单送来的名.
open (mail,"| $mailprg") || die "logo system error";#打开邮件服务器
print mail "TO:$email\n";#将目的E-MAIL地址送入邮件服务器
print mail "From:$rmail\n";#将回复时的E-MAIL地址送入邮件服务器
print mail "Subject: $title\n";#将邮件标题送入邮件服务器
print mail "$name您好:\n";#将信件内容送入邮件服务器
print mail " 恭喜您已成为广州电子技术网大家庭中的一员,希望我们今后多多联系共同进步。\n";
print mail "您登陆的用户名:$yum;密码:$mm。\n";
print mail "思维 $Date\n";
print mail "----------------------------------------------------------\n";
print mail "程序制作:广州电子技术网-思维(http://gzdzw.51.net)\n";
print mail "\n\n";#邮件发送
close(mail);#关闭邮件服务器
last;}#判断语句结束并跳出循环
}#循环结束符号
print "<META HTTP-EQUIV=REFRESH CONTENT=\"0;URL=$cgiurl?action=sousuo1324&T1=$FORM{'T1'}&page=$FORM{'page'}\">\n";#程序运行完毕后返回的地址
exit;#退出此程序
}                
思维稿

分页显示CGI程序范例
sub search{
$l=0;
$show=15;#设定每页显示数据的行数。
open (output,"sj.txt");#打开数据文件sj.txt
@count=<output>;
close(output);
$w=@count;#得到sj.txt文件中的数据信息总数$w.
if ($page eq ""){ $min=1; $max=$show; $page=1; }#设定首页的初始值:$page为页数,$min为数据文件中的第一行数据信息,$max为该页最末一行显示的数据文件中的数据信息行。
if ($page ne ""){ $min=(($page-1)*$show)+1; $max=$page*$show; }#各分页信息显示行的控制参数,变量含义与上一代码行相同。
$tempp=1;#每页显示行数的初始值。
$j=1;#页数的初始值。
print '<table border="0" cellspacing="0" style="font-size: 9pt" align="center"><tr><td width="500" >';

while ($w>0) {
print "<a href=../../$cgiurl?page=$j align=center>第$j页</a>。";
$w=$w-$show; $j++;
}#这个循环是建立页数的超连接。

print"Content-type:text/html\n\n";#建立输出格式
print"</td></tr></table>";
print '<table border="1" cellspacing="0" style="font-size: 9pt" align="center"><tr><td width="80" height="18" align="center" bgcolor="#FFBBDD">模块型号</td><td width="70" height="18" bgcolor="#7DCFFF" align="center">模块增益(dB)</td><td width="70" height="18" bgcolor="#7DCFFF" align="center">工作频率(MHZ)</td><td width="70" height="18" bgcolor="#7DCFFF" align="center">CTB失真 (dB)</td><td width="70" height="18" bgcolor="#7DCFFF" align="center">交调失真 (dB)</td><td width="70" height="18" bgcolor="#7DCFFF" align="center">互调失真(dB)</td><td width="70" height="18" align="center" bgcolor="#7DCFFF" align="center">输出电平(dB)</td><td width="70" height="18" align="center" bgcolor="#7DCFFF" align="center">噪声系数(dB)</td><td width="70" height="18" align="center" bgcolor="#7DCFFF" align="center">工作电流(mA)</td></tr>';
#上面一段代码是生成要显示的各数据信息的名称行,熟悉HTML的朋友应一看就知道。

open (output,"sj.txt");#再打开数据文件sj.txt
while ($temp=<output>){
@line[$l]=$temp;
$l++;}#此循环是将sj.txt中的每一行数据赋给数组@line
close(output);

for ($l;$l>=0;$l--){#进入显示循环。
($webname,$url,$key,$gl,$fdxs,$tzpv,$lx,$lx1,$lx2)=split(/&/, @line[$l]);#以&为标记分割数组@line并将分割后的数据赋给等式左边的各变量。

#下面一段代码为数据输出显示段,它受$min和$max这两个变量控制。
if ($tempp>=$min && $tempp<=$max) {
print "<tr><td width='80' height='18' align=center >$webname</td><td width='70' height='18' align=center >$key</td><td width='70' height='18' align=center>$url</td><td width='70' height='18' align=center >$gl</td><td width='70' height='18' align=center>$fdxs</td><td width='70' height='18' align=center >$tzpv</td><td width='70' height='18' align=center>$lx</td><td width='70' height='18' align=center>$lx1</td><td width='70' height='18' align=center>$lx2</td></tr>";
}
$tempp++;}
}                
思维稿

一种图形显示式计数器CGI程序范例
<table border="1" bgcolor="#F5DE38" width="81">
<tr>
<td width="75"><img src="http://gzcatv.huyt.net/cgi-bin/counter.cgi?position=5" width="15"
height="17"><img src="http://gzcatv.huyt.net/cgi-bin/counter.cgi?position=4" width="15"
height="17"><img src="http://gzcatv.huyt.net/cgi-bin/counter.cgi?position=3" width="15"
height="17"><img src="http://gzcatv.huyt.net/cgi-bin/counter.cgi?position=2" width="15"
height="17"><img src="http://gzcatv.huyt.net/cgi-bin/counter.cgi?position=1" width="15"
height="17"></td>
</tr>
</table>
上面一段代码是用作调用此程序的HTML代码。在要显示计数的地方放上此段代码即可。
###########################################################
#!/usr/bin/perl
$counterfile = "counter/counter.txt"; #counter.txt(计数器的数据库文件)的相对路径
$imagefile{'0'}="counter/0.gif"; # 0.gif(数字图片文件)的相对路径
$imagefile{'1'}="counter/1.gif";
$imagefile{'2'}="counter/2.gif";
$imagefile{'3'}="counter/3.gif";
$imagefile{'4'}="counter/4.gif";
$imagefile{'5'}="counter/5.gif";
$imagefile{'6'}="counter/6.gif";
$imagefile{'7'}="counter/7.gif";
$imagefile{'8'}="counter/8.gif";
$imagefile{'9'}="counter/9.gif";
######################
$|=1;
@querys = split(/&/, $ENV{'QUERY_STRING'});
foreach $query (@querys) {
($name, $value) = split(/=/, $query);
$FORM{$name} = $value;}
$position="$FORM{'position'}";
#上面程序段为接收浏览器送来的数据处理段
######################
open(NUMBER,"$counterfile");#用只读方式打开记录库文件
$number=<NUMBER>;#将库文件内的数据赋给变量$number
close(NUMBER);#关闭数据库
$number++;#记录数加一
if ($position==1) {#如果$position(浏览器端送来的数据)等于一,则将新数据写如数据库
open(NUMBER,">$counterfile");
print NUMBER "$number";
close(NUMBER);}
if (($position>0) && ($position<=length($number))) {#如果$position大于0并且小于$number的字段位数(length($number)是截取$number的字段位数的语句)
$positionnumber=substr($number,(length($number)-$position),1);#截取从$number的右边开始的第length($number)-$position)}后的一个字符。
else {#否则$positionnumber=0
$positionnumber="0";}
if ($imagefile{$positionnumber}) {#如果$imagefile{$positionnumber}已定义
$imagereturn=$imagefile{$positionnumber};}#则有$imagereturn=$imagefile{$positionnumber}
else {#否则$imagereturn=$imagefile{'0'}
$imagereturn=$imagefile{'0'};}
print "Content-type: image/gif\n\n";设定输出格式为GIF图形格式
open(IMAGE,"<$imagereturn");
print <IMAGE>;#显示$imagereturn内容的图片文件。
close(IMAGE);
exit 0;#程序结束  
思维稿
下面是此程序的运行结果:

如何将CGI的运行结果嵌入网页中
    我们知道CGI程序与网页(html文件)之间是一种输入与输出的关系,即网页起着数据输入的作用,而CGI程序则起着对数据的处理(运算)和将结果送回浏览器端的作用。通常的情况是用CGI程序产生一个html页面将输出结果(数据)置于此页面中,送到浏览器中显示出来。那末是否可以在现有的网页上将CGI运算后的数据嵌入到其中呢?回答是肯定的,通常有以下几种方法。
一,用print"docuwent. write('............');";语句嵌入:要用这种方法在编写CGI程序时将要输出的结果加入以下代码:print"docuwent. write('............');";本站用的计数器就是采用这种方式,原代码如下:print "document.write('总访问量:<font color=red>'+$count+'</font><br>当前在线:<font color=red>'+$online+'</font>人<br>今天访问量:<font color=red>'+$a+'</font>');"; 这种方式适合于以纯文本方式输出结果的结果。
二,用html语句嵌入:我们可利用<IFRAME...........></IFRAME> 这一html语句在网页中嵌入CGI程序运行后所输出的结果,这时CGI程序运行结果将在<IFRAME>与</IFRAME>之间显示出来, 这种方式操作起来简单容易,也不需要在编写CGI程序时插入额外的代码,如果CGI程序输出的结果是图文并茂则用这种方式较好,本站的“文章更新”就是用这种方法。代码如下:<IFRAME frameborder="0" leftmargin="0" marginheight="0" marginwidth="0" scrolling="no" src="http://gzdzw.51.net/cgi-bin/notice.cgi?id=data" topmargin="0" width="400"></IFRAME>。
三,模板方式:这种方式是用html代码先制作好一页面称模板页面,在制作这个页面时在要显示输出结果(如输出结果$text="广州电子技术网")的地方用“$xxxxx”字符串表示,如$textw,CGI程序运行时先将模板页面以行的方式读入系统内定变量$_,并将模板中的字符串$textw用输出结果$text取代它,然后用print $_;语句输出即可。其实这种方法与由CGI程序产生一个html页面差不多,好处是在编写程序时可少写了产生html页面的代码,使CGI程序的尺寸大大减少并且使调试输出界面方便快捷。如要求较复杂的输出界面时,用此种方法是最好的,下面是用此方法的一段程序范例:
#!/usr/bin/perl
print "Content-type: text/html\n\n;
$htmlpath="c:/gzdzw/cgi-bin";#模板文件路径
$text="广州电子技术网";
open(FILE,"$htmlpath/index.html");#打开模板文件,模板文件为index.html(已先制作好,必须含有字符串:$textw)
while (<FILE>){#此循环是以行方式将模板文件读入内定变量$_.
s/\$textw/$text/g;#将模板中的字符串$textw用变量$text取代。
print $_;#输出结果:此时原模板中含字串$textw的地方将显示:广州电子技术网。
}
close(FILES);#关闭模板文件
exit;#程序运行结束
思维稿

两个关于文件操作的CGI程序
1、程序实现了将一个目录下面的所有文件(包括子目录)名都记录在tde.txt这个文件中(建立文件数据库)。
#!/usr/bin/perl
opendir(TD,'C:/httpd/HtDocs');#打开目录并将此目录下的所有文件和子目录名建立文件句柄TD。
my @aa=grep(!/^\.\.?$/,readdir TD);#去除TD中的..,并将TD的内容赋给数组@aa.
closedir(TD);#关闭TD
$tv="\n";#将换行符\n赋给变量$tv
open(OUT,">>C:/httpd/HtDocs/cgi-bin/tde.txt");#以写入的方式打开文件tde.txt
foreach(@aa){ #进入循环,在每一个循环中,系统将读入数组@aa的每一个数据并赋给内定变量$_
print OUT "$_$tv";#将变量$_和$tv写入文件tde.txt中,由于$tv是换行符,所以每个$_将占一行。
}
close(OUT);#关闭文件tde.txt
print "Content-type:text/html","\n\n";
print"ok!";#向屏幕输出运行结束的提示。

2、程序实现了将C:/httpd/HtDocs/gallery/tn_.gif的文件反复复制到C:/httpd/HtDocs/gallery/te下,并改名为原C:/httpd/HtDocs/gallery/te下的文件的文件名头加上tn_。
#!/usr/bin/perl
opendir(TD,'C:/httpd/HtDocs/gallery/te');#打开目录并将此目录下的所有文件和子目录名建立文件句柄TD。
my @aa=grep(!/^\.\.?$/,readdir TD);#去除TD中的..,并将TD的内容赋给数组@aa.
closedir(TD);#关闭TD
$re="tn_";#将tu_赋给变量$tv
foreach(@aa){ #进入循环,在每一个循环中,系统将读入数组@aa的每一个数据并赋给内定变量$_
open(OUT,"C:/httpd/HtDocs/gallery/tn_.gif");#打开文件tn_.gif建立文件句柄OUT
binmode(OUT);#以二进制的方式读取tn_.gif的数据。
@FF=<OUT>;#将OUT的内容赋给数组@FF.
open(OUT1,">C:/httpd/HtDocs/gallery/te/$re$_");#建立与变量$re和$_内容相关的文件。
print OUT1 @FF;#将数组内容写入文件
close(OUT1);#关闭文件
close(OUT);#关闭文件tn_.gif
}
print "Content-type:text/html","\n\n";
print"ok!";#向屏幕输出运行结束的提示。
思维稿

 
阅读:
录入:JETTA

推荐 】 【 打印
上一篇:c#短信发送软件
下一篇:如何去除QQ广告
本文评论
      全部评论
发表评论


点评: 字数
姓名:
站长推荐