首 页 网络编程
网页制作 图形图象 操作系统 冲浪宝典
软件教学 认证考试

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 网络编程-> ASP教程
基于asp的站内多值搜索
作者:网友供稿 点击:91
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
运行环境:IIS
脚本语言:VBScript
数据库:Access/SQL Server
数据库语言:SQL
 
1.概要:
不论是在论坛,还是新闻系统,或是下载系统等动态网站中,大家经常会看到搜索功能:搜索帖子,搜索用户,搜索软件(总之搜索关键字)等,本文则是介绍如何建立一个高效实用的,基于ASP的站内多值搜索。

本文面对的是“多条件模糊匹配搜索”,理解了多条件的,单一条件搜索也不过小菜一碟了。一般来讲,有两种方法进行多条件搜索:枚举法和递进法。搜索条件不太多时(n<=3),可使用枚举法,其语句频度为2的n次方,成指数增长,n为条件数。很明显,当条件增多以后,无论从程序的效率还是可实现性考虑都应采用递进法,其语句频度为n,成线性增长。需要指出的是,枚举法思路非常简单,一一判断条件是否为空,再按非空条件搜索,同时可以利用真值表技术来对付条件极多的情况(相信没人去干这种事,4条件时就已经要写16组语句了);递进法的思想方法较为巧妙,重在理解,其巧就巧在一是使用了标志位(flag),二是妙用SQL中字符串连接符&。下面以实例来讲解引擎的建立。

2.实例:
我们建立一通讯录查询引擎,数据库名为addressbook.mdb,表名为address,字段如下:

ID
Name
Tel
School
1
张 三
33333333
电子科技大学计算机系
2
李 四
44444444
四川大学生物系
3
王 二
22222222
西南交通大学建筑系


Web搜索界面如下:

姓名:
电话:
学校:
搜索按钮


采用枚举法的源程序如下:
<%@ CODEPAGE = "936" %>
连接数据库
<%
dim conn
  dim DBOath
dim rs
dim sql
  Set conn=Server.CreateObject("ADODB.Connection")
  DBPath = Server.MapPath("addressbook.mdb")
  conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
从Web页获取姓名、电话、学校的值
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
枚举法的搜索核心,因为有3个条件所以要写8组If判断语句
  if trim(Name)="" and trim(Tel)="" and trim(School)="" then
     sql="select * from address order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)="" and trim(School)<>"" then
     sql="select * from address where School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)<>"" and trim(School)="" then
     sql="select * from address where Tel like %"&trim(Tel)&"% order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
     sql="select * from address where Tel like %"&trim(Tel)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)="" and trim(School)="" then
     sql="select * from address where Name like %"&trim(Name)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)="" and trim(School)<>"" then
     sql="select * from address where Name like %"&trim(Name)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)<>"" and trim(School)="" then
     sql="select * from address where Name like %"&trim(Name)&"% and Tel like %"&trim(Tel)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)<>"" and trim(School)<>"" then
     sql="select * from address where Name like %"&trim(Name)&"% and Tel like %"&trim(Tel)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
rs.open sql,conn,1,1
显示搜索结果
if rs.eof and rs.bof then      
     response.write "目前通讯录中没有记录"
else
   do while not rs.eof
      response.write "姓名:"&rs("Name")&"电话:"&rs("Tel")&"学校:"&rs("School")&"<br>"
      rs.movenext
   loop
end if
断开数据库
set rs=nothing        
  conn.close     
  set conn=nothing
%>

理解上述程序时,着重琢磨核心部分,8组语句一一对应了3个搜索框中的8种状态

Name
Tel
School
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空


另外trim()是VB的函数,将输入的字符串前后的空格去掉;%是SQL语言中的多字符通配符(_是单字符通配符),由此可见%"&trim()&"%对搜索框中输入的关键字是分别向左向右匹配的;SQL语言中用and连接说明非空条件之间是“与”关系。
 
再来看看递进法,与枚举法相比它们只有核心部分不同:
递进法的搜索核心,依次判断条件为空否,非空则将其加入搜索条件
sql="select * from address where"
if Name<>"" then
sql=sql&" Name like %"&Name&"% "
  flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" and Tel like %"&Tel&"%"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like %"&Tel&"%"
flag=1
end if
if Company<>"" and flag=1 then
sql=sql&" and Company like %"&Company&"%"
flag=1
elseif Company <>"" then
sql=sql&" Company like %"&Company&"%"
flag=1
end if
if flag=0 then
   sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1

递进法是一个明智的算法,单从语句的长短就可以看出来了。这个算法的难点和精髓就在flag和&上。首先你应该清楚&在SQL中就是一个字符串连接符,把该符号左右的字符拼接在一起。再回到程序,当Name不为空时sql="select * from address where Name like %"&Name&"% "同时flag=1;接下来当Name不为空时且Tel不为空时,即Tel<>"" and flag=1时,sql="select * from address where Name like %"&Name&"% and Tel like %"&Tel&"% "同时flag=1,否则当Name为空Tel不为空,sql="select * from address where Tel like %"&Tel&"% "同时flag=1;以此类推就可以推广到n个条件的搜索。当然条件皆为空时,即flag=0将选择所有表中所有项。

3.验证:

至此,一个搜索引擎就建立起来了。以下是一些使用示例:

姓名:张
电话:
学校:
搜索按钮

 
搜索结果为:
姓名: 张三 电话:33333333 单位:电子科技大学计算机系
 

姓名:
电话:
学校:大学
搜索按钮

 
搜索结果为:
姓名:张三 电话:33333333 单位:电子科技大学计算机系
姓名  李 四 电话:44444444 单位:四川大学生物系
姓名:王二 电话:22222222 单位:西南交通大学建筑系

姓名:
电话:4444
学校:四川
搜索按钮

 
搜索结果为:
姓名  李 四 电话:44444444 单位:四川大学生物系

姓名:
电话:
学校:交%大
搜索按钮

 
搜索结果为:
姓名:王二 电话:22222222 单位:西南交通大学建筑系

4.改进:
其实这个引擎还有些缺陷,问题主要在于通配符%。一方面是因为人们平时习惯把*作为通配符,另一方面%若出现在超链接中,通过request获取时%将被“吃”掉,如下:

--test.htm--
…    
<a href=test.asp?content=test%the%sign>click here</a>


--test.asp--
<%
content=request(“content”)
response.write content
%>

在IE中浏览test.htm时点击超链接,显示为:
testthesign
可见%直接被超链接忽略掉了。怎么才能解决这个问题呢?很简单,我们做点小小的手脚--偷梁换柱。
将以下代码加在搜索核心之前:
Name=replace(Name,"*","%")
Tel=replace(Tel,"*","%")
Company=replace(Company,"*","%")
将以下代码加在搜索核心之后:
Name=replace(Name,"%","*")
Tel=replace(Tel,"%","*")
Company=replace(Company,"%","*")
在我们来分析一下这些语句。replace()是VB中字符串替换函数,replace(Name,"*","%") 就是将Name中所有的*换成%。也就是说,我们把3个条件中凡是出现的*都替换为%,这样一来前3句就将通配符改成*了。而后3句就可以防止%被“吃”掉。所有问题就迎刃而解了吧。

姓名:
电话:
学校:交%大
搜索按钮


搜索结果为:
姓名:王 二 电话:22222222 单位:西南交通大学建筑系

将上面的语句再改一改,把*用空格代替,不就成了我们在Google、BaiDu中常用的用空格来分开搜索条件的搜索引擎了吗?

运行环境:IIS
脚本语言:VBScript
数据库:Access/SQL Server
数据库语言:SQL
 
1.概要:
不论是在论坛,还是新闻系统,或是下载系统等动态网站中,大家经常会看到搜索功能:搜索帖子,搜索用户,搜索软件(总之搜索关键字)等,本文则是介绍如何建立一个高效实用的,基于ASP的站内多值搜索。

本文面对的是“多条件模糊匹配搜索”,理解了多条件的,单一条件搜索也不过小菜一碟了。一般来讲,有两种方法进行多条件搜索:枚举法和递进法。搜索条件不太多时(n<=3),可使用枚举法,其语句频度为2的n次方,成指数增长,n为条件数。很明显,当条件增多以后,无论从程序的效率还是可实现性考虑都应采用递进法,其语句频度为n,成线性增长。需要指出的是,枚举法思路非常简单,一一判断条件是否为空,再按非空条件搜索,同时可以利用真值表技术来对付条件极多的情况(相信没人去干这种事,4条件时就已经要写16组语句了);递进法的思想方法较为巧妙,重在理解,其巧就巧在一是使用了标志位(flag),二是妙用SQL中字符串连接符&。下面以实例来讲解引擎的建立。

2.实例:
我们建立一通讯录查询引擎,数据库名为addressbook.mdb,表名为address,字段如下:

ID
Name
Tel
School
1
张 三
33333333
电子科技大学计算机系
2
李 四
44444444
四川大学生物系
3
王 二
22222222
西南交通大学建筑系


Web搜索界面如下:

姓名:
电话:
学校:
搜索按钮


采用枚举法的源程序如下:
<%@ CODEPAGE = "936" %>
连接数据库
<%
dim conn
  dim DBOath
dim rs
dim sql
  Set conn=Server.CreateObject("ADODB.Connection")
  DBPath = Server.MapPath("addressbook.mdb")
  conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=" & DBPath
Set rs=Server.CreateObject("ADODB.Recordset")
从Web页获取姓名、电话、学校的值
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
枚举法的搜索核心,因为有3个条件所以要写8组If判断语句
  if trim(Name)="" and trim(Tel)="" and trim(School)="" then
     sql="select * from address order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)="" and trim(School)<>"" then
     sql="select * from address where School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)<>"" and trim(School)="" then
     sql="select * from address where Tel like %"&trim(Tel)&"% order by ID asc"
  end if
  if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
     sql="select * from address where Tel like %"&trim(Tel)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)="" and trim(School)="" then
     sql="select * from address where Name like %"&trim(Name)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)="" and trim(School)<>"" then
     sql="select * from address where Name like %"&trim(Name)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)<>"" and trim(School)="" then
     sql="select * from address where Name like %"&trim(Name)&"% and Tel like %"&trim(Tel)&"% order by ID asc"
  end if
  if trim(Name)<>"" and trim(Tel)<>"" and trim(School)<>"" then
     sql="select * from address where Name like %"&trim(Name)&"% and Tel like %"&trim(Tel)&"% and School like %"&trim(School)&"% order by ID asc"
  end if
rs.open sql,conn,1,1
显示搜索结果
if rs.eof and rs.bof then      
     response.write "目前通讯录中没有记录"
else
   do while not rs.eof
      response.write "姓名:"&rs("Name")&"电话:"&rs("Tel")&"学校:"&rs("School")&"<br>"
      rs.movenext
   loop
end if
断开数据库
set rs=nothing        
  conn.close     
  set conn=nothing
%>

理解上述程序时,着重琢磨核心部分,8组语句一一对应了3个搜索框中的8种状态

Name
Tel
School
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空
非空


另外trim()是VB的函数,将输入的字符串前后的空格去掉;%是SQL语言中的多字符通配符(_是单字符通配符),由此可见%"&trim()&"%对搜索框中输入的关键字是分别向左向右匹配的;SQL语言中用and连接说明非空条件之间是“与”关系。
 
再来看看递进法,与枚举法相比它们只有核心部分不同:
递进法的搜索核心,依次判断条件为空否,非空则将其加入搜索条件
sql="select * from address where"
if Name<>"" then
sql=sql&" Name like %"&Name&"% "
  flag=1
end if
if Tel<>"" and flag=1 then
sql=sql&" and Tel like %"&Tel&"%"
flag=1
elseif Tel<>"" then
sql=sql&" Tel like %"&Tel&"%"
flag=1
end if
if Company<>"" and flag=1 then
sql=sql&" and Company like %"&Company&"%"
flag=1
elseif Company <>"" then
sql=sql&" Company like %"&Company&"%"
flag=1
end if
if flag=0 then
   sql="select * from address order by ID asc"
end if
rs.open sql,conn,1,1

递进法是一个明智的算法,单从语句的长短就可以看出来了。这个算法的难点和精髓就在flag和&上。首先你应该清楚&在SQL中就是一个字符串连接符,把该符号左右的字符拼接在一起。再回到程序,当Name不为空时sql="select * from address where Name like %"&Name&"% "同时flag=1;接下来当Name不为空时且Tel不为空时,即Tel<>"" and flag=1时,sql="select * from address where Name like %"&Name&"% and Tel like %"&Tel&"% "同时flag=1,否则当Name为空Tel不为空,sql="select * from address where Tel like %"&Tel&"% "同时flag=1;以此类推就可以推广到n个条件的搜索。当然条件皆为空时,即flag=0将选择所有表中所有项。

3.验证:

至此,一个搜索引擎就建立起来了。以下是一些使用示例:

姓名:张
电话:
学校:
搜索按钮

 
搜索结果为:
姓名: 张三 电话:33333333 单位:电子科技大学计算机系
 

姓名:
电话:
学校:大学
搜索按钮

 
搜索结果为:
姓名:张三 电话:33333333 单位:电子科技大学计算机系
姓名  李 四 电话:44444444 单位:四川大学生物系
姓名:王二 电话:22222222 单位:西南交通大学建筑系

姓名:
电话:4444
学校:四川
搜索按钮

 
搜索结果为:
姓名  李 四 电话:44444444 单位:四川大学生物系

姓名:
电话:
学校:交%大
搜索按钮

 
搜索结果为:
姓名:王二 电话:22222222 单位:西南交通大学建筑系

4.改进:
其实这个引擎还有些缺陷,问题主要在于通配符%。一方面是因为人们平时习惯把*作为通配符,另一方面%若出现在超链接中,通过request获取时%将被“吃”掉,如下:

--test.htm--
…    
<a href=test.asp?content=test%the%sign>click here</a>


--test.asp--
<%
content=request(“content”)
response.write content
%>

在IE中浏览test.htm时点击超链接,显示为:
testthesign
可见%直接被超链接忽略掉了。怎么才能解决这个问题呢?很简单,我们做点小小的手脚--偷梁换柱。
将以下代码加在搜索核心之前:
Name=replace(Name,"*","%")
Tel=replace(Tel,"*","%")
Company=replace(Company,"*","%")
将以下代码加在搜索核心之后:
Name=replace(Name,"%","*")
Tel=replace(Tel,"%","*")
Company=replace(Company,"%","*")
在我们来分析一下这些语句。replace()是VB中字符串替换函数,replace(Name,"*","%") 就是将Name中所有的*换成%。也就是说,我们把3个条件中凡是出现的*都替换为%,这样一来前3句就将通配符改成*了。而后3句就可以防止%被“吃”掉。所有问题就迎刃而解了吧。

姓名:
电话:
学校:交%大
搜索按钮


搜索结果为:
姓名:王 二 电话:22222222 单位:西南交通大学建筑系

将上面的语句再改一改,把*用空格代替,不就成了我们在Google、BaiDu中常用的用空格来分开搜索条件的搜索引擎了吗?

文章整理:站长天空 网址:http://www.z6688.com/
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·在ASP.NET中使用Office Web Components (OWC)创建统计图-.NET教程,数据库应用
·windows系统下jsp+mysql+tomcat的配置-JSP教程,Application/Applet
·把aspx文件编译成DLL文件-.NET教程,Asp.Net开发
·Haneng.com的简单留言板制作源程序例子-ASP教程,ASP应用
·使用VB实现邮箱自动注册(一):表单自动提交-.NET教程,VB.Net语言
·VS.NET安装指南(To菜鸟)-.NET教程,Asp.Net开发
·web下水晶报表的使用!-.NET教程,Web Service开发
·C# 静态成员和方法的学习小结-.NET教程,数据库应用
·IIS的使用-ASP教程,ASP基础
·asp讲座之二:读取通过表单发送的数据
最新文章
·photoshop鼠绘实例:浪漫夏夜壁纸_photoshop教程
·买卖中小网站交易的一些细节问题_站长心得
·七招打造最安全的windows xp操作系统_windows xp
·做google adsense最佳和最重要的要诀_网赚技巧
·上下文关联广告清单(内文广告)推荐_网赚技巧
·广告联盟,痛定思痛_网赚技巧
·insenz首批广告费发放给站长_网赚技巧
·李彦宏:三分之一时间用在寻找人才_站长访谈
·中国汽车资源网杨锁民:网络寒冬时下海_站长访谈
·做it新闻资讯网站应先学新浪_站长心得
相关主题
  • 基于asp.net ajax的webpart开发与部署_ajax教程
  • 基于ASP的收发文管理系统的设计与实现-ASP教程,ASP应用
  • 基于ASP的编程常见问题-ASP教程,ASP应用
  • 基于ASP的站内多值搜索-ASP教程,ASP应用
  • 基于ASP的站内多值搜索-ASP教程,ASP应用
  • 西部数码虚拟主机

    友情链接
    CNNIC 西部数码
    万网 自助建站
    虚拟主机 asp空间
    域名注册 域名
    域名申请 主页空间
    论坛空间 网站空间
    国际域名 虚拟空间
    空间租用 DDOS防火墙
    成都主机托管 四川主机托管
    主机租用 服务器租用
    网站目录 自助建站
    虚拟主机 网址大全
    软件下载
    自助链接
    虚拟主机资讯 特价虚拟主机
    版权申明:本站文章均来自网络,如有侵权,请联系我们,我们收到后立即删除,谢谢!
    关于我们:站长天空:专业提供最新的站长资讯、在线教程、虚拟主机权威评测、虚拟主机性能对比、网站制作教程,开发教程,站长工具。包括网页制作教程、冲浪宝典、编程参考、操作系统、软件教学、行业动态等。
    特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有。
    发表评论 打印  刷新     关闭