程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> php中session的用法

php中session的用法

編輯:PHP綜合

PHP會話即SESSION是指用戶從進入網站到關閉網站這段時間內活動的一種機制,它提供了所有網頁都共同使用的公共變量存貯機制。那麼SESSION到底有什麼用處呢?網上購物時大家都用過購物車,可以隨時把你選購的商品加入到購物車中,最後再去收銀台結帳。在整個過程中購物車一直扮演著臨時存貯被選商品的角色,用它追蹤用戶在網站上的活動情況,這就是SESSION的作用。
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個,我們詳細介紹一下將要用到幾個函數。

1、 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

2、 session_register

函數功能:登記一個新的變量為會話變量

函數原型:boolean session_register(string name);

返回值:布爾值。

功能說明:這個函數是在全局變量中增加一個變量到當前的SESSION中,參數name就是想要加入的變量名,成功則返回邏輯值true。可以用$_SESSION[name]或$HTTP_SESSION_VARS[name]的形式來取值或賦值。

3、 session_is_registered

函數功能:檢查變量是否被登記為會話變量。

函數原型:boobean session_is_registered(string name);

返回值:布爾值

功能說明:這個函數可檢查當前的session之中是否已有指定的變量注冊,參數name就是要檢查的變量名。成功則返回邏輯值true。

4、 session_unregister

函數功能:刪除已注冊的變量。

函數原型:boolean session_session_unregister(string name);

返回值:布爾值

功能說明:這個函數在當前的session之中刪除全局變量中的變量。參數name就是欲刪除的變量名,成功則返回true.

5、 Session_destroy

函數功能:結束當前的會話,並清空會話中的所有資源。

函數原型:boolean session destroy(void);

返回值:布爾值。

功能說明:這個函數結束當前的session,此函數沒有參數,且返回值均為true

上面介紹函數下文將會用到,但還有一些有關session的函數也介紹一下:

6、 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 變量間用分號”;”分隔。

7、 session_decode

函數功能:sesssion信息解碼

函數原型:boolean session_decode (string data)

返回值:布爾值

功能說明:這個函數可將session信息解碼,成功則返回邏輯值true

8、 session_name

函數功能:存取當前會話名稱

函數原型:boolean session_name(string [name]);

返回值:字符串

功能說明:這個函數可取得或重新設置當前session的名稱。若無參數name則表示獲取當前session名稱,加上參數則表示將session名稱設為參數name

9、 session_id

函數功能:存取當前會話標識號

函數原型:boolean session_id(string [id]);

返回值:字符串

功能說明:這個函數可取得或重新設置當前存放session的標識號。若無參數id則表示只獲取當前session的標識號,加上參數則表示將session的標識號設成新指定的id

10、 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 "已經退出社區......";

}

?>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved