2014-03-19 39 views
0

我想從JS發送數組到PHP。Javascript JSON.stringify/PHP json_decode不工作

JS:

var json = JSON.stringify(extraFields); 
url += "&json="+json; 

PHP:

$json = json_decode($_GET['json'], true); 

foreach($json as $K=>$V){ 
    echo "json".$K . "=" . $V ."; "; 
} 

假設extraFields是這個格式的有效陣列:

extraFields['key1'] = 'val1'; 
extraFields['key2'] = 'val2'; 
extraFields['key3'] = 'val3'; 

我得到的PHP錯誤是invalid argument for Foreach

當我循環訪問$_GET值並回顯它們時,PHP顯示爲$_GET['json']的空括號,因此它將它識別爲json ..

我在做什麼錯了?

答到TJ的評論

var extraFields = new Array(); 
       var countFields = THIS.$_FIELDS.length; 
       var Row = new Array(); 
       while(countFields--){ 
        var name = THIS.$_FIELDS[countFields]['name']; 
        var id = THIS.$_FIELDS[countFields]['id']; 
        var elemVal = getElmVal(id); 
        extraFields[name] = elemVal; 
        window.alert(name +"="+ elemVal); 
       } 
+0

從JS發送到PHP時檢查標頭,並且在使用'json_decode'時,檢查json_decode是否返回null。如果是這樣,'echo json_last_error_msg();'看看有什麼不對。 –

+0

你是如何創建*'extraFields'的? '= {}'? '= []'? –

+0

@ T.J.Crowder看到我的編輯 –

回答

3

兩件事情:

  1. 你不能只是轉儲JSON在網址的結尾,並期望它正確地去通過與服務器。

    最起碼,你要URI編碼是:

    url += "&json="+encodeURIComponent(json); 
    
  2. 您使用的是您的代碼段extraFields的方式,它是被用作陣列。如果您已將其創建爲數組,則這些鍵不會被序列化。你使用它的方式,創造extraFields正確的做法是:

    extraFields = {}; // NOT `= []` and NOT `= new Array()` 
    

    這是一個對象,而不是一個數組。 (不要讓PHP術語「關聯數組」欺騙你;這個術語是PHP特有的,並且與一般意義上的「數組」沒有關係。如果你想在JavaScript代碼中使用任意名稱/值對,術語是「對象」[或者有時是「地圖」或「字典」,但它們是對象)。)

    如果將非索引屬性添加到數組中,JSON.serialize將忽略它們(將它們忽略)。僅對數字索引數據使用帶JSON的數組([])。名稱/值對使用對象({})。

+0

謝謝,TJ ..你看到使用JavaScript的'escape()'代替了一個問題嗎? –

+0

@Adelphia:是的;那不是'逃避'的意思。 'escape'與URI編碼沒有任何關係。 –