@rvitalia

Как правильно в php принять массив из formData js?

Добрый день!

Столкнулся с такой проблемой. Не могу принять массив в php, который закидываю в formData.

Массив формирую вот так:
//объявляем массив для сохранения значений
        const messagesValue = [];        

        //функция добавления объекта(пары ключ значение) в массив
        function addDataPair(key,value){
            let pair = {key: key, value: value};
            messagesValue.push(pair);
        }

        //перебираем массив сообщений
        messages.forEach(element => {
            if (element.classList.contains('AB__chat__inner__center__bot')) {
                addDataPair("Оператор: ", (element.children[0]).textContent);
            }
            else if (element.classList.contains('AB__chat__inner__center__people')) {
                addDataPair("Вы: ", (element.children[0]).textContent);
            }
        });


дальше осуществляю отправку...

.........
.onSuccess((event) => {
            let formData = new FormData();
            formData.append('messages', JSON.stringify(array));           
             console.log(...formData);

            let xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        // console.log('Отправлено');
                    }
                }
            }

            xhr.open('POST', 'mail.php', true);
            xhr.send(formData);

            event.target.reset();
        });
............


в php пытаюсь принять так:
.....
$data = json_decode($_POST['messages']);

...


Но данные не принимаются и не парсятся ни в какую... Если в форм дату закидываю event.target, то все работает....как только передаю массив -- по нулям.

Заранее спасибо за любую помощь.
  • Вопрос задан
  • 986 просмотров
Решения вопроса 1
@rvitalia Автор вопроса
Всем спасибо... Натолкнули на мысль, что я допускал одну очень простую ошибку..... Итак, по логике работы данного кода, помимо массива я передавал еще и почту, на которую нужно отправить данные. Соответсвенно, убирая event.target из formData я конечно терял введенное значение и массив то может и принимался, только куда его и что с ним делать....код не знал... по итогу, решение такое:
Во первых решил остаться все-таки на formData, т.к. возможно в скором времени понадобиться пересылка файлов.
Во вторых. просто собрал массив, а не массив объектов, как было до этого.
как-то так
//объявляем массив для сохранения значений
        const messagesValue = [];        

        //перебираем массив сообщений
        messages.forEach(element => {
            if (element.classList.contains('AB__chat__inner__center__bot')) {
                messagesValue.push("Оператор: " + (element.children[0]).textContent);
            }
            else if (element.classList.contains('AB__chat__inner__center__people')) {
                messagesValue.push('Вы: ' + (element.children[0]).textContent);
            }
        });

в третьих. formdata формирую следующим образом:
validation
        .onSuccess((event) => {
            let formData = new FormData();

            formData.append('key1', JSON.stringify(array));
            formData.append('key2', input);

            let xhr = new XMLHttpRequest();

            xhr.onreadystatechange = function () {
                if (xhr.readyState === 4) {
                    if (xhr.status === 200) {
                        alert('');
                    }
                }
            }
            xhr.open('POST', 'mail.php', true);
            xhr.send(formData);

            event.target.reset();
        });
}


ну и наконец, принимаю это дело так
if (isset($_POST['key1'])) {
  $array = json_decode($_POST['key1']);
..............


 $inputValue = $_POST["key2"];


По итогу все заработало. Невнимательность прежде всего.... всем спасибо, и будьте внимательны))
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
zkrvndm
@zkrvndm
Архитектор решений
Если ты отправляешь не файлы, то нет смысла использовать FormData, просто отправляй JSON-строку напрямую.

let xhr = new XMLHttpRequest();

xhr.open('POST', 'mail.php', true);

xhr.setRequestHeader('Content-Type', 'text/plain');

xhr.onreadystatechange = function() {

    if (xhr.readyState === 4) {

        if (xhr.status === 200) {

            console.log('Ответ сервера:', xhr.responseText);

        }

    }

}

console.log('Отправляем:', array);

xhr.send(JSON.stringify(array));


На стороне PHP принимаешь данные так:
<?php

header('Content-Type: text/plain');

$array = json_decode(file_get_contents('php://input'), true);

echo 'Из браузера получены данные: ' . print_r($array, true);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы