Странная ошибка PHP с сессиями

php

#php

Вопрос:

Я пытаюсь загрузить $_SESSION переменную с другой переменной на моей странице.

Структура страницы здесь — Страница 1 -> Страница 2 -> Страница 3; это форма, состоящая из нескольких частей. На странице 2 есть кнопка «Назад», которая позволяет вам вернуться на страницу 1. Я пытаюсь использовать переменные сеанса, чтобы поля ввода на странице 1 не оставались пустыми.

Я использую форму отправки, чтобы перейти со страницы 1 на страницу 2. Вот применимый PHP-код на странице 2, который обрабатывает извлечение переменных POST:

     <?php
$retailerName = $_POST["retailerName"];
$description = $_POST["description"];
$savingsDetails = $_POST["savingsDetails"];
$terms = $_POST["terms"];
$phone = $_POST["phone"];
$address = $_POST["address"];
$zone = $_POST["zone"];
$dateExp = $_POST["dateExp"];
$tag = $_POST["tag"];

$_SESSION["rn"] = $retailerName;
$_SESSION["de"] = $description;
$_SESSION["sd"] = $savingsDetails;
$_SESSION["tm"] = $terms;
$_SESSION["ph"] = $phone;
$_SESSION["ad"] = $address;
$_SESSION["zo"] = $zone;
$_SESSION["ex"] = $dateExp;
$_SESSION["tg"] = $tag;
?>
 

Я знаю, что переменные устанавливаются правильно.

Я могу сделать это:

  echo $retailerName;
 echo $_SESSION["rn"];
 

На странице 2 и он покажет, чего я хочу. Единственная проблема заключается в том, что переменные сеанса не переносятся на страницу 1.

Если я установлю для переменных сеанса значение string, оно вернется на страницу 1. По какой-то причине, даже если опубликованные переменные являются допустимыми и содержат правильную строку, переменная сеанса не будет переносить их.

Если я сделаю это:

  $_SESSION["rn"] = $retailerName;
 

Тогда значение переменной сеанса не будет перенесено на страницу 1.

Если я сделаю это:

  $_SESSION["rn"] = "asdf";
 

Тогда значение переменной сеанса будет перенесено на страницу 1.

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

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

Почему $_SESSION переменные не переносят правильную и действительную опубликованную переменную на страницу 1, но она переносит строку?

Страница 1 Pastebin

Страница 2 Pastebin

Ответ №1:

Ты забыл

 session_start();
 

В (или около) верхней части вашего PHP?

type Установлен ли атрибут формы в POST ?

Комментарии:

1. Нет, я могу передавать строки в переменной сеанса.

2. Я знаю, но я предположил, что, возможно, в вашем тесте вы создали другую страницу. Извините.

3. Да, это СООБЩЕНИЕ. Я заранее использовал $_REQUEST, и переход на POST не улучшил ситуацию. Переменные проходят правильно; Я могу вывести все опубликованные переменные на странице 2.

4. Никакой опечатки, я сократил имена переменных, мой фактический код имеет ‘rn’.

Ответ №2:

Что произойдет, если вы выполните var_dump($ _SESSION) из print_r($ _SESSION) при возврате на страницу 1? Похоже, вы использовали session_start(), потому что $_SESSION[‘rn’] = «abc» действительно работает.

Вы также должны знать, что настройки в верхней части файла (так что $ retailerName = $ _POST [‘retailer’]) должны быть в пределах некоторых проверок fe.

 if($_SERVER['REQUEST_METHOD'] == "POST") {
  $retailerName = $_POST['retailer'];
  $_SESSION['rn'] = $retailerName;
}
 

В противном случае все будет стерто при повторном посещении страницы (и, следовательно, с пустым массивом $ _POST, который стирает значение $ _SESSION[‘rn’].

Комментарии:

1. Все переменные сеанса, которые я пытаюсь передать, имеют значение NULL.

2. и нет никаких шансов, что на странице 1 все переменные сбрасываются в NULL?

3. Нет, только переменные, которые я пытаюсь передать. Остальные в порядке.

4. Не могли бы вы добавить полный код со страниц 1 и 2 в pastebin? Кажется действительно странным, что это не работает, если ни одна из приведенных возможных ошибок, похоже, не имеет места.

5. странно .. и что происходит, когда вы переключаетесь со страницы 1 обратно на страницу 2, содержит ли тогда сеанс правильные ключи?

Ответ №3:

Не уверен в полном сценарии здесь, но…..

Мне кажется, что здесь есть проблема с потоком событий, я бы попробовал включить инструкции для установки переменных сеанса в операторе if, например:

 if($retailerName){
  $_SESSION['rn'] = $retailerName;
  ...........
}
 

Может быть, каким-то образом есть еще один вызов на страницу 2 ПОСЛЕ установки переменных POST, который сбрасывает переменные сеанса на пустые, потому что нет данных POST.

Также случайно эти страницы 1 и 2 используются в iframes? Если это так, то, возможно, последовательность загрузки страницы 1 и страницы 2 неверна.

Ответ №4:

У вас есть тот же код в верхней части вашей страницы 1?

 $retailerName = $_POST["retailerName"];
$description = $_POST["description"];
$savingsDetails = $_POST["savingsDetails"];
$terms = $_POST["terms"];
$phone = $_POST["phone"];
$address = $_POST["address"];
$zone = $_POST["zone"];
$dateExp = $_POST["dateExp"];
$tag = $_POST["tag"];
 

Возможно, все ваши переменные сбрасываются, прежде чем вы попытаетесь получить свойства со следующим:

 $_SESSION["rn"] = $retailerName;
echo $_SESSION["rn"] // this will not be what you want now
 

Единственное, что я могу думать, это то, что все, что находится на странице 1, сбрасывает массив $ _SESSION . В верхней части страницы 1 и страницы 2 выполните print_r($ _SESSION) и выполните print_r($ _GET) в верхней части страницы 2 и еще один print_r ($ _SESSION) в нижней части страницы 2.

Теперь перейдите на страницу 1 в вашем браузере. Установлены ли ваши значения в null там? Снова заполните свою форму на странице 1 и отправьте сообщение на страницу 2. Отображаются ли на странице 2 значения вашей формы? Возможно, значения формы неправильно передаются на страницу 2.

Если вы видите значения своей формы, то ваша настройка свойств в массиве $ _SESSION должна работать. Вы должны увидеть, что массив $ _SESSION правильно распечатан внизу страницы 2.

Вернитесь на страницу 1. Распечатаны ли переменные сеансов? Если нет, то что-то перезаписывает массив $ _SESSION. Проверьте включенные / требуемые файлы.

Комментарии:

1. Нет, я убедился, что это не так. Имейте в виду, я могу установить переменную сеанса в строку, поэтому я знаю, что она не перезаписывается. Это что-то не так с комбинацией переноса опубликованной строки на предыдущую страницу, которая является моей проблемой.

2. Я отредактировал свой ответ, чтобы он содержал шаги по устранению неполадок, которые я бы предпринял, чтобы найти вашу проблему