Avatar billede fwh Nybegynder
07. juli 2011 - 14:41 Der er 10 kommentarer og
1 løsning

Søgning på flere ord

Jeg ser at andre har stilt det samme spørgsmål, og har ud fra de svar der er kommet leget lidt med dette fler søge system, men er kommet til kort. Jeg får det ikke til.

Jeg har et søge felt, men kan kun søge på et ord, ville gerne at jeg kunne søger på flere ord i en database og flere kollonner.
Alt virker i søge systemet koden er her:

<% hvilket = Request.Form("hvilken") %>
<%
Dim objRec, antal
antal = 0

Set Conn = Server.CreateObject("ADODB.Connection")
Set objRec = Server.CreateObject("ADODB.recordset")

Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("../../db/murerverktoy.mdb")
objRec.Open "SELECT * FROM tabel WHERE varenummer like '%" & hvilket & "%' OR overskrift like '%" & hvilket & "%' OR picstekst like '%" & hvilket & "%'order by overskrift",conn,1,3

antal = objRec.recordcount

if antal > 0 then
Response.write "Jeg fandt " & antal & ", der svarede til dit søgekriterie"
%>
<br><br>
<% While Not objRec.EOF %>

Her efter kommer Response.write med den visuelle del af resultatet.

Jeg har forstået det så langt at jeg skal splitte "Hvilket" og først søge på del 1 og der efter rasten. Men lige meget hvordan jeg sætter det op, vil den ikke virke, altså jeg får bare en fejl melding når jeg loader siden.

Er der nogen der kan hjælpe med at vise hvordan det er jeg skal sætte det ind.
Avatar billede softspot Forsker
07. juli 2011 - 15:13 #1
Hvis jeg forstår dig korrekt, så skal man kunne indtaste en søgetekst á la:

murerske pudseplade whatever!

og så skal søgeresultatet vise de rækker i databasen som indeholder et af disse ord i et eller flere af de søgte felter... er dette korrekt?

I så fald kan du opbygge din SQL-sætning vha. en løkke, som itererer over de indtastede søgeod og tilføjer kriterier for hvert søgeord. Noget i stil med dette:

kriterieliste = ""
params = array()
ordliste = split(hvilket, " ")
for each ord in ordliste
  if krterieliste <> "" then
    kriterieliste = kriterieliste & " OR "
  end if
  kriterieliste = kriterieliste & _
    "varenummer LIKE '%' + ? + '%' " & _
    "OR overskrift LIKE '%' + ? + '%' " & _
    "OR picstekst LIKE '%' + ? + '%'"
  redim preserve params(ubound(params)+3)
  params(ubound(params)-2) = ord
  params(ubound(params)-1) = ord
  params(ubound(params)) = ord
next
sql = "SELECT * FROM tabel WHERE " & kriterieliste & " ORDER BY overskrift"

Set Conn = Server.CreateObject("ADODB.Connection")
Conn.Open "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & server.MapPath("../../db/murerverktoy.mdb")

set cmd = Server.CreateObject("ADODB.Command")
set cmd.ActiveConnection = Conn
cmd.CommandType = 1
cmd.CommandText = sql
set rs = cmd.Execute(, params)

do while not rs.eof
  '
  ' vis resultaterne
  '
  rs.movenext
loop

rs.close
conn.close

Jeg har i eksemplet tilladt mig at lave koden om til et parameteriseret kald, således du undgår at skulle bøvle med SQL-injections.

Desuden mener jeg ikke du kan hente recordcount på et recordset FØR det er blevet publiseret (dvs. det er gennemløbet), derfor har jeg yderligere taget mig den frihed, at ændre måden det kaldes på.

Du kan naturligvis have andre grunde til at ville bruge et recordset på den måde du illustrerer. I så fald skal du blot sende command-objektet (cmd) med som parameter til rs.Open i stedet for sql-sætningen. Samtidig skal du undlade at angive connection-objektet i anden parameter til rs.Open.
Avatar billede maddog_em Nybegynder
07. juli 2011 - 15:16 #2
jeg brug selv denne:
WHERE Email LIKE '%%"& u_search &"%%' OR navn LIKE '%%"& u_search &"%%' "
Avatar billede softspot Forsker
07. juli 2011 - 15:23 #3
maddog_em >> hvad gør dobbelt-procent (%%) sammenlignet med enkelt-procent (%) i en LIKE-søgning?
Avatar billede maddog_em Nybegynder
07. juli 2011 - 15:46 #4
Hej

det var kun med %% jeg kan lave en wildcard søgning
http://www.w3schools.com/sql/sql_wildcards.asp
Avatar billede softspot Forsker
07. juli 2011 - 15:59 #5
maddog_em >> jeg synes ikke jeg kan finde noget med behovet for to procenttegn for at lave søgninger, på den side du refererer til...?
Avatar billede fwh Nybegynder
07. juli 2011 - 16:40 #6
Softspot det er ved at være mange år siden jeg sidst brugte programering, så jeg føler mig lidt rosten i kødet omkring dette, så det meste af det jeg programere lige nu har små glimt af hvad jeg husker, så har min kode været rodet er der en årsag. Jeg håber min viden kommer tilbage.

Ideen er at efter den har søgt og måske kun fundet en vare, laver den en linie med varen, selv om søge-ordert er blevet fundet 10 gange i denne vare.
Jeg har sat den visueller del op sådan at den lige nu når den finder en vare indeholdende søge ordert viser en tabel hvor den henter billedet fra tabellen med samme ID og laver link ved hjælp af ID nummeret fra tabellen
link: /vis.asp?")
ID (objRec("ID"))

På den måde bliver billedet, tekst og overskrift til link i den visueller side og linket bliver til /vis.asp?ID37

På den måde kan jeg bygge et katalog op der ligner det samme katalog så man ka se hvis man bare ser helle kataloget igennem, jeg ville bare have at folk kan filtrere de ting fra som de ikke leder efter ved at kunne søge.

Ok, jeg kan godt se at din fremlægning ser bedre ud, og jeg skal lige have tid til at se den efter, så skal jeg vende tilbage.

Det var dog en ufattelig orden du har i koden, det ser sku' fedt ud med sådan en orden.
Jeg kan ikke se hvad der sker hvis den ikke finder noget i databasen.
Skal der ikke en kode:

If kriterieliste = 0 then
  Response.write("plader")
else

kode kode kode

end if.

Er jeg helt kuk her. husker det bare som om man altid skulle have et IF, Else Og END IF.
Avatar billede softspot Forsker
07. juli 2011 - 17:00 #7
Genier behersker kaos... jeg har brug for orden ;-)

Hvis du vil lave en betinget besked (betinget af at der ikke er fundet noget), skal dette gøres efter opslaget i databsaen. Nogenlunde således:

if not rs.eof then
  do while not rs.eof
    '
    ' vis resultaterne
    '
    rs.movenext
  loop
else
  Response.Write "Der fandtes ikke nogen data til din søgning"
end if

Det er dog ikke påkrævet med en betingelse omkring løkken, da løkken, som den er konstrueret her, ikke udføres hvis resultatet er tomt.
Avatar billede fwh Nybegynder
07. juli 2011 - 18:18 #8
Åhhh ja den skal kommer efter loop :-)= Genier behersker kaos :-)= Håber jeg bliver det. Eller igen hvis jeg var det :-)=

Skal lige have noget at spise, så skal jeg se på koden, og teste den ud.
Avatar billede fwh Nybegynder
07. juli 2011 - 23:10 #9
Softspot.

Så virker det fandeme som det skal, tak for hjælpen. Jeg måtte lave nogle små endringer i response.write koden og i  lidt starten af siden koden, men nu køre.

Når men du skal jo have point, men der er bare det at jeg ikke helt forstår hvordan jeg skal give dem til dig, så her må du også lige give en hånd :-)=

Skal jeg bare bruge den "svar (til løsning og pointgivning) når jeg skriver et nyt indlæg?
Avatar billede fwh Nybegynder
07. juli 2011 - 23:16 #10
FAQ skeriver:

Du skriver bare, at bruger softspot har løst problemet og beder vedkommende om et svar. Når svaret kommer, accepterer du bare dette.

Så du må kommer med et svar :-)=
Avatar billede softspot Forsker
07. juli 2011 - 23:53 #11
Velbekomme :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester