第三种方法和这个类似,只不过是根据用户的 IP 来判断在线人数,这样就避免了三面的特殊情况,而且不需要用 session 哦!
首先还是建一个数据库:count.mdb,包含一个表:count,表中字段为:

ID 自动编号
ip 文本
posttime 日期/时间

具体实现代码如下,文件名为 online.asp:
[#afdream.com#]

<%
‘———定义变量
dim rs
dim ip
dim timeouted
dim x
dim conn
dim dbpath
‘———定义变量结束

‘———建议数据库链接
set conn=server.createobject(“adodb.connection”)
DBPath = Server.MapPath(“count.mdb”)
conn.Open “driver={Microsoft Access Driver (*.mdb)};dbq=” & DBPath
‘———建立数据库链接完成

‘———新建数据库RS对象
set rs = server.createobject(“adodb.recordset”)
‘———建立数据库RS对象完成

‘———读取客户端IP地址
ip = Request.ServerVariables(“HTTP_X_FORWARDED_FOR”) ‘若是对方使用的是代理服务器上网的话,用Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)可以得到对方的真实IP,若对方不是通过代理服务器上网的话,则IP的值为空
If ip = “” Then ip = Request.ServerVariables(“REMOTE_ADDR”) ‘如果IP的值为空,则得到他的本地客户端地址
‘———IP读取完毕

‘———读出数据库内近20分钟所加入的新内容数,group by ip-表IP值相同的记作1
sql=”select ip from count where posttime >= dateadd(‘n’,-20,now()) group by ip”
rs.Open sql,conn,1,1
online=rs.RecordCount
rs.Close
‘———得到在线人数值

‘———查看数据库中是否已经有相同的值,没有则 x=”yes”有则x=”no”
sql=”select ip from count where ip='” & ip & “‘”
rs.Open sql,conn,1,1
if rs.eof and rs.bof then
x=”yes”
else
x=”no”
end if
rs.close
‘——–判断完毕

‘——–如果数据库中没有相同的值则加入一个新值
if x=”yes” then’   如果没有这个IP则增加一条记录
sql=”select top 1 * from count”
rs.Open sql,conn,1,3
rs.AddNew
rs(“ip”)=ip
rs(“posttime”)=now()
rs.update
rs.close
else   ’如果有这个IP则把时间改为现在的时间

sql=”select * from count where ip='” & ip & “‘”
rs.Open sql,conn,1,3
rs(“posttime”)=now()
rs.update
rs.close
end if
‘——–判断加入完毕

‘——–删除20分钟以前所加入的值
timeouted = dateadd(“n”, -20, now())
sql=”delete * from count where posttime < #" & timeouted & "#"
conn.Execute sql
‘——–删除完毕

‘——–关闭数据对象
set rs=nothing
conn.Close
set conn=nothing
%>
document.write(“共<%=online%>人在线”)

调用方式如下,在你要显示的地方插入如下代码(注意路径一定要写对哦!):

7 Comments

  1. 在线用户统计最好不要每次请求页面都查询数据库,这样会增加服务器负担。
    我的作法是根据IP为每个用户建立一条Application级别的缓存,缓存中保存登陆时间,IP,访问页面URL等等信息,只有当用户首次登陆网站才向数据库插入进站记录,以后只要查询这条缓存就可以了。
    代码:http://www.cloudward.net/blog/blogview.asp?logID=459

  2. ‘———读取客户端IP地址
    ip = Request.ServerVariables(“HTTP_X_FORWARDED_FOR”) ‘若是对方使用的是代理服务器上网的话,用Request.ServerVariables(“HTTP_X_FORWARDED_FOR”)可以得到对方的真实IP,若对方不是通过代理服务器上网的话,则IP的值为空
    If ip = “” Then ip = Request.ServerVariables(“REMOTE_ADDR”) ‘如果IP的值为空,则得到他的本地客户端地址

    这个很赞!我原先都没有考虑的![biggrin]

  3. 呵呵,偶也知道查询数据库不爽,就是没想到你的这个方法!太好了!

  4. 花摘了许久枯萎了也舍不得丢,伞撑了许久雨停了也记不起收,路走了许久天黑了也走不到尽头,百年难得一见的贴子要天天顶才不会沉,有句话想了很久清楚了,才说出口:文章写的真好!
    音乐下载
    音乐下载
    音乐下载

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.