做加好友,别先想着按钮长什么样。按钮只是个表单,真正要设计的是关系怎么落库。经典ASP里我一般用一张 friends 表,字段至少这几个:id 自动编号,user_id 发起人,friend_id 接收人,status 状态,add_time 申请时间。status 用 0 表示申请中,1 表示已通过,2 表示拒绝。如果要做黑名单,再加个 3,或者单独一张表。表上给 user_id+friend_id 建唯一索引,防止同一对人重复插入。注意是单向记录还是双向记录。图省事可以只存一条,查询时用 or 两边都查;但好友列表要分页、排序时,我更喜欢同意后存两条,A 到 B 一条,B 到 A 一条,查起来就是 where user_id=当前用户 and status=1。
接下来是加好友的入口。用户资料页放一个表单,提交到 add_friend.asp,隐藏域里放对方 userid。服务端先判断 Session("userid") 有没有值,没登录就跳登录。再判断 friendid 是不是数字,不能是自己。然后查库:select id,user_id,friend_id,status from friends where (user_id=我 and friend_id=对方) or (user_id=对方 and friend_id=我)。如果查到了,分几种情况。status=1 说明已经是好友,直接提示。status=0 且 user_id 是我,说明我已经申请过,别重复发。status=0 且 user_id 是对方,说明对方先申请了我,提示我去请求列表处理。status=2 的话,可以更新这条记录重新申请,也可以删掉重插。没查到就 insert 一条 status=0。
给一段核心代码,VBScript 写法:
<%
Dim conn, rs, myId, friendId, sql
myId = Session("userid")
friendId = Request.Form("friendid")
If Len(myId) = 0 Then
Response.Write "请先登录"
Response.End
End If
If Not IsNumeric(friendId) Then
Response.Write "参数错误"
Response.End
End If
friendId = CLng(friendId)
If friendId = CLng(myId) Then
Response.Write "不能加自己"
Response.End
End If
Set conn = Server.CreateObject("ADODB.Connection")
conn.Open "Provider=SQLOLEDB;Data Source=.;Initial Catalog=你的库;User ID=sa;Password=你的密码;"
sql = "select id,user_id,friend_id,status from friends where (user_id=" & myId & " and friend_id=" & friendId & ") or (user_id=" & friendId & " and friend_id=" & myId & ")"
Set rs = conn.Execute(sql)
If Not rs.EOF Then
If CLng(rs("status")) = 1 Then
Response.Write "你们已经是好友"
ElseIf CLng(rs("status")) = 0 Then
If CLng(rs("user_id")) = CLng(myId) Then
Response.Write "你已经申请过了"
Else
Response.Write "对方已经申请加你,去好友请求里处理"
End If
ElseIf CLng(rs("status")) = 2 Then
conn.Execute "update friends set user_id=" & myId & ",friend_id=" & friendId & ",status=0,add_time=getdate() where id=" & rs("id")
Response.Write "申请已发送"
End If
Else
conn.Execute "insert into friends(user_id,friend_id,status,add_time) values(" & myId & "," & friendId & ",0,getdate())"
Response.Write "申请已发送"
End If
rs.Close
conn.Close
Set rs = Nothing
Set conn = Nothing
%>

这段是为了看清流程,真实项目别直接拼 SQL,用 ADODB.Command 加参数,至少把数字变量强制 CLng。Access 数据库把 getdate() 换成 now()。
对方那边