2014-03-19 36 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编码没有任何关系。 –