Отправка POST, AJAX и PHP: JSON

#php #javascript #jquery #ajax #json

#php #javascript #jquery #ajax #json

Вопрос:

Итак, вот мой код на JS / jQuery, мой rate.php файл просто содержит print_r($_POST) в себе. Проблема в том, $_POST что принимается rated как строка "Array" , а не как фактический массив, как я его определил. Как мне исправить этот код, чтобы PHP распознал ввод JSON как правильный массив, а не строку?

 var rated = {"key" : key , "value" : value};

$.ajax({
  type: "POST",
  url: $(location).attr('protocol')   "//"   $(location).attr('hostname')   "/ajax/rate.php",
  data: {
    "rated" : rated
  },
  success: function(data) {
    alert(data);
  }
});
 

Это выходное сообщение, которое я получаю:

Массив ([рейтинг] => Массив)
Фатальная ошибка: только переменные могут передаваться по ссылке в …/ajax/rate.php на линии X


РЕДАКТИРОВАТЬ: на самом деле переменных больше rated , но ни одна из них не является массивом (таким образом, с ними нет проблем), поэтому я вырезал их из приведенного выше кода для краткости.

Ответ №1:

При передаче данных JSON в ваш php-скрипт через ajax я бы рекомендовал строковое кодирование данных JSON, а затем их анализ на стороне сервера.

 var rated = {"key" : key , "value" : value};
var rated_encoded = JSON.stringify(rated);

$.ajax({
  type: "POST",
  url: $(location).attr('protocol')   "//"   $(location).attr('hostname')       "/ajax/rate.php",
  data: {
    "rated" : rated_encoded
  },
  success: function(data) {
    alert(data);
  }
});
 

Тогда вы должны иметь возможность получить доступ к переменной POST в вашем PHP-скрипте, используя $_POST, как и с любым другим скалярным значением. Как только у вас есть строка JSON ‘rating_encoded’ на стороне сервера, преобразуйте ее в ассоциативный массив с помощью PHP json_decode() .

 if(isset($_POST["rated"])){
    $rated_json = $_POST["rated"];
    $JSONArray  = json_decode($rated_json, true); //returns null if not decoded
    //Values can now be accessed like standard PHP array
    if($JSONArray !== null){ 
        $key = $JSONArray["key"];
        $value = $JSONArray["value"];
    }
}    
 

Я обнаружил, что этот метод очень эффективен для передачи данных объектов javascript на сервер и наоборот (используя PHP json_encode() для преобразования массивов PHP в допустимые объекты javascript)

Ответ №2:

Это правильный массив, просто не такой, каким вы его ожидаете. То, что вы, вероятно, хотите, может быть достигнуто простым переходом rated к data параметру как есть. Т.е.

 var rated = {"key" : key , "value" : value};

$.ajax({
  type: "POST",
  url: $(location).attr('protocol')   "//"   $(location).attr('hostname')   "/ajax/rate.php",
  data: rated,
  success: function(data) {
    alert(data);
  }
});
 

Комментарии:

1. На самом деле есть больше переменных, которые оцениваются, но ни одна из них не является массивом (таким образом, с ними нет проблем), поэтому я вырезал их из приведенного выше кода для краткости.

2. @Matt, тогда какие данные запроса вы ожидаете? Потому что не так, как вы передаете параметр rated со значением {"key" : key, "value" : value} , а HTTP не поддерживает вложение параметров.