php 区分用户,判断在线用户的方法-PHP教程,PHP应用

解决了昨天的问题:表结果变了一下,如下:

create table tb_user (       –用户表

n_userid   number(5)      not null,       –用户id

v_nickname  varchar2(10)  not null,       –昵   称

v_pwd      varchar2(10)  not null,        –密   码

v_truename  varchar2(20),                 –姓   名

primary key (n_userid)

)

create table tb_onlineuser ( –在线用户

n_onlineuserid number(5)      not null,   –在线用户id

d_logintime   number (16),       –登陆时间以秒计

n_onlineid    number(5),   –与onlineusercount相关联。

primary key (n_onlineid)

)

/

create table tb_onlineusercount (  –在线用户统计表

n_onlineid    number(5)      not null,   –系统id号

n_onlineuserid number(5)      not null,   –在线用户id

d_logindate    date                   ,          –登陆日期

d_logintime   number (16)    ,    –登陆时间以秒计

d_overdate      date    ,          –结束日期

d_overtime    number (16)             ,    –结束时间

primary key (n_onlineid)

)

/

/*—loginselectnew.php—该程序是登陆检查程序—-*/

session_start();

/*思路:首先用户登陆,判断是否有该用户,判断是否密码通过,否则返回参数进行特殊处理。(登陆不成功)

登陆成功后,如果该用户不在线(一般不在线,特殊情况如果他用另一台机器打开浏览器重新再登陆,那么他有可能在线),

先进行session变量注册,取得相应条件向1.统计表与2.在线表中插数据。进入到登陆页。

如果用户在线:先取得在线用户的系统id,因为在备份该用户离开时有用。接着删除该在线用户.接着进行该用户离开时间的备份.

*/

session_register("objsnickname");

require(oracle8conn.php);

$name=trim($name);

$pwd=trim($pwd);

ob_start();      //缓冲输出

$stmtnick = ociparse($conn,"select count(*) countnickname from tb_user where v_nickname=$name");

ociexecute($stmtnick);

while(ocifetchinto($stmtnick,&$arrn)){

if ($arrn[0]==0){

header("location:logintest.php?msg=1");

}else{

//用户名通过

unset($arrnickname);           //撤消临时数组

$stmtpwd = ociparse($conn,"select count(*) countpwd from tb_user where v_pwd=$pwd and v_nickname=$name");

ociexecute($stmtpwd);

while(ocifetchinto($stmtpwd,&$arrp,oci_num)){

if ($arrp[0]==0){

header("location:logintest.php?msg=2");

}else{//密码通过

//取出用户的id号

$stmtuid = ociparse($conn,"select n_userid from tb_user where v_nickname=$name");

ociexecute($stmtuid);

while(ocifetchinto($stmtuid,&$arru,oci_num)){

$intonlineuserid=$arru[0];

}//while_over

//如果该用户通过另一个浏览器重复登陆,解决如下

$stmonlineflag=ociparse($conn,"select count(*) from tb_onlineuser where n_onlineuserid=$intonlineuserid");

ociexecute($stmonlineflag);

while(ocifetchinto($stmonlineflag,&$arronlineflag,oci_num)){

if ($arronlineflag[0]!=0){                               //表示已经在线

//先取到在线用户关联系统id

$stmtsysid= ociparse($conn,"select n_onlineid from tb_onlineuser where n_onlineuserid=$intonlineuserid");

ociexecute($stmtsysid);

while(ocifetchinto($stmtsysid,&$arrsysid,oci_num)){

$sysid=$arrsysid[0];

}//while_over                                     //找完后踢出该用户

$stmt = ociparse($conn, "delete from tb_onlineuser where n_onlineuserid=$intonlineuserid");

ociexecute($stmt);

print "删除成功";                                  //最后作记录备份

$tmptime=time(); //结束时间

$datlogindate = date( "y-m-d");//结束日期

$datlogindate = "to_date(".$datlogindate.",yy/mm/dd)";

$stmtusercount = ociparse($conn, "update tb_onlineusercount set d_overdate=$datlogindate ,d_overtime=$tmptime where n_onlineid=$sysid");//条件是相关联的系统id

ociexecute($stmtusercount);

print "添加成功到统计表中。";

}//endif                                              //不在线正常注册

$objsnickname=$name; //注册session变量

unset($arrpwd);             //撤消临时数组

srand((double)microtime()*1000000000);

$intonlineid = rand();              //取一个系统id号

$datlogindate = date( "y-m-d");    //取得系统日期存入到online表中去。

$datlogintime = time();           //取系统时间

$datlogindate = "to_date(".$datlogindate.",yy/mm/dd)";

$stmt = ociparse($conn, "insert into tb_onlineuser (n_onlineuserid,d_logintime,n_onlineid) values ($intonlineuserid,$datlogintime,$intonlineid)");

ociexecute($stmt);

$stmtc = ociparse($conn, "insert into tb_onlineusercount (n_onlineid,n_onlineuserid,d_logindate,d_logintime) values ($intonlineid,$intonlineuserid,$datlogindate,$datlogintime)");

ociexecute($stmtc);

header("location:index.php");  //成功登陆!

}//whileover

}//end if

}//while_over

}//end if

}//while_over

?>

/*——-checksession—–检查刷新程序—*/

/*30分钟刷新程序

先统计出在线的用户数,如果没有在线用户,系统要保证一个系统指定用户。该系统用户时时在线的原因是保证该刷新程序的执行

如果该登陆用户session不存在了,表示用该用户离线。统计出时间。

*/

session_start();

require(oracle8conn.php);

print $objsnickname;

?>

$nowdate = date("y-m-d");

$nowdate = "to_date(".$nowdate.",yy/mm/dd)";

$nowtime = time();

//统计在线人数。30分钟更新一次

$stmtcount = ociparse($conn,"select count(*) from tb_onlineuser");

ociexecute($stmtcount);

while(ocifetchinto($stmtcount,&$arrcountuser)){

$countuser=$arrcountuser[0];

}

print "目前在线人数为:".$countuser."
";

//判断在线否?

if ($countuser==0){

print "没有人在线!特殊处理!";

}else{

$stmtonlineuser = ociparse($conn,"select n_onlineuserid,d_logintime,n_onlineid from tb_onlineuser");

ociexecute($stmtonlineuser);

$arrtest = array();

while(ocifetchinto($stmtonlineuser,&$arruser[])){

$arrtest += $arruser;

}

$j = sizeof($arrtest);

if($j>0){

$i = sizeof($arrtest[0]);

}

}

for($b=0;$b

for($a=0;$a<1;$a++){ //内循环一次找到时间。

//注意双循环中是为了取数组值

// $arrtest[$b][0]  表示用户id

// $arrtest[$b][1]  表示登陆起的时间

// $arrtest[$b][1]  关联系统id

if  (ceil(($nowtime-$arrtest[$b][1])/60)>300){ //如果当前时间与一条记录的旧时间相差大于30分钟。

if ($objsnickname==""){  //如果此用户session不存在,表示已经退出。

//删掉。

$temglid= $arrtest[$b][2];   //关联系统id

$temuserid= $arrtest[$b][0]; //用户id

$stmt = ociparse($conn, "delete from tb_onlineuser where $intonlineid=$temglid and n_onlineuserid=$temuserid");

print  "delete from tb_onlineuser where $intonlineid=$temglid and n_onlineuserid=$temuserid";

ociexecute($stmt);

print "删除成功";

//添加到统计表中

$tmptime=time(); //结束时间

$datlogindate = date( "y-m-d");//结束日期

$datlogindate = "to_date(".$datlogindate.",yy/mm/dd)";

$stmtusercount = ociparse($conn, "update tb_onlineusercount set d_overdate=$datlogindate ,d_overtime=$tmptime where n_onlineid=$temglid");//条件是相关联的系统id

ociexecute($stmtusercount);

print "添加成功到统计表中。";

}else{

$tmptime=time(); //取得临时用户时间

$temuserid= $arrtest[$b][0];

$stmt = ociparse($conn, "update tb_onlineuser set d_logintime=$tmptime where n_onlineuserid=$temuserid");

ociexecute($stmt);

print "更新成功";

print $tmptime;

}

}else{

print session_id();

print "系统时间:".$nowtime."
";

print "数据库中旧时间:".$arrtest[$b][1]."
";

print "用户id:".$arrtest[$b][0]."
";

print "相差时间:".ceil(($nowtime-$arrtest[$b][1])/60)."
";

}

}

}

/*如果要欢察统计表与在线表用户时间(当用户未离线时)

select a.d_logintime,b.d_logintime from tb_onlineuser a,tb_onlineusercount b

where a.n_onlineid=b.n_onlineid; 相差

如果要统计出指定用户在线时间(当用户离线时)

select d_logintime,d_overtime from tb_onlineusercount where n_onlineuserid=$userid; 相差

*/

?>

谢谢你的帮助!:_)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值