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

时间:2011-05-03 20:31:17

标签: php javascript jquery html json

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

例如,提交此内容:

<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?)自动从名称和[]的参数列表中创建数组?
  5. 希望我的问题足够可以理解:)

3 个答案:

答案 0 :(得分:3)

  1. 要使用复杂的方法。
  2. 我更喜欢JSON,它更容易使用,如果你想有一天改变它会更容易。此外,如果其他程序员需要了解您的代码,他可能会更好地理解JSON:)
  3. 我不明白这个问题。
  4. 如果您通过邮寄方式发送数据,则应按大多数语言将其转换为数组。
  5. 祝你好运!

答案 1 :(得分:3)

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

  1. 将表单序列化为JSON(Serializing to JSON in jQuery
  2. 通过ajax发布JSON字符串
  3. 然后http://php.net/manual/en/function.json-decode.php
  4. 另见Convert form data to JavaScript object with jQuery(这两个SO问题包含有关库和插件的重要链接)

    修改

    关于你的问题:

      

    您对此策略有何看法?

    你的例子显示了吗?我假设你已经测试了它&amp;有用。如果它模仿你所期望的行为,我认为它很好。它要求你不要重写你的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对象可能会有未来的好处。想象一下,发回验证信息&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.

我认为这几乎是传统的最佳做法,或接近。