2024 年 PHP 日本大会

$_POST

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

$_POSTHTTP POST 变量

描述

一个关联数组,其中包含通过 HTTP POST 方法传递给当前脚本的变量,当使用 application/x-www-form-urlencodedmultipart/form-data 作为请求中的 HTTP 内容类型时。

示例

示例 #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'),
)
?>

当您想要将各种发布的表单数据链接到服务器端的其他哈希值时,当您需要将发布的数据存储在单独的“隔间”数组中时,或者当您想要将发布的数据链接到各种框架中的不同记录处理程序时,这非常宝贵。

还要记住,使用 [] 作为索引将导致在数据发布后创建顺序数字数组,因此有时最好明确定义索引。
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 变量时遇到了问题。我花了很长时间才解决这个问题,而且我在谷歌上找不到我需要的帮助。因此有了这篇文章。

确保您的输入项具有 NAME 属性。id 属性是不够的!输入控件上的 name 属性是 $_POST 用于索引数据并因此显示结果的内容。
woodhavenbp at yahoo dot com
8 年前
这里有一条关于正确引用 $_POST 中元素的早期注释,这是准确的。$_POST 是一个关联数组,其索引是由表单元素名称而不是 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

换句话说,对于标准 Web 表单。

$_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,所以一定少于一个。
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