Отправка данных JSON через JQuery ajax.post в PHP

Я отправляю данные в 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']));

Предупреждение было просто проверить, все ли в порядке ...

И да, обычные строки были отражены правильно :-)

 SamiSalami08 июн. 2012 г., 14:12
Я сожалею об этом, но, конечно, я должен попробовать эти ответы, и все они были не правы ... Но да, я нашел свой ответ - но, на мой взгляд, я помогаю, если комментирую, почему ответ не помог мне ; если я вообще не комментирую, люди не знают, попробовал ли я их и правильный ли ответ уже дан.

Ответы на вопрос(4)

Одиночные кавычки не действительны для phpjson_encodeиспользуйте двойные кавычки как для имен полей, так и для значений.

 08 июн. 2012 г., 13:52
data: {'Absence' : JSON.stringify(this)} - здесь php получает все, включая «отсутствие», которое также должно быть в двойных кавычках, в противном случае оно недействительно.
 08 июн. 2012 г., 13:46
Я вообще не вижу, насколько это актуально, поскольку все данные передаются как часть POST-запроса, а JSON форматируется функцией JSON.stringify - одинарные кавычки используются только в объекте с настройками, используемыми Ajax-функция.
 SamiSalami08 июн. 2012 г., 14:17
Да, но это не имя поля, будет представлено что-то вроде: Absence = aid: 1, name: bla ... (просто псевдокод) и в полном тексте: data: {& quot; Absence & apos;: {& quot; aid & quot ;: 1, & quot; имя & quot ;: bla}}; Отсутствие не является частью объекта, это имя
 08 июн. 2012 г., 13:55
Как я уже сказал - имена полей также должны быть в двойных кавычках. Смотрите пример № 3:php.net/manual/en/function.json-decode.php
 SamiSalami08 июн. 2012 г., 13:54
Нет, «Отсутствие» не является свойством данного json-объекта, я просто обозначаю его как "Отсутствие" чтобы получить его через $ _POST ['Absence'], это не свойство, поэтому его не нужно заключать в двойные кавычки.

Мне кажется, что вы должны переформатировать свой объект 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);
    }
  });
}
 SamiSalami08 июн. 2012 г., 15:22
Спасибо, приятно знать :-)
 08 июн. 2012 г., 14:57
Это должно дать вам пустые строки при доступе к$_GET переменная наPOST запрос. Вы можете использовать$_POST или$_REQUEST переменная для доступа к представленным данным (etc).
 08 июн. 2012 г., 15:07
О, извините, я пропустил эту часть вашего комментария. Это тип, который определяет, как получить данные в вашем php-скрипте, независимо от того, какdata это формат, Тед & # x2013; в любом случае он просто преобразуется в строку запроса в соответствии сdocs.
 SamiSalami08 июн. 2012 г., 14:07
strJSONData выглядит нормально, но я просто получаю пустые строки с "echo $ _GET [" Absence "];" quot; echo json_decode ($ _ GET ["Absence") "& quot; - также пытался с постом, но это представление как GET ... Я думал сделать это через POST или я неправильно понимаю что-то, связанное с представлением JSON-объектов через Ajax? Должны ли они быть представлены как GET (url param)?
 SamiSalami08 июн. 2012 г., 15:01
Как я уже говорил, вы тоже попробовали POST, но сначала я попробовал GET, потому что вы отправляете данные в виде параметров url, но, как я уже сказал, возможно, я просто неправильно понимаю, и пост Ajay - своего рода фальшивая & POST & quot; :-)
Решение Вопроса

Если вы ошиблись в коде в первом коде, вы должны были использовать это:

var_dump(json_decode(file_get_contents("php://input"))); //and not $_POST['data']

Цитирование из руководства по PHP

php://input is a read-only stream that allows you to read raw data from the request body.

Поскольку в вашем случае вы отправляете JSON в теле, вы должны прочитать его из этого потока. Обычный метод$_POST['field_name'] не будет работать, потому что тело сообщения не в формате URL-кодирования.

Во второй части вы должны были использовать это:

contentType: "application/json; charset=utf-8",
url: "ajax/selectSingle.php?m=getAbsence",
data: JSON.stringify({'Absence' : JSON.stringify(this)}),

UPDATE:

Когда запрос имеет тип контентаapplication/jsonPHP не будет анализировать запрос и выдавать вам объект JSON в$_POSTВы должны разобрать его самостоятельно из необработанного HTTP-тела. Строка JSON извлекается с помощьюfile_get_contents("php://input");.

Если вы должны получить это с помощью$_POSTВы бы сделали это:

data: {"data":JSON.stringify({'Absence' : JSON.stringify(this)})},

И тогда в PHP сделать:

$json = json_decode($_POST['data']);
 01 мар. 2015 г., 16:43
проголосовал за php: // input
 12 июн. 2017 г., 03:12
file_get_contents (& Quot; PHP: // входные & Quot;); это то, что я искал. Потратил часы, прежде чем я найду это
 SamiSalami08 июн. 2012 г., 14:14
Спасибо большое, что сделали это! Наконец-то попробовал ваш ответ ^^ Хотя я немного запутался, потому что я читаю примеры, где объекты JSON из вызова ajax просто повторяются из $ _POST ... Но действительно спасибо :)
 SamiSalami08 июн. 2012 г., 15:24
Вау, большое спасибо с этим обновлением, оно намного более понятно :)

попробуй это

  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);
       } 
     });
   }

EDIT

Я думаю, что мы также можем сделать это!

  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);
 08 июн. 2012 г., 14:14
Вы связываете this.getAbsence сDOM ? Если это так, то второй вариант не будет работать.
 08 июн. 2012 г., 13:31
да, оповещение будет работать, ноthis в jQuery.ajax не будет ссылки на объект, для которого была вызвана функция
 08 июн. 2012 г., 13:28
Ссылкаthis в теле функции должна быть ссылка на объект, для которого была вызвана функция, так что эта часть должна работать, даже если она не совсем симпатичная или читаемая код
 SamiSalami08 июн. 2012 г., 14:19
Нет, я не: - / function Absence () {this.aid; this.eid; ... [мой метод] ...} в другом js: myAbsence = new Absence (); myAbsence.aid = 1; myAbsence.getAbsence (); - Но в любом случае я нашел свой ответ, но, может быть, это поможет вам или вам что-то сказать, скажем, что-то вроде "OMG, что ты делаешь?" ^^
 SamiSalami08 июн. 2012 г., 14:03
У вас есть одно хорошее замечание, что это больше не может быть объектом, хотя я так не думаю, потому что я видел другие примеры, где это использовалось напрямую. Ваши вторые предложения приводят к ошибке в консоли: «слишком много рекурсии»; - Не знаю, почему мой браузер даже на мгновение зависает x) первый из них print_r ($ _ POST) Я получаю только "Array ()" и, конечно, $ _POST ['data' '] пусто: - /

Ваш ответ на вопрос