我的站点要求用户登录,之后用户的ID将存储在会话中。 数据库有一个名为"logged_in"的字段,登录时值为 1,注销时更改为 0。 问题是,如果用户只是关闭浏览器,则值保持为 1。
我知道我可以检查服务器上是否存在会话,但我可以检查是否存在具有特定值的会话吗? 我想文字代码将是
if(!isset($_SESSION['user_id'] == 41)){
// do stuff because session with value 41 doesn't exist
}
不要使用数据库来跟踪用户的登录状态。看看$_SESSION
数组。
会话将根据您在 php.ini
中设置的超时值超时。
有用的链接:
- session_start:http://de2.php.net/manual/en/function.session-start.php
- session_destroy:http://de2.php.net/manual/en/function.session-destroy.php
- 会话超时:如何在 30 分钟后使 PHP 会话过期?
会话对于每个用户都是唯一的 - 因此即使同时处理 5000 万用户,也不会发生任何冲突。
想象一个$_SESSION
是一个对某个用户唯一的数组。(实际上仅此而已,如果用户发送正确的会话cookie,服务器将注意提供正确的数组 - 这反过来又不是你(或用户(需要注意的 - 他的浏览器会做!
简而言之:通过比较 id,让您不必处理多个会话。如果正确启动,阵列$_SESSION
将始终是与当前用户关联的数组。
您的服务器将始终返回一个 Session-Array
,访问$_SESSION
- 与用户相关联的执行请求的那个。
创建一个简单的"脚本",如下所示:
<?php
SESSION_START();
if (!isset($_SESSION["start_time"])){
echo "Session started at: ";
$_SESSION["start_time"] = date("Y-m-d H:i:s");
}else{
echo "Session already existing. Started at: ";
}
echo $_SESSION["start_time"];
?>
从 2 个不同的浏览器访问该页面。
- 首次访问时,您将收到
Session started at
消息。 - 第二次访问将使用已存储的 DateTime 传递
session already existing
消息,直到您调用session_destroy()
- 或会话超时。 - 您可以刷新页面 10.000 次 - 只要会话有效并且您使用相同的浏览器(:P自动传输会话 cookie(,时间戳就不会再更改。
- 您无需提供任何
user_id
即可完成此操作。您的服务器将(静默地(为您提供正确的$_SESSION
-Array。只需编写您的网站,就好像它针对一个用户一样,同时将用户敏感值存储在$_SESSION
-Array 而不是$someOther
-Array 中。
您要检查会话是否已设置,如果是,请检查它是否与值匹配:
<?php
if(!isset($_SESSION['user_id'])
|| (isset($_SESSION['user_id']) && $_SESSION['user_id'] != 41)) {
//session is not set, or value differs from 41
}
?>
如果你的数据库中确实需要有关登录状态的信息,我建议你存储上次登录的时间戳,也许是他们上次处于活动状态的时间,你可以推断他们被"注销"如果会话超时自上次活动时间以来已经过去了。