23. august 2004 - 01:26Der er
28 kommentarer og 1 løsning
Søgning i access database
Jeg har lidt problemer med hvordan jeg laver og opbygger en database søgning bedst muligt.
Jeg har har nogle muligheder så der skal kunne søges indenfor:
Opskrift navn: Disse ord kan være i et eller flere ord.
Tid: Skal kunne bestemme et max antal tid for tilbedredning.
Personer: Skal kunne bestemme et max eller min antal personer opskriften er til.
Ingedienser: Ingedienserne står i samme felt i databasen og søgningen skal kunne skelle ord ud der passer på søgningen.
Derudover har jeg opdelt opskrifterne i kategorier. Hver opskrift har fået tildelt en id som så fortæller hvor den høre til henne. Der er 4 felter i tabellen opskrifter (emme , vare , kategori , hojtid).
Det jeg ønsker er at brugeren selv bestemmer hvad og hvor meget de ønsker at søge på.
Alle dataer lægger i databasen lige fra opskrifter til kategorier.
Jeg hvade tænkt at søgninger kunne se sådan ud:
<form name="form1" method="post" action=""> <p>Søgeord <input type="text" name="textfield"> (brugerens søge ord)</p> <p> Max tilberednings tid <input type="text" name="textfield2"> (Brugerens valgte tid)</p> <p> Til antal personer <input type="text" name="textfield3"> Min dette antal <input type="checkbox" name="checkbox" value="checkbox"> Max dette antal <input type="checkbox" name="checkbox2" value="checkbox"> (Brugerens antal personer)</p> <p> Søg indenfor: Højtider. <input type="checkbox" name="checkbox3" value="checkbox"> Lande. <input type="checkbox" name="checkbox4" value="checkbox"> Kategori. <input type="checkbox" name="checkbox5" value="checkbox"> Ret. <input type="checkbox" name="checkbox313" value="checkbox"> Alle. (Brugerens valgte søge muligheder. Ved afkrysning skal den opdater checkbox indenfor de valgte kategorier, uden at slette de indtastninger der er gjort.)</p> <p> <input type="checkbox" name="checkbox32" value="checkbox"> Suppe Garniturer. <input type="checkbox" name="checkbox33" value="checkbox"> Klare Supper. <input type="checkbox" name="checkbox34" value="checkbox"> Kolde Supper. <input type="checkbox" name="checkbox35" value="checkbox"> Brune Supper.<br> <input type="checkbox" name="checkbox36" value="checkbox"> Puré Supper. <input type="checkbox" name="checkbox37" value="checkbox"> Velouté Supper. <input type="checkbox" name="checkbox38" value="checkbox"> Créme Supper. <input type="checkbox" name="checkbox39" value="checkbox"> Danske Supper.<br> <input type="checkbox" name="checkbox310" value="checkbox"> Udenlanske Supper. <input type="checkbox" name="checkbox311" value="checkbox"> Grund Saucer. <input type="checkbox" name="checkbox312" value="checkbox"> Brune Saucer. o.s.v<br> <br> </p> </form>
Men dette er kun en tanke. Jeg håber at der er en der vil tage lidt tid til at hjælpe mig med dette for ellers kommer jeg ikke igemmen dette.
Skulle der være nogle spørgsmål er i meget velkommen.
Det er ikke så svært at lave, men jeg er lidt i tvivl om din database opbygning. Kan du ikke beskrive den lidt bedre. F.eks hvor mange tabeller har du, hvilke felter er der og hvad kan de indeholde.
Du skal have opbygget en mængde if sætninger. Jeg har lavet nogen af dem her.
sql = "" if Request.Form("textfield") <> "" then if sql = "" then sql = "where navn like '%"& Request.Form("textfield") &"%' " else sql = "and navn like '%"& Request.Form("textfield") &"%' " end if end if if Request.Form("textfield2") <> "" then if sql = "" then sql = "where tid <= "& Request.Form("textfield2") &" " else sql = "and tid <= "& Request.Form("textfield2") &" " end if end if if Request.Form("textfield3") <> "" then if Request.Form("checkbox") <> "" then if sql = "" then sql = "where personer <= "& Request.Form("textfield3") &" " else sql = "and personer <= "& Request.Form("textfield3") &" " end if end if if Request.Form("checkbox2") <> "" then if sql = "" then sql = "where personer >= "& Request.Form("textfield3") &" " else sql = "and personer >= "& Request.Form("textfield3") &" " end if end if end if if Request.Form("checkbox3") <> "" then if Request.Form("hojtidIDer") <> "" then if sql = "" then sql = "where hojtid in ("& Request.Form("hojtidIDer") &") " else sql = "and hojtid in ("& Request.Form("hojtidIDer") &") " end if end if end if set rs = conn.Execute("select opskrifter.* from opskrifter "& sql)
Håber det er til at forstå, så du selv kan udfylde resten. Der er dog lige et lille men angående højtider (og senere lande, kategori...) delen. Det virker først når jeg har lavet den checkbox "opdatering" du også efterspurgte. Den kode vender jeg tilbage med senere....
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html> <head> <title>Untitled</title> </head>
<body> <form name="form1" method="post" action=""> <p>Søgeord <input type="text" name="textfield"> (brugerens søge ord)</p> <p> Max tilberednings tid <input type="text" name="textfield2"> (Brugerens valgte tid)</p> <p> Til antal personer <input type="text" name="textfield3"> Min dette antal <input type="checkbox" name="checkbox" value="checkbox"> Max dette antal <input type="checkbox" name="checkbox2" value="checkbox"> (Brugerens antal personer)</p> <p> Søg indenfor: Højtider. <input type="checkbox" name="checkbox3" value="checkbox" onclick="if(document.getElementById('hojtid').style.display=='none'){document.getElementById('hojtid').style.display='block'}else{document.getElementById('hojtid').style.display='none';}"> Lande. <input type="checkbox" name="checkbox4" value="checkbox"> Kategori. <input type="checkbox" name="checkbox5" value="checkbox" onclick="if(document.getElementById('Kategori').style.display=='none'){document.getElementById('Kategori').style.display='block'}else{document.getElementById('Kategori').style.display='none';}"> Ret. <input type="checkbox" name="checkbox313" value="checkbox"> Alle. (Brugerens valgte søge muligheder. Ved afkrysning skal den opdater checkbox indenfor de valgte kategorier, uden at slette de indtastninger der er gjort.)</p> <p> <div id="Kategori" style="display:'none'"> <input type="checkbox" name="katIDer" value="1"> Suppe Garniturer. <input type="checkbox" name="katIDer" value="2"> Klare Supper. <input type="checkbox" name="katIDer" value="3"> Kolde Supper. <input type="checkbox" name="katIDer" value="4"> Brune Supper.<br> <input type="checkbox" name="katIDer" value="5"> Puré Supper. <input type="checkbox" name="katIDer" value="6"> Velouté Supper. <input type="checkbox" name="katIDer" value="7"> Créme Supper. <input type="checkbox" name="katIDer" value="8"> Danske Supper.<br> <input type="checkbox" name="katIDer" value="9"> Udenlanske Supper. <input type="checkbox" name="katIDer" value="10"> Grund Saucer. <input type="checkbox" name="katIDer" value="11"> Brune Saucer. o.s.v<br> </div> <div id="hojtid" style="display:'none'"> Højtider..... <input type="checkbox" name="hojtidIDer" value="1">Jul <input type="checkbox" name="hojtidIDer" value="2">Nytår <input type="checkbox" name="hojtidIDer" value="3">Fødselsdag <input type="checkbox" name="hojtidIDer" value="4">Bryllup </div> <br> </p> </form>
</body> </html>
Jeg har tilføjet et par DIV som bliver vist/skjult afhængig af bruger input. Jeg har også ændret navnene på nogle af checkbox'ene så de er blevet et array (samme navn) i stede, og med deres værdi. Så får man nemlig en kommasepareret liste af de valgte boxe i ASP, nå man bruger Request.Form("hojtidIDer"). Og den liste kan bruges i SQL med "feltnavn IN (kommaliste)".
Hvis du ikke selv kan udfylde hullerne så sig til. Så skal jeg nok smide noget ekstra arbejde i at lave det.
jeg vil lige prøve at finde ud af det. kan man lave et felt der går ind og søger i in1 og søger efter ingedienserne? dette er jo bare et felt hvod hver ingediens er adskelt af mellemrum
ja man kan. Det mangler jeg da faktisk også på opskriftsnavnet.
søge ordret skal bare splittes op med split() funktionen.
if Request.Form("textfield") <> "" then tempSearch = split(Request.Form("textfield")," ") temp = "" for f=0 to ubound(tempSearch) if temp="" then temp = "name like '%"& tempSearch(f) &"%'" else temp = temp & " or name like '%"& tempSearch(f) &"%'" end if next if sql = "" then sql = "where ("& temp &") " else sql = sql & "and ("& temp &") " end if end if
Jeg så også lige der var en fejl. Alle de steder hvor der står: sql = "and ....
skal være: sql = sql & "and ....
ellers bliver sql sætningerne ikke lagt sammen til en lang "where ... and ... and.."
<body> <form name="form1" method="post" action="sogresultat.asp"> <p>Søgeord <input type="text" name="textfield"> (brugerens søge ord)</p> <p> Max tilberednings tid <input type="text" name="textfield2"> (Brugerens valgte tid)</p> <p> Til antal personer <input type="text" name="textfield3"> Min dette antal <input type="checkbox" name="checkbox" value="checkbox"> Max dette antal <input type="checkbox" name="checkbox2" value="checkbox"> (Brugerens antal personer)</p> <p> Søg indenfor: <br><br>Højtider <input type="checkbox" name="checkbox3" value="checkbox" onclick="if(document.getElementById('hojtid').style.display=='none'){document.getElementById('hojtid').style.display='block'}else{document.getElementById('hojtid').style.display='none';}"> <font size="3"><strong>I</strong></font> Lande <input type="checkbox" name="checkbox4" value="checkbox" onclick="if(document.getElementById('emme').style.display=='none'){document.getElementById('emme').style.display='block'}else{document.getElementById('emme').style.display='none';}"> <font size="3"><strong>I</strong></font> Kategori <input type="checkbox" name="checkbox5" value="checkbox" onclick="if(document.getElementById('Kategori').style.display=='none'){document.getElementById('Kategori').style.display='block'}else{document.getElementById('Kategori').style.display='none';}"> <font size="3"><strong>I</strong></font> Ret <input type="checkbox" name="checkbox313" value="checkbox"> <font size="3"><strong>I</strong></font> Alle <input type="checkbox" name="checkbox3132" value="checkbox"> (Brugerens valgte søge muligheder. Ved afkrysning skal den opdater checkbox indenfor de valgte kategorier, uden at slette de indtastninger der er gjort.)</p> <p> <div id="Kategori" style="display:'none'"> <% OpenDatabase set rs = conn.Execute("select * from kategori2 Order By varenavn") do while not rs.eof response.write "<input type=""checkbox"" name=""katIDer"" value="""& rs("vare") &""">"& rs("varenavn") rs.MoveNext loop %> </div><br> <div id="emme" style="display:'none'"> <% set rs = conn.Execute("select * from kategori1 Order By emmenavn") do while not rs.eof response.write "<input type=""checkbox"" name=""emmeIDer"" value="""& rs("emme") &""">"& rs("emmenavn") rs.MoveNext loop %> </div><br> <div id="hojtid" style="display:'none'"> <% set rs = conn.Execute("select * from kategorier Order By hojtidnavn") do while not rs.eof response.write "<input type=""checkbox"" name=""hojtidIDer"" value="""& rs("hojtid") &""">"& rs("hojtidnavn") rs.MoveNext loop CloseDatabase %> </div> <br></p> <input type="submit" name="Submit" value="Start Søgning"> </form>
Så må vi til at klare søgesiden stykke efter stykke. Hvis vi nu starter med opskriftnavnet.
if Request.Form("textfield") <> "" then tempSearch = split(Request.Form("textfield")," ") temp = "" for f=0 to ubound(tempSearch) if temp="" then temp = "name like '%"& tempSearch(f) &"%'" else temp = temp & " or name like '%"& tempSearch(f) &"%'" end if next if sql = "" then sql = "where ("& temp &") " else sql = sql & "and ("& temp &") " end if end if
set rs = conn.Execute("select opskrifter.* from opskrifter "& sql)
Får du så de rigtige resultater, hvis du søger på en opskrift???
hvis jeg indsætter dette får jeg ingen resultat men bare en blak side hvis jeg søger på en opskrift i databasen?
<!--#include virtual="connection.asp" --> <% OpenDatabase if Request.Form("textfield") <> "" then tempSearch = split(Request.Form("textfield")," ") temp = "" for f=0 to ubound(tempSearch) if temp="" then temp = "name like '%"& tempSearch(f) &"%'" else temp = temp & " or name like '%"& tempSearch(f) &"%'" end if next if sql = "" then sql = "where ("& temp &") " else sql = sql & "and ("& temp &") " end if end if
set rs = conn.Execute("select opskrifter.* from opskrifter "& sql)
De skal jo også skrives ud :o) Og vi kan lige så godt udskrive SQL-sætningen imens vi opbygger den. Det gør det nemmere at se om det bliver gjordt rigtigt.
sql = "select opskrifter.* from opskrifter "& sql response.write sql & "<br>" set rs = conn.Execute(sql) do while not rs.eof response.write rs("name") & "<br>" rs.MoveNext loop
if Request.Form("textfield") <> "" then tempSearch = split(Request.Form("textfield")," ") temp = "" for f=0 to ubound(tempSearch) if temp="" then temp = "name like '%"& tempSearch(f) &"%'" else temp = temp & " or name like '%"& tempSearch(f) &"%'" end if next if sql = "" then sql = "where ("& temp &") " else sql = sql & "and ("& temp &") " end if end if if Request.Form("textfield2") <> "" then if sql = "" then sql = "where tid <= "& Request.Form("textfield2") &" " else sql = sql & "and tid <= "& Request.Form("textfield2") &" " end if end if
if Request.Form("textfield3") <> "" then if Request.Form("checkbox") <> "" then if sql = "" then sql = "where personer <= "& Request.Form("textfield3") &" " else sql = sql & "and personer <= "& Request.Form("textfield3") &" " end if end if if Request.Form("checkbox2") <> "" then if sql = "" then sql = "where personer >= "& Request.Form("textfield3") &" " else sql = sql & "and personer >= "& Request.Form("textfield3") &" " end if end if end if
Den her på, og den skulle søge efter antal personer også (skal være et/to afkryds for størrer/mindre.)
Undskyld jeg har været inaktiv her i dag, men jeg har lidt travlt på arbejdet. Jeg kan dog godt lige klare lidt udskrivning :o)
set rs = conn.Execute("select opskrifter.* from opskrifter "& sql &" order by navn") response.write "<table>" f = 0 do while not rs.eof if f mod 2 = 0 then response.write "</tr><tr><td>" else response.write "<td>" end if
hej igen. Håber du ser dette indlæg fennec. Jeg har lidt problemer med søgningen og så kunne jeg godt tænke mig at få lavet det der frem og tilbage i søge resultaterne. Er det noget du vil hjælpe med?
Synes godt om
Ny brugerNybegynder
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.