Мне нужно уничтожить сеанс, когда пользователь уйдет с определенной страницы. Я использую session_destroy()
в конце страницы, но это не представляется возможным для меня, потому что у моей страницы есть разбиение на страницы. Моя страница: abc.php?page=1
или abc.php?page=2
или abc.php?page=3
.
Итак, мне нужно уничтожить сеанс, когда пользователь покидает страницу abc.php
. Как я могу это сделать без использования cookie?
Выполнение чего-то, когда пользователь переходит от страницы, является неправильным подходом, потому что вы не знаете, будет ли пользователь перемещаться на целую страницу (скажем, contact.php ради аргумента), или он / она просто перейдет к на следующей странице abc.php и, как указал Бореалид, вы не можете сделать это без JS. Вместо этого вы можете просто добавить чек и посмотреть, появляется ли пользователь от abc.php:
Во-первых, в вашем файле abc.php задается уникальная переменная в массиве $ _SESSION, которая будет действовать как знак, который был у пользователя на этой странице:
$_SESSION['previous'] = basename($_SERVER['PHP_SELF']);
Затем добавьте это на всех страницах перед любым выходом, чтобы проверить, идет ли пользователь от abc.php:
if (isset($_SESSION['previous'])) { if (basename($_SERVER['PHP_SELF']) != $_SESSION['previous']) { session_destroy(); ### or alternatively, you can use this for specific variables: ### unset($_SESSION['varname']); } }
Таким образом, вы уничтожите сеанс (или определенные переменные) только в том случае, если пользователь переходит из abc.php, а текущая страница – другая.
Надеюсь, я смог ясно объяснить это.
Чтобы запускать, когда пользователь действительно покидает страницу, вы должны использовать Javascript для отправки асинхронного запроса на сервер. Сервер не знает, что пользователь «оставил» страницу.
См. http://hideit.siteexperts.com/forums/viewConverse.asp?d_id=20684&Sort=0 .
У меня была аналогичная проблема, но у меня была перезагрузка страницы. Мне нужны переменные, которые я напечатал, чтобы их уничтожить. Именно для моего входа в мой класс веб-дизайна я возвращал сообщение об ошибке, если пользователь указал неверное имя пользователя или пароль. Я мог бы получить сообщение об ошибке, но если я нажму обновленную страницу, то ошибки там останутся. Я обнаружил, что просто установив переменную в нуль после ее печати, она убьет ее. Взгляните на то, что я сделал:
<p>To access my website please Login:</p> <form name='login' action="./PHP_html/PHP/login.php" method='post'> Username: <input type='text' name='username' /><div><?php print $_SESSION['baduser']; $_SESSION['baduser'] = "";?></div><br /> <div style="padding-left: 4px">Password: <input type='password' name='password' /><div><?php print $_SESSION['badpass']; $_SESSION['badpass'] = "";?></div></div> <input type='submit' value='Login' /> or you can <a href="./Terms.php">Register</a>
Я не знаю, помогает ли это вообще, но это сработало для меня.
Кроме того, спасибо всем вам, что сообщение на сайтах, подобных этому, чтобы помочь тем из нас, кто все еще учится.
Для конкретной страницы вам нужно уничтожить сеанс, затем отключите всю переменную сеанса, используя
unset($_SESSION['varname']);
Для всего сайта вы можете использовать session_destroy();
Я решаю проблему. Сначала возьмем текущий url, затем chk на странице пребывания на текущей странице url.if не находится в текущем URL-адресе, а затем уничтожьте сеанс.
$url = "http" . ((!empty($_SERVER['HTTPS'])) ? "s" : "") . "://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; $page_name="abc.php"; if (!preg_match("/$page_name/",$url)) { session_destroy(); }
Но этот код следует использовать на других страницах. Потому что http – это процессы без состояния, поэтому вы не можете найти, когда пользователь покидает страницу.
Вы не можете сказать, когда пользователь переходит от страницы, это просто невозможно в любой надежной манере.
Лучшее, что вы можете сделать, это использовать то, как работают cookie. При запуске сеанса вы отправляете cookie клиенту, который идентифицирует клиента при каждом последующем посещении, и, следовательно, активирует связанный сеанс. Клиент должен отправить эту идентификацию при последующих посещениях, и клиент должен «забыть» его идентификацию.
Вы можете поручить клиенту отправлять cookie только на определенные страницы, и вы можете поручить ему забыть cookie при закрытии браузера (при жизни 0). Это можно установить с помощью session_set_cookie_params
.
Помимо этого, вы можете просто игнорировать параметры сеанса на страницах, где они не имеют значения. Вы можете удалить сеанс (или определенные его значения) после некоторого времени бездействия, когда вы предполагаете, что клиент ушел.
Borealid заслуживает внимания, указывая на самое изящное решение.
Более решение kludgey состоит в том, чтобы сохранить iframe на странице, которая указана на другую страницу «монитора», которая настроена на обновление каждые несколько секунд. Это можно сделать без использования JavaScript:
<meta http-equiv="refresh" content="10">
Это обновляет страницу монитора каждые 10 секунд. Когда это произойдет, страница монитора может записать время (перезапись ранее записанного времени) и идентификатор сеанса на сервере где-нибудь (DB или файл).
Затем вам нужно будет создать cronjob, который проверяет файл / БД для любых сеансов более 10-12 секунд и удаляет их вручную. Данные сеанса обычно хранятся в каталоге (заданном вашей конфигурацией PHP) в файле с именем sess_the-session-ID
. Вы можете использовать функцию PHP, например:
function delete_session($sessId) { $sessionPath = session_save_path(); // you'll want to change the directory separator if it's a windows server $sessFile = "$sessionPath/sess_$sessId"; if (file_exists($sessFile) && unlink($sessFile)) return true; return false; }