Данные, по-видимому, не отправляются через AJAX POST - что я делаю неправильно?

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

Обновлено еще раз: Кто-то в моей организации решил это для меня! Оказывается, я использовал параметры POST, которые мне не нужны. Мой рабочий код:

Внешний интерфейс:

$.ajax({
    type: "POST",
    url: "update_data_ajax.php",
    data: {
        events: JSON.stringify(currentEventsRows)
    }
}).done(function(data) {
    console.info("Done");
    console.info(data);
});

Серверная часть:

echo json_encode($_POST);

Исходный пост:

Я пытаюсь сделать запрос AJAX POST для отправки некоторых данных в таблицу SQL, но не похоже, что мой запрос POST на самом деле что-то отправляет, потому что серверная часть PHP просто дает мне ноль.

Чтобы попытаться сузить проблему, я упростил свою страницу до внешнего интерфейса JavaScript, который публикует массив данных, и внутреннего интерфейса PHP, который просто возвращает данные. Вот соответствующая часть моей веб-страницы (update_data.php):

let currentEventsRows = [/* array of dicts of strings */];

$.ajax({
    method: "POST",
    url: "update_data_ajax.php",
    contentType: "application/json; charset=utf-8",
    dataType: "JSON",
    data: JSON.stringify{
        events: currentEventsRows
    },
    processData: false
}).done(function(data) {
    console.info("Done");
    console.info(data);
});

Вот мой бэкэнд PHP (update_data_ajax.php):

<?php
$_POST = json_decode(file_get_contents("php://input"), true);
echo $_POST;
?>

И вот вывод консоли:

Done
null

Что я делаю не так? Я чувствую, что упускаю что-то совершенно простое.

У вас опечатка в datatType - это в реальном коде или просто случайная ошибка при переносе кода на вопрос?

El_Vanja 14.12.2020 21:03

Это была ошибка при передаче кода. Спасибо, что указали на это, я обновлю свой вопрос.

Walt Gottlieb 14.12.2020 21:17

Отвечает ли это на ваш вопрос? Получите JSON POST с PHP

ADyson 15.12.2020 00:50

@ADyson Это не так

Walt Gottlieb 15.12.2020 15:44

Почему не точно?

ADyson 15.12.2020 15:52

Я должен был быть более конкретным. Ответ на этот вопрос был в основном тем, что предложил @Musa (ниже). Но спасибо за предложение - это действительно изменило мой код, поскольку он больше не возвращает пустой массив, а теперь просто возвращает ноль. Я отредактировал свой оригинальный пост.

Walt Gottlieb 15.12.2020 16:03

Попробуйте также удалить processData:false, так как это не нужно. Кроме того, используйте echo json_last_error_msg(); в конце вашего PHP, чтобы увидеть, не пошло ли что-то не так при декодировании данных.

ADyson 15.12.2020 18:09

Также dataType: "JSON" нежелательно использовать в JS, потому что в настоящее время ваш PHP не возвращает JSON.

ADyson 15.12.2020 18:10

Спасибо за предложения. json_last_error_msg() дает мне Syntax error (но это все, что он говорит - это не более конкретно, где ошибка). Но я проверил строку JSON, которая была отправлена ​​​​на серверную часть, и не оказалось, что в ней есть какие-либо синтаксические ошибки.

Walt Gottlieb 15.12.2020 22:03

Я предлагаю показать JSON здесь (версия, полученная PHP, а не версия, которую вы отправили — они должны быть идентичными, но...), чтобы мы могли взглянуть на это.

ADyson 16.12.2020 08:14
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
10
64
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

У вас есть 2 проблемы: 1. Вы неправильно отправляете JSON. 2. Вы неправильно читаете JSON.

Вы должны закодировать свой JSON для отправки вашего ajax-вызова

let currentEventsRows = [/* array of dicts of strings */];

$.ajax({
    method: "POST",
    url: "update_data_ajax.php",
    contentType: "application/json; charset=utf-8",
    dataType: "JSON",
    data: JSON.stringify({
        events: currentEventsRows
    })
    // processData: false -- not needed since the JSON is a string
}).done(function(data) {
    console.info("Done");
    console.info(data);
});

Ваши данные JSON не заполняются в суперглобальном $_post (это происходит только для multipart/form-data и application/x-www-form-urlencoded), поэтому вы должны прочитать их из php://input

<?php
echo file_get_contents('php://input');
?>

Я внес предложенные вами изменения, но теперь вместо "[]" выводится "null".

Walt Gottlieb 15.12.2020 15:39
Ответ принят как подходящий

Кто-то из моей организации фактически решил это для меня. Оказывается, я использовал параметры POST, которые мне не нужны.

Внешний интерфейс:

$.ajax({
    type: "POST",
    url: "update_data_ajax.php",
    data: {
        events: JSON.stringify(currentEventsRows)
    }
}).done(function(data) {
    console.info("Done");
    console.info(data);
});

Серверная часть:

echo json_encode($_POST);

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