您的位置:首页精文荟萃软件资讯 → 用CGI编写WEB查询系统

用CGI编写WEB查询系统

时间:2004/10/7 19:13:00来源:本站整理作者:蓝点我要评论(0)


            
             
              
             
            

               
               

            



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

一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信息。当用户提交一个HTMLFORM时,WEB浏览器首先对FORM中的数据以名字/值对的形式进行编码,并发送给WEB服务器,然后再由WEB服务器传递给CGI程序,其格式如下:
NAME1=VALUEL&NAME2=VALUE2&NAME3····
名字是FORM中定义的INPUT,SELECT等标置名字,值是用户输入或选择的标值,在程序中将对其进行分析与解码,将其分解成一组组的名字/值对,这个过程是通过在输入流中查找字符“=”与“&”来完成的,每当找到字符“=”,标志着一个FORM变量名字的结束,当找到字符“&”,标志着一个FORM变量值的结束。当名字/值对分解完之后,还须将输入中的一些特殊字符转换成相应的ASCII字符,如需将“+”转换成空格符,将一些特殊字符转换成ASCII字符,对以上分所分析的分解与转换过程,在下面的程序中有详细注明。3.2HTML FORM文件<BR> 成绩查询系统的HTML文件P.htrnl<BR> <TITLE>学生成绩查询系统</TITLE><BR> <H1>学生成绩查询系统</H1><BR> <FORM METHOD="POST"ACTION="URL地址"<BR> <H3>系列:<SELECTNAME="Department"><BR> <OPTION>计算机系<BR> <OPTION>英语系<BR> <OPTION>无线电系<BR> </SELECT><P><BR> 学号:<INPNT TYPE="TEXT"NAME="ID"><P><BR> 密码:<INPNT TYPE="PASSWORD"NAME"PASSWORD"><P><BR> <INPNT TYPE="SUBMIT"VALUE"查询”><BR> <INPNT TYPE+"RESET"VALUE="放弃”〉<BR> </FORM>四、学生成绩查询CGI程序
该CGI程序分解、接收HTML FORM中提供的查询条件,然后查询出该学生的成绩并返回。学生成绩有两个数据文件,一个是***SUB DAT,其中含有学生的各个科目,***表示系别,如计算机系的科目文件是COMPSUB DAT,英语系的科目文件是ENGSUB.DAT,无线电系科目文件是ELECSUB.DAT;另一个数据文件是***SCOER.DAT,该文件中包含有每个学生的学号、密码与成绩,***表示系别,如计算机系的学生成绩文件是COMPSCORE.DAT,同理,其他系的学生成绩文件按此原则以此类推。当学生输入的学号及密码符合数据文件的内容时,就会显示该学生的成绩。main(int argc,char*argv[])<BR> {<BR> register int I,m=0;<BR> int len;<BR> FILE*fp,*fpl,*fopen();<BR> char filename1[100],filename2[100],title[100];/*设定资料变量*/<BR> char subject[10][10];<BR> char id[100][10],password[100][10];<BR> int score[100][20],sum[100],allsum;<BR> float avg[100],alltotalavg;<BR> int rank,number,index,find,j,kind;<BR> printf("content-type:text/html%c%c",10,10);<BR> len=atoi(getenv("CONTENT_LENGITH"));<BR> for(I=0;len && (!feof(stdin));I++){<BR> m=I<BR> inputs[I].val=readdstdin(stdin,&,&len);/*读STDiN信息*/<BR> AddToSpace(inputs[I].val);<BR> Convert(inputs[I].val);<BR> inputs[I].name=ReadData(inputs[I].val,=);<BR> }<BR> strcpy(filename1,"/score/setup/");<BR> stucpy(filename2,"/xcore/data/");<BR> if(strcmp(inputs[o].val,"计算机系/)==0<BR> strcat(filename1,"compusb.dat");<BR> strcat(filename2,"compscore.dat");<BR> }<BR> if(strcmp(inputs[o].val,"英语系")==0<BR> strcat(filenamel,"engsub.dat");<BR> strcat(filename2,"engscore.dat");<BR> }<BR> if(strcmp(inputs[o].val,"无线电系")==0<BR> }<BR> strcat(filename1,"elecsub.dat");<BR> strcat(filename2,"elecscore.dat");<BR> }<BR> fp=fopen(filename1,"r");/*打开文件*/<BR> kind=0;<BR> while(fscanf(fp,"%s",subject[kind]!=EOF<BR> kind=kind+1;<BR> fclose(fp);<BR> <BR> fp1=fopen(filename2,"r");/*打开文件*/<BR> allsum=0;<BR> for(I=0;I<100;I++)<BR> {<BR> numbde=I;<BR> if(fscanf(fp1,"%s%s",id[I],<BR> password[I]!=EOF){<BR> sum[I]=0;<BR> for{j=0;j<kind;j++){<BR> fscanf(fp1,"%d",&score[I][j]);<BR> sum[I]+=score[I][j];<BR> }<BR> avg[I]=sum[I]/kind;<BR> allsum+=sum[I];<BR> }<BR> else<BR> break;<BR> }<BR> fclose(fp1);<BR> find=0;<BR> if(strcmp(inputs[2].val,id[I])==0&&<BR> strcmp(inputs[3].val,password[I]==0){<BR> index=I;<BR> find=I;<BR> }<BR> }<BR> if(find==0)<BR> {<BR> printf{"<H>输入有误,请再输一次!</h1>\n");<BR> }<BR> else<BR> {<BR> rank=1<BR> for(I=o;I<number;I++)<BR> if(sum[index]<sum[I])<BR> rank=rank+1;<BR> slltotalavg=allsum/number;<BR> printf("<center><H1>学生成绩查询系统</H1></center>");<BR> pritf("\n<center>查询学生学号:%s</center><br>",<BR> inputs[2].val);<BR> printf("\n<center>成绩如下:</certer><hr>");<BR> <BR> for(I=0;I<kind;I++)<BR> printf{"%s\t",subject[kind]);<BR> printf("总分<br>\n");<BR> for(I=0;I<kind;I++)<BR> printf("%d\t",score[index][I]);<BR> printf["%d<br>\n",sum[index]);<BR> }<BR> }五、结束语
本文以学竽成绩查询系统作为实例,详细分析了用C语言进行CGI程序设计的方法与过程,随着INTERET/INTRANET应用的深入,将WEB与多台数据库联接的需求也日益迫切,CGI可以使得WEB能够能最低程序的复杂性与其后台信息集成,成为一种支持多种类型的通用环境,但是由于在CGI方式中每执行一次交互都需启动一个外部程序,因此其在实时应用方面受到了限制,因,WEB SENER API及JOCBC等应用方式也正在成熟。

相关阅读 Windows错误代码大全 Windows错误代码查询激活windows有什么用Mac QQ和Windows QQ聊天记录怎么合并 Mac QQ和Windows QQ聊天记录Windows 10自动更新怎么关闭 如何关闭Windows 10自动更新windows 10 rs4快速预览版17017下载错误问题Win10秋季创意者更新16291更新了什么 win10 16291更新内容windows10秋季创意者更新时间 windows10秋季创意者更新内容kb3150513补丁更新了什么 Windows 10补丁kb3150513是什么

文章评论
发表评论

热门文章 360快剪辑怎么使用 36金山词霸如何屏幕取词百度收购PPS已敲定!3

最新文章 微信3.6.0测试版更新了微信支付漏洞会造成哪 360快剪辑怎么使用 360快剪辑软件使用方法介酷骑单车是什么 酷骑单车有什么用Apple pay与支付宝有什么区别 Apple pay与贝贝特卖是正品吗 贝贝特卖网可靠吗

人气排行 xp系统停止服务怎么办?xp系统升级win7系统方电脑闹钟怎么设置 win7电脑闹钟怎么设置office2013安装教程图解:手把手教你安装与qq影音闪退怎么办 QQ影音闪退解决方法VeryCD镜像网站逐个数,电驴资料库全集同步推是什么?同步推使用方法介绍QQ2012什么时候出 最新版下载EDiary——一款好用的电子日记本