2013-02-27 88 views
1

我有這個問題,或者我不知道它是如何工作的概念工作,我已經登錄了記得functionallity。 我保存在cookie中,如果用戶檢查,所以當他再次進入該網頁可以直接訪問到主,而不是再次登錄.. 的問題是,當用戶正常登錄,我在會話保存一些信息,但是當用戶擁有rembmber的cookie並直接進入而沒有在網站登錄時會發生什麼?我失去了會議信息..我必須做什麼?與會話和餅乾

我希望你不明白評論,我解釋好,感謝您的時間!

+0

你必須檢查用戶如何進來,並恢復任何丟失的會話數​​據。 – 2013-02-27 21:47:11

+0

爲什麼使用會話?您只能使用** COOKIE **和數據庫中的用戶表。 - 您可以在N次'setcookie(「username」,「blanked」,time() - 3600 * 25,'/'); – 2013-02-27 21:50:36

回答

0

我假設你在會話中存儲的信息數據與用戶,而這又掏出某處的數據庫?如果是這種情況,那麼我推薦的解決方案是這樣的:

當用戶選擇記住我選項時,您設置的cookie需要包含一個值,該值允許您在數據庫中再次找到同一用戶,這樣您可以按照您通過登錄時提供的憑據找到該用戶的相同方式來實例化其會話。這很誘人(但不安全),以簡單的方式做到這一點,並簡單地存儲用戶信息的唯一數據庫ID,但不要這樣做!

相反,創建一個名爲會話表,包含三列:USER_ID,SESSION_ID,的expire_time。當用戶登錄時,將「記住我」位設置爲true,您將存儲他們的用戶ID,會話ID(可通過調用session_id()函數獲得)以及您希望'記住'會話過期。

當你自己的數據添加到您的會話的用戶日誌,你可以調用一個類似的功能:

<?php 
    function persist_session(){ 
    $user_id  = $_SESSION['user']->id; 
    $session_id = session_id(); 
    $expire_time = time() + (60 * 60) * 24; // 24 hours 
    $sql   = "INSERT INTO sessions (user_id, session_id, expire_time), VALUES ($user_id, $session_id, $expire_time)"; 
    mysqli_query($sql); // This assuming you've already set up your DB connection and so on 
    $_COOKIE['session_id'] = $session_id; // Write the persisted session ID to a cookie 
    } 
?> 

這不是一個非常完整的例子。首先,你需要編寫一些代碼,以確保沒有一次用戶有一次以上的會話持續到表中,但這很容易......

一旦你保存了會話信息和它寫入供以後參考一個cookie,從cookie找回用戶信息非常簡單:

<?php 
    function reinstantiate_session(){ 
     if(isset($_COOKIE['session_id')){ 
     $session_info = mysqli_fetch_object(mysqli_query("SELECT * FROM sessions WHERE session_id = '{$_COOKIE[session_id]}'")); 
     if($session_info){ 
      $_SESSION['user_id'] = $session_info->user_id; 
     } 
     } 
    } 
?> 

同樣,這個例子是不是完整的,因爲它可能是,你會需要處理錯誤,尤其是,您可能需要更新您的查找SQL以排除過期信息,但這應該足以讓您開始!