Я получаю сообщение об ошибке, используя session_destroy () в моем PHP-коде.
Следующий скрипт находится на каждой странице, и если пользователь зарегистрирован, он проверяет, является ли сеанс действительным или нет, убивая сессию, если это не так.
session_start(); // check for users already signed in and check session if (isset($_SESSION['user_id'])) { $uid = $_SESSION['user_id']; // check user_id is a valid id if (!is_numeric($uid) || $uid < 0) { session_unset(); session_destroy(); session_regenerate_id(true); } // if user agent is different, kill session if ($_SESSION['user_agent'] != $_SERVER['HTTP_USER_AGENT']) { session_unset(); session_destroy(); session_regenerate_id(true); } // if user's last login record fails to match session_id, kill session $SQL = "SELECT user_session FROM users_logins "; $SQL .= "WHERE user_id = :user_id "; $SQL .= "ORDER BY time_in DESC LIMIT 1;"; $STH = $DBH_P->prepare($SQL); $STH->bindParam(':user_id', $uid); $STH->execute(); $row = $STH->fetch(); if ($STH->rowCount() > 0) { $db_sid = $row['user_session']; } if ($db_sid !== session_id()) { session_unset(); session_destroy(); session_regenerate_id(true); } }
Ошибка, которую я получаю, указывает, что сбой происходит из последнего вызова session_destroy()
.
Я использую session_destroy()
правильно или нет? Я читал другие вопросы здесь, но большинство ответов советуют использовать session_start()
перед уничтожением, но я начал сеанс вверху, прежде чем начнется чек.
Вы делаете некоторые сумасшедшие вещи там (но вам нужно договориться об этом с вашим собственным, я не расскажу об этом в своем ответе), причина, по которой вы видите сообщение об ошибке, довольно проста:
session_regenerate_id(true);
командует PHP для уничтожения старого сеанса. Проблема в том, что вы уже это сделали, одна строка раньше:
session_destroy(); session_regenerate_id(true);
Так что просто взгляните сверху. В OCD нет причин бросать столько функций, сколько вы сочтете нужным (но на самом деле не понимаете / хорошо знаете) на обработку сеанса. Вместо этого возьмите одну функцию, предназначенную для выполнения задания, и на самом деле обработайте ее возвращаемое значение, если вы хотите на самом деле разместить там некоторую защитную сетку. Это было бы более полезно.
Перед началом другого сеанса вам нужно уничтожить предыдущую сессию. Таким образом, а также «вход в систему» создает сеанс, также должен быть метод «выхода из системы», который уничтожает сеанс. Убедитесь, что у вашего приложения есть оба.