关于人数统计有人说是用application的概念。不过因为要涉及到每个分版块每个版块的人数,所以呢。我还是没有用这样的办法。这样办法也不能完全的统计出来。
为此我写了个存储过程
其中Online_ID 代表了用户的ID,我用户ID是同用户名分开的啦。这个ID也是标志用户唯一的一个值。所以我作为传入参数进入onlineid ,
其中onlinename 表示了用户名,
其中对于游客,我让游客的ID统一为0,游客名统一为“游客”。
我的总体思想就是基本在每个页面都调用这样的存储过程。
让每个版块进入就开始统计人数。在存储过程中比较如果是会员的话,那么他的ID就大于0。查找表看看是否存在这样的用户。如果存在那么更新她的ONLINE时间,以及版块的ID。如果不存在那么新加一个。如果是游客,那么它的ID为0,直接插入进表单。
同时在一开始的时候比较一下,当前时间同存储的时候如果在20分钟内用户无活动,那么从在线表里面删除用户。
当然这个时间可以自己设定,我为了让看上去用户人多点,所以呵呵。当然这样统计还不完善,没有精确的统计。不过也满足了日常的需求。估计你还有更好的,讨论一下阿坝。
CREATE PROCEDURE Pr_UpdateOnline
(
@onlineid int ,
@onlinename varchar( 200 ) ,
@onlineip varchar( 100 ) ,
@onlinegroupid int ,
@onlineboardid int ,
@onlinetime datetime
)
AS
DELETE FROM BBS_Online
WHERE
DATEDIFF(MINUTE , GETDATE() , Online_Time)> 20
DECLARE @isuser as int
SET @isuser =
(
SELECT COUNT(*) FROM BBS_Online
WHERE Online_ID = @onlineid AND Online_ID> 0
)
IF @isuser< = 0
BEGIN
INSERT INTO
BBS_Online
(
Online_ID ,
Online_Name ,
Online_Ip ,
Online_GroupID ,
Online_BoardID ,
Online_Time
)
VALUES
(
@onlineid ,
@onlinename ,
@onlineip ,
@onlinegroupid ,
@onlineboardid ,
@onlinetime
)
END
IF @isuser> 0
BEGIN
UPDATE BBS_Online
SET
Online_Time = @onlinetime ,
Online_BoardID = @onlineboardid
WHERE Online_ID = @onlineid
END
GO
(
@onlineid int ,
@onlinename varchar( 200 ) ,
@onlineip varchar( 100 ) ,
@onlinegroupid int ,
@onlineboardid int ,
@onlinetime datetime
)
AS
DELETE FROM BBS_Online
WHERE
DATEDIFF(MINUTE , GETDATE() , Online_Time)> 20
DECLARE @isuser as int
SET @isuser =
(
SELECT COUNT(*) FROM BBS_Online
WHERE Online_ID = @onlineid AND Online_ID> 0
)
IF @isuser< = 0
BEGIN
INSERT INTO
BBS_Online
(
Online_ID ,
Online_Name ,
Online_Ip ,
Online_GroupID ,
Online_BoardID ,
Online_Time
)
VALUES
(
@onlineid ,
@onlinename ,
@onlineip ,
@onlinegroupid ,
@onlineboardid ,
@onlinetime
)
END
IF @isuser> 0
BEGIN
UPDATE BBS_Online
SET
Online_Time = @onlinetime ,
Online_BoardID = @onlineboardid
WHERE Online_ID = @onlineid
END
GO