【问题标题】:Updating PHP Session Variables When Database Changes数据库更改时更新 PHP 会话变量
【发布时间】:2014-03-30 10:05:54
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我假设您在用户登录时将用户数据存储在会话中,对吧?
  • 那么当你更新mysql数据的同时你也可以更新会话数据。有意义吗?
  • 是的,这正是我想要做的。我只是不知道如何从服务器而不是从用户加载的页面编辑特定会话中的变量。

标签: php mysql session


【解决方案1】:

收到您的评论后,我认为此解决方案对您有用:

当您开始会话时,将会话 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';

【讨论】:

    【解决方案2】:

    将您的会话存储在数据库中并使用 SQL 触发器更新会话表。这样当用户表改变时,sql触发器也会更新会话表。

    您可以在MySQL documentation 中阅读更多内容并查看一些示例

    【讨论】:

      【解决方案3】:

      您可以做的是每隔一段时间向服务器发出一个 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 变量。

      【讨论】:

      • 我想知道这是否违背了目的。如果我愿意,每次用户加载页面时,我总是可以从数据库中重新加载数据。我希望减少数据库查询。这不需要服务器根据数据库中的内容检查 $_SESSION 变量吗?
      • 我正在寻找一些东西,其中更新服务器上的数据库的脚本抓取了具有“签出”数据的会话的 sessionID(我不介意将其保存到数据库中,而用户已登录),然后在用户不知道的情况下更新这些会话变量(因为它们仍然存在于服务器上)。
      • 你也可以使用 Ajax 调用来做到这一点,第二个 PHP 文件是你启动任何东西的地方,这只是在后台检查用户 SESSION 与服务器的一个小策略。否则,我真的不知道你怎么能做到这样的事情,对不起。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2016-12-23
      • 1970-01-01
      相关资源
      最近更新 更多