Я не могу использовать переменные сеанса на странице, отличной от той, где они установлены, IOW они действуют как внесегментные переменные. Я нашел аналогичный вопрос, размещенный в полдюжины других подобных форумов, но ответ в этих случаях всегда оказывается неприменимым.
Вот мои файлы:
sess1.php
<?php session_start(); session_register("userid"); session_register("textvar"); $_SESSION['userid'] = 10333 ; $_SESSION['textvar'] = TextVariable ; echo "<p>User ID is: " . $_SESSION['userid'] . "</p>" ; echo "<p>Another variable is: " . $_SESSION['textvar'] . "</p>" ; ?> <p>Go to the <a href="sess2.php">next page</a>.</p>
и, sess2.php
<?php session_start(); echo "<p>The userid session variable is: " . $_SESSION['userid'] . "</p>"; echo "<p>The other session variable is: " . $_SESSION['newvar']. "</p> "; ?>
Вывод браузера в каждом случае:
sess1.php
Идентификатор пользователя: 10333
Другая переменная: TextVariable
Перейдите на страницу [следующая страница].
и, sess2.php
Переменная сеанса userid:
Другая переменная сеанса:
Перейдите к [последней странице].
Несколько вещей это НЕ:
Я в конце своего ума. Какие-либо предложения?
Спасибо.
Идентификатор сеанса связи должен каким-то образом переноситься, чтобы один и тот же сеанс можно было использовать на нескольких страницах. В общем, это делается с помощью cookie (см. session.use_cookies
), но это также можно сделать в URL-адресе или в формах (см. session.use_trans_sid
).
Поэтому сначала вы должны убедиться, что идентификатор сеанса передается так, чтобы PHP мог загружать нужные данные сеанса и сеанса.
См. Также Правильно ли мое понимание PHP-сессий?
session_register()
не требуется и может быть причиной проблемы здесь. Прочитайте документы в session_register()
– он предназначен для назначения переменных сеанса с использованием существующих переменных.
и отсюда :
Ну, session_register () сообщает PHP, что определенную глобальную переменную следует рассматривать как переменную сеанса. Это означает, что в конце выполнения скрипта (который обычно происходит при записи данных сеанса) результирующее значение этой глобальной переменной будет записано с использованием текущих обработчиков сеанса.
Я думаю, что это проблема, которую вы испытываете. В конце выполнения скрипта переменная сеанса переписывается.
Я столкнулся с той же проблемой. Причина в том, что в php.ini я установил значение параметра session.cookie_secure равным 1 . Но я использовал http вместо https в URL. Использование https решило проблему.
Установка session.cookie_secure = 1 указывает, что файлы cookie должны отправляться только через защищенные соединения. Таким образом, я получал новые session_ids на каждой новой странице при использовании http.
Одна ошибка, которую я вижу, заключается в том, что в первом файле вы устанавливаете $_SESSION['textvar']
а во втором файле вы вызываете $_SESSION['newvar']
.
Кроме того, я проверил ваш код на сервере, который, как я знаю, работает, и он отлично работал, кроме вышеуказанной ошибки.
Я также попытался удалить session_register()
и код все еще работает отлично.
«session_register () принимает переменное количество аргументов, любое из которых может быть либо строкой, содержащей имя переменной, либо массив, состоящий из имен переменных или других массивов. Для каждого имени session_register () регистрирует глобальную переменную с этим именем в текущей сессии ».
потому что у вас нет переменных с этими именами, результат будет непредсказуемым.
просто используйте $_SESSION[$key] = $value;
Если все вышеперечисленное не решит проблему, я просто спрошу очевидное: не было бы пробелов или новых строк до открытия php-тега?
Вы также можете проверить наличие сообщений в файле журнала ошибок сервера, который должен указать, определены ли ваши переменные (хотя, я думаю, это зависит от уровня сообщений об ошибках).
Используйте какой-то инструмент и проверьте заголовки http, чтобы вы могли видеть, как отправляется cookie. Возможно, ваш веб-сервер настроен с ошибкой и отправляет файлы cookie с недопустимым другим доменом.
Возможно, вам захочется посмотреть на session_set_cookie_params () для каждого запроса и убедиться, что установлены правильный домен, путь и т. Д.
Еще одна очевидная вещь, чтобы проверить:
Убедитесь, что ваше дисковое пространство не заполнено; что предотвратит сохранение данных сеанса.
Знайте, что это более старая должность, но у меня была аналогичная проблема (не используя session_register ()).
Требуется преобразовать сеансы в файлы cookie, потому что сеанс слишком часто выходил из строя, и из-за настройки сервера («специальная» среда размещения серверов Windows (с Apache)) значение времени сеанса PHP не может быть изменено.
Конечным результатом было / заключается в том, что теперь, после преобразования в файлы cookie с расширенной продолжительностью жизни, данные cookie все еще теряются (при передаче)? иногда.
Очень расстраивает.
Я НЕ КОГДА-ЛИБО, чтобы это происходило в среде LAMP, поэтому может возникнуть вопрос, следует ли использовать сервер LAMP или нет.
Надеюсь это поможет. Я не думаю, что это проблема PHP.
Проверьте журналы сервера вашего сервера PHP, например nginx или apache.
Вы можете найти информацию о том, почему сеансы не работают в nginx error.log. Обычно путь к этому файлу: /var/log/nginx/error.log
.
В моем случае он говорил, что данные сеанса не могут быть сохранены. Оказалось, что в том же каталоге старый файл error.log.1
имел размер 17 ГБ и занимал все свободное место на диске.
Простое освобождение дискового пространства позволило восстановить нормальное поведение сеансов.
Используйте session_register в обоих файлах, и он должен работать.