两个快速的AJAX调用混淆了PHP

时间:2009-09-29 08:20:29

标签: php ajax

我只是遇到了一些奇怪的事情。我有两个JSON数组,它们包含不同的数据。通常我只需要其中一个数据,但是当我尝试进行双ajax调用以从两个数组中获取数据时,我最终得到两个调用的完全相同的数据。

假设数组1保存用户的JSON数据,数组2保存住宅的JSON数据,我想从两个数组中获取数据:( PS!我将urltype切换为保存几行。)

$.ajax({
   async:false,
   data:"type=users&id=3,5,6",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //will alert 3 as expected
   }
});

然后我再打电话给那里买些房子:

$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
   }
});

当我查看params并使用Firebug进行响应时,我可以看到params是正确的,但响应是错误的。

在我的PHP中,我甚至试图回应一下这样做:

echo $_GET['id'] . ", " . $_GET['type'];

这使得请求在两个调用中看起来完全相同...如果我在ajax调用之间放置一个警报,我得到预期的结果(因为系统等待)。但是我认为将它们放在同步状态就足以不会使调用崩溃..?

编辑:我已经尝试创建一个在AJAX函数中调用的php文件的副本,并设置调用以转到单独的文件,这使得一切都按预期工作。所以我很确定javascript没什么问题。

更多编辑:如果我从第二次AJAX调用中删除参数,我仍然会得到相同的结果。用Firebug查看请求我可以看到params列表是空的,但响应仍然相同......

更多编辑:在Firebug中查看,我可以看到有一个名为connection的标头,其值为keep-alive,然后是一个名为{{的标头1}},其值为Keep-Alive。我猜这可能与它有关?在jQuery文档中找不到任何内容,但是......

源代码:我做了一个小测试用例,它重现了这个问题:

PHP

300

HTML

echo $_GET['test'];
die();

这就是我所拥有的,并且它做了同样的事情:我得到<sript> $(document).ready(function() { $.ajax({ type:"get", url:"bugtest.php", data="test=hello", success: function(data) { $("output").append(data); } }); $.ajax({ type:"get", url:"bugtest.php", data="test=world!", success: function(data) { $("output").append(" "+data); } }); }); </script> <h1>AJAX bug in Aptana's PHP server?</h1> <output></output> ......而不是像我期望的那样获得hello world! ...

8 个答案:

答案 0 :(得分:6)

首先,同步AJAX调用在实时系统上基本上是不好的。测试还可以,但不要在家里这样做,孩子们!为什么?因为如果服务器没有在一秒内回答或根本没回答(这很可能),浏览器选项卡将变为无响应。在最糟糕的情况下(旧的Mozillas),整个浏览器都会冻结。

</teaching>

  • 缓存不应该是问题,因为当您发送GET请求时,URL是不同的(POST很可能根本不缓存)。

  • 您的alert()测试告诉您,这不是PHP的错,因为它会按要求发回所有内容

  • 所以我们继续使用JavaScript:

    • 如果您手写代码,我猜,您对请求的onreadystate执行了错误的检查(即,处理请求的数据检查的函数)错误的请求对象)

    • 您能告诉我们,您使用哪个库?看起来像我的原型。

干杯,

答案 1 :(得分:5)

您是否尝试将时间戳添加到网址?只是为了避免缓存等

 data:"type=houses&id=2,4&"+timestamp

更新:

或者只是在Ajax中尝试cache:false

您使用async:false

Async: 

默认情况下,所有请求都是异步发送的(默认设置为true)。如果需要同步请求,请将此选项设置为false。请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。

可能是因为这个临时阻止..你可以尝试将其设置为true。

答案 2 :(得分:2)

尝试使用POST。

此外,如果PHP实际上不应该收到2个相同的请求,那么这不是PHP的错;该错误位于您进行$ .ajax调用的位置和Web服务器将请求传递给PHP的位置之间。

您能否提供有关网络服务器的更多信息?你用哪一个?你有什么捕获或优化吗?也许你使用一些PHP框架或PHP“bootstrap”来缓存请求?

您也可以尝试进行独立测试。剥离Ajax代码并使用最小的PHP脚本,它只是回应请求。看看你是否得到了同样的错误。

发送的请求和在php中收到的请求的一些复制粘贴数据会很好。


我从来没有见过这样的东西,我几乎可以肯定它是相关的。作为一种解决方法,您可以将两个请求合并为一个,您将不得不稍微更改PHP脚本。它实际上可能是一个更好的解决方案,因为您应该尽可能少地向服务器发出请求。

答案 3 :(得分:2)

为了确定PHP或JS是否存在问题,您可以使用Charles来监控您的请求(我相信查尔斯不仅仅是萤火虫,不知道为什么)并生成一个独特的值服务器

<?php echo uniqid();

如果两个请求都返回相同的值,那么您的服务器就会出现问题,否则就是浏览器或jscode。

答案 4 :(得分:0)

尝试将第二个请求置于等待0秒的超时中。

$.ajax({
   async:false,
   data:"type=users&id=3,5,6",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //will alert 3 as expected
   }
});

setTimeout(function(){$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
   }
})}, 0);

答案 5 :(得分:0)

是否有可能,数据变量存在问题?

如果您将第二个请求更改为:

,会发生什么
$.ajax({
   async:false,
   data:"type=houses&id=2,4",
   success: function(dataHouse) {
      data = JSON.parse(dataHouse);
      alert(dataHouse.length)
   }
});

答案 6 :(得分:0)

将下一个ajax调用放在第一个ajax调用的响应中:

function nextAjaxCall(){
  $.ajax({
    async:false,
    data:"type=houses&id=2,4",
    success: function(data) {
      data = JSON.parse(data);
      alert(data.length) //alerts 3 as well...
    }
  });
}
$.ajax({
  async:false,
  data:"type=users&id=3,5,6",
  success: function(data) {
    data = JSON.parse(data);
    alert(data.length) //will alert 3 as expected
    nextAjaxCall();
  }
  error: function(){
    //error handling
    nextAjaxCall();
  }
});

确保即使第一个ajax没有成功返回,也要调用第二个ajax。

答案 7 :(得分:0)

尝试在jQuery ajax()选项中设置global:false。

如果这没有帮助,请尝试调用两个不同的PHP页面 - 一个用于房屋,一个用于用户。如果可行的话,它至少应该有助于缩小问题范围。