天天看點

利用CGI方式實作Web查詢

摘要:本文分析讨論了将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);

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等應用方式也正在成熟。