Ошибка при отправке массива в массиве с использованием AJAX

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

Например:

var settings = [];
// add stuff to the array

$.ajax({
    type: 'POST',
    url: "api/update-settings",
    data: {
        userId: 1,
        userSettings: settings
    },
    done: function(response) {
        //do something with the response
    },
    fail: function() {
        // do error stuff
    }
});

Отправить это не получится. API (в PHP) получает код и может сказать мне, что такое userId, но userSettings не определен.

Notice: Undefined index: userSettings in /api/update-settings.php on line 9

Однако, если я установлю переменную settings как другой тип данных (например, int или string), индекс больше не будет неопределенным.

В PHP, когда я сбрасываю запрос, чтобы посмотреть, что в нем, userSettings не обнаруживается:

var_dump($_REQUEST);
Output: array(1) { ["userId"]=> string(1) "1" }

Я добавляю элементы в свой массив с помощью settings['template'] = template;

Прежде чем отправить запрос ajax, я могу записать его в консоль и получить следующее:

[p: "setting1", s: 1587, emp: "setting2", ems: 3245, template: "", …]

который содержит все данные, которые мне нужны.

Я попытался структурировать данные с помощью JSON.stringify(settings), но затем ajax передает пустой массив:

array(2) { ["userId"]=> string(1) "1" ["userSettings"]=> string(2) "[]" } 

Мне кажется, что это что-то простое, но я не могу этого понять. И да, я провел поиск - я нашел похожие вещи, но ни один из ответов, похоже, не помог.

Заранее спасибо.

Можете ли вы проверить, действительно ли вы отправляете все данные через вкладку сети? Проверьте это stackoverflow.com/a/21617685/2191572 и найдите свои «Заголовки запроса». Также возможно, что у вас проблемы с кешем или вы тестируете совершенно неправильную страницу.

MonkeyZeus 08.11.2018 20:32

Вы уверены, что действительно «добавляете что-то в массив (settings)»? Потому что, если это не так, я почти уверен, что он ничего не отправит для пустого массива userSettings в теле запроса.

Jeto 08.11.2018 20:38

@MonkeyZeus - Ну, если я изменю переменную, чтобы НЕ была массивом, она отправляет, поэтому я предполагаю, что она отправляется.

Apolymoxic 08.11.2018 20:53

@Jeto Да, я уверен. Если я сделаю console.info, я получу полный массив, заполненный правильными данными.

Apolymoxic 08.11.2018 20:54

@Jeto в любом случае верен, jQuery не будет отправлять такой пустой массив. Вы можете проверить, выполнив вместо этого var settings = [ 'yay something!' ];

MonkeyZeus 08.11.2018 21:01

«Я добавляю элементы в свой массив, используя settings ['template'] = template;». Так что это не массив, это объект (на стороне JS). Он должен быть заявлен с помощью var settings = {}.

Jeto 08.11.2018 21:05

@Jeto Мои извинения ... Я думал, что это массив. Я заявил об этом с помощью var settings = [], как говорится в сообщении. Замена [] на {} заставляет его работать. Спасибо

Apolymoxic 08.11.2018 21:08

@Jeto, если вы отправите ответ с этим исправлением, я сделаю его принятым

Apolymoxic 08.11.2018 21:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
8
55
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы пробовали сериализовать массив? Вы можете найти этот подход здесь, здесь и здесь.

так что это могло закончиться как

var settings = [];
// add stuff to the array

$.ajax({
    type: 'POST',
    url: "api/update-settings",
    data: {
        userId: 1,
        userSettings: JSON.stringify(settings);//here is the change
    },
    done: function(response) {
        //do something with the response
    },
    fail: function() {
        // do error stuff
    }
});

надеюсь это поможет.

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

Apolymoxic 08.11.2018 20:56
Ответ принят как подходящий

Учитывая то, как вы добавляете значения в переменную settings, то, что вы хотите манипулировать / отправлять, является объектом, а не массивом.

Вам необходимо изменить свою декларацию с:

var settings = [];

к:

var settings = {};

Вот и все. Я знал, что это что-то простое. Спасибо!

Apolymoxic 08.11.2018 21:11

Другие вопросы по теме