javascript - 在php中更新 session 超时的数据库表

标签 javascript php sql ajax session-timeout

我有一个如下所示的 php 代码,其中当没有事件时, session 超时会在 60 分钟后发生。以下代码位于文件 /mno.php 内。我的登录和注销代码也位于同一个文件/mno.php中。

/mno.php

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
    session_destroy();   // destroy session data in storage
    !isset($_SESSION['pageadmin']);

    /* Update Table (START) */
    $open="false";
    $stmt= $connect->prepare("UPDATE trace_users SET open=? WHERE user_name=?");
    $stmt->bind_param('ss', $open, $_SESSION['user_name']);
    $stmt->execute();
    /* Update Table (END) */

    header('location: /mmo.php');
    exit();
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp 

代码中的表trace_users跟踪所有登录的用户。在该表中,有两列 user_nameopen。当任何用户登录/注销时,该值设置为true/false

我已经包含了 sql 查询,其中我尝试在没有事件时更新表,但不幸的是该特定用户的列值没有设置为 false 当 60 分钟内没有任何事件发生时。

这是我尝试过的:

经过一些研究,我想我必须运行一个计时器(js/ajax)。在下面显示的 JavaScript 中,我计算了上次事件当前时间之间的差异。 如果超过 60 分钟,则会更新数据库表。这是我尝试过的,但我相信需要做更多工作才能更新数据库中的表。

<script>
let x = setInterval(function() {

    let lastActivity = <?php echo ($_SESSION['LAST_ACTIVITY']); ?>
    let now = <?php echo time() ?>;
    let difference = now - lastActivity;

    if (difference > 3600) {
        clearInterval(x);
    }
}, 1000
);
</script>   

问题陈述:

我想知道我应该在上面的 js(或 php)代码中进行哪些更改,以便当 60 分钟没有事件时,它应该将列 open 更新为 false (在表 trace_users 中)该特定用户。

enter image description here

编辑1:

我的登录代码和 session 历史记录代码位于同一个文件/mno.php中。我已将所有内容放在同一个文件 /mno.php 中。

最佳答案

我认为 Vineys 和 jo0gbe4bstjbs 的答案是错误的,因为当用户关闭浏览器直到 5 秒时,它也无法在 60 分钟后更新表格和 session 。 session 在 php.ini 配置文件中设置的时间后立即删除。 您介意每 5 秒请求一次吗?这是解决这个问题的好方法吗?这对于性能来说是最差的。 如果你想专业地解决这个问题,你应该添加“last_request”列并从表中删除“open”列,并且在每次请求之后你应该将last_requests值更新为当前的unix时间戳。在获取用户的地方你应该写:

$time = time() - 3600;

"SELECT * FROM `users` WHERE last_request > $time" //active users
"SELECT * FROM `users` WHERE last_request <= $time" //inactive users

而不是每 5 秒 ajax 请求一次,你应该编写 setTimeout ,延迟时间为 3600 秒,运行 window.location.href= '/mmo.php';代码。 如果您想要获得最佳性能并在 60 分钟注销后获得准确结果,那么这是很好的选择

关于javascript - 在php中更新 session 超时的数据库表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61298432/

相关文章:

javascript - 键盘事件.code

PHP CodeIgniter 404 部署

mysql - DATABASENAME..TABLENAME 的 MYSQL 等价物是什么?

sql - postgresql 分组和排序

javascript - 为什么 selectivizr.js 在 IE8 中导致 "white screen of death"?

javascript - 使用 JavaScript 计算表中每个输入的总计

javascript - 滚动到 div 时 JS 计数器停止计数

php - nl2br 无法与 BBCode 一起使用

php - 使用 MSSQL 的 PDO 返回无效游标

sql - 如何从 PostGIS 中的 MultiLineString 获取第 N 个 LineString?