用PHP判断用户是否在线的方法

REATETABLETB_User(--用户表
N_UserIdNumber(5)NOTNULL,--用户ID
V_NickNameVARCHAR2(10)NOTNULL,--昵称
V_PWDVARCHAR2(10)NOTNULL,--密码
V_TrueNameVARCHAR2(20),--姓名
PrimaryKey(N_UserId)
)
CREATETABLETB_OnlineUser(--在线用户
N_OnlineUserIdNumber(5)NOTNULL,--在线用户ID
D_LoginTimeNumber(16),--登陆时间以秒计
N_OnlineIDNumber(5),--与onlineusercount相关联。
PrimaryKey(N_OnlineID)
)
/
CREATETABLETB_OnlineUserCount(--在线用户统计表
N_OnlineIDNumber(5)NOTNULL,--系统ID号
N_OnlineUserIdNumber(5)NOTNULL,--在线用户ID
D_LoginDateDate,--登陆日期
D_LoginTimeNumber(16),--登陆时间以秒计
D_OverDateDate,--结束日期
D_OverTimeNumber(16),--结束时间
PrimaryKey(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,"selectcount(*)countnicknamefromtb_userwherev_nickname='$name'");
OCIExecute($stmtNick);
while(OCIFetchInto($stmtNick,&$arrN)){
if($arrN[0]==0){
Header("Location:Logintest.php?Msg=1");
}else{
//用户名通过
unset($arrNickName);//撤消临时数组
$stmtPwd=OCIParse($conn,"selectcount(*)countpwdfromtb_userwherev_pwd='$pwd'andv_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,"selectn_userIDfromtb_userwherev_nickname='$name'");
OCIExecute($stmtUid);
while(OCIFetchInto($stmtUid,&$arrU,OCI_NUM)){
$intOnlineUserID=$arrU[0];
}//while_Over
//如果该用户通过另一个浏览器重复登陆,解决如下
$stmOnlineFlag=OCIParse($conn,"selectcount(*)fromtb_onlineuserwhereN_ONLINEUSERID='$intOnlineUserID'");
OCIExecute($stmOnlineFlag);
while(OCIFetchInto($stmOnlineFlag,&$arronlineFlag,OCI_NUM)){
if($arronlineFlag[0]!=0){//表示已经在线数据载入中

//先取到在线用户关联系统ID
$stmtSysID=OCIParse($conn,"selectN_ONLINEIDfromtb_onlineuserwhereN_ONLINEUSERID='$intOnlineUserID'");
OCIExecute($stmtSysID);
while(OCIFetchInto($stmtSysID,&$arrSysID,OCI_NUM)){
$SysID=$arrSysID[0];
}//while_Over//找完后踢出该用户
$stmt=OCIParse($conn,"deletefromtb_onlineuserwhereN_ONLINEUSERID='$intOnlineUserID'");
OCIExecute($stmt);
print"删除成功";//最后作记录备份
$tmpTime=time();//结束时间
$DatLoginDate=date("Y-m-d");//结束日期
$DatLoginDate="to_date('".$DatLoginDate."','YY/MM/DD')";
$stmtUserCount=OCIParse($conn,"updatetb_onlineusercountsetD_OverDate=$DatLoginDate,D_OverTime=$tmpTimewhereN_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,"insertintotb_onlineuser(N_OnlineUserId,D_LoginTime,N_OnlineID)values($intOnlineUserID,$DatLogintime,$intOnlineID)");
OCIExecute($stmt);
$stmtC=OCIParse($conn,"insertintoTB_OnlineUserCount(N_OnlineID,N_OnlineUserId,D_LoginDate,D_LoginTime)values($intOnlineID,$intOnlineUserID,$DatLoginDate,$DatLogintime)");
OCIExecute($stmtC);数据载入中

Header("Location:index.php");//成功登陆!
}//whileOVER
}//endif
}//while_Over
}//endif
}//while_Over

?>
<?ob_end_flush();?>
/*-------CheckSession-----检查刷新程序---*/
<?
/*30分钟刷新程序
先统计出在线的用户数,如果没有在线用户,系统要保证一个系统指定用户。该系统用户时时在线的原因是保证该刷新程序的执行
如果该登陆用户Session不存在了,表示用该用户离线。统计出时间。
*/
session_start();
require('oracle8conn.php');
print$objsNickName;
?>
<html><head><metaHTTP-EQUIV=refreshContent='1800;url="CheckSession.php"'>
<?
$NowDate=date("Y-m-d");
$NowDate="to_date('".$NowDate."','YY/MM/DD')";
$NowTime=time();
//统计在线人数。30分钟更新一次
$stmtCount=OCIParse($conn,"selectcount(*)fromtb_onlineuser");
OCIExecute($stmtCount);
while(OCIFetchInto($stmtCount,&$arrCountUser)){
$CountUser=$arrCountUser[0];
}
print"目前在线人数为:".$CountUser."<br>";
//判断在线否?
if($CountUser==0){
print"没有人在线!特殊处理!";
}else{
$stmtOnlineUser=OCIParse($conn,"selectN_OnlineUserId,D_LoginTime,N_OnlineIDfromtb_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<$j;$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,"deletefromtb_onlineuserwhere$intOnlineID='$temGlid'andN_ONLINEUSERID='$temuserid'");
print"deletefromtb_onlineuserwhere$intOnlineID='$temGlid'andN_ONLINEUSERID='$temuserid'";
OCIExecute($stmt);
print"删除成功";
//添加到统计表中
$tmpTime=time();//结束时间
$DatLoginDate=date("Y-m-d");//结束日期
$DatLoginDate="to_date('".$DatLoginDate."','YY/MM/DD')";
$stmtUserCount=OCIParse($conn,"updatetb_onlineusercountsetD_OverDate=$DatLoginDate,D_OverTime=$tmpTimewhereN_OnlineID='$temGlid'");//条件是相关联的系统ID
OCIExecute($stmtUserCount);
print"添加成功到统计表中。";
}else{
$tmpTime=time();//取得临时用户时间
$temuserid=$arrTest[$b][0];
$stmt=OCIParse($conn,"updatetb_onlineusersetd_logintime=$tmpTimewhereN_ONLINEUSERID='$temuserid'");
OCIExecute($stmt);
print"更新成功";
print$tmpTime;
}
}else{
printsession_id();
print"系统时间:".$NowTime."<br>";
print"数据库中旧时间:".$arrTest[$b][1]."<br>";
print"用户ID:".$arrTest[$b][0]."<br>";数据载入中

print"相差时间:".ceil(($NowTime-$arrTest[$b][1])/60)."<br>";
}
}
}

/*如果要欢察统计表与在线表用户时间(当用户未离线时)
selecta.D_Logintime,b.D_logintimefromtb_onlineusera,tb_onlineusercountb
wherea.N_OnlineID=b.N_ONLINEID;相差
如果要统计出指定用户在线时间(当用户离线时)
selectD_logintime,D_OverTimefromtb_onlineusercountwhereN_OnlineUserId='$USERID';相差
*/

?>
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值