2009-02-05 76 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; 
    }