动网论坛,站长建站首选,国内使用量最多的论坛软件 动网论坛官方技术讨论区 站长工具 申请属于您自己的免费论坛
首页 | 新闻资讯 | 网站运营 | 网络编程 | 数据库 | 服务器 | 网页设计 | 图像媒体 | 网络应用 | 搜索优化 | 资源下载 | 动网主机 | DVBOX
    本站内  互联网 ASP论坛  ASP.Net论坛  PHP论坛
  
   Cgi/Perl → 阅读文章

 利用CGI方式实现Web查询

作者来源: 
阅读 1347 人次 , 2006-3-29 4:02:00 

摘要:本文分析讨论了将web与后以数据源相连的方法之一——公共网关界面cgi的概念与特点,并以成绩查询系统作为实例详细分析了用c语言进行cgi程序设计的方法与过程。
关键词:cgi、web集成

一cgi简述
公共网关界面(cgi)是一种编程标准,它规定了web服务器调用其它可执行程序(cgi程序)的接口协议标准。cgi程序通过web服务器与运行web服务器调用其它可执行程序交互,它接受web浏览器发送给web服务器的信息,并进行处理,然后将结果再送给web服务器及web浏览器。cgi程序可以用任何程序设计语言编写,如shell、perl、c、java等,用c语言编写的cgi程序具有速度快、安全性高等特点。cgi程序
通常用于加入查询机制、搜索机制、交互式应用及其它一些应用。
cgi接口标准包括输入、环境变量、标准输出三部分,cgi程序可以通过标准输入stdin)从web服务器得到输入信息,例如从form中得到数据,这就是常用的post方法。由于不同的操作系统采用了不同的信息交换机制,其参数传递的处理过程也有别,在unix与dos中,环境信息反映着本级程序运行时的某些系统状况,可用于父序与子程序间的信息传递,cgi正是通过设量环境变量在服务器与客户机间传递数
据的,各操作系统都提供了许多环境变量,它们定义了程序的执行环境,应用程序可以存取它们。web服务器和cgi接口也设置了一些环境变量用以传递一些重要的参数。cgi程序通过标准输出(stdout)将输出信息传送给web服务器,传送给服务器的信息可以是html文本也可以是纯文本。本文将利用c语言编写一个cgi应用程序——学生成绩查询系统,并分析了cgi程序设计的方法、过程、技巧。

二、成绩查询系统介绍
一个在www环境下的学生成绩公布栏必将成为日后各类成绩发布的主要手段,每位学生交将有自己的密码,所以不必担心成绩上网之后的保密性。任何学生以任何形式上网进入本站点的成绩查询系统之后,只要输入自己的系列、班别、学号及密码,便可以利用这个学生绩查询系统查询自己的成绩,该设计思路与系统不仅适合各类校内部的成绩发布,也适合于全国高考、统考等大规模考试的成绩发布。本文介
绍的只是一个功能单一的查询系统,若需完善还需加入成绩维护部分,由成绩管理者进行内容维护,包括成绩输入、修改、删除等功能。

三、html form格式部分
3.1 form输放的分解
在unix系统上,cgi信息是利用stdin/stdout方式传输的,所以若要编写一个c语言的cgi程序,就必须要了解如何解剖与截取stdin的cgi信息。当用户提交一个html form时,web浏览器首先对form中的数据以名字/值对的形式进行编码,并发送给web 服务器,然后再由web服务器传递给cgi程序,其格式如下:
name1=valuel&name2=value2&name3····
名字是form中定义的input,select等标置名字,值是用户输入或选择的标值,在程序中将对其进行分析与解码,将其分解成一组组的名字/值对,这个过程是通过在输入流中查找字符“=”与“&”来完成的,每当找到字符“=”,标志着一个form变量名字的结束,当找到字符“&”,标志着一个form变量值的结束。当名字/值对分解完之后,还须将输入中的一些特殊字符转换成相应的ascii字符,如需将“+”转换成空格符,将一些特殊字符转换成ascii字符,对以上分所分析的分解与转换过程,在下面的程序中有详细注明。
3.2html form文件
成绩查询系统的html文件p.htrnl
<title>学生成绩查询系统</title>
<h1>学生成绩查询系统</h1>
<form method="post"action="url地址"
<h3>系列:<selectname="department">
<option>计算机系
<option>英语系
<option>无线电系
</select><p>
学号:<inpnt type="text"name="id"><p>
密码:<inpnt type="password"name"password"><p>
<inpnt type="submit"value"查询”>
<inpnt type+"reset"value="放弃”〉
</form>

四、学生成绩查询cgi程序
该cgi程序分解、接收html form中提供的查询条件,然后查询出该学生的成绩并返回。学生成绩有两个数据文件,一个是***sub dat,其中含有学生的各个科目,*** 表示系别,如计算机系的科目文件是compsub dat,英语系的科目文件是engsub.dat,无线电系科目文件是elecsub.dat;另一个数据文件是***scoer.dat,该文件中包含有每个学生的学号、密码与成绩,***表示系别,如计算机系的学生成绩文件是compscore.dat,同理,其他系的学生成绩文件按此原则以此类推。当学生输入的学号及密码符合数据文件的内容时,就会显示该学生的成绩。
main(int argc,char*argv[])
{
register int i,m=0;
int len;
file*fp,*fpl,*fopen();
char filename1[100],filename2[100],title[100];/*设定资料变量*/
char subject[10][10];
char id[100][10],password[100][10];
int score[100][20],sum[100],allsum;
float avg[100],alltotalavg;
int rank,number,index,find,j,kind;
printf("content-type:text/html%c%c",10,10);
len=atoi(getenv("content_lengith"));
for(i=0;len && (!feof(stdin));i++){
m=i
inputs[i].val=readdstdin(stdin,&,&len);/*读stdin信息*/
addtospace(inputs[i].val);
convert(inputs[i].val);
inputs[i].name=readdata(inputs[i].val,=);
}
strcpy(filename1,"/score/setup/");
stucpy(filename2,"/xcore/data/");
if(strcmp(inputs[o].val,"计算机系/)==0
strcat(filename1,"compusb.dat");
strcat(filename2,"compscore.dat");
}
if(strcmp(inputs[o].val,"英语系")==0
strcat(filenamel,"engsub.dat");
strcat(filename2,"engscore.dat");
}
if(strcmp(inputs[o].val,"无线电系")==0
}
strcat(filename1,"elecsub.dat");
strcat(filename2,"elecscore.dat");
}
fp=fopen(filename1,"r");/*打开文件*/
kind=0;
while(fscanf(fp,"%s",subject[kind]!=eof
kind=kind+1;
fclose(fp);

fp1=fopen(filename2,"r");/*打开文件*/
allsum=0;
for(i=0;i<100;i++)
{
numbde=i;
if(fscanf(fp1,"%s%s",id[i],
password[i]!=eof){
sum[i]=0;
for{j=0;j<kind;j++){
fscanf(fp1,"%d",&score[i][j]);
sum[i]+=score[i][j];
}
avg[i]=sum[i]/kind;
allsum+=sum[i];
}
else
break;
}
fclose(fp1);
find=0;
if(strcmp(inputs[2].val,id[i])==0&&
strcmp(inputs[3].val,password[i]==0){
index=i;
find=i;
}
}
if(find==0)
{
printf{"<h>输入有误,请再输一次!</h1>\n");
}
else
{
rank=1
for(i=o;i<number;i++)
if(sum[index]<sum[i])
rank=rank+1;
slltotalavg=allsum/number;
printf("<center><h1>学生成绩查询系统</h1></center>");
pritf("\n<center>查询学生学号:%s</center>
",
inputs[2].val);
printf("\n<center>成绩如下:</certer><hr>");

for(i=0;i<kind;i++)
printf{"%s\t",subject[kind]);
printf("总分
\n");
for(i=0;i<kind;i++)
printf("%d\t",score[index][i]);
printf["%d
\n",sum[index]);
}
}

五、结束语
本文以学竽成绩查询系统作为实例,详细分析了用c语言进行cgi程序设计的方法与过程,随着interet/intranet应用的深入,将web与多台数据库联接的需求也日益迫切,cgi可以使得web能够能最低程序的复杂性与其后台信息集成,成为一种支持多种类型的通用环境,但是由于在cgi方式中每执行一次交互都需启动一个外部程序,因此其在实时应用方面受到了限制,因而,web sener api及jocbc等应用方式也正在成熟。

参考文献
1、华南理工大学信息网络工程研究中心编《inrternet国际互连网》中山大学出版
社
2、蔡奇玉等《www上html与cgi写作大全》北京理工大学出版社
3、肖治延用c语言进行cgi程序设计微电脑世界1996.5
4、[美]tim ritchey 《javascrip for netscape》清华大学出版社

 
 收藏本文  打印本文  论坛讨论  关闭窗口
· 上一篇:申请14个CGI程序服务
· 下一篇:用VB编写标准CGI程序
· When perl is not quite fast enough
· perl如何传递数组参数shift应用
· Perl教学 第五篇 文件读写
· 中文版Perl CGI程式写作常问问题集(二)
· WIN9X系统下调试LINUX操作系统下的CGI程序


关于本站 | 联系我们 | 业务合作 | 客户案例 | 诚聘英才 | 广告合作 | 收藏本站
海口动网先锋网络科技有限公司版权所有
Copyright © 2000 - 2006 Cndw.Com
中华人民共和国电信与信息服务业务经营许可证编号 琼 ICP 020077