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

PHP 接收同名不同值表單資料:從 ASP 遷移的相容方案

     編輯:PHP 綜合知識

遷移痛點

ASP 以逗號自動串接同名欄位(Request("field") = "val1,val2,val3"),PHP 預設覆蓋。前端表單散佈數十個站點,無法統一修改 name="field[]",需後端相容。

嘗試過的方案

  1. 前端改陣列命名:被否決,涉及站點過多
  2. PHP 設定檔調整:查遍 php.ini 無相關選項

折衷方案:部分前端改造 + 後端智慧判斷

僅對少數高流量站點改為 name="field[]",後端以 input_treat() 統一處理:

function input_treat($input) {
    if (gettype($input) == "string") {
        return htmlentities(trim($input), ENT_QUOTES);
    } elseif (gettype($input) == "array") {
        $nd = "";
        foreach ($input as $v) {
            $nd .= htmlentities(trim($v), ENT_QUOTES) . " ";
        }
        return $nd;
    }
    return false;
}

使用方式

$value = input_treat($_POST['field']);
// 字串直接過濾;陣列以空格串接後過濾
// 統一回傳安全字串,後續邏輯無需判斷型別

優缺點分析

優點缺點
最小化前端修改
統一輸出格式
內建 XSS 過濾
仍需部份站點改前端
空格分隔不如逗號標準
無法區分原始空格與分隔符

更好的替代方案(補充)

若專案允許部署 auto_prepend_file,可在入口處統一重寫 $_POST:

// auto_prepend_file.php
if ($_SERVER['REQUEST_METHOD'] === 'POST' 
    && strpos($_SERVER['CONTENT_TYPE'], 'application/x-www-form-urlencoded') === 0) {
    parse_str(file_get_contents('php://input'), $parsed);
    // 將陣列值以逗號合併
    array_walk_recursive($parsed, function(&$v, $k) {
        if (is_array($v)) $v = implode(',', $v);
    });
    $_POST = $parsed;
}

完全零前端修改、零業務程式碼入侵,推薦用於大型遷移專案。

總結

ASP 轉 PHP 的同名欄位相容問題,核心在於「前端不可改」與「後端預設行為不同」的衝突。input_treat() 為快速折衷方案;auto_prepend_file + php://input 則是徹底解法,視專案規模與權限選擇。

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