【问题标题】:PHP receiving JsonPHP接收Json
【发布时间】:2012-03-06 17:24:29
【问题描述】:

我正在使用淘汰赛,我正在尝试将信息发送到 PHP,使用 firebug 来检查网络 -> 标题我有这个:

Request URL:http://localhost/loyalty/welcome/json/
Request Method:POST
Status Code:200 OK
Request Headersview source
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:en-US,en;q=0.8
Connection:keep-alive
Content-Length:85
Content-Type:application/json
Host:localhost
Origin:http://localhost
Referer:http://localhost/loyalty/
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.46 Safari/535.11
X-Requested-With:XMLHttpRequest
Request Payload
{"friends":[{"name":"name","isOnTwitter":false},{"name":"name","isOnTwitter":false}]}
Response Headersview source
Connection:Keep-Alive
Content-Length:0
Content-Type:text/html
Date:Wed, 15 Feb 2012 11:01:23 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.2.21 (Win32) mod_ssl/2.2.21 OpenSSL/1.0.0e PHP/5.3.8 mod_perl/2.0.4 Perl/v5.10.1
X-Powered-By:PHP/5.3.8

生成的 JSON 是:{"friends":[{"name":"name","isOnTwitter":false},{"name":"name","isOnTwitter":false}]},我不知道如何获取这些值。

这是 Ajax 调用:

save: function() {
        $.ajax({
            url:"http://localhost/loyalty/welcome/json/",
            type: "post",
            data: ko.toJSON(this),
            contentType: "application/json",
            success: function (result) {
                alert(result);
            }
        });

在我的 CodeIgniter 方法中,我尝试使用 $this->input->post('friends') 以及我能想到的任何其他方法接收它,但没有任何结果。

【问题讨论】:

    标签: php ajax json knockout.js


    【解决方案1】:

    改变

    data: ko.toJSON(this),
    

    data: {mydata : ko.toJSON(this) },
    

    在您在http://localhost/loyalty/welcome/json/ 上发帖时打开的文件中

    读作:

    $myObj = json_decode($_POST['mydata']);
    

    然后您可以通过以下方式访问您的值:

    echo $myObj['friends'][0]['name']; or echo $myObj['friends'][0]['isOnTwitter'];
    

    它将在您的 json 代码读取时输出 nametrue/false

    编辑

    这个帖子应该可以帮助你 -> Jquery - How to make $.post() use contentType=application/json?

    【讨论】:

    • 使用 CodeIgniter 返回 bool(false),使用 $_POST[] 返回“未定义变量:mydata”
    • 您是否按照我在回答开头部分的建议进行了更改?
    • 是的......这是新的 JSON:mydata={"friends":[{"name":"João","isOnTwitter":false}]} 我的 php 是和你的一模一样
    • 正确,然后正如我的回答所说,您需要解码 json 并使用 foreachfor loop 访问它,或者直接引用最适合您的数组。
    • 对...但问题是在这一行: $myObj = json_decode($_POST['mydata']);我已经收到错误“未定义的索引 mydata”
    【解决方案2】:

    我把 Javascript 改成这样:

    $.ajax({
        url:"http://localhost/loyalty/welcome/json/",
        type: "post",
        data: {payload:ko.toJSON(this)},
        success: function (result) {
                t.value = result;
        }
    });
    

    然后,在 PHP 中,您可以通过以下方式访问 JSON:

    <?php json_decode($_POST["payload"]); ?>
    

    【讨论】:

    • 知道为什么删除的行是问题吗?
    • 如果你没有将data 参数作为一个对象传递,而是作为一个字符串传递,jQuery 假定你已经对它进行了 URL 编码,而你没有。然而,为了让 PHP 读取数据,它必须使用变量名进行 URL 编码。编写 data: {payload:ko.toJSON(this)} 告诉 jQuery 自动对 JSON 进行 URL 编码并将其放入 payload 变量中。
    • 对不起,我看错了你的问题。要让 PHP 读取数据,您必须使用 MIME 类型 application/x-www-form-urlencoded。 jQuery 默认使用这个。指定 contentType: "application/json" 会覆盖它。
    【解决方案3】:

    由于 Content-Type 是“application/json”而不是“application/x-www-form-urlencoded”,$_POST 数组将为空。

    因此,为了在 POST 请求中访问 JSON 有效负载,您必须这样做:

    $json_data = json_decode(trim(file_get_contents('php://input')), true);    
    echo($json_data['param1']);
    echo($json_data['param2']);
    

    【讨论】:

      【解决方案4】:

      要让 PHP 获取 JSON 对象,您需要使用 json_decode()

      http://php.net/manual/en/function.json-decode.php

      【讨论】:

        猜你喜欢
        • 2012-03-06
        • 2018-09-17
        • 1970-01-01
        相关资源
        最近更新 更多