设为首页 收藏本站
查看: 1023|回复: 0

[经验分享] 用PHP判断用户是否在线的方法

[复制链接]

尚未签到

发表于 2017-4-9 12:30:59 | 显示全部楼层 |阅读模式
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';相差
*/

?>

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-362413-1-1.html 上篇帖子: PHP利用天气网API获取天气信息 下篇帖子: 让PHP引擎全速运转的三个绝招
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表