表单提交时,PHP的$_POST数组为空。

119

我有一个自定义的内容管理系统(CMS),在我的开发环境中(Ubuntu/PHP5+/MySQL5+)运行得非常完美。

我刚把它移到生产环境为我的客户服务,但现在所有的表单提交都显示为空的 $_POST 数组。

我发现了一个技巧来验证数据是否被传递,使用 file_get_contents('php://input'); ,数据在那里正常显示 -- 无论是 $_POST/$_REQUEST 数组总是空的。

我也通过 firebug 验证了正确的 content-type header (application/x-www-form-urlencoded; charset=utf-8)。

不管是通过 AJAX 还是普通的表单提交,这个问题都会发生。

非常感谢任何帮助!


3
请检查post_max_size的值是否设置为8M而不是8MB。如果设置错误,在最新版本中您可能看不到任何错误,但$_POST的大小将设置为0。 - Sergei Karpov
3
注意:如果缺少斜杠,Apache会进行301重定向。 - Leandro Bardelli
32个回答

4

目前我还没有一个优雅的解决方案,但我想分享一下我的发现,以供遇到这个问题的其他人参考。问题的来源是在.htaccess文件中覆盖了两个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)

如果问题出在服务器设置/htaccess上,最好到Serverfault上提问。 - David Thomas
6
如果我没记错的话,文件大小应该像“xxM”这样指定,而不是“xxMB”,所以我想知道这是否可能与此有关... - J.C. Inacio

4
在我的情况下,当从HTTP提交到HTTPS时,$_POST是空的。 问题在于表单的action是这样的://example.com,当我将URL修正为https://example.com时,问题就解决了。

1
我认为这与服务器设置有关。我使用GoDaddy作为主机也遇到了同样的问题。这个解决方案没有解决问题。 - acarlstein
这个解决方案解决了我的问题。我之前头疼得厉害。 - gokaysatir

3

我也遇到了同样的问题!

我想通过Postman中的POST请求连接本地服务器代码,但这个问题浪费了我很多时间!

对于任何使用本地项目(例如Postman)的人:

请使用您的IPv4地址(在cmd中键入ipconfig),而不是“localhost”关键字。

在我的情况下:

之前:

localhost/app/login

之后:

192.168.1.101/app/login

Postman给我带来了一些问题,因为它无法处理带有引号或空格的抓取JSON值。它需要特定的格式。 - Tom Anderson

3

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

这将为您创建一个空的 PHP POST。

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

但是,这会起作用

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

我认为这与服务器设置有关。我使用 GoDaddy 作为主机也遇到了同样的问题。这个解决方案没有解决问题。 - acarlstein
对于那些关心的人,你可能需要进入设置自己的.htaccess的噩梦。 - acarlstein

3

我曾经遇到了相同的问题,问题出在 .htaccess 文件上。

我有一个 HTTPS 重写规则,但是它把 POST 请求发送到了 http:// 而不是 https://。 这导致 POST 请求被重定向并被清除了。


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);

任何POST请求都必须设置一些HTTP标头。因此,我们在以下行中设置它们...

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);
  }
}

我们为“ready state”改变事件设置了一个处理程序。这是我们用于GET方法的相同处理程序。您可以在此处使用http.responseText-使用innerHTML(AHAH)将其插入到div中,eval it(JSON)或执行其他任何操作。
http.send(params);

最后,我们使用请求发送参数。只有在调用此行之后,给定的url才会被加载。在GET方法中,参数将是null值。但在POST方法中,要发送的数据将作为send函数的参数发送。params变量在第二行被声明为lorem=ipsum&name=binny——因此我们发送两个参数——'lorem'和'name',其值分别为'ipsum'和'binny'。

2

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

在我的情况下,问题出现在我的 .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 返回的数据与以前一样正常。 希望这能帮助未来的某个人。


1

对我来说,当mod_rewrite没有安装时,.htaccess会进行重定向。安装mod_rewrite后一切正常。

具体来说:

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

正在执行。


1
在我的情况下,是因为我在使用jQuery提交表单之前,使用jQuery禁用了页面上的所有输入框。 所以我改变了我的做法,不再“禁用每个输入框,甚至包括‘隐藏’类型的输入框”:
$(":input").attr("disabled","disabled"); 

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

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

这样做是为了防止用户意外地点击“go”按钮,从而破坏我们的数据库! 如果在“hidden”类型的表单输入上放置“disabled”属性,则在提交表单时它们的值不会被发送!


1
我刚花了几个小时来解决类似的问题。在我的情况下,问题在于
max_input_vars = "1000"

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


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