Переменные сессии PHP не сохранены - PullRequest
7 голосов
/ 19 марта 2009

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

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

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

Несколько вещей, это НЕ:

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

Я в своем уме. Есть предложения?

Большое спасибо.

Ответы [ 11 ]

7 голосов
/ 19 марта 2009

session_register() не требуется и может быть причиной проблемы здесь. Прочитайте документы по session_register() - он предназначен для назначения переменных сеанса с использованием существующих переменных.

и здесь :

Хорошо, session_register () сообщает PHP, что определенная глобальная переменная должна рассматриваться как переменная сеанса. Это означает, что в конце выполнения скрипта (то есть, когда обычно происходят записи данных сеанса), результирующее значение этой глобальной переменной будет записываться с использованием текущих включенных обработчиков сеанса.

Я думаю, что это проблема, которую вы испытываете. В конце выполнения скрипта переменная сеанса перезаписывается.

3 голосов
/ 27 апреля 2015

Я столкнулся с той же проблемой. Причина в том, что в php.ini я установил для параметра session.cookie_secure значение 1 . Но я использовал http вместо https в URL. Использование https решило проблему.

Настройка session.cookie_secure = 1 означает, что файлы cookie следует отправлять только через безопасные соединения. Поэтому я получал новые session_ids на каждой новой странице при использовании http.

2 голосов
/ 19 марта 2009

Идентификатор сеанса должен быть каким-то образом перенесен, чтобы один и тот же сеанс мог использоваться на нескольких страницах. Обычно это делается с помощью cookie (см. session.use_cookies), но это также может быть сделано в URL или в формах (см. session.use_trans_sid).

Итак, сначала вы должны убедиться, что идентификатор сеанса передан, чтобы PHP мог загрузить нужный сеанс и данные сеанса.

См. Также Правильно ли мое понимание сеансов PHP?

2 голосов
/ 19 марта 2009

Одна ошибка, которую я вижу, состоит в том, что в первом файле вы устанавливаете $_SESSION['textvar'], а во втором файле вы звоните $_SESSION['newvar'].

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

Я также попытался удалить session_register(), и код все еще работает отлично.

1 голос
/ 19 марта 2009

Если все вышеперечисленное не решит проблему, я просто спрошу очевидное: не будет пробелов или новых строк перед открывающим тегом php?

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

1 голос
/ 19 марта 2009

"session_register () принимает переменное число аргументов, любой из которых может быть либо строкой , содержащей имя переменной , либо массивом, состоящим из имен переменных или других массивов. Для каждого name, session_register () регистрирует глобальную переменную с таким именем в текущем сеансе. "

, поскольку у вас нет переменных с этими именами, результат будет непредсказуемым.

просто используйте $_SESSION[$key] = $value;

0 голосов
/ 13 января 2016

Проверьте журналы сервера вашего PHP-сервера, например, nginx или apache.

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

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

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

0 голосов
/ 21 декабря 2013

Знаю, что это более старая запись, но у меня была похожая проблема (не с помощью session_register ()).

Пришлось преобразовывать сеансы в файлы cookie, потому что время сеанса истекало слишком часто, и из-за настройки сервера («специальная» среда размещения Windows-серверов (с Apache)) значение времени ожидания сеанса PHP не могло быть изменено.

Конечным результатом было / является ли то, что теперь после преобразования в файлы cookie с увеличенным сроком действия данные cookie все еще теряются (при передаче)? иногда.

Очень расстраивает.

У меня НИКОГДА не было такого в среде LAMP, поэтому, возможно, возникает вопрос: используете ли вы сервер LAMP или нет?

Надеюсь, это поможет. Я не думаю, что это проблема PHP.

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

Еще одна очевидная вещь для проверки:

Убедитесь, что дисковое пространство не заполнено; что предотвратит сохранение данных сеанса.

0 голосов
/ 19 марта 2009

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

...