結合PHP使用HTML表單(2)
來源:互聯網
上載者:User
清單 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 />";
}
...
然而,有時問題不是值太多,而是根本沒有