我有一个注销脚本,当他点击注销链接时,该脚本设置为离线到连接到我的网站的用户的状态。我知道,如果用户什么都不做,一段时间后,用户就会断开连接。如何在会话到期时将状态设置为脱机?因为现在如果用户关闭网站的标签或直接关闭浏览器,数据库中的状态仍然保持在线,尽管它不是。
这里是logout.php脚本
<?php
include 'functions.php';
include 'db_connect.php';
sec_session_start();
$username=$_SESSION['username'];
$queryoffline="UPDATE User SET status='offline' WHERE username='$username';";
$ris_queryoffline=mysqli_query($conn,$queryoffline);
// Delete every session value.
$_SESSION = array();
// Gather session's parameters.
$params = session_get_cookie_params();
// Delete actual cookies.
setcookie(session_name(), '', time() - 42000, $params["path"], $params["domain"], $params["secure"], $params["httponly"]);
// Delete the session.
session_destroy();
header('Location: ./index.php');
?>
这是我的session_start函数,每次用户访问页面时都会生成会话
function sec_session_start() {
$session_name = 'sec_session_id'; // Session name
$secure = false; // True if using https
$httponly = true; // This makes not possible to a js to go inside the session id
ini_set('session.use_only_cookies', 1); // Force session to use cookies
$cookieParams = session_get_cookie_params(); // Read cookie's parameters
session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly);
session_name($session_name); // Set session name with the choosen
session_start(); // Avvia la sessione php.
session_regenerate_id(); // Regenerate the session and delete the old
}
答案 0 :(得分:4)
你可能不应该将状态保存为&#34;离线&#34;或者&#34;在线&#34;在您的数据库中,而不是用户最后一次做某事。
在sec_session_start()
内,添加如下内容:
mysqli_query("UPDATE User SET last_action=NOW() WHERE username='$username';");
完成后,您可以根据&#34;在线&#34;列出所有last_action > NOW() - [some_duration]
的用户。意味着在您的服务器上(通常是last_action > NOW() - one hour
)。