В чем проблема с этим ajax (с прототипом)?

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

<?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');"> 

Вы можете видеть, что im работает на localhost … проблема в том, что POST каким-то образом запутался. ИНОГДА, я получаю следующий ответ в 90% случаев:

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

И еще 10% времени я получаю:

 Array ( ) Array ( [rand] => 468905.44804602925 ) 

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

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

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

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

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

    Я также предлагаю вам следить за сетевым трафиком через 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? Предварительно настроенный или пользовательский?

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

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

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

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

    Это длинный снимок, но без дополнительной информации и просмотра большего количества вашего кода я должен спросить об этом, чтобы вы могли это исключить: может ли это что-то сделать с двойным щелчком мыши по ссылке и созданием двух быстрых запросов? (Когда-то меня укусили <input type = "image" onclick = "submit ();"> оба запускают onclick и отправляют форму)

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

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

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

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

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

     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; } 

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

     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

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

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

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

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

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

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

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

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

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

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

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

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

    2) Зачем вам нужны evalScripts ? Для целей тестирования удалите его.

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

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

    Что произойдет, если вы используете GET. Я имею в виду, если вы также соедините другие параметры в URL-адресе? Как это

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

    Я думаю, вы можете использовать GET.
    Надеюсь, эта помощь.

    Я бы сделал вызов Ajax следующим образом:

     voteAjax = function(typez, actionz, idz){ var rndVal = Math.random()*500000; new Ajax.Request( 'http://localhost/reporeade/Vote/Ajax/', { method: 'post', parameters: {contentType: typez, action: actionz, id: idz, rand: rndVal}, onSuccess: function(response) { //do stuff }, onFailure: function() { alert('Something went wrong.'); } }); return false; }