Не установлены значения сеанса PHP - PullRequest
0 голосов
/ 07 июня 2011

У меня странные проблемы с переменными сеанса PHP, утверждающими, что они не установлены.Я сталкиваюсь с этим только в одной конкретной ситуации:

На моем сайте есть трехэтапный мастер, и я использую сеансы для сохранения выбора пользователя на каждом шаге.Чтобы запустить мастер, я использую сценарий инициализации, который обеспечивает удаление всех старых данных сеанса мастера - этот сценарий инициализации перенаправляет пользователя на шаг 1. Например:

// Initialize wizard session and send user to step 1
$_SESSION['wizard'] = array();
$_SESSION['wizard']['step1'] = TRUE;
session_write_close();
header('Location: http://mysite.com/wizard/step1.php');

Затем в верхней части шага 1.php, я делаю проверку вроде:

if (!isset($_SESSION['wizard']['step1'])) 
    throw new Exception('Step1 not initialized');

Когда пользователь отправляет форму step1, она отправляется обратно для проверки.Если он проходит, другой шаг выполняется на шаге 2.

В большинстве случаев это работает нормально.На самом деле скрипт init всегда работает и форма step1 всегда загружается без проблем.Но иногда, после отправки формы шага 1, возникает исключение 'Step1 not initialized'.Я не понимаю, как начальная загрузка могла пройти проверку, но форма поста провалилась через несколько секунд.Особенно учитывая, что эта проблема случается нечасто, и в большинстве случаев проблем вообще нет.

Я использую базу данных для хранения своих данных сеанса, и я не думаю, что это связано свремя ожидания сеанса или сборка мусора - некоторые связанные значения php.ini:

session.use_cookies = 1
session.cookie_lifetime = 0
session.gc_probability = 1
session.gc_divisor = 1000
session.gc_maxlifetime = 86400

Кто-нибудь знает, что может быть причиной такой проблемы?Любое понимание будет высоко ценится.

Спасибо, Брайан

Ответы [ 3 ]

3 голосов
/ 07 июня 2011

Убедитесь, что каждый сценарий, который использует ваши сеансы, начинается с session_start ()

1 голос
/ 07 июня 2011

Если не весь сеанс пуст, а только эта переменная / ключ, вы можете использовать это для отслеживания причины:

class foo extends ArrayObject{
    function __destruct(){
        echo 'dying:';
        debug_print_backtrace();
    }
}
session_start();
$_SESSION['wizard'] = new foo();
//array access is still possible
$_SESSION['wizard']['foz'] = 1234;
//reading it like an array also
echo $_SESSION['wizard']['foz'];
//on normal completion, it also gets called, the backtrace would be:
//dying:#0  foo->__destruct()
//^ ignore those

//on overwriting / deleting values, like for instance this by accident:
$_SESSION['wizard'] = array();
//the backtrace is something like:
//dying:#0  foo->__destruct() called at [filename:linenumber]

... и у вас будет имя файла + белье Возможно, запишите его во временный файл, а не повторяйте его, чтобы убедиться, что вы не пропустите ничего при перенаправлениях и т. Д.

1 голос
/ 07 июня 2011

Вы не забыли позвонить session_start() до взаимодействия с $_SESSION, а также до того, как какой-либо вывод был отправлен в браузер (включая любые пробелы или пустые строки до <?php?

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