nmeri17 Ответов: 0

Что может привести к невозможности изменить сеанс в PHP?


Цель состоит в том, чтобы удалить идентификатор, сохраненный в сеансе после выхода из системы.

Примечание:

1. функция session_start() была вызвана в начале запроса
2. Отчет об ошибках включен

Что я уже пробовал:

После использования обычного unset, если я var_dump, похоже, он действительно удалил идентификатор, но тот же идентификатор доступен при последующих запросах на другие маршруты. Это не относится только к unset, как я заметил при вставке по этому запросу тоже

public function signout () {

    unset($_SESSION['login_id'] );
    $_SESSION['jhg'] = 6778; // on next request to another route, this is nowhere to be found, while the login_id remains hail and hearty
    return [];
}


Единственный способ, которым я смог успешно очистить значение, был с помощью этого взлома

$eds = array_filter($_SESSION, function ($k) {
	return $k != 'login_id';
}, ARRAY_FILTER_USE_KEY);

$_SESSION = []; session_destroy(); 
session_start(); $_SESSION = $eds;


Это работает, потому что я понял, что уничтожение всего сеанса сохраняется во всех запросах. Это единственная операция в суперглобале, которая работает с этим конкретным запросом/маршрутом. Изменение сеанса в другом месте работает именно так, как говорят документы. Что же здесь происходит?

Mohibur Rashid

просто вызов session_destroy() должен сделать трюк выхода из системы. Вам больше ничего не нужно.

nmeri17

Я не мог вызвать session_destroy, потому что сеанс содержит другие переменные, которые я, вероятно, буду использовать в других запросах. В конце концов я обнаружил, что проблема была вызвана предупреждением/ошибкой, возникающей при написании некоторого закрытия сеанса. PHP не разрешает сериализацию замыканий в массиве сеансов, поэтому это своего рода транзакция, которая " фиксируется` только после возврата ответа. В моем случае закрытие вызывало завершение транзакции, даже если обработчик запроса заметно изменял содержимое массива сеансов.

Спасибо, что заглянули

ZurdoDev

Если вы хотите удалить только один ключ сеанса, все, что вам нужно сделать, это установить его пустым.

0 Ответов