Проводка JSON с jquery ajax для PHP
У меня есть простой php файл, который декодирует мою строку json, передается с ajax и штамп результата, но я не могу сохранить переменную $_POST
, почему???
Я пытаюсь проверить с помощью FireBug, и я вижу, что запрос POST отправляется правильно, когда вызывается php script, он отвечает Noooooooob мне, кажется, что какая-либо переменная POST установлена.
Все, что я хочу, это иметь массив =)
Строка JSON, сгенерированная JSON.stringify
:
[
{
"id":21,
"children":[
{
"id":196
},
{
"id":195
},
{
"id":49
},
{
"id":194
}
]
},
{
"id":29,
"children":[
{
"id":184
},
{
"id":152
}
]
},
...
]
JavaScript
$('#save').click(function() {
var tmp = JSON.stringify($('.dd').nestable('serialize'));
// tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
$.ajax({
type: 'POST',
url: 'save_categories.php',
dataType: 'json',
data: {'categories': tmp},
success: function(msg) {
alert(msg);
}
});
});
save_categories.php
<?php
if(isset($_POST['categories'])) {
$json = $_POST['categories'];
var_dump(json_decode($json, true));
} else {
echo "Noooooooob";
}
?>
Ответы
Ответ 1
Ваш код работает, если вы удалите dataType: 'json'
, просто протестируйте его.
$('#save').click(function() {
var tmp = JSON.stringify($('.dd').nestable('serialize'));
// tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
$.ajax({
type: 'POST',
url: 'save_categories.php',
data: {'categories': tmp},
success: function(msg) {
alert(msg);
}
});
});
Ответ 2
dataType - json, поэтому jQuery отправляет это сообщение:
{"categories":"[{\"id\":21,\"children\":[{\"id\":196},{\"id\":195},{\"id\":49},{\"id\":194}]},{\"id\":29,\"children\":[{\"id\":184},{\"id\":152}]},...]"}
Это не стандартное urlencoded, поэтому $_POST пуст.
Вы можете установить данные в свою сложную структуру, а jQuery будет правильно ее кодировать:
$('#save').click(function() {
$.ajax({
type: 'POST',
url: 'save_categories.php',
dataType: 'json',
data: $('.dd').nestable('serialize'),
success: function(msg) {
alert(msg);
}
});
});
И в php: $categories = json_decode(file_get_contents('php://stdin'));
Ответ 3
Попробуйте следующее:
$('#save').click(function() {
var tmp = JSON.stringify($('.dd').nestable('serialize'));
// tmp value: [{"id":21,"children":[{"id":196},{"id":195},{"id":49},{"id":194}]},{"id":29,"children":[{"id":184},{"id":152}]},...]
$.ajax({
type: 'POST',
url: 'save_categories.php',
dataType: 'json',
data: 'categories=' + encodeURIComponent(tmp),
success: function(msg) {
alert(msg);
}
});
});
Я изменил только эту строку:
data: 'categories=' + encodeURIComponent(tmp),
потому что так, как вы должны писать данные там. Я протестировал его, его работа...
Ответ 4
он работает для меня, вы можете попробовать это.
JavaScript
$('#save').click(function() {
$.ajax({
type: 'POST',
contentType: 'application/json',
url: 'save_categories.php',
dataType: 'json',
data: JSON.stringify({'categories': $('.dd').nestable('serialize')}),
success: function(msg) {
alert(msg);
}
});
});
вам нужно написать приведенный ниже код save_categories.php $ _POST предварительно заполняется данными формы.
Чтобы получить данные JSON (или любой исходный ввод), используйте вход php://.
$json = json_decode(file_get_contents("php://input"));
$categories = $json->categories;