2011-10-12 172 views
2

我在開發機器上使用php5和apache2。生產服務器顯然是相似的。php會話變量丟失

我有一個創建一個會話變量腳本set_language.php根據所選擇的語言:

<?php 
session_start(); 
$back = $_SERVER['HTTP_REFERER']; 

    if (isset($_GET['lang'])) { 
      if ($_GET['lang'] == 'fr') 
      $_SESSION['lang'] = 'fr'; 
     else if ($_GET['lang'] == 'en') 
      $_SESSION['lang'] = 'en'; 
    } 
    header("Location: $back") ; 
    exit(); 
?> 

然後我舉出以下的所有網頁上的代碼:

session_start(); 
if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'en') { 
    require('lang_en.php'); 
} 
else if(isset($_SESSION['lang']) && $_SESSION['lang'] == 'fr') { 
require('lang_fr.php'); 
} 

比我能得到語言相關變量與:

echo $lang[sometexttotranslate]; 

在開發服務器上它的工作方式與預期一樣編輯。我點擊鏈接來設置語言和我的會話變量包含LANG = EN或FR

在生產服務器上:

$ _SESSION [ '郎'] = DN博士(應該是EN或FR)

回聲$ LANG [sometexttotranslate] = d(應該是翻譯的文字)

任何想法,在 「d」 的從何而來?

這不是重定向/頭/ session_start()問題。


的print_r($ _ SESSION)上第一負載:

英語鏈路(set_lang上的點擊後陣列([郎] => FR)

的print_r($ _ SESSION)。以上PHP):

陣列([郎] => DN)

的print_r($ _ SESSION)AFTE法國鏈路上RA單擊(上述set_lang.php):

陣列

的print_r($ _ SESSION)登錄後([郎] => DR):

陣列([郎] =>博士[有效] => 1 [僞] => GYC [UID] => 3)

+0

嗯...炒位... –

+0

@Ignacio我不知道在這個問題的背景是什麼,但我完全同意。油炸鬆脆的零食是美味的,應該是每種美食的基礎。 –

+0

print_r會話顯示什麼,也許會比較會話ID。 – Melsi

回答

5

現在,這是什麼,

print_r($_SESSION) after a click on the english link (set_lang.php above): 

Array ([lang] => dn) 

你的問題從set_lang.php開始。 也許會話是從包含的文件開始的,這不應該發生!

如果不包括set_lang確保一個start_session存在那裏,也把print_r的那裏,你甚至可以比較會話ID太:

讓我們說這是指數。PHP

<?php 
session_start(); 
?> 
<a href='set_lang.php?sess=<?PHP echo session_id();?>'>lang</a> 

這set_lang.php

<?PHP 
session_start(); 
echo 'this is session id from index.php: ',$_GET['sess'], 
'and this is session id in set_lang.php:',session_id(), 
'and this is the print_r:<br><pre>'; 
print_r($_SESSION); 
?> 

你應該看到相同的會話ID。

但是,儘管這一切可能會幫助你,我將採取這一步,使用單一的入口點,不要直接調用PHP腳本這樣

<a href=somescript.php>link</a> 

(除非你正在做一些Ajax),而不是你總是通過調用一些index.php的PHP腳本是這樣的:

<a href=index.php?target=somescript.php>link</a> 

這種方式,您將在index.php文件放置只有一次會話開始,登錄檢查可以在index.php中完成了。

=======================編輯更多信息添加=================== ====================== 快速谷歌搜索發現..這個小單次入境教程http://www.renownedmedia.com/blog/php-navigation-system-using-single-entry-point/有可能是更好的。

更好的是,它將切換到mvc框架(包括單入口點哲學),但由於學習曲線更陡峭,至少從單一入口點開始。

============重新編輯的詳細信息再次添加============================ ============== 一個很好的選項,然後將再次複製這一問題,但你的項目背景下,承擔儘可能少的代碼從您的項目在新創建的文件,並嘗試建立問題再次出現。保持儘可能簡單,只是嘗試創建錯誤再次

+0

謝謝,但問題並非來自我的網站的結構。一切工作在php5.3.3的開發服務器上,但生產服務器有php5.2.6我不認爲這兩個版本之間的會話處理有變化。在我的會話名稱中插入'd'的地方有一個錯誤,但我無法確定在哪裏。兩個服務器上的代碼都完全相同。 –

+0

謝謝。我用幾行代碼重現了這個問題。 (我接受你的答案)。請看看這個問題http://stackoverflow.com/questions/7749060/php-session-variables-change-with-file-include –