php $ _POST数组在表单提交时为空


99

我有一个自定义的CMS,已在我的开发箱中完美运行(Ubuntu / PHP5 + / MySQL5 +)。

我只是将其移至客户的生产框中,现在所有表单提交都显示为空的$ _POST数组。

我发现了一个技巧来验证数据实际上是通过使用的file_get_contents('php://input');,并且数据在那里显示良好- $_POST/ $_REQUEST数组始终为空。

我还通过firebug(application/x-www-form-urlencoded; charset=utf-8)验证了内容类型标头是否正确。

无论表单是通过AJAX提交还是通过常规表单提交,都会发生此问题。

任何帮助是极大的赞赏!

php  arrays  forms  post 

检查post_max_size:该值必须设置为8M,而不是8MB。在最新情况下,您不会看到任何错误,但是$ _POST大小将设置为0
Sergei Karpov,

Answers:


186

我知道这个问题是关于通过表单进行POST的,但是在使用JSON内容类型进行POST时,来到这里寻找类似问题的答案。找到了答案并想分享,因为这花了我很多时间。

使用JSON内容类型时,不会填充$ _POST数组(我相信只有多部分表单)

以下是解决此问题的方法:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);

希望这对某人有帮助!


这个解决方法很有意义-它修复了我的批处理更新控制器:)
Martin Zeitler 2013年

2
另一种选择是将Content-Typeheader 更改为application/x-www-form-urlencoded,然后使用序列化数据$.param(dataObject)。那应该有帮助。
ŁukaszBachman

1
@ŁukaszBachman如果dataobject是类似...的方法title=something&body=anything。我想获得标题和正文的信息。$ dataobject [“ title”]返回空。在我的情况下,$ _ POST为空。以及使用file_get_contents(“ php:// input”)来获取它的唯一方法...除了它不是json编码。
库尔希德·阿拉姆

这非常有用。奇怪的是,我将Json发送到我的开发机器上没有任何麻烦,但可以进行生产。
西蒙H


86

这是另一个可能的原因-我的表单是在没有WWW的情况下提交到domain.com的。并且我设置了自动重定向以添加“ WWW”。$ _POST数组在此过程中被清空。因此,要解决此问题,我只需提交到www.domain.com


24
该死,我的网址重写htaccess是POST无法正常工作的原因。我自动将斜杠附加到所有url,但是在ACTION的代码中,我使用的是没有斜杠的url。您的回答有所帮助,因为我从没想过要检查.htaccess。+1
Binar 2012年

我使用Godaddy进行了域转发(带有屏蔽),这似乎是问题的根源。
克里斯·普林斯

1
我也有类似的问题,它来自我的.htaccess文件。它正在.php从URL 中删除扩展名,而我的表单正在POST转到具有扩展名的URL。
伊曼纽尔·文提拉(EmanuelVintilă)2016年

25

我有一个类似的问题。原来是一个简单的修复。以我的形式

<form action =“ directory” method =“ post”>

其中directory是...目录的名称。我的POST数组完全为空。当我在浏览器中查看该URL时,该URL的末尾带有正斜杠。

在操作结束时加上正斜杠可以解决问题-

<form action =“ directory /” method =“ post”>

我的$ _POST数组又满了!


1
这不应该是一个修复程序,例如在CakePHP上具有良好的路由系统,不能在此上失败,(我不是说Cake失败了),也许解决此问题的方法不是框架或.php文件,但是在apache上有一些配置,我想对这个问题做进一步的调查。这很有趣。
詹姆斯,

类似地,我和OP有同样的问题,但是只有在<form>标签没有name属性的情况下,并且仅在IE中。
jkt123

13

确保在php.ini中:

  • track_vars (仅在非常旧的PHP版本上可用)设置为 On
  • variables_order 包含字母 P
  • post_max_size 设置为合理的值(例如8 MB)
  • (如果使用suhosin贴片)suhosin.post.max_vars并且suhosin.request.max_vars足够大。

我想我的第二个建议可以解决您的问题。


1
感谢MrMage,感谢您的见解,并将检查这些ini设置,并告诉您是否成功。谢谢!

1
“ post_max_size”设置是我的首选。我在表单提交期间上传了一个大文件,而此设置包含的值较小。所以当我提交表格时,我得到一个空的帖子数组。
shasi kanth 2012年

9

我发现,当从HTTP发布到HTTPS时,它们为$_POST空。这是在测试表单时发生的,但是花了我一段时间才意识到。


5

我遇到了一个类似但略有不同的问题,花了两天的时间来理解该问题。

  • 在我的情况下,POST数组也为空。

  • 然后用file_get_contents('php:// input');检查;那也是空的。

后来我发现,如果我在POST提交后刷新加载的页面,浏览器并没有要求确认重新提交表单数据。这是直接刷新页面。但是,当我将表单URL更改为另一个URL时,它正确传递了POST,并在尝试刷新页面时要求重新提交数据。

然后我检查了实际URL出了什么问题。URL没有问题,但是它指向URL中没有index.php的文件夹,而我正在index.php上检查POST。

在这里,我怀疑从/重定向到/index.php会导致POST数据丢失并在将index.php附加到URL的情况下测试URL。

可行。

将其张贴在这里,以便有人发现它会有所帮助。


1
我有同样的问题,URL的末尾没有'/',$ _REQUEST中什么也不存在,但是有'/'或'/index.php',所有发布的数据都在$ _REQUEST中。可能是我的Nginx设置或其他东西!
MohaMad

4

目前还没有一个很好的解决方案,但想与他人分享我的发现,以供将来遇到此问题的其他人参考。问题的根源是.htaccess文件中的2个覆盖的php值。我只是简单地添加了这两个值,以将文件上传的文件大小限制从默认的8MB增加到更大的值-我观察到,简单地在htaccess文件中根本不包含这两个值(无论是大于还是小于默认值)都会导致问题。

php_value post_max_size xxMB
php_value upload_max_filesize xxMB

我添加了其他变量,希望可以提高所有suhosin.post.xxx/suhosin.upload.xxx变量的限制,但不幸的是,这些变量对该问题没有任何影响。

总而言之,我在这里不能真正解释“为什么”,但是已经找到了根本原因。我的感觉是,这最终是一个suhosin / htaccess问题,但是很遗憾,除了删除上面的2个php覆盖值之外,我无法解决其他问题。

希望这对将来对我有帮助的人有所帮助。感谢所有花时间帮助我的人(MrMage,Andrew)


可能值得在Serverfault上提出这个问题,特别是如果问题出在服务器设置/ htaccess中。
大卫说,请

5
如果我没记错的话,应该将大小指定为“ xxM”,而不是“ xxMB”,所以我想知道这是否与它有关……
JC Inacio

4

我可以使用enctype =“ application / x-www-form-urlencoded”解决问题,因为默认值为“ text / plain”。签入$ DATA时,分隔符是用于“文本/纯文本”的空格,是用于“ urlencoded”的特殊字符。

亲切的问候弗兰克


4

具有enable_post_data_reading设置禁用会导致此问题。根据文档:

enable_post_data_reading

禁用此选项将导致不填充$ _POST和$ _FILES。读取postdata的唯一方法就是通过php:// input流包装器。这对于代理请求或以内存有效方式处理POST数据很有用。


4

如果要发布到目录/api/index.php等目录中的index.php文件,请确保在表单中指定该文件的完整目录,例如

这个

<form method="post" action="/api/index.php"> 
</form>

要么

<form method="post" action="/api/"> 
</form>

作品。

但这失败了

<form method="post" action="/api"> 
</form>

我实际上正好相反。我发现那/my_uri行得通,但是没有用/my_uri/
Link14年

有同样的问题。看来Apache或Nginx的增加从一个重定向/ api来/ API /
约翰·史密斯

4
<form action="test.php" method="post">
                        ^^^^^^^^^^^^^

好的,这很愚蠢,我会在公开场合尴尬自己,但我在PHP中以及当我 $_POST弄数组为空首先看了StackOverflow,却没有找到需要的答案。

我只写过

<form action="test.php">

忘记指定方法为 POST

我确定有人会窃笑,但是如果这可以帮助其他做同样事情的人,那么我不在乎!我们都会不时地这样做!


不能相信,我也忘记了!我只是在尝试一台新服务器,而韧带是由于配置而引起的……无论如何,谢谢您的提醒!
塞缪尔·艾亚拉·费雷拉

4

就我而言,当从HTTP发布到HTTPS时,$ _ POST为空。问题是,表单具有类似//example.com的操作当我将URL固定为https://example.com时,问题消失了。


1
我认为与服务器的设置有关。使用GoDaddy作为主机时,我遇到了同样的问题。此解决方案无法解决问题。
acarlstein '19

此解决方案解决了我的问题。我的脑袋不错。
gokaysatir

3

同样的问题在这里!

我试图通过邮递员中的邮寄请求连接到本地服务器代码,而这个问题浪费了我很多时间!

对于使用本地项目的任何人(例如邮递员):使用您的IPv4地址(在cmd中键入ipconfig)而不是“ localhost”关键字。就我而言:

之前:

localhost/app/login

后:

192.168.1.101/app/login

邮递员给了我一些关于带引号或空格的json拼写错误的问题。它需要一种特定的格式。
汤姆·安德森

2

参考:http : //www.openjs.com/articles/ajax_xmlhttp_using_post.php

POST方法

我们将进行一些修改,以便在发送请求时使用POST方法...

var url = "get_data.php";
var params = "lorem=ipsum&name=binny";
http.open("POST", url, true);

//Send the proper header information along with the request
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}
http.send(params);

一些HTTP标头必须与任何POST请求一起设置。所以我们将它们设置在这些行中...

http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.setRequestHeader("Content-length", params.length);
http.setRequestHeader("Connection", "close");

通过以上几行,我们基本上说的是数据发送采用表单提交的格式。我们还给出了要发送的参数的长度。

http.onreadystatechange = function() {//Call a function when the state changes.
  if(http.readyState == 4 && http.status == 200) {
    alert(http.responseText);
  }
}

我们为“就绪状态”更改事件设置了处理程序。这与我们用于GET方法的处理程序相同。您可以在此处使用http.responseText-使用innerHTML(AHAH),eval it(JSON)或其他任何内容插入div。

http.send(params);

最后,我们随请求一起发送参数。仅在调用此行后才加载给定的url。在GET方法中,参数将为空值。但是在POST方法中,要发送的数据将作为send函数的参数发送。params变量在第二行中声明为lorem=ipsum&name=binny-,因此我们发送两个参数-“ lorem”和“ name”,其值分别为“ ipsum”和“ binny”。


1

就我而言,这是因为我在使用jQuery提交表单之前就使用jQuery禁用了页面上的所有输入。因此,我更改了“禁用所有输入,甚至禁用'隐藏'类型”:

$(":input").attr("disabled","disabled"); 

“仅禁用'按钮'类型的输入”:

$('input[type=button]').attr('disabled',true);

这样一来,用户就不会意外地按下两次“开始”按钮,从而使我们的数据库更加流畅!看来,如果将“ disabled”属性放在“ hidden”类型的表单输入中,则如果提交表单,它们的值将不会被发送出去!


1

对我而言,.htaccess在未安装mod_rewrite时正在重定向。安装mod_rewite,一切都很好。

特别:

<IfModule !mod_rewrite.c>
  ErrorDocument 404 /index.php
</Ifmodule>

正在执行。


1

我只是花了几个小时来解决类似的问题。就我而言,问题是

max_input_vars = "1000"

默认情况下,在php.ini中。我的表单非常庞大,没有上传。php.ini设置为upload_max_filesize =“ 100M”和post_max_size =“ 108M”,在我看来,这当然不是问题。当表单中的变量超过1000个时,PHP行为与max_input_vars相同。它返回空的_POST数组。我希望能在一个小时之前和几个小时前找到它。


1

我知道这很旧,但想分享我的解决方案。

就我而言,问题出在我的.htaccess文件中,因为我添加了一些变量来提高PHP的最大上传限制。我的代码是这样的:

php_value post_max_size 50MB
php_value upload_max_filesize 50MB

后来我注意到这些值应该像xxM而不是xxMB,当我将其更改为:

php_value post_max_size 50M
php_value upload_max_filesize 50M

现在我的$ _POST返回了以前的数据。希望这对以后的人有所帮助。


0

除了MRMage的职位:

我必须设置此变量来解决一些$_POST变量(具有大数组> 1000项)消失的问题:

suhosin.request.max_vars = 2500

request”,而不是“ post”是的解决方案...


0

也许不是最方便的解决方案,但是我发现,如果将form action属性设置为根域,则可以访问index.php并获取发布的变量。但是,如果我将重写的URL设置为操作,它将无法正常工作。


0

这有点类似于@icesar 所说的

但是我试图将内容site/api/index.php发布到位于的api中,site/api因为它index.php本身被传递到了,所以仅发布到。但是,这显然会导致某些事情变得混乱,因为我要立即$_POST清空。只需site/api/index.php直接发布到即可解决。


0

我的问题是我正在使用HTML <base>标记来更改测试站点的基本URL。一旦从标题中删除该标签,$_POST数据就会返回。


0

就我而言(OVH互助服务器上的php页面)enctype="text/plain"不起作用($_POST并且对应的$_REQUEST为空),下面的其他示例也起作用。`

<form action="?" method="post">
<!-- in this case, my google chrome 45.0.2454.101 uses -->
<!--     Content-Type:application/x-www-form-urlencoded -->
    <input name="say" value="Hi">
    <button>Send my greetings</button>
</form>

<form action="?" method="post" enctype="application/x-www-form-urlencoded">
    <input name="say" value="Hi">
    <button>Send my application/x-www-form-urlencoded greetings</button>
</form>

<form action="?" method="post"  enctype="multipart/form-data">
    <input name="say" value="Hi">
    <button>Send my multipart/form-data greetings</button>
</form>

<form action="?" method="post" enctype="text/plain"><!-- not working -->
    <input name="say" value="Hi">
    <button>Send my text/plain greetings</button>
</form>

`

更多信息:method =“ post” enctype =“ text / plain”不兼容?


0

我从Mod Security中收到以下错误:

Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|\*| |\,]|UNION SELECT.*\'.*\'.*,[0-9].*INTO.*FROM)" at REQUEST_BODY. [file "/usr/local/apache/conf/modsec2.user.conf"] [line "345"] [id "300013"] [rev "1"] [msg "Generic SQL injection protection"] [severity "CRITICAL"]

一旦删除了我的国防部安全配置进行测试,一切都可以按预期进行。现在,我只需要修改规则即可保持安全,但足够灵活以满足我的需求:)


0

确保在输入标记中使用name =“ your_variable_name ”。

我错误地使用id =“ your_variable_name ”。

我花了很多时间来发现错误。


0

确保name已定义每个字段的属性。

这会在PHP上创建一个空的POST

<input type="text" id="Phone">

但是,这将工作

<input type="text" name="Phone" id="Phone">

我认为与服务器的设置有关。使用GoDaddy作为主机时,我遇到了同样的问题。此解决方案无法解决问题。
acarlstein '19

-1

好的,我认为我应该将案例放在这里....在特定情况下,我将帖子数组留空..表单运行良好,但是有时用户抱怨他们按了提交按钮,但没有任何反应....挖掘了一段时间后,我发现托管公司有一个安全模块,可以检查用户输入并清除整个帖子数组(不仅是恶意数据)(如果发现的话)。在我的示例中,一位数学老师试图输入方程:dy + dx + 0 = 0; 并且数据被完全擦除。

要解决此问题,我现在建议他在文本区域中将数据输入为dy + dx + 0 = 0,现在它可以正常工作..这样可以节省一些时间..


5
要求用户为错误代码留出余地不是一个开始。
freeworlder '18

它不是真正的错误代码,但是您可以考虑使用新的托管服务提供商。或者,以其他形式(例如HTML URL编码)发布输入。
汤姆·安德森
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.