如何利用PHP會話顯示出當前線上的使用者

來源:互聯網
上載者:User
顯示|線上 此文是我前一陣子寫的,帖上來以謝大家對我的協助。
=============

綜述
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 "已經退出社區......";
}
?>


相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.