您好我有下一个代码: 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功能,所以...
为什么wamp会像这样失败?
更新 我确定问题是wamp instalation没有正确发送POST一次,任何能够解决这个问题的帮助都会得到正确答案和赏金!
答案 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',
希望它有所帮助!
答案 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监控网络流量:
如果请求中的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;
}