• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    如何利用PHP會話顯示出當前在線的用戶

    發布: 2007-7-14 19:53 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 17次 | 進入軟件測試論壇討論

    領測軟件測試網 此文是我前一陣子寫的,帖上來以謝大家對我的幫助。
    =============

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

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>