Php не возвращает данные POST

У меня есть следующий скрипт jQuery для отправки данных формы в php. Я тестирую данные формы с помощью простого php-файла, чтобы отобразить поле имени входного сообщения: строка данных в качестве теста (я новичок в использовании php, поэтому я его тестирую).

<script type = "text/javascript">
$("#btn_submit").on("click", function (event) {
    event.preventDefault();
    form_data = $('form').serialize()
    var datastring = JSON.stringify({form_data});
    console.info("Okay, I'm starting");
    console.info(form_data);
    console.info(datastring);
    return $.ajax({
        type: "POST",
        url: "echo_test.php",
        data: {post: datastring},
        success: function (responseText) {
            console.info(responseText);
        },
        error: function (error) {
            console.info("Okay, I failed" + error);
        }
    });
});

Простой php-файл:

<?php
echo 'Hello ' . htmlspecialchars($_POST["firstname"]) . '!';
?>

Вот что повторяет консоль разработчика Firefox:

Okay, I'm starting
email_field=mj%40abc.com&firstname=mary&lastname=jones&comments=no+comment%0D%0A
{"form_data":"email_field=mj%40abc.com&firstname=mary&lastname=jones&comments=no+comment%0D%0A"}

и, наконец, отзывается эхом:

Hello !

Таким образом, часть приветствия и восклицательный знак возвращаются обратно, но не поле имени. Я вижу, что строка данных, которую он отправляет в php-файл, содержит имя=мэри, поэтому в этом поле есть значение.

Почему поле имени не возвращается?

похоже, что вы вложили datastring внутрь post, так что вы можете попробовать $_POST['post']['firstname']

Michael Nguyen 30.05.2019 22:09

Вы имеете в виду изменить «данные: {post: datastring}» на «data: {$_POST['post']['firstname'] }" - потому что полей больше, чем просто имя.

RTC222 30.05.2019 22:11

В этом примере показано, как вы можете опубликовать имя... данные: { firstname: 'name' } затем в php $_POST["firstname"]

Stefan Avramovic 30.05.2019 22:14
Стоит ли изучать 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 и хотите разрабатывать...
1
3
65
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы не правильно размещаете свои данные, попробуйте это:

$("#btn_submit").on("click", function (event) {
    event.preventDefault();
    form_data = $('form').serialize()
    console.info("Okay, I'm starting");
    console.info(form_data);
    return $.ajax({
        type: "POST",
        url: "echo_test.php",
        data: form_data,
        success: function (responseText) {
            console.info(responseText);
        },
        error: function (error) {
            console.info("Okay, I failed" + error);
        }
    });
});

Хорошо, я попробую это и отпишусь.

RTC222 30.05.2019 22:15

Поскольку вы используете

data: {post: datastring},

значение datastring будет в $_POST['post']. Он будет закодирован как JSON, поэтому вам нужно будет вызвать json_decode() для его декодирования.

Но вы также используете form_data = $('form').serialize(). form_data поэтому будет в формате URL-кодирования. Вам нужно будет использовать parse_str(), чтобы расшифровать это.

А синтаксис {form_data} является сокращением для {form_data: form_data}, поэтому вам нужно будет получить доступ к свойству form_data декодированного JSON.

Итак, PHP должен быть:

<?php
$datastring = $_POST['post'];
$datastring_decoded = json_decode($datastring);
$form_data = datastring_decoded->form_data;
$params = parse_str($form_data);
$firstname = $params['firstname'];
echo "Hello $firstname";

Было бы намного проще, если бы вы просто использовали

data: form_data,

в звонке $.ajax(). Тогда параметр будет в $_POST['firstname']. Редко когда нужно использовать JSON при публикации с $.ajax(), если только вы не вызываете API, который специально требует этого вместо формата application/x-www-form-urlencoded или multipart/form-data.

Спасибо за Ваш ответ. Сейчас я работаю над примером Уго Т.. Его необходимо повторно отправить в облако, поэтому это займет несколько минут. Я отправлю обратно с моими результатами. Я ценю помощь.

RTC222 30.05.2019 22:22

как вы сказали, данные: form_data - правильный выбор, как сказал Уго Т. в своем ответе.

RTC222 30.05.2019 22:31

Я знаю. Я хотел подробно объяснить, что на самом деле происходит в вашем коде.

Barmar 30.05.2019 22:33

Вы спросили Почему поле имени не возвращается? Его ответ не отвечает на этот вопрос, мой отвечает.

Barmar 30.05.2019 22:34

Я скопировал его код, и он сработал, поэтому я выбрал его как лучший ответ. Мне жаль, что SO не позволяет мне выбрать два лучших ответа, потому что ваш такой же хороший. Я проголосовал за ваш ответ.

RTC222 30.05.2019 22:36

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