最近更新: 2006-12-26

處理表單複選項目, 於表單中使用陣列

php_syntax

HTML 表單傳送給 PHP 的資料, PHP 會自動儲存在全域陣列中,例如以 POST method 送出的表單資料便儲存在 $_POST 全域陣列,以 GET method 送出的表單資料儲存在 $_GET 全域陣列。如果我們為表單元件命名 (指派了 name 屬性) ,則可以表單元件名稱為陣列鍵值。例如表單有一個名稱為 "userAddress" 的文字輸入欄位 <input name="userAddress" type="text"/> ,且此表單以 POST method 送出,則 PHP 中可以 $_POST['userAddress'] 取得使用者在此欄位中輸入的資料。上述是 PHP 處理表單資料的基本概念。

然而當我們需要處理表單複選元件,如 checkbox 時,便會遇到一個問題,即同一組複選項目元件會使用相同的名稱,而傳回 PHP 後按上述的基本概念,我們只能取得使用者勾選的最後一個項目的資料,而無法取得使用者勾選的所有項目資料。

為了測試本文所說的內容,先看一個表單測試的 php 程式,它的功用只是接收來自表單的資料,並將使用者輸入於名為 price 的表單元件之資料內容顯示在頁面上。

form.php
<?php
if (is_array($_POST['price'])) {
    foreach ($_POST['price'] as $price) {
        echo $price, '<br/>';
    }
}
else {
    echo $_POST['price'];
}
?>

接著下面展示包含複選項目元件 (checkbox) 的網頁表單內容,該表單中的複選項目 (price) 無法在 PHP 中正確取得, form.php 只會顯示使用者最後一個勾選項目的內容。

form1.html
<form method="post" action="form.php">
<label><input name="price" type="checkbox" value="0"/>0</label><br/>
<label><input name="price" type="checkbox" value="10"/>10</label><br/>
<label><input name="price" type="checkbox" value="50""/>50</label><br/>
<button type="submit">Submit</button>
</form>

若欲正確取得複選項目元件的資料便需要告知 PHP 此表單元件為一資料集合的型式,亦即陣列型態, PHP 才會以陣列型態儲存使用者所勾選的項目資料。宣告表單元件為陣列型態的語法是在表單複選項目元件的名稱後添加一對方括號,例如 price[] ,如此 PHP 才會將 $_POST['price']$_GET['price'] 的型態設為可包含多個資料的陣列。而且只有被勾選的項目會回傳,所以 $_POST['price']$_GET['price'] 中的內容,就是使用者勾選的內容。

form2.html
<form method="post" action="form.php">
<label><input name="price[]" type="checkbox" value="0"/>0</label><br/>
<label><input name="price[]" type="checkbox" value="10"/>10</label><br/>
<label><input name="price[]" type="checkbox" value="50""/>50</label><br/>
<button type="submit">Submit</button>
</form>

上列網頁表單將複選項目的名稱由 price 改為 price[] , PHP 就會將 $_POST['price'] 定義為陣列型態,於是在 form.php 中便可正確顯示所有使用者勾選的項目。

樂多舊網址: http://blog.roodo.com/rocksaying/archives/2600683.html