Я получаю сообщение об ошибке, используя session_destroy() в моем PHP-коде.Ошибка - session_destroy() - попытка уничтожить неинициализированную сессию
Следующий скрипт находится на каждой странице, и если пользователь зарегистрирован, он проверяет, действительно ли сеанс действителен или нет, убивая сеанс, если это не так.
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()
должен был использоваться, прежде чем уничтожить его, но я начал сеанс вверху, прежде чем начнется чек.
_Why_ вы используете session_unset и session_destroy? восстановление идентификатора должно быть достаточно. И почему вы проверяете идентификатор пользователя в сессии как числовой? Если это вообще необходимо, сделайте это, прежде чем вкладывать его в сеанс. – CBroe
@CBroe Я использую session_unset и session_destroy для регистрации пользователя, если обнаружены какие-либо проблемы, поэтому, когда они идут на другую страницу, они снова должны войти в систему. Я проверяю, что user_id является числовым из-за захвата сеанса. Просто потому, что я проверил это, прежде чем поместить его в сеанс в первую очередь, не означает, что он будет действителен на этой странице, если кто-то сыграл с ним. – TheCarver
Теперь я отслеживаю этот миф 'session_unset', так как вчера вчера на SO. Независимо от того, что вы говорите пользователям, как-то слухи о том, что чем больше функций вы сочтете нужным бросить в свой скрипт, тем лучше. На самом деле все наоборот. – hakre