gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 10:11:53 24 4
gpt4 key购买 nike

我有一个 php 代码,如下所示,当没有事件时, session 超时发生在 60 分钟后。以下代码在文件 中/mno.php .我的 登录和注销代码 e 也在同一个文件中 /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 在代码中跟踪所有登录的用户。在该表中,有两列 用户名打开 .该值设置为 真/假当任何用户 登录/注销 .

我已经包含了 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 分钟没有事件时,它应该更新列 打开 (在表 trace_users 中)针对该特定用户。

enter image description here

编辑 1:

我的登录代码和 session 历史代码在同一个文件中 /mno.php .我把所有东西都放在同一个文件中 /mno.php .

最佳答案

我想你意识到这段代码

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 3600)) {
//...
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

在每个请求和 上运行仅当请求到达时

想象一下,我访问了您的网站,然后出去购物并保持浏览器打开。你认为会发生什么?
什么都没有 - 因为不会有新的请求发送给你(假设你没有实现任何定期的 ajax 轮询/Websocket 机制)

所以服务器不会打扰我,直到我购物回来刷新页面,然后服务器才会意识到“嗯..这家伙的 LAST_ACTIVITY 已经超过一个小时了,让我更新我的 trace_users 表并将打开设置为 false 给他”

来到您提出的解决方案,它看起来不错并且避免了 websockets/周期性 ajax 请求的复杂性

只需要一些小的修正,按照这里的基本演示
<script>

var lastActivity = <?php echo ($_SESSION['LAST_ACTIVITY']); ?>; //the timestamp of latest page refresh or navigation
//This will remain constant as long as page stays put
var now = <?php echo time() ?>; //This takes inital value (technically same as LAST_ACTIVITY) from server
// but later on it will be incremented by javascript to act as counter
var logoutAfter = 5; //I set 5 sec for demo purposes

var timer = setInterval(function() {
now++;
let delta = now - lastActivity;
if ( delta > logoutAfter) {
alert('you are logged out');
clearInterval(timer);
//DO AJAX REQUEST TO close.php
}
}, 1000);

</script>

这里 lastActivity将保存服务器将页面发送到浏览器时的时间戳,浏览器上的脚本永远不会更改它, now是您的计数器,您将使用它来跟踪自页面加载到浏览器以来耗时,您将每秒增加一次并检查是否超过了给定的时间

如果为 true,则执行 ajax 请求(或简单地重定向到 logout.php),您将在其中销毁 session 并更新 trace_users将用户标记为已关闭的表

更新

所以ajax会像
$.ajax({      
url: "/close.php",
type: 'POST', // GET also fine
data: { },
success: function(data) {
window.location.href= '/mmo.php';
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus);
}
});



close.php


<?php
session_start();
$logoutAfter = 5; //5 sec timeout for testing purposes

// I'm not sure whether the below if condition check is required here or not
// because we have already checked (whether to timeout or not ) in our javascript
// and we call close.php only when it's affirmative
// I encourage you to test and find out :)

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > $logoutAfter)) {
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'); //<-- no need of it when url hit by ajax
exit();
}
else //<-- note the else
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com