嵌入式CGI開發之旅——3

helloxchen發表於2010-11-18
對於CGI來說,處理表單是它的重頭戲,今天我們來看看CGI如何處理HTML的表單。

處理表單(GET

現在大多數的CGI指令碼用來處理表單輸入,處理表單的過程和上面直接在URL中呼叫CGI指令碼的情況有些不同。一個表單通常分為兩個部分:HTML表單格式和處理資料的指令碼,處理程式由標籤的ACTION屬性指定,每個輸入區都有一個NAME屬性用來稱呼表單元素,當表單資料被遞交給ACTION中定義的處理程式時,NAME和其輸入內容被以數字或字元的形式儲存在環境變數中,指令碼程式再透過讀取環境變數的方式獲得使用者輸入,根據程式語言的不同獲取環境變數的方式也不同,C語言中可以透過stdlib庫函式getenv來獲得環境變數。

表單從瀏覽器發給伺服器有兩種方法(METHOD屬性):GETPOSTGET方法將資料打包放在環境變數QUERY_STRING中作為URL整體的一部分傳遞給伺服器。POST做很多型別GET的事情,但是它分離地傳遞資料給指令碼的,程式要透過標準輸入或得資料,POST方式不會改變資料,也就是說同樣的資料可以多次提交而不必重新輸入。當資料量超過1024時只能使用POST來傳遞,由於GET將資料直接放到URL中,資料的傳輸也就變得很不安全了。

表單輸入的資料透過URL編碼後傳輸到伺服器端,我們有必要了解一下URL的編碼規則:

1、 每個name/valuename=valu的形式配對出現,每對name/valu之間用&分隔

2、 若使用者沒有對某個name賦值,則以“name=”的形式出現

3、 任何特殊字元以百分號%用十六進位制編碼。

4、 輸入區的空格將以“+”顯示

要想得到使用者輸入的資料就必須對傳遞進來的URL編碼進行解碼,解碼有很多工具可用,比如CGIC庫中就已經對解碼進行了包裝,常用的工具還有uncgi

我們以簡單的乘法為例說明表單的提交

先建立一個乘法表單,有兩個輸入區,分別是乘數和被乘數,一個提交按鈕,當點選提交按鈕時,顯示結果

multiple.html

然後在/var/www/cgi-bin目錄下建立mult.c檔案並編譯成mult.cgi

mult.c

#include

#include

int main(){

char *data;

long m,n;

printf("%s%c%cn","Content-Type:text/html;charset=iso-8859-1",13,10);

//列印HTML

printf("n");

printf("

data=getenv("QUERY_STRING");

//取得環境變數

if(data==NULL)

printf("

else if(sscanf(data,"m=%ld&n=%ld",&m,&n)!=2)

printf("

Error! Invalid data. Data must be numeric.");

else

printf("

The product of %ld and %ld is %ld.",m,n,m*n);

return 0;

}

可見CGI反饋給使用者的資訊要顯示出來是一行一行的將HTML的程式碼列印出來的!天啦這樣的話如果返回頁面一複雜那還得了啊?而且想返回一個漂亮的介面都幾乎是不可能的呢!應該有解決辦法的!慢慢深入!

Error!Error in passing data to script

");

Multiplication results

n");
[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/24790158/viewspace-1041682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章