USUÁRIO:      SENHA:        SALVAR LOGIN ?    Adicione o VBWEB na sua lista de favoritos   Fale conosco 

 

  Dicas

  ASP - Active Server Page    (Miscelâneas)

Título da Dica:  Procura de várias palavras numa base de dados
Postada em 23/10/2003 por ^HEAVY-METAL^            
Estava a precisar de um método para fazer buscas em bases de dados simples, que me permitisse criar um formulário de busca, onde o visitante colocasse uma ou várias palavras, e a busca fosse efectuada por cada uma dessas palavras.
Após procurar por diversos sites da especialidade, não encontrei nada satisfatório, por isso coloquei as mãos à obra, e criei algo que quero partilhar com quem possa precisar.


Usei uma base de dados em MSAccess, pois era para ser utilizado numa coisa bastante pequena. Se por acaso for usar bases de dados mais poderosas, como MySQL, MSSQL, ou ORACLE, elas já têm incluidas funções próprias de busca, que poderão de forma mais fácil obter os mesmos resultados que vou obter com este ASP.

Vamos então trabalhar com uma base de dados em MSAccess. Este exemplo é o mais simples possível. É uma base de dados com apenas 1 tabela, que tem apenas 1 campo.

Tabela : Titles

Title Text

O meu problema nas buscas em bases de dados era que se o visitante colocasse 2 palavras, por exemplo, "Microsoft Access", não era efectuada uma busca pela palavra "Microsoft" e pela palavra "Access", mas sim uma busca pela frase "Microsoft Access". Tinha que dividir a string.
O único método que encontrei fazia a divisão das palavras, mas era sensível à ordem das mesmas, isto é, não era indiferente procurar "Microsoft Access" ou "Access Microsoft". Ele fazia a busca de "Microsoft" e, quando encontrava, procurava nesse campo apenas a seguir à palavra "Microsoft" a palavra "Access". Se "Access" estivesse antes de "Microsoft", ele não encontrava.


O método que criei é bastante simples. É feita uma procura dos espaços na string de busca, e as palavras são divididas tendo em conta esses espaços. Cada palavra é adicionada à declaração de SQL, uma a uma, garantindo assim uma independência na busca às palavras.


Chamo a atenção que isto é um exemplo muito básico. Para utilização num cenário real, não devem ser usadas tantas passagens de código ASP para código HTML, por exemplo, já que o uso do response.write é mais eficiente do que essa passagem.



Passemos então à análise do código.

ficheiro : search.ASP


<%
'o option explicit é utilizado para criar a obrigatoriedade
'de anunciar cada variavel com o dim, de forma a não criar
'variáveis por engano, principalmente por erro de escrita.
Option Explicit

'Vamos começar por criar o formulário para efectuar a busca.

'Definimos a variável com a string para efectuar a busca
Dim busca  
'Vamos buscar a string de busca
busca = request.form("busca")
'Se a string for vazia, então não existiu qualquer busca,
'e vamos criar o formulário. Se a string existir, então
'vamos efectuar a busca com ela.
if busca = "" then%>

<form action="search.asp" method="post" name="search">
<table cellspacing="1" cellpadding="1" border="1" bordercolor=black>
<tr>
<td><input type="text" name="busca" size="100" maxlength="300"></td>  
<td><input type="submit" value="Search"></from></td>  
</tr>
</table>

<%else
'definimos a variável para a conecção à base de dados
Dim dbGlobalWeb
'definimos o recordset para conter a informação da BD
Dim rsGlobalWeb
'definimos a variável que vai guardar as declarações de SQL a usar
Dim SqlJunk
'definimos dbGlobalWeb como um objecto para uso com a BD  
Set dbGlobalWeb=Server.CreateObject("ADODB.Connection")
'Fazemos a ligação à base de dados
dbGlobalWeb.Open "PROVIDER=MSDASQL; DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.mappath("data.mdb")  
'definimos outro objecto para o Recordset
Set rsGlobalWeb = Server.CreateObject("ADODB.Recordset")

'Vamos começar a criar a declaração de SQL
SqlJunk = "SELECT * FROM titles WHERE"

'definimos todas as variáveris que vamos usar na
'criação da declaração de SQL
dim espaco
dim cada_palavra
dim comp
dim retirar

'Começamos por retirar os espaços a mais à esquerda
'e à direita da string de busca
busca = trim(busca)
'Vamos retirar da string de busca cada uma das palavras
'existentes. Para isso, vamos separar cada uma das palavras,
'e só paramos quando já não existirem espaços na string.
'Se não existem espaços, é porque só existe uma palavra.
do until instr(1,busca,chr(32)) = 0
'Começamos por verificar em que posição está o espaço
'mais à esquerda.
espaco = instr(1,busca,chr(32))
'Retiramos da String apenas uma palavra, e
cada_palavra = left(busca,espaco-1)
'adicionamos essa palavra à busca na declaração de SQL
SqlJunk = SqlJunk & " title LIKE '%" & cada_palavra & "%' and"
'Verificamos o comprimento total da string,
comp = len(busca)
'para determinar qual o comprimento depois de ter retirado
'uma palavra.
retirar = comp - espaco
'A string que vai passar a ser usada será a inicial
'menos a palavra já colocada na declaração de SQL.
busca = right(busca,retirar)
'Vamos fazer isto até sobrar apenas uma palavra.
loop
'Quando sobrar só uma palavra, ou se desde início só
'existir uma, ela será adicionada neste ponto à
'declaração de SQL.
SqlJunk = SqlJunk & " title LIKE '%" & busca & "%'"
'Ordenamos os registos que vamos obter alfabeticamente,
'para mais fácil leitura.
SqlJunk = SqlJunk & " ORDER BY title"

'executamos a declaração de SQL para obtermos a informação
'pretendida da nossa base de dados.
rsGlobalWeb.Open SqlJunk, dbGlobalWeb, 3

'Aqui vamos verificar se a busca retornou algum valor
If Not rsGlobalWeb.BOF Then%>
<table cellspacing="1" cellpadding="1" border="1" bordercolor=black>
<tr>
<td width="350">Title</td>  
</tr>
</table>
<table cellspacing="1" cellpadding="1" border="1" bordercolor=black>
<%'Criamos um loop para visualizar a informação completa
Do While Not rsglobalweb.EOF%>
<tr>
<td width="350"></td>  
</tr>
<% rsGlobalWeb.Movenext
Loop%>
</table>
<%
'Caso não tenha sido encontrado qualquer valor
else%>
<table cellspacing="1" cellpadding="1" border="1" bordercolor=black>
<tr>
<td>Não foi encontrado qualquer registo.</td>  
</tr>
<%End If
'Fechamos o recordset e a ligação à base de dados.
rsGlobalWeb.Close
set rsglobalweb = nothing
dbGlobalWeb.Close
set dbglobalweb = nothing
end if%>


T+,
 


CyberWEB Network Ltda.    © Copyright 2000-2024   -   Todos os direitos reservados.
Powered by HostingZone - A melhor hospedagem para seu site
Topo da página