有时会加载旧的PHP会话变量

时间:2012-06-25 03:09:34

标签: php javascript jquery

我有一个页面,其中包含一些用户可选选项和一个按钮,当单击该按钮时,它会运行PHP脚本,然后使用另一个PHP文件刷新div,该文件使用在第一个PHP脚本末尾创建的会话变量。如果用户再次按下该按钮,并选择了不同的选项,则使用新替换的会话变量更新div。问题是,有时,可能是10次左右,加载旧的会话变量数据。我怀疑第二个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')
   })
})

2 个答案:

答案 0 :(得分:1)

问题在于,在某些情况下,在您单击加载第二个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是单线程的,几乎在所有情况下都是如此:Is JavaScript guaranteed to be single-threaded?)。

希望这有帮助!

答案 1 :(得分:0)

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