Почему передавая json через pjax post создается множество переменных?

alex_dark

Школьник
Репутация
0 / 55
Может тут кто поможет?


Я получаю с одного сервиса данные в виде json объекта. Делаю это в javascript'е Потом эти данные хочу передать на сервер через pjax. Методом post

Когда я это делаю, то pjax на каждый ключ в объекте создает свою переменную. В результате, если я передаю предположим

Код:
    var info = {
    "id": 64479477,
    "first_name": "Сергей",
    "last_name": "Мишин",
    "sex": 2,
    "nickname": "",
    "screen_name": "sergey_mishin",
    "bdate": "6.6.1987"
  }

с вот таким запросом:

Код:
$.pjax.reload({
  container: '#content',
  type: 'POST',
  url: path,
  data: info,
  push: true,
  replace: false,
  timeout: 1000
});

то в пост запросе улетает

Код:
info[id]:64479477
info[first_name]:Сергей
info[last_name]:Мишин
info[sex]:2
info[nickname]:
info[screen_name]:sergey_mishin
info[bdate]:6.6.1987

Это так и должно быть и я чего-то не знаю? Или я что-то не так делаю? И если я не так делаю, то как можно передать json, чтоб не создавалось множество переменных?

можно конечно обернуть в JSON.stringify(), а на сервере делать разбор и json_decode. Но так не хотелось бы.
 
Последнее редактирование:
можно попробовать на beforeSent подменять contentType на 'application/json; charset=utf-8'
ну и data также надо будет обернуть в JSON.stringify()
 
Последнее редактирование:
Конечно! ты почитай что ты написал
убери info и все будет гуд data: {"id": 64479477,"first_name": "Сергей","last_name": "Мишин","sex": 2,"nickname": "","screen_name": "sergey_mishin","bdate": "6.6.1987"},
а у тебя скорее всего вот так идет:
var info = {
info: {....
 
Конечно! ты почитай что ты написал
убери info и все будет гуд data: {"id": 64479477,"first_name": "Сергей","last_name": "Мишин","sex": 2,"nickname": "","screen_name": "sergey_mishin","bdate": "6.6.1987"},
а у тебя скорее всего вот так идет:
var info = {
info: {....

Подредачил на корректный вариант переменной инфо......,чтобы вас не смущать
Но проблема будет оставаться.
Т.к. передавая json не оборачивая в stringify будет получаться вот такая вот шняжка, как я описал выше.

ну и data также надо будет обернуть в JSON.stringify()
я же говорю что не хочу stringify делать. С ним-то понятно что работает.

Просто если без стрингифай никак вообще и это единственный путь - то тогда да.
 
==============
UPD
Поизучав вопрос было найдено, что ajax/pjax так и работают. И это верно. И так и должно быть. С этим ничего не сделать. Если малый объем данных нужно передать, не стоит беспокоиться.
Если же речь будет идти о тысячах переменных (что существенно увеличит загрузку данных), то скорее лучше будет передавать данные как строку
Код:
$.pjax.reload({
    container  : '#content',
    type       : 'POST',
    url        : path,
    data       : {jsonData: JSON.stringify(data)},
    push       : true,
    replace    : replaceHistory,
    timeout    : 1000
});


а на сервере делать json_decode($_POST['jsonData']);
 
Народ, ваши статусы соответствую вашим знаниям.

Вы бл*** что вообще несете, перед тем как работать с AJAX и прочей мутью, почитайте что такое протоколы, что такое запросы типа GET, POST, PUT и прочие.
В запросах, данные уходят не json массивом, а в именно ключевым массивом, это стандарты браузеров, стандарты веба...

Когда уже искоренят такие дебильные вопросы и будут перед тем как что-то делать, познавать хотя бы азы того с чем работают.
 
Народ, ваши статусы соответствую вашим знаниям. Вы бл*** что вообще несете, перед тем как работать с AJAX и прочей мутью, почитайте что такое протоколы, что такое запросы типа GET, POST, PUT и прочие. В запросах, данные уходят не json массивом, а в именно ключевым массивом, это стандарты браузеров, стандарты веба...Когда уже искоренят такие дебильные вопросы и будут перед тем как что-то делать, познавать хотя бы азы того с чем работают.
Кто ж виноват, что ты вопросы читать не умеешь)))
Ведь никто и не спрашивал, почему данные не отправляются как json массив, а был вопрос: "Почему создается множество переменных" ¯\_(ツ)_/¯
Причем не просто один ассоциативный массив, с элементами, а именно множество переменных. Т.е. выполнив большой запрос с тысячей элементов (даже если они будут чисто в одном массиве содержаться), php на серваке будет ругаться на то, что max_input_vars (которое по дефолту 1000) не хватает....
 
А как происходит распарсивание ответа?
Причем не просто один ассоциативный массив, с элементами, а именно множество переменных.
Из твоего кода я вижу просто массив info который можно сразу переводить в строку (если удобно) и причем тут переменные хз.
 
А как происходит распарсивание ответа?
Из твоего кода я вижу просто массив info который можно сразу переводить в строку (если удобно) и причем тут переменные хз.
А причем тут парсинг ответа? Парсинг я могу написать любой. И изначально я давал данные эти а на серваке достаточно было написать
Код:
$post = $_POST['info'];
И это и было удобно)))

Потом когда начал получать 500 ошибку на больших данных. начал копаться в сути.. открыл консоль и увидел это чудо...

Да, на вид массив. Но что-то в нем не так.

Для сравнения.пишем чисто на php
Код:
$test = [];
    for ($i=1; $i <= 1500; ++$i) {
        $test['info']['test'.$i] = 'test'.$i;
    }
    print_r($test)
Выведет массив info, в котором 1500 элементов с разными именами и им присвоенным значениями.

Теперь ajax/pjax
Код:
$(document).ready(function(){
            var data = {};
               for (var i =1; i <= 1500; ++i) {
              data['test'+i] = 'test'+i;
            }
            console.log(data);
            $.ajax({
                url: url,
                data: {info: data},
                type : 'post'
            });

        });

в пхп файле пишем
Код:
 if (isset($_POST))
            print_r($_POST);
И он выведет тоже массив инфо только 1000 элементов..... Если в php_ini увеличить max_input_vars - то выведет больше..

Отсюда вывод..... что он не делает ассоциативный массив, а создает именно отдельную переменную на каждый ключ.
 
Косяк самой передачи или фича.
Переводить в строку только и отправлять гулять на сервер.
 
Кто ж виноват, что ты вопросы читать не умеешь)))
Ведь никто и не спрашивал, почему данные не отправляются как json массив, а был вопрос: "Почему создается множество переменных" ¯\_(ツ)_/¯
Причем не просто один ассоциативный массив, с элементами, а именно множество переменных. Т.е. выполнив большой запрос с тысячей элементов (даже если они будут чисто в одном массиве содержаться), php на серваке будет ругаться на то, что max_input_vars (которое по дефолту 1000) не хватает....
Это не я читать не умею, это ты не можешь открыть доку стандартов данных POST, GET, PUT и прочей мути и почитать как работают массивы в запросах.

Расскажу на пальцах:
1. При создании поля с эквивалентом массива, (прим: <input name="type[]" />) мы создаем сущность переменной. type[] в типе form
2. При отправке данных на сервер, данные уходят как type[]=1&type[]=2&type[]=3. Что означает отсылку нескольких полей с нэймом type[] как массив данных. (Не путать работу стандартов с самим пхп)
3. Когда ВЫ пишете в любом ajax/pajax фрейморвек разного рода мусор а-ля data: { data: {type1: 'test', type2:'test'}}, js обработчик преобразует этот ваш мусор в data[type1]=test&data[type2]=test и таким же образом отсылает информацию по стандарту POST, где сервер получает данные и парсит их в своем формате (Объектный подход в JS сделан для вашего же удобства, вы так же можете ввести строку "data[type1]=test&data[type2]=test"1).

Итог: если бы ты понимал как работает отправка данных в HTTP стандартах, то не было бы глупого вопроса, почему при отправке у тебя объект поля разбивается на множество отсылаемых переменных на сторону сервера.

Если же так сильно хочется отсылать данные одной строкой данные дабы обойти ограничение на максимальное кол-во входящих данных(Хотя зачем это надо, в принципе не знаю, учитывая что ограничение возможно увеличить), то возможно использовать серилизацию данных или перечисление значений через ключевой разделитель.
 
Расскажу на пальцах:
1. При создании поля с эквивалентом массива, (прим: <input name="type[]" />) мы создаем сущность переменной. type[] в типе form
2. При отправке данных на сервер, данные уходят как type[]=1&type[]=2&type[]=3. Что означает отсылку нескольких полей с нэймом type[] как массив данных. (Не путать работу стандартов с самим пхп)
3. Когда ВЫ пишете в любом ajax/pajax фрейморвек разного рода мусор а-ля data: { data: {type1: 'test', type2:'test'}}, js обработчик преобразует этот ваш мусор в data[type1]=test&data[type2]=test и таким же образом отсылает информацию по стандарту POST, где сервер получает данные и парсит их в своем формате (Объектный подход в JS сделан для вашего же удобства, вы так же можете ввести строку "data[type1]=test&data[type2]=test"1).
Итог: если бы ты понимал как работает отправка данных в HTTP стандартах, то не было бы глупого вопроса, почему при отправке у тебя объект поля разбивается на множество отсылаемых переменных на сторону сервера.

Хорошо, что пояснил. Только говном исходить не надо сразу.

Странно вот одно. На других ругаешься, а сам не знаешь ответ на данный вопрос:
Если же так сильно хочется отсылать данные одной строкой данные дабы обойти ограничение на максимальное кол-во входящих данных(Хотя зачем это надо, в принципе не знаю, учитывая что ограничение возможно увеличить),
Ведь ответ написан в самом php.net в описании. И, более того, даже логически можно понять почему лучше не увеличивать это число.. Не желательно.
Ну да ладно. Все - гавно, а вы тут бог и судья ¯\_(ツ)_/¯
 
Последнее редактирование:
Хорошо, что пояснил. Только говном исходить не надо сразу.

Странно вот одно. На других ругаешься, а сам не знаешь ответ на данный вопрос:

Ведь ответ написан в самом php.net в описании. И, более того, даже логически можно понять почему лучше не увеличивать это число.. Не желательно.
Ну да ладно. Все - гавно, а вы тут бог и судья ¯\_(ツ)_/¯

Не поминай господа в суе... (С)

Во-вторых, если ты лезешь в программирование, то потрудись почитать, что и как работает, перед тем как этим пользоваться. Достаточно часто когда читаешь, ты понимаешь свои ошибки и не генерируешь миллион ненужных вопросов, ответы на которые есть в официальных источниках. И перед тем как задавать вопрос, надо для начала понимать как это работает.

По поводу запрета на повышение кол-ва входящих данных, ты опасаешься атаки с использованием хэш-коллизий?
В документации пхп описаны лишь рекомендации, смотреть на которые надо в том или ином случае.

Для примера приведу систему 1С-Битрикс, работа с модулем "Инфоблоки" который является ключевым в самой системе БУС, сопровождается кол-вом свойств, число которых может быть максимально выше чем ограничения пхп(Не считая того, что свойство может быть как массивом, так и текстовым полем). Разработчики и многие студии увеличивают ограничение минимум в 5 раз, для того чтобы перекрыть потерю данных, к как таковым проблемам это не приводит.

Если знать, что такое атака с использованием хэш-коллизий, то можно понять, что в основном данной уязвимости подвержены хэширующие методы, самым плачевным является md5, потому его использование уже не рекомендуется, рекомендации сводятся к стандартным методам валидации паролей или к хэшам sha1.
 
Тему можно закрывать))
Т.к. уже все идет не в тему. А суть, решение и её описание были даны.
Спасибо)
 

Похожие темы

Сверху