PHP 自動將 HTML 表單提交的資料轉換為超全域陣列 $_GET、$_POST、$_REQUEST,讓開發者能輕鬆存取用戶輸入。理解表單提交流程、方法差異、資料存取方式,是 PHP 開發入門關鍵。
method 屬性構建 HTTP 請求:
GET:查詢字串附加於 URL ?key=valPOST:資料置於請求主體$_GET/$_POST 存取資料<!DOCTYPE html>
<html lang="zh-TW">
<head>
<meta charset="UTF-8">
<title>簡單表單</title>
</head>
<body>
<form action="welcome.php" method="post">
<label>姓名: <input type="text" name="username"></label><br><br>
<label>年齡: <input type="number" name="age" min="1"></label><br><br>
<button type="submit">送出</button>
</form>
</body>
</html>
<?php
// 直接存取 $_POST 陣列
$username = $_POST['username'] ?? '訪客';
$age = (int)($_POST['age'] ?? 0);
echo "<h1>歡迎,$username!</h1>";
echo "<p>您的年齡是 $age 歲。</p>";
?>
| 特性 | $_GET | $_POST |
|---|---|---|
| HTTP 方法 | GET | POST |
| 資料位置 | URL 查詢字串 | 請求主體 |
| 可見性 | 網址列完整顯示 | 不顯示於網址列 |
| 長度限制 | ~2000 字元 (URL 限制) | 受 post_max_size (預設 8MB) |
| 書籤/分享 | 可直接複製 URL | 無法直接分享 |
| 快取 | 瀏覽器/Proxy 可快取 | 不快取 |
| 適用場景 | 搜尋、分頁、唯讀查詢 | 登入、註冊、修改資料、上傳 |
| 安全性 | 敏感資料洩露風險高 | 相對較安全(仍需防護) |
$_REQUEST 預設包含 $_GET、$_POST、$_COOKIE。不建議常規使用,因來源不明確,易導致參數覆蓋衝突。僅在極少數需同時支援 GET/POST 的舊代碼中使用。
<?php
// 不推薦
$name = $_REQUEST['name'] ?? '';
// 推薦:明確指定來源
$name = $_POST['name'] ?? $_GET['name'] ?? '';
required, pattern, type="email" 等提升體驗value=""表單 action 指向自身,單一檔案處理顯示與驗證:
<?php
$name = $email = '';
$nameErr = $emailErr = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
if ($name === '') $nameErr = '姓名必填';
if ($email === '' || !filter_var($email, FILTER_VALIDATE_EMAIL)) $emailErr = 'Email 必填且格式正確';
if (!$nameErr && !$emailErr) {
echo "<p style='color:green'>提交成功!歡迎 $name</p>";
// 可選:PRG 重導向
}
}
?>
<form method="post" action="">
<label>姓名: <input type="text" name="name" value="<?php echo htmlspecialchars($name); ?>">
<?php if ($nameErr) echo "<span style='color:red'>$nameErr</span>"; ?><br>
<label>Email: <input type="email" name="email" value="<?php echo htmlspecialchars($email); ?>">
<?php if ($emailErr) echo "<span style='color:red'>$emailErr</span>"; ?><br>
<button type="submit">送出</button>
</form>
輸出用戶資料時必須編碼,防止 XSS:
<?php
echo htmlspecialchars($userInput, ENT_QUOTES, 'UTF-8');
// 將 & " ' < > 轉為 HTML 實體
| 問題 | 原因 | 解決 |
|---|---|---|
| Undefined array key | 直接存取不存在的鍵 | 使用 ?? 或 isset() |
| 中文亂碼 | 編碼不一致 | HTML meta charset=UTF-8、PHP 檔案 UTF-8、DB 連線 UTF-8 |
| 檔案上傳 $_POST 為空 | enctype 錯誤 | enctype="multipart/form-data" |
| 核取方塊未勾選不在 $_POST | HTML 標準行為 | 用 isset($_POST['chk']) 判斷 |
<input type="file" name="photos[]" multiple>
<?php
foreach ($_FILES['photos']['tmp_name'] as $idx => $tmp) {
if ($_FILES['photos']['error'][$idx] === UPLOAD_ERR_OK) {
move_uploaded_file($tmp, "uploads/{$_FILES['photos']['name'][$idx]}");
}
}
?>
掌握表單處理基礎,理解 GET/POST 差異、資料流向、安全原則,是 PHP 開發的核心技能。從簡單的自我提交表單開始,逐步建構驗證、安全、用戶體驗完整的表單系統。