2016-08-24 117 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" 
} 

讓我知道,如果上述工程爲您服務。