За последние 24 часа нас посетил 38441 программист и 1284 робота. Сейчас ищут 1032 программиста ...

Не работает session_destroy()

Тема в разделе "PHP для новичков", создана пользователем machetero, 9 май 2015.

  1. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    У меня примерно такой сценарий:

    Код (PHP):
    1. if (!isset($_SESSION['login']))
    2. {
    3.    //Этот блок выполняется если пользователь ещё не авторизован
    4.    // и ему присваивается переменная $_SESSION['login']
    5. }
    6.  
    7. //Здесь по идее переменные сессии должны удаляться
    8. //и дальше ничего не должно происходить 
    9. if (isset($_GET['logout'])) session_destroy();
    10.  
    11. if (isset($_SESSION['login']))
    12. {
    13.    //Тут для пользователя выводится контент
    14.    // если он прошёл авторизацию
    15.    //и есть кнопка ВЫЙТИ <input type="submit" name="logout" value="logout">
    16. }
    Так вот когда я нажимаю кнопку ВЫЙТИ ничего не происходит. Страница обновляется и в ней всё выводится, как если переменная $_SESSION['login'] ещё существует. Разлогинивает только со второго нажатия на ВЫЙТИ.

    Добавлено спустя 50 секунд:
    Вот весь код
    Код (PHP):
    1. <?php
    2.  
    3.  
    4. //Если пользователь ещё не в системе
    5.  
    6. if (!isset($_SESSION['login']))
    7. {
    8.  
    9.     //Проверим ввёл ли пользователь данные
    10.  
    11.     if  (empty($_POST['login']) || empty($_POST['password'])) 
    12.     {
    13.         die('<h1>Enter your login and password [url="index.php"]here[/url]</h1>');
    14.     }
    15.  
    16.     //Создадим короткие переменные
    17.  
    18.     $login = $_POST['login'];
    19.     $password = $_POST['password'];
    20.     
    21.  
    22.     //Подключимся к базе данных
    23.  
    24.     $dbcon = mysqli_connect('localhost', 'root', '', 'tasktable');
    25.     if (!$dbcon)
    26.     {
    27.         die('<h1>Database connection error ('.mysqli_connect_error().')</h1>');
    28.     }
    29.     mysqli_set_charset($dbcon, "utf8");
    30.     $login = mysqli_real_escape_string($dbcon, $login);
    31.  
    32.  
    33.     //Проведём аутентификацию
    34.  
    35.     $query = "SELECT * FROM `users` WHERE `login`='$login'";
    36.     $result = mysqli_query($dbcon, $query);
    37.     $user = mysqli_fetch_array($result);
    38.     if ($user['password'] == $password)
    39.     {
    40.         $_SESSION['login'] = $login;
    41.     }
    42.  
    43. }
    44.  
    45.  
    46. //Уничтожить сессию если нажата кнопка выхода из системы 
    47.  
    48. if (isset($_GET['logout'])) 
    49. {
    50.     session_destroy();
    51. }
    52.  
    53. //Генерируем страницу, если пользователь прошёл авторизацию или уже в системе
    54.  
    55. if (isset($_SESSION['login']))
    56. {
    57. ?>
    58.  
    59. <html>
    60.  
    61. <head>
    62. <title>Your counter</title>
    63. </head>
    64.  
    65. <body>
    66. <form method="GET" action="">
    67. <input type="submit" name="increase" value="+1">
    68. </form>
    69. <form method="GET" action="">
    70. <input type="submit" name="logout" value="logout">
    71. </form>
    72. </body>
    73.  
    74. </html>
    75.  
    76. <?php 
    77. }
    78.  
    79.  
    80.  
    81. ?>
     
  2. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    1) код уязвим к инъекциям;
    2) пароли в открытом виде не храни;
    3) не юзай гет для логаута;
    4)

    Жирным выделено как раз то, что создает тебе проблемы. Потому что нужно до кучи юзать вот это: http://php.net/manual/ru/function.session-unset
     
  3. machetero

    machetero Активный пользователь

    С нами с:
    25 окт 2014
    Сообщения:
    499
    Симпатии:
    21
    Благодарю за помощь.
    я новичок и кроме mysqli_real_escape_string не знаю чем защищаться
    как хранить тоже не знаю
    переделаю
    А о каких данных тогда речь. Если он глобальные( имеется ввиду наверно суперглобальные ?) переменные не уничтожает.

    Добавлено спустя 8 минут 8 секунд:
    добавил session_unset(), всё равно выходит только после второго нажатия

    Добавлено спустя 1 минуту 44 секунды:
    Или надо просто сделать unset($_SESSION['login']) ?

    Добавлено спустя 3 минуты 18 секунд:
    С обычным ансетом работает ! Но интересно почему session_unset() и session_destroy() у меня не действуют.
     
  4. Fell-x27

    Fell-x27 Суперстар
    Команда форума Модератор

    С нами с:
    25 июл 2013
    Сообщения:
    12.156
    Симпатии:
    1.771
    Адрес:
    :сердА
    Проглядел, нет, я был неправ. Ты и кодировку указал и эскейпинг заюзал.

    В виде хеша и соли. Так и гугли. "Соль" - это устоявшийся термин. Более того, даже на этом форуме в поиске вбей "пароль" "соль", и зачитывайся.

    Оно и должно происходить при вызове session_unset(). Что-то ты не так делаешь, сдается мне. У меня это все работает без проблем.
     
  5. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.227
    Симпатии:
    1.714
    Адрес:
    Молдова, г.Кишинёв