能較容易地對用戶通過 Html 表單提交的信息進行操作的能力一直是 PHP 的優勢之一。事實上,PHP 版本 4.1 添加了幾個訪問該信息的新方法並有效地除去了以前版本中最常用的一個方法。本文研究了使用 HTML 表單上提交的信息的不同方法,並同時使用了 PHP 較早的版本和較新的版本。本文首先從研究單個值開始,然後構建可以一般性地訪問任何可用的表單值的頁面。 注:本文假定您對運行 PHP 版本 3.0 或更高版本的 Web 服務器具有訪問權。您需要對 PHP 本身以及創建 HTML 表單有基本了解。
HTML 表單 在閱讀本文的過程中,您將看到不同類型的 HTML 表單元素如何提供 PHP 能夠訪問的信息。針對本示例,我使用了一個簡單的信息表單,它由兩個文本域、兩個復選框和一個允許多項的選擇框組成: 清單 1. HTML 表單 <html> <head><title>Tour Information</title></head> <body> <h2>Mission Information</h2> <form action="formaction.php"> <table width="100%"> <tr><td>Ship Name:</td><td><input type="text" name="ship" /></td></tr> <tr><td>Trip Date:</td><td><input type="text" name="tripdate" /></td></tr> <tr><td colspan="2">Mission Goals:</td></tr> <tr> <td><input type="checkbox" name="eXPloration" value="yes" /> Exploration</td> <td><input type="checkbox" name="contact" value="yes" /> Contact</td> </tr> <tr> <td valign="top">Crew species: </td> <td> <select name="crew" multiple="multiple"> <option value="xebrax">Xebrax</option> <option value="snertal">Snertal</option> <option value="gosny">Gosny</option> </select> </td> </tr> <tr><td colspan="2" align="center"><input type="submit" /></td></tr> </table> </form> </body> </html> 在沒有指定方法的情況下,該表單使用缺省方法 GET,浏覽器用它將表單值附加到 URL,如下所示: http://www.vanguardreport.com/formaction.php? ship=Midnight+Runner&tripdate=12-15-2433&exploration=yes&crew=snertal&crew=gosny 圖 1 顯示表單本身。 圖 1. HTML 表單 老辦法:訪問全局變量 清單 2 中顯示的代碼將表單值作為全局變量處理: 清單 2. 作為全局變量的表單值 <?php echo "Ship = ".$ship; echo "<br />"; echo "Tripdate = ".$tripdate; echo "<br />"; echo "Exploration = ".$exploration; echo "<br />"; echo "Contact = ".$contact; ?> 生成的 Web 頁面顯示提交的值: Ship = Midnight Runner Tripdate = 12-15-2433 Exploration = yes Contact = (正如您稍後將看到的那樣,Contact 沒有值,因為沒有選中那個框)。 清單 2 中的表示法當然是方便的,但它僅在 PHP 偽指令 register_globals 被設置為 on 時才可用。在版本 4.2 以前,這是缺省設置,許多 PHP 開發人員甚至沒有意識到有這樣的問題。然而,從版本 4.2 開始,register_globals 的缺省設置是 off,在此情況下,該表示法不能正常工作,因為不再用適當的值創建並初始化變量。 然而,您可以用其它的方法初始化這些變量。第一個方法是更改 register_globals 的值。許多使用共享服務器的開發人員無權為整個服務器更改該值,但可以針對某個特定站點改變行為。如您有 .htAccess 文件的訪問權,您可以通過添加以下偽指令啟用 register_globals: php_flag register_globals on 鑒於對該特性是否可用的不確定性,建議開發人員最好不要使用或依靠這種獲取變量的方法。那麼您有什麼選擇呢? 如果您的系統運行的是版本 4.1 或更高版本,則您的另一個選擇是使用 import_request_variables() 有選擇地注冊全局變量集合。您可以使用該函數導入 get、post 和 cookie 值,而且如果您願意的話,還可以給每項添加前綴。例如: <?php import_request_variables(gp, "formval_"); echo "Ship = ".$formval_ship; echo "<br />"; echo "Tripdate = ".$formval_tripdate; echo "<br />"; echo "Exploration = ".$formval_exploration; echo "<br />"; echo "Contact = ".$formval_contact; ?> 這裡,導入了 get 和 post 值 — 使用 c 來導入 cookie 值 — 而且由於 p 跟在 g 之後,所以 post 值將覆蓋同名的 get 值。 但如果您象許多開發人員一樣沒有運行版本 4.1 或更高版本,那怎麼辦呢?
訪問表單值集合 對於那些運行較早版本或不願使用全局變量的人來說,可以選擇使用 $HTTP_GET_VARS 和 $HTTP_POST_VARS 數組。盡管並不贊成使用這些集合,但它們仍然可用,而且仍被廣泛使用。當真的不再使用它們時,將用版本 4.1 中添加的 $_GET 和 $_POST 數組替代它們。 這兩類數組的類型都是散列表(hash table)。散列表是通過字符串值而不是整數來建立索引的數組。使用表單時,可以通過值的名稱來訪問值,如 清單 3 所示: 清單 3. 通過散列表訪問表單值 <? $ship_value = $HTTP_GET_VARS['ship']; echo $ship_value; echo "<br />"; $tripdate_value = $HTTP_GET_VARS['tripdate']; echo $tripdate_value; echo "<br />"; $exploration_value= $HTTP_GET_VARS['exploration']; echo $exploration_value; echo "<br />"; $contact_value = $HTTP_GET_VARS['contact']; echo $contact_value; ?> 使用該方法,您可以通過名稱來檢索每個字段的值。
單名,多值 到現在為止,每個名稱僅對應一個值。如果有多個值會怎樣?例如,crew species 列表框允許用名稱 crew 提交多個值。 理想情況下,您希望將這些值作為數組使用,這樣就可以顯式地檢索它們。要實現這一點,您必須對 HTML 頁面稍加改動。要作為數組提交的字段應該用方括號命名,如 crew[] 中: 清單 4. 修改 HTML 頁面 ... <td> <select name="crew[]" multiple="multiple"> <option value="xebrax">Xebrax</option> <option value="snertal">Snertal</option> <option value="gosny">Gosny</option> </select> </td> ... 一旦您作出更改,檢索表單值實際上產生數組: 清單 5. 將變量作為數組訪問 ... $crew_values = $HTTP_GET_VARS['crew']; echo "0) ".$crew_values[0]; echo "<br />"; echo "1) ".$crew_values[1]; echo "<br />"; echo "2) ".$crew_values[2]; ... 現在,提交頁面後會顯示多個值: 0) snertal 1) gosny 2) 首先要注意這是一個下標從 0 開始的數組。第一個遇到的值在位置 0 中,接下來的值在位置 1,以此類推。在本例中,我只提交了兩個值,所以第三項為空。 通常,您不知道將提交多少項,因此您可以利用它是數組這一事實使用 sizeof() 函數來確定提交了多少值,而不必直接調用每一項: 清單 6. 確定數組的大小 ... for ($i = 0; $i < sizeof($crew_values); $i++) { echo $crew_values[$i]; echo "<br />"; } ... 然而,有時問題不是值太多,而是根本沒有值。 令人驚奇的消失的復選框 復選框只有實際被選中時才被提交,認識到這一點很重要。否則,它的消失將告訴您所需知道的實情:用戶沒有單擊復選框。使用復選框時,您可以使用 isset() 函數顯式地檢查是否設置了值: 清單 7. 檢查是否提交了復選框 ... $contact_value = $HTTP_GET_VARS['contact']; echo $contact_value; if (isset($contact_value)) { //The checkbox was clicked } else { //The checkbox wasn't clicked } ...
獲取所有表單值 復選框字段只是您對預期表單值名稱可能不完全有把握的情形的示例之一。通常,您會發現有一個以通用方法訪問所有表單值的例程是很有用的。 幸運的是,因為 $HTTP_GET_VARS 及其同類只是