Вам необходимо передать javascript какой-то постоянный UID, который идентифицирует пользователя даже после истечения сеанса .
Для упрощения я использую user_name
, который уже существует в вашем коде. Но вы также можете назначить UUID для каждого пользователя, чтобы вы не могли угадать имя другого пользователя и не могли изменить его статистику.
Сначала вы передадите $_SESSION['user_name']
из PHP до закрытия JS.
let userName = "<?php echo $_SESSION['user_name']; ?>"; // don't forget to wrap the JS string value in quotes or apostrophes
Затем вы передадите его в полезную нагрузку AJAX запроса.
data: {
action: 'logout',
user_name: userName // added param
},
Наконец, вы перезапишите значение который отправляется в БД (если он отправлен с полезной нагрузкой)
$usname = !empty($_SESSION['user_name']) ? $_SESSION['user_name'] : ''; // original line
if (isset($_GET['user_name']) && !empty($_GET['user_name'])) {
$usname = $_GET['user_name'];
}
$stmt->bind_param('sss', $open, $write, $usname); // original line
Полный обновленный код:
<?php
if (isset($_GET['action']) && $_GET['action'] == "logout")
{
session_destroy(); // destroy session data in storage
!isset($_SESSION['pageadmin']);
$open = "false";
$write = "0";
$stmt = $connect->prepare("UPDATE trace_users SET open=?, write=? WHERE user_name=?");
$usname = !empty($_SESSION['user_name']) ? $_SESSION['user_name'] : '';
if (isset($_GET['user_name']) && !empty($_GET['user_name'])) {
$usname = $_GET['user_name'];
}
$stmt->bind_param('sss', $open, $write, $usname);
$stmt->execute();
}
?>
<script>
jQuery(document).ready(function($) {
let lastActivity = <?php echo time(); ?> ; // storing last activity of user
let now = <?php echo time(); ?> ;
let logoutAfter = 10;
let userName = "<?php echo $_SESSION['user_name']; ?>";
let timer = setInterval(function() {
now++;
let delta = now - lastActivity;
console.log(delta);
if (delta > logoutAfter) {
clearInterval(timer);
//DO AJAX REQUEST TO close.php
$.ajax({
url: "/abc/mno.php",
type: 'GET',
data: {
action: 'logout',
user_name: userName
}, // Line A
success: function(data) {
console.log(data); // Line B
},
error: function(jqXHR, textStatus, errorThrown) {
alert(textStatus);
}
});
}
}, 1000);
});
</script>
Несколько примечаний в конце:
- Это плохая практика - объединять PHP, HTML и JS в одном файле.
- Некоторые части вашего кода трудно воспроизводимы, и я должен был догадаться из контекста (например, я догадался, что сеанс уже установлен, используется jQuery, но нет
<script src="...jquery.js">
, есть запрос к БД, но нет отдельного импорта SQL, чтобы попробовать его быстро). Пожалуйста, прочитайте и примените знания из Как создать минимальный воспроизводимый пример в своем следующем вопросе, чтобы больше людей могли или хотят помочь вам с ним.