我有一个页面,其中包含一些用户可选选项和一个按钮,当单击该按钮时,它会运行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')
})
})
答案 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中的示例,了解要设置的标头。