HTML 表單是 Web 互動的基礎。PHP 自動將提交的表單資料填入超全域陣列 $_GET、$_POST、$_REQUEST。本文系統講解單值欄位、多值欄位 (核取方塊群、多選下拉選單)、檔案上傳欄位的訪問方式、資料驗證與安全過濾最佳實踐。
<form action="handle.php" method="POST">
<input type="text" name="username" />
<input type="password" name="password" />
<input type="submit" value="登入" />
</form>
method="GET":資料附加在 URL 查詢字串,適用於冪等查詢、可書籤分享。method="POST":資料在 HTTP Body,適用於狀態變更 (登入、發文、刪除),支援大量資料與檔案上傳。<?php
// handle.php
$username = $_POST['username'] ?? ''; // PHP 7+ 空合併運算子
$password = $_POST['password'] ?? '';
// 基本驗證
if ($username === '') {
die('請輸入帳號');
}
// ... 後續邏輯
?>
?? 或 isset() 避免 Undefined array key 警告。htmlspecialchars(),進入 SQL 用參數化查詢。[] 結尾<!-- 核取方塊群 -->
<input type="checkbox" name="colors[]" value="red" /> 紅
<input type="checkbox" name="colors[]" value="green" /> 綠
<input type="checkbox" name="colors[]" value="blue" /> 藍
<!-- 多選下拉選單 -->
<select name="sizes[]" multiple>
<option value="S">S</option>
<option value="M">M</option>
<option value="L">L</option>
<option value="XL">XL</option>
</select>
<?php
$colors = $_POST['colors'] ?? []; // 若未勾選任何,預設空陣列
$sizes = $_POST['sizes'] ?? [];
// 迭代處理
foreach ($colors as $color) {
echo "選擇顏色:$color<br>";
}
// 統計數量
echo "共選擇 " . count($colors) . " 種顏色";
// 安全:白名單驗證
$allowedColors = ['red', 'green', 'blue'];
$colors = array_intersect($colors, $allowedColors);
注意:若表單中同名單一欄位 (無 []),後提交的值會覆蓋前值,僅保留最後一個。
<form action="upload.php" method="POST" enctype="multipart/form-data">
<input type="file" name="avatar" />
<input type="submit" />
</form>
<?php
$file = $_FILES['avatar'] ?? null;
if ($file && $file['error'] === UPLOAD_ERR_OK) {
$tmpName = $file['tmp_name'];
$origName = $file['name'];
$size = $file['size'];
$mime = mime_content_type($tmpName); // 或 finfo
// ... 驗證、移動、儲存
}
?>
$_REQUEST 預設合併 $_GET、$_POST、$_COOKIE (受 request_order 影響)。不建議使用,原因:
$_GET (查詢/分頁)、$_POST (狀態變更)、$_COOKIE (偏好設定)。<?php
// 1. 過濾輸入 (filter_input / filter_var_array)
$filters = [
'username' => FILTER_SANITIZE_STRING,
'age' => ['filter' => FILTER_VALIDATE_INT, 'options' => ['min_range' => 1, 'max_range' => 120]],
'email' => FILTER_VALIDATE_EMAIL,
'colors' => ['filter' => FILTER_DEFAULT, 'flags' => FILTER_REQUIRE_ARRAY], // 陣列
];
$input = filter_input_array(INPUT_POST, $filters);
// 2. 針對特定業務規則再驗證
if (empty($input['username'])) throw new Exception('用戶名必填');
if ($input['age'] === false) throw new Exception('年齡格式錯誤');
// 3. 輸出編碼 (視語境)
echo '<div>' . htmlspecialchars($input['username'], ENT_QUOTES, 'UTF-8') . '</div>';
| 問題 | 原因 | 解決 |
|---|---|---|
| 核取方塊未勾選時 $_POST 沒有該鍵 | 瀏覽器不發送未勾選的 checkbox | 使用 $_POST['colors'] ?? [] 提供預設空陣列 |
| 多選下拉選單只取到最後一個值 | name 未加 [] | 改為 name="sizes[]" |
| 中文亂碼 | 頁面/資料庫/連線編碼不一致 | 全鏈路 UTF-8:HTML <meta charset="utf-8">、PHP header('Content-Type: text/html; charset=utf-8')、資料庫 SET NAMES utf8mb4 |
| 大檔案上傳失敗 | php.ini 限制 | 調大 upload_max_filesize、post_max_size、memory_limit、max_execution_time |
掌握 PHP 表單處理的核心在於:名稱加 [] 獲取陣列、明確使用 $_GET/$_POST、輸入過濾輸出編碼、檔案上傳驗證 MIME 與副檔名。將這些最佳實踐內化為肌肉記憶,能讓你寫出安全、健壯、易維護的表單處理代碼。