我有一些复选框作为数组发送到服务器。通常,我有这些复选框的列表我通过数组[]发送它。
例如,提交如下:
<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");
}
});
现在,我想知道的是:
- 你怎么看这个策略? 创建JSON对象并在客户端/服务器端(内存,处理,定时,资源等)管理它更好吗?
- 为什么,对于这样的东西,我应该创建一个对象,转换为json,在php上解码,管理结果,转换为json和重新发送?我可以处理一个字符串…
- 只有PHP或其他语言服务器端(如ASP?)从参数列表中自动创建具有相同名称和[]的数组?
希望我的问题足够理解:)
我认为你在JSON的正确轨道上,它在这里是最有意义的。
- 将表单序列化为JSON(在jQuery中序列化为JSON)
- 通过ajax POST JSON字符串
- 然后http://php.net/manual/en/function.json-decode.php
请参见使用jQuery将表单数据转换为JavaScript对象(这两个SO问题包含有价值的库链接&插件)
编辑
关于你的问题:
你觉得这个策略怎么样?
你的例子显示?我假设你已经测试过了。它的工作原理。如果它模仿了你所期望的行为,我认为它很好。它不需要您重写任何PHP代码,而且您显然可以轻松地使用它。这些都是好处。
但是,如果您明智地工作,将表单输入编码为JSON并使用json_decode具有相同的效果,理论上只需在解码JSON后编写PHP的方式进行很少的更改。
创建一个JSON对象并在客户端/服务器端管理它(内存,处理,定时,资源等)更好吗?
我不能说记忆等。我不认为在服务器端处理JSON对象会影响性能。对于这样的问题通常没有一个简单的答案,因为它取决于太多其他的事情。
为什么,像这样的东西,我应该创建一个对象,转换为json,解码它在php上,管理结果,转换成json和重新发送?我可以管理一个字符串…
在没有JSON的例子中会发生什么(粗略地说):
- 浏览器接受输入,将其编码为GET请求字符串
- 发出包含字符串 的GET请求
- PHP访问GET字符串,允许您将其作为数组引用
在JSON示例中会发生什么(再次,松散地说):
- JavaScript接受输入,将其编码为JSON
- 发出包含字符串 的GET(或POST)请求
- PHP访问GET字符串(或POST数据),允许您将其作为数组引用
- 在其中一个数组键上使用json_decode将其转换为PHP对象
你表达的方式给我的印象是你认为使用JSON会增加很多额外的步骤。我认为增加的复杂性在很大程度上是虚构的。(取决于你选择如何将表单输入"序列化"为JSON,它实际上可能只是一个JSON有效的字符串,直到你用PHP解码。)
选择始终处理相同的JSON对象可能会有未来的好处。想象一下发回验证信息&
只有PHP或其他语言服务器端(如ASP?)从参数列表中自动创建具有相同名称和[]的数组?
我不确定我是否理解这个问题,但我会回答语言如何处理从
编码的GET字符串:<input name="style[]" />
<input name="style[]" />
<input name="style[]" />
对于语言来说是唯一的。我以前处理过ColdFusion,我想要一些类似的东西(根据输入的名称构造一个结构体)。但是要做到这一点,我必须循环通过表单范围和"重新声明",即使它是有效的点语法,例如:
<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允许您访问GET字符串作为数组(或POST数据),而无需有意识地做任何特别的事情……两件不同的事
这实际上是在这里使用JSON的最令人信服的原因,这就是为什么其他人说这正是JSON的意义所在。想想看,JSON是"一种轻量级的、独立于语言的、基于文本的开放标准,专为人类可读的数据交换而设计。"您可以使用JSON来表示数组和对象,无论您选择使用哪种语言,JSON都可以作为数组和对象进行访问。
- 使用方法复杂。 我更喜欢JSON,它更容易使用,如果有一天你想改变它,它会更容易。此外,如果其他程序员需要理解你的代码,他可能会更好地理解JSON:)我不明白你的问题。
- 如果你通过post发送数据,它应该被大多数语言转换为数组。
祝你好运!
从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->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.
我认为这几乎是传统的最佳实践,或者接近。