Мне кажется, я нашел проблему (для краткого ответа перейдите к жирному тексту).
Я попробовал пример на своем компьютере, создав файл .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" есть те или иные опции, которые могут содержать ответ.