2011-08-14 38 views
0

我看了一個簡短的介紹阿賈克斯長輪詢here並試圖模仿它在我自己的電腦上使用wamp,但是我遇到了一些問題。阿賈克斯長查詢問題

我一直得到有關在longpolling.php文件未定義指數的錯誤,第29行是

$num = $_GET['num'];
這是因爲有一個沒有導致$ _GET一個num參數沒有被設置阿賈克斯get函數。 我將代碼更改爲

if(isset($_GET['num'])) 
    $num = $_GET['num']; 
else 
    $num = "";

並且工作正常。但是,一旦我重新加載頁面,CD計數減少一次,然後停止。

有人會知道這種情況發生的原因嗎? PHP文件(服務器)

<?php 

$cd_stock = ("CdCount.txt"); 

function updateStock($num) 
{ 
    global $cd_stock; 
    $count = file($cd_stock); 
    $count = (int)$count[0]; 
    $count = $count - $num; 
    if ($count < 0) $count = 0; 
    $fp = fopen($cd_stock , "w"); 
    fputs($fp , "$count"); 
    fclose($fp); 

    echo $count; 
} 

function getCdCount() 
{ 
    srand(); 
    $newOrder = rand(1, 3); 
    $sleeptime = rand(2, 10); 
    sleep(2); 

    updateStock($newOrder); 
} 
if(isset($_GET['num'])) 
    $num = $_GET['num']; 
else 
    $num = ""; 
if ($num = "") 
{ 
    getCdCount(); 
} 
else 
{ 
    updateStock((int)$num); 
} 
?> 

JavaScript文件(客戶端)(使用原型框架)

Event.observe(window, 'load', function() { 

    Event.observe('btnSubmit', 'click', purchaseCD); 

    connectToServer(); 
}); 

function connectToServer() 
{ 
    new Ajax.Updater( 
     { success: 'CD Count', failure: 'errors' }, 
     'LongPolling.php', 
     { 
      method:  'get', 
      onSuccess: function(transport) 
      { 
       if (parseInt(transport.responseText)) connectToServer(); 
      } 
    }); 
} 

function purchaseCD() 
{ 
    new Ajax.Updater(
     { success: 'CD Count', failure: 'errors' }, 
     'LongPolling.php', 
     { 
      method:  'get', 
      parameters: { num: $('txtQty').getValue() } 
    }); 
} 

HTML文件是不是真的值得張貼起來。它只是包括ajax的JavaScript文件和原型js文件和相關的div等

我一直花費我的大腦幾個小時試圖解決這個問題,但我不知道什麼是錯的,它並不鼓勵這是來自「教程」類型的文章。

+0

請在您的問題中添加code/js/html內嵌的_relevant_部分。 – Mat

+0

好吧,我已經把他們內聯,但是,我不知道這個問題,所以不能分辨哪些部分是相關的或不。我希望我想添加太多。 – Michael

回答

2

您的第一個問題可能存在的事實是,一個教程坦率地說是不可原諒的。所有的教程都應該假設你有最大的錯誤報告(如果所有的教程都告訴你如何確保它發生的話,那將是非常好的)。對你來說好消息? WAMP默認設置錯誤報告非常高,所以不應該擔心。

我也藉此問題的事實,他正在使用file這樣(他應該使用file_get_contents),他告訴你用一個文件來開始 - 它應該是$_SESSION,或者甚至更好,一數據庫連接。教程還應該儘量避免使用關鍵字global(如果教程無法管理該教程,則作者應該閱讀教程而不是編寫它們)。他還認爲你最好使用一個無效CSS的ID(你的ID在CSS中不能有空格,這在JS中是可以接受的,但是爲什麼你會這樣做,如果它使CSS不可能的話)。最後,他談到了Ajax.Updater的所有好處,但他決定使用bizarro遞歸方案而不是Ajax.PeriodicalUpdaterThat's what it's there for.

我的建議是拋棄那個教程,並在更好的教程上工作。就個人而言,我覺得學習「老方法」(無框架AJAX)的價值,我不得不推薦this one。如果你想使用框架,我個人認爲你最好使用jQuery教程(如this one),因爲它更常見。如果你真的喜歡Prototype,還有其他更簡單的例子 - this one似乎非常困難。

如果你覺得這是一個真正的教程,最重要的是,你可以做一些事情來幫助你自己解決這個問題。您沒有任何明顯的編碼錯誤,所以我可以做的最多的就是給你建議:

  1. 確保WAMP仍在運行(愚蠢的一步,我知道,但它發生在不少美國的上場合)。
  2. 將PHP中的「sleep」替換爲if (parseInt(transport.responseText)) setTimeout(connectToServer, Math.rand() * 4000 + 1000);(放置延遲客戶端而不是服務器端)。 sleep應該只能用於非常罕見的情況。
  3. 致電console.log(或者如果您沒有使用像Firebug這樣的網絡開發工具(如果沒有...爲什麼不呢?))提醒transport.responseText。如果服務器返回0,它不會再次觸發connectToServer方法。所以知道這個價值可能是有用的。
  4. 跟蹤Ajax請求。你可以免費使用Firebug做到這一點。
  5. 看看CdCount.txt,看看它是否正在更新。
+0

非常感謝您的回覆! – Michael

+0

我不小心按下了輸入。非常感謝您的回覆!我最初看的教程只是測試基本的ajax在我的服務器設置中爲我工作,然後將其應用到我自己的項目中。什麼本該是一個簡單的30分鐘的練習變成了一整天的搜索和混亂的東西。我無法對你的建議表示感謝。我還有一些關於firebug/web軟件開發的進一步問題,因爲我對此完全陌生,但沒有空間留下評論,我不知道我是否會收到回覆,因爲這是一條評論。 – Michael

+0

@Michael你應該問一個關於他們的問題 – cwallenpoole