国产毛片午夜福利,国产黄网,国产亚洲天堂,97国产精品

  •  
    利用CGI方式實(shí)現(xiàn)Web查詢
    發(fā)布時(shí)間:2005-03-28   瀏覽次數(shù):1185651
    出處:未知
    作者:許玲
    摘要:本文分析討論了將WEB與后以數(shù)據(jù)源相連的方法之一——公共網(wǎng)關(guān)界面CGI的
    概念與特點(diǎn),并以成績(jī)查詢系統(tǒng)作為實(shí)例詳細(xì)分析了用C語(yǔ)言進(jìn)行CGI程序設(shè)計(jì)的方
    法與過程。
    關(guān)鍵詞:CGI、Web集成

    一CGI簡(jiǎn)述
    公共網(wǎng)關(guān)界面(CGI)是一種編程標(biāo)準(zhǔn),它規(guī)定了Web服務(wù)器調(diào)用其它可執(zhí)行程序(CGI
    程序)的接口協(xié)議標(biāo)準(zhǔn)。CGI程序通過Web服務(wù)器與運(yùn)行Web服務(wù)器調(diào)用其它可執(zhí)行程
    序交互,它接受Web瀏覽器發(fā)送給Web服務(wù)器的信息,并進(jìn)行處理,然后將結(jié)果再送
    回給Web服務(wù)器及Web瀏覽器。CGI程序可以用任何程序設(shè)計(jì)語(yǔ)言編寫,如Shell、
    perl、C、Java等,用C語(yǔ)言編寫的CGI程序具有速度快、性高等特點(diǎn)。CGI程序
    通常用于加入查詢機(jī)制、搜索機(jī)制、交互式應(yīng)用及其它一些應(yīng)用。
    CGI接口標(biāo)準(zhǔn)包括輸入、環(huán)境變量、標(biāo)準(zhǔn)輸出三部分,CGI程序可以通過標(biāo)準(zhǔn)輸入
    (stdin)從Web服務(wù)器得到輸入信息,例如從FORM中得到數(shù)據(jù),這是常用的POST方
    法。由于不同的操作系統(tǒng)采用了不同的信息交換機(jī)制,其參數(shù)傳遞的處理過程也有
    差別,在Unix與DOS中,環(huán)境信息反映著本級(jí)程序運(yùn)行時(shí)的某些系統(tǒng)狀況,可用于父
    程序與子程序間的信息傳遞,CGI正是通過設(shè)量環(huán)境變量在服務(wù)器與客戶機(jī)間傳遞數(shù)
    據(jù)的,各操作系統(tǒng)都提供了許多環(huán)境變量,它們定義了程序的執(zhí)行環(huán)境,應(yīng)用程序
    可以存取它們。Web服務(wù)器和CGI接口也設(shè)置了一些環(huán)境變量用以傳遞一些重要的參
    數(shù)。CGI程序通過標(biāo)準(zhǔn)輸出(stdout)將輸出信息傳送給Web服務(wù)器,傳送給服務(wù)器的
    信息可以是HTML文本也可以是純文本。本文將利用C語(yǔ)言編寫一個(gè)CGI應(yīng)用程序——
    學(xué)生成績(jī)查詢系統(tǒng),并分析了CGI程序設(shè)計(jì)的方法、過程、技巧。

    二、成績(jī)查詢系統(tǒng)介紹
    一個(gè)在WWW環(huán)境下的學(xué)生成績(jī)公布欄必將成為日后各類成績(jī)發(fā)布的主要手段,每位學(xué)
    生交將有自己的密碼,所以不必?fù)?dān)心成績(jī)上網(wǎng)之后的保密性。任何學(xué)生以任何形式
    上網(wǎng)進(jìn)入本站點(diǎn)的成績(jī)查詢系統(tǒng)之后,只要輸入自己的系列、班別、學(xué)號(hào)及密碼,
    便可以利用這個(gè)學(xué)生績(jī)查詢系統(tǒng)查詢自己的成績(jī),該設(shè)計(jì)思路與系統(tǒng)不僅適合各類
    高校內(nèi)部的成績(jī)發(fā)布,也適合于高考、統(tǒng)考等大規(guī)模考試的成績(jī)發(fā)布。本文介
    紹的只是一個(gè)功能單一的查詢系統(tǒng),若需完善還需加入成績(jī)維護(hù)部分,由成績(jī)管理
    者進(jìn)行內(nèi)容維護(hù),包括成績(jī)輸入、修改、刪除等功能。

    三、HTML FORM格式部分
    3.1 FORM輸放的分解
    在UNIX系統(tǒng)上,CGI信息是利用STDIN/STDOUT方式傳輸?shù),所以若要編寫一個(gè)C語(yǔ)言
    的CGI程序,必須要了解如何解剖與截取STDIN的CGI信息。當(dāng)用戶提交一個(gè)HTML 
    FORM時(shí),WEB瀏覽器首先對(duì)FORM中的數(shù)據(jù)以名字/值對(duì)的形式進(jìn)行編碼,并發(fā)送給WEB
    服務(wù)器,然后再由WEB服務(wù)器傳遞給CGI程序,其格式如下:
    NAME1=VALUEL&NAME2=VALUE2&NAME3····
    名字是FORM中定義的INPUT,SELECT等標(biāo)置名字,值是用戶輸入或選擇的標(biāo)值,在程
    序中將對(duì)其進(jìn)行分析與解碼,將其分解成一組組的名字/值對(duì),這個(gè)過程是通過在輸
    入流中查找字符“=”與“&”來完成的,每當(dāng)找到字符“=”,標(biāo)志著一個(gè)FORM變量
    名字的結(jié)束,當(dāng)找到字符“&”,標(biāo)志著一個(gè)FORM變量值的結(jié)束。當(dāng)名字/值對(duì)分解
    完之后,還須將輸入中的一些特殊字符轉(zhuǎn)換成相應(yīng)的ASCII字符,如需將“+”轉(zhuǎn)換
    成空格符,將一些特殊字符轉(zhuǎn)換成ASCII字符,對(duì)以上分所分析的分解與轉(zhuǎn)換過程,
    在下面的程序中有詳細(xì)注明。
    3.2HTML FORM文件
    成績(jī)查詢系統(tǒng)的HTML文件P.htrnl
    <TITLE>學(xué)生成績(jī)查詢系統(tǒng)</TITLE>
    <H1>學(xué)生成績(jī)查詢系統(tǒng)</H1>
    <FORM METHOD="POST"ACTION="URL地址"
    <H3>系列:<SELECTNAME="Department">
    <OPTION>計(jì)算機(jī)系
    <OPTION>英語(yǔ)系
    <OPTION>無線電系
    </SELECT><P>
    學(xué)號(hào):<INPNT TYPE="TEXT"NAME="ID"><P>
    密碼:<INPNT TYPE="PASSWORD"NAME"PASSWORD"><P>
    <INPNT TYPE="SUBMIT"VALUE"查詢”>
    <INPNT TYPE+"RESET"VALUE="放棄”〉
    </FORM>

    四、學(xué)生成績(jī)查詢CGI程序
    該CGI程序分解、接收HTML FORM中提供的查詢條件,然后查詢出該學(xué)生的成績(jī)并返
    回。學(xué)生成績(jī)有兩個(gè)數(shù)據(jù)文件,一個(gè)是***SUB DAT,其中含有學(xué)生的各個(gè)科目,***
    表示系別,如計(jì)算機(jī)系的科目文件是COMPSUB DAT,英語(yǔ)系的科目文件是
    ENGSUB.DAT,無線電系科目文件是ELECSUB.DAT;另一個(gè)數(shù)據(jù)文件是***SCOER.DAT,
    該文件中包含有每個(gè)學(xué)生的學(xué)號(hào)、密碼與成績(jī),***表示系別,如計(jì)算機(jī)系的學(xué)生成
    績(jī)文件是COMPSCORE.DAT,同理,其他系的學(xué)生成績(jī)文件按此原則以此類推。當(dāng)學(xué)生
    輸入的學(xué)號(hào)及密碼符合數(shù)據(jù)文件的內(nèi)容時(shí),會(huì)顯示該學(xué)生的成績(jī)。
    main(int argc,char*argv[])
    {
    register int i,m=0;
    int len;
    FILE*fp,*fpl,*fopen();
    char filename1[100],filename2[100],title[100];/*設(shè)定資料變量*/
    char subject[10][10];
    char id[100][10],password[100][10];
    int score[100][],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,"計(jì)算機(jī)系/)==0
    strcat(filename1,"compusb.dat");
    strcat(filename2,"compscore.dat");
    }
    if(strcmp(inputs[o].val,"英語(yǔ)系")==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>輸入有誤,請(qǐng)?jiān)佥斠淮?</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>學(xué)生成績(jī)查詢系統(tǒng)</H1></center>");
    pritf("\n<center>查詢學(xué)生學(xué)號(hào):%s</center>
    ",
    inputs[2].val);
    printf("\n<center>成績(jī)?nèi)缦?</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]);
    }
    }
    立即預(yù)約