Radio 按鈕透過相同的 name 屬性形成互斥群組,提交時僅送出被選中的那一個值。PHP 接收到的是標量(字串/數字),而非陣列。
<form method="post">
<label><input type="radio" name="sex" value="1"> 男</label>
<label><input type="radio" name="sex" value="2"> 女</label>
<label><input type="radio" name="sex" value="3"> 不公開</label>
<button type="submit">送出</button>
</form>
<?php
$sex = $_POST['sex'] ?? $_GET['sex'] ?? null;
// $sex 為 '1'、'2'、'3' 或 null(未選擇)
// 建議:白名單驗證
$allowed = ['1','2','3'];
if (!in_array($sex, $allowed, true)) {
$sex = null; // 或預設值
}
?>
<?php
$selected = $_POST['sex'] ?? $_GET['sex'] ?? '1'; // 預設男
$options = ['1' => '男', '2' => '女', '3' => '不公開'];
foreach ($options as $value => $label) {
$checked = ($value == $selected) ? ' checked' : '';
echo "<label><input type=\"radio\" name=\"sex\" value=\"$value\"$checked> $label</label> ";
}
?>
<?php
// 資料庫儲存 'M'/'F',介面用 'male'/'female'
$map = ['male' => 'M', 'female' => 'F'];
$revMap = array_flip($map); // ['M'=>'male', 'F'=>'female']
$dbValue = 'M'; // 從 DB 讀出
$selected = $revMap[$dbValue] ?? 'male'; // 對應到介面值
$options = ['male' => '男性', 'female' => '女性'];
foreach ($options as $val => $label) {
$checked = ($val == $selected) ? ' checked' : '';
echo "<label><input type=\"radio\" name=\"gender\" value=\"$val\"$checked> $label</label> ";
}
?>
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
if($_POST['sex'] != "女") echo "checked" | 字串比較脆弱、多語系不適用 | 用鍵值映射,比較標準化值 |
| 未給預設值,導致全部未選 | 表單提交失敗回顯時無預設 | 提供合理預設 $selected = $input ?? 'default' |
| 同一組 name 重複出現在不同 form | 瀏覽器會混淆群組 | 確保 name 全域唯一或隔離在不同 form |
| value 使用中文 | URL 編碼、編碼不一致、難維護 | value 用英文/數字代碼,label 顯示中文 |
function renderRadioGroup(string $name, array $options, $selected, array $attrs = []): string
{
$attrStr = '';
foreach ($attrs as $k => $v) $attrStr .= ' ' . $k . '="' . htmlspecialchars($v) . '"';
$html = '';
foreach ($options as $value => $label) {
$checked = ($value == $selected) ? ' checked' : '';
$html .= "<label$attrStr><input type=\"radio\" name=\"" . htmlspecialchars($name) . "\" value=\"" . htmlspecialchars($value) . "\"$checked> " . htmlspecialchars($label) . "</label> ";
}
return $html;
}
// 使用
$options = ['1' => '男', '2' => '女', '3' => '不公開'];
$selected = $_POST['sex'] ?? '1';
echo renderRadioGroup('sex', $options, $selected, ['class' => 'form-check-input']);
TINYINT / ENUM('M','F','N') / CHAR(1) 儲存代碼,避免儲存中文。const GENDER_MALE = 'M'; 等,避免魔術字串散落。<label> 包裹 input,或 for 對應 id,點擊文字即可選取。<fieldset><legend>性別</legend>...</fieldset>,螢幕閱讀器可識別群組語意。Radio 單選本質簡單:同名分組、單一值提交、鍵值映射預選。掌握「標準化值在後端流轉、介面值只在模板出現」原則,配合白名單驗證與通用渲染函數,即能寫出健壯、可維護的單選邏輯。