【问题标题】:POST json data via ajax sends an empty array通过 ajax POST json 数据发送一个空数组
【发布时间】:2012-02-17 11:42:48
【问题描述】:

我正在尝试通过 ajax 发布数据,这是我的信息:

    var jsondata =
                {"address" : [
                { "id": addid, "streetaddress": streetaddress, "city": city, "state": state,  "zipcode": zipcode, "latitude": latitude},
            ]   
            };  

    var jsontosend = JSON.stringify(jsondata, null, 2);

ajax 函数:

    $.ajax({
                type: "POST",
                url: "process.php",
                contentType: "application/json; charset=utf-8",
                dataType: "JSON",
                data: jsontosend,
                success: function(msg){
                   alert(msg);
                          }
             });

            return false;

            alert('Data sent');

}

在 php 端,当我 print_r($_POST) 它只是说

    array(0) {
    }

我正在提醒 (jsontosend),它完美地向我展示了一切,以及在使用 post 方法的 firebug 中,它以完美干净的方式显示了所有发送的参数。

它传递任何数据的唯一方法是我使用 GET 方法。

非常感谢任何建议!

编辑:从 firebug 添加 POST 数据。 这是警报功能发出的警报:

    {"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}

这是萤火虫在使用 POST 方法时显示的内容:

    myData=%7B%0A++++%22address%22%3A+%5B%0A++++++++%7B%0A++++++++++++%22id%22%3A+76076%2C%0A++++++++++++%22streetaddress%22%3A+%223784+Howard+Ave%22%2C%0A++++++++++++%22city%22%3A+%22Washington+DC%22%2C%0A++++++++++++%22state%22%3A+%22DC%22%2C%0A++++++++++++%22zipcode%22%3A+20895%2C%0A++++++++++++%22latitude%22%3A+39.027820587%0A++++++++%7D%0A++++%5D%0A%7D

这是 $_POST 的 var_dump 的响应:

    array(0) {

}

这是 $_POST['myData'] 的 var_dump

    NULL

【问题讨论】:

  • 在发布的数据到达 php 脚本之前,您是否有任何“偶尔”重定向?
  • 我不这么认为,但我不确定我是否完全理解您的意思。
  • "当我 print_r..." 你是什么意思?在浏览器中打开此页面?
  • firebug 显示来自被调用的 php 脚本的所有响应。
  • @Mike 我的意思是服务器端的任何 302 重定向?它将丢失发布数据。你在 $_SERVER['REQUEST_METHOD'] 中有什么?

标签: php ajax arrays json


【解决方案1】:

我对您使用 contentType 属性的方式持怀疑态度。尝试取出 contentType。默认内容类型是 应用程序/x-www-form-urlencoded (http://api.jquery.com/jQuery.ajax/)。

另外,为您的数据属性使用类似 {mydata: jsontosend} 的内容。

$.ajax({
            type: "POST",
            url: "process.php",
            //contentType: "application/json; charset=utf-8",
            dataType: "JSON",
            data: {mydata: jsontosend},
            success: function(msg){
               alert(msg);
                      }
         });

【讨论】:

  • 它是内容类型!这是一场噩梦!
  • 因为内容类型这样愚蠢的东西而浪费了 5 个小时!它看起来仍然很糟糕,但我还没有机会添加stripslashes。
  • 具有讽刺意味的是,我实际上只是在看到您的答案之前尝试过它并且它有效。但你的答案绝对是它!谢谢
  • 我认为您只是从 php 页面获取错误!在下面阅读我的评论
  • @Mike 很遗憾听到这个消息。很高兴你自己解决了!
【解决方案2】:

使用

data:{myData: jsontosend}

它应该在您的请求中将 myData 作为参数发送。

【讨论】:

  • 我已经尝试了不同的组合,在 mydata 周围有和没有“”,它仍然返回一个空数组。
  • 您好,您是否尝试过从 php 输入数据流中获取数据? <?php $data = file_get_contents('php://input'); $data = json_decode($data, true); print_r($data); ?>
  • 当您使用 JSON 内容类型时,在 PHP 端,需要使用 php://input 流直接从请求正文中手动读取 JSON 字符串。
  • 我没试过,但删除内容类型修复了它。
  • 我刚刚测试了你的方法,(完全复制/粘贴你的代码),它返回 null
【解决方案3】:

PHP 不理解 application/json 请求(默认情况下)。 看到这个问题:How to post JSON to PHP with curl

【讨论】:

    【解决方案4】:

    我发现 dkulkarni 提供的评论是这里最好的解决方案。有必要直接从输入流中读取以获取任何复杂的 POST 数据。更改 $.ajax({contentType: ''}) 的值对我不起作用..

    为了解决这个问题,我设置了一个控制器方法来回显我发布到服务器的 JSON。更改 ContentType 标头没有任何区别。 但是在阅读了 dkulkarni 的评论后,我改变了我的服务器代码:

        return $_POST;
    

    到这里:

        $data = file_get_contents('php://input');
        return json_decode($data);
    

    效果很好。

    【讨论】:

    • 这真是天才。谢谢!!!!感谢 dkulkami 的评论,并感谢您通过此答案使解决方案更加明显。我花了几个小时试图弄清楚为什么 $_POST 是空的......
    【解决方案5】:

    正如 dkulkarni 在他的帖子(1 月 24 日 7:53)中评论的那样,检索使用 Content-Type application/json 发送的 JSON 的唯一方法似乎是直接从输入流中检索它。

    我用不同的方法做了很多测试,但总是当我将 Content-Type 设置为 JSON 时,PHP 中的 $_POST 是空的。

    我的问题是我需要将 Content-Type 设置为 JSON,因为服务器(我无权访问)需要它,否则它会返回不受支持的数据类型。我想他们是直接从输入流中检索的。

    为什么我必须在自己的 PHP 文件中重现它?因为我需要为测试问题做一个代理,但这不是这个线程的重点。

    【讨论】:

    • 你不能离开 datatype: "JSON" 并且仍然删除 content-type 吗?这就是我所做的,而且效果很好。尽管我花了好几个小时才看到 Steven Wexler 的回答。
    【解决方案6】:

    取出 contentType 不是一个好主意。您确实希望以 JSON 格式发送此数据。关键是做上面提到的事情,而不是尝试使用 $data= $_POST 访问接收端(目标 php 文件)上的数据,使用 $data = file_get_contents('php://input' );

    这是一个使用 php 和 knockout.js 的场景的整个往返示例:

    JS(在请求页面上):

    function() {
       var payload = ko.toJSON({ YOUR KNOCKOUT OBJECT });
       jQuery.ajax({
                url: 'target.php',
                type: "POST",
                data: payload,
                datatype: "json",
                processData: false,
                contentType: "application/json; charset=utf-8",
                success: function (result) {
                    alert(result);
                }
            });
     };
    

    然后在target.php中(接收请求的页面):

    $data = file_get_contents('php://input');
    $payload_jsonDecoded = json_decode($data
    

    【讨论】:

      【解决方案7】:

      尝试从 ajax 请求中删除 'dataType: "JSON" ' 并检查。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-03-08
        • 2016-05-11
        • 1970-01-01
        • 1970-01-01
        • 2013-01-09
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        相关资源
        最近更新 更多