php - json_decode未定义索引,但值为

时间:2016-08-24 23:13:50

标签: javascript php jquery json ajax

我很困惑。

我将一个键值对象从jquery传递给了php。并成功再次提醒它,但如果我去php页面。它说数据是null或未定义的索引。

下面的

是我的jquery

$('#test').click(function(){
   var obj= {
                'key': 'value',
            };
$.ajax({
                url: "../folder/file.php",
                type: "POST", 
                data: {
                    'obj' : obj
                },
                dataType: "JSON",
                success:function(data){
                    alert(data);
                }

            });
}); 

下面是我的php

$data = $_POST['obj']; // this is line 1
echo json_encode($data); // this is line 2

使用上面的代码,当我点击测试按钮时,我会收到警告value。但如果我在浏览测试按钮后进入php页面。该页面显示Notice: Undefined index: obj on line 1, and null on line 2.

为什么?

我收到了我所投入的价值的警报。因此,它必须意味着数据经过并返回。但是php页面说它是空的。

2 个答案:

答案 0 :(得分:2)

$_POST['myobj'];是一个数组,而不是一个json字符串。

虽然在ajax方法中将它用作data的值时它是一个JS对象,但除非您明确设置contentType,否则它将被转换为post数据。默认情况下,内容类型为application/x-www-form-urlencoded; charset=UTF-8

因为您使用的是默认内容类型:

例如,

$_POST['myobj']['key1']应该是key1的值。

在对象上使用var_dump可以更好地查看它,并了解它的结构。

var_dump($_POST['myobj']);

答案 1 :(得分:0)

我认为当您将JSON对象发布到PHP时,您可以通过php://input阅读它们。 php://input包含原始POST数据,因此是需要进行JSON编码的字符串:

// Read all
$json = file_get_contents('php://input');
// String -> array (note that removing `true` will make it object)
$obj = json_decode($json, true);
// Print it
var_dump($obj);

小型演示(test.php)

<?php
var_dump($_POST);

// Read all
$json = file_get_contents('php://input');
// String -> array (note that removing `true` will make it object)
$obj = json_decode($json, true);
// Print it
var_dump($obj);
?>

使用curl输出来调用它:

$ curl -X POST -d '{"test": "value"}' localhost/test.php
array(0) {
}
array(1) {
  ["test"]=>
  string(5) "value"
}

最后,如果您希望能够同时传递JSON数据和URL参数,请使用以下命令:

function buildRequest(){

    // Get Data
    $json = file_get_contents('php://input');

    // Form the request from the imput
    if ($json!=""){
        $_REQUEST = array_merge_recursive($_REQUEST,json_decode($json, true));
    }
}

buildRequest();
var_dump($_REQUEST);

使用URL和数据参数调用上述内容会导致:

curl -X POST -d '{"test": "value"}' localhost/test.php?param=value2
array(2) {
  ["param"]=>
  string(6) "value2"
  ["test"]=>
  string(5) "value"
}

如果以上情况适合您,请告诉我。