PHP:INPUT_POST(在filter_input_array中使用)会覆盖先前对$_POST的所有修改

6
filter_input_array()函数中的INPUT_POST参数,例如:
filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);

看起来会覆盖应用于超级全局变量 $_POST 的任何修改。

测试:

<?php
// 1.
$_POST['abc'] = '123';
var_dump($_POST);

// 2.
$_POST  = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING);
var_dump($_POST);
?>

输出:

在 // 2. 后,您的 $_POST 将为空(因为初始 POST 是空的)

index.php:4:
array (size=1)
'abc' => string '123' (length=3)

index.php:8:null

请确认,一定要放置


$_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);

在您的脚本顶部

问题:是否有其他人注意到这种行为 - 还是我推理出了错误?

可能的答案:数据来自超全局变量$_REQUEST,而不是$_POST


没有任何地方明确说明这与$_POST有任何关联。 - CBroe
@CBroe,我能看到的唯一一个试图定义INPUT_POST的页面是这个常量列表,它只是链接到描述$_POST的页面,所以这对我来说意味着有联系。 - IMSoP
@IMSoP相信实际上并没有这样一个东西。filter_input_vars的描述是,“获取外部变量并可选择过滤它们”-对我来说,这仅意味着它从与用于填充$ _POST最初使用的相同来源获取数据。操作$ _POST不会更改最初发送的数据。如果您使用从外部接收实际POST数据的脚本进行测试,并像上面所示添加一个额外的条目到$ _POST中,则只会在过滤结果中看到原始数据,而不会看到仅添加到$ _POST中的数据。 - CBroe
1
@CBroe 如果您可以确认这一点,那么这就是答案。同时,这也应该在文档中进行澄清,因为正如我所说,“nowhere”并不会建立这种连接,常量列表非常明确地建立了这种连接。 - IMSoP
“INPUT_POST”让我很烦恼,看看我在原文章结尾处的“可能的答案:”。 - Robert TheSim
2个回答

8

$_POST和INPUT_POST之间没有直接的联系。

后者只是指定filter_input_vars应该从与最初填充$_POST相同的源获取要过滤的数据。稍后对$_POST的操作不会改变最初发送到脚本的POST数据。

您可以通过设置一个小表单来轻松验证此内容。该表单将一个隐藏的输入字段发布到您的脚本中。然后在该脚本中添加一个额外的$_POST条目,就像您在上面的示例中所做的那样。您将看到filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING)返回一个包含隐藏字段的条目的数组,但并不包括您手动添加到$_POST的条目。

http://php.net/manual/en/filter.constants.php 将INPUT_POST描述为“POST变量”,并链接到$_POST的描述,这可能有点误导。但是公平地说,它在那里说POST,而不是$_POST。

请确保在脚本顶部放置 $_POST = filter_input_array(INPUT_POST, FILTER_SANITIZE_STRING, true);

我真的不建议这样做。每个PHP开发人员都会认为$_POST包含未经过滤的数据。一旦您开始使用第三方模块,这可能会导致麻烦。

将$_POST保留为原样,并使用单独的变量来保存经过过滤的POST参数,是我认为更好的方法。


2
在执行并将其分配给$_POST后,您的变量$_POST包含null。根据PHP手册,可能返回null,因为该函数应该处理的资源未定义。
我认为您应该调查变量的完整性或您对该函数的使用。

可以使用一个简单的表单脚本来重现,该脚本向服务器发出POST请求。在这种情况下,$_POST$_REQUEST都为空。 - Robert TheSim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接