Реакция данных JSON с сервера PHP пуста

Мне сложно понять это. Кажется, что независимо от того, что я пытаюсь, 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-data действительно отправляется на 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 ', чтобы он работал правильно.

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

Я думаю, что вы отправляете данные не так. Либо вы отправляете строку, как testName=testValue либо присваиваете значение в test непосредственно параметру данных .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); } }); } 

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

живые заголовки http

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

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

 print_r($_POST); 

Пытаться:

 print json_encode($_POST); 

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

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