2009-02-05 22 views
1

你好,我有下面的代碼: PHP端:這個ajax與原型有什麼問題?

<?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嘗試在服務器上(想也許本地主機是麻煩) ,閱讀的地方,使用http://localhost/reporeade/Vote/Ajax/?rand=http://localhost/reporeade/Vote/Ajax?rand= instade解決了麻煩,但嘗試了兩個,真的不知道怎麼會讓這個帖子迷路....任何想法?

編輯: 這一切玩好了後,我得到它的工作(如它)在我們的生產服務器,但在我們所有的WAMP的instalations將無法正常工作(當然不能像50%的時間)。它爲我解決這個,所以我們可以繼續開發產品的所有Ajax功能,所以......

  • 我想XAMPP,但它不是我們的架構兼容非常重要
  • 我試着去阿帕奇2.0,而不是2.2 WAMP
  • 我試着用了httpd.conf和php.ini中

的WAMP爲什麼會失敗這樣的任何想法的diferent配置?

更新: 我敢肯定,這個問題是沒有正確發送POST有時WAMP的安裝目錄,任何幫助,這將導致解決這個將得到正確的答案和賞金!

+0

您是否嘗試過使用一個普通的HTML表單直接發佈,而不是使用Javascript?您嘗試了以下哪些方法?如果您能提供這些信息,那麼我們可以排除可能的問題。 – strager 2009-02-15 22:30:36

+0

請注意,我已經安裝了WAMP(最新版本)並嘗試重現該錯誤,但未能成功。經過大約100次點擊後,我從未得到過糟糕的迴應。 – strager 2009-02-15 22:31:16

回答

1

我也建議你應該通過Wireshark的監控網絡流量:

  1. 啓動它或者服務器或客戶端上。
  2. 開始捕獲您的網絡接口。
  3. 使用AJAX和
  4. 在停止捕獲時失敗並且在Wireshark中鍵入http,以幫助您找到請求。
  5. 右鍵單擊並選擇「遵循TCP流」。

如果請求中的POST數據沒有顯示出來,它是瀏覽器的東西。你可以檢查HTTP標頭中是否有可能的錯誤(比如之前提到的GZip與IE結合使用)。

也許你的WAMP設置使用Fast-CGI或類似的方式來調用PHP,所以它沒有使用Apache的實際PHP模塊?有時如果設置不正確,可能會導致此類錯誤。如果你不一定需要它,我建議切換到PHP模塊或尋找可能的配置錯誤。

無論如何,WAMP是什麼?預配置還是自定義?

2

我建議安裝WireShark並監控您的HTTP流量,看看您是否可以通過這種方式找出問題。

+0

我不認爲WireShark可以監控環回數據,因此您可能需要從另一臺計算機上點擊該網站才能正確測試。 – 2009-02-05 20:59:07

+0

是啊,即時通訊發現它似乎是一個全新的任務,只是要學習wireshack,並獲得我需要的數據....反正生病繼續嘗試 – DFectuoso 2009-02-05 21:08:29

+0

好吧無論是有效地閱讀數據包轉儲是一個很好的技能。特別是隨着AJAX開發的一半時間,你不能「看到」發生了什麼,否則。 – 2009-02-05 21:50:59

1

如果它的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()調試這更深入。

1

,嘗試新的日期(),而不是隨機的:如果你使用而不是GET

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

會發生什麼。我的意思是,如果你連接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。
希望得到這個幫助。

1

試試這個:

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

通知,我已經刪除了其他的選擇,因爲它們不是necesary,因爲他們是在它的默認值:)

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

喲可以看到它在這裏http://www.prototypejs.org/api/ajax/options

希望它的幫助!

2

您是否嘗試過另一個版本的Prototype?在我看來,構建post請求體有一個奇怪的錯誤,有效地創建無效(部分)請求服務器無法正確解析。使用Fiddler(輕鬆掌握http嗅探器)並查看發送到服務器的確切內容。如果不是這種情況(我承認,如果Prototype會被破壞,那真的很奇怪),試試通過PHP閱讀原始發佈數據(應該在php.ini中啓用)。如果可以,並且它們沒有填充到$_POST集合中,請嘗試使用$_REQUEST

此外,請嘗試諮詢下面的線程,也許這是你的情況:http://bugs.php.net/bug.php?id=41349

1

我也運行wampserver,所以我只是試過你的代碼,我不能重現這個問題 - 我總是得到POST值。我的安裝是Apache 2.2.8和PHP 5.2.6,我只是抓住了最新的prototype.js。我的wampserver配置幾乎是默認設置。

+1給Fiddler和/或Firebug。查看正在發送的原始頭文件可能會很有啓發性!

1

你使用什麼瀏覽器?使用FF和IE時會失敗嗎?或者只有一個瀏覽器。

前段時間我讀了關於IE和Apache gzip模塊的問題。它只發生在服務器響應速度非常快的本地安裝上。但是你的情況是不同的。

絕對值得嘗試WireShark,因爲其他人已經建議。這並不難。至少你會知道哪一邊有一個bug。

1

也許請求通過的某個組件(Php,webserver,firewall,...)會讓您感到困惑,因爲您使用帶有GET參數的POST請求。如果你遺漏了?rand=...部分,它會改變什麼嗎?

2

這是一個遠射,但沒有更多的信息,並看到更多的代碼我不得不問這個,所以你可以排除它:它可能與用戶雙擊鏈接並創建兩個快速請求? (曾幾何時我被<輸入類型=「形象」被咬的onclick =「提交();」 >都運行的onclick並提交表單)

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

(有你的鏈接調用測試功能)

通常情況下,您希望使用異步連接,因爲這不會鎖定用戶界面,但在這種情況下,您可以嘗試同步以確保您在此時只執行一個請求。 (一個非阻塞的解決方案是設置一個標誌或禁用鏈接/按鈕,而請求處理)

順便說一句,我也建議你發送一個對象而不是字符串作爲參數,因爲原型將URIEncode它並把所有&在正確的地方。

0

我會做的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; 
    }