четверг, 16 июля 2009 г.

Передача JS массива Ajax $.post запросом. Send JS array to server using JQuery $.post method

Часто возникает проблема передачи массива (сформированного средствами JavaScript) Ajax запросом, используя библиотеку JQuery и ее методы $.get, $.post

На самом деле задача доволно несложная:

ids_list = array(1,2,3,4,5);
$.post("/controller/action",
   {'ids[]': ids_list},
   function(result){
     //обработка данных которые вернул сервер
  }
);

Достаточно указать что вы передаете массив, с помощью скобок [].

Хотя, существуют реализации, с использованием join() и прочих "ручных" методов преобразование массива в его JSON аналог, но пример показанный выше намного проще и элегантнее.

11 комментариев:

  1. Сериализация массива (js):
    data: "array="+JSON.stringify(array) - превращает массив в строку, передаем строку обычным способом.
    На стороне сервера принимаем строку, и превращаем ее в php массив:
    $json = $_POST['array'];
    $new_array = json_decode($json, true);

    ОтветитьУдалить
    Ответы
    1. сериализировать можно любые данные, пример выше - без сериализации

      Удалить
    2. Все круто, только надо передавать не массив, а объект!
      вот так:
      ids_list = {};
      $.post("/controller/action",
      {ids: JSON.stringify(ids_list)},
      function(result){
      //обработка данных которые вернул сервер
      }
      );

      Удалить
  2. Nikoole, прошу прощения, а как вы передадите на сторону сервера данные о переменных, которые потом надобно json-декодировать? В решении автора поста ясно передается массив аналог формы с несколькими полями имеющими одинаковые аттрибуты имени, наподобие name="[]". Как быть в вашем случае - есть ли возможность проверить на принимающей стороне - надо ли json декодировать данные или не надо?

    ОтветитьУдалить
    Ответы
    1. Переменные передаются отдельными полями:
      $.post("/controller/action",
      {'field1': val1, 'field2': val2, ...},
      function(result){
      //обработка данных которые вернул сервер
      }
      );
      они явно на серверной стороне вычитаются как $_POST['field1'], ...
      При передаче массивом (как в статье выше) в $_POST['ids'] = array(1,2,3,4) сразу попадает массив. Ничего декодить ненужно, декодировать из джейсона нужно только если вы в переменную положите сериализированные данные, тогда в массиве $_POST['field1'] будет срока, которую нужно декодировать.

      Пример: $_POST['field1'] = "{'x':1,'y':2}";

      Удалить
  3. При методе который изложен в статье, на стороне сервера как правильно поймать массив?
    echo .$_POST['someArray'];
    ничего не возвращает
    if (isset($_POST['someArray'])) $_POST['someArray']= $someArray1;
    print $someArray1;
    также не выводит ничего.

    ОтветитьУдалить
    Ответы
    1. сделайте print_r($_POST); и посмотрите что в посте приходит
      если правильно формировать данные для запроса тогда все должно сработать

      Удалить
    2. Array ( [someArray] => )
      вот такое ловлю, я так понимаю что в данном случае данные не передаются.

      Удалить
  4. Спасибо! отличная статья!

    ОтветитьУдалить
  5. Спасибо за полезную информацию!

    ОтветитьУдалить
  6. у меня прекрасно работает конструкция:

    var some = ['one','two','three'];
    ...
    $.post('URL',{data:some};

    ОтветитьУдалить