2016-08-24 8 views
2

私は非常に困惑しています。php - json_decode未定義のインデックスですが、値はあります

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は、私がテストボタンをクリックしたときに、私は警告valueを取得しますが、上記のコードでは

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

です。私はテストボタンをclikced後に私はPHPページに行く場合。ページはNotice: Undefined index: obj on line 1, and null on line 2.

なぜですか?

私は値を入力するようになっているので、データが通過して戻ったことを意味する必要があります。 PHPのページはそれがnullだと言います。

+0

報告された動作は疑わしいと思われます。 '$ _POST ['myobj']'は一貫して式として動作します。それは文字列に評価されるか、または '未定義インデックス'の結果になります。 – user2864740

+0

すでに '$データ= $ _POST [ 'このmyobj']と、'作品、ちょうどあなたがそれが – Ghost

+0

を働い使用したのと同じパスを使用するのに役立つかもしれhttp://stackoverflow.com/a/4064468/3385827 –

答えて

2

$_POST['myobj'];は配列であり、json文字列ではありません。

ajaxメソッドでdataの値として使用すると、JSオブジェクトですが、明示的にcontentTypeを設定しない限り、ポストデータに変換されます。

$_POST['myobj']['key1']は、例えばキー1の値である必要があります:あなたは、デフォルトのコンテンツタイプを使用しているため、デフォルトでコンテンツタイプはapplication/x-www-form-urlencoded; charset=UTF-8

です。

オブジェクトにはvar_dumpを使用してください。オブジェクトの構造をよく理解してください。

すなわち

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

HMMのvar_dump($ _ POSTは、 ['myobj'])はnullを返します。 $ _POST ['myobj'] ['key1']はどちらも動作しませんでした。私がecho json_encode($ data)を変更した場合。ちょうどエコーする。私はオブジェクトObjectに警告しました。私はこれと何か関係があると思う。 – codenoob

+0

ただ 'var_dump($ _ POST)'を試してみよう。文字通り '$ data = $ _POST ['myobj']という論理的な理由はありません。 echo json_encode($ data); 'あなたが提案したように動作しますが、上記のコードを上記のコードに置き換えることはできません。 – skrilled

+0

あなたが明示的にdataType' json' ''に設定するので、jQueryのは、理にかなっていることで 'null'なので、との警告を返していることを言っている場合を除きます。それがあなたが言っていることなら、ダンプされているデータを見ることができるように、jsonからdataTypeを削除してください。 – skrilled

0

私はあなたがPHPにJSONオブジェクトを投稿するとき、あなたが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); 

小さなデモ、それを呼び出すためにcurlを使用して(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 -X POST -d '{"test": "value"}' localhost/test.php 
array(0) { 
} 
array(1) { 
    ["test"]=> 
    string(5) "value" 
} 

最後に、JSONデータとURLパラメータを同時に渡す場合は、次のようにします。

内のURLとデータの両方のパラメータの結果と上記の呼び出し0
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); 

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

私はあなたのための場合は、上記の作品を知ってみましょう。

関連する問題