Php 这个ajax(原型)有什么问题?
你好,我有下一个代码: php方面: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
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次点击后,我从未得到过一次不好的回复。