Ответ 1
Я знаю, что это старый топпик, но я нашел решение (для меня). Я положил выход после заголовка.
$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;
Это работает для меня
Я прочитал руководство по 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
Я знаю, что это старый топпик, но я нашел решение (для меня). Я положил выход после заголовка.
$_SESSION['session'] = 'this is a session';
header('location: apage.php');
exit;
Это работает для меня
@Matt (еще не в состоянии прокомментировать...): Если:
a) Он появляется в сеансе перед перенаправлением
б) работают другие клавиши
В 80% случаев проблема представляет собой register_globals и где-то используется одинаково названная переменная $userID (остальные 19% просто перезаписываются в местах, которые не ожидаются, 1% не может записать/заблокировать сеанс перед перенаправлением и устаревшие данные, и в этом случае вы можете попробовать session_write_close() перед перенаправлением). Разумеется, register_globals должен быть выключен: P
Вы должны начать сеанс перед использованием массива сеансов.
Код PHP,
session_start();
$ _SESSION ['userID'] = $user- > id;
header ('Location:/subdirectory/index.php');
У вас есть session_start(); сверху?
Не проверено, но вы не можете сделать что-то вроде этого:
session_start();
$_SESSION['userID'] = $user->id;
if( $_SESSION['userID'] == $user->id )
{
header('Location: /index.php');
}
У меня никогда не было этой проблемы раньше, интересно
userID не имеет статуса ключевого слова.
Единственная причина для меня - $_SESSION ['userID'] где-то переписывается или удаляется.
Убедитесь, что вы используете session- > start() во всех файлах, которые хотите добавить/получить доступ к сеансу.
Одна важная вещь (которая может не применима в вашем случае) заключается в том, что если сеанс обрабатывается с помощью cookie, cookie может быть доступен для доступа только под определенным каталогом и подкаталогами под ним. В любом случае подкаталог будет иметь доступ к сеансу.
Убедитесь, что обе страницы имеют одну и ту же версию php (php5, php4 иногда имеют разные пути сеанса связи)
Я не слышал об этой проблеме, но я так долго не использовал сеансы.
С сеансами вы ДОЛЖНЫ сделать несколько вещей и настроить несколько настроек:
Другой проблемой может быть идентификатор $user- > , возвращающий ссылку на объект, который не существует на следующей странице. Скорее всего, нет, но убедитесь.
Если бы я увидел ваш код, я мог бы помочь вам намного больше. Но при отладке проверьте ключ сеанса с session_id() и убедитесь, что он тот же. Если бы вы могли попробовать, тогда скажите мне, что я мог бы продолжать помогать.
Я тоже хотел бы знать, как это заканчивается, когда я возвращаюсь в сеансы.
У меня была такая же проблема в последнее время. Я пишу настраиваемый веб-сайт 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();
Надеюсь, что он решил ваши проблемы.
Это было досадно, но я, наконец, понял решение.
config.php у меня: include 'session.php';
В верхней части session.php у меня было: session_start();
Переместив session_start() в начало файла config.php, альта...
Проблема решена!
Другой вариант, чем принудительное уничтожение вашего сценария с помощью exit
- это использовать session_write_close
чтобы заставить изменения быть записанными в хранилище сеансов.
Однако этого не должно произойти, если ваш скрипт завершается правильно.
Как говорится в документации о session_write_close
:
Завершите текущий сеанс и сохраните данные сеанса.
Данные сеанса обычно сохраняются после того, как ваш сценарий завершается без необходимости вызывать session_write_close(), но, поскольку данные сеанса заблокированы для предотвращения одновременной записи, только один сценарий может работать с сеансом в любое время. При использовании наборов кадров вместе с сессиями вы будете испытывать загрузку кадров один за другим из-за этой блокировки. Вы можете сократить время, необходимое для загрузки всех кадров, завершив сеанс, как только все изменения переменных сеанса будут выполнены.
В моем случае это происходило только во время отладки с помощью Xdebug
, когда я запускал один и тот же сценарий несколько раз и, таким образом, несколько процессов пытались манипулировать одним и тем же сеансом. Каким-то образом сеанс больше не может быть разблокирован.
Попробуйте дать session_name()
перед вами session_start()
.
И переключите error_reporting(15)
, чтобы увидеть ошибки.