我正在尝试从JS发送一个数组到PHP。
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);
}
两件事:
-
你不能只是把JSON转储到URL的末尾,并期望它能正确地传递到服务器。
至少,您必须对它进行uri编码:
url += "&json="+encodeURIComponent(json);
-
你在代码片段中使用
extraFields
的方式,它是而不是被用作数组。如果您将它创建为数组,那么这些键将不会被序列化。你使用它的方式,创建extraFields
的正确方法是:extraFields = {}; // NOT `= []` and NOT `= new Array()`
那是一个对象,不是数组。(不要让PHP术语"关联数组"欺骗了你;这个术语是php特有的,与一般意义上的术语"数组"无关。如果你想在JavaScript代码中使用任意的名称/值对,术语是"对象"[有时是"地图"或"字典",但它们都是对象])
如果在数组中添加非索引属性,
JSON.serialize
将忽略它们(忽略它们)。对于数字索引的数据,只使用JSON数组([]
)。为名称/值对使用对象({}
)