2013-02-11 4 views
1

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

код (упрощенный):

<?php 
session_start(); 

if (!$_SESSION["companyid"]) { 

header("location: http://www.somepage.com"); 

} 

mysql_connect("localhost", "name", "password") or die(mysql_error()); 
mysql_select_db("database") or die(mysql_error()); 

$companyid = $_SESSION["companyid"]; 

$_SESSION["youtubeurl"] = mysql_real_escape_string($_POST["youtubeurl"]); 
$_SESSION["logourl"] = mysql_real_escape_string($_POST["logourl"]); 

$_SESSION["plan1head"] = mysql_real_escape_string($_POST["plan1head"]); 
$_SESSION["plan1description"] = mysql_real_escape_string($_POST["plan1description"]); 
$_SESSION["plan1headline1"] = mysql_real_escape_string($_POST["plan1headline1"]); 
$_SESSION["plan1price1"] = mysql_real_escape_string($_POST["plan1price1"]); 
$_SESSION["plan1headline2"] = mysql_real_escape_string($_POST["plan1headline2"]); 
$_SESSION["plan1price2"] = mysql_real_escape_string($_POST["plan1price2"]); 
$_SESSION["plan1price1type"] = mysql_real_escape_string($_POST["plan1price1type"]); 
$_SESSION["plan1price2type"] = mysql_real_escape_string($_POST["plan1price2type"]); 

if(isset($_POST["submitpreview"])) { 

$companyid = $_SESSION["companyid"]; 

$youtubeurl = $_SESSION["youtubeurl"]; 
$logourl = $_SESSION["logourl"]; 
$plan1head = $_SESSION["plan1head"]; 
$plan1description = $_SESSION["plan1description"]; 
$plan1headline1 = $_SESSION["plan1headline1"]; 
$plan1price1 = $_SESSION["plan1price1"]; 
$plan1headline2 = $_SESSION["plan1headline2"]; 
$plan1price2 = $_SESSION["plan1price2"]; 
$plan1price1type = $_SESSION["plan1price1type"]; 
$plan1price2type = $_SESSION["plan1price2type"]; 

} 

?> 

Теперь есть три страницы/случаи, связанные с этим:

  1. страницы с формами, которые проходят переменные на странице просмотра
  2. Просмотр страницы
  3. Представленная страница предварительного просмотра (значение страницы обновляется)

У человека есть своя страница, заполненная различными текстовыми полями и раскрывающимися меню (стр. 1). Они могут обновлять эту страницу, и когда они заполняют форму для этого и представляют ее, эти переменные передаются на страницу предварительного просмотра. Если им нравится страница предварительного просмотра, подтверждающая ее (отправка формы, которая выполняет «submitpreview»).

Вот моя проблема: все переменные сеанса, заполняемые формой (все, кроме идентификатора компании, которое хранится в сеансе при первом входе в систему), сразу же сбрасываются в переменную сеанса. Я повторил эти переменные сеанса в нижней части страницы предварительного просмотра (просто чтобы подтвердить, что они не пусты в этот момент времени), и их содержимое будет эхом отозвано, когда я доберусь до страницы предварительного просмотра. Тем не менее, когда пользователь подтверждает изменения, и установлен параметр submitpreview, внезапно эти переменные сеанса пусты. То есть все переменные сеанса, заполненные переменными формы, пусты. Переменные сеанса, которые были эхом отредактированы только до обновления страницы, исчезли за исключением переменной companyid. Поскольку переменная сеанса companyid все еще прекрасна, я знаю, что (1) сеансы на моем сервере должны работать правильно, и (2) проблема заключается в том, что код либо загружает переменные формы в сеансы, либо извлекает эти переменные. Любые теории относительно того, почему это может произойти?

Это меня очень расстроило. Я ценю ваше терпение со мной по этому вопросу и ценю любую помощь, которая предоставляется.

+2

Добро пожаловать в переполнение стека! Пожалуйста, не используйте функции 'mysql_ *' для написания нового кода. Они больше не поддерживаются, и сообщество начало процесс [устаревания] (http://news.php.net/php.internals/53799). См. [Красная рамка] (http://uk.php.net/manual/en/function.mysql-connect.php)? Вместо этого вы должны узнать о [подготовленных заявлениях] (http: //en.wikipedia.org/wiki/Prepared_statement) и используйте либо [PDO] (http://php.net/pdo), либо [MySQLi] (http://php.net/mysqli). Если вы выберете PDO [здесь хороший учебник] (http://wiki.hashphp.org/PDO_Tutorial_for_MySQL_Developers). – War10ck

+0

- session_start(); существуют на всех страницах? вы пытались print_r ($ _ SESSION), когда сеансы исчезают? – 2013-02-11 20:08:08

+0

Когда я это делаю, он дает мне следующее: (У меня это напечатано после установки предварительного просмотра). Массив ([youtubeurl] => [logourl] => [plan1head] => [plan1description] => [plan1headline1] => [plan1price1] => [plan1headline2] => [plan1price2] => [companyid] => 7. И yes, session_start() находится в начале всех моих страниц. –

ответ

0

Понял, думал, что поделюсь.

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

+0

Да, вам нужно проверить, как и где сеанс [идентификатор компании] получает значение, чтобы использовать другое, где – Shridhar

0

Проблема, как описано в ответе Pete_1s, вызвана register_globals. Это приводит к смешению разных переменных с равными именами. Это:

foreach ($_SESSION AS $name -> $value) { 
    unset ($_GLOBALS[$name]); 
} 
foreach ($_POST AS $name -> $value) { 
    unset ($_GLOBALS[$name]); 
} 
foreach ($_GET AS $name -> $value) { 
    unset ($_GLOBALS[$name]); 
} 

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

Смежные вопросы