Не удается прочитать переменную NULL в PHP после публикации массива JSON через .ajax()

У меня проблема, как и у многих других людей, когда я могу прочитать переменную массива PHP после отправки ее через сообщение ajax(). Ajax работает успешно и отображает возвращенные данные, которые равны NULL. Я уже тщательно изучил решения SO для этой проблемы JSON/PHP, и мое описание проблемы показывает «почти» КАЖДОЕ решение для SO до сих пор.

На стороне PHP я пробовал:

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

(Пропуск $HTTP_RAW_POST_DATA (устаревший), потому что он равен file_get_contents('php://input')

а также:

$data = json_decode($_POST["a_arr"], true);

Я уже пытался очистить спецификацию UTF-8 с помощью команды sed.

sed '1s/^\xEF\xBB\xBF//' < index.html > index2.html

Мой .ajax() выглядит так:

$.ajax ({
    url:"file.php",
    method:"post",
    contentType: "application/json; charset=utf-8",
    data: { a_arr : JSON.stringify(arr) },
    })
    .done(function(response){
        $("#status").html(response);
    });

На стороне Javascript вот мой массив:

var arr = [{"name":_name, "phone":_phone, "email":_email, "repname":repname, "repnumber":repnumber, "office":office}];
ajax_post(arr);

Я проверил, чтобы убедиться, что нет ошибки форматирования JSON, следующее успешно показывает мне допустимый форматированный массив JSON:

var data_arr = JSON.stringify(arr);
document.getElementById("status").innerHTML = data_arr;

person user3285269    schedule 17.05.2019    source источник


Ответы (1)


Вам нужно изменить на:

data: JSON.stringify(arr),

Когда вы передаете объект параметру data:, он преобразует его в формат с кодировкой URL, а не в JSON.

Или вы можете оставить опцию data: как есть, но избавиться от опции contentType:, и тогда вам следует использовать

$data = json_decode($_POST['a_arr'], true);
person Barmar    schedule 17.05.2019
comment
Очень благодарна за участие и информацию! Хорошо, я попробовал ваше предложение, полагаясь на данные: чтобы нажать кодировку URL, я удалил имя и вставил: данные: JSON.stringify(arr), Это также возвращает NULL! Затем я возвращаю элемент data: обратно в формат JSON: data: { a_arr : JSON.stringify(arr) }, закомментировал contentType: //contentType: application/json; charset=utf-8, и, наконец, переключился с php://input на: $data = json_decode($_POST['a_arr'], true); $var_dump($данные); по-прежнему NULL в обоих случаях :( - person user3285269; 20.05.2019
comment
Какую версию jQuery вы используете? Опция method: была добавлена ​​в 1.9.0, до этого была type:. - person Barmar; 20.05.2019
comment
Что вы видите в var_dump(file_get_contents("php://input"));? - person Barmar; 20.05.2019
comment
Использование: jquery-1.8.3.min.js - person user3285269; 20.05.2019
comment
Вау, хорошее предложение: возвращаемые данные: строка (0), что забавно, потому что я получаю действительную строку javascript JSON перед .ajax() - person user3285269; 20.05.2019
comment
Основываясь на вашем вопросе, я перешел к Jquery 1.12.4.min.js и сразу же получил правильный ответ в виде строки (256). Я одновременно изучаю JSON и работаю с другими существующими проектами JQuery в этом веб-приложении. Когда я попытался перейти на Jquery 3.3.1, у него была нарушена функциональность. Спасибо! - person user3285269; 20.05.2019