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

网络安全 网络办公 行业资讯 评测对比
您当前位置:站长天空 -> 软件教学-> 文件管理
基于ASP的站内多值搜索-ASP教程,ASP应用
作者:网友供稿 点击:21
推荐
西部数码-全国虚拟主机10强!20余项虚拟主机管理功能,全国领先!第6代双线路虚拟主机,南北访问畅通无阻!可在线rar解压,自动数据恢复设置虚拟目录等.免费赠送访问统计,企业邮局.Cn域名注册10元/年,自助建站480元起,免费试用7天,满意再付款!P4主机租用799元/月.月付免压金
站内搜索
文章页数:[1] 
运行环境:iis
脚本语言:vbscript
数据库:access/sql server
数据库语言:sql

1.         概要:
不论是在论坛,还是新闻系统,或是下载系统等动态网站中,大家经常会看到搜索功能:搜索帖子,搜索用户,搜索软件(总之搜索关键字)等,本文则是介绍如何建立一个高效实用的,基于asp的站内多值搜索。

本文面对的是“多条件模糊匹配搜索”,理解了多条件的,单一条件搜索也不过小菜一碟了。一般来讲,有两种方法进行多条件搜索:枚举法递进法。搜索条件不太多时(n<=3,可使用枚举法,其语句频度为2n次方,成指数增长,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 单位:
西南交通大学建筑系

将上面的语句再改一改,把*用空格代替,不就成了我们在googlebaidu中常用的用空格来分开搜索条件的搜索引擎了吗?自己动手,你也可以做一个“多条件模糊匹配”的搜索引擎了。



写这篇文章的时候,还不知blog为何物。今天整理文档,翻出来发上来,希望还没过时。
西南交通大学建筑系

将上面的语句再改一改,把*用空格代替,不就成了我们在googlebaidu中常用的用空格来分开搜索条件的搜索引擎了吗?自己动手,你也可以做一个“多条件模糊匹配”的搜索引擎了。



写这篇文章的时候,还不知blog为何物。今天整理文档,翻出来发上来,希望还没过时。


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

文章页数:[1] 


放大字体显示 缩小字体显示 打印文章 推荐给朋友
热门文章
·C#:ListBox的2个常用方法Add,Clear与Items的2个属性-.NET教程,C#语言
·java连接sqlserver实例-JSP教程,Java技巧及代码
·Hibernate下数据批量处理解决方案-JSP教程,数据库相关
·一种基于pwm的电压输出dac电路设计
·delegate 与 多线程-.NET教程,算法/线程
·java Logging API 使用-JSP教程,Java技巧及代码
·ORACLE中LOB字段的使用和维护-ASP教程,数据库相关
·ups功率因数越大越好吗
·.NET三层经典架构PetShop3.0分析连载一-.NET教程,.NET Framework
·ASP后门之终极伪装-ASP教程,ASP基础
最新文章
·windows vista系统隐藏的12个网络工具_windows vista
·网站赚钱应如何选择网站联盟?_网赚技巧
·建站一级攻略 从看完之后就开始_站长心得
·论坛建设9大定律和经验分享_站长心得
·dreamweaver制作复杂交换图像_dreamweaver教程
·让你google广告90%不是公益广告的方法_google推广
·ppc 广告与转换率息息相关_google推广
·中国个人网站——新经济中的非主流1_站长心得
·blog设计的7个趋势_站长心得
·2005岁末blog程序大评点_站长心得
相关主题
  • 基于asp.net ajax的webpart开发与部署_ajax教程
  • 基于ASP的收发文管理系统的设计与实现-ASP教程,ASP应用
  • 基于ASP的编程常见问题-ASP教程,ASP应用
  • 基于ASP的站内多值搜索-ASP教程,ASP应用
  • 基于ASP.NET实现全球化-.NET教程,Asp.Net开发
  • 西部数码虚拟主机

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