【问题标题】:Why is my $_POST empty but file_get_contents('php://input') is not?为什么我的 $_POST 是空的,但 file_get_contents('php://input') 不是?
【发布时间】:2018-04-19 11:41:59
【问题描述】:

当我使用常规的旧表单将POST 数据提交到我的服务器时,我可以从$_POST 变量中提取该数据,但是当POST通过AJAX 处理JSON 数据时,我需要通过file_get_contents('php://input') 访问它。这是为什么?在这两种情况下,我都使用POST 方法,是否应该在我的 AJAX 调用中设置一些明确的标头?我只在当前的开发服务器上遇到过这个问题,以前从未使用过file_get_contents('php://input')。某处有服务器设置吗?我可以使用 .htaccess 更改此行为吗?

【问题讨论】:

  • 这里可能有一些对你有用的信息,即使你没有使用 Angular:stackoverflow.com/questions/15485354/…
  • 您可以调整一些标题以使其填充 $_POST,但不记得哪些标题。 (抱歉不是很有帮助)
  • 也许 POST 请求的内容类型不是 application/x-www-form-urlencodedmultipart/form-data。可能是application/json。 PHP 将不会填充 $_POST

标签: javascript php html ajax post


【解决方案1】:

将此添加到 .php 文件的顶部:

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

以便内容将被属性解码并可用。之后,您可以照常访问各个密钥。

【讨论】:

  • 我一直在这样做,但我想知道为什么。以及为什么我以前不必这样做。
  • @AbrahamBrookes 我的理解是,这仅仅是因为有效负载是 JSON 并且能够正确创建 POST 数组,必须对 JSON 进行解码。
【解决方案2】:

据我所知,这与服务器接收数据的方式有关 - PHP 无法原生解析 JSON。将普通的旧 JSON 对象从 Javascript 发送到 PHP 将导致 PHP 不知道如何处理数据类型,因此它将无法预填充适当的全局变量。

为了解决这个问题,我在我的 ajax 包装函数中添加了一个检查,该函数拦截 JSON,编码为 FormData 对象并将其发送到服务器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-03
    • 2018-11-26
    • 2016-06-02
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 2018-08-08
    • 2015-04-16
    相关资源
    最近更新 更多