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

Php 这个ajax(原型)有什么问题?,php,javascript,ajax,prototypejs,Php,Javascript,Ajax,Prototypejs,你好,我有下一个代码: php方面: <?php print_r($_POST); print_r($_GET); die(); ?> 在我的html的某些部分: <a class="button" onclick="voteAjax('content','up','89');"> 另外10%的时间我得到: Array ( ) Array ( [rand] => 468905.44804602925 ) 现在,我什么都试过了,换了电脑,在一台有完整U

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

<?php
print_r($_POST);
print_r($_GET);
die();
?>
在我的html的某些部分:

<a class="button" onclick="voteAjax('content','up','89');">
另外10%的时间我得到:

Array
(
)

Array
(
    [rand] => 468905.44804602925
)
现在,我什么都试过了,换了电脑,在一台有完整URL的服务器上试过,我想可能是本地主机出了问题,在某个地方读到,使用instade of解决了问题,但两者都试过了,真的无法理解是什么会让帖子丢失。。。。有什么想法吗

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

我尝试了xampp,但它与我们的框架不兼容 我尝试使用Apache2.0而不是wamp中的2.2 我尝试了httpd.conf和php.ini的不同配置 你知道为什么wamp会这样失败吗

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

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

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

如果是POST请求,您不需要设置rand参数,POST不会被缓存,这可能会有所帮助

在没有看到更多详细代码的情况下,EDIT无法真正理解导致此问题的原因。我要做的是:

1尝试将对象传递给参数属性,如下所示:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}
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;
  }
而不是字符串:

parameters:'contentType='+typez+'&action='+actionz+'&id='+idz 
2为什么需要evalscript?为了进行测试,请将其拆下


3彻底调试,问题似乎在于Javascript发送的参数,所以使用Firebug的console.log进行更深入的调试。

如果是POST请求,您不需要设置rand参数,POST不会被缓存,这可能会有所帮助

在没有看到更多详细代码的情况下,EDIT无法真正理解导致此问题的原因。我要做的是:

1尝试将对象传递给参数属性,如下所示:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}
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;
  }
而不是字符串:

parameters:'contentType='+typez+'&action='+actionz+'&id='+idz 
2为什么需要evalscript?为了进行测试,请将其拆下


3调试到此为止,似乎问题在于使用Javascript发送的参数,因此使用Firebug的console.log进行更深入的调试。

尝试新日期,而不是随机:

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

尝试新日期,而不是随机日期:

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

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

如果改用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。 希望能有所帮助。

试试这个:

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',
你可以在这里看到它

希望它有帮助

试试这个:

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',
你可以在这里看到它


希望它有帮助

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

如果不是这样的话,我承认如果原型被破坏会很奇怪,那么请尝试通过PHP读取原始的post数据。PHP.ini中应该启用PHP。如果可以,但它们未填充到$\u POST集合中,请改为尝试$\u请求


此外,请尝试参考以下线程,可能这是您的情况:。

您是否尝试过其他版本的Prototype?在我看来,在构造post请求主体时存在一个奇怪的错误,它有效地创建了服务器无法正确解析的无效部分请求。使用Fiddler轻松掌握http嗅探器并查看发送到服务器的确切内容

如果不是这样的话,我承认如果原型被破坏会很奇怪,那么请尝试通过PHP读取原始的post数据。PHP.ini中应该启用PHP。如果可以,但它们未填充到$\u POST集合中,请改为尝试$\u请求


另外,请尝试参考以下线程,可能这是您的情况:。

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


+1至小提琴手和/或萤火虫。查看正在发送的原始标题可能会有所启发

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


+1至小提琴手和/或萤火虫。查看正在发送的原始标题可能会有所启发

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

不久前,我读到了关于IE和ApacheGZIP模块的问题。它只发生在服务器响应非常快的本地安装上。但是你的情况不同


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

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

不久前,我读到了关于IE和ApacheGZIP模块的问题。它只发生在服务器响应非常快的本地安装上。但是你的情况不同


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

可能是请求通过Php、Web服务器、防火墙等的某个组件。。。对使用带有GET参数的POST请求感到困惑。如果你省略了?rand=。。。部分?

可能是请求通过Php、Web服务器、防火墙等的某个组件。。。对使用带有GET参数的POST请求感到困惑。如果你省略了?rand=。。。部分?

这是一个很长的机会,但是没有更多的信息,也看不到更多的代码,我不得不问这个问题,这样你就可以排除它:这可能与用户双击链接并创建两个快速请求有关吗?有一次,我在运行onclick和提交表单时都被咬了一口

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

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


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

这是一个漫长的过程,但是没有更多的信息,也看不到更多的代码,我不得不问这个问题,这样你就可以排除它:这可能与用户双击链接并创建两个快速请求有关吗?有一次,我在运行onclick和提交表单时都被咬了一口

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

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


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

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

在服务器或客户端启动它。开始捕获网络接口。使用AJAX,当它失败时,停止捕获并在Wireshark中键入http以帮助您找到请求。右键单击并选择跟随TCP流。 如果请求中的POST数据未显示,则说明浏览器有问题。您可以检查HTTP头是否存在可能的错误,如之前提到的GZip与IE的结合

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


到底是什么鬼东西?预配置或自定义?

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

在服务器或客户端启动它。开始捕获网络接口。使用AJAX,当它失败时,停止捕获并在Wireshark中键入http以帮助您找到请求。右键单击并选择跟随TCP流。 如果请求中的POST数据未显示,则说明浏览器有问题。您可以检查HTTP头是否存在可能的错误,如之前提到的GZip与IE的结合

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


到底是什么鬼东西?预配置还是自定义?

我会这样做Ajax调用:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}
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;
  }
我会做Aj ax调用如下:

parameters: {
    contentType, typez,
    action: actionz,
    id: idz
}
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;
  }

我不认为WireShark可以监控环回数据,所以你可能需要从另一台计算机访问该站点才能正确测试。是的,我发现它似乎是一个整体新任务只是学习wireshack并获取我需要的数据。。。。无论如何,我会继续努力,无论哪种方式,能够有效地读取数据包转储都是一项很好的技能。尤其是AJAX开发,因为有一半的时间你看不到其他方面的情况。我认为WireShark无法监控环回数据,因此你可能需要从不同的计算机访问站点才能正确测试。是的,我发现学习WireShark并获取我需要的数据似乎是一项全新的任务。。。。无论如何,我会继续努力,无论哪种方式,能够有效地读取数据包转储都是一项很好的技能。尤其是AJAX开发,因为有一半的时间你看不到其他方面的情况。在FF、chrome、opera和ie中尝试过,都有相同的问题。。。谢天谢地,似乎所有显而易见的想法都已经提出了。我认为你现在必须提供更多的细节。例如,用网络流量转储证明哪一侧存在错误,然后显示PHP/MySQL配置或更多JS代码。在FF、chrome、opera和ie中尝试过,都有相同的问题。。。谢天谢地,似乎所有显而易见的想法都已经提出了。我认为你现在必须提供更多的细节。例如,用网络流量转储证明哪一侧存在错误,然后显示PHP/MySQL配置或更多JS代码。您是否尝试过使用普通HTML表单而不是Javascript直接发布?您尝试过以下哪些方法?如果您能提供这样的信息,这样我们就可以消除可能的问题,那就太好了。请注意,我已经安装了WAMP最新版本,并试图复制错误,但失败了。在大约100次点击之后,我从来没有收到过一次不好的回复。你有没有尝试过使用普通的HTML表单来直接发布,而不是使用Javascript?您尝试过以下哪些方法?如果您能提供这样的信息,这样我们就可以消除可能的问题,那就太好了。请注意,我已经安装了WAMP最新版本,并试图复制错误,但失败了。在大约100次点击后,我从未得到过一次不好的回复。