HTML 表單允許同名 input,ASP 自動以逗號合併,但 PHP 預設只保留最後一個值。本文提供兩種解決路徑:前端改造(標準做法)與純後端相容方案。
<input type="text" name="field" value="A">
<input type="text" name="field" value="B">
<input type="text" name="field" value="C">
// PHP $_POST['field'] 僅為 "C",A、B 丟失
<input type="text" name="field[]" value="A">
<input type="text" name="field[]" value="B">
<input type="text" name="field[]" value="C">
// PHP $_POST['field'] = ['A', 'B', 'C']
後端統一處理函數:
function input_treat($input) {
if (is_string($input)) {
return htmlentities(trim($input), ENT_QUOTES);
} elseif (is_array($input)) {
return implode(' ', array_map(function($v) {
return htmlentities(trim($v), ENT_QUOTES);
}, $input));
}
return false;
}
// 使用
$field = input_treat($_POST['field'] ?? '');
// 字串 → 處理後字串
// 陣列 → 以空格合併的字串
利用 php://input 讀取原始 POST 資料,手動解析合併同名欄位:
function get_submit_data() {
// 僅處理 application/x-www-form-urlencoded
if (($_SERVER['CONTENT_TYPE'] ?? '') !== 'application/x-www-form-urlencoded') {
return $_POST;
}
$raw = file_get_contents('php://input');
if (!$raw) return $_POST;
$result = [];
foreach (explode('&', $raw) as $pair) {
[$key, $val] = array_map('urldecode', explode('=', $pair, 2) + ['', '']);
$key = trim($key, " []");
$val = trim($val);
if (isset($result[$key])) {
$result[$key] .= ' ,' . $val; // 以逗號合併
} else {
$result[$key] = $val;
}
}
return $result;
}
// 在需要處理的入口
$_POST = get_submit_data();
// 之後正常使用 $_POST['field'] 即為 "A ,B ,C"
| 維度 | 前端陣列命名 | php://input 解析 |
|---|---|---|
| 標準合規 | ✓ HTML 標準 | ✗ 非標準 |
| 前端改動 | 需加 [] | 零改動 |
| 後端複雜度 | 低 | 中 |
| 檔案上傳支援 | ✓ | ✗ (multipart 不支援 php://input) |
| 框架相容性 | 高 | 可能衝突 |
name="field[]"php://input 方案,但需注意 multipart/form-data 不支援[] 陣列,勿重複處理PHP 預設行為符合 HTTP 標準(同名欄位後者覆蓋前者)。標準解法是前端陣列命名;特殊場景可用 php://input 手動解析,但需權衡相容性與維護成本。