15. juni 2005 - 15:39Der er
24 kommentarer og 2 løsninger
Lave en søgeside fra en formular
Hej eksperter...
Jeg er igang med at lave en søgeside. Jeg har tidligere lavet sådan en, men kun med 1 enkelt input felt. Nu er det så sådan at jeg nu har 5 søgefelter, hvoraf de 4 af dem er dropdown boxe (list-menu hedder de vidst også), hvor der hentes data fra databasen.
Det skal selvfølgelig være muligt for brugeren kun at søge ved at bruge et enkelt af disse felter... hvordan gør jeg lige det? Jeg har forsøgt mig lidt frem... Dog tror jeg ikke jeg har fundet den helt rigtige løsning, da det tætteste jeg ku komme på var at lave sql sætningen i en if/else, hvor der så for hver mulighed blev ændret i sql sætningen...
$foresp = mysql_query("SELECT * FROM userpost INNER JOIN brugere ON userpost.userpost_bruger = brugere.id WHERE userpost_sell LIKE '%".$sell."%' AND userpost_group LIKE '%".$userpost_group."%' AND userpost_sub LIKE '%".$userpost_sub."%' AND land LIKE '%".$land."%' AND userpost_over LIKE '%".$searchtext."%' OR userpost_text LIKE '%".$searchtext."%' ");
Så var det at hvis så '$sell' ikke var sat af brugeren ville jeg lave den sådan: if($sell == ""){ $foresp = mysql_query("SELECT * FROM userpost INNER JOIN brugere ON userpost.userpost_bruger = brugere.id WHERE userpost_group LIKE '%".$userpost_group."%' AND userpost_sub LIKE '%".$userpost_sub."%' AND land LIKE '%".$land."%' AND userpost_over LIKE '%".$searchtext."%' AND userpost_text LIKE '%".$searchtext."%' "); }elseif($userpost_group == ""){ osv...
Men det kan nok laves mere dynamisk end det... ik? :)
Glemte helt at sige at den egentligt virker fint sådan , men vil jo helst kunne se mere logisk på det... også for at få en mere "bug-free" søgefunktion
Du starter jo med 5 variable: $sell, $userpost_group, $userpost_sub, $land og $searchtext. Disse er udfyldt med værdier fra din form og kan altså enten indeholde en værdi eller være tomme. Når de ikke er tomme, skal de indgå i søgeudtrykket. Hvis f.eks. $userpost_group ikke er tom skal den bidrage med noget i stil med:
... userpost_group LIKE '%" . $userpost_group . "%' ...
Men, hvis den er tom så skal den slet ikke bidrage med noget som helst. Det ville nemlig være katastrofalt hvis det blev til:
... userpost_group LIKE '%%' ...
- i det du så ville få *samtlige* rækker med i dit søgeresultat.
Koden går derfor ud på at opbygge SQL-udtrykket dynamisk baseret på de aktuelle værdier...
Først starter vi med den konstante første del af SELECT-sætningen:
$SQL = "SELECT * FROM userpost INNER JOIN brugere ON userpost.userpost_bruger = brugere.id WHERE";
Derefter udregner vi det som skal komme efter WHERE. Af praktiske årsager gemmer vi dette som et mellemresultat i en variabel, $WHERE, undervejs.
$WHERE bygges op af 5 if-sætninger; en for hver af dine 5 variable. Den som svare til $userpost_group ser sådan her ud:
if ($userpost_group != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " userpost_group LIKE '%" . $userpost_group . "%'"; }
Denne starter med en if på om $WHERE er tom eller ej. Hvis den er tom så betyder det at samtlige de variable der er testet på *før* $userpost_group har været tomme. Dermed har de heller ikke bidraget til $WHERE endnu. Hvis $WHERE *ikke* er tom så skal der sættes et AND foran, før at vi sætter det nye søge-deludtryk på. Hvis $WHERE *er* tom skal denne AND derimod ikke med.
Når vi har været igennem alle 5 variable så har vi nu en $WHERE som indeholder netop et LIKE-led for hver variabel som ikke er tom. Hvis der er flere er de endda pænt adskilt af en AND.
Til sidst skal OR-leddet så på. Dvs. der skal faktisk ikke være noget "OR" hvis $WHERE stadig er tom, dvs. hvis alle 5 variable selv var tomme. Det ser sådan her ud:
if ($WHERE != "") $WHERE += " OR"; $WHERE += " userpost_text LIKE '%" . $searchtext . "%'";
Til allersidst kobler vi så den udregnede WHERE-del efter den faste første del af SELECT-sætningen:
$SQL += $WHERE;
- hvorefter vi udføre kaldet til databasen:
$foresp = mysql_query($SQL);
Når det gøres på denne made har du en fuldstændig dynamisk løsning, som passer uanset om den ene, den anden, eller en vilkårlig kombination af dine 5 variable er tomme.
Alternativet var at lave 2^5 = 32 forskellige SELECT sætninger.
Ja, undskyld undskyld... har haft lidt meget at se til...
Men nu har jeg kigget på det (og er glad for hvis du stadig vil hjælpe)
Min kode ser sådan ud nu: <? // $sell = $_POST[userpost_sell]; $userpost_group = $_POST[userpost_group]; $userpost_sub = $_POST[userpost_sub]; $land = $_POST[land]; $searchtext = $_POST[searchtext]; $SQL = "SELECT * FROM userpost INNER JOIN brugere ON userpost.userpost_bruger = brugere.id WHERE";
$WHERE = ""; if ($sell != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " userpost_sell LIKE '%" . $sell . "%'"; }
if ($userpost_group != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " userpost_group LIKE '%" . $userpost_group . "%'"; }
if ($userpost_sub != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " userpost_sub LIKE '%" . $userpost_sub . "%'"; }
if ($land != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " land LIKE '%" . $land . "%'"; }
if ($searchtext != "") { if ($WHERE != "") $WHERE += " AND"; $WHERE += " userpost_over LIKE '%" . $searchtext . "%'"; }
if ($WHERE != "") $WHERE += " OR"; $WHERE += " userpost_text LIKE '%" . $searchtext . "%'";
$SQL += $WHERE;
$foresp = mysql_query($SQL);
//$foresp = mysql_query("SELECT * FROM userpost INNER JOIN brugere ON userpost.userpost_bruger = brugere.id WHERE userpost_sell LIKE '%".$sell."%' AND userpost_group LIKE '%".$userpost_group."%' AND userpost_sub LIKE '%".$userpost_sub."%' AND land LIKE '%".$land."%' AND userpost_over LIKE '%".$searchtext."%' OR userpost_text LIKE '%".$searchtext."%' ");
?> <table width="100%" border="0" align="center"> <tr> <td align="center"> <span class="style3"> <? if(mysql_num_rows($foresp) == 0) {?> <a href="?mainkategori=1&show=search"><? echo "<br/><br/>Der er ingen ord der matchede din søgning. <br/> Klik her for at komme tilbage<br/><br/>"; ?></a> <? } else { ?> <span class="style1">Søgeresultater:</span><br/><br/> <? while ($data = mysql_fetch_row($foresp)) { ?>
Fejlen den laver er: Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in c:\appserv\www\kategorier\seek.php on line 58
Jeg har prøvet at kigge koden igennem, og det er ikke lykkedes mig at finde fejlen (nok fordi jeg ikke er den store haj til det her :-)
DEBUG: 0 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '0' at line 1
Jeg er ydermere ked af at det har taget så lang tid for mig at komme igang med dette igen, men jeg har været lidt travl... Jeg giver dig gerne alle pointene, men jeg tror jeg vil poste endnu et indlæg, for at få lidt flere øjne på det...
Jeg vil gerne lukke denne tråd, da jeg ikke er kommet videre med det. Hvis nielle vil have pointene lader jeg tråden stå åben indtil d. 13/1 hvorefter jeg lukker det
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.