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

我有一个自定义的CMS我已经build立了完美的工作在我的开发盒(Ubuntu / PHP5 + / MySQL5 +)。

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

我发现一个技巧来validation数据实际上是使用file_get_contents('php://input');传递的file_get_contents('php://input'); 而且数据在那里显示得很好 – $_POST / $_REQUEST数组总是空的。

我也通过萤火虫( application/x-www-form-urlencoded; charset=utf-8 )validation了内容types标题是正确的。

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

任何帮助是极大的赞赏!

我知道这个问题是关于POST通过一个窗体,但是当用JSON内容types发布时,来到这里寻找类似问题的答案。 find答案,并分享它,因为它花费我很多时间。

当使用JSON内容types$ _POST数组将不会填充(只有多部分forms我相信)

以下是解决问题的方法:

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

希望这可以帮助别人!

这是另一个可能的原因 – 我的表单没有WWW提交给domain.com。 我已经设置了一个自动redirect来添加“WWW”。 $ _POST数组在进程中被清空。 所以要解决这个问题,我只需要提交到www.domain.com

我有一个类似的问题。 原来是一个简单的修复。 在我有的forms

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

其中目录是…目录的名称。 我的POST数组完全是空的。 当我在浏览器中查看url时,显示的结尾是正斜杠。

在我的行动结束时添加正斜杠做了诀窍 –

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

我的$ _POST数组又满了!

确保在php.ini中:

  • track_vars (只适用于非常古老的PHP版本)被设置为On
  • variables_order包含字母P
  • post_max_size被设置为一个合理的值(例如8 MB)
  • (如果使用suhosin补丁)suhosin.post.max_vars和suhosin.request.max_vars足够大。

我想我的第二个build议会解决你的问题。

目前还没有一个优雅的解决scheme,但是想分享我的发现,以供其他遇到这个问题的人参考。 问题的根源是在.htaccess文件中覆盖2个php值。 我只是简单地添加了这两个值,以将file upload的文件大小限制从默认的8MB增加到更大一些 – 我观察到只要在htaccess文件中有这两个值,无论是大于还是小于默认值,都会导致问题。

 php_value post_max_size xxMB php_value upload_max_filesize xxMB 

我添加了额外的variables,希望提高所有suhosin.post.xxx/suhosin.upload.xxxvariables的限制,但不幸的是,这个问题对这个问题没有任何影响。

总之,我不能在这里解释“为什么”,而是找出了根本原因。 我的感觉是这最终是一个suhosin / htaccess的问题,但不幸的是,我无法解决除了删除上面的2个PHP覆盖值。

希望这有助于未来的人,因为我杀了几个小时搞清楚了这一点。 感谢所有花时间帮助我的人(MrMage,Andrew)

我可以使用enctype =“application / x-www-form-urlencoded”来解决这个问题,默认是“text / plain”。 当您签入$ DATA时,分隔符是“text / plain”的空格,“urlencoded”是特殊字符。

亲切问候弗兰克

我发现当从HTTP发布到HTTPS时, $_POST是空的。 这是在testing表单时发生的,但花了我一段时间,直到我意识到这一点。

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

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

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

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

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

在这里,我怀疑从/到/index.php的redirect会导致POST数据丢失,并通过将index.php附加到URL来testingURL。

那工作。

张贴在这里,所以有人会觉得有帮助。

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

好吧,这是愚蠢的,我会公开尴尬自己,但我敲了一个testing脚本的东西在PHP中,当我的$_POST数组是空的,StackOverflow是我看的第一个地方,我没有find答案我需要。

我只写了

 <form action="test.php"> 

忘记指定方法为POST

我相信有人会嗤之以鼻,但如果这能帮助别人做同样的事情,那么我不介意! 我们都会不时地这样做!

参考: 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)插入一个div,评估它(JSON)或其他任何东西。

 http.send(params); 

最后,我们发送带有请求的参数。 给定的url只在调用这一行后才加载。 在GET方法中,参数将是一个空值。 但在POST方法中,要发送的数据将作为发送函数的参数发送。 paramsvariables在第二行被声明为lorem=ipsum&name=binny – 所以我们分别发送两个参数 – 'lorem'和'name',值分别为'ipsum'和'binny'。

在我的情况下,这是因为我使用jQuery来禁用页面上的所有input之前使用jQuery提交表单。 所以我改变了我的“禁用每一个input甚至'隐藏'types”:

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

以“仅禁用”button“typesinput”:

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

这样用户就不会不小心碰到两次“去”button,把我们的数据库连接起来! 看起来,如果你把“禁用”属性放在一个“隐藏”types的表单input中,如果表单被提交,它们的值将不会被发送!

对我来说,.htaccess在mod_rewrite没有安装的时候redirect。 安装mod_rewite,一切都很好。

特别:

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

正在执行。

禁用enable_post_data_reading设置将导致此问题。 根据文件:

enable_post_data_reading

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

如果你发布到index.php文件的目录例如/api/index.php确保在你的表单中指定完整的目录到文件eg

这个

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

要么

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

作品。

但是这个失败了

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

我知道自从这篇文章已经有一段时间了,但是我认为我会为这个问题做出贡献。

我从Mod Security得到以下错误:

 Access denied with code 500 (phase 2). Pattern match "((select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|describe)[[:space:]]+[AZ|az|0-9|\*| |\,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[AZ|az|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"] 

一旦我删除我的国防部安全configurationtesting,它都按预期工作。 现在我只需要修改我的规则,以保持安全,但足够灵活,以满足我的需求:)

卢克

除了MRMage的职位:

我不得不设置这个variables来解决一些$_POSTvariables(大数组> 1000项)消失的问题:

 suhosin.request.max_vars = 2500 

request ”,而不是“ post ”是解决scheme…

也许不是最方便的解决scheme,但我想到了,如果我将表单action属性设置为根域,则可以访问index.php并获取发布的variables。 但是,如果我将重写的URL设置为操作,则不起作用。

这与@icesar 所说的相似。

但我试图发布的东西,我的api,位于site/api/index.php ,只发布到site/api因为它传递给index.php本身。 然而,这显然导致一些东西弄乱了,因为我的$_POST在飞行中被清空了。 只需直接发布到site/api/index.php可以解决问题。

我的问题是,我正在使用HTML <base>标记来更改我的testing网站的基本URL。 一旦我从标题中删除了这个标签, $_POST数据就回来了。

在我的情况下(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”不兼容?

我认为问题是:您的(或您的域名提供商)PHPconfiguration块POST metod。