12.5 如何取得傳遞資料?

一般而言,欲將處理資料傳遞給伺服器,大多使用以下二種方法:

  1. GET:

    此法會將資料以鍵和值(Key-Value)成對的方式,附加在 URL 之中,若有兩項以上的資料,則各對鍵值之間用 & 隔開。

    例如:

    http://主機位址/cgi-bin/test.cgi?name=John&age=18

    即是將 (name, John) 以及 (age, 18) 二組鍵值以 GET 的方式傳遞。當然也可以利用 HTML 語法中的 Form 表單,將 method (傳遞方法)設為 GET。

    所謂鍵值,其實就是變數的概念,鍵(Key)就是變數的名稱,值(Value)就是變數的內含。如果您要將一個內含為 John 的變數 name,傳遞給伺服器,那麼只要在 URL 之後加上個問號(?),並以 name=John 的方式附加上去即可。

    GET 的缺點是:URL 字串長度有一定的限制,若鍵值太多太長,可能會使得部份資料被截掉,而無法傳送至伺服器。

    以 GET 的方式傳遞時,伺服器會將資料放入環境變數 QUERY_STRING 之中,我們必須由這個環境變數來取得資料。

  2. POST:

    這種方式和 GET 作法迴異,POST 利用 HTML 語法的 Form 表單,由瀏覽器將鍵值傳給伺服器,並放入伺服器的標準輸出入機制中,由於它沒有 GET 的缺點,因此可以傳送較多的資料,一般而言,我們大多使用 POST 的方式。欲使用 POST 方式,要在表單中將方法 (method) 設為 POST 才行。以 POST 的方式傳遞時,我們必須由標準輸出入來取得資料,資料的長度,伺服器將它記錄在環境變數 CONTENT_LENGTH 中。

範本:

若以 GET 的方式傳遞,例如 http://www.ols3-cgi.com/cgi-bin/test.cgi?name=John&age=18

則以下列方式來取得資料:

$temp = $ENV{'QUERY_STRING'};

此時 $temp 中的內含即為 name=John&age=18

若以 POST 的方式傳遞,則以下列方式來取得資料:

read(STDIN, $temp, $ENV{'CONTENT_LENGTH'});

此時 $temp 中的內含即為 name=John&age=18

若您使用 CGI.pm 模組的話,那麼取得資料的方法更是十分簡單易懂,方法如下:

use CGI;         # 宣告使用 CGI.pm 模組

$q=CGI->new();   # 要求配置一個 CGI 物件

$user_name=$q->param('name');    # 取得變數 name 的內含

$user_age=$q->param('age');      # 取得變數 age 的內含

此時,$user_name 的內含即為 John,$user_age 的內含則為 18