2011-08-14 33 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