Странная ошибка 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.

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

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

 $_SESSION["rn"] = $retailerName;

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

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

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

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

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

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

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

Страница 1 Pastebin

Страница 2 Pastebin


php
person AKor    schedule 05.05.2011    source источник


Ответы (4)


Ты забыл

session_start();

На вершине вашего PHP (или рядом с ней)?

Атрибуту формы type присвоено значение POST?

person Ry-♦    schedule 05.05.2011
comment
Нет, я могу передавать строки в переменной сеанса. - person AKor; 06.05.2011
comment
Я знаю, но я предположил, что, возможно, в своем тесте вы создали другую страницу. Прости. - person Ry-♦; 06.05.2011
comment
Да, это ПОСТ. Я использовал $_REQUEST заранее, и переход на POST не улучшил ситуацию. Переменные проходят правильно; Я могу вывести все опубликованные переменные на странице 2. - person AKor; 06.05.2011
comment
Нет опечатки, я сократил имена переменных, в моем коде есть 'rn'. - person AKor; 06.05.2011

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

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

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

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

person Joshua - Pendo    schedule 05.05.2011
comment
Все переменные сеанса, которые я пытаюсь передать, равны NULL. - person AKor; 06.05.2011
comment
и нет никаких шансов, что на странице 1 все переменные будут сброшены в NULL? - person Joshua - Pendo; 06.05.2011
comment
Нет, только те переменные, которые я пытаюсь передать. Остальные в порядке. - person AKor; 06.05.2011
comment
Не могли бы вы добавить полный код со страницы 1 и 2 в pastebin? Кажется действительно странным, что это не работает, если ни одна из указанных возможных ошибок не имеет места. - person Joshua - Pendo; 06.05.2011
comment
странно.. а что происходит, когда вы переключаетесь со страницы 1 обратно на страницу 2, в сессии есть правильные ключи тогда? - person Joshua - Pendo; 06.05.2011

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

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

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

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

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

person Sabeen Malik    schedule 05.05.2011

У вас есть такой же код в верхней части вашей страницы 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 в вашем браузере. Ваши значения установлены равными нулю? Снова заполните форму на странице 1 и опубликуйте ее на странице 2. Показываются ли на странице 2 значения вашей формы? Возможно, значения формы неправильно передаются на страницу 2.

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

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

person Jonathan Mayhak    schedule 05.05.2011
comment
Нет, я убедился, что это не так. Имейте в виду, я могу установить переменную сеанса в строку, поэтому я знаю, что она не перезаписывается. Что-то не так с комбинацией переноса опубликованной строки на предыдущую страницу, что является моей проблемой. - person AKor; 06.05.2011
comment
Я отредактировал свой ответ, чтобы он содержал шаги по устранению неполадок, которые я предприму, чтобы найти вашу проблему. - person Jonathan Mayhak; 06.05.2011