最近開發PHP+Codeigniter架構的網站發生奇怪的問題。
其中一段程式碼 :
$this->session->set_userdata("message",$msg);
redirect($prev_page);
上述程式碼執行到redirect(重導)到另一個網頁,就發現登入者自動被登出。
經過一番測試,終於發現問題在哪裡了。
我系統的設計是 :
1. 用Session儲存使用者登入的資訊(如下列),系統各個頁面會根據此登入資訊判斷是否處於登入狀態。
$this->session->set_userdata("username",$username); // $username為認證通過的用戶帳號
$this->session->set_userdata("username",$username); // $username為認證通過的用戶帳號
***** 因此,顯然上面的問題是Session中使用者登入資訊已經消失了。*****
2. 用Session儲存訊息,如上面的$this->session->set_userdata("message",$msg); 重導到另一個網頁時,再讀出此資料顯示在頁面上,如$message = $this->session->userdata("message");。
原因為 :
$this->session->set_userdata("message",$msg);
$this->session->set_userdata("message",$msg);
這行程式的$msg變數中包含Big5中文編碼的文字,
而Codeigniter系統設定application/config/config.php中預設編碼為UTF-8
$config['charset'] = "UTF-8";
因此,造成Session資料的消失,只要將上面$msg轉換為UTF-8編碼格式就不會有問題了。
-- Fred F.M. Wang
參考 : 網路上其他類似的問題與Session data lost可能的原因