Почему мои данные ответа $ .getJSON равны нулю? - PullRequest
4 голосов
/ 01 февраля 2010

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

Вот страница PHP на сервере:

<?php
    try
    {
        if(!session_start()) {
            throw new Exception("unable to start session");
        }

        echo json_encode(array(
                "status" => "success",
                "session_id" => session_id()
            ));
    }
    catch(Exception $e)
    {
        echo json_encode(array(
            "status" => "fail",
            "error" => $e->getMessage()
        ));
    }
?>

Работает нормально и выдает что-то вроде этого:

{ "статус": "Успех", "session_id": "i3cdogb9jgd6oudar104qfuih1"}

HTML-страница очень проста:

<html>
<head>
<script src="jquery-1.4.1.min.js" type="text/javascript"></script>
<title>getJSON example</title>
    <script type="text/javascript">


        $(document).ready(function() {

            $.ajax({
                url: "http://webserver/init.php",
                dataType: 'json',
                success: function(json) {
                    if(json.status === "success"){
                        $("#session_key").val(json.session_id);
                    }
                }
            });
        });


    </script>
</head>
<body>
<input type="hidden" id="session_key"/>
</body>
</html>

Дополнительная информация

Заголовки запроса:

GET /init.php HTTP/1.1
Host: ir-6483
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2) Gecko/20100115 Firefox/3.6 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 115
Connection: keep-alive
Origin: null

Заголовки ответа:

HTTP/1.1 200 OK
Date: Mon, 01 Feb 2010 16:50:11 GMT
Server: Apache/2.2.14 (Win32) PHP/5.2.12
X-Powered-By: PHP/5.2.12
Set-Cookie: PHPSESSID=i033rd4618o18h3p5kenspcc35; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 101
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html

Итак, вы можете видеть, что ID сеанса PHP устанавливается, но вкладка ответа пуста.

Ответы [ 3 ]

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

Мне кажется, я нашел проблему (для краткого ответа перейдите к жирному тексту).

Я попробовал пример на своем компьютере, создав файл .html на своем рабочем столе и загрузив фрагмент PHP на мой dev-сервер в локальной сети. Это дало мне те же результаты, что и вы, также с Firefox (v3.5.7).

Я не парень по PHP (больше Python / Django), но я знаю немного базового PHP, и ваш код выглядел хорошо для меня. Я подтвердил это большим поиском примеров PHP / JSON / Ajax. Я попробовал все варианты, приведенные на консультационных форумах, включая различные параметры заголовков кэширования в PHP и различные методы JQuery, в том числе изменив некоторые из его параметров кэширования, а также пробовал различные варианты. Без разницы.

Я полностью упростил PHP, чтобы буквально просто возвращать массив JSON из одного элемента без каких-либо других условных или управляющих структур - без радости.

В конце концов я отчаялся и попробовал тот же файл в IE 8. Это сработало! Пробовал в Safari - все заработало!

Затем я стал параноиком и подумал, что в Firefox могут возникнуть проблемы с сессией или какие-то другие странности, поэтому я полностью очистил свою историю Firefox и перезапустил браузер. Без разницы.

Это, по крайней мере, дало мне другой взгляд на то, для чего я мог бы использовать Google, чтобы увидеть, есть ли у других такая же проблема. На самом деле они имели.

Оказывается, , если вы запускаете файл HTML, содержащий Ajax, на своем локальном компьютере, то есть с префиксом «file: //», Firefox по некоторым причинам не будет правильно выполнять вызовы Ajax. Я скопировал файл на свой dev-сервер, там же, где и файл PHP (но все еще использовал полный адрес в качестве URL-адреса Ajax) и, конечно же, это сработало!

Я не совсем понимаю, что Firefox делает по-другому с действительно локальными файлами и Ajax, но снаружи становится все легче, и я не могу сейчас расследовать. Я просмотрел настройки безопасности, но ничего очевидного не выскочило на меня. Мне было бы очень интересно узнать, как это вписывается в вашу среду разработки. Я буду расследовать позже, если у меня будет возможность, и обновлю этот ответ.

Я не удивлюсь, если в "about: config" есть те или иные опции, которые могут содержать ответ.

1 голос
/ 01 февраля 2010

Я скопировал HTML и Javascript из вашего примера, изменив только вызов init.php на просто 'init.php' (полностью предполагая тот же сервер и каталог), и пример работал отлично. В опубликованном коде нет ничего плохого, что означает, что вам нужно дважды проверить вкладку Firebug net, чтобы увидеть, что делается запрос и каков ответ. Также измените тип ввода со скрытого на текстовый, пока не убедитесь, что все работает. Если вы используете «View Source» для поиска результирующего значения, вы его не увидите, потому что значение не существовало на момент загрузки страницы. Если у вас установлен плагин Firefox для веб-разработчиков , вы можете «Просмотреть созданный источник», который будет показывать результаты AJAX в вашей скрытой переменной.

1 голос
/ 01 февраля 2010

Риск получить порку, похоже, вы не включили jQuery.js в ваш документ HEAD:

<script type="http://ajax.googleapis.com/ajax/libs/jquery/1.4.1/jquery.min.js"></script>

EDIT:

Я бы попробовал установить заголовок Content-Type перед выводом с сервера, на всякий случай:

header('Content-type: application/json');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...