数据库更改时更新PHP会话变量

时间:2014-03-30 10:05:55

标签: php mysql session

底线前线:有没有办法从会话外运行的服务器上的脚本更新会话变量?

详细信息:我使用MySQL来存储大量用户信息。当用户登录时,我将一些信息存储在$ _SESSION中,作为缓存数据的方式,以减少SELECT查询的数量。用户使用数据,所做的任何更改都将保存到数据库中。

问题是当用户使用数据的$ _SESSION表示时,数据库上的数据可能会发生变化。在这种情况下,一组更改可能会覆盖另一组。在$ _SESSION中使用数据时,将数据“锁定”在数据库中是不可行的。

如果脚本对签出的数据进行更改,那么在“检出”数据时使用$ _SESSION标记标记数据库是相当简单的,然后更新数据的$ _SESSION表示。我只是不知道从会话外调用的服务器上的脚本调用什么(如果有的话)来改变该会话中的变量。

3 个答案:

答案 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触发器也将更新会话表。

您可以在MySQL documentation

中阅读更多内容并查看一些示例

答案 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变量。