Переменные SESSION не передаются со страницы после уничтожения остальных - PullRequest
2 голосов
/ 07 октября 2010

Я в полной потере слов.

Я разрешаю администратору сбросить свою регистрацию при достижении ошибки во время процесса.Теоретически следующий код должен работать следующим образом:

страница достигнута, $ adminvalidated устанавливается на основе данных сеанса.Массив $ _SESSION очищен;cookie очищается на стороне потребителя;идентификатор сеанса восстанавливается, а сеанс уничтожается.Затем сеанс перезапускается и ранее упомянутая переменная возвращается в Session.

операторы "echo", включенные ниже, работают, но когда я перенаправляю на другую страницу (закомментированную ниже), переменные сеанса НЕ переносятся.

Да, я также начал сеанс на следующей странице.

<?php
    session_start();
    ob_start();
    if( $_SERVER['SERVER_PORT'] == 80) {
        header('Location:https://'.$_SERVER['HTTP_HOST'].$_SERVER["REQUEST_URI"]); 
        die();
    } 

    $adminvalidated = $_SESSION['ADMINVALIDATED'];

    $_SESSION = array();

    if (ini_get("session.use_cookies")) {
        $params = session_get_cookie_params();
        setcookie(session_name(), '', time() - 42000,
            $params["path"], $params["domain"],
            $params["secure"], $params["httponly"]
        );
    }

    session_regenerate_id(true);
    session_destroy();
    session_start();

    $_SESSION['ADMINVALIDATED'] = $adminvalidated;

    echo $_SESSION['ADMINVALIDATED'];

/*
    header("Location: ../a.php");
    exit;*/
?>

Ответы [ 3 ]

1 голос
/ 07 октября 2010

Обычно достаточно вызвать session_regenerate_id(true) для изменения идентификатора сеанса текущего сеанса и сделать недействительной связь с идентификатором предыдущего сеанса.

Если вы дополнительно хотите очистить любые данные сеанса, кроме $_SESSION['ADMINVALIDATED'], просто сделайте это:

session_regenerate_id(true);
$_SESSION = array(
    'ADMINVALIDATED' => $_SESSION['ADMINVALIDATED']
);
1 голос
/ 07 октября 2010

со страницы руководства session_start:

Начиная с PHP 4.3.3, вызов session_start () после того, как сессия была ранее запущена, приведет к ошибке уровня E_NOTICE. Кроме того, начало второй сессии будет просто проигнорировано.

Просто очистите сеанс с помощью session_unset, заново создайте идентификатор сеанса и затем сбросьте свой администраторский вар. Нет необходимости уничтожать, а затем перезапустить сеанс.

0 голосов
/ 07 октября 2010

Я действительно не уверен, почему вы проходите все эти шаги. session_regenerate_id () достаточно для регенерации токена сеанса и связанного cookie. Функция создает новый токен сеанса и создает для вас новый файл cookie сеанса, сохраняя значения, которые есть в текущем сеансе. Поскольку установка нового cookie с тем же именем перезаписывает старый, недостаточно просто вызвать session_regenerate_id ()?

Не стесняйтесь разъяснять, если я что-то пропустил.

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