0

我有一个页面,其中包含一些用户可选择的选项和一个按钮,单击该按钮会运行 PHP 脚本,然后使用另一个 PHP 文件刷新 div,该文件使用在第一个 PHP 脚本末尾创建的会话变量。如果用户再次按下按钮,选择了不同的选项,则使用新替换的会话变量更新 div。问题是,有时,可能 10 次左右,有 1 次会加载旧的会话变量数据。我怀疑第二个 PHP 文件在更新之前太早地捕获了该变量,但我尝试在各个点取消设置会话变量,但没有任何运气。

第一个 PHP 文件:

session_start();
$needle = array();
foreach($_POST['checkboxes'] as $key => $value){
$needle[] = "$value";
}
// code that processes the values from needle and outputs $data
unset($_SESSION['data']);
$_SESSION['data']=$data;

第二个 PHP 文件:

session_start();
echo $_SESSION['data'];

Javascript:

$(".userdata").click(function() {
   $.post("first.php", $("form#checkboxes").serialize());
});
$(function() {
   $("#button").click(function() {
   $("#div").load('second.php')
   })
})
4

2 回答 2

0

问题是,在某些情况下,在您单击加载第二个 PHP 脚本的按钮之前,第一个 PHP 脚本尚未完成运行(就像我之前在评论中暗示的那样)。发生这种情况的事实与网络服务器如何调度脚本有关(这完全是一个不同的主题)。

因此,您需要确保当您单击运行第二个脚本的按钮时,第一个脚本已完全运行完毕。

因为据我所知,javascript 不允许对变量进行阻塞/发送信号(就像 Java 一样),您将不得不使用一种更“脏”的技术,称为忙等待。

最好的方法是在您使用的 javascript 中包含一个额外的变量。

var wait = false;
function reloadSecond (){
  if (wait){
    setTimeout('reloadSecond()',200);
  } else {
    $("#div").load('second.php');
  }  
}

$(".userdata").click(function() {
   wait = true;
   $.post("first.php", $("form#checkboxes").serialize(), function(){
     wait = false;
   });

});
$(function() {
   $("#button").click(reloadSecond);
})

虽然“忙等待”通常不被认为是最优雅的解决方案,但我认为在这种情况下您没有很多其他选择(除了服务器端推送,这要复杂得多)。此外,您可能只会导致额外的 200 毫秒(或更短,您当然可以更改此值)等待时间一次或两次。

(旁注:我假设 javascript 在这里是单线程的,这在几乎所有情况下都是正确的:JavaScript 是否保证是单线程的?)。

于 2012-06-25T04:30:31.217 回答
0

可能是浏览器或代理服务器正在缓存 html 数据的情况吗?尝试设置标题以告诉他们不要缓存。有关要设置的标头,请参阅http://php.net/manual/en/function.header.php中的示例。

于 2012-06-25T04:32:47.160 回答