Ambiente de execução: IIS
Linguagem de script: VBScript
Banco de dados: Access/SQL Server
Linguagem de banco de dados: SQL
1. resumo:
Seja em sites dinâmicos, como fóruns, sistemas de notícias ou sistemas de download, você costuma ver funções de pesquisa: pesquisa de postagens, pesquisa de usuários, pesquisa de software (em resumo, pesquisa de palavras-chave), etc. eficiente Pesquisa prática de vários valores em sites baseados em ASP.
Este artigo trata da "pesquisa de correspondência difusa de múltiplas condições". Depois de compreender as múltiplas condições, a pesquisa de condição única é muito fácil. De modo geral, existem dois métodos para pesquisa multicondição: método de enumeração e método progressivo. Quando não há muitas condições de pesquisa ( n <=3), o método de enumeração pode ser usado. A frequência das declarações é 2 elevado à enésima potência, crescendo exponencialmente. Obviamente, quando o número de condições aumenta, o método progressivo deve ser adotado independentemente da eficiência ou realizabilidade do programa. A frequência de declaração é n e cresce linearmente. Deve-se ressaltar que a ideia do método de enumeração é muito simples. Ele determina se as condições estão vazias uma por uma e, em seguida, pesquisa de acordo com as condições não vazias. ser usado para lidar com situações com muitas condições (acredito que ninguém fará esse tipo de coisa), quando há 4 condições, você tem que escrever 16 grupos de afirmações; o método progressivo é mais engenhoso, com foco na compreensão). O primeiro é o uso de sinalizadores (flag) e o segundo é o uso inteligente de conexões de string no símbolo SQL&. A seguir são usados exemplos para explicar o estabelecimento do mecanismo.
2. Exemplo:
Construímos um mecanismo de consulta de catálogo de endereços. O nome do banco de dados é addressbook.mdb, o nome da tabela é endereço e os campos são os seguintes:
Nome | de identificação | Tel | Escola |
1 | Zhang San | 33333333 | Departamento de Ciência da Computação, Universidade de Ciência Eletrônica e Tecnologia da China |
2 | Li Si | 44444444 | Departamento de Biologia, Universidade de Sichuan |
3 | Wang Er | 22222222 | Departamento de Arquitetura, Southwest Jiaotong University |
… | … | … | … |
A interface de pesquisa na web é a seguinte:
Nome: | Telefone: | Escola: | Botão Pesquisar |
O programa fonte usando o método de enumeração é o seguinte:
<%@ CODEPAGE = "936" %>
'Conectar ao banco de dados
<%
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")
'Obtém o nome e o telefone número da página da Web, o valor da escola
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'O núcleo de pesquisa do método de enumeração, porque existem três condições, então devem ser escritos 8 conjuntos de declarações de julgamento
If if trim(Name)="" and trim(Tel)="" and trim(School)="" then
sql="select * from address order por ID asc"
end if
if trim(Name)= "" and trim(Tel)="" and trim(School)<>"" then
sql="select * from address where School like '%"&trim(School)& "%' ordenar por ID asc"
end if
if trim (Name)="" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Tel like '%"&trim (Tel)&"%' ordenar por ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
sql="select * from address where Tel como '%"&trim(Tel)&"%' e Escola como '%"&trim(School)&"%' ordenar por ID asc"
end if
if trim(Name)<>"" e trim(Tel)="" e trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel )="" e trim(School)<>" " then
sql="select * from address where Name like '%"&trim(Name)&"%' e School like '%"&trim(School)&"%' order por ID asc"
end if
if trim(Name)< >"" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Name like '%"&trim(Name) &"%' e Tel como '%"&trim( Tel)&"%' ordenar por ID asc"
end if
if trim(Nome)<>"" e trim(Tel)<>"" e trim(School)<> "" then
sql="select * from address where Name like '%"&trim(Name)&"%' e Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Exibe os resultados da pesquisa
se rs.eof e rs.bof then
response.write "Não há registro no catálogo de endereços atual"
else
do while not rs.eof
response.write "Nome:"&rs("Nome" )&"Telefone:"&rs("Tel")&"Escola:"&rs("Escola")&"<br>"
rs.movenext
loop
end if
'Desconecte o
conjunto de banco de dados rs=nothing
conn.close
set conn=nothing
%>
Ao compreender o programa acima, concentre-se na parte central. Os 8 grupos de afirmações correspondem aos 8 estados nas 3 caixas de pesquisa, um por um.
Nome | Tel | Escola |
| |
Vazio | | Vazio | Vazio | Vazio |
| Vazio | |
| Não |
| Vazio |
| |
Além disso, trim() é uma função VB que remove os espaços antes e depois da string de entrada. % é um curinga de vários caracteres na linguagem SQL (_ é um curinga de um único caractere), então pode ser visto que %" &trim()&"% é muito útil para a caixa de pesquisa. As palavras-chave inseridas são correspondidas da esquerda para a direita, respectivamente; na linguagem SQL, e a conexão é usada para indicar que existe um relacionamento "AND" entre condições não vazias.
Vamos dar uma olhada no método progressivo Em comparação com o método de enumeração, eles diferem apenas na parte principal:
'O núcleo da pesquisa do método progressivo é julgar se a condição está vazia ou não. para a condição de pesquisa
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&" e Tel como '%"&Tel&"% '"
flag=1
elseif Tel<>"" então
sql=sql&" Tel como '%"&Tel&"%'"
flag=1
end if
if Empresa<>"" e flag=1 then
sql=sql&" e Empresa como ' %"&Company&"%'"
flag=1
elseif Empresa <>"" then
sql=sql&" Empresa como '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="selecione * da ordem de endereço por ID asc"
end if
rs.open sql,conn,1,1
O método de progressão é um algoritmo inteligente, como pode ser visto apenas pela extensão das declarações. A dificuldade e a essência deste algoritmo estão na bandeira e &. Em primeiro lugar, você deve saber que & é um símbolo de concatenação de strings em SQL, que une os caracteres ao redor do símbolo. De volta ao programa novamente, quando Name não estiver vazio, sql="select * from address where Name like '%"&Name&"%' "e flag=1; Tel<>"" e flag=1, sql="select * from address where Name like '%"&Name&"%' e Tel like '%"&Tel&"%' "while flag=1, caso contrário quando Name estiver vazio Tel Not vazio, sql="select * from address where Tel like '%"&Tel&"%' "e flag=1 e assim por diante, pode ser estendido para pesquisar com n condições. Claro, quando todas as condições estiverem vazias, ou seja, flag=0 selecionará todos os itens em todas as tabelas.
3. verificar:
Neste ponto, um mecanismo de busca é estabelecido. Aqui estão alguns exemplos de uso:
Nome: Zhang | Telefone: | Escola: | Botão Pesquisar |
Os resultados da pesquisa são:
Nome: Zhang San Tel: 33333333 Unidade: Departamento de Ciência da Computação, Universidade de Ciência Eletrônica e Tecnologia da China
Nome: | Telefone: | Escola: | Botão de pesquisa | da faculdade
Os resultados da pesquisa são:
Nome: Zhang San Tel: 33333333 Unidade: Departamento de Ciência da Computação, Universidade de Ciência e Tecnologia Eletrônica da China
Nome Li Si Tel: 44444444 Unidade: Departamento de Biologia, Universidade de Sichuan
Nome: Wang Er Tel: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
Nome: | Telefone: 4444 | Escola: | Botão de pesquisa | de Sichuan
Os resultados da pesquisa são:
Nome Li Si Telefone: 44444444 Unidade: Departamento de Biologia, Universidade de Sichuan
Nome: | Telefone: | Escola: Pagamento% | Botão grande de pesquisa |
Os resultados da pesquisa são:
Nome: Wang Er Telefone: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
4. melhorar:
Na verdade, este mecanismo ainda apresenta algumas falhas. O problema reside principalmente no caractere curinga%. Por um lado, isso ocorre porque as pessoas estão acostumadas a usar * como caractere curinga. Por outro lado, se % aparecer em um hiperlink, % será "comido" quando obtido por meio de solicitação, da seguinte forma:
--test.htm--
…
<a href=test.asp?content=test%the%sign>clique aqui</a>
…
--test.asp--
<%
conteúdo=solicitação("conteúdo")
conteúdo de resposta.write
%>
Ao navegar test.htm no IE, clique no hiperlink e ele será exibido como:
testar o sinal
Pode-se observar que % é diretamente ignorado pelo hiperlink. Como podemos resolver este problema? É muito simples, fazemos um pequeno truque - subvertemos a viga e trocamos o pilar.
Adicione o seguinte código antes do núcleo de pesquisa:
Nome=substituir(Nome,"*","%")
Tel=substituir(Tel,"*","%")
Empresa=substituir(Empresa,"*","%")
Adicione o seguinte código após o núcleo de pesquisa:
Nome=substituir(Nome,"%","*")
Tel=substituir(Tel,"%","*")
Empresa=substituir(Empresa,"%","*")
Vamos analisar essas afirmações. replace() é uma função de substituição de string em VB replace(Name,"*","%") é substituir todos os * em Name por%. Em outras palavras, substituímos todas as ocorrências de * nas três condições por %, para que os caracteres curinga nas três primeiras sentenças sejam alterados para *. As próximas três frases podem impedir que % seja "comido". Todos os problemas serão resolvidos.
Nome: | Telefone: | Escola: Pagamento% | Botão grande de pesquisa |
Os resultados da pesquisa são:
Nome: Wang Er Tel: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
Altere a afirmação acima novamente e substitua * por espaços. Não seria o mecanismo de pesquisa que normalmente usamos espaços para separar as condições de pesquisa no Google e no Baidu?
Ambiente de execução: IIS
Linguagem de script: VBScript
Banco de dados: Access/SQL Server
Linguagem de banco de dados: SQL
1. resumo:
Seja em sites dinâmicos, como fóruns, sistemas de notícias ou sistemas de download, você costuma ver funções de pesquisa: pesquisa de postagens, pesquisa de usuários, pesquisa de software (em resumo, pesquisa de palavras-chave), etc. eficiente Pesquisa prática de vários valores em sites baseados em ASP.
Este artigo trata da "pesquisa de correspondência difusa de múltiplas condições". Depois de compreender as múltiplas condições, a pesquisa de condição única é muito fácil. De modo geral, existem dois métodos para pesquisa multicondição: método de enumeração e método progressivo. Quando não há muitas condições de pesquisa ( n <=3), o método de enumeração pode ser usado. A frequência das declarações é 2 elevado à enésima potência, crescendo exponencialmente. Obviamente, quando o número de condições aumenta, o método progressivo deve ser adotado independentemente da eficiência ou realizabilidade do programa. A frequência de declaração é n e cresce linearmente. Deve-se ressaltar que a ideia do método de enumeração é muito simples. Ele determina se as condições estão vazias uma por uma e, em seguida, pesquisa de acordo com as condições não vazias. ser usado para lidar com situações com muitas condições (acredito que ninguém fará esse tipo de coisa), quando há 4 condições, você tem que escrever 16 grupos de afirmações; o método progressivo é mais engenhoso, com foco na compreensão). O primeiro é o uso de sinalizadores (flag) e o segundo é o uso inteligente de conexões de string no símbolo SQL&. A seguir são usados exemplos para explicar o estabelecimento do mecanismo.
2. Exemplo:
Construímos um mecanismo de consulta de catálogo de endereços. O nome do banco de dados é addressbook.mdb, o nome da tabela é endereço e os campos são os seguintes:
Nome | de identificação | Tel | Escola |
1 | Zhang San | 33333333 | Departamento de Ciência da Computação, Universidade de Ciência Eletrônica e Tecnologia da China |
2 | Li Si | 44444444 | Departamento de Biologia, Universidade de Sichuan |
3 | Wang Er | 22222222 | Departamento de Arquitetura, Southwest Jiaotong University |
… | … | … | … |
A interface de pesquisa na web é a seguinte:
Nome: | Telefone: | Escola: | Botão Pesquisar |
O programa fonte usando o método de enumeração é o seguinte:
<%@ CODEPAGE = "936" %>
'Conectar ao banco de dados
<%
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")
'Obtém o nome e o telefone número da página da Web, o valor da escola
dim Name
dim Tel
dim School
Name=request("Name")
Tel=request("Tel")
School=request("School")
'O núcleo de pesquisa do método de enumeração, porque existem três condições, então devem ser escritos 8 conjuntos de declarações de julgamento
If if trim(Name)="" and trim(Tel)="" and trim(School)="" then
sql="select * from address order por ID asc"
end if
if trim(Name)= "" and trim(Tel)="" and trim(School)<>"" then
sql="select * from address where School like '%"&trim(School)& "%' ordenar por ID asc"
end if
if trim (Name)="" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Tel like '%"&trim (Tel)&"%' ordenar por ID asc"
end if
if trim(Name)="" and trim(Tel)<>"" and trim(School)<>"" then
sql="select * from address where Tel como '%"&trim(Tel)&"%' e Escola como '%"&trim(School)&"%' ordenar por ID asc"
end if
if trim(Name)<>"" e trim(Tel)="" e trim(School)="" then
sql=" select * from address where Name like '%"&trim(Name)&"%' order by ID asc"
end if
if trim(Name)<>"" and trim(Tel )="" e trim(School)<>" " then
sql="select * from address where Name like '%"&trim(Name)&"%' e School like '%"&trim(School)&"%' order por ID asc"
end if
if trim(Name)< >"" and trim(Tel)<>"" and trim(School)="" then
sql="select * from address where Name like '%"&trim(Name) &"%' e Tel como '%"&trim( Tel)&"%' ordenar por ID asc"
end if
if trim(Nome)<>"" e trim(Tel)<>"" e trim(School)<> "" then
sql="select * from address where Name like '%"&trim(Name)&"%' e Tel like '%"&trim(Tel)&"%' and School like '%"&trim(School)&" %' order by ID asc"
end if
rs.open sql,conn,1,1
'Exibe os resultados da pesquisa
se rs.eof e rs.bof then
response.write "Não há registro no catálogo de endereços atual"
else
do while not rs.eof
response.write "Nome:"&rs("Nome" )&"Telefone:"&rs("Tel")&"Escola:"&rs("Escola")&"<br>"
rs.movenext
loop
end if
'Desconecte o
conjunto de banco de dados rs=nothing
conn.close
set conn=nothing
%>
Ao compreender o programa acima, concentre-se na parte central. Os 8 grupos de afirmações correspondem aos 8 estados nas 3 caixas de pesquisa, um por um.
Nome | Tel | Escola |
| |
Vazio | | Vazio | Vazio | Vazio |
| Vazio | |
| Não |
| Vazio |
| |
Além disso, trim() é uma função VB que remove os espaços antes e depois da string de entrada. % é um curinga de vários caracteres na linguagem SQL (_ é um curinga de um único caractere), então pode ser visto que %" &trim()&"% é muito útil para a caixa de pesquisa. As palavras-chave inseridas são correspondidas da esquerda para a direita, respectivamente; na linguagem SQL, e a conexão é usada para indicar que existe um relacionamento "AND" entre condições não vazias.
Vamos dar uma olhada no método progressivo Em comparação com o método de enumeração, eles diferem apenas na parte principal:
'O núcleo da pesquisa do método progressivo é julgar se a condição está vazia ou não. para a condição de pesquisa
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&" e Tel como '%"&Tel&"% '"
flag=1
elseif Tel<>"" então
sql=sql&" Tel como '%"&Tel&"%'"
flag=1
end if
if Empresa<>"" e flag=1 then
sql=sql&" e Empresa como ' %"&Company&"%'"
flag=1
elseif Empresa <>"" then
sql=sql&" Empresa como '%"&Company&"%'"
flag=1
end if
if flag=0 then
sql="selecione * da ordem de endereço por ID asc"
end if
rs.open sql,conn,1,1
O método de progressão é um algoritmo inteligente, como pode ser visto apenas pela extensão das declarações. A dificuldade e a essência deste algoritmo estão na bandeira e &. Em primeiro lugar, você deve saber que & é um símbolo de concatenação de strings em SQL, que une os caracteres ao redor do símbolo. De volta ao programa novamente, quando Name não estiver vazio, sql="select * from address where Name like '%"&Name&"%' "e flag=1; Tel<>"" e flag=1, sql="select * from address where Name like '%"&Name&"%' e Tel like '%"&Tel&"%' "while flag=1, caso contrário quando Name estiver vazio Tel Not vazio, sql="select * from address where Tel like '%"&Tel&"%' "e flag=1 e assim por diante, pode ser estendido para pesquisar com n condições. Claro, quando todas as condições estiverem vazias, ou seja, flag=0 selecionará todos os itens em todas as tabelas.
3. verificar:
Neste ponto, um mecanismo de busca é estabelecido. Aqui estão alguns exemplos de uso:
Nome: Zhang | Telefone: | Escola: | Botão Pesquisar |
Os resultados da pesquisa são:
Nome: Zhang San Tel: 33333333 Unidade: Departamento de Ciência da Computação, Universidade de Ciência Eletrônica e Tecnologia da China
Nome: | Telefone: | Escola: | Botão de pesquisa | da faculdade
Os resultados da pesquisa são:
Nome: Zhang San Tel: 33333333 Unidade: Departamento de Ciência da Computação, Universidade de Ciência e Tecnologia Eletrônica da China
Nome Li Si Tel: 44444444 Unidade: Departamento de Biologia, Universidade de Sichuan
Nome: Wang Er Tel: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
Nome: | Telefone: 4444 | Escola: | Botão de pesquisa | de Sichuan
Os resultados da pesquisa são:
Nome Li Si Telefone: 44444444 Unidade: Departamento de Biologia, Universidade de Sichuan
Nome: | Telefone: | Escola: Pagamento% | Botão grande de pesquisa |
Os resultados da pesquisa são:
Nome: Wang Er Telefone: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
4. melhorar:
Na verdade, este mecanismo ainda apresenta algumas falhas. O problema reside principalmente no caractere curinga%. Por um lado, isso ocorre porque as pessoas estão acostumadas a usar * como caractere curinga. Por outro lado, se % aparecer em um hiperlink, % será "comido" quando obtido por meio de solicitação, da seguinte forma:
--test.htm--
…
<a href=test.asp?content=test%the%sign>clique aqui</a>
…
--test.asp--
<%
conteúdo=solicitação("conteúdo")
conteúdo de resposta.write
%>
Ao navegar test.htm no IE, clique no hiperlink e ele será exibido como:
testar o sinal
Pode-se observar que% é ignorado diretamente pelo hiperlink. Como podemos resolver esse problema? É muito simples, fazemos um pequeno truque - subvertemos a viga e trocamos o pilar.
Adicione o seguinte código antes do núcleo de pesquisa:
Nome=substituir(Nome,"*","%")
Tel=substituir(Tel,"*","%")
Empresa=substituir(Empresa,"*","%")
Adicione o seguinte código após o núcleo de pesquisa:
Nome=substituir(Nome,"%","*")
Tel=substituir(Tel,"%","*")
Empresa=substituir(Empresa,"%","*")
Vamos analisar essas afirmações. replace() é uma função de substituição de string em VB replace(Name,"*","%") é substituir todos os * em Name por%. Em outras palavras, substituímos todas as ocorrências de * nas três condições por %, para que os caracteres curinga nas três primeiras sentenças sejam alterados para *. As próximas três frases podem impedir que % seja "comido". Todos os problemas serão resolvidos.
Nome: | Telefone: | Escola: Pagamento% | Botão grande de pesquisa |
Os resultados da pesquisa são:
Nome: Wang Er Tel: 22222222 Unidade: Departamento de Arquitetura, Southwest Jiaotong University
Altere a afirmação acima novamente e substitua * por espaços. Não seria o mecanismo de pesquisa que normalmente usamos espaços para separar as condições de pesquisa no Google e no Baidu?