#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 не поддерживает вложение параметров.