请选择 进入手机版 | 继续访问电脑版
招商联系客服 全国楼凤小姐姐 招商联系客服 招商联系客服 招商联系客服 招商联系客服

PHP显示当前在线用户

[复制链接]
查看12264 | 回复17 | 2024-10-8 12:45:52 | 显示全部楼层 |阅读模式
如何利用PHP会话显示出当前在线的用户,在PHP中session的用法。
综述
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 "已经退出社区......";
}
?>

回复

使用道具 举报

rinsingw | 2024-11-2 01:50:57 | 显示全部楼层
看看 感谢分享
回复

使用道具 举报

kkik123 | 2024-11-7 17:15:42 | 显示全部楼层

看看 感谢分享
回复

使用道具 举报

314782214yy | 2024-11-16 23:12:13 | 显示全部楼层
这个行,我来试试
回复

使用道具 举报

无脸男 | 2024-11-18 17:06:16 | 显示全部楼层

看看 感谢分享
回复

使用道具 举报

afanzb | 2024-11-25 11:36:08 | 显示全部楼层
看看 感谢分享
回复

使用道具 举报

afanzb | 2024-11-25 11:36:47 | 显示全部楼层

这个行,我来试试
回复

使用道具 举报

afanzb | 2024-11-25 11:37:04 | 显示全部楼层

这个行,我来试
回复

使用道具 举报

afanzb | 2024-11-25 11:37:38 | 显示全部楼层

这个行,我来
回复

使用道具 举报

afanzb | 2024-11-25 11:40:44 | 显示全部楼层


这个行,我
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则