2013-08-31 2 views
0

Я получаю сообщение об ошибке, используя 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() должен был использоваться, прежде чем уничтожить его, но я начал сеанс вверху, прежде чем начнется чек.

+0

_Why_ вы используете session_unset и session_destroy? восстановление идентификатора должно быть достаточно. И почему вы проверяете идентификатор пользователя в сессии как числовой? Если это вообще необходимо, сделайте это, прежде чем вкладывать его в сеанс. – CBroe

+0

@CBroe Я использую session_unset и session_destroy для регистрации пользователя, если обнаружены какие-либо проблемы, поэтому, когда они идут на другую страницу, они снова должны войти в систему. Я проверяю, что user_id является числовым из-за захвата сеанса. Просто потому, что я проверил это, прежде чем поместить его в сеанс в первую очередь, не означает, что он будет действителен на этой странице, если кто-то сыграл с ним. – TheCarver

+0

Теперь я отслеживаю этот миф 'session_unset', так как вчера вчера на SO. Независимо от того, что вы говорите пользователям, как-то слухи о том, что чем больше функций вы сочтете нужным бросить в свой скрипт, тем лучше. На самом деле все наоборот. – hakre

ответ

1

Вы делаете некоторые сумасшедшие вещи там (но вы должны вести переговоры, что с вашим собственным, я не накрывайте его в моем ответе), причина, почему вы видите сообщение об ошибке довольно проста:

session_regenerate_id(true); 

командует PHP для уничтожения старого сеанса. Проблема в том, что вы уже это сделали, одна строка ранее:

session_destroy(); 
session_regenerate_id(true); 

Так что просто взгляните сверху. В OCD нет причин бросать столько функций, сколько вы сочтете нужным (но на самом деле не понимаете/хорошо знаете) на обработку сеанса. Вместо этого возьмите одну функцию, предназначенную для выполнения задания, и на самом деле обработайте ее возвращаемое значение, если вы хотите на самом деле разместить там некоторую защитную сетку. Это было бы более полезно.

+0

Спасибо за объяснение, красиво. Полагаю, я немного увлекся проверкой моих занятий. Я пришел из Classic ASP не так давно, когда управление сессиями было немного проще (по причине, потому что это был мусор). Возможно, я просто использую 'session_regenerate_id (true);' если какие-либо условия истинны, перенаправляйте пользователя на страницу выхода, где все данные сеанса все равно очищаются, а затем отскакивают назад на страницу, на которой они были. – TheCarver

+1

Да, это то, что я хотел сказать, эта функция сама по себе (с параметром «истина»). – hakre

0

Перед началом другой сессии вы должны уничтожить предыдущую сессию. Таким образом, а также «вход в систему» ​​создает сеанс, также должен быть метод «выхода из системы», который уничтожает сеанс. Убедитесь, что у вашего приложения есть оба.

Смежные вопросы