Php 会话过期时如何设置my db的脱机用户

Php 会话过期时如何设置my db的脱机用户,php,sql,logout,Php,Sql,Logout,我有一个注销脚本,当用户单击注销链接时,该脚本将脱机设置为连接到我的网站的用户的状态。我知道,一段时间后,如果用户什么也不做,用户就会断开他的连接。会话过期时,如何将状态设置为脱机?因为现在如果用户关闭网站的标签或直接关闭浏览器,数据库中的状态仍然保持在线,尽管它不是 下面是logout.php脚本 <?php include 'functions.php'; include 'db_connect.php'; sec_session_start(); $username=$_SESSI

我有一个注销脚本,当用户单击注销链接时,该脚本将脱机设置为连接到我的网站的用户的状态。我知道,一段时间后,如果用户什么也不做,用户就会断开他的连接。会话过期时,如何将状态设置为脱机?因为现在如果用户关闭网站的标签或直接关闭浏览器,数据库中的状态仍然保持在线,尽管它不是

下面是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');
?>

您可能不应该在数据库中将状态保存为“脱机”或“联机”,而是在用户上次做某事时保存

sec\u session\u start()
中,添加如下内容:

mysqli_query("UPDATE User SET last_action=NOW() WHERE username='$username';");

一旦你有了它,你就可以根据“在线”在你的服务器上的含义(通常是,
last\u action>NOW()-一个小时)列出所有拥有
last\u action>NOW()-[some\u duration]
)的用户。

你应该直接按会话检查过期时间,而不是按数据库检查过期时间。这正是我要做的。我只想在检查会话+1的有效到期后,在db中设置脱机状态。这个答案告诉我还有另一种本机清理方法,而不是“使用web套接字处理事件”。问题是,正如您所看到的,当我使用sec_session_start()时,我还没有用户的用户名。这只是一个会话\ u start(),其中没有用户的凭据。一旦在代码流中有用户名,您就应该将此更新放在其他地方。
mysqli_query("UPDATE User SET last_action=NOW() WHERE username='$username';");