表單是 Web 交互核心。本文通過一個完整的註冊表單示例,涵蓋 HTML 構建、各類輸入控件用法、POST 數據接收、服務端驗證、安全防護,幫助初学者建立標準化表單處理流程。
<form action="register.php" method="post" accept-charset="UTF-8">
<table>
<tr>
<td>用戶名:</td>
<td><input type="text" name="username" value="" maxlength="20" required /></td>
</tr>
<tr>
<td>密碼:</td>
<td><input type="password" name="password" maxlength="20" required /></td>
</tr>
<tr>
<td>年齡段:</td>
<td>
<select name="age">
<option value=">16">16 歲以下</option>
<option value="16-30" selected>16-30 歲</option>
<option value="31-50">31-50 歲</option>
<option value="51-80">51-80 歲</option>
</select>
</td>
</tr>
<tr>
<td valign="top">自我介紹:</td>
<td><textarea name="intro" rows="3" cols="50" placeholder="請輸入自我介紹"></textarea></td>
</tr>
<tr>
<td>喜歡運動:</td>
<td>
<label><input type="radio" name="sport" value="tennis" checked> 網球</label>
<label><input type="radio" name="sport" value="football"> 足球</label>
<label><input type="radio" name="sport" value="basketball"> 籃球</label>
</td>
</tr>
<tr>
<td>擅長語言:</td>
<td>
<label><input type="checkbox" name="lang[]" value="php"> PHP</label>
<label><input type="checkbox" name="lang[]" value="java"> Java</label>
<label><input type="checkbox" name="lang[]" value="python"> Python</label>
<label><input type="checkbox" name="lang[]" value="go"> Go</label>
</td>
</tr>
<tr>
<td>開發工具:</td>
<td>
<select name="ide[]" multiple size="4">
<option value="vscode" selected>VS Code</option>
<option value="phpstorm">PhpStorm</option>
<option value="sublime">Sublime Text</option>
<option value="other">其他</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="hidden" name="source" value="register_form" />
<button type="submit" name="btn_submit">提交註冊</button>
</td>
</tr>
</table>
</form>
method="post":數據不顯示在 URL,適合敏感信息name="lang[]":方括號讓 PHP 自動解析為數組multiple:允許 <select> 多選required:HTML5 瀏覽器端非空校驗(僅輔助)hidden:傳遞不可见標識(如來源、CSRF Token)<?php
// 1. 判斷是否為表單提交
if ($_SERVER['REQUEST_METHOD'] !== 'POST' || !isset($_POST['btn_submit'])) {
die('非法請求');
}
// 2. 基礎清理函數
function clean($v) {
return is_array($v) ? array_map('clean', $v) : trim(htmlspecialchars($v, ENT_QUOTES, 'UTF-8'));
}
$_POST = clean($_POST);
// 3. 必填字段驗證
$required = ['username', 'password'];
foreach ($required as $field) {
if (empty($_POST[$field])) {
die("字段 {$field} 不能為空");
}
}
// 4. 業務規則驗證
if (strlen($_POST['username']) < 2 || strlen($_POST['username']) > 20) {
die('用戶名長度 2-20 位');
}
if (strlen($_POST['password']) < 8) {
die('密碼至少 8 位');
}
// 5. 處理數組類型字段
$languages = $_POST['lang'] ?? [];
$ides = $_POST['ide'] ?? [];
// 6. 處理換行符 (textarea)
$intro = nl2br($_POST['intro'] ?? '');
// 7. 輸出結果 (實際項目這裡寫入數據庫、發送郵件等)
echo "<h3>提交成功,數據如下:</h3>";
echo "用戶名: {$_POST['username']}<br>";
echo "年齡段: {$_POST['age']}<br>";
echo "運動: {$_POST['sport']}<br>";
echo "語言: " . implode(', ', $languages) . "<br>";
echo "工具: " . implode(', ', $ides) . "<br>";
echo "介紹: {$intro}<br>";
echo "來源: {$_POST['source']}<br>";
?>
| 風險 | 對策 |
|---|---|
| XSS 跨站腳本 | 輸出時 htmlspecialchars();輸入端 strip_tags() 或 HTMLPurifier |
| CSRF 跨站請求偽造 | 表單隱藏域加入 <input type="hidden" name="_token" value="= $_SESSION['csrf_token'] ?>">,驗證 token |
| SQL 注入 | 使用 PDO 預處理語句 $stmt->execute([$username, $hash]) |
| 密碼明文存儲 | password_hash($pwd, PASSWORD_DEFAULT) 存儲,password_verify() 驗證 |
| 重復提交 | PRG 模式:處理後 header('Location: success.php') 重定向 |
<?php
// register.php 處理邏輯結尾
if ($insertSuccess) {
$_SESSION['flash_message'] = '註冊成功!';
header('Location: register_success.php');
exit;
}
?>
成功頁面 register_success.php 讀取並刪除 $_SESSION['flash_message'] 顯示。
規範的表單處理流程:HTML 構建 → 瀏覽器基礎校驗 → POST 提交 → 服務端清理/驗證 → 業務邏輯 → PRG 重定向 → 成功頁。掌握這套流程,能避開 90% 的表單相關安全與體驗問題。