PHP: сеанс не сохраняется перед перенаправлением заголовка

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

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

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

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

Ответ 1

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

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

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

Ответ 2

@Matt (еще не в состоянии прокомментировать...): Если:
a) Он появляется в сеансе перед перенаправлением
б) работают другие клавиши

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

Ответ 3

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

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

header ('Location:/subdirectory/index.php');

Ответ 4

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

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

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

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

Ответ 5

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

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

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

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

Ответ 6

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

Ответ 7

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

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

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

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

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

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

Ответ 8

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

Моей проблемой было РАСПОЛОЖЕНИЕ "session_start()". Это должны быть первые строки вашего глобального контроллера, а не первые строки представления. $_SESSION недоступна в файлах контроллера, поскольку она была инициирована только тогда, когда сервер визуализировал представление.

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

ex:

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();

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

Ответ 9

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

config.php у меня: include 'session.php';

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

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

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

Ответ 10

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

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

Как говорится в документации о session_write_close :

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

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

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

Ответ 11

Попробуйте дать session_name() перед вами session_start().

И переключите error_reporting(15), чтобы увидеть ошибки.