判斷在線用戶的方法

發表于:2007-07-14來源:作者:點擊數: 標簽:
解決了昨天的問題:表結果變了一下,如下: CREATE TABLE TB_User (--用戶表 N_UserIdNumber(5)NOT NULL,--用戶ID V_NickNameVARCHAR2(10)NOT NULL,--昵稱 V_PWDVARCHAR2(10)NOT NULL,--密碼 V_TrueNameVARCHAR2(20),--姓名 Primary Key (N_UserId) ) CREATE
解決了昨天的問題:表結果變了一下,如下:
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

?>
<?ob_end_flush();?>
/*-------CheckSession-----檢查刷新程序---*/
<?
/*30分鐘刷新程序
  先統計出在線的用戶數,如果沒有在線用戶,系統要保證一個系統指定用戶。該系統用戶時時在線的原因是保證該刷新程序的執行
  如果該登陸用戶Session不存在了,表示用該用戶離線。統計出時間。
*/
  session_start();
  require('oracle8conn.php');
  print $objsNickName;
?>
  <html><head><meta HTTP-EQUIV=refresh Content='1800;url="CheckSession.php"'>
<?
$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."<br>";
//判斷在線否?
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<$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, "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."<br>";
         print "數據庫中舊時間:".$arrTest[$b][1]."<br>";
         print "用戶ID:".$arrTest[$b][0]."<br>";
         print "相差時間:".ceil(($NowTime-$arrTest[$b][1])/60)."<br>";
     }  
   }
}

/*如果要歡察統計表與在線表用戶時間(當用戶未離線時)
  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'; 相差
*/

?>

                      謝謝你的幫助?。篲)

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97