有时会加载旧的 PHP 会话变量
Old PHP session variable is loaded sometimes
我有一个页面,其中包含一些用户可选择的选项和一个按钮,单击该按钮时,将运行PHP脚本,然后使用另一个PHP文件刷新div,该文件使用在第一个PHP脚本结束时创建的会话变量。如果用户再次按下按钮,并选择了不同的选项,则使用新替换的会话变量更新div。问题是有时(可能是十分之一左右)加载旧的会话变量数据。我怀疑第二个 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')
})
})
问题是在某些情况下,在您单击加载第二个 PHP 脚本的按钮之前,第一个 PHP 脚本还没有完成运行(就像我之前在我的评论中暗示的那样)。发生这种情况的事实与Web服务器如何安排脚本有关(这完全是一个不同的主题)。
因此,您需要确保在单击运行第二个脚本的按钮时,第一个脚本已完全完成运行。
因为据我所知,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保证是单线程的吗?
可能是浏览器或代理服务器缓存 html 数据的情况吗?尝试设置标头以告诉它们不要缓存。请参阅 http://php.net/manual/en/function.header.php 中的示例,了解要设置的标头。
- PHP会话页面刷新不起作用
- 如何使用 php 会话变量作为 Angular Js 数据
- 通过Javascript更改PHP会话变量
- PHP会话ID变量与AJAX一起返回
- 从javascript变量获取php会话
- 无法获取php会话变量以在javascript中设置var
- 使用Jquery在页面加载上测试php会话变量
- 需要将一个值从javascript变量保存到php会话
- PHP会话在Aurelia中不起作用
- 更新图像切换上的php会话变量
- 如何设置从数据库到php会话的id点击链接
- php会话不会;单击“提交”按钮时无法处理表单
- 如何在Javascript中使用PHP会话变量
- 跨域php会话上传进度堆栈
- JQuery 变量到 PHP 会话
- 在 javascript 函数中添加 php 会话数据
- 将 JavaScript 变量传递给 PHP 会话
- 如何在javascript文件中访问php会话
- 从javascript中的不同形式获取值并存储在php会话中
- 有时会加载旧的 PHP 会话变量