2015-07-13 72 views
0

我遇到了一些問題,刪除一個php會話,我登錄時在我正在工作的網站上創建。首先這裏是我如何試圖破壞所述會話:PHP會話沒有完全刪除

在index.php頁面上有一個註銷按鈕,如果某些php代碼檢測到存在會話,則會顯示該按鈕。在調用此阿賈克斯獲得致電:

 function logout() 
     { 
      var UName = "<?php echo $_SESSION['Username']; ?>"; 

      //alert(UName); 

      $.ajax(
      { 
       url: "php/logout.php", 
       type: "get", 
       success: function(jsonstr) 
       { 
        onSuccess(jsonstr); 
       }, 
       error: function(XMLHttpRequest, textStatus, errorThrown) 
       { 
        alert("Status: " + textStatus); 
        alert("Error: " + errorThrown); 
       } 
      }); 
     } 

這就要求它有這個代碼在它logout.php文件:

<?PHP 
header('Content-Type: application/json'); 
include_once 'login_functions.php'; 
include_once 'logout_functions.php'; 

sec_session_start(); 

$returnedData = logout($_SESSION['Username']); 

//echo $returnedData."\n"; 

if ($returnedData === "true") 
{ 
    if (isset($_COOKIE[session_name()])) 
    { 
     setcookie(session_name(), 「」, time()-3600, 「/」); 
    } 

    $_SESSION = array(); 

    session_destroy(); 
    $_SESSION = NULL; 

    $data = array("loggedout" => "true"); 
    echo json_encode($data); 
    exit(); 
} 

else 
{ 
    $data = array("loggedout" => array("false" => $returnedData)); 
    echo json_encode($data); 
} 
?> 

註銷($用戶名)的調用只是調用該刪除功能一些與用戶會話相關的數據庫存儲值。如果它返回true,那麼將調用會話刪除代碼,並且在返回到index.php文件後提醒用戶它們正在註銷。

以防萬一它是相關的,這裏是我正在創建與sec_start_session()會議:

function sec_session_start() 
{ 
    $session_name = 'sec_session_id'; 
    $secure = secure; 
    $httponly = true; //Keep Javascript from obtaining any cookie information 

    //echo "Function: start_sec_session \n"; //For debugging 

    //Force use of cookies 
    if (ini_set('session.use_only_cookies', 1) === FALSE) 
    { 
    } 

    $cookieParams = session_get_cookie_params();//Set session cookie paramaters 

    session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"],$secure,$httponly); //Set the parameters 

    session_name($session_name); //Change the session name 

    session_start(); //Start the session 

    session_regenerate_id(); //Recreates the session, deletes the old one, and generates a new encryption key 
} 

現在,這裏的問題。每當我從管理頁面調用以下代碼片段時,session_status()函數總是返回值2,即session_active。

<?php else :?> 
     <div class="row"> 
      <div class="col-xs-12"> 
       <div class="panel panel-default"> 
        <div class="panel-heading"> 
          Protected Page! <?php echo session_status(); ?> 
        </div> 

我有檢測是否存在針對用戶的會話,因爲我存儲在我的數據庫中的一些時間戳處理超時,但這個問題可能會在某個地方會導致一些問題的道路的另一種方式,我想也最小化我必須調用數據庫的次數。

我已經閱讀遍佈重載頁面的地方,一旦會話被銷燬,並且刪除的cookie應該騰出會話值,但這似乎並沒有發生在這裏。實際上有兩個頁面重新加載。

else if (rD[0] === "loggedout") 
{ 
    if (rD[1] === "true") 
    { 
     alert("You have now been logged out. The page will now reload. Please come again!"); 

     window.location.reload(); 
    } 

    else 
    { 
     document.getElementById("errpanel").style.visibility = "visible"; 
     document.getElementById("errmsg").textContent = rD[2]; 
    } 
} 

第二重裝,如果它可以被稱爲重載,發生在我去管理頁面,因爲我沒有直接鏈接到它:用戶被警告被註銷後,第一個是正確的當被列爲管理員的人沒有登錄(該鏈接無論如何都不會顯示在index.php頁面上)並且到達那裏時,我只是直接在地址欄中輸入網址。 session_status()在我關閉Waterfox並重新打開後返回2。

+1

[why session \ _destroy()not working](http:// stackoverflow。com/questions/6472123/why-session-destroy-not-working) –

回答

0

使用session_destroy()後,會話cookie被銷燬並刪除。會話不再存儲在服務器上。 $ _SESSION中的值可能仍然可用,但它們不會在下一頁加載。

Have a look here有關更多討論。

+0

我在原始文章中引用的管理頁面無法直接轉到地址欄中獲取。這是否構成頁面重新加載?如果是這樣,那麼由於某種原因會話值仍然存在。在通知用戶他們已經登錄到索引頁面後,我也直接重新加載頁面。 – Geowil

0

在將我的頭撞向牆壁一天半之後,我決定從頭開始重新構建會話管理系統,因爲它如何實現會導致我無法解決的問題。

0

您應該只使用unset$_SESSION中刪除值。

if(isset($_SESSION)) { 
    unset($_SESSION); 
    session_destroy(); 
} 
+0

我嘗試了一切,我可以找到關於這個主題,包括這個,並沒有工作。總會有數據在服務器上的某個地方留下,或者至少根據session_status()。無論我如何嘗試銷燬會話並刪除變量,它永遠不會返回1,總是2。 – Geowil

+0

@Geowil你有沒有嘗試對你的登錄的特定元素使用'unset'?像'unset($ _ SESSION ['login']);' – Killrawr