Avatar billede mazey Praktikant
15. juni 2005 - 15:39 Der 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...

Sådan ser min form ud:

<form method="POST" action="?mainkategori=1&show=seek"  name="test">

<input type="hidden" name="action" value="seek">
<input type="hidden" name="mainkategori" value="<?=$mainkategori?>">

<table >
<tr>
        <td width="138" align="left"><span class="style2">Buy / Sell</span></td>
        <td width="162" align="left"><select name="userpost_sell" class="style2">
        <option value="">--Select--</option>
          <option value="1">Buy</option>
          <option value="2">Sell</option>
        </select></td>
    </tr>
    <tr>
        <td width="138" align="left"><span class="style2">Product Group:</span></td>
        <td width="162" align="left"><select name="userpost_group" class="style2" onChange="subgroup();">
        <option value="0">---- SELECT ----</option>
        <option value="1">Wood</option>
        <option value="2">Steel/Iron</option>
        <option value="3">Textiles</option>
        <option value="4">Food/Agriculture</option>
        <option value="5">Vehicles</option>
        <option value="6">Investment</option>
        </select></td>
    </tr>
   
    <tr>
        <td align="left"><span class="style2">Product Subgroup</span></td>
        <td align="left"><select name="userpost_sub" class="style2">
        <option value="0">---- SELECT ----</option>
       
        </select></td>
    </tr>
    <tr span class="style2">
      <td align="left">Country:</td>
      <td align="left"><span class="style2"><select name="land" class="style2">
        <option value="0">---- SELECT ----</option>
        <?
        $res = mysql_query("SELECT * FROM lande ORDER BY navn");
        while( $land = mysql_fetch_row($res) )
        {
            echo"<option value=\"$land[1]\">$land[1]</option>";
        }
        ?>
        </select></span></td>
  </tr>
    <tr class="style2">
      <td align="left">Search text:</td>
      <td align="left"><input name="searchtext" type="text" class="style2" size="30"></td>
  </tr>
    <tr>
            <td align="left"><input type="submit" name="submit" value=" Submit " class="style2"></td>
        <td></td>
    </tr>
    </table>
      </form>


Selve seek.php ser sådan her ud:

<?        //variabler fra search.php
            $sell = $_POST[userpost_sell];
            $userpost_group = $_POST[userpost_group];
            $userpost_sub = $_POST[userpost_sub];
            $land = $_POST[land];
            $searchtext = $_POST[searchtext];

//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."%' ");


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?
:)

Takker på forhånd!
Avatar billede mazey Praktikant
15. juni 2005 - 15:40 #1
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
Avatar billede nielle Nybegynder
15. juni 2005 - 18:10 #2
$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);
Avatar billede mazey Praktikant
17. juni 2005 - 12:59 #3
Hmm... den laver en parse error... Jeg kan ikke finde ud af hvor det er...
Desuden forstår jeg ikke helt koden.... :)
Avatar billede mazey Praktikant
17. juni 2005 - 13:03 #4
$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);


Så er der ingen parse errors, men den laver stadig errors....
Avatar billede nielle Nybegynder
17. juni 2005 - 17:14 #5
Kan du ikke lige beskrive hvilken fejl den laver?
Avatar billede nielle Nybegynder
17. juni 2005 - 17:41 #6
Og så en forklaring af hvad koden laver:

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.
Avatar billede nielle Nybegynder
24. juni 2005 - 19:09 #7
Har du fået kigget på det?
Avatar billede mazey Praktikant
02. juli 2005 - 10:37 #8
Undskyld... jeg har været på ferie... kigger på det her i løbet af weekenden
Avatar billede nielle Nybegynder
02. juli 2005 - 10:49 #9
Der er skam ingen hard feelings. Kunne i øvrigt godt selv lige bruge lidt noget ferie. :^)
Avatar billede nielle Nybegynder
11. juli 2005 - 19:58 #10
... og et par weekender senere?
Avatar billede mazey Praktikant
11. juli 2005 - 20:42 #11
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)) {
?>


<table width="335" border="0" align="center">
  <tr>
    <td width="329" align="left"><span class="style1"><a href="nyheder.php?news_id=<?=$data[userpost_sub]?>"><? echo $data[5]; ?>&nbsp;&nbsp;<? echo $data[2]; ?></a></span></td>
   
  </tr>
</table>


    <? }
            }
               
        ?>
  </td>
</table>
           


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 :-)
Avatar billede nielle Nybegynder
11. juli 2005 - 20:52 #12
Prøv at bede MySQL om at give en fejlmedelse:

$foresp = mysql_query($SQL) or die "SQL fejl: " . mysql_error() . "<br>";
Avatar billede mazey Praktikant
11. juli 2005 - 21:01 #13
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

Det ved jeg så ikke lige hvad betyder! :D
Avatar billede nielle Nybegynder
11. juli 2005 - 21:06 #14
Prøv at lave en debug udskrift af din SQL lige før at den udføres:

echo "DEBUG: " . $SQL . "<br>";
$foresp = mysql_query($SQL) or die "SQL fejl: " . mysql_error() . "<br>";
Avatar billede mazey Praktikant
13. juli 2005 - 22:55 #15
Ok... den er så lavet, og resultatet er således:

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
Avatar billede mazey Praktikant
13. juli 2005 - 22:57 #16
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...
Avatar billede nielle Nybegynder
13. juli 2005 - 22:58 #17
Gahhh.

Prøv at rette alle forekomster af:

+=

- til:

.=
Avatar billede mazey Praktikant
13. juli 2005 - 23:05 #18
Nielle, jeg har lavet et nyt indlæg for at få flere øjne på det... Jeg undskylder som sagt den lange ventetid...

Smider du et svar, så skal du få alle pointene for din ellers så store hjælpsomhed!
Avatar billede nielle Nybegynder
14. juli 2005 - 06:17 #19
Jeg skal skam ikke have points vare for at være tålmodig - men ellers tak for tiilbudet. :^)

Derimod vil jeg gerne vide om du har prøvet min rettelse 13/07-2005 22:58:18, og hvad der så skete.
Avatar billede mazey Praktikant
14. juli 2005 - 20:03 #20
Jeg synes nu nok du skal have dem, så hvis du vil have dem, så smid et svar.

Jeg prøvede at ændre alle += til .=, men det gav ingen ændring
Avatar billede nielle Nybegynder
14. juli 2005 - 22:13 #21
Kom der ikke noget andet ud end:

DEBUG: 0

?
Avatar billede nielle Nybegynder
12. august 2005 - 11:56 #22
Er du kommet videre med denne fejl?
Avatar billede mazey Praktikant
11. januar 2006 - 15:12 #23
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
Avatar billede nielle Nybegynder
15. januar 2006 - 18:52 #24
Jamen så lad os da bare dele pointene - du bestemmer forholdet :^)
Avatar billede nielle Nybegynder
15. januar 2006 - 18:52 #25
... og et svar :^)
Avatar billede mazey Praktikant
16. januar 2006 - 10:19 #26
Således
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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