【问题标题】:When passing a JSON string to PHP the return value is NULL将 JSON 字符串传递给 PHP 时,返回值为 NULL
【发布时间】:2012-11-21 11:54:41
【问题描述】:

我正在学习 JSON。我已经四处阅读以找到解决我可能做错的事情,但我真的找不到它。我正在尝试将 JSON strnig 传递给 PHP 并查看它返回的内容......无论我做什么,我当前的代码总是返回 null。 我觉得我正在尽一切努力让它发挥作用。但显然我一定错过了什么

谁能告诉我为什么$arrayData总是返回NULL

我可以看到当前发布的是mydata=%7B%22name%22%3A%22yes%22%2C%22regno%22%3A%22hola%22%7D 如果我不使用JSON.stringify(),那么我会看到数据发送为mydata=[object Object]

PHP

<?php
$mydata = $_POST['mydata'];
$arrayData = json_decode($mydata);
var_dump($arrayData);
 ?>

HTML

<script>
function lol () {
            var name = "yes";
            var regno = "hola";
            var arrayData = {"name":name,"regno":regno};
            console.log(arrayData);

            $.ajax({  
                      url: "algo2.php"
                      ,type: "POST"
                      ,headers: {'Content-Type': 'application/json',}
                      ,data: {'mydata=' : JSON.stringify(arrayData)}
                      ,success : function(response) {                            
                        alert(response);            
                      }
                      ,error: function (xhr, ajaxOptions, thrownError) {
                        alert(thrownError);
                      }
                });
}

</script>
</head>
<button onclick="lol()">Try it</button>

选项 2

function lol () {
            var name = "yes";
            var regno = "hola";
            var arrayData = {"name":name,"regno":regno};
            console.log(arrayData);
            console.log(JSON.stringify(arrayData)); 
            $.ajax({  
                      url: "algo2.php"
                      ,type: "POST"
                      ,data: 'mydata=' + arrayData
                      ,success : function(response) {                            
                        alert(response);            
                      }
                      ,error: function (xhr, ajaxOptions, thrownError) {
                        alert(thrownError);
                      }
                });
}

【问题讨论】:

    标签: php javascript json


    【解决方案1】:

    如果您将数据字符串化,则需要先urldecode()

    $mydata="%7B%22name%22%3A%22yes%22%2C%22regno%22%3A%22hola%22%7D";
    $json= urldecode($mydata);
    $array = json_decode($json, true); //use the argument true if you want the object to be returned as an Associative array
    print_r($array);
    

    如果不使用json_decode()中的第二个参数,它将作为对象返回:

    $mydata="%7B%22name%22%3A%22yes%22%2C%22regno%22%3A%22hola%22%7D";
    $json= urldecode($mydata);
    $object = json_decode($json);
    echo $object->name;
    

    【讨论】:

    • 即使我执行 urldecode($_POST); 也不起作用。但我不应该做 urldecode...我还没有看到一个使用它的 JSON 示例
    • 也许是标题 deceze 回答的问题,我刚刚尝试了我粘贴的代码,它有效,我的意思是,它正确返回了数组/对象
    【解决方案2】:
    mydata=%7B%22name%22%3A%22yes%22%2C%22regno%22%3A%22hola%22%7D
    

    这是application/x-www-form-urlencoded 数据,而不是application/json 数据。然而,您在标题中指定它是 JSON 数据。 PHP 不会解码该数据,也不会填充$_POST 数组。

    要么发送带有 JSON 标头的实际 JSON 数据并自行解码(来自 php://input),要么省略标头,发送 urlencoded 数据(原样)并让 PHP 填充 $_POST 数组。

    【讨论】:

    • 感谢您的回复。我试过“headers: {'Content-Type': 'application/json',} ,data: 'mydata=' +arrayData” 但还是不行。您能否提供一个如何将其作为 JSON 发送的示例?谢谢
    • 您发送的内容与您声称发送的内容不匹配! "mydata=..."urlencoded 格式,而不是 JSON。当你不是时,不要声称要发送 JSON。 mydata 的值是 JSON 没关系,它是用 urlencoded 格式包装的。保留 urlencoded 数据,只需删除错误地指定您正在发送 JSON 数据的 headers 声明。
    【解决方案3】:

    如果您将 JSON 发送到 php,则需要读取原始输入,如下所示:

    $input = file_get_contents("php://input");
    if (!empty($input)) {
        $arrayData = json_decode($input, true);
        var_dump($arrayData);
    }
    

    在 jquery 中我也将它用于 json 请求:

    $.ajaxSetup({ dataType:"json", mimeType:"application/json", contentType:"application/json"})
    

    【讨论】:

    • 我刚刚用那个替换了我的 PHP 文件,它仍然返回 null,我拿了 JS 的“标题”
    【解决方案4】:

    一个。删除标题的东西
    湾。将密钥改为mydata,不带等号

    var name = "yes";
    var regno = "hola";
    var arrayData = {"name":name,"regno":regno};
    
    $.ajax({  
          url: "index.php"
          ,type: "POST"
          ,data: {'mydata' : JSON.stringify(arrayData)}
          ,success : function(response) {                            
            //alert(response);            
          }
          ,error: function (xhr, ajaxOptions, thrownError) {
            //alert(thrownError);
          }
    });
    

    【讨论】:

    • 我已经尝试使用 'mydata' 而不是 'mydata=' 并且得到了相同的结果。
    • print_r($_POST) 并在萤火虫中检查实际上有东西发送到服务器
    • 如果我 print_r ($_POST) 我得到 Array ()
    • 表示请求为空。问题不在于 PHP,而在于 Javascript 的某个地方。尝试删除标题的东西。您发送的内容应该是普通表单数据。尝试不使用标题并继续 print_r'ing 帖子数组,直到它被填充。
    • 我做到了。仍然没有得到它。唯一的解决方案是将“mydata =”从字段中取出并发送和数组......这是一个选项,但是......应该可以做我想做的事情
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多