2013-02-11 72 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. 形式
  4. 已提交預覽頁面(意思是刷新頁面)

一個人有自己的頁面,裏面填充了各種文本字段和下拉菜單(第1頁)。他們可以更新這個頁面,當他們填寫表單來完成並提交時,這些變量會被傳遞到預覽頁面上。如果他們喜歡預覽頁面,則確認它(提交執行「submitpreview」的表單)。

這是我的問題:所有由窗體填充的會話變量(除了公司ID,它們在第一次登錄時存儲在會話中)都會立即轉儲到會話變量中。我在預覽頁面的底部回顯了那些會話變量(只是爲了確認它們在此時不是空的),當我進入預覽頁面時,它們的內容會被適當地回顯。但是,當用戶確認更改並設置了submitpreview時,突然那些會話變量爲空。也就是說,由表單變量填充的所有會話變量都是空的。在頁面刷新前恢復出來的會話變量除了companyid變量外都沒有了。因爲companyid會話變量仍然很好,所以我知道(1)我的服務器上的會話必須正常工作,(2)問題在於將表單變量轉儲到會話中或檢索這些變量的代碼。任何有關爲什麼會發生這種情況的理論?

這讓我非常沮喪。感謝您在這個問題上對我的耐心,並感謝您給予的任何幫助。

+2

歡迎來到Stack Overflow!請不要使用'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 2013-02-11 20:07:53

+0

是session_start();存在於所有頁面上?當會話消失時,您是否嘗試過print_r($ _ SESSION)? – 2013-02-11 20:08:08

+0

當我這樣做時,它給了我這個:(我預先設置了預覽提交後打印了這個)。 Array([youtubeurl] => [logourl] => [plan1head] => [plan1description] => [plan1headline1] => [plan1price1] => [plan1headline2] => [plan1price2] => [companyid] => 7.是的,session_start()在我所有頁面的開頭。 – 2013-02-11 20:12:57

回答

0

想通了,以爲我會分享。

在類似這樣的情況下,如果您的會話變量等於刷新頁面上的變量後,您必須小心。當我的預覽頁面刷新時,post變量(因爲它們不再存在)變空了,它覆蓋了我以前保存的會話變量的信息,並反過來使這些會話變量爲空。我必須相應地調整我的代碼來解決這個問題。

+0

是的,你需要檢查會話[公司ID]如何獲得價值以便使用其他地方 – Shridhar 2013-02-11 21:36:43

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的手段。