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