// 常用设置
$online_limit = 500;             //在线静止时限,单位秒
$db['host'] = 'localhost'; //数据库主机
$db['usepconnect']= 1; //使用持续连接 ,
$db['user'] = '*****'; //登录用户
$db['password'] = '*****'; //登录密码
$db['db'] = '*****'; //数据库名
$db['user_tbl'] = "user"; //用户表
$db['online'] = "online"; //在线人员表,数据库方式记录在线IP时所用的表.
$db['stat']       = $db['db']; //统计用数据库
/*
 * 基于数据库的当前在线记录函数
 * BUG:同一LAN内的非注册客户无法统计,可以用cookie解决.
*/
function add_on_based_db()
{
    global $online_limit,$db;    //连接数据库
    $conn = mysql_pconnect($db['host'],$db['user'],$db['password']);
    mysql_select_db($db['db']);
    
    //清除不在线人员
    mysql_query("delete from {$db['online']} where time<now()-$online_limit;");
    
    //加入在线名单
    if ($_SESSION['logininfo']) {
        $result = mysql_query("select * from {$db['online']} where userid='{$_SESSION['logininfo']['loginid']}';");
        if ($res = mysql_fetch_array($result)) {
            mysql_query("update {$db['online']} set time=now() where userid='{$_SESSION['logininfo']['loginid']}';");
        } else {
            mysql_query("insert into  {$db['online']}  values('{$_SESSION['logininfo']['loginid']}','{$_SERVER['REMOTE_ADDR']}',now())");
        }   
    } else {
        $result = mysql_query("select * from {$db['online']} where IP='{$_SERVER['REMOTE_ADDR']}' and userid='------';");
        if ($res = mysql_fetch_array($result)) {
            mysql_query("update {$db['online']} set time=now() where IP='{$_SERVER['REMOTE_ADDR']}'and userid='------';");
        } else {
            mysql_query("insert into  {$db['online']}  values('------','{$_SERVER['REMOTE_ADDR']}',now());");
        }   
    }
}//在线用户列表函数
function online_list()
{
    global $db;
    $conn   = mysql_pconnect($db['host'],$db['user'],$db['password']);
    mysql_select_db($db['db']);    //会员在线
    $result = mysql_query("select a.userid as id,b.nike_name as nikename from {$db['online']} a,{$db['user_tbl']} b where a.userid=b.loginid ;");
    while ($res = mysql_fetch_array($result)) {
        if ($res['nikename'] == "") {
            $res['nikename'] = $res['id'];
        }
        $login .="{$res['id']}({$res['nikename']})<br />";
    }
    $result = mysql_query("select IP from {$db['online']} where userid='------';");
    while ($res = mysql_fetch_array($result)) {
        $login .="客人<br />";
    }
    return $login;
}======
在线统计数据表
CREATE TABLE `online` (
  `userid` char(20) NOT NULL default '',
  `IP` char(16) NOT NULL default '',
  `time` timestamp(14) NOT NULL
) TYPE=MyISAM COMMENT='在线人员';
CREATE TABLE `user` (
  `id` int(10) unsigned zerofill NOT NULL auto_increment,
  `loginid` varchar(20) NOT NULL default '',
  `nike_name` varchar(20) NOT NULL default '',
  `password` varchar(33) NOT NULL default '', 
  .
  .
  .
  PRIMARY KEY  (`id`)
) TYPE=MyISAM COMMENT='用户登录及注册信息' AUTO_INCREMENT=14 ;

解决方案 »

  1.   

    我没用数据库,你看看,我是用文本结合SESSION的http://www.dev-club.com/club/bbs/showEssence.asp?id=23132
      

  2.   

    <?php 
    session_start();echo session_id();//首先你要有读写文件的权限
    //本程序可以直接运行,第一次报错,以后就可以
    $online_log = "count.dat"; //保存人数的文件,
    $timeout = 30;//30秒内没动作者,认为掉线 
    $entries = file($online_log); $temp = array(); for ($i=0;$i<count($entries);$i++) { 
    $entry = explode(",",trim($entries[$i])); 
    if (($entry[0] != session_id()) && ($entry[1] > time())) { 
    array_push($temp,$entry[0].",".$entry[1]."\n"); //取出其他浏览者的信息,并去掉超时者,保存进$temp

    } array_push($temp,session_id().",".(time() + ($timeout))."\n"); //更新浏览者的时间
    $users_online = count($temp); //计算在线人数$entries = implode("",$temp); 
    //写入文件
    $fp = fopen($online_log,"w"); 
    flock($fp,LOCK_EX); //flock() 不能在NFS以及其他的一些网络文件系统中正常工作
    fputs($fp,$entries); 
    flock($fp,LOCK_UN); 
    fclose($fp); echo "当前有".$users_online."人在线"; ?>
      

  3.   

    原理:
    每当一个用户登陆的时候就生成一个session_id,并记录下登陆时间,并设置一个超时时间,并记录到库中(文本中),然后在页面上读取就可以了。
    用户自己将检查自己的session_id是否仍然存在在库中,如果存在,就刷新他的登陆时间,如果不存在就增加一条自己的记录SESSION_ID  Login_Time
    345234234   34234412424
    .........   ...........
    对于异常吊线情况,则由其他用户检查他的Login Time,如果与当前时间相比已经超时间,则删除这条记录。
      

  4.   

    总之,用的就是数据库结合session或是文本结合session如果要知道具体的用户无非就是再加个用户机器的IP。