PHP Conference Japan 2024

$_POST

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

$_POSTHTTP POST 變數

說明

一個關聯式陣列,其中包含通過 HTTP POST 方法傳遞給目前腳本的變數,當請求中使用 application/x-www-form-urlencodedmultipart/form-data 作為 HTTP Content-Type 時。

範例

範例 #1 $_POST 範例

<?php
echo 'Hello ' . htmlspecialchars($_POST["name"]) . '!';
?>

假設使用者以 POST 方式傳送 name=Hannes

上述範例將輸出類似以下的內容

Hello Hannes!

注意事項

備註:

這是一個「超全域」或自動全域變數。這表示它在腳本的所有作用域中都可用。無需使用 global $variable; 就能在函式或方法中存取它。

新增備註

使用者貢獻的備註 6 則備註

james dot ellis at gmail dot com
15 年前
PHP 處理 POST 和 GET 變數的一項特性是它會自動解碼索引表單變數名稱。

我看過無數個專案,在 PHP 已經幫你做好所有事情的情況下,卻跳過額外的且不必要的處理環節來解碼變數。

虛擬碼範例

許多網站都這樣做

<form ....>
<input name="person_0_first_name" value="john" />
<input name="person_0_last_name" value="smith" />
...

<input name="person_1_first_name" value="jane" />
<input name="person_1_last_name" value="jones" />
</form>

但他們可以這樣做

<form ....>
<input name="person[0][first_name]" value="john" />
<input name="person[0][last_name]" value="smith" />
...
<input name="person[1][first_name]" value="jane" />
<input name="person[1][last_name]" value="jones" />
</form>

在第一個範例中,您必須進行字串解析/正規表達式才能取得正確的值,以便將它們與應用程式中的其他資料結合... 而在第二個範例中... 您將得到類似以下的結果
<?php
var_dump
($_POST['person']);
//會得到類似以下的結果:
array (
0 => array('first_name'=>'john','last_name'=>'smith'),
1 => array('first_name'=>'jane','last_name'=>'jones'),
)
?>

當您想要將各種發佈的表單資料連結到伺服器端的其他雜湊、需要將發佈的資料儲存在單獨的「隔間」陣列中,或者想要將 POST 的資料連結到各種框架中的不同記錄處理程式時,這是非常寶貴的。

還要記住,使用 [] 作為索引會在資料發佈後建立一個連續的數值陣列,因此有時最好明確地定義索引。
php (at) vxvr /dot de
3 年前
如果您想在腳本中接收 application/json POST 資料,則不能使用 $_POST。 $_POST 只處理表單資料。
請改從 php://input 讀取。您可以使用 fopen 或 file_get_contents。

範例

<?php
// 取得 JSON 內容
$json = file_get_contents('php://input');

// 解碼 JSON 資料
$data = json_decode($json);
?>
darren_wheatley at hotmail dot com
9 年前
我知道這是一個很基本的問題,但我嘗試從 HTML 頁面提交表單時,卻無法存取 $_POST 變數。我花了好久才解決,而且在 Google 上也找不到我需要的幫助。因此有了這篇文章。

請確保您的輸入項目具有 NAME 屬性。只有 id 屬性是不夠的!輸入控件上的 name 屬性是 $_POST 用來索引資料並顯示結果的依據。
woodhavenbp at yahoo dot com
8 年前
這裡有一則較早的注意事項,關於正確地在 $_POST 中引用元素,它是準確的。$_POST 是一個關聯式陣列,以表單元素的 NAME 作為索引,而不是 ID。一種理解它的方式是:元素 "id=" 用於 CSS,而元素 "name=" 用於 PHP。如果您在 POST 陣列中引用的是元素 ID,它將無法運作。您必須為元素指定 name 屬性,才能在 POST 陣列中正確地引用它。為了簡潔起見,這兩個屬性可以相同,例如:
<input type="text" id="txtForm" name="txtForm">...</input>
CXJ
10 年前
請注意,$_POST 並非在所有 HTTP POST 操作中都設定,而僅在特定類型的 POST 操作中設定。我還沒找到相關文件,但以下是目前我發現的。

$_POST 會在以下情況設定:

Content-Type: application/x-www-form-urlencoded

換句話說,適用於標準網頁表單。

$_POST 不會在以下情況設定:

Content-Type:text/xml

一種用於通用 HTTP POST 操作的類型。
paul at youngish dot homelinux^org
15 年前
對於包含多個表單的頁面,以下是一種處理您可能收到的不同 POST 值的方法。這段程式碼適用於頁面上有多個不同表單的情況。新增另一個表單只需要在陣列和 switch 陳述式中新增一個項目即可。

<?php

if (!empty($_POST))
{
// 頁面上每個不同表單的 POST 值陣列。
$postNameArr = array('F1_Submit', 'F2_Submit', 'F3_Submit');

// 找出 $_POST 中所有 post 的識別碼
$postIdentifierArr = array();

foreach (
$postNameArr as $postName)
{
if (
array_key_exists($postName, $_POST))
{
$postIdentifierArr[] = $postName;
}
}

// 一次應該只提交一個表單,所以我們應該只有一個
// post 識別碼。這裡的 die 陳述式相當嚴苛,您可以考慮
// 使用警告而不是這個。
if (count($postIdentifierArr) != 1)
{
count($postIdentifierArr) < 1 or
die(
"\$_POST 包含多個 post 識別碼: " .
implode(" ", $postIdentifierArr));

// 我們還沒結束,所以我們一定少於一個。
die("\$_POST 未包含已知的 post 識別碼。");
}

switch (
$postIdentifierArr[0])
{
case
'F1_Submit':
echo
"執行 F1_Submit 的實際程式碼。";
break;

case
'Modify':
echo
"執行 F2_Submit 的實際程式碼。";
break;

case
'Delete':
echo
"執行 F3_Submit 的實際程式碼。";
break;
}
}
else
// $_POST 是空的。
{
echo
"執行沒有 POST 資料的頁面程式碼。 ";
}
?>
To Top