2013-03-04 113 views
2

我想在我的管理員登錄面板中更改會話ID &會話ID。 在我的管理面板中,Cookie設置爲僅限於會話名稱和會話ID更改時未設置

我的問題是會話沒有設置。是有一個與我的代碼的任何問題 請幫

代碼 的index.php

<?php 
session_name("websitename");//session name changed 
if (session_start()) { 
    session_regenerate_id(true);//session id changed 
    //$sess_name=session_name(); 
    setcookie("websitename", session_id(), null, '/', null, null, true);//set cookie httponly 
} 

$_SESSION['admin']="login"; 
header("Location: home.php"); 
?> 

...................... .................................................. ...................

home.php

<?php 
session_start(); 
if(!isset($_SESSION['admin'])) 
echo "you are logout"; 
else 
echo "you are in home"; 
?> 

的現場打印 '你註銷'

+2

會話命名的想法是將會話彼此分開(大多數情況下,當您運行兩臺或多臺在一臺機器上使用會話的項目時)。所以名稱爲'name1'的會話不會與名稱爲'name2'的會話共享任何信息。 – Leri 2013-03-04 07:28:07

回答

5

簡短的回答是插入行: session_name(「websitename」);作爲home.php的第一行

爲什麼?對於那些發現自己試圖瞭解PHP中session_name和session_id之間區別的人,我提供以下解釋:

您的會話數據位於我將稱之爲PHP服務器上的「數據存儲區」的位置。通常它是一個磁盤文件,但它也可能是一個數據庫,這取決於PHP和應用程序在您的特定服務器上的實現方式(PHP允許應用程序在本地提供的會話存儲空間上運行)。在形成「衣衫襤褸的數組」的。

衣衫襤褸的陣列使用的關鍵是每個會話唯一存儲在數據存儲中。

要想從數據存儲中的會話數據到你的PHP腳本,你必須具有所需會話的正確密鑰。

在索引中會發生什麼在上面的示例代碼中的.php是:

  1. 你做一個session_name();它告訴PHP不要使用默認會話名稱(PHPSESSID)來訪問cookie數據,而是使用網站名稱
  2. 你做一個session_start(); PHP會查找具有關鍵「網站」名稱的瀏覽器發送的cookie。它沒有找到一個,因此它通過生成一個隨機會話ID(讓我們稱之爲「A1」;它創建一個新的會話;它將新會話ID存儲在一個cookie中,其密鑰爲「websitename」;它將會話數據初始化爲一個空的數組(如果你做了$ _SESSION = array();)
  3. 你有一個if語句來檢查會話是否開始,你使用這種方式很奇怪。重做大部分會話開始只是爲你做的(除了初始化數組),然後讓我們假設新的重新生成的會話標識爲「B2」。但是,然後你再次執行並執行另外兩個語句如果會話沒有開始,如果會話沒有開始設置$ _SESSION中的管理密鑰是毫無意義的,因爲重定向到home.php,這取決於會話被index.php成功初始化。如果會話啓動失敗,則記錄一個消息對系統管理員或你自己的網站配置不正確。如果該站點配置了會話,則會話啓動將始終返回true。
  4. 現在,通過將會話變量設置爲超級全局數組$ _SESSION的元素,將密鑰「admin」的會話變量設置爲「login」的值。
  5. 當您瀏覽index.php的底部(退出它)時,PHP會使用cookie中的鍵(即,其他腳本可以找到的「B2」)將$ _SESSION數組的當前內容寫入數據存儲區它,存儲到數據存儲USNG鍵「B2」的會話數據是$ _SESSION陣列與關鍵「管理員」和價值的單個元素「登錄」

當您檢查,在家裏你的代碼。我相信這是發生了什麼:

  1. 你做一個session_start()。因爲你沒有做一個事先session_name(),PHP使用默認名稱PHPSESSID。從瀏覽器發送的cookie與會話名稱(PHPSESSID)的密鑰一起發送,並且沒有找到。所以它創建了一個新的會話。它爲會話生成一個新的隨機會話ID,我們稱之爲「C3」;它將會話數據($ _SESSION)初始化爲一個空數組,並使用PHPSESSID鍵和爲會話創建的隨機會話標識(「C3」)創建一個cookie。
  2. 你做一個if/else檢查會話數據是否有一個鍵爲'admin'的元素。會話數組爲空,所以if else選擇假分支並打印用戶未登錄。

由於index.php中的「if」,您的代碼比這更復雜,但爲了簡化問題:

您使用密鑰「B2」將您的管理員值存儲在會話數據存儲中,然後在home.php中用鍵「C3」查找並找不到它。這是因爲您在index.php中使用了「websitename」的會話名稱,但您在home.php中使用了「PHPSESSIONID」的會話名稱。如果您使用Chrome開發人員工具的資源選項卡查看cookie,則會看到「websitename」和「PHPSESSIONID」的cookie。在開發人員工具中,Cookie將顯示真實的隨機會話ID(26個字符),而不是我爲本次討論製作的兩個字符會話ID。

+0

這是我見過的最好的答案之一。 – shan 2015-07-01 02:54:16