2016-08-24 119 views
2

我很困惑。php - json_decode未定义索引,但值是

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

是我的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页面显示它为空。

+0

报道的行为似乎令人怀疑:'$ _POST ['myobj']'会表现为一致的表达式;它将评估为字符串或导致“未定义的索引”。 – user2864740

+0

你已经说过了'$ data = $ _POST ['myobj'];'工作,只是使用你工作过的相同路径 – Ghost

+0

可能有助于http://stackoverflow.com/a/4064468/3385827 –

回答

2

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

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

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

$_POST['myobj']['key1']应该为key1例如价值。

使用var_dump对物体进行更好的观察,并了解它的结构。

var_dump($_POST['myobj']); 
+0

hmm var_dump($ _ POST ['myobj'])说空。和$ _POST ['myobj'] ['key1']都没有工作。如果我改变echo json_encode($ data);只是回声。我被提醒了对象对象。我认为它与此有关 – codenoob

+0

现在就试试'var_dump($ _ POST)'。为什么'$ data = $ _POST ['myobj']实际上没有逻辑上的原因; echo json_encode($ data);'会像你所建议的那样工作,但用我上面提到的代码替换那个代码不会。 – skrilled

+0

除非你说jQuery在'null'中返回alert,这是有道理的,因为你明确地设置'dataType'为'json'。如果这就是你说的话,那么从json中删除dataType,这样你就可以看到被转储的数据。 – skrilled

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" 
} 

让我知道,如果上述工程为您服务。