2013-09-14 3 views
1

Хорошо, у меня есть некоторые суицидальные проблемы, отправляющие строку JSON на страницу PHP. Я буквально попал в десятку лучших результатов в Google и много вопросов SO, связанных с моей проблемой, но по-прежнему не могу понять, что я делаю неправильно.Публикация строки JSON на PHP-страницу

У меня есть несколько форм на странице и вы хотите собрать все поля формы, превратить их в строку JSON и отправить их на страницу PHP, где сценарий выполняет итерацию каждого элемента и обновляет соответствующие таблицы базы данных.

Это мой JQuery/JS скрипт для сбора данных от всех форм:

вар photo_annotations = {};

$('form').each(function(i) { 
    var id = $(this).attr('id'); 
    photo_annotations[id] = { 
     caption: $('#'+id+'_caption').val(), 
     keywords: $('#'+id+'_keywords').val(), 
     credit: $('#'+id+'_credit').val(), 
     credit_url: $('#'+id+'_credit_url').val() 
    }; 
}); 

Если я console.log приемлю photo_annotations, это то, что производится, основываясь на два вида, например:

({11: {Надпись: "Надпись на первой фотографии", ключевые слова: «Ключевое слово1, Ключевое слово2, ключевое слово3», кредит: «Joe Bloggs», credit_url: «www.a-domain.com»}, 12: {caption: «Caption for Lady Gaga.», ключевые слова: «Ключевое слово3, ключевое слово4 », кредит:« Джон Доу », credit_url:« www.another-domain.com »}})

Затем я должен отправить это как строка/JSON на PHP страницу, так что я сделал это:

$.ajax({ 
    type: 'POST', 
    dataType: 'html', 
    url: 'ajax/save-annotations.php', 
    data: { data: JSON.stringify(photo_annotations) }, 
    contentType: "application/json; charset=utf-8", 
    success: function(data) { 
     if (data) { 
     $('#form_results').html(data); 
     } else { 
     alert("No data"); 
     } 
    } 
}); 

И на моей странице PHP, я получил это:

<?php 
//print_r($_POST['data']); 
$decoded = json_decode($_POST['data'],true); 
print_r($decoded); 
?> 

Теперь это не единственное, что я пробовал. Я попытался удалить все настройки JSON из сценария AJAX, чтобы просто отправить чистую строку. Я попытался удалить contentType и JSON.stringify, но все равно не поеду. Моя страница PHP просто не может получить данные, которые я отправляю.

Пожалуйста, помогите подтолкнуть меня в правильном направлении. Я дошел до того, что не могу вспомнить все варианты, которые я пробовал, и этот маленький скрипт теперь на второй день!

УДАЛОСЬ FIX IT

я переписал свою функцию AJAX, и она работала. Я не знаю, что пошло не так, но решил протестировать мою функцию AJAX с помощью очень простой строки данных test=hello world и обнаружил, что никакие данные POST не могут быть прочитаны с PHP-страницы, хотя Firebug говорит, что на самом деле страница получала сопоставление почтовых данных что я послал. Очень странно. Во всяком случае, это пересмотренная AJAX скрипт:

var the_obj = JSON.stringify(photo_annotations); 
var post_data = "annotations="+the_obj; 
$.ajax({ 
    url: 'ajax/save-annotations', 
    type: 'POST', 
    data: post_data, 
    dataType: 'html', 
    success: function(data) { 
     $('#form_results').html(data); 
    } 
}); 
+0

Есть ли причина для HTML dataType? – Neikos

+0

Потому что я отправляю HTML обратно со страницы PHP, когда обработка данных завершена. Это неправильно? – TheCarver

+0

Нет, нет. Извините, неправильно прочитайте свой код. Я не понимал, что вы расшифровываете опубликованные данные. Тогда HTML будет правильным типом данных, да. – Neikos

ответ

2

Try:

$.ajax({ 
    // ... 
    data: { data: JSON.stringify(photo_annotations) }, 
    // ... 
    }); 

Если вы просто установить «данные» свойства в строку, а затем JQuery думает, что вы хотите использовать его в качестве фактического запроса строка, и это явно не сработает, когда это капля JSON. Когда вы передаете jQuery объект , как указано выше, он будет делать соответствующую URL-кодировку имен и значений свойств (ваш JSON-blob) и создать для вас строку запроса. Вы должны получить один параметр «данных» на сервере, и это значение будет строкой JSON.

+0

Я просто попробовал это и ничего не изменил. Ну, это может быть, поскольку я могу подтвердить, что получаю некоторые данные, отправленные на сервер в объект, называемый «данные», и содержит такие вещи: data =% 7B% 2211% 22% 3A% 7B% 22caption% 22 % 3A% 22% 22% 2C% 22keywords% 22% 3A% 22% 22% 2C% 22credit% 22% 3A% 22% 22% 2C% 22credit_url% 22% 3A% 22% 22% 7D% 2C% 2212% 22 % 3A% 7B% 22caption% 22% 3A% 22% ... – TheCarver

+0

Правильно ли этот формат? Я думаю, что теперь это проблема с PHP, поскольку я знаю, что моя страница PHP получает некоторые данные, но не может ее прочитать. – TheCarver

0

Попробуйте urldecode или rawurldecode следующим образом:

<?php 
$decoded = json_decode(urldecode($_POST['data']), true); 
print_r($decoded); 
?> 
+0

Просто попробовал оба из них и еще ничего. – TheCarver

0

я переписал свою функцию AJAX и теперь он работает. Я не знаю, что пошло не так, но решил протестировать мою функцию AJAX с помощью очень простой строки данных test=hello world и обнаружил, что никакие данные POST не могут быть прочитаны с PHP-страницы, хотя Firebug говорит, что на самом деле страница получала сопоставление почтовых данных что я послал. Очень странно. Во всяком случае, это пересмотренная AJAX скрипт:

var the_obj = JSON.stringify(photo_annotations); 
var post_data = "annotations="+the_obj; 
$.ajax({ 
    url: 'ajax/save-annotations', 
    type: 'POST', 
    data: post_data, 
    dataType: 'html', 
    success: function(data) { 
     $('#form_results').html(data); 
    } 
}); 

Единственное, что я могу думать о том, что порядок настройки AJAX требуется, чтобы быть в определенном порядке. Это мой старый сценарий AJAX, который не отправляет данные POST успешно - ну, он отправляет, но не может быть прочитан !!

var the_obj = JSON.stringify(photo_annotations); 
var data_str = "annotations="+the_obj; 
$.ajax({ 
    type: 'POST', 
    dataType: 'html', 
    data: data_str, 
    url: 'ajax/save-annotations.php', 
    success: function(data) { 
     $('#form_results').html(data); 
    } 
}); 
0

в вашем АЯКС вызова попробуйте сбросить DATATYPE к JSon

dataType: "json", 

Вы не должны использовать JSON.stringify() либо. На вашем php-скрипте вам не придется декодировать [json_decode()] данные из переменной $ _POST. Данные будут легко читаемы вашим php-скриптом.

Смежные вопросы