首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 處理 HTML 表單:單一與多值欄位訪問完整指南 ($_GET/$_POST/$_REQUEST)

     編輯:PHP 相關知識

前言

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 警告。
  • 永不信任用戶輸入,輸出到 HTML 前必經 htmlspecialchars(),進入 SQL 用參數化查詢。

三、多值欄位:核取方塊群與多選下拉選單

HTML 關鍵:name 以 [] 結尾

<!-- 核取方塊群 -->
<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 訪問:自動轉為陣列

<?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);

注意:若表單中同名單一欄位 (無 []),後提交的值會覆蓋前值,僅保留最後一個。

四、檔案上傳欄位 ($_FILES)

<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 的使用建議

$_REQUEST 預設合併 $_GET、$_POST、$_COOKIE (受 request_order 影響)。不建議使用,原因:

  1. 來源模糊,易導致安全漏洞 (Cookie 覆蓋 POST 參數)。
  2. 語意不清,降低代碼可讀性。
  3. 明確使用 $_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>';

七、常見問題 FAQ

問題原因解決
核取方塊未勾選時 $_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 與副檔名。將這些最佳實踐內化為肌肉記憶,能讓你寫出安全、健壯、易維護的表單處理代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved