Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 通过ajax发布json数据会发送一个空数组_Php_Ajax_Arrays_Json - Fatal编程技术网

Php 通过ajax发布json数据会发送一个空数组

Php 通过ajax发布json数据会发送一个空数组,php,ajax,arrays,json,Php,Ajax,Arrays,Json,我试图通过ajax发布数据,以下是我的信息: var jsondata = {"address" : [ { "id": addid, "streetaddress": streetaddress, "city": city, "state": state, "zipcode": zipcode, "latitude": latitude}, ] }; v

我试图通过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');
    {"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}
}

在php端,当我打印r($\u POST)时,它只是说

    array(0) {
    }
我在提醒(jsontosend),它完美地向我展示了一切,在firebug使用post-mothod时,它以完美干净的方式展示了所有发送的参数

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

非常感谢您的建议

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

    $.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');
    {"address":[{"id":1473294,"streetaddress":"3784 Howard Ave","city":"Washington DC","state":"DC","zipcode":20895,"latitude":39.027820587}]}
这就是firebug在使用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
这是对$u POST的var_dump的响应:

    array(0) {
}

这是$u POST['myData'的var_转储

    NULL
使用

data:{myData:jsontosend}


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

尝试从ajax请求中删除'dataType:'JSON',然后检查。

我怀疑您使用contentType属性的方式。尝试取出contentType。默认内容类型为 application/x-www-form-urlencoded()

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

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

正如dkulkarni在他的帖子(1月24日7:53)中所评论的,检索内容类型application/JSON发送的JSON的唯一方法似乎是直接从输入流检索它

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

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


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

PHP不理解应用程序/json请求(默认情况下)。
查看此问题:

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

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

    return $_POST;
为此:

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

它工作得很好。

删除contentType不是一个好主意。您确实希望以JSON格式发送此数据。关键是要执行上面提到的操作,而不是尝试使用$data=$\u POST访问接收端(目标php文件)上的数据,关键是使用$data=file\u get\u contents('php://input');

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

JS(在请求页面上):

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


在发布的数据到达php脚本之前,您是否有任何“偶尔”重定向?我不这么认为,我不确定我是否完全理解您的意思。“当我打印时…”您是什么意思?在浏览器中打开此页?firebug会显示所调用php脚本的所有响应。@Mike,我是说服务器端的302重定向?它将丢失post数据。$\u SERVER['REQUEST\u METHOD']中有什么内容?我尝试了不同的组合,在mydata中使用“”和不使用“”,但它仍然返回一个空数组。嘿,您尝试过从php输入数据流中获取数据吗
当您使用JSON内容类型时,在PHP端,有必要使用php://input 我还没有尝试过,但是删除内容类型修复了它。我刚刚测试了你的方法,(准确地复制/粘贴你的代码),它返回nullit is content type!这是一场噩梦!因为像内容类型这样愚蠢的事情浪费了5个小时!它看起来仍然很糟糕,但我还没有机会添加斜杠。讽刺的是,在我看到你的答案之前,我实际上只是尝试了一下,结果成功了。但你的答案是最肯定的!谢谢,我想你只是从php页面取错了!阅读我的评论below@Mike很遗憾听到这个消息。很高兴你自己发现了!您不能保留数据类型:“JSON”而仍然删除内容类型吗?我就是这么做的,而且效果很好。虽然我花了好几个小时才看到史蒂文·韦克斯勒的答案,但这绝对是天才。非常感谢。感谢dkulkami的评论,也感谢您通过这个答案使解决方案更加明显。我花了好几个小时试图弄明白为什么$u帖子是空的。。。