Home > php教程 > php手册 > body text

如何利用PHP会话显示出当前在线的用户

WBOY
Release: 2016-06-21 09:11:54
Original
1067 people have browsed it

显示|在线

此文是我前一阵子写的,帖上来以谢大家对我的帮助。
=============

综述
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$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"]=="") { //判断是否已登录
?>
//下面是登录的表单


  名称:
  密码:
    
    
    


}else{
echo "网友:".$HTTP_COOKIE_VARS["ccauser"]."你已经登录了"; //如果已登录则显示提示
$str="

退出社区";
echo $str;
}
?>

测试文件test.php

include "global.php"; //把global.php文件包含进来
$strWelcome="欢迎".$_SESSION['ccauser']."
";
echo $strWelcome; //显示欢迎信息
$str=” 当前在线用户:
===================
”;
$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;
?>

退出社区

退出文件exit.php

   include "global.php"; //把global.php文件包含进来
   if ($_SESSION["online"]=="on"){
   $con="userid=$userid";
       $session->del($con); //在session表中删除用户信息。
       session_destroy();  //结束当前的会话,并清空会话中的所有资源
       echo "已经退出社区......";
}
?>



Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Recommendations
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template