Im отправляет данные в php-файл через AJAX, используя POST. Он отлично справился с отправкой строк, но теперь я хотел представить свой JS-объект с JSON и декодировать его на стороне PHP.
В консоли я вижу, что мои данные отправлены правильно, но на стороне PHP json_decode возвращает NULL.
Я пробовал следующее:
this.getAbsence = function() { alert(JSON.stringify(this)); jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "ajax/selectSingle.php?m=getAbsence", data: JSON.stringify(this), success : function(data){ alert(data); } }); }
PHP:
echo $_POST['data']; echo json_decode($_POST['data']); echo var_dump(json_decode($_POST['data']));
А также:
this.getAbsence = function() { alert(JSON.stringify(this)); jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "ajax/selectSingle.php?m=getAbsence", data: {'Absence' : JSON.stringify(this)}, success : function(data){ alert(data); } }); }
PHP:
echo $_POST['Absence']; echo json_decode($_POST['Absence']); echo var_dump(json_decode($_POST['Absence']));
Предупреждение было просто проверить, все в порядке …
И обычная строка была правильно отражена 🙂
Если вы ошиблись в своем коде в первом коде, вы должны использовать это:
var_dump(json_decode(file_get_contents("php://input"))); //and not $_POST['data']
Цитата из руководства PHP
php: // input – это поток только для чтения, который позволяет вам считывать необработанные данные из тела запроса.
Поскольку в вашем случае вы отправляете JSON в теле, вы должны прочитать его из этого потока. Обычный метод $_POST['field_name']
работает, потому что тело сообщения не находится в формате URLencoded.
Во второй части вы должны были использовать это:
contentType: "application/json; charset=utf-8", url: "ajax/selectSingle.php?m=getAbsence", data: JSON.stringify({'Absence' : JSON.stringify(this)}),
ОБНОВЛЕНИЕ :
Когда запрос имеет application/json
типа контента application/json
, PHP не проанализирует запрос и не даст вам объект JSON в $_POST
, вы должны сами проанализировать его из необработанного тела HTTP. Строка JSON извлекается с помощью file_get_contents("php://input");
,
Если вы должны получить это с помощью $_POST
вы бы это сделали:
data: {"data":JSON.stringify({'Absence' : JSON.stringify(this)})},
А затем в PHP выполните:
$json = json_decode($_POST['data']);
Одиночные кавычки недействительны для json_encode
php, используйте двойные кавычки для обоих имен полей и значений.
Для меня, похоже, вы должны переформатировать свой объект AJAX. URL-свойство должно быть только URL-адресом целевого php-файла, и любые данные, которые должны быть опубликованы, должны быть в форме строки запроса в свойстве data. Следующее должно работать так, как вы ожидали:
this.getAbsence = function() { var strJSONData = JSON.stringify(this); alert(strJSONData); jQuery.ajax({ type: 'POST', contentType: 'application/json; charset=utf-8', url: 'ajax/selectSingle.php', data: 'm=getAbsence&Absence=' + strJSONData, success: function(data) { alert(data); } }); }
попробуй это
var vThis = this; this.getAbsence = function() { alert(JSON.stringify(vThis)); jQuery.ajax({ type: "POST", contentType: "application/json; charset=utf-8", url: "ajax/selectSingle.php?m=getAbsence", data: JSON.stringify(vThis), success : function(data){ alert(data); } }); }
РЕДАКТИРОВАТЬ
Думаю, мы тоже можем это сделать!
var vThis = this; this.getAbsence = function() { alert(JSON.stringify(vThis)); jQuery.ajax({ type: "POST", dataType: "json", url: "ajax/selectSingle.php?m=getAbsence", data: vThis, success : function(data){ alert(data); } }); }
и в PHP
print_r($_POST);