Ответ данных JSON с сервера PHP пуст - PullRequest
4 голосов
/ 25 февраля 2010

Мне трудно понять это. Кажется, что независимо от того, что я пытаюсь, PHP всегда заканчивает тем, что возвращает пустой массив. Вот код моего основного файла (index.php):

<script language="javascript" type="text/javascript">

$(document).ready(function(){

  $(".ajaxlink").click(function() {
    callServer();
    return false; //Stop link from redirecting
  });

});

var test = { "testName": "testValue" }
var testJSON = JSON.stringify(test);

function updatePage(data) {
  document.getElementById("testDiv").innerHTML = data;
}

function callServer() {
 $.ajax({
   type: "POST",
   url: "ajax/server.php",
   data: testJSON,
   success: function(data) {
     updatePage(data);
   },
   //Upon error, output message containing a little info on what went wrong
   error: function (XMLHttpRequest, textStatus, errorThrown) {
     alert('An Ajax error occured\ntextStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown + '\nstatus = ' + XMLHttpRequest.status);
   }
 });
}

</script>

<div id="testDiv">Something here</div>

<a href="test1.htm" class="ajaxlink">Link!</a> <br>

Это в основном запускает функцию callServer (), когда вы нажимаете «Ссылка!». Затем он отправляет данные теста json, то есть {"testName": "testValue"} в server.php. Firebug сообщает, что данные json действительно отправляются на server.php.

Мой server.php выглядит так:

<?php

print_r($_POST);

?>

Возвращает следующее в testDiv:

Array
(
)

Тип данных в функции .ajax не определен, поэтому независимо от того, что выводится из файла server.php, он должен быть читаемым. Все необходимые библиотеки (json, jquery) также включены в мой документ. Я запускаю это на Apache 2.2 и PHP 5.3.1, но это показывает то же самое на моем веб-сервере (который является хостом для тысяч веб-сайтов). Тип содержимого, используемый в заголовке запроса: application / x-www-form-urlencoded; charset = UTF-8 ', чтобы он работал правильно.

Спасибо за ваше время. С наилучшими пожеланиями Сорен

Ответы [ 3 ]

4 голосов
/ 25 февраля 2010

Я думаю, что вы отправляете данные неправильно. Либо вы отправляете строку типа testName=testValue, либо вы присваиваете значение в test непосредственно параметру data в .ajax() и не используете метод stringify.

Поскольку, если вы используете stringify, фактические отправленные данные будут (я полагаю, я здесь не уверен):

'{ "testName": "testValue" }'

но это недопустимая строка параметра.

Он должен иметь форму

'testName=testValue'

Так что используйте test напрямую, .ajax() преобразует объект в соответствующую строку:

function callServer() {
 $.ajax({
   type: "POST",
   url: "ajax/server.php",
   data: test,
   success: function(data) {
     updatePage(data);
   },
   //Upon error, output message containing a little info on what went wrong
   error: function (XMLHttpRequest, textStatus, errorThrown) {
     alert('An Ajax error occured\ntextStatus = ' + textStatus + '\nerrorThrown = ' + errorThrown + '\nstatus = ' + XMLHttpRequest.status);
   }
 });
}
0 голосов
/ 25 февраля 2010

Я не уверен, что ваш вывод из вашего скрипта PHP отформатирован в JSON.

Если вы используете более новую версию PHP (которой вы являетесь), у вас будет доступ к функциям json_encode и json_decode. Вместо того, чтобы делать:

print_r($_POST);

Попробуйте:

print json_encode($_POST);

Если ваша версия PHP не имеет этих функций, вы можете использовать библиотеку, такую ​​как класс Zend_Json в Zend Framework, для кодирования ваших переменных PHP в виде JSON перед их выводом.

И когда он вернется, это будет строка в формате JSON. Установка dataType в вашем вызове jQuery.ajax должна оценивать его как объект JS. Если нет, то вам придется либо вызвать функцию Javascript eval, либо (предпочтительно) использовать JSON.parse (data).

0 голосов
/ 25 февраля 2010

Используйте Firefox и расширение Live Http Headers.
Благодаря этому вы сможете точно определить, в чем проблема,
Код Php или Js.

заголовки HTTP в реальном времени

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...