PHP: сессия не сохраняется до перенаправления заголовка - PullRequest
11 голосов
/ 03 июня 2010

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

// session
$_SESSION['userID'] = $user->id;        
header('Location: /subdirectory/index.php');

Затем в верхней части index.php после session_start(), я var_dumped глобальный $ _SESSION и userID там нет. Как я уже сказал, я просмотрел руководство по PHP (http://php.net/manual/en/function.session-write-close.php), и ни session_write_close, ни session_regenerate_id(true) не помогли мне. Кто-нибудь знает решение?

Редактировать: у меня есть session_start () в верхней части моего файла. Когда я изменяю глобальный сеанс перед перенаправлением заголовка, я вижу там идентификатор пользователя, но не в другом файле, который находится в подкаталоге этого скрипта

Ответы [ 10 ]

14 голосов
/ 01 апреля 2011

Я знаю, что это старый топик, но я нашел решение (для меня). Я поставил выход после заголовка.

$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;

Это работает для меня

4 голосов
/ 04 июня 2010

@ Мэтт (пока не может комментировать ...): Если:
а) появляется в сеансе перед перенаправлением
б) другие ключи работают

В 80% случаев проблема заключается в register_globals, и где-то используется переменная $ userID с одинаковым именем (остальные 19% просто перезаписывают в местах, которые никто не ожидает, 1% не может записать / заблокировать сеанс перед перенаправлением и устаревшие данные, в этом случае вы могли бы попробовать session_write_close () перед перенаправлением). Само собой разумеется, что register_globals должен быть выключен: P

1 голос
/ 16 апреля 2017

Вы должны начать сеанс перед использованием массива сеансов.

Код PHP ,
session_start ();
$ _SESSION ['userID'] = $ user-> id;

заголовок ('Location: /subdirectory/index.php');

0 голосов
/ 12 апреля 2019

Другой вариант, кроме принудительного уничтожения вашего сценария с помощью exit, - это использование session_write_close для принудительной записи изменений в хранилище сеансов.

Однако этого не должно произойти, если ваш сценарий завершается правильно.

В документации о session_write_close указано:

Завершить текущий сеанс и сохранить данные сеанса.

Данные сеанса обычно сохраняются после того, как ваш скрипт завершается без необходимость вызывать session_write_close (), но так как данные сеанса заблокированы для предотвращения одновременной записи в сеансе может работать только один скрипт в любое время. При использовании наборов кадров вместе с сессиями вы будете испытайте загрузку кадров один за другим из-за этой блокировки. Вы можете сократить время, необходимое для загрузки всех кадров, завершив сеанс как как только все изменения в переменных сеанса сделаны.

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

0 голосов
/ 07 июля 2013

Это было чертовски неприятно, но я наконец-то нашел решение.

config.php у меня было: include 'session.php';

В верхней части session.php у меня было: session_start ();

Переместив session_start () в начало файла config.php, альт ...

Проблема решена!

0 голосов
/ 29 апреля 2013

У меня недавно была такая же проблема. Я пишу индивидуальный веб-сайт MVC для школы, и, как все говорили, start_session () должен быть написан в самых первых строках кода.

Моя проблема была в расположении "session_start ()". Это должны быть первые строки вашего глобального контроллера, а не первые строки представления. $ _SESSION не был доступен в файлах контроллера, потому что он был инициирован только тогда, когда сервер отображает представление.

Затем я использую session_write_close () после вызова header ('location: xxx.php'), чтобы сохранить переменные сеанса для следующего запроса.

Например:

globalController.php:

//First line
session_start();
require_once('Model/Database.php');
require_once('Model/Shop/Client.php');
...

logonController.php:

...
//Users is validated and redirected.
$_SESSION['client'] = $client;
header('location: index.php');
session_write_close();

Надеюсь, это решило ваши проблемы.

0 голосов
/ 06 июня 2010

Я не слышал об этой проблеме, но я не так часто использовал сессии.

С сеансами вы ДОЛЖНЫ сделать несколько вещей и настроить несколько параметров:

  • куки включены на стороне клиента
  • session_start (), до того, как что-то произойдет
  • убедитесь, что вы не уничтожаете сеанс (если они не хотят выходить из системы)
  • Идентификатор сеанса PHP должен быть одинаковым (относится к файлам cookie)

Другая проблема может быть в том, что $ user-> id возвращает ссылку на объект, который не существует на следующей странице. Скорее всего нет, но обязательно.

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

Мне бы тоже хотелось узнать, чем это закончится, когда я вернусь к сессиям.

0 голосов
/ 06 июня 2010

Убедитесь, что обе страницы имеют одинаковую версию php (php5, php4 иногда имеют разные пути сеансов)

0 голосов
/ 04 июня 2010

userID не имеет статуса ключевого слова.

Единственная причина для меня - $ _SESSION ['userID'] где-то перезаписывается или удаляется.

Убедитесь, что вы используете session-> start () во всех файлах, которые вы хотите добавить / получить доступ к сеансу.

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

0 голосов
/ 03 июня 2010

У вас есть session_start ();наверху?

Не проверено, но вы не можете сделать что-то вроде этого:

session_start();
$_SESSION['userID'] = $user->id;
if( $_SESSION['userID'] == $user->id )
{  
    header('Location: /index.php');
}

У меня никогда не было этой проблемы раньше, интересно

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