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

91 php forms arrays post

我有一个自定义的CMS我已经构建,在我的开发盒(Ubuntu/PHP5 +/MySQL5 +)上完美运行.

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

我找到了一个技巧来验证数据实际上正在使用file_get_contents('php://input');并且数据在那里显示正常 - $_POST/ $_REQUEST数组总是为空.

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

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

任何帮助是极大的赞赏!

til*_*tem 169

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

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

以下是纠正问题的方法:

$rest_json = file_get_contents("php://input");
$_POST = json_decode($rest_json, true);
Run Code Online (Sandbox Code Playgroud)

希望这有助于某人!

  • https://www.toptal.com/php/10-most-common-mistakes-php-programmers-make#common-mistake-7-assuming-post-will-always-contain-your-post-data (4认同)
  • 另一种选择是将 `Content-Type` 标头更改为 `application/x-www-form-urlencoded`,然后使用 `$.param(dataObject)` 序列化您的数据。那应该有帮助。 (2认同)

小智 83

这是另一个可能的原因 - 我的表单是在没有WWW的情况下提交到domain.com.我已经设置了一个自动重定向来添加"WWW".$ _POST数组在此过程中被清空.所以我要做的就是提交给www.domain.com

  • 该死的,我的`htaccess`中的网址重写是导致POST失败的原因.我自动将斜杠附加到所有url,但在代码作为ACTION我使用的是没有斜线的url.你的答案有所帮助,因为我从没想过要检查.htaccess.+1 (22认同)
  • 我也有类似的问题,它来自我的 `.htaccess` 文件。它从 URL 中剥离了 `.php` 扩展名,而我的表单是 `POST` 到带有扩展名的 URL。 (2认同)

小智 21

我遇到了类似的问题.原来是一个简单的修复.以我的形式

<form action ="directory"method ="post">

其中directory是...目录的名称.我的POST阵列完全是空的.当我在浏览器中查看网址时,结果显示为正斜杠.

在我的操作结束时添加正斜杠就可以了 -

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

我的$ _POST数组又满了!


MrM*_*age 12

确保在php.ini中:

  • track_vars (它仅适用于非常旧的PHP版本)设置为 On
  • variables_order 包含这封信 P
  • post_max_size 设置为合理的值(例如8 MB)
  • (如果使用suhosin补丁)suhosin.post.max_vars并且suhosin.request.max_vars足够大.

我想我的第二个建议将解决你的问题.

  • “post_max_size”设置是我的亮点。我在表单提交期间上传了一个大文件,并且此设置包含较小的值。因此,当我提交表单时,我得到一个空的帖子数组。 (2认同)

小智 7

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


小智 6

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

这个

<form method="post" action="/api/index.php"> 
</form>
Run Code Online (Sandbox Code Playgroud)

或者

<form method="post" action="/api/"> 
</form>
Run Code Online (Sandbox Code Playgroud)

作品。

但这失败了

<form method="post" action="/api"> 
</form>
Run Code Online (Sandbox Code Playgroud)


小智 5

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

亲切的问候弗兰克


小智 5

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

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

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

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

然后我检查了实际URL的错误.URL没有错,但它指向URL中没有index.php的文件夹,我在index.php检查POST.

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

工作了.

在这里发布,所以有人会发现它很有帮助.

  • 我遇到了同样的问题,网址末尾没有 '/' , $_REQUEST 中不存在任何内容,但使用 '/' 或 '/index.php' ,所有发布的数据都存在于 $_REQUEST 中。这可能是我的 nginx 设置或其他东西! (2认同)

Luk*_*ber 5

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

enable_post_data_reading

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


Iva*_*van 5

<form action="test.php" method="post">
                        ^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

好吧,这很愚蠢,我会在公共场合让自己难堪,但我用 PHP 编写了一些测试脚本,当我的$_POST数组为空时,StackOverflow 是我第一个查看的地方,但我没有找到我需要的答案。

我只写过

<form action="test.php">
Run Code Online (Sandbox Code Playgroud)

并忘记指定方法POST

我确信有人会窃笑,但如果这能帮助其他做同样事情的人,那么我不介意!我们都会时不时地这样做!