В чем проблема с этим AJAX (с прототипом)? - PullRequest
1 голос
/ 05 февраля 2009

Здравствуйте, у меня есть следующий код: сторона php:

<?php
print_r($_POST);
print_r($_GET);
die();
?>

В JavaScript:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/?rand='+Math.random()*500000, 
        {asynchronous:true, 
         evalScripts:true,
         method:'post',
         parameters:'contentType='+typez+'&action='+actionz+'&id='+idz 
        });
    return false; 
}

И в какой-то части моего html:

<a class="button" onclick="voteAjax('content','up','89');">

Вы можете видеть, что я бегу на локальном хосте ... у меня проблема в том, что POST каким-то образом перепутал НЕКОТОРЫЕ, я получаю следующий ответ 90% времени:

Array
(
    [contentType] => content
    [action] => up
    [id] => 89
)

Array
(
    [rand] => 449701.9597706424
)

А остальные 10% времени я получаю:

Array
(
)

Array
(
    [rand] => 468905.44804602925
)

Теперь, я попробовал все, изменил компьютер, попробовал на сервере с полным URL-адресом (думая, может быть, проблема в localhost), где-то прочитал, что с помощью http://localhost/reporeade/Vote/Ajax/?rand= вместо http://localhost/reporeade/Vote/Ajax?rand= решен проблема, но попробовал оба и действительно не могу предпринять то, что заставило бы почту потеряться .... любые идеи?

Edit: Хорошо поиграв со всем этим, я заработал (как он есть) на нашем производственном сервере, но во всех наших установках wamp он не будет работать (ну, как правило, 50% времени). Для меня очень важно решить эту проблему, чтобы мы могли продолжить разработку всех функций ajax продукта, так что ...

  • Я пробовал xampp, но он не совместим с нашей платформой
  • Я попытался перейти на apache 2.0 вместо 2.2 в wamp
  • Я пытался использовать разные конфигурации httpd.conf и php.ini

Любые идеи о том, почему вампир терпит неудачу, как это?

Обновление: Я уверен, что проблема в установке wamp, которая иногда не отправляет POST правильно, любая помощь, которая приведет к ее решению, даст правильный ответ и щедрость!

Ответы [ 12 ]

2 голосов
/ 15 февраля 2009

Это долгий путь, но без дополнительной информации и больше информации о вашем коде я должен спросить об этом, чтобы вы могли исключить это: может ли это иметь какое-то отношение к тому, что пользователь дважды щелкает ссылку и создает два быстрых Запросы? (Однажды меня укусила оба запустили onclick и отправили форму)

function test() {
    voteAjax('content','up','89');
    voteAjax('content','up','89');
}

(ваша ссылка вызывает вышеуказанную функцию тестирования)

Обычно вы хотите использовать асинхронные соединения, так как это не блокирует пользовательский интерфейс, однако это тот случай, когда вы можете попробовать синхронное соединение, чтобы убедиться, что вы делаете только один запрос за раз. (Неблокирующее решение - установить флаг или отключить ссылку / кнопку во время обработки запроса)

Кстати, я тоже предлагаю отправлять объект вместо строки в качестве параметров, так как прототип URIEncode его и поместит все & в нужных местах.

2 голосов
/ 11 февраля 2009

Вы пробовали другую версию Prototype? Мне кажется, есть странная ошибка в построении тела почтового запроса, эффективно создающего недействительный (частично) запрос, который сервер не может правильно проанализировать. Используйте Fiddler (легко понять http sniffer) и посмотрите, что именно отправляется на сервер.

Если это не так (я допускаю, что было бы очень странно, если бы Prototype был сломан), попробуйте читать необработанные данные постов через PHP (должен быть включен в php.ini) Если вы можете, и они не заполняются в коллекцию $_POST, попробуйте вместо этого $_REQUEST.

Также попробуйте обратиться к следующей теме, возможно, это ваш случай: http://bugs.php.net/bug.php?id=41349.

2 голосов
/ 05 февраля 2009

Я бы посоветовал установить WireShark и следить за вашим HTTP-трафиком, чтобы посмотреть, сможете ли вы таким образом изолировать проблему.

1 голос
/ 15 февраля 2009

Я также предлагаю вам отслеживать сетевой трафик через Wireshark:

  1. Запустите его на сервере или клиенте.
  2. Начните захват вашего сетевого интерфейса.
  3. Используйте AJAX и
  4. , если не удается остановить захват и
  5. введите http в Wireshark, чтобы помочь вам найти запрос.
  6. Щелкните правой кнопкой мыши и выберите «Follow TCP Stream».

Если данные POST в запросе не отображаются, это что-то с браузером. Вы можете проверить заголовки HTTP на возможные ошибки (например, GZip в сочетании с IE уже упоминался ранее).

Может быть, ваша установка WAMP использует Fast-CGI или аналогичный для вызова PHP, поэтому он не использует настоящий модуль PHP для Apache? Иногда это может вызвать такие ошибки, если не настроен правильно. Если вам это не нужно, я рекомендую перейти на модуль PHP или поискать возможные ошибки конфигурации.

Что это за WAMP? Предварительно настроенный или пользовательский?

1 голос
/ 13 февраля 2009

Возможно, какой-то компонент, через который проходит запрос (Php, веб-сервер, брандмауэр, ...), запутается, что вы используете запрос POST с параметрами GET. Изменится ли что-нибудь, если вы пропустите часть ?rand=...?

1 голос
/ 11 февраля 2009

Какой браузер вы используете? Это не удается при использовании FF и IE? Или только один браузер.

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

Определенно стоит попробовать WireShark, как уже предлагали другие. Это не так сложно. По крайней мере, вы будете знать, с какой стороны есть ошибка.

1 голос
/ 11 февраля 2009

У меня тоже работает wampserver, поэтому я просто попробовал ваш код и не смог воспроизвести проблему - я всегда получаю значения POST. Моя установка - Apache 2.2.8 и PHP 5.2.6, и я только что взял последний prototype.js. Моя конфигурация Wampserver в значительной степени по умолчанию.

+ 1 к Fiddler и / или Firebug. Глядя на необработанные заголовки, которые отправляются, возможно, будет полезно!

1 голос
/ 11 февраля 2009

попробуйте это:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/', 
        {
           parameters: {
             contentType: typez,
             action: actionz,
             id: idz,
             rand: new Date()
           }
        });
    return false; 
}

обратите внимание, что я удалил другие опции, так как они не являются необходимыми, поскольку они имеют значения по умолчанию:)

asynchronous:true, 
evalScripts:true,      -----> this one is "evalJS" not "evalScripts" :)
method:'post',

Вы можете увидеть это здесь http://www.prototypejs.org/api/ajax/options

надеюсь, это поможет!

1 голос
/ 05 февраля 2009

Попробуйте новую дату () вместо случайного:

voteAjax = function(typez, actionz, idz){
    new Ajax.Request(
        'http://localhost/reporeade/Vote/Ajax/', 
        {asynchronous:true, 
         evalScripts:true,
         method:'post',
         parameters:'contentType='+typez+'&action='+actionz+'&id='+idz+'&now='+new Date() 
        });

    //alert("params" + typez.toString() + actionz.toString() + idz.toString());
    return false; 
}
1 голос
/ 05 февраля 2009

Если это запрос POST, вам не нужно устанавливать параметр rand, POST не кэшируется, возможно, это поможет.

РЕДАКТИРОВАТЬ Не могу понять, что является причиной этого, не видя больше кода в деталях. Что бы я сделал, это:

1) Попробуйте передать объект атрибуту parameters следующим образом:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}

вместо строки:

parameters:'contentType='+typez+'&action='+actionz+'&id='+idz 

2) Зачем вам нужно evalScripts? Для проверки удалите его.

3) Отладка этого, похоже, проблема в том, что параметры отправляются с Javascript, поэтому используйте Firebug console.log() для более подробной отладки.

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