Лучшая стратегия по отправке массива с помощью AJAX - PullRequest
2 голосов
/ 04 мая 2011

У меня есть несколько флажков для отправки на сервер в виде массива. Обычно у меня есть список этих флажков, и я отправляю его через массив [].

Например, отправив это:

<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?) Автоматически создают массив из списка параметров с тем же именем и []?

Надеюсь, что мой вопрос достаточно понятен:)

Ответы [ 3 ]

3 голосов
/ 04 мая 2011

Я думаю, что вы на правильном пути с JSON, в этом есть смысл.

  1. Сериализация формы в JSON ( Сериализация в JSON в jQuery )
  2. ЗАПИШИТЕ эту строку JSON через ajax
  3. Тогда http://php.net/manual/en/function.json-decode.php

Также см. Преобразование данных формы в объект JavaScript с помощью jQuery (эти два вопроса SO содержат ценные ссылки на библиотеки и плагины)

Редактировать

Что касается ваших вопросов:

Что вы думаете об этой стратегии?

Ваш пример показан? Я предполагаю, что вы проверили это, и это работает. Если он имитирует поведение, которое вы ожидаете, я думаю, что это нормально. Это требует, чтобы вы не переписывали ни один из ваших PHP, и это то, с чем вам, очевидно, удобно работать. Это льготы.

Однако, если вы работаете разумно, кодирование ввода формы в JSON и использование json_decode дает тот же эффект, теоретически требуя очень мало изменений в том, как вы пишете свой PHP после того, как вы декодировали JSON.

Лучше ли создать объект 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 все время. Представьте, что вы отправляете информацию о проверке в формате 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 позволяет получить доступ к строке GET в виде массива (или данных POST) без необходимости делать что-то особенное ... два разных вопроса.

Это на самом деле самая веская причина использовать здесь JSON, поэтому другие говорят, что именно для этого и предназначен JSON. Подумайте об этом, JSON - это «легкий, независимый от языка открытый текстовый стандарт, разработанный для удобочитаемого обмена данными». Вы представляете массивы и объекты с помощью JSON, к которым всегда можно получить доступ как к массивам и объектам независимо от того, на каком языке вы работаете.

3 голосов
/ 04 мая 2011
  1. Сложный метод для использования.
  2. Я бы предпочел JSON, его гораздо проще использовать, и если вы захотите когда-нибудь изменить его, это будет намного проще. Кроме того, если какой-то другой программист должен понимать ваш код, он, вероятно, будет лучше понимать JSON:)
  3. Я не понял вопроса.
  4. Если вы отправляете данные по почте, большинство языков должны быть преобразованы в массив.

Удачи!

2 голосов
/ 04 мая 2011

Для отправки массива из 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.

Я думаю, что это в значительной степени обычная лучшая практика, или близко.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...