使用AJAX发送数组的最佳策略


Best strategy on sending an array with AJAX

我有一些复选框作为数组发送到服务器。通常,我有这些复选框的列表我通过数组[]发送它。

例如,提交如下:

<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");
    }
});

现在,我想知道的是:

  1. 你怎么看这个策略?
  2. 创建JSON对象并在客户端/服务器端(内存,处理,定时,资源等)管理它更好吗?
  3. 为什么,对于这样的东西,我应该创建一个对象,转换为json,在php上解码,管理结果,转换为json和重新发送?我可以处理一个字符串…
  4. 只有PHP或其他语言服务器端(如ASP?)从参数列表中自动创建具有相同名称和[]的数组?

希望我的问题足够理解:)

我认为你在JSON的正确轨道上,它在这里是最有意义的。

  1. 将表单序列化为JSON(在jQuery中序列化为JSON)
  2. 通过ajax POST JSON字符串
  3. 然后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都可以作为数组和对象进行访问。

  1. 使用方法复杂。
  2. 我更喜欢JSON,它更容易使用,如果有一天你想改变它,它会更容易。此外,如果其他程序员需要理解你的代码,他可能会更好地理解JSON:)我不明白你的问题。
  3. 如果你通过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.

我认为这几乎是传统的最佳实践,或者接近。