如何在PHP中更新用户会话?

如何在PHP中更新用户会话?,php,Php,当用户登录到我的网站时,我会获取他们的所有用户信息,并将其存储在名为user\u info的会话中。这样,我就不必连续地进行数据库查找来获取几乎每个页面上都需要的关于用户的公共信息。当var转储时,用户信息会话如下所示: array(17) { ["user_id"]=> string(7) "1165771" ["username"]=> string(2) "Jake" ["who"]=> string(1) "1" ["seeking"]=&g

当用户登录到我的网站时,我会获取他们的所有用户信息,并将其存储在名为
user\u info
的会话中。这样,我就不必连续地进行数据库查找来获取几乎每个页面上都需要的关于用户的公共信息。当var转储时,用户信息会话如下所示:

array(17) {
  ["user_id"]=>
  string(7) "1165771"
  ["username"]=>
  string(2) "Jake"
  ["who"]=>
  string(1) "1"
  ["seeking"]=>
  string(1) "2"
  ["orientation"]=>
  string(1) "1"
  ["dob"]=>
  string(10) "1985-07-08"
  ["zip"]=>
  string(5) "25140"
  ["email"]=>
  string(17) "foo@bar.com"
  ["account_status"]=>
  string(1) "1"
  ["role"]=>
  string(1) "1"
  ["paused"]=>
  string(1) "0"
  ["latitude"]=>
  string(11) "37.89955100"
  ["longitude"]=>
  string(12) "-81.52641100"
  ["region"]=>
  string(2) "WV"
  ["city"]=>
  string(5) "NAOMA"
  ["avatar"]=>
  string(21) "1165771_50c6816a8fad1"
  ["email_setting"]=>
  string(1) "1"
}
现在有一个“帐户设置”页面,用户可以在其中更新一些信息。因此,如果他们更改用户名,例如,我这样做是为了更新他们的会话,使其现在包含新值:

$_SESSION['user_info']['username'] = 'NEW VALUE';
现在问题来了。如果我在管理面板中进行调节时决定禁止用户,那么他们的帐户状态将在数据库中从1(表示活动)更新为2(表示禁止)。但是,要在他们的用户信息会话中反映此更改,我不能这样做:

$_SESSION['user_info']['account_status'] = 2;
因为它只会在我的计算机上更新我的用户信息,而不是用户在他/她的计算机上的会话。他们将能够继续使用该网站,即使他们在技术上被禁止,直到他们注销并尝试重新登录

然后将阻止它们进入,因为要使登录SQL查询返回true,除了获得正确的凭据外,用户还必须具有帐户状态1

问题
  • 当我创建会话时,如何更新单个用户的会话 更改他们的帐户

  • 如何从服务器中完全删除用户的会话,以便他们立即注销


  • 如果您需要此更改立即生效,那么据我所知,您必须检查每个页面上的用户状态,如果该用户被禁止,请采取适当的措施

    建议更改文件作为替代方案,但即使是作者也不建议这样做

    就我个人而言,我只需要切换到数据库会话——在代码开始时轮询数据库一次,以将所有用户数据放入一个变量中

    这样,如果在页面更改过程中管理员权限发生更改,用户将立即拥有新的访问级别


    然后,您还可以从数据库中“删除”会话,以强制用户注销。

    只需在每次页面加载时添加会话检查。例如,有一个db表,您可以在其中临时写入活动会话。如果用户重新加载并且表中没有这样的条目,他必须再次登录并重写会话。如果他注销或你有3个踢出他,你只需删除或修改条目。这也可以成为一个经典的工具-目前无论用户在sit3 ecc上是什么…

    另一种解决方案(而不是直接断开连接)是向会话添加时间戳,并每xx分钟刷新一次(如果会话数据早于xx分钟,则执行db查询)

    这样,被阻止的用户不会立即被驱逐,但您可以控制时间并减少数据库查询的数量(每xx分钟而不是每一个请求)


    但是,我首先要检查对用户数据库的查询是否真的有那么大的影响。

    您将会话“存储”在哪里?在用户cookie中,或在您的数据库中?@TheShift Exchange不是在数据库中。我认为会话是作为tmp文件在服务器上创建的,并且只通过cookie链接到用户。但它们仍然存储在服务器端。因此,我认为我可以控制它们,并可以删除或修改它们。@JakeRow123没错,默认情况下,PHP会话作为文件存储在服务器上。但问题是,您不知道要编辑itI的用户的sessionID。然后,我会在每个页面上进行检查。另一种方法是只在用户可能造成伤害的页面上进行检查。例如,在他们发表评论之前进行检查。
    How can I update the session of an individual user when I make a change to their account.
    
    How I can delete a user's session completely from my server so they are immediately logged out.