代码之家  ›  专栏  ›  技术社区  ›  DFectuoso

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

  •  1
  • DFectuoso  · 技术社区  · 16 年前

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

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

    Array
    (
    )
    
    Array
    (
        [rand] => 468905.44804602925
    )
    

    现在,我已经尝试了一切,换了电脑,在一个有完整url的服务器上进行了尝试(认为本地主机可能是问题所在),阅读了一些使用 http://localhost/reporeade/Vote/Ajax/?rand= http://localhost/reporeade/Vote/Ajax?rand= 解决了问题,但尝试了两者,真的无法理解什么会使帖子丢失。。。。有什么想法吗?

    在玩了所有这些之后,我让它在我们的生产服务器上工作(就像现在一样),但是在我们所有的wamp安装中它都不会工作(我们会有50%的时间失败)。解决这个问题对我来说非常重要,这样我们就可以继续开发产品的所有ajax功能,所以。。。

    • 我尝试使用Apache2.0而不是wamp中的2.2
    • 我尝试了httpd.conf和php.ini的不同配置

    我敢肯定问题是wamp安装有时无法正确发送帖子,任何有助于解决这一问题的帮助都会得到正确的答案和赏金!

    12 回复  |  直到 13 年前
        1
  •  2
  •   Spencer Ruport    16 年前

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

        2
  •  2
  •   aprilchild    16 年前

    你试过原型的另一个版本吗?在我看来,在构造post请求主体时存在一个奇怪的错误,它有效地创建了服务器无法正确解析的无效(部分)请求。使用Fiddler(易于掌握的http嗅探器)查看发送到服务器的确切内容。

    $_POST 收藏,试试看 $_REQUEST 相反

    http://bugs.php.net/bug.php?id=41349 .

        3
  •  2
  •   some    16 年前

    这是一个漫长的过程,但是没有更多的信息和看到更多的代码,我不得不问这个问题,这样你就可以排除它:这可能与用户双击链接并创建两个快速请求有关吗?

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

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

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

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

        4
  •  1
  •   Diodeus - James MacFarlane    16 年前

    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
  •   KnF    16 年前

    试试这个:

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

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

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

    http://www.prototypejs.org/api/ajax/options

    希望它有帮助!

        6
  •  1
  •   Derek Kurth    16 年前

    我也在运行wampserver,所以我只是尝试了你的代码,但我无法重现这个问题——我总是得到POST值。我安装的是Apache2.2.8和PHP5.2.6,我刚刚获得了最新的prototype.js。我的wampserver配置几乎是默认配置。

        7
  •  1
  •   Greg Dan    16 年前

    你用的是什么浏览器?这在使用FF和IE时失败?或者只有一个浏览器。

    正如其他人已经建议的那样,绝对值得尝试WireShark。没那么难。至少你会知道哪一边有个bug。

        8
  •  1
  •   Luca Matteis    16 年前

    如果是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() 要更深入地调试这个。

        9
  •  1
  •   sth    16 年前

    可能请求通过的某些组件(Php、Web服务器、防火墙等)会因为使用带有GET参数的POST请求而感到困惑。如果你省略了这个选项,会有什么变化吗 ?rand=... 部分

        10
  •  1
  •   Energiequant    16 年前

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

    1. 开始捕获您的网络接口。
    2. 使用AJAX和
    3. 当它失败时,停止捕获并
    4. 在Wireshark中键入http以帮助您查找请求。
    5. 右键单击并选择“跟随TCP流”。

    如果请求中的POST数据未显示,则说明浏览器有问题。您可以检查HTTP头是否存在可能的错误(如之前提到的GZip与IE的结合)。

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

        11
  •  0
  •   Leonel Martins    16 年前

    如果使用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; 
    }
    


    希望这有帮助。

        12
  •  0
  •   Mark Biek    16 年前

    我会这样做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;
      }