底线前线:有没有办法从会话外运行的服务器上的脚本更新会话变量?
详细信息:我使用MySQL来存储大量用户信息。当用户登录时,我将一些信息存储在$ _SESSION中,作为缓存数据的方式,以减少SELECT查询的数量。用户使用数据,所做的任何更改都将保存到数据库中。
问题是当用户使用数据的$ _SESSION表示时,数据库上的数据可能会发生变化。在这种情况下,一组更改可能会覆盖另一组。在$ _SESSION中使用数据时,将数据“锁定”在数据库中是不可行的。
如果脚本对签出的数据进行更改,那么在“检出”数据时使用$ _SESSION标记标记数据库是相当简单的,然后更新数据的$ _SESSION表示。我只是不知道从会话外调用的服务器上的脚本调用什么(如果有的话)来改变该会话中的变量。
答案 0 :(得分:2)
收到您的评论后,我认为此解决方案适合您:
当你开始会话时,将会话ID保存在你的数据库中:即
<?php
session_start();
$sid = session_id(); // suppose o4lb6s392r2mj1vv6nhlrjfmp1
$_SESSION['user_solr'] = 'admin';
你会得到一个字符串。当您想要更改会话数据而不刷新用户页面加载时,请执行以下操作以更改用户的会话数据:
<?php
session_id('o4lb6s392r2mj1vv6nhlrjfmp1'); // previous session id
session_start();
$_SESSION['user_solr'] = 'editor';
<强>更新强> 这也有效:
<?php
session_start('o4lb6s392r2mj1vv6nhlrjfmp1'); // previous session id
$_SESSION['user_solr'] = 'editor';
答案 1 :(得分:1)
将会话存储在数据库中,并使用SQL触发器更新会话表。这样,当用户表被更改时,sql触发器也将更新会话表。
中阅读更多内容并查看一些示例答案 2 :(得分:0)
您可以做的是经常向服务器发出Ajax请求,检查会话变量是否已更新:
将$ _SESSION变量放在隐藏的输入中,并将其发送到服务器。
你的php / html
<form id='formid'>
<input type='hidden' name='name' value='<?php echo $_SESSION['name']; ?>'>
</form>
JS
window.setInterval($("#formid").submit());
$("#formid").submit(function(){
$.ajax({
type: "POST",
url: "someFileToUpdateTheSession.php",
data: $(this).serialize(),
success: function(){
// Do what you want to do when the session has been updated
}
});
return false;
});
其他php文件
<?php
session_start();
$_SESSION["name"] = $_POST["name"];
// etc.
?>
然后,您只需检查$ _SESSION变量是否已更改,如果是,则更新$ _SESSION变量。