功能的主要意思是不允許超級管理員同時登錄,如果管理員登錄時已經有其他管理員登陸了,則提示“您已通過其他瀏覽器登錄,請退出后再登陸或者強制下線”,如果點擊“強制下線”則進入后台管理中心,而以前登錄的管理員下線。
強制下線的功能就是比如說QQ中你的賬號被知道你賬號的人擠下去了,你重新登錄,又被擠下去,。
下面總結一下我開始做個功能的實現思路,首先肯定是圍繞SESSION來進行,當A管理登錄時,接受到A的SESSION信息,當B管理使用同一賬號登錄時,消除A,而讓B進行操作,A給出提示並退出。
下面先為講解幾個函數,理解這幾個函數對實現這個功能很有幫助:
file_put_contents(file,data,mode,context):函數功能,把一個字符串寫入文件中 file:規定要寫入數據的文件,如果文件不存在,則創建一個新文件。data:規定要寫入文件的數據,mode,context:分別代表規定如何寫入文件,以及規定文件句柄環境,這倆個暫時不用,了解即可。
file_get_contents() :函數功能,把整個文件讀入一個字符串中,與file_put_contents還是有所區別的。
unset():是注銷定義的變量。
session_id():存取目前 session 代號。本函數可取得或者重新配置目前存放 Session 的代號。若無參數 id 則表示只有取得目前 Session 的代號,加上參數則表示將 Session 代號設成新指定的 id。輸入及返回均為字符串。
session_id()就是你在不同瀏覽器輸出都會生成不同的字符串,用以區分。
下面展示部分代碼
//首先是登錄提交到的方法
public function index(){
$user= M ("表");
$adminname=$_POST['接收用戶名'];
$adminpwd=md5($_POST['接收密碼']);
$arr=$user->where("數據庫name='$adminname'")->find();
$id=$arr['數據庫id'];
if($arr){
if($arr['password']==$adminpwd){
//在數據庫中添加loginstatus字段,1為已登錄狀態,0為未登錄狀態
///B管理登錄則loginstatus已經為1,進入↓
if($arr['loginstatus']==1){
echo 用戶已登錄!是否強制下線? 《a href='/XX/xx/xx?name=".$adminname."'> 是 《/a》 《a href='/XX/XX/xx'》 否 《/a》;
}
else{
//開啟session,設定各項值
session_start();
session("name",$adminname);
session("time",time());
session('u_id',$arr['ma_id']);
$session_id=session_id();
//存入文件,若無filename文件夾,系統自動生成
file_put_contents("filename",$session_id);
$datar['loginstatus']=1;
//使數據庫記錄當前狀態
$ls=$user->where("ma_id='$id'")->save($datar);
echo 《script》alert('登錄成功!');location.href='/admin.php/Index/index';《/script》; } }else{ echo 《script》alert('密碼錯誤');location.href='/admin.php/Admin/index';《/script》; } }else{ echo 《script》alert('用戶名錯誤');location.href='/admin.php/Admin/index';《/script》;
}
}
//到此,“第一個管理員”已經成功登錄,並且數據庫狀態字段為1,session各項值都已生成
//這時如果B管理登錄,則進入上面紫色流程,轉入B方法↓
public function B(){
$user= M ("表");
$adminname=$_GET['通過地址欄傳過來的name'];
$arr=$user->where("數據庫name='$adminname'")->find();
$id=$arr['數據庫id'];
$session_id=session_id();
//存入文件
file_put_contents("filename",$session_id);
//這時又新生成了filename,A管理登錄時生成的filename被替換
session("name",$adminname);
session("time",time());
session('u_id',$arr['ma_id']);
//因為A登錄時數據庫中判定狀態的loginstatus已為1,所以不需要更新
echo "}
//此時B已登錄,並且替換的A登錄時生成的有關數據,使A操作時先執行的公共文件不允許執行,A進行的操作頁面無效,從而把A擠下去,
//公共文件部分
public function __construct()
{
parent::__Construct();
if(empty($_SESSION['name']))
{
echo 《script》alert('未登錄,請先登錄!');top.location.href='/admin.php/Admin/index';《/script》;
}
else{
//取到系統此時的session_id
$session_id=file_get_contents("filename",$session_id);
//進行對比,如果判斷到B的session_id,則清除A的session_name,導致A不能進行操作
if(session_id()!=$session_id){
unset($_SESSION['name']);
echo 《script》alert('異地登陸!');top.location.href='/admin.php/Admin/index';《/script》;
}
}
}