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

PHP 提交 POST 陣列參數完整解析:表單命名規則、序列化傳遞與 Base64 編碼實務

     編輯:PHP 綜合知識

前言

HTML 表單提交陣列資料到 PHP 後端,再轉發至其他服務,是常見整合場景。本文系統說明:表單命名規則讓 PHP 接收陣列、序列化/反序列化在服務間傳遞陣列、Base64 編碼處理特殊字元,並提供完整代碼範例。

一、HTML 表單提交陣列到 PHP

命名規則

同名輸入元素的 name 屬性必須以 [] 結尾:

紅 綠 藍

PHP 接收

// receive.php
$colors = $_POST['colors'] ?? []; // 陣列: ['red', 'green', 'blue']
var_dump($colors);

多維陣列命名






$_POST['user']    // ['name'=>'John', 'email'=>'john@example.com']
$_POST['products'] // [['id'=>'1','name'=>'商品A'], ['id'=>'2','name'=>'商品B']]

二、服務端 A 處理後轉發陣列到服務端 B

問題:直接傳遞 $_POST 陣列會變成 "Array" 字串

// 錯誤示範
$postData = http_build_query($_POST); // 陣列值會被轉為 "Array"
file_get_contents('https://service-b.com/api', false, stream_context_create([
    'http' => ['method'=>'POST', 'header'=>'Content-Type: application/x-www-form-urlencoded', 'content'=>$postData]
]));

解法一:serialize() + unserialize()

// 服務端 A:序列化特定陣列欄位
$_POST['colors'] = serialize($_POST['colors']);
// 現在 $_POST['colors'] 為字串: 'a:3:{i:0;s:3:"red";i:1;s:5:"green";i:2;s:4:"blue";}'

// 發送請求 (application/x-www-form-urlencoded)
$postData = http_build_query($_POST);
// ...

// 服務端 B:反序列化還原陣列
$colors = unserialize($_POST['colors']);
// 注意:若經過 URL 編碼,需先 urldecode() 或自動由 PHP 處理

解法二:json_encode() + json_decode() (推薦,跨語言相容)

// 服務端 A
$_POST['colors_json'] = json_encode($_POST['colors']);
// 發送...

// 服務端 B
$colors = json_decode($_POST['colors_json'], true); // true = 關聯陣列

解法三:Base64 編碼序列化資料 (避免特殊字元衝突)

// 服務端 A
$serialized = serialize($_POST['colors']);
$encoded = base64_encode($serialized);
// 放入隱藏欄位或 POST 欄位
// 

// 服務端 B
$received = $_POST['colors_data'];
$decoded = base64_decode($received);
$colors = unserialize($decoded);

三、完整實作範例:多步驟表單資料傳遞

步驟 1:前端表單 (step1.php)

選擇顏色

步驟 2:中介處理並轉發 (step2.php)



確認資訊

選擇顏色:

步驟 3:最終送出 API (step3.php)

 $colors, 'timestamp' => time()]);

$ch = curl_init($apiUrl);
curl_setopt_array($ch, [
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $payload,
    CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
    CURLOPT_RETURNTRANSFER => true,
]);
$response = curl_exec($ch);
curl_close($ch);

echo 'API 回應: ' . $response;
?>

四、常見陷阱與最佳實務

陷阱解決方案
未加 [] 導致只收到最後一個值name="colors[]" 必加中括號
serialize() 含特殊字元破壞 URL/表單base64_encode() 包裹
unserialize() 不受信任資料導致物件注入改用 json_decode(),或僅在可信內部服務間使用
json_encode() 中文被轉 \uXXXX加 JSON_UNESCAPED_UNICODE 旗標
http_build_query() 陣列值為陣列時產生 key[0]=val預設行為正確,PHP 接收端自動還原多維陣列

五、現代替代方案:JSON API 直連

// 前端直接發送 JSON 到後端 API
fetch('/api/colors', {
    method: 'POST',
    headers: {'Content-Type': 'application/json'},
    body: JSON.stringify({colors: ['red', 'green', 'blue']})
}).then(r => r.json()).then(console.log);
現代 SPA/前後端分離架構下,前端直接發 JSON 給 API,後端 json_decode(file_get_contents('php://input'), true) 接收,完全繞過表單陣列命名與序列化問題。

小結

PHP 接收表單陣列靠 name="field[]";服務間傳遞陣列推薦 JSON (json_encode/decode),跨語言相容、安全、可讀;舊系統相容可用 serialize + base64。現代架構建議前端直發 JSON,簡化後端處理邏輯。

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