空的$ _POST数组


21

我有以下HTML / PHP页面:

<?php
if(empty($_SERVER['CONTENT_TYPE'])) {
    $type = "application/x-www-form-urlencoded";
    $_SERVER['CONTENT_TYPE'] = $type;
}

echo "<pre>";
var_dump($_POST);
var_dump(file_get_contents("php://input"));
echo "</pre>";
?>

<form method="post" action="test.php">
<input type="text" name="test[1]" />
<input type="text" name="test[2]" />
<input type="text" name="test[3]" />
<input type="submit" name="action" value="Go" />
</form>

如您所见,表单将提交,预期的输出是一个POST数组,其中包含一个数组,其中包含填充的值以及一个带有值“ Go”的输入“ action”(按钮)。但是,无论我在字段中输入什么值;结果总是:

array(2) {
  ["test"]=>
  string(0) ""
  ["action"]=>
  string(2) "Go"
}
string(16) "test=&action=Go&"

不知何故,名为test的数组将被清空,“ action”变量会使其通过。

我已经使用了Firefox的Live HTTP Headers扩展来检查POST字段是否已提交,并且确实提交了。来自实时HTTP标头的相关信息(在文本框中以值填充a,b和c):

Content-Type: application/x-www-form-urlencoded
Content-Length: 51
test%5B1%5D=a&test%5B2%5D=b&test%5B3%5D=c&action=Go

有谁知道为什么会这样吗?我很害怕这个,已经花了我很多时间...

更新:

我们已经在不同的服务器上尝试过此操作,在Windows机器上可以正常工作,在PHP版本5.2.4(带有Suhosin)的Ubuntu服务器上也可以,但是没有。它甚至可以在其他服务器上运行,也可以使用Ubuntu和相同的PHP版本,也可以安装Suhosin。

我已经比较了两个文件,这是输出(diff php.ini phps.ini):

270c270
< memory_limit = 32M
---
> memory_limit = 16M      ; Maximum amount of memory a script may consume (16MB)
415c415
< variables_order = "EGCSP"
---
> variables_order = "EGPCS"
491d490
< include_path = ".:"
1253a1253,1254
> extension=mcrypt.so
>

在这个phps.ini中,它是服务器所在的服务器,而php.ini是当前的服务器。看起来这里没有问题,对吧?


4
Suhosin可能是。
Shrapnel上校,2010年

没错,suhosin听起来像是候选候选人
SeanJA

您能否提供更多信息?Suhosin已安装在服务器上,我应该关闭它吗?我应该更改设置吗?
rael_kid 2010年

3
试试这个,它将记录是否是sihosin问题。 hardened-php.net/suhosin/configuration.html#suhosin.simulation

我尝试打开模拟模式。阵列仍为空。我似乎找不到日志文件...
rael_kid

Answers:


2

没有显式索引,是否可以工作?尝试:

<form method="post" action="test.php">
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="text" name="test[]" />
<input type="submit" name="action" value="Go" />
</form>

不,也不起作用。
rael_kid 2010年

不要为测试数组设置索引-它们会弄乱POST变量检测
亚当

2
好吧,我可以把它们排除在外。但这不能解决我的问题。
rael_kid 2010年

2

post数组可能为空有很多可能的原因-可能会返回到人为/开发人员错误。从PHP 5.2升级到5.4时,我遇到了这个确切的问题,这很简单,但是花了数小时的故障排除才能找到bug。在我们的config.php文件中,我们有以下语句来处理$ _POST数组:

if (!get_magic_quotes_gpc()) {
    if (isset($_POST)) {
        foreach ($_POST as $key => $value) {
            $_POST[$key] =  trim(addslashes($value));
        }
    }

魔术引号曾经出现过,并且在5.2或更高版本的PHP版本中可以正常工作,但在5.2或更高版本中的任何内容都不会处理,并返回一个空数组。

如果您尚未error_reporting()打开电源,建议您这样做,并且我确定您可以对问题进行故障排除。

您还应该检查不推荐使用的系统功能,例如“ magic_quotes”,因为使用它们根本无法返回结果。我希望这有帮助。祝你好运。JCS :)


1

PHP的bugtracker中有关于此问题或类似问题的错误报告:

不幸的是,它没有提到解决方案,但是您可以尝试设置另一个CONTENT_TYPE或根本不设置任何内容类型。


这些错误类似,但与我的不同。我确实尝试设置了内容类型(如您在原始答案的代码段中所见)。如果我完全不设置内容类型,那也将不起作用...
rael_kid 2010年

1

有一个非常类似的问题。好吧,首先,我花了相当长的时间才能找到这篇文章。为了弄清楚我的问题的名字,我必须安装PHP控制台,弄清楚如何使用它。调试我一无所知的代码。深入问题的根源,仍然感到困惑。

该解决方案实际上非常简单。在Chrome中,按F12键进入开发人员工具,选择“网络”,然后尝试发布您的表单。跟踪发布请求,查看状态。如果是301(或200以外的其他值),则您遇到的问题与我直到最近才遇到的问题完全一样!

我的新主机提供商将http://my_site.com重定向到http://www.my_site.com,我要做的就是从CMS中更改某些设置(您的内容可能有所不同,但在某种程度上相似)

$Configuration['BASE_URL'] = 'http://my_site.com'

$Configuration['BASE_URL'] = 'http://www.my_site.com'

瞧,魔术,彩虹,独角兽和我的网站终于可以正常工作了!

使用主机设置的PS混乱也可能会解决您的问题...如果您的问题与我的课程相似,那么...


该死的。重定向也是我的问题!
阿曼·阿拉姆

0

我不确定但有

name="test[1]"

等可能会混淆php。我将输入名称更改为test_1,test_2,然后看看会发生什么。


7
@haavee:不,PHP 宣传这种用法:php.net/manual/en/faq.html.php#faq.html.arrays
Boldewyn

我已经尝试过了,以这种方式变量确实起作用了,但是它们不在数组中。
rael_kid 2010年

@haavee:不,这种符号不会混淆PHP,它是PHP +表单的标准用法。请参阅Boldewyn的链接。:)

好的,谢谢!今天学到了新东西。

1
@adam:“也可以为数组分配特定的键”。

0

在基本的PHP中,我只能想到一个可能会破坏此配置的配置选项,即post_max_size,因此请检查php.ini和相关文件,以确保该值是合理的并且未设置为零或无效值(例如字母字符) 。

Suhosin使得可以在各种条件下阻止post变量,包括数组长度和变量名长度。Grep您的php.ini文件中的“ suhosin”以查看是否存在任何设置,尤其是以“ suhosin.post”开头的任何设置。(有关我所考虑的参数的更多详细信息,请参见http://www.hardened-php.net/suhosin/configuration.html#suhosin.post.max_array_depth。)

不幸的是,除非将配置中的某个值设置为一或零,否则代码(和变量)足够短,以至于需要花费很长时间。如果变成空白,我的下一个建议是备份您的Apache和PHP配置,核对它们的目录,清除软件包,重新安装,然后开始将配置块放回原位,直到代码再次停止工作(或者,开始更新该服务器)。可以使用无法正常运行的服务器上的配置,直到它们都坏掉为止)。由于您具有相同操作系统的相同PHP服务器正常工作,因此几乎可以肯定这是某个故障服务器上的配置错误,但这是要搜索的相当大的麻烦。

强烈建议在开始之前/ etc的版本控制-查看etckeeper软件包。(实际上,我建议使用它的期限。主要的保护措施,特别是在具有多个用户有权访问权限的计算机上。)


我的post_max_size是8M,我认为就足够了。我的php.ini中不包含任何带有suhosin的条目,因此可能是一个问题... suhosin是否具有自己的conf文件?
rael_kid'4

并非默认情况下,但是任何PHP模块的设置都可以在Debian系统上的/etc/php5/conf.d中的任何文件中进行设置,因此,我认为也是Ubuntu系统。就像我说的那样,这是一个遥不可及的事情。不过,我还是先将每个配置文件与一个工作系统进行比较。
Zed 2010年

0

自从“稳定”升级到Debian“测试”以来,我到处都有表单提交失败的情况。似乎apache2或php5没有处理提交中具有相同名称的多个项目。例如; 您的表单有两个输入名称“ mo”。在过去,“ mo”的值之一只能通过。现在,在第一次出现重复键之后,该表单似乎删除了所有数据。尚未确定。仍在尝试找出答案。


0

尝试从可工作的服务器上复制php.ini到该服务器(不过首先备份不工作服务器的php.ini)。如果是这样,那肯定是存在的东西(也许是variables_order,或者可能是内存,尽管两者都不大可能)。


0

尝试将提交按钮重命名为操作以外的其他名称。过去我对此有一些问题。输入名为“ action”的输入似乎是问题所在。


0

以下内容对您无济于事。它与我对PHP配置了解的一切背道而驰:

< variables_order = "EGCSP"
---
> variables_order = "EGPCS"

这个跳到我身上。您的超全局变量正在以不同的顺序注册。这只是一个问题,因为既然您不使用register_globals也不依赖它们,那么更改顺序变量的处理顺序也不应该成为问题。

但是,您应该明确尝试一下,并更改变量的顺序。


0

即使那个OP已经很老了,但是今天我遇到了类似的问题。

在花了几个小时反复检查了数百万种不同的内容之后,最终发现在cPanel中以PHP默认设置对PHP 5.6.17版本进行最后一次更新后,并未选择http在此处输入图片说明

并将其设置为选中后-一切恢复正常:-)

在此处输入图片说明

希望对以后的读者有所帮助


0

如果这可以帮助其他人,则...我只是花了几个小时来解决类似的问题,而问题是php.ini的max_input_vars =“ 1000”限制。确保检查php.ini的upload_max_filesize,post_max_size和max_input_vars值。超过一个将产生一个空的$ _POST数组。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.