|
蓝森林 http://www.lslnet.com 2006年8月25日 8:28
[ASP]关于站内搜索结果分页显示和突出显示搜索关键词的疑惑!
从网上找到站内搜索的代码以及分页显示的代码,整合到一起,基本可用,现在有两个问题:
一,假如结果有70条记录,设定每页显示20条,以目前的方法,点下一页或者最后页的时候会出现错误提示:
Microsoft VBScript 运行时错误 错误 '800a01a8'
缺少对象: ''
/result.asp,行143
第143行为:
rs.close
2、现在已能在搜索结果里将搜索关键词突出为红色显示,但是显示的是全部内容,我只想显示前150个字符,改如何实现?
程序说明:
所有表news,字段 id,title,content
查询页面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\abcd.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 = 20 '每页显示记录数
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 循环依次读出记录
%>
<font color="red"><%=rs("title")%></font><br>
<%
content=Rs("content")
Response.write(Replace(content,S_Key,"<font color=red>" & S_Key & "</font>"))
response.write (content)
%>
<%rs.MoveNext%>
<%next%>
<br>
<%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 %>
<%
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
%>
<%end if%>
<%
rs.close
Set rs = Nothing
conn.close
set conn=nothing
%>
|
|