Вопрос

Я не могу использовать переменные сеанса на странице, отличной от той, на которой они установлены, 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

Другая переменная:Текстовая переменная

Перейдите на [следующую страницу].

и,sess2.php

Переменная сеанса userid:

Другая переменная сеанса:

Перейдите на [последнюю страницу].

Несколько вещей, которыми это НЕ является:

  • У меня есть session_start() вверху обоих файлов.
  • Каталог переменных доступен для записи, и переменные сеанса отображаются там.(У меня есть около сотни маленьких файлов под названием sess_b62, внутри которых есть следующее:'userid|i:10333;textvar|s:12:"TextVariable";'.)
  • phpinfo() сообщает мне, что файл php.ini читается правильно, а время жизни установлено по умолчанию, 0, т.е.пока браузер не закроется.

Я в полном смятении.Какие-либо предложения?

Спасибо.

Это было полезно?

Решение

Идентификатор сеанса должен каким-то образом передаваться, чтобы один и тот же сеанс можно было использовать на нескольких страницах.Обычно это делается с помощью файла 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 следует отправлять только через защищенные соединения.Поэтому я получал новые идентификаторы сеанса на каждой новой странице при использовании 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.

Информацию о том, почему не работают сеансы, можно найти в файле error.log nginx.Путь к этому файлу обычно следующий: /var/log/nginx/error.log.

В моем случае говорилось, что данные сеанса не могут быть сохранены.Оказалось, что в том же каталоге старый error.log.1 файл имел размер 17 ГБ и занимал все доступное место на диске.

Простое освобождение дискового пространства восстановило нормальное поведение сессий.

Используйте session_register в оба файлы и все должно работать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top