CGI腳本入門學習

CGI腳本是什麽?

CGI腳本是怎樣工作的?

一個簡單的例子

我能用CGI腳本嗎?

你的服務器配置答應CGI腳本嗎?

你能編程嗎?

你應該用什麽編程語言?

你的服務器設置正確嗎?

假如你的服務器不是UNIX系統呢?

解剖CGI腳本

輸出頭部

輸出數據部

帶闡述的腳本

傳遞其他信息給腳本

創建非凡的腳本輸出

以裝載另一個文本響應

無響應

處理表單的腳本

表單格式和表單腳本

GET 和 POST

URL 編碼

問題

CGI 變量

解碼程序

uncgi

cgi-lib.pl

解碼文件上傳的輸入

自己做

非解剖的頭部腳本

總結

學習CGI腳本(腳本)CGI 意思爲 Common Gateway Interface, 一種基于浏覽器的輸入、在Web服務器上運行的程序方法. CGI腳本 使你的浏覽器與用戶能交互,爲了在數據庫中尋找一個名詞, 提供你寫入的評論,或者從一個表單中選擇幾個條目並且能得到一個明確的回答. 假如你曾經碰到過在web上填表或進行搜索, 你就是用的CGI腳本. 你那時也許沒有意識到,因爲大部分工作是在服務器上運行的,你看到的只是結果.

作爲一個網頁設計者, 你創建客戶端的 CGI腳本, 服務器端的程序用來處理用戶輸入, 結果返回給用戶.

在這裏你將學習關于CGI腳本的一切:

CGI腳本是什麽?它是怎樣工作的

一個CGI腳本輸出象什麽?

怎樣用參數或無參數創建一個CGI腳本

怎樣創建一個返回規定響應的CGI腳本

怎樣創建一個輸入表單的CGI腳本

有關在使用CGI腳本中的問題

你能在腳本中使用的CGI變量

本章節假設在UNIX系統下的。

CGI腳本是什麽?CGI腳本簡單地講是個運行在Web服務器上的程序, 有浏覽器的輸入觸發. 這個腳本通常象服務器和系統中其他程序如數據庫的橋梁。

CGI 腳本難道不是一個真正的腳本?按照你的服務器的支持, 他們可能是一個編譯好的程序或者批命令文件或者其他可執行的東西. 爲了簡單起見,我們統稱他們爲腳本scripts.

CGI 腳本是任何運行在web服務器上的程序. CGI意思是Common Gateway Interface。

CGI腳本是用下列兩種方法使用的: 作爲一個表單的ACTION 或 作爲一個頁中的直接link。

CGI腳本是怎樣工作的?CGI腳本有服務器調用, 基于浏覽器的數據輸入. 圖1 顯示在浏覽器、服務器和腳本之間是怎樣的一個流程.

圖1. 從浏覽器到服務器到腳本到程序 記住再回來噢!

這有個簡短的示意解釋:

一個URL指向一個CGI腳本. 一個CGI腳本的URL能如普通的URL一樣在任何地方出現。

服務器接收請求, 按照那個URL指向的腳本文件(注重文件的位置和擴展名),執行腳本.

腳本執行基于輸入數據的操作,包括查詢數據庫、計算數值或調用系統中其他程序.

腳本産生某種Web服務器能理解的輸出結果.

服務器接收來自腳本的輸出並且把它傳回浏覽器,讓用戶了解結果。

一個簡單的例子這裏具體一步一步地解釋所有有關發生的細節。

在圖2中有個例圖:

圖2. 帶有一個腳本連接的頁.

Display Date處是個指向CGI腳本的連接. 它的Html是這樣的: <A HREF="http://www.popchina.com/cgi-bin/getdate">Display the Date</A>

說明是個CGI腳本是因爲這裏面有個cgi-bin的路徑. 在許多服務器cgi-bin是僅能夠放置CGI腳本的目錄.

當你選擇這個連接時, 你的浏覽器將向www.popchina.com服務器提出請求. 服務器接收這個請求計算出URL處的腳本文件名然後執行這個腳本.

這個getdate腳本, 在UNIX系統中執行是這樣的: #!/bin/sh

echo Content-type: text/plain

echo

/bin/date

第一行是個非凡的命令,告訴UNIX系統這是個shell腳本; 真實的情況是從這行開始的下一行,這個腳本做兩件事:它輸出行Content-type: text/plain, 接著開始一個空行;第二, 它調用UNIX系統時間date程序, 這樣輸出日期和時間. 腳本執行後輸出應該這樣: Content-type: text/plain

Tue Oct 25 16:15:57 EDT 1994

這個Content-type是什麽東東?它是個非凡的編碼,Web服務器用來告訴浏覽器輸出這個文本是什麽類型的. 這與HTML中Content-type含義是一樣的。

這樣浏覽器的輸出就如圖3.

圖3 date腳本輸出結果.

這是最基本的,實際情況要複雜得多,總之可以用來理解浏覽器、服務器和腳本之間是怎樣工作的。

我能用CGI腳本嗎?在你使用CGI腳本之前,有兩件事你也許要解決:CGI腳本 是個高級的Web特性並且需要你和Web 服務器治理者一樣好的知識。

肯定嗎?就是做不到,學學也可以?好吧!讓我們繼續.

你的服務器配置答應CGI腳本嗎?爲了能寫和運行CGI腳本, 你需要一個Web服務器. 不象通常的HTML文件, 你不能在本地系統上寫或試驗你的CGI腳本; 你得通過Web服務器來做這個.

但是即使你有一個Web服務器, 這個服務器必須非凡地爲運行CGI腳本配置一下. 那意味著你所有的腳本必須放置在一個叫做cgi-bin的目錄下.

在編寫CGI腳本之前, 詢問你的服務器治理者是否答應你安裝和運行CGI腳本, 並且假如可以的話,他們必須放置在哪兒?還有,你必須有個真正的Web服務器,假如是FTP或Gopher服務器,那你就不能用CGI.

假如你在自己的服務器上運行, 你必須非凡地創造一個叫cgi-bin的目錄,並配置你的服務器認可這個目錄爲一個腳本目錄. 也必須記住下面有關CGI腳本特點:

每個腳本是個程序, 它運行在浏覽器可以請求的系統上, 執行時使用CPU時間和內存. 假如有成打上千的這些腳本同時運行,會怎樣?你的系統將不忍負載直至崩潰。

假如你不仔細地編寫你的CGI腳本, 你將有可能讓別人通過你的CGI腳本參數進入傷害你的系統.

你會編程嗎?初學者注重! 一般地, 你必須具備一些基本編程概念與方法。你必須有類似系統工作的經驗。假如你沒有這些背景, 你必須去學習,好了,費話不多說.

你必須用什麽編程語言?你可以用你熟悉的任何語言編寫CGI腳本, 只要你的腳本遵守下一節所陳列的規則即可,只要那個語言能在你的Web服務器系統上運行.

在這本學習手冊中,僅用兩種語言編寫CGI腳本: UNIX shell和 Perl語言. 這個shell是適合在任何相近的UNIX系統上運行並且輕易學習, 但是處理複雜的情況就困難了. Perl, 就要用這個語言了, 它是免費的, 這個語言是穩定和強大的,類似C,但它也是較難學習的.

你的服務器設置正確了嗎?爲了運行任何一個CGI腳本, 不管簡單或複雜的,你的服務器必須設置成能夠運行他們,必須放置在一個特定的目錄,必須有一個依靠你服務器設定的文件擴展名.

假如你是租用服務器,就要是否答應運行CGI腳本.

假如你擁有自己的服務器,檢查你的服務器說明書是怎樣處理CGI腳本的.

假如你用的不是UNIX?只好再找別的學習手冊了。

解剖一個CGI腳本假如你編寫它很久,克服很多警告和配置,恭喜你,你已經會些CGI腳本,並且可以在你的網頁上使用了. 在這一章,將學習腳本是怎樣執行,你的服務器又是怎樣與他們對話産生回應的。

輸出頭部雖然你的CGI腳本可以讓你做任何事情,但是腳本的輸出還是必須有一個規定形式.

這個 "腳本輸出" 意思是指你的腳本發回服務器的數據. 在UNIX系統中, 輸出是發向標准輸出, 服務器從那兒檢測它. 在其他系統和服務器, 你的腳本輸出也許不一樣了.

這個頭部是實際不是文本的一部分,是服務器與浏覽器之間的信息協議,你實際看不到。

有三個類型的頭部: Content-type, Location, 和Status. Content-type 最普遍的。

有關content-type解釋可以見有關HTML的說明, 一個你可以發出的特定編碼象這樣: Content-type: text/html

在這個例子中,輸出數據的類型是text/html; 換句話說, 他是個HTML文件.

表1. 通用格式和content-types.

Format

Content-Type

HTML

text/html

Text

text/plain

GIF

image/gif

JPEG

image/jpeg

PostScript

application/postscript

MPEG

video/mpeg

注重content-type 後面必須跟一個空行. 假如你沒有空行,服務器將無法搞清這個頭部在哪裏結束。

輸出數據你輸出的數據應該符合你所規定的content-type; 假如content-type是text/html, 輸出安置應該是在HTML. 假如content-type是image/gif, 輸出應該是在一個二進制的GIF文件.

練習1: 小試試.T這是個簡單的輸出日期的簡單腳本,這個CGI腳本還檢查看看我是否已經登陸到我的Web服務器,並且報告發現了什麽(如在圖4).

圖4. 腳本的結果

這是個很簡單的例子, 他能這樣備調用: <A HREF="http://www.popchina.com/cgi-bin/pinglaura">Is Laura Logged in?</A>

這是沒有輸入的腳本,它只運行並且返回數據.

根據前面的闡述,這個腳本內容是這樣::

#!/bin/sh

echo Content-type: text/html

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>"

echo "</HEAD><BODY>"

爲了測試我是否已經登陸系統,用who命令(我的登陸名假設爲lemay), 儲存結果在變量ison中. 假如我登陸, 變量ison將有些內容,否則則是空的. ison='who | grep lemay'

試驗結果及返回相應提示的腳本是這樣: if [ ! -z "$ison" ]; then

echo "<P>Laura is logged in."</P>

else

echo "<P>Laura isn't logged in."</P>

fi

最後關閉HTML: echo "</BODY></HTML>"

現在你通過從命令行運行他,測試一下,你將得到一個結果說我未登陸你的系統,當然不可能的,他的輸出是這樣的: Content-type: text/html

<HTML><HEAD>

<TITLE>Are You There?</TITLE>

</HEAD><BODY>

<P>Laura is not logged in.

</BODY></HTML>

這是輸出的一個HTML文本,這樣你的浏覽器能正常顯示他,因爲他是個HTML文件。

現在將他copy到你的服務器的cgi-bin目錄下,去執行,假如你不能達到CGI-bin目錄,你必須詢問你的服務器治理者,你不能理所當然地自己建立個CGI-bin目錄,那沒用的。

這個例子完整的腳本如下: #!/bin/sh

echo "Content-type: text/html"

echo

echo "<HTML><HEAD>"

echo "<TITLE>Is Laura There?</TITLE>"

echo "</HEAD><BODY>"

ison='who | grep lemay'

if [ ! -z "$ison" ]; then

echo "<P>Laura is logged in"

else

echo "<P>Laura isn't logged in"

fi

echo "</BODY></HTML>"

帶有參數的腳本爲了傳遞一個參數給腳本,可以在URL中使用 (?) 插入腳本名詞和參數之間, 用加號(+) 表示每個單一的參數, 如: <A HREF="/cgi-bin/myscript?arg1+arg2+arg3">run my script</A>

當服務器接收到這個請求,它傳遞 arg1, arg2, 和 arg3 參數給腳本. 你然後能在腳本中使用這些參數.

這個方法有時叫查詢, 因爲早期它用在搜索功能中.

練習2: 檢查是否有人登陸.既然你知道怎樣使用參數,讓我們繼續上面的例子pinglaura,通過修改這個例子我們得到下面這個腳本pinggeneric.

我們取個不同題目: #!/bin/sh

echo "Content-type: text/html"

echo

echo "<HTML><HEAD>"

echo "<TITLE>Are You There?</TITLE>"

echo "</HEAD><BODY>"

在上面的例子中, 下一步應該是測試我是否登陸,在這裏我們用參數${1}代替我的名字lemay, ${1}作爲第一個參數, ${2}作爲第二個, ${3}作爲第三個. ison='who | grep "${1}"'

剩下的所有修改如下: if [ ! -z "$ison" ]; then

echo "<P>$1 is logged in"

else

echo "<P>$1 isn't logged in"

fi

echo "</BODY></HTML>"

好了,讓我們修改HTML頁中的連接吧!原來是這樣: <A HREF="http://www.lne.com/cgi-bin/pinglaura">Is Laura Logged in?</A>

修改爲通用查詢功能後是這樣,比如查詢名字叫john的人是否登陸: <A HREF="http://www.lne.com/cgi-bin/pinggeneric?john">Is John Logged in?</A>

在你的服務器上試試,看是否有結果。

傳遞其他信息給腳本有第二種方法傳遞信息給CGI腳本. 它叫作路徑信息path information 用作那些在腳本調用是不用變更的參數, 象一個臨時文件名或調用腳本自己的文件名. 正如你看到的,在上面的例子問號後面的參數是因用戶表單的輸入而改變的. 路徑信息Path info用作其他信息傳遞給腳本,實際上,你可以用它作任何事情.

路徑信息Path information是一種不象通常參數腳本那樣頻繁傳遞信息的方法. 路徑Path information通常是指Web服務器上的那些比如配置文件、臨時文件或者被腳本因問題調用的文件等等此類文件.

看下面一個路徑信息path information例子, : http://myhost/cgi-bin/myscript/remaining_path_info?arg1+arg2

當腳本運行時,在路徑中的信息將被放置于環境參數PATH_INFO. 你能在你的腳本內容中使用這些信息.

比如說, 讓我們假設你在多頁上已有多個連接到同一個腳本. 你能用這個路徑信息顯示那個有連接的HTML文件名. 這樣, 在你完成處理你的腳本之後, 當你發回一個HTML文件時, 你能在這個文件裏包含一個連接,發回用戶一開始那個頁。

你會在下一章節學到更多路徑信息:有用的表單和腳本. 待後來登出

創建一個非凡的腳本輸出現在你已經學習了諸如輸出數據 一般地HTML數據 發給浏覽器解釋顯示的數據. 但是假如你不想把腳本結果作爲一個數據流形式發回浏覽器,而是想把一個存在的頁發回,怎麽辦? 假如你只是要腳本做一些事而不讓任何結果回答給浏覽器,怎麽辦?

不用怕, 這裏開始解釋這些情況.

用調用另一個文本作爲響應CGI輸出不是非得一個數據流,有時可以告訴浏覽器是存在服務器上的一個頁,爲了發出這個信息,看下面的例子: Location: ../docs/final.html

這個Location行用作通常的輸出位置,也就是說,假如你用了Location, 你就不必再用象Content-type這樣的數據輸出(實際上,你也不能). 正如Content-type, 你也必須在這一行後面跟一個空行.

指向這個文件的路徑可以是一個URL或相對路徑. 所有相對路徑是指相對于腳本所在的位置. 例子中的final.html文本是在當前上一個目錄下docs的目錄下: echo Location: ../docs/final.html

echo

你不能Content-type 和 Location兩個輸出同時使用. 比如, 假如你想輸出一個標准頁,但是想在這個頁尾加上客戶的內容, 你就得用Content-type自行組建這兩個部分. 注重:你可以用腳本命令打開一個當地文件作爲數據直接將之輸出.

No Response有時對于一個CGI腳本也許一點沒有輸出. 有時你只是要從用戶那兒收集點信息. 你就不用再調用一個新文本, 也不用輸出結果或打開一個存在的文件. 在浏覽器上的屏幕還是那個樣子.

很幸運, 這一切很輕易. 你只要輸出下面這個命令即可(後面跟一個空行): echo Status: 204 No Response

echo

這個Status頭部提供狀態碼給服務器(並且也給浏覽器). 非凡的204將傳遞給浏覽器,假如能識別它,它將什麽也不做.

盡管無響應是一個官方HTTP規定的一部分,但也並不是適合所有的浏覽器,也許會産生希奇的結果,那你要多試驗試試看啦.

處理表單的腳本今天,大多數CGI腳本是用來處理表單輸入的. 這個過程大致象上面說闡述的一樣,但還是有些不同,比如CGI腳本只要被調用;數據怎樣從服務器被發向浏覽器.

記住, 大多數表單有兩個部分: HTML的表單格式;處理表單數據的CGI腳本. 這個CGI腳本使用標簽<FORM>屬性調用的.

表單形式和表單腳本正如上面所說,由于表單有兩個部分. 如下:

這個ACTION屬性包含著處理表單的腳本: <FORM ACTION="http://www.popchina.com/cgi-bin/processorscript">

在這個表單中, 每個輸入區都有一個NAME的屬性, 用來稱呼表單元素. 當這個表單數據被遞交給你在ACTION中定義的CGI腳本, 這樣這些name和輸入內容被作爲一個數字或字符傳遞給腳本.

GET 和 POST表單從浏覽器發給服務器有兩種方法. GET 和 POST.

我們上面談論的方法,實際是GET,它將數據打包放置在環境變量QUERY_STRING中作爲URL整體的一部分傳遞給服務器。

POST做很多類似GET同樣的事情, 不同的地方就是它是分離地傳遞數據給腳本. 你的腳本通過標准輸入獲取這些數據. (有些Web服務器是存儲在臨時文件中.) 這個QUERY_STRING環境變量將不再設置.

那你用那個方法呢? POST是個安全的方法, 尤其假如你的表單中有很多數據的話. 當你用GET, 這個服務器就分配變量QUERY_STRING給所有的表單數據, 但是這個變量可存儲量是有限的. 換句話說,假如你有很多數據但是你又用GET,你會丟失很多數據.

假如你用POST, 你可以盡可能多地使用數據, 因爲這些數據從來也不分配到一個變量裏.

URL 編碼URL 編碼是一種浏覽器用來打包表單輸入的格式. 浏覽器從表單中獲取所有的name和其中的值,將他們作爲name/value參數編碼, 移去那些不能傳送的字符, 將數據排行等等,這些還取決于你用GET還是POST?作爲URL的一部分或者分離地發給服務器. 不管哪種情況, 在服務器端的表單輸入格式樣子象這樣: theName=Ichabod+Crane&gender=male&status=missing&headless=yes

URL編碼遵循下列規則:

每對name/value由&符分開.

每對來自表單的name/value由=符分開. 假如用戶沒有輸入值給這個name,那麽這個name還是出現,只是無值(象這樣 "name=").

任何非凡的字符(就是那些不是簡單的七位ASCII,如漢字) 將以百分符%用十六進制編碼. 當然也包括象 =, &, 和 % 這些非凡的字符.

在輸入區中的空格將以加號+顯示. 因爲表單輸入是用這個URL編碼傳遞給你的腳本的,在你用這些參數之前必須解碼,因爲解碼是個很普遍的工作,可以有很多工具做這個工作 . 你沒有必要自己寫這個解碼程序.

這裏介紹一個叫uncgi的解碼程序, 你可以從http://www.hyperion.com/~koreth/uncgi.html. 得到原碼,安裝在你自己的cgi-bin目錄下.

練習3: 告訴我你的名字.讓我們以這個例子來說明,如圖5.

圖5. 告訴我你的名字的表單.

這個輸入被發給腳本, 然後發回顯示一個hello的信息(間圖.6).

假如你在姓名輸入處不輸入任何東東,會怎樣?見圖7.

圖6. 姓名表單的結果.

圖7. 另一個結果.

修改表單的HTML現在我們舉一個真實的例子: <FORM METHOD=POST ACTION="../cgi-bin/form-name">

</FORM>

假如你在用uncgi從input中解碼, 情況有點不同. 爲了是uncgi正常工作, 你首先必須調用uncgi , 假如uncgi是個目錄,加上實際的腳本名, 象這樣: <FORM METHOD=POST ACTION="../cgi-bin/uncgi/form-name">

</FORM>

這樣,你不必修改表單中原始的HTML; 原始的HTML可以工作得很好.

腳本處理表單輸入的是個CGI腳本, 讓我們來仔細地看看。

在腳本中第一步是解碼,在這個例子中, 我們已經使用uncgi解碼輸入數據, 實際這個表單已經爲你做好解碼. 通過建立一個uncgi的目錄,一旦表單遞交給服務器,服務器會自動進行解碼,這樣,所有的name/value已經預備就緒等待你的使用.

現在,一個例子開始部分假設是下面這樣: echo Content-type: text/html

echo

echo "<HTML><HEAD>"

echo "<TITLE>Hello</TITLE>"

echo "</HEAD><BODY>"

echo "<P>"

接下來,有兩種情況要處理:一件是處理用戶不輸入名字的情況,一個是假如輸入了向他們說hello.

這個Name元素的值, 是包含在WWW_theName環境變量中. 用一個簡單的測試命令(-z), 你能查看環境變量是否是空的還是包括相應的輸出值: if [ ! -z "$WWW_theName" ]; then

echo "Hello, "

echo $WWW_theName

else

echo "You don't have a name?"

fi

最後增加一個連接"go back" . 用來返回: echo "</P><P><A HREF="../lemay/name1.html">Go Back</A></P>"

echo "</BODY></HTML>"

問題這裏是使用CGI腳本比較普遍的問題:

腳本內容只顯示不執行.

你正確配置了你的服務器運行CGI腳本? 你的腳本是放置在cgi-bin目錄中嗎?假如你的服務器答應帶.cgi擴展名的CGI運行, 你的腳本文件名的擴展名是這樣嗎?

Error 500: Server doesn't support POST.

解答還是如上一條一樣,然後你用命令行執行你的CGI,可以正常運行嗎?是否有錯誤?.

Document contains no data.

確定你的頭部行和數據部之間有一空行.

Error 500: Bad Script Request.

確定你的腳本是可執行的(在UNIX, 用chmod +x 你的腳本.cgi). 在從浏覽器運行之前,你應當從命令行運行你的腳本,假如客戶端是win95,可以用telnet登陸你的服務器,執行命令行,當然必須了解UNIX命令.

CGI變量表2 總結那些環境變量.

表2. CGI 環境變量.

環境變量

意義

SERVER_NAME

CGI腳本運行時的主機名和IP地址.

SERVER_SOFTWARE

你的服務器的類型如: CERN/3.0 或 NCSA/1.3.

GATEWAY_INTERFACE

運行的CGI版本. 對于UNIX服務器, 這是CGI/1.1.

SERVER_PROTOCOL

服務器運行的HTTP協議. 這裏當是HTTP/1.0.

SERVER_PORT

服務器運行的TCP口,通常Web服務器是80.

REQUEST_METHOD

POST 或 GET, 取決于你的表單是怎樣遞交的.

HTTP_ACCEPT

浏覽器能直接接收的Content-types, 可以有HTTP Accept header定義.

HTTP_USER_AGENT

遞交表單的浏覽器的名稱、版本 和其他平台性的附加信息。

HTTP_REFERER

遞交表單的文本的 URL,不是所有的浏覽器都發出這個信息,不要依靠它

PATH_INFO

附加的路徑信息, 由浏覽器通過GET方法發出.

PATH_TRANSLATED

在PATH_INFO中系統規定的路徑信息.

SCRIPT_NAME

指向這個CGI腳本的路徑, 是在URL中顯示的(如, /cgi-bin/thescript).

QUERY_STRING

腳本參數或者表單輸入項(假如是用GET遞交). QUERY_STRING 包含URL中問號後面的參數.

REMOTE_HOST

遞交腳本的主機名,這個值不能被設置.

REMOTE_ADDR

遞交腳本的主機IP地址.

REMOTE_USER

遞交腳本的用戶名. 假如服務器的authentication被激活,這個值可以設置。

REMOTE_IDENT

假如Web服務器是在ident (一種確認用戶連接你的協議)運行, 遞交表單的系統也在運行ident, 這個變量就含有ident返回值.

CONTENT_TYPE

假如表單是用POST遞交, 這個值將是 application/x-www-form-urlencoded. 在上載文件的表單中, content-type 是個 multipart/form-data.

CONTENT_LENGTH

對于用POST遞交的表單, 標准輸入口的字節數.

表單輸入的解碼程序目前有兩個程序: 通用目的的uncgi, 和cgi-lib.pl, 這是個Perl庫,用于perl編寫的CGI腳本.

當然也有表單上載時可以解碼的程序,很少。

uncgi說明原碼可以從 http://www.hyperion.com/~koreth/uncgi.html獲得。

cgi-lib.pl這是由Steve Brenner編寫的, 幫助你治理輸入. 他能從GET和POST獲取輸入並且放置在一個Perl列表或陣列中. 更新的版本也能處理來自表單的文件上傳. 從這兒可以得到信息與原碼 http://www.bio.cam.ac.uk/cgi-lib. 假如你決定用Perl語言處理你的表單輸入,cgi-lib是個很好的庫.

爲了使用cgi-lib.pl,你通常要這樣寫:

#!/usr/lib/perl require 'cgi-lib.pl';

cgi-lib中盡管有很多子程序, 最重要的是ReadParse子程. ReadParse 讀取輸入方便地將name/value儲存在一個Perl陣列中. 在你的Perl腳本中通常是這樣調用的: &ReadParse(*in);

此例中,陣列名是in, 可以隨便取名的.

在表單輸入解碼後, 你能讀取和處理這個name/value,方法是象下面這樣: print $in{'theName'};

這個將顯示名字name是theName的值value.

假如你有多個用同樣名字的name對, cgi-lib.pl用(\0)分隔多個名字. 這樣可以正常處理你的腳本.

解碼上傳的文件輸入基于表單的文件上傳需要不同的表單輸入,有一些程序可以對其進行解碼。

cgi-lib.pl 後來版本可以很好支持, 在http://www.bio.cam.ac.uk/cgi-lib/ 了解更多的情況.

另一個處理用Perl編寫的CGI地址是 http://valine.ncsa.uiuc.edu/cgi_docs.html .

自己做找專門書籍學習吧: ftp://ds.internic.net/rfc/rfc1867.txt.

非解剖的腳本頭部按照本書闡述,大多數情況可以正常操作,在一些情況下不是這樣的,你可以翻閱說明書了解。

<ISINDEX> 腳本爲了在CGI中完成討論組, 我們看看叫<ISINDEX>的搜索. 這是早期在浏覽器中用來向服務器發出搜索要害字的辦法,參看以前的資料。

總結CGI腳本, 有時叫服務器端腳本或網關腳本。 在internet上有很多免費資源,你可以搜索下載讀懂他們,當然都是英文的,假如你下決心翻譯他們(可能更加強理解). 這樣一舉兩得啊.

注重:上述程序可以用ultra edit來編輯,注重轉換UNIX格式 ,必須采用UNIX格式存盤,再上載,用telnet登陸,在命令行鍵入perl sample.pl,看有無bug,再 在浏覽器中調用。CGI程序包括放置CGI的目錄一定要改屬性爲777, 要寫入的HTML文件也要改屬性爲777.

現在網上有很多免費的cgi,基本可以滿足一般需求,請到這個網址查詢你要的cgi:http://www.itm.com/cgicollection/

本人漢化了一個古老的通用留言簿,大家可以拿去做自己的留言簿。這裏下載

 
Cgi入門教程之:8 腳本解釋
現在讓我們看看這段代碼。 #!/usr/local/bin/perl # &readparse; print "Content-type: text/html\n\n"; #*****************BEGIN BODY************* --------------------------------------------------...查看完整版>>Cgi入門教程之:8 腳本解釋
 
CGI教程(8)記錄用戶記錄腳本
  記錄用戶記錄腳本  在<IMG>標簽使用一個指定CGI腳本的URL,可以在圖象被傳遞之前進行額外處理。額外的處理記錄了有關網頁當前用戶的詳細信息。這個額外信息將發送給CGI腳本來指定Action的正確的詳細數據...查看完整版>>CGI教程(8)記錄用戶記錄腳本
 
WMI 腳本入門:第二部分
Scripting Guys 繼續他們對編寫 WMI 腳本的討論,這次集中在 CIM 儲存庫和 CIM 類以幫助您巧用 WMI 腳本的全部強大功能。...查看完整版>>WMI 腳本入門:第二部分
 
WMI 腳本入門:第一部分
WMI 腳本入門:第一部分發布日期: 09/03/2004 | 更新日期: 09/03/2004Greg Stemp、Dean Tsaltas 和 Bob WellsMicrosoft CorporationEthan Wilansky網絡設計小組摘要:Scripting Guys 的第一個 Scripting Clinic專欄...查看完整版>>WMI 腳本入門:第一部分
 
輕松入門:IP寬帶接入網的學習筆記-組網技術
寬帶接入網還是比較常用的,于是我研究了一下IP寬帶接入網,在這裏拿出來和大家分享一下,希望對大家有用。在國內寬帶網絡建設的熱潮中,實達網絡與電信、網通、鐵通、聯通等各大電信運營商及寬帶駐地網運營商建立了...查看完整版>>輕松入門:IP寬帶接入網的學習筆記-組網技術