表單提交時,action URL 帶參數與表單字段同名/不同名、GET/POST 混用等場景,PHP 參數解析行為存在差異。本文通過四組對比實驗,揭示 $_GET、$_POST 互不干擾的隔離機制,並對比 Java Servlet 的統一獲取行為。
<form action="test.php?param=aaa" method="get">
<input name="param" value="bbb">
</form>
<?php echo $_GET['param']; ?>
// 結果:bbb(表單值覆蓋 URL 參數)
<form action="test.php?param1=aaa" method="get">
<input name="param2" value="bbb">
</form>
<?php echo $_GET['param1']; echo $_GET['param2']; ?>
// 結果:param1 為空,param2 = bbb(URL 參數被丟棄)
結論:method="get" 時,PHP 僅解析表單查詢字符串,action 中的 Query String 被忽略。
<form action="test.php?param=aaa" method="post">
<input name="param" value="bbb">
</form>
<?php echo "get=".$_GET['param']." post=".$_POST['param']; ?>
// 結果:get=aaa, post=bbb(兩者互不影響,完全隔離)
<form action="test.php?param1=aaa" method="post">
<input name="param2" value="bbb">
</form>
<?php echo "get=".$_GET['param2']." post=".$_POST['param1']; ?>
// 結果:均為空(GET 取不到 POST 字段,POST 取不到 URL 參數)
| 場景 | $_GET 來源 | $_POST 來源 | 是否隔離 |
|---|---|---|---|
| GET 表單 | 表單查詢串 | 無 | — |
| POST 表單 | action URL Query String | 表單體 | ✅ 完全隔離 |
$_GET 僅解析 URL 查詢字符串,$_POST 僅解析請求體(application/x-www-form-urlencoded 或 multipart/form-data)。$_REQUEST 合併兩者(順序受 request_order 影響),但不推薦使用,存在安全風險。request.getParameter() 統一獲取兩者,行為與 PHP 不同,遷移代碼時需注意。<input type="hidden" name="param" value="aaa">。