如何利用PHP會話顯示出當前在線的用戶,在PHP中session的用法。
綜述
PHP會話即SESSION是指用戶從進入網站到關閉網站這段時間內活動的一種機制,它提供了全部網頁都共同使 用的公共變量存貯機制。那麼SESSION到底有什麼用處呢?網上購物時你們都用過購物車,你能夠隨時把你選購的商品加入到購物車中,最後再去收銀臺結 賬。在整個過程當中購物車一直扮演着臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動狀況,這就是SESSION的做用。
八種PHP常見文件操做方式
SESSION的發明填補了HTTP協議的侷限,HTTP協議被認爲是無狀態協議,當它在服務端完成響應以後,服務器就失去了與該瀏覽器的聯繫。會話的發明使得一個用戶在多個頁面間切換時可以保存他的信息。
在PHP3版本未直接提供session功能,咱們只能用其它辦法來實現,好比用PHPLIB。若是說PHP4與PHP3相比,它最大的進步就是提供了SESSION。
Session基礎知識
要使用session須要PHP4.1以上的版本,並且須要把php.ini中的register_globle=Off設成register_globle=On。另外,session.cookie_path = / 這行不易更改。
PHP中的session默認狀況下是使用客戶端的Cookie。當客戶端的Cookie被禁用時,會自動經過Query_String來傳遞。
Php處理會話的函數一共有11個,咱們詳細介紹一下將要用到幾個函數。
一、 session_start
函數功能:開始一個會話或者返回已經存在的會話。
函數原型:boolean session_start(void);
返回值:布爾值
功能說明:這個函數沒有參數,且返回值均爲true。最好將這個函數置於最早,並且在它以前不能有任何輸出,否 則會報警,如:Warning: Cannot send session cache limiter - headers already sent (output started at /usr/local/apache/htdocs/cga/member/1.php:2) in /usr/local/apache/htdocs/cga/member/1.php on line 3
二、 session_register
函數功能:登記一個新的變量爲會話變量
函數原型:boolean session_register(string name);
返回值:布爾值。
功能說明:這個函數是在全局變量中增長一個變量到當前的SESSION中,參數name就是想要加入的變量名,成功則返回邏輯值true。能夠用_SESSION[name]或HTTP_SESSION_VARS[name]的形式來取值或賦值。
三、 session_is_registered
函數功能:檢查變量是否被登記爲會話變量。
函數原型:boobean session_is_registered(string name);
返回值:布爾值
功能說明:這個函數可檢查當前的session之中是否已有指定的變量註冊,參數name就是要檢查的變量名。成功則返回邏輯值true。
四、 session_unregister
函數功能:刪除已註冊的變量。
函數原型:boolean session_session_unregister(string name);
返回值:布爾值
功能說明:這個函數在當前的session之中刪除全局變量中的變量。參數name就是欲刪除的變量名,成功則返回true.
五、 Session_destroy
函數功能:結束當前的會話,並清空會話中的全部資源。
函數原型:boolean session destroy(void);
返回值:布爾值。
功能說明:這個函數結束當前的session,此函數沒有參數,且返回值均爲true
上面介紹函數下文將會用到,但還有一些有關session的函數也介紹一下:
六、 session_encode
函數功能:sesssion信息編碼
函數原型:string session_encode(void);
返回值:字符串
功能說明:返回的字符串中包含全局變量中各變量的名稱與值,形式如:a|s:12:"it is a test";c|s:4:"lala"; a是變量名 s:12表明變量a的值"it is a test的長度是12 變量間用分號」;」分隔。
七、 session_decode
函數功能:sesssion信息解碼
函數原型:boolean session_decode (string data)
返回值:布爾值
功能說明:這個函數可將session信息解碼,成功則返回邏輯值true
八、 session_name
函數功能:存取當前會話名稱
函數原型:boolean session_name(string [name]);
返回值:字符串
功能說明:這個函數可取得或從新設置當前session的名稱。若無參數name則表示獲取當前session名稱,加上參數則表示將session名稱設爲參數name
九、 session_id
函數功能:存取當前會話標識號
函數原型:boolean session_id(string [id]);
返回值:字符串
功能說明:這個函數可取得或從新設置當前存放session的標識號。若無參數id則表示只獲取當前session的標識號,加上參數則表示將session的標識號設成新指定的id
十、 session_unset
函數功能:刪除全部已註冊的變量。
函數原型:void session_unset (void)
返回值:布爾值
功能說明:這個函數和Session_destroy不一樣,它不結束會話。就如同用函數session_unregister逐一註銷掉全部的會話變量。
編程思路
在社區、論壇中,咱們常能看到當前在線的會員,使訪問者有賓至如歸之感。但這種程序是怎麼作出來的呢?
流程以下:
建表user,保存註冊用戶信息。
字段
|
類型
|
備註
|
userid
|
Int(10)
|
用戶序列號 auto_increment 關鍵字
|
username
|
Varchar(50)
|
用戶匿稱
|
userpwd
|
Varchar(50)
|
密碼
|
email
|
Varchar(50)
|
電子信箱
|
oicq
|
Varchar(50)
|
OICQ號
|
signature
|
mediumtext
|
簽名
|
imgurl
|
Varchar(50)
|
頭像
|
joindate
|
Varchar(50)
|
加入時間
|
建類文件user.php 定義函數
exist(username)確認新註冊用戶是否是已經存在
nsert(username,userpwd,email,oicq,imgurl,signature)插入註冊用戶
update(userid,username,userpwd,email,oicq,imgurl,signature) 更新用戶數據
get_from_condition(con) 返回知足查詢條件的記錄集
建表session。當用戶登陸時即向此表插入新記錄,離開或超時後刪除記錄,保證表中保存的是當前在線的用戶。
字段
|
類型
|
備註
|
sessionid
|
Int(10)
|
序列號 auto_increment 關鍵字
|
userid
|
Int(10)
|
用戶序列號取自user表
|
ipaddress
|
Varchar(50)
|
Ip地址
|
lastactivity
|
Int(10)
|
最後活動時間,用它來判斷用戶是否還在線
|
建類文件session.php 定義函數
insert(userid,ipaddress,lastactivity) 把登陸成功的用戶插入到表中
update(userid,ipaddress,lastactivity)更新在線用戶最後活動時間
del(con)刪除知足條件的用戶,用它來清除離線用戶
get_from_condition(con) 返回知足查詢條件的記錄集
公用文件global.php
include "class/config.inc.php"; //把配置文件包含進來
db = new db;
db-> db_connect( ); //鏈接數據庫
user = new user; //初始化
session = new session;
//啓動會話
session_start();
//刪除session表中已通過期的用戶(即非在線網友)由於此文件老是被調用從而保證顯示的都是當前在線的用戶
curtime=time();
con="lastactivity<curtime";
session->del(con);
//正在線的網友需不斷更新session表中的lastactivity時間,並從新設置用戶的COOKIES
if (HTTP_SESSION_VARS["online"]=="on"){ //此處也可用_SESSION[「online」]
userid=HTTP_SESSION_VARS["userid"]; //取當前在線用戶的userid
ipaddress=substr(REMOTE_ADDR,0,50);
lastactivity=time()+3600; //更新最後活動時間,如時一個小時以內未調動頁面就認爲用戶已離線,從而會被刪除。
session->update(userid,ipaddress,lastactivity);
}else{
//若是未登陸那直接轉入登陸頁面
firstpage="logon.php";
header ("Location: firstpage");
exit;
}
登陸文件logon.php
<? include "global.php"; //把global.php文件包含進來
if (hiddenField=="0"){ //測檢表單有未被提交
con="username='username' and userpwd='userpwd'";
result=user->get_from_condition(con);
if (user->counter==1){
if (!session_is_registered("online")){//檢測是否被登記過
session_register("online"); //登記一個新的變量爲會話變量
}
if (!session_is_registered("ccauser")){
session_register("ccauser");
}
if (!session_is_registered("userid")){
session_register("userid");
}
ccauser=username; //給會話變量賦值
online="on"; //這個變量在global.php用到以更新最後活動時間lastactivity
userid=user->userid;
ipaddress=substr(REMOTE_ADDR,0,50);
lastactivity=time()+3600;
con=" userid=userid";
session->get_from_condition(con);
//判斷會話是否存在,有可能你在不一樣的機器上登兩次。
if (session->counter==1){
session->update(userid,ipaddress,lastactivity); //如存在,更新
}else{
session->insert(userid,ipaddress,lastactivity); //如不存在,插入
}
//在客戶機設置COOKIES
SetCookie("ccauser",username,time()+3600);
Header("Location:test.php");//而後導向測試頁
}
}
?>
<?
if(HTTP_SESSION_VARS["online"]=="") { //判斷是否已登陸
?>
//下面是登陸的表單
<form name="form1" method="post" action="">
名稱: <input type="text" name="username">
密碼: <input type="text" name="userpwd">
<input type="hidden" name="hiddenField" value="0">
<input type="submit" name="Submit" value="提交">
<input type="reset" name="Submit2" value="重置">
</form>
<?
}else{
echo "網友:".HTTP_COOKIE_VARS["ccauser"]."你已經登陸了"; //若是已登陸則顯示提示
str="<br><br><a href='exit.php'>退出社區</a>";
echo str;
}
?>
測試文件test.php
<?
include "global.php"; //把global.php文件包含進來
strWelcome="歡迎<font color=red>"._SESSION['ccauser']."</font><br>";
echo strWelcome; //顯示歡迎信息
str=」 當前在線用戶:<br>===================<br>」;
con=" 1=1";
//提出session表中全部記錄便是當前在線用戶,未把遊客算在內
result=session->get_from_condition(con);
while(row=mysql_fetch_array(result)){
con1="userid=row[userid]";
user->get_from_condition(con1);
str.=user->username." ";
}
echo str;
?>
<br><a href='exit.php'>退出社區</a>
退出文件exit.php
<?
include "global.php"; //把global.php文件包含進來
if (_SESSION["online"]=="on"){
con="userid=userid";
session->del(con); //在session表中刪除用戶信息。
session_destroy(); //結束當前的會話,並清空會話中的全部資源
echo "已經退出社區......";
}
?>