所有表單元素的值均透過 name 屬性作為鍵,在 $_POST (或 $_GET) 陣列中取得。name 唯一性是正確接收資料的關鍵。
HTML:
<input type="checkbox" name="interests[]" value="coding"> 程式設計
<input type="checkbox" name="interests[]" value="design"> 設計
<input type="checkbox" name="interests[]" value="music"> 音樂
PHP 處理:
<?php
if (!empty($_POST['interests'])) {
echo "您選擇的興趣:";
foreach ($_POST['interests'] as $interest) {
echo htmlspecialchars($interest) . " ";
}
} else {
echo "未選擇任何項目";
}
?>
關鍵: name="interests[]" 讓 PHP 自動建立陣列,count() 可得選擇數量。
HTML:
<form method="post">
帳號: <input type="text" name="username" size="20"><br>
密碼: <input type="password" name="password" size="20"><br>
隱藏: <input type="hidden" name="csrf_token" value="= $token ?>"><br>
備註: <textarea name="note" rows="4" cols="40"></textarea><br>
<button type="submit" name="action" value="login">登入</button>
</form>
PHP 處理:
<?php
if (($_POST['action'] ?? '') === 'login') {
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? ''; // 密碼不 trim,保留前後空白 (若為合法字元)
$token = $_POST['csrf_token'] ?? '';
$note = $_POST['note'] ?? '';
// 驗證 CSRF Token
if (!hash_equals($_SESSION['csrf_token'] ?? '', $token)) {
die('CSRF 驗證失敗');
}
// 後續驗證邏輯...
}
?>
HTML:
<form method="post">
性別:
<input type="radio" name="gender" value="male" checked> 男
<input type="radio" name="gender" value="female"> 女
<input type="radio" name="gender" value="other"> 其他
<button type="submit" name="submit" value="send">送出</button>
</form>
PHP 處理:
<?php
if (($_POST['submit'] ?? '') === 'send') {
$gender = $_POST['gender'] ?? 'unknown';
echo "您的性別:$gender"; // 僅會收到被選中的那一個 value
}
?>
注意: 同組單選鈕 必須同名,未選中時 $_POST['gender'] 不會被設定 (而非空字串)。
| 項目 | 做法 |
|---|---|
| 輸出編碼 | 所有輸出到 HTML 的使用者輸入必經 htmlspecialchars($val, ENT_QUOTES, 'UTF-8') |
| SQL 防注入 | 使用 PDO/MySQLi 預處理語句,絕不直接拼接 SQL |
| 檔案上傳 | $_FILES 陣列,驗證 MIME、副檔名、大小、隨機重命名、移至非公開目錄 |
| CSRF 保護 | 每張表單隱藏 csrf_token,Session 驗證,或使用 SameSite Cookie |
| 輸入驗證 | 白名單模式:型別、長度、格式、範圍、業務規則全檢查 |
| 錯誤回顯 | 保留使用者輸入 (含密碼除外),標示錯誤欄位,友善提示 |
$request->input('name')、$request->all()、$request->validate([...])