Этот код необходимо обновить или щелкнуть по странице, прежде чем он перейдет на страницу индекса, и до того, как он обновит базу данных после истечения срока действия сеанса.
Как я могу сделать это автоматически, что после истечения срока действия сессии он обновит базу данных, чтобы пользователь был активным, без обновления или щелчка на странице?
$idletime = 3600; //after 1hr the user gets logged out if (time() - $_SESSION['timestamp'] >= $idletime){ $online = "UPDATE users SET active = 0 WHERE username = '".$_SESSION['username']."'"; mysqli_query($con, $online); session_destroy(); header("Location:index.php"); } else { $_SESSION['timestamp'] = time(); }
Я бы предложил использовать другой подход. Вы не должны обновлять поле «active» в базе данных. В противном случае вы создаете поле «lastActivity» в БД и обновляете его каждый раз, когда пользователь делает что-то на сайте.
В этом случае вы можете легко обнаружить, какие пользователи неактивны, запросив базу данных следующим образом:
SELECT * FROM users WHERE lastActivity < TIMESTAMP(CURRENT_TIMESTAMP() - INTERVAL 1 HOUR);
Ваш PHP-код будет выглядеть так:
$online = "UPDATE users SET lastActive = NOW() WHERE username = '".$_SESSION['username']."'"; mysqli_query($con, $online);
Лучший вариант – не использовать активный / неактивный флаг в базе данных, а скорее использовать что-то вроде last_active
timestamp. Когда пользователь обращается к странице, обновите метку времени до CURRENT_TIMESTAMP()
. И чтобы определить, активен ли пользователь в настоящий момент, запрос WHERE active_timestamp < TIMESTAMPADD(MINUTE, -60, CURRENT_TIMESTAMP())
Убедитесь, что вы устанавливаете active_timestamp
как тип DATETIME
в структуре таблицы. (Пользователи ALTER TABLE users ADD COLUMN active_timestamp datetime AFTER username'
)
Проблема здесь в том, что ваш скрипт хочет выгнать пользователя, когда сеанс простаивает. Для этого вы должны посмотреть JavaScript, установить таймер, который отсчитывает более 1 часа, а если нет активности, перенаправляйте страницу.