session_destroy не сбрасывает session_id - PullRequest
4 голосов
/ 27 декабря 2011

Я работаю в системах онлайн-бронирования билетов, в которых после успешного бронирования (после оплаты) я хочу очистить идентификатор сеанса.Но дело в том, что я не могу это очистить, хотя я использовал session_destroy() для уничтожения сеанса.

Примечание: я повторил session_id, чтобы проверить, сброшен ли он.

URL: http://7sisters.in/7sislabs/

function book_final_tickets()
{

    //var_dump($_SESSION);
    $session_id = session_id();


    $sql = "
        UPDATE
            tbl_seat_book
        SET
            final_book = 'Y'
        WHERE
            session_id = '$session_id'
    ";


    //session_unset();

    if($r = $this->db->executeQuery($sql)){
        if(session_destroy()){
            unset($session_id); 
            echo 'Booking successfull';
        }
    }
}

Ответы [ 5 ]

10 голосов
/ 27 декабря 2011

session_destroy() само по себе не удалит cookie-файл на стороне клиента, поэтому в следующий раз, когда пользователь посетит, у него все равно будет установлен тот же идентификатор сеанса (но его информация о сеансе на стороне сервера будет уничтожена).

Из документов (выделено мое):

session_destroy () уничтожает все данные, связанные с текущим сессия. Он не сбрасывает ни одну из глобальных переменных, связанных с сеанс или сброс файла cookie сеанса. ... чтобы убить сеанс в целом, как выход пользователя из системы, идентификатор сеанса также должен быть неустановленным . Если cookie используется для распространения идентификатора сеанса (по умолчанию поведение), то файл cookie сеанса должен быть удален.

Вы можете использовать session_regenerate_id(true) для генерации нового идентификатора сеанса и удаления старого. Обратите внимание, что это сохранит всю информацию в $_SESSION как часть нового идентификатора сеанса, поэтому вам все равно нужно будет использовать session_destroy, если вы хотите очистить информацию о сеансе и начать заново.

например.

<?php
    session_start();    
    $_SESSION['blah'] = true;

    var_dump(session_id()); // q4ufhl29bg63jbhr8nsjp665b1
    var_dump($_SESSION);    // blah = true

    session_unset();
    session_destroy();
    setcookie("PHPSESSID", "", 1); // See note below
    session_start();
    session_regenerate_id(true);

    var_dump(session_id()); // gigtleqddo84l8cm15qe4il3q3
    var_dump($_SESSION);    // (empty)
?>

и в заголовках будет показан идентификатор сеанса, изменяющийся на стороне клиента:

Заголовок запроса
Cookie: PHPSESSID = q4ufhl29bg63jbhr8nsjp665b1

заголовок ответа
Set-Cookie: PHPSESSID = удален; expires = понедельник, 27 декабря 2010 г. 16:47:57 GMT
PHPSESSID = gigtleqddo84l8cm15qe4il3q3; путь = /

(Вы можете обойтись без вызова setcookie() здесь, так как вы все равно создаете новый сеанс, поэтому cookie будет перезаписываться новым идентификатором, но хорошей практикой является явное уничтожение старого cookie ).

2 голосов
/ 27 декабря 2011

Позвоните session_id до session_start и установите session_id вручную.

Пример 1: будет использоваться тот же идентификатор сеанса

<?php
session_start();

echo session_id(); //4ef975b277b52

session_destroy();

session_start();

echo session_id();  //4ef975b277b52
?>

Пример 2: установить session_id вручную (вызывается раньше session_start())

<?php
session_id(uniqid()); 
session_start();

echo session_id(); //4ef975d3d52f5  (A)

session_destroy();


session_id(uniqid());
session_start();

echo session_id();  //4ef975d3b3399 (B)
?>

(A)! = (B), так что вы можете установить session_id вручную, для получения дополнительной информации см. http://php.net/manual/en/function.session-id.php.

Другое решение , не используйте session_id (), просто создайте новый массив сессии:

<?php
$_SESSION['booked'] = false;

if($r = $this->db->executeQuery($sql))
{
    $_SESSION['booked'] = true;
    echo 'Booking successfull';
}
?>
1 голос
/ 26 сентября 2016

После уничтожения сеанса с помощью session_destroy () это сработало для меня:

SetCookie ( 'PHPSESSID', "", время () - 3600, '/');

Ключом для меня было установить путь к '/'. Это был единственный способ действительно уничтожить печенье.

0 голосов
/ 23 марта 2016

вместо

session_destroy();

Я бы предпочел сделать только

session_regenerate_id(true);

и вы получите новый session_id

0 голосов
/ 27 декабря 2011

Попробуйте это:

unset($session_id);
session_destroy();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...