Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

marvi

Como fazer um busca assim?

Recommended Posts

olha este exemplo

 

'------------- SEARCH
'******************************************************
'******************************************************

On Error Resume Next



PAGE_SIZE = 20  ' display number of results


strURL = Request.ServerVariables("URL") ' the URL or Query string



'------------- q = the input text


strSearch = Request.QueryString("q") ' the input text

If strSearch = "" Then

 Server.htmlencode(Trim(Request.Form("q")))

End If


strSearch = Replace(strSearch, "'", "''")


'----------- p = RESULT PAGING

IF isnumeric(Request.QueryString("p")) = True OR Request.QueryString("p") = "" THEN

				  ' Retrieve page to show or default to the first
				  If Request.QueryString("p") = ""  OR Request.QueryString("p") < 1 Then
				  	iPageCurrent = 1
				  Else
				  	iPageCurrent = CInt(Request.QueryString("p"))
			  	  End If

ELSE

iPageCurrent = 1


END IF

p = iPageCurrent



'----------------- t = SELECTED TABLE

IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

				  ' Retrieve t

				  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
				  	searchTable = 1 '1
				  Else

				  	searchTable =  1 'CInt(Request.QueryString("t"))

			  	  End If

ELSE

searchTable = 2 '1

END IF


'------------------- m = SEARCH METHOD

IF isnumeric(Request.QueryString("m")) = True OR Request.QueryString("m") = "" THEN

				  ' Retrieve m
				  If Request.QueryString("m") = ""  OR Request.QueryString("m") < 1 Then
				  	strMethod = 2
				  Else
				  	strMethod = CInt(Request.QueryString("m"))
			  	  End If

ELSE

strMethod = 2


END IF



'---------------THE FORM
%>

                  <form method="get" action="<%= strURL %>">
					<p>
					<input type="radio" name="m" value="1" <% IF strMethod = 1 THEN response.write "checked=""checked""" END IF%> />
                    	E
                    	<input type="radio" name="m" value="2" <% IF strMethod = 2 OR strMethod = "" THEN response.write "checked=""checked""" END IF%> />
                    	OU
                    	<input type="radio" name="m" value="3" <% IF strMethod = 3 THEN response.write "checked=""checked""" END IF%> />
                   	Exato</p>

					<p><input type="text" class="input3" name="q" value="<%= Trim(strSearch) %>" /></p>

                    <p><input type="submit" value="Procura" />
                    <br /><br /></p>

                  </form>
                  <%



If strSearch <> "" Then


		Session("strSearch") = strSearch

		IF isnumeric(Request.QueryString("t")) = True OR Request.QueryString("t") = "" THEN

						  ' Retrieve t

						  If Request.QueryString("t") = ""  OR Request.QueryString("t") < 1 Then
							searchTable = 1 '1
						  Else

							searchTable = 1 'CInt(Request.QueryString("t"))

						  End If

		ELSE

		searchTable = 1' 1

		END IF




		' THE TABLES

		Select Case searchTable

			Case CInt("1")

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("/blogg/blog.mdb")


			Case CInt("2")

					'dbTable = "events"
					'strDBPath = Server.MapPath("")

			Case Else

					dbTable = "tMessages"
					'strDBPath = Server.MapPath("")


		End Select



'------------------ SQL



				  'SPLIT STRING INTO ARRAYS
				  'FOR and AND or CLAUSE SQL


'----------------- SQL tMessages blog table

IF searchTable = "1" THEN
IF strMethod < 3 THEN


			If strMethod = 1 Then
			strSplit = Replace(strSearch," "," and ")
			Else
			strSplit = Replace(strSearch," "," or ")
			End If


			colTerms = split(strSplit," and ",-1,1)

			iUpperTerms = UBound(colTerms)

			strWhereClause = ""



			'FIELD CLAUSES

			nr = 0
			Do while nr <= 5

			nr = nr + 1

			searchField = CInt(nr)

			Select Case searchField

				Case CInt("1")

					strTableInClause = "fDate"

				Case CInt("2")

					strTableInClause = "fHeadline"

				Case CInt("3")

					strTableInClause = "fMessage"

				Case CInt("4")

					strTableInClause = "fAuthor"

				Case CInt("5")

					strTableInClause = "fnota"
				
				'Case Else


			End Select


				  For iLoop = LBound(colTerms) to iUpperTerms
					orTerms = split(colTerms(iLoop)," or ",-1,1)
					iUpperOrTerms = UBound(orTerms)
					strWhereClause = strWhereClause & ""

						for iOrLoop = LBound(orTerms) to iUpperOrTerms
								strWhereClause = strWhereClause & strTableInClause & " LIKE '%" & Trim(orTerms(iOrLoop)) & "%' "

							if iOrLoop < iUpperOrTerms then
								strWhereClause = strWhereClause & " OR "
							end if
						next

						strWhereClause = strWhereClause & ""

						if iLoop < iUpperTerms then
								strWhereClause = strWhereClause & " AND "
						end If

				  Next

				  if nr <= 4 then
				  strWhereClause = strWhereClause & " OR "
				  end if

		Loop


ELSE

' METHOD 3 EXACT PHASE WHERE

strWhereClause = "fDate LIKE '%" & strSearch & "%' OR fHeadline LIKE '%" & strSearch & "%' OR fMessage LIKE '%" & strSearch & "%' OR fAuthor LIKE '%" & strSearch & "%'  OR fnota LIKE '%" & strSearch & "%'"

END IF


strWhereClause2 = "WHERE (" & strWhereClause & ") AND (online = CBool(-1))"

' ORDER BY
strOrderClause = "ORDER BY fdate DESC"



	IF strMethod = 3 THEN

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	ELSE

		strSQL = "SELECT * FROM "& dbTable &" "& strWhereClause2 &" "& strOrderClause &";"

	END IF


END IF

Response.write strSQL

'---------- END SQL tMessages BLog




'--------- CONNECTION OPEN & EXE SQL


	Set myRecSet = Server.CreateObject("ADODB.Recordset")
	myRecSet.PageSize  = PAGE_SIZE
	myRecSet.CacheSize = PAGE_SIZE

	' constants
	adOpenStatic = 3
	adLockReadOnly = 1
	adCmdText = &H0001


	myRecSet.Open strSQL, sConn, adOpenStatic, adLockReadOnly, adCmdText


	iRecordCount = myRecSet.RecordCount
	iPageCount   = myRecSet.PageCount



			   ' THE RESULT COUNTER

				strCountRecord = iRecordCount

				If iPageCurrent = 1 Then

				  		strCount = strCountRecord - iRecordCount + 1

				Else

						strCount = iPageCurrent * PAGE_SIZE - PAGE_SIZE + 1

						'strCountRecord -  + * iPageCurrent

				End If



	If iRecordCount = 0 Then


		%>			<p>Desculpa, sua busca não retornou resultados.<br />
                    Sua Busca por - <b><%=strSearch%></b> - não retornou documentos.</p>

                  <%
	Else

		myRecSet.AbsolutePage = iPageCurrent

		If iRecordCount <= PAGE_SIZE then
		toRecord = iRecordCount
		else
		toRecord = strCount + PAGE_SIZE - 1
		End if
		If toRecord => iRecordCount then
				toRecord=  iRecordCount
		End if

		%>

                        <p>Mostrando  resultado <%=strCount%> - <%=toRecord%> de <%=iRecordCount %>. Paginas <%= iPageCurrent %> / <%= iPageCount %>. </p>
						<br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent - 1 %>" title="Previous">
                        ‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then

			%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(strSearch) %>&p=<%= iPageCurrent + 1 %>" title="Next"> ››</a>
                        <%
		End If
		%></p>

        <%

'----------------THE RESULT LOOP


		Do While Not myRecSet.EOF And myRecSet.AbsolutePage = iPageCurrent


					intNumMatches = 0
					allregText = ""
					regWriteOut = ""

					If strSearch = " " then
						strSearch = ""
					End if

					Set objRegExp = New RegExp
					objRegExp.Global = True
					objRegExp.IgnoreCase = True


					If dbTable = "tMessages" then
					allregText = myRecSet.Fields("fDate").Value & " " & myRecSet.Fields("fHeadline").Value & " " & myRecSet.Fields("fMessage").Value & " " & myRecSet.Fields("fAuthor").Value
					End If


					allregText = Replace(allregText, "<", "", 1, -1, 1)
					allregText = Replace(allregText, ">", "", 1, -1, 1)
					allregText = UTFtoISO(allregText)

					If strMethod = 3 then

					'Set the pattern to search for
					objRegExp.Pattern = strSearch

					'Search the file for the phrase
			 		Set objMatches = objRegExp.Execute(allregText)

					'Get the number of times the phrase is matched
					intNumMatches = objMatches.Count

					End if

					If strMethod < 3 then

					sarySearchWord = Split(strSearch, " ")
					For intSearchLoopCounter = 0 to UBound(sarySearchWord)

					'Set the pattern to search for
					objRegExp.Pattern = "" & sarySearchWord(intSearchLoopCounter) & ""

					'Search the file for the phrase
					Set objMatches = objRegExp.Execute(allregText)

					intNumMatches = intNumMatches + objMatches.Count

					Next
					End if



			 		If intNumMatches => 1 Then

					If intNumMatches > 1 then
					regWriteOut = "" & intNumMatches & " hits."
					Else
					regWriteOut = "" & intNumMatches & " hit."
					End If

			 		End If

					Set objRegExp = Nothing



			%>


					<% IF dbTable = "tMessages" THEN %>
					<p><br /><br />
					<%=strCount%>. <a href="default.asp?id=<%= myRecSet.Fields("id").Value %>" title="<%=myRecSet.Fields("fHeadline").Value%>"><%= myRecSet.Fields("fHeadline").Value %></a>
					<br /><%= RemoveHTML(Left(myRecSet.Fields("fMessage").Value,instrrev(Left(myRecSet.Fields("fMessage").Value,280),"")))%>
					<br />
					Postado: <%= year(myRecSet.Fields("fdate").Value)  & "-" & right("00" & cstr(month(myRecSet.Fields("fdate").Value)),2) & "-" & right("00" & cstr(day(myRecSet.Fields("fdate").Value)),2) & ". " & regWriteOut%>
					</p>
					<% END IF%>


           <%


						strCount = strCount + 1
			myRecSet.MoveNext
		Loop


'----------------THE RESULT LOOP END
		%>
                    	<br /><br /><p>
                        <%

		If iPageCurrent > 1 Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent - 1 %>" title="Previous">‹‹</a>
                        <%
		End If


		For I = 1 To iPageCount
			If I = iPageCurrent Then
				%>

                        <%= I %>
                        <%
			Else
				%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= I %>" title="<%= I %>"><%= I %></a>
                        <%
			End If
		Next 'I

		If iPageCurrent < iPageCount Then
			%>
                        <a href="<%= strURL %>?m=<%= Server.URLEncode(strMethod) %>&t=<%= Server.URLEncode(searchTable) %>&q=<%= Server.URLEncode(Session("strSearch")) %>&p=<%= iPageCurrent + 1 %>" title="Next">››</a>
                        <%
		End If
		%>

                    <%

		End If

%></p>
<%

		' CLOSE & DISPOSE

		myRecSet.Close
		Set myRecSet = Nothing
		End If



'---------------- SEARCH END


'******************************************************
'******************************************************
%>

Pelo visto só em ASP, nada direto no SQL? Vou ver esse código...

Compartilhar este post


Link para o post
Compartilhar em outros sites

você monta sua SQL dinamicamente

Compartilhar este post


Link para o post
Compartilhar em outros sites

Talvés dividindo a variável com splits...

 

Fiz com essa programação:

 

dim busca, onde, pesq, sql
busca=split(request("busca"),chr(32))

for x = 0 to Ubound(busca)
 if x > 0 then
	onde=onde + " and "
 end if
 pesq=busca(x) 
 onde=onde+"titulo like '%" & pesq & "%'"
next

SQL = "SELECT * FROM noticias WHERE " & onde & ""
set rsbusca = db.execute(SQL)

OBS: Antes quando digitava somente Conferência das cidades de Candeias, não aparecia nada. Mas, agora, com esse código acima, se digito novamente só Conferência das cidades de Candeias ele chama corretamente a matéria, ótimo. Já tive um progresso aí.

 

Porém, se digito 2º Conferência das cidades de Candeias, ele ainda não aparece nada. O problema está nesse , pois quando o coloco no campo do busca é que dar esse problema.

 

Alguém tem como sanar essa questão? Acredito que depois que ele reconhecer isso (esse ), vai está ok.

 

Há! E se invento também de pesquisar tipo: Conferência das cidades de Candeias Bahia. Ele também não aparece nada, pois não existe esse "Bahia", tem que existir uma maneira de ignorar as frases que ele não acha e considerar o que acha.

 

Entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode ser talves o caracter k naun esta reconhecendo

use uma funcao para tratameno antes de executar a consulta SQL, no lab. de script , tem

ou seja você troca caracters especiais de forma ser reconhecido

Compartilhar este post


Link para o post
Compartilhar em outros sites

talves o caracter k naun esta reconhecendo? E o que tem esse K,especificamente no busca?

 

E se invento também de pesquisar tipo: Conferência das cidades de Candeias Bahia. Ele também não aparece nada, pois não existe esse "Bahia", tem que existir uma maneira de ignorar as frases que ele não acha e considerar o que acha e mostrar no busca matérias com tais frases, entende?

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho um sistema ótimo, certinho,

fazendo busco por Frase Exata ,Todas palavras e Qualquer palavra

se kiser me manda um MP k te passo para fins didáticos...

Compartilhar este post


Link para o post
Compartilhar em outros sites

eu tenho um sistema ótimo, certinho,

fazendo busco por Frase Exata ,Todas palavras e Qualquer palavra

se kiser me manda um MP k te passo para fins didáticos...

 

 

Então, te enviei uma mensagem

Compartilhar este post


Link para o post
Compartilhar em outros sites

mandei no seu email

Compartilhar este post


Link para o post
Compartilhar em outros sites

mandei no seu email

 

Vou estudar o código para adaptar ao meu site... marcando a opção, no busca que me passou, chamada "Qualquer" é da forma que acho que roda certo para mim

Compartilhar este post


Link para o post
Compartilhar em outros sites

fica bom, pois tem mais interatividade com o user, faz ae, kker coisa posta ae..

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quero só usar essa parte para adaptar, que é onde monto o SQL:

 

 

' Get search criteria for basic search
busca = Request("busca")
pSearchType = Request("total")
If busca <> "" Then
	busca = Replace(busca,"'","''")
	busca = Replace(busca,"[","[[]")
	If pSearchType <> "" Then
		While InStr(busca, "  ") > 0
			busca = Replace(busca, "  ", " ")
		Wend
		arpSearch = Split(Trim(busca), " ")
		For Each kw In arpSearch
			b_search = b_search & "SQL = ""SELECT * FROM TD_SourcesTbl where"
			b_search = b_search & "titulo LIKE '%" & Trim(kw) & "%' OR "
			b_search = b_search & "texto LIKE '%" & Trim(kw) & "%'"" OR "
			If Right(b_search, 4)=" OR " Then b_search = Left(b_search, Len(b_search)-4)
			b_search = b_search & " " & pSearchType & " "
		Next
	Else
	b_search = b_search & "Name LIKE '%" & busca & "%' OR "
	b_search = b_search & "URL LIKE '%" & busca & "%' OR "
	b_search = b_search & "Desc LIKE '%" & busca & "%' OR "
	End If
End If
If Right(b_search, 4) = " OR " Then b_search = Left(b_search, Len(b_search)-4)
If Right(b_search, 5) = " AND " Then b_search = Left(b_search, Len(b_search)-5)

     
'Set RS = conn.Execute (b_search)

'response.write(a_search)
response.write(b_search)
response.end

Resultado do response.write da:

 

SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%2º%' OR texto LIKE '%2º%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%Conferência%' OR texto LIKE '%Conferência%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%das%' OR texto LIKE '%das%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%cidades%' OR texto LIKE '%cidades%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%de%' OR texto LIKE '%de%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%Candeias%' OR texto LIKE '%Candeias%'"

 

Então eu usando essa SQL no meu busca já basta. Não?

 

O problema é quando mando executar assim:

 

Set RS = conn.Execute (b_search)

 

Já que a variavel b_search tem o valor dessa SQL acima que postei, ele dar o erro:

 

Microsoft JET Database Engine (0x80040E14)

Instrução SQL inválida. 'DELETE', 'INSERT', 'PROCEDURE', 'SELECT' ou 'UPDATE' esperado.

/busca/busca.asp, line 151

 

Mas, se ver no SQL imprimido pelo response.write, tem o sql completo, não?

Compartilhar este post


Link para o post
Compartilhar em outros sites

fica bem criterioso, dá para filtrar bem

Compartilhar este post


Link para o post
Compartilhar em outros sites

fica bem criterioso, dá para filtrar bem

 

Mas não quero aquele monte de código, o que importa é o que SQL montou ali, que mostrei e é aquilo, aquela parte do codigo, que preciso para rodar, não?

 

Quero executar: Set RS = conn.Execute (b_search)

 

Já que b_search tem valor:

 

SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%2º%' OR texto LIKE '%2º%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%Conferência%' OR texto LIKE '%Conferência%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%das%' OR texto LIKE '%das%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%cidades%' OR texto LIKE '%cidades%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%de%' OR texto LIKE '%de%'" OR SQL = "SELECT * FROM TD_SourcesTbl wheretitulo LIKE '%Candeias%' OR texto LIKE '%Candeias%'"

Compartilhar este post


Link para o post
Compartilhar em outros sites

analise mais o codigo, pq nele é montada automaticamente a sql

repare k tenho um include ,onde chamo algumas info, como:

 

<%
'*************** EDITE CONFORME CONFIG. DE SUA APLICAÇÂO

' path database
strDBPath = Server.MapPath("/blog/blog.mdb")

' path rss feed
xmlpath = Server.MapPath("/blog/xml/rss.xml")

' Alterar para domínio direito
strLink = "http://www.xxxxx.com"

'Mudar isso se dentro de uma pasta ex "/ blog /" ou deixe em branco "/" se raiz
strFolder = "/blog/"

' 24 horas "ampm" if AM/PM
timeFormat = ""

' "+0100" or "GMT"
zTime = "GMT"

'*************** STOP
'On error resume next

blogName = "Blog X.1"

sConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & strDBPath

set conn = Server.CreateObject("ADODB.Connection")

sub OpenDB(sConn)
	conn.open sConn
end sub

sub CloseDB()
	conn.close
	set conn = nothing
end sub

Compartilhar este post


Link para o post
Compartilhar em outros sites

ótimo sistema de busca, pois tem opcoes de busca,

por Frase Exata ,Todas palavras e Qualquer palavra

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.