【问题标题】:jQuery $.post sends vars correct, but PHP receives nothingjQuery $.post 发送正确的变量,但 PHP 什么也没收到
【发布时间】:2012-05-30 02:08:11
【问题描述】:

我有这个 jQuery 脚本,它将用户名和密码发送到 PHP 文件,该文件检查该用户是否存在并返回 JSON 用户对象。在非 IE 浏览器中运行良好,但 IE 失败。

奇怪的是,IE“萤火虫”说一切都很好,但 PHP 脚本没有收到任何变量...

这是请求正文:

用户名=johanderowan&密码=1234

这些是请求标头(出于安全原因,我省略了一些变量):

请求 = POST /1.0/account/login.json HTTP/1.1
接受 = /
来源 = [DEVURL]
接受语言 = nl-NL
UA-CPU = AMD64
接受编码 = gzip、放气
用户代理 = Mozilla/5.0(兼容;MSIE 9.0;Windows NT 6.1;Win64;x64;Trident/5.0)
主机 = [DEVURL]
内容长度 = 66
连接保活 Cache-Control no-cache

响应正文是(前三个空数组是 $_GET、$_POST 和 $_REQUEST):

数组 ( )
大批 ( )
大批 ( )
{"status":"error","message":"未指定用户名或密码。","httpCode":500}

这是请求脚本:

$('.mobyNowLoginForm form').bind('submit', function(){  
    var username = $(this).find('.username').val();  
    var password = $(this).find('.password').val();  
    $.post('[url]/1.0/account/login.json', {
        username: username,
        password: password
    }, function(response) {
        // do something
    }, "JSON");  
    return false;
});

我完全不知道这里有什么问题......

【问题讨论】:

  • 你是如何得到 HTTP 响应头和正文的?
  • var_dump(file_get_contents("php://input")); 向您展示了什么?请求标头中的Content-Type 是什么?
  • 可以肯定的是,请求标头错过了Content-Type: application/x-www-form-urlencoded。也许这就是 PHP 没有将请求正文填充到 $_POST 的原因。
  • FWIW,我可以让 jQuery 省略 Content-Type 标头而不发送 any POST 变量的唯一方法是 data 参数是否丢失或包含属性都是undefined(这并没有解释你如何看到请求正文被填充,但解释了其他所有内容)。尝试alerting username/password 的值。
  • 这更像是一个问题:你发布到 login.json,而不是 login.php

标签: php jquery post


【解决方案1】:

似乎 IE 在跨域请求中没有发送正确的内容类型。内容类型始终设置为“text/plain”。

在这篇博文中了解更多关于这个缺点的信息:http://blogs.msdn.com/b/ieinternals/archive/2010/05/13/xdomainrequest-restrictions-limitations-and-workarounds.aspx

我们通过解析 php://input 字符串并将其设置为 $_POST vars 在服务器上解决了这个问题。

if ($_SERVER['REQUEST_METHOD'] == 'POST' && count($_POST) == 0) {
    $postData = file_get_contents('php://input');
    $postVars = explode('&', $postData);
    foreach ($postVars as $postVar) {
        list($key, $var) = explode('=', $postVar);
        $_POST[$key] = $var;
    }
}

【讨论】:

  • 很好,不过在那种情况下我会使用parse_str($postData,$_POST);,用于array[]=foo&array[]=bar之类的输入。
【解决方案2】:

您是否尝试将缓存设置为 false。我遇到了类似的问题,这解决了它:

$.ajax({
  type: 'POST',
  url: '[url]/1.0/account/login.json',
  dataType: 'json',
  data: {
      username: username,
      password: password
  },
  cache: false,
  success: function() {
      // Do something
  }
});

希望对你有帮助!

史蒂芬

编辑

问题也可能出在您的请求网址中。您尝试调用 .json 文件。您可以尝试调用 .php 文件。

确保将其放入 .php 文件中:

header("Content-Type: application/json");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-02
    • 2015-01-04
    • 2012-03-14
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多