我有一些复选框可以作为数组发送到服务器。通常,我有这些复选框的列表,我通过数组[]发送它。
例如,提交此内容:
<input type="checkbox" class="linkStyle" name="style[]" value="1" checked="checked" /> 1
<input type="checkbox" class="linkStyle" name="style[]" value="2" checked="checked" /> 2
<input type="checkbox" class="linkStyle" name="style[]" value="3" checked="checked" /> 3
我将向服务器发送以下参数:
style[]=1
style[]=2
style[]=3
在服务器端,使用PHP,我可以使用$ _POST ['style']获取此数组(它将这些参数自动放入数组中);
现在,用AJAX请求来做这个场景有点奇怪,因为使用函数serialize()例如我得不到相同的结果:实际上,它把整个字符串放在一个变量中,并且它不会将主题值作为不同的参数发送。
参考之前的例子,它会发送像:
这样的东西style: style%5B%5D=Style1&style%5B%5D=Style2&style%5B%5D=Style3
这在PHP上很不舒服,因为它没有为这个值创建一个数组。 所以我已经完成了自己的脚本来模拟这种行为。如:
var styles="";
$('.linkStyle:checked').each(function(i,el){
styles=styles+'style[]='+$(this).val()+'&';
});
$.ajax ({
url: "list/browse_ajax.php",
type: "POST",
data: styles+'&id=browseUpdate&actualArtist='+browseArtist+'&actualEvent='+browseEvent+'&actualDate='+browseData,
success: function(data) {
$('#browseList').html(data);
},
error: function(data) {
$('#browseList').html("Error");
}
});
现在,我想知道的是:
希望我的问题足够可以理解:)
答案 0 :(得分:3)
答案 1 :(得分:3)
我认为你在JSON的正确轨道上,它在这里最有意义。
另见Convert form data to JavaScript object with jQuery(这两个SO问题包含有关库和插件的重要链接)
修改强>
关于你的问题:
您对此策略有何看法?
你的例子显示了吗?我假设你已经测试了它&amp;有用。如果它模仿你所期望的行为,我认为它很好。它要求你不要重写你的PHP,这是你显然很乐意使用的东西。这些都是好处。
但是,如果你明智地工作,将表单输入编码为JSON并使用json_decode具有相同的效果,理论上在解码JSON后编写PHP的方式几乎不需要改变。
创建JSON对象并在客户端/服务器端(内存,处理,计时,资源等)进行管理是否更好?
我不能说内存等。我不希望在服务器端处理JSON对象的性能不好。对于这样的问题,通常没有一个简单的答案,因为它取决于太多其他事情。
为什么,对于这样的东西,我应该创建一个对象,将其转换为json,在php上解码,管理结果,在json上转换它并重新发送?我只能管理一个字符串......
没有JSON的示例中发生了什么(松散地说):
在你的JSON示例中会发生什么(再次,松散地说):
你用它的方式给我的印象是你认为使用JSON增加了很多额外的步骤。我认为增加的复杂性在很大程度上是虚构的。 (根据您选择将表单输入“序列化”为JSON的方式,实际上它可能实际上只是一个JSON有效的字符串,直到您使用PHP解码。)
选择同时处理相同的JSON对象可能会有未来的好处。想象一下,发回验证信息&amp;例如,在JSON中......
只有PHP或其他语言服务器端(如ASP?)自动从名称和[]的参数列表中创建数组?
我不确定我是否理解这个问题,但我会回答一种语言如何处理从以下编码的GET字符串:
<input name="style[]" />
<input name="style[]" />
<input name="style[]" />
语言是独一无二的。我以前处理过ColdFusion,我想要类似的东西(根据输入的名称构造一个结构)。但要做到这一点,我必须遍历FORM范围并“重新声明”,即使它是有效的点语法,例如:
<input name="name.first" />
<input name="name.middle" />
<input name="name.last" />
例如,不应该像JavaScript一样将这些输入视为数组。我不记得JavaScript允许您使用以下语法填充数组:
style[] = "red";
style[] = "green";
style[] = "blue";
而PHP确实如此。这不是一个人做错了什么。这是PHP的捷径。在JavaScript中填充数组的最短方法是不同的。
至于将它转换为数组,那么......你不会在HTTP请求中传递数组,PHP允许你作为一个数组(或POST数据)访问GET字符串而不必有意识地做任何特殊事情......两件不同的事情。
这实际上是在这里使用JSON的最有说服力的理由,这就是为什么其他人说这正是JSON的意思。想想看,JSON是“一种轻量级,与语言无关,基于文本的开放标准,专为人类可读的数据交换而设计。”您可以使用JSON表示数组和对象,无论您选择使用哪种语言,都可以作为数组和对象进行访问。
答案 2 :(得分:2)
从js。
发送数组var qry = new Object();
qry['arg1'] = ...
qry['arg2'] = ...
qry['arg3'] = ...
然后
var jsonqry = 'jsonqry=' + JSON.stringify(arg);
初始化您的XMLHttpRequest ...
ajax.send(jsonqry);
用php接收。
$jsonqry = $_POST['jsonqry'];
$json = json_decode($jsonqry);
然后我有$ json-&gt; arg1等等。
另一个方向:
在php中:
$a = array();
$a['parm1'] = ...
$a['parm2'] = ...
$a['parm3'] = ...
var $rsp = json_encode($a);
echo $rsp;
并返回js,在Ajax监听器中:
var rsp = JSON.parse(msg);
我有
rsp.parm1, etc.
我认为这几乎是传统的最佳做法,或接近。