高手看过来,关于站内搜索结果分页显示及结果中突出显示搜索关键词的问题!
今天弄一个站内搜索的程序,在CSDN上搜得一帖子:
http://community.csdn.net/Expert/topic/4199/4199802.xml?temp=.525448
其中“jspadmin(阿笨狗 http://www.pifoo.com 和朋友们一起进步)”的方法不错,我照搬就能解决问题,不过如果有满足搜索条件的记录的话是全部显示,我想实现分页显示,于是又找来一分页程序,合二为一,却出现了问题,具体情况如下:
搜索提交页search.asp
<form name="form1" method="post" action="result.asp" target="_blank">
<input name="key" type="text" id="key" size="16" maxlength="16">
<input name="Submit" type="image" src="images/index/sousuo.gif" width="21" height="21"/>
</form>
搜索结果页result.asp
<%
Dim strProvider,conn
strProvider="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="
strProvider=strProvider & Server.MapPath("\") & "\database\beeyee.mdb" ''假设数据库存放在主页根目录下的data目录下
Set conn = Server.CreateObject("ADODB.connection")
conn.Open strProvider ''打开数据库连接
%>
<%
Dim S_Key,rs,StrSQL
S_Key = Trim(Request("key")) ''得到搜索关键字的值
If S_Key <>"" then
Set rs=Server.CreateObject("ADODB.RecordSet")
StrSQL=AutoKey(S_Key) ''此处使用自定义函数 AutoKey(),该函数为实现智能搜索的核心
rs.Open StrSQL,conn,3,2 ''得到搜索后的记录
page=1 ' 设置变量PAGE=1
rs.PageSize = 5 '每页显示记录数
if Not IsEmpty(Request("Page")) then '如果PAGE已经初始化...
Page = CInt(Request("Page")) '接收PAGE并化为数字型赋给PAGE变量
if Page > rs.PageCount then '如果接收的页数大于总页数
rs.AbsolutePage = rs.PageCount '设置当前显示页等于最后页
elseif Page <= 0 then '如果page小于等于0
Page = 1 '设置PAGE等于第一页
else
rs.AbsolutePage = Page '如果大于零,显示当前页等于接收的页数
end if
End if
Page = rs.AbsolutePage
%>
<%
For i = 1 to rs.PageSize
if rs.EOF then
Exit For
end if '利用for next 循环依次读出记录
%>
<%=rs("title")%><br>
<%rs.MoveNextnext%>
<%if request("page")>1 then%><a Href="result.asp?Page=<% = 1%>">首页</a> <a Href="result.asp?Page=<% =request("page") -1 %>">上一页</a><%end if %><%if request("page")<>rs.pagecount then %><a Href="result.asp?Page=<% =request("page") + 1%>">下一页</a> <a Href="result.asp?Page=<% = rs.PageCount%>">尾页</a> <% end if %>
<%
rs.close
Set rs = Nothing
%>
<%
Function AutoKey(strKey)
CONST lngSubKey=2
Dim lngLenKey, strNew1, strNew2, i, strSubKey
''检测字符串的合法性,若不合法则转到出错页。出错页你可以根据需要进行设定。
if InStr(strKey,"=")<>0 or InStr(strKey,"`")<>0 or InStr(strKey,"''")<>0 or InStr(strKey," ")<>0 or InStr(strKey," ")<>0 or InStr(strKey,"''")<>0 or InStr(strKey,chr(34))<>0 or InStr(strKey,"\")<>0 or InStr(strKey,",")<>0 or InStr(strKey,"<")<>0 or InStr(strKey,">")<>0 then
Response.write "对不起,请不要用非法字符进行搜索!"
End If
lngLenKey=Len(strKey)
Select Case lngLenKey
Case 0 ''若为空串,转到出错页
Response.write "对不起,没有找到满足搜索条件的记录!"
Case 1 ''若长度为1,则不设任何值
strNew1=""
strNew2=""
Case Else ''若长度大于1,则从字符串首字符开始,循环取长度为2的子字符串作为查询条件
For i=1 To lngLenKey-(lngSubKey-1)
strSubKey=Mid(strKey,i,lngSubKey)
strNew1=strNew1 & " or title like '%" & strSubKey & "%'"
strNew2=strNew2 & " or content like '%" & strSubKey & "%'"
Next
End Select
''得到完整的SQL语句
AutoKey="Select * from news where title like '%" & strKey & "%' or content like '%" & strKey & "%'" & strNew1 & strNew2
End Function
%>
<%
conn.close
set conn=nothing
%>
用于搜索的表news:
id int
title nvarchar
content ntext
如果用阿笨狗的方法,不分页显示的话,一切正常,如果加上分页,则显示结果为:
Microsoft VBScript 编译器错误 错误 '800a03ea'
语法错误
/result.asp,行106
Function AutoKey(strKey)
除了想结果这个分页显示的问题外,我还想在搜索结果里显示content的一部分内容(必须要包括这个搜索的关键字),并且把搜索的关键字在这个content中用红色表示,该如何解决呢?