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来解决一些$_POST
variables(大数组> 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。