这个ajax(带原型)有什么问题?

时间:2009-02-05 20:35:19

标签: php javascript ajax prototypejs

您好我有下一个代码: php方面:

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

你可以看到即时通讯在localhost上运行......我遇到的问题是POST不知何故混淆了很多,我90%的时间得到了下一个答案:

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

Array
(
    [rand] => 449701.9597706424
)

另外10%的时间我得到了:

Array
(
)

Array
(
    [rand] => 468905.44804602925
)

现在,我已经尝试了一切,更换了计算机,尝试了一个带有完整网址的服务器(想想也许本地主机是麻烦的),在某处使用http://localhost/reporeade/Vote/Ajax/?rand= http://localhost/reporeade/Vote/Ajax?rand= {{3}}解决了问题尝试了两者并且真的不能做什么会让帖子迷失......任何想法?

修改 玩完所有这些之后,我在我们的生产服务器中运行它(就像它一样),但是在我们所有的wamp instalations中它都不起作用(很好地失败了50%的时间)。对我来说解决这个问题非常重要,这样我们就可以继续开发产品的所有ajax功能,所以...

  • 我尝试了xampp,但它与我们的框架不兼容
  • 我尝试使用apache 2.0而不是2.2 in wamp
  • 我尝试使用不同的httpd.conf和php.ini
  • 配置

为什么wamp会像这样失败?

更新 我确定问题是wamp instalation没有正确发送POST一次,任何能够解决这个问题的帮助都会得到正确答案和赏金!

12 个答案:

答案 0 :(得分:2)

我建议安装WireShark并监控您的HTTP流量,看看您是否可以通过这种方式隔离问题。

答案 1 :(得分:2)

您是否尝试过其他版本的Prototype?在我看来,构建post请求体有一个奇怪的错误,有效地创建无效(部分)请求服务器无法正确解析。使用Fiddler(易于掌握http嗅探器),看看究竟是什么发送到服务器。

如果不是这种情况(我承认如果Prototype被破坏会非常奇怪),请尝试通过PHP阅读原始发布数据(应该在php.ini中启用)。如果可以,但他们未填充到$_POST集合中,请尝试使用$_REQUEST

另外,请尝试咨询以下主题,也许这是您的情况:http://bugs.php.net/bug.php?id=41349

答案 2 :(得分:2)

这是一个很长的镜头,但没有更多的信息,看到更多的代码,我不得不问这个,所以你可以排除它:它是否与用户有关,双击链接并创建两个快速要求? (曾几何时我被&lt; input type =“image”咬了“onclick =”submit();“&gt;都运行了onclick并提交了表单)

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

(让你的链接调用上面的测试函数)

通常,您希望使用异步连接,因为这不会锁定UI,但是这种情况下您可以尝试同步以确保您当时只执行一个请求。 (非阻塞解决方案是在处理请求时设置标志或禁用链接/按钮)

顺便说一下,我也建议您发送一个对象而不是字符串作为参数,因为原型将对其进行URIEncode并将所有&amp;在正确的地方。

答案 3 :(得分: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()来更深入地调试它。

答案 4 :(得分:1)

尝试新的Date(),而不是随机的:

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

答案 5 :(得分: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; 
}

请注意我删除了其他选项,因为它们不是必需的,因为它们是默认值:)

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

你可以在这里看到http://www.prototypejs.org/api/ajax/options

希望它有所帮助!

答案 6 :(得分:1)

我也正在运行wampserver,所以我只是尝试了你的代码,我无法重现问题 - 我总是得到POST值。我的安装是Apache 2.2.8和PHP 5.2.6,我刚刚抓住了最新的prototype.js。我的wampserver配置几乎是默认配置。

+1给Fiddler和/或Firebug。查看正在发送的原始标头可能会很有启发性!

答案 7 :(得分:1)

您使用的浏览器是什么?使用FF和IE时失败了吗?或者只有一个浏览器。

前段时间我读到了IE和Apache gzip模块的问题。它只发生在服务器响应非常快的本地安装上。但是你的情况有所不同。

正如其他人已经建议的那样,绝对值得尝试WireShark。这并不难。至少你会知道哪一方有错误。

答案 8 :(得分:1)

也许请求通过的某个组件(Php,webserver,firewall,...)会因为使用带有GET参数的POST请求而感到困惑。如果遗漏?rand=...部分,它会改变什么吗?

答案 9 :(得分:1)

我还建议您通过Wireshark监控网络流量:

  1. 在服务器或客户端上启动它。
  2. 开始捕获您的网络接口。
  3. 使用AJAX和
  4. 当它失败时停止捕获并
  5. 在Wireshark中输入http以帮助您查找请求。
  6. 右键单击并选择“关注TCP流”。

如果请求中的POST数据没有显示,那么浏览器就是这样。您可以检查HTTP标头是否存在可能的错误(例如,之前已经提到过与IE结合的GZip)。

也许你的WAMP设置使用Fast-CGI或类似的方法来调用PHP,所以它没有使用Apache的实际PHP模块?如果设置不正确,有时可能会导致此类错误。如果您不一定需要它,我建议切换到PHP模块或查找可能的配置错误。

无论如何,它是什么WAMP?预配置还是自定义?

答案 10 :(得分:0)

如果您使用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 希望这有帮助。

答案 11 :(得分: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;
  }
相关问题