Часто возникает проблема передачи массива (сформированного средствами JavaScript) Ajax запросом, используя библиотеку JQuery и ее методы $.get, $.post
На самом деле задача доволно несложная:
ids_list = array(1,2,3,4,5);
$.post("/controller/action",
{'ids[]': ids_list},
function(result){
//обработка данных которые вернул сервер
}
);
Достаточно указать что вы передаете массив, с помощью скобок [].
Хотя, существуют реализации, с использованием join() и прочих "ручных" методов преобразование массива в его JSON аналог, но пример показанный выше намного проще и элегантнее.
Сериализация массива (js):
ОтветитьУдалитьdata: "array="+JSON.stringify(array) - превращает массив в строку, передаем строку обычным способом.
На стороне сервера принимаем строку, и превращаем ее в php массив:
$json = $_POST['array'];
$new_array = json_decode($json, true);
сериализировать можно любые данные, пример выше - без сериализации
УдалитьВсе круто, только надо передавать не массив, а объект!
Удалитьвот так:
ids_list = {};
$.post("/controller/action",
{ids: JSON.stringify(ids_list)},
function(result){
//обработка данных которые вернул сервер
}
);
Nikoole, прошу прощения, а как вы передадите на сторону сервера данные о переменных, которые потом надобно json-декодировать? В решении автора поста ясно передается массив аналог формы с несколькими полями имеющими одинаковые аттрибуты имени, наподобие name="[]". Как быть в вашем случае - есть ли возможность проверить на принимающей стороне - надо ли json декодировать данные или не надо?
ОтветитьУдалитьПеременные передаются отдельными полями:
Удалить$.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}";
При методе который изложен в статье, на стороне сервера как правильно поймать массив?
ОтветитьУдалитьecho .$_POST['someArray'];
ничего не возвращает
if (isset($_POST['someArray'])) $_POST['someArray']= $someArray1;
print $someArray1;
также не выводит ничего.
сделайте print_r($_POST); и посмотрите что в посте приходит
Удалитьесли правильно формировать данные для запроса тогда все должно сработать
Array ( [someArray] => )
Удалитьвот такое ловлю, я так понимаю что в данном случае данные не передаются.
Спасибо! отличная статья!
ОтветитьУдалитьСпасибо за полезную информацию!
ОтветитьУдалитьу меня прекрасно работает конструкция:
ОтветитьУдалитьvar some = ['one','two','three'];
...
$.post('URL',{data:some};