首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 接收同名表單欄位資料:陣列命名法與資料合併處理方案

     編輯:PHP 相關知識

解決 PHP 無法接收同 name 表單欄位:前端陣列命名與後端相容處理

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)
框架相容性高可能衝突

最佳實踐建議

  1. 新專案/可控前端:統一使用 name="field[]"
  2. 舊系統遷移、不可改前端:使用 php://input 方案,但需注意 multipart/form-data 不支援
  3. 框架用戶:Laravel/Symfony 等自動支援 [] 陣列,勿重複處理
  4. 合併分隔符:建議用逗號或 JSON 編碼,避免空格衝突

總結

PHP 預設行為符合 HTTP 標準(同名欄位後者覆蓋前者)。標準解法是前端陣列命名;特殊場景可用 php://input 手動解析,但需權衡相容性與維護成本。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved