logo   Avanceret søgning




Avanceret søgning anvendes til fleksibel flerdimensionel søgning i databasetabel (typisk en stamdatatabel med tilknyttet en eller flere INNER JOIN-tabeller).


Søgningen anvendes til at muliggøre brugerstyrede situationstilpassede afgrænsninger i udfaldet, så brugeren i stedet for at få vist 'alt' fra den pågældende tabel kan afgrænse udfaldet til / henimod de data, der er relevante i den aktuelle situation.


Avanceret søgning kan opbygges på adskillige måder. Den nedenfor beskrevne er meget struktureret.


Grundlaget for opbygningen af avanceret søgning er to arbejdsgange:

  • Indsættelse af 'templaten' og tilpasning af den så der kan laves en 'vis alle' søgning.
  • Indsættelse af 5 sektioner kode i templaten for hvert søgefelt der skal være til rådighed til afgrænsning af mængden af uddata. (Samhørende checkbokse og radioknapper udgør hver især et felt. 'Between' bør etableres som to individuelle felter).
    Begynd med det felt, der synes nemmest / mest intuitivt at gå til.




Template


Denne template kan bruges som grundlag for at komme igang med avanceret søgning:


  1. Opret strukturdelen af den side, hvorfra avanceret søgning skal foretages.
  2. Kopier templaten til sidens brødtekstdel. Indsæt den der hvor den skal bruges på siden. Det er placeringen af Formen, der er afgørende.
  3. Slet de 6 linier med "Her indsættes ....". Lad der være god plads tilbage.
  4. Tilret SELECT-queryen (både før og efter WHERE) i den nederste del af templaten, så den passer til den aktuelle situation.
  5. Indsæt genbrugbar uddatakode, eller etabler anden uddatakode, der kan vise at søgningen fungerer.
  6. Åbn programmet i din normale browser
  7. Tryk på 'Søg'
  8. Du har nu lavet en 'vis alle' og er klar til at lave avancerede afgrænsninger for et felt ad gangen.
  9. Data for hvert enkelt søgefelt indsættes i templaten i rækkefølgen 1, 2, 3, 4, 5. Test grundigt efter hvert felt.


<!-- HER STARTER TEMPLATE FOR AVANCERET SØG-->
<?php
$soegning = "";
//2 $_GET variabler

Her indsættes $_GET-variabler

//3 WHERE variabler

Her indsættes WHERE-variabler

?>

<!-- 1 FORM til avanceret søg start -->
<form action="" method="get">
<table>

Her indsættes traditionel opbygning af FORM

<tr><td><input type="submit" name="avan_soeg" value="Søg" /></td></tr>
</table>
</form>
<!-- FORM til avanceret søg slut -->

<?php
if (isset($_GET['avan_soeg']))
{
//4 VALIDERING (incl. 'fejlbeskeder' når der er behov for det) og opbyg WHERE-variabler

Her indsættes validering og opbygning af WHERE-vriabler

// Traditionel situationstilpasset del af SELECT t.o.m. 'where true'.
//5 og WHERE-variabler indsættes i SELECT efter true og før f.eks 'order by ...'
// og traditionel situationstilpasset del af SELECT efter WHERE.
   $query = "SELECT * FROM varestam
   inner join ....
   inner join ....
   WHERE
   true


Her indsættes WHERE-variabler


   order by ...
   ";

      $result = mysqli_query($db_link, $query) or die (mysqli_error ($db_link));
      $antal = mysqli_num_rows ($result);
      if ($antal == 0){
         echo "<p class='red'>Din søgning fandt ingenting.<br />Prøv med en anden søgning.</p>";
      }
      else //antal
      {
      echo"<table>";
            while ($row = mysqli_fetch_assoc ($result))
            {

Her indsættes kode til opbygning af uddata. Kan ofte kopieres med meget små ændringer fra anden uddata med samme opbygning.

            } // slut while
      echo"</table>";
      } // antal slut
   } // isset($_GET SLUT
?>
<!-- HER SLUTTER TEMPLATE FOR AVANCERET SØG-->




Søgefelter


Koden til opbygning af et søgefelt er opdelt i 5 skarpt adskilte sektioner med hver sin opgave. Der er beskrevet individuel kode for flere typer søgefelter nedenfor.


Den bedste arbejdsgang (pr. felt) for indsættelse af sektionsvis kode i templaten er den i nedenstående tabel viste rækkefølge. (Numrene er gentaget i templaten).


Det er mest hensigtsmæssigt at etablere koder for et søgefelt ad gangen og teste grundigt før der fortsættes til næste felt.


Sektion navnRække- følgeAktivitet pr sektion
'Get'-variabler2Her foretages kopiering fra templaten eller linien ovenfor og navn på variabel tilpasses 3 steder.
'where'-variabler3Her defineres navnet på WHERE-variablen. Bør opbygges af 'WHERE' og genbrug af navnet på den aktuelle databærende variabel. Skal en variabel bruges mere end en gang tilføjes et løbenummer (01 ...)
Form1Her opbygges en traditionel <input type ... tilpasset den aktuelle situation.
Validering og opbygning4Opbygges af 1) identen for den aktuelle databærende variabel; 2) WHERE-variablen som defineret ovenfor; 3) AND og navnet på den aktuelle databærende variabel; 4) den SQL logik, der skal anvendes for at udtrække variablens data fra databasetabellen.
Select5Her indsættes navnet på den ovenfor (pkt. 3) definerede WHERE-variabel.


Som det kan ses, skal der kun foretages egentlig kodning under punkterne 1 og 4.


I 'fra/til' situationer bør man i SQL anvende to separate felter i stedet for 'between'. Anvendelsen af checkboxe og radioknapper kan delvis automatiseres. Ønskes de ikke vist i en kolonne under hinanden, men som to eller flere kolonner ved siden af hinanden kan de indlejres i 'float-left' lister.

I form af den overordnede struktur er programmet er opbygget ved indsættelse af data i fem dele:


Sektionerne indgår i koden i den vistte rækkefølge. Flowet i programmet er dog nemmest at forholde sig til ved at begynde med FORM og følge talrækken til højre i tabellen.


Templates pr. type søgefelt.


Koderne til de enkelte sektioner varierer lidt mellem de enkelte 'input-type' felter. Nedenfor kan ses de individuelle koder for hver enkelt input-type. For de input-typer, der ikke er anført vil 'Almindelige textboxe' formentligt kunne anvendes.


De enkelte tekster / koder skal navnemæssigt tilpasses til de aktuelle forhold.


Almindelige textboxe til tekst.


Den 'standard' der kan danne grundlag for opbygning af alle andre søgefelter.


Form <tr><td>Design år</td><td> <input type='text' name='vare_desaar' value="<?php echo $vare_desaar ?>" </td></tr>
"Get"-variabel$vare_desaar = (isset($_GET['vare_desaar']) ? $_GET['vare_desaar'] : "");
"Where"-variabel$where_vare_desaar = "";
Validering og opbygningif ($vare_desaar != '')
{$where_vare_desaar = "AND vare_desaar <= $vare_desaar";}
Select$where_vare_desaar


Almindelige textboxe til tal.


Form <tr><td>Pris</td><td> <input type='text' name='vare_pris' value="<?php echo $vare_pris ?>" </td></tr>
"Get"-variabel$vare_pris = (isset($_GET['vare_pris']) ? $_GET['vare_pris'] : "");
"Where"-variabel$where_vare_pris = "";
Validering og opbygningif ($vare_pris != "" and is_numeric($vare_pris))
{$where_vare_pris = "AND vare_pris <= $vare_pris";}
Select$where_vare_pris


Søgning med LIKE.


Søgning med LIKE.


Form <tr><td>Søgeord</td><td> <input type='text' name='vare_navn' value="<?php echo $vare_navn ?>" </td></tr>
"Get"-variabel$vare_navn = (isset($_GET['vare_navn']) ? $_GET['vare_navn'] : "");
"Where"-variabel$where_vare_navn = "";
Validering og opbygningif ($vare_navn != '')
{$where_vare_navn = "AND vare_navn like '%$vare_navn%'";}
Select$where_vare_navn


Søgning med LIKE - og form med 'Søgeord' i header.


Søgning med LIKE og form med søgeord i header. 'Relative' er kun nødvendig, når formen skal placeres oven på et billede.


form med søgefelt i headercss til form i header
<form class='soeg' action='soegning.php' method='post'>
<table><tr><td colspan=2>
<input type='text' placeholder="Vare navn" name='vare_navn' value="" />
</td></tr><tr class='h25'><td class='vab'>
<input type='submit' name='enkelt_soeg' value='SØG' />
</td><td class=' soeglink f10 vab'>
<a href='soegning.php'>Avanceret søg</a>
</td></tr></table>
</form>
.soeg{
position: relative;
top: -85px;
left: 55px;
}

.soeg input[type="text"]
{
width: 120px;
border: 1px solid #ededed;
margin-left: 20px;
}

.soeg input[type="submit"]
{
width: 35px;
border: 1px solid #ededed;
margin-left: 20px;
}
.soeglink a{
color: white
}

.soeglink a:link {
text-decoration: none;
}

.h25{
height: 25px;
}

.vab{
vertical-align: bottom;
}

.f10{
font-size: 10px;
}
$_POST fra form i header
<!-- Fra søgefelt i header start -->
<?php
if (isset ($_POST['enkelt_soeg'])) //start POST
{
$vare_navn = $_POST['vare_navn'];
$_SESSION['vare_navn'] = $vare_navn;
}
?>
<!-- Fra søgefelt i header slut -->
<!-- HER STARTER TEMPLATE FOR AVANCERET SØG-->


Form <tr><td>Søgeord:</td><td><input type='text' placeholder='Vare navn' name='vare_navn' value="<?php echo $_SESSION['vare_navn'] ?>" /></td><?php $_SESSION['vare_navn'] = ' '; ?></tr>
"Get"-variabel$vare_navn = (isset($_GET['vare_navn']) ? $_GET['vare_navn'] : "");
"Where"-variabel$where_vare_navn = "";
Validering og opbygningif ($vare_navn != '')
{$where_vare_navn = "AND vare_navn like '%$vare_navn%'";}
Select$where_vare_navn


Databasebaseret drop-down menu.


Vil oftest være knyttet til en INNER JOIN-baseret tabel.


Form <?php
// Hent tabeldata til drop-down menu
    $query = "SELECT * FROM designer order by des_navn";
    $result = mysqli_query($db_link, $query) or die(mysqli_error($db_link));
    $antal = mysqli_num_rows ($result);
//Input linie
    echo '<select name="fk_des_id"><option value="">Alle</option>';
//Drop-down menu
while ($row = mysqli_fetch_assoc ($result))
    {
    echo '<option value=" '. $row['des_id'] .' "> '. $row['des_navn'] .' </option>';
    }
echo '</select>';
?>
"Get"-variabel$fk_ser_id = (isset($_GET['fk_ser_id']) ? $_GET['fk_ser_id'] : "");
"Where"-variabel$where_fk_ser_id = "";
Validering og opbygning if ($fk_ser_id != '')
{$where_fk_ser_id = "AND fk_ser_id = $fk_ser_id";}
Select$where_fk_ser_id


Databasebaserede radioknapper.


Vil oftest være knyttet til en INNER JOIN-baseret tabel.


Radioknapper hentet fra database. Vises i en kolonne under hinanden. Bemærk CSS i input-type.


Form <?php
// hent tabeldata til radioknapper
   $query = "SELECT * FROM serie order by ser_navn";
   $result = mysqli_query ($db_link, $query) or die (mysqli_error ($db_link));
while($row = mysqli_fetch_assoc($result)){
   $serie_id =$row['ser_id'];
   $serie_navn =$row['ser_navn'];
   echo '<input type="radio" name="serier" value="'.$serie_id.'" style="display: inline; margin-right:5px" />'.$serie_navn.'<br />';
}
?>
"Get"-variabel$fk_ser_id = (isset($_GET['serier']) ? $_GET['serier'] : "");
"Where"-variabel$where_fk_ser_id = "";
Validering og opbygning if ($fk_ser_id != '')
{$where_fk_ser_id = "AND fk_ser_id = $fk_ser_id";}
Select$where_fk_ser_id


Databasebaserede checkbokse.


Vil oftest være knyttet til en INNER JOIN-baseret tabel.


Checkbokse hentet fra database. Vises i en kolonne under hinanden. Bemærk CSS i input-type og IN ... i VALIDERING.


Form <?php
// hent tabeldata til checkboxe
   $query = "SELECT * FROM serie order by ser_navn";
   $result = mysqli_query ($db_link, $query) or die (mysqli_error ($db_link));
   $result = mysqli_query($db_link, $query_av01);
while($row = mysqli_fetch_assoc($result)){
   $serie_id =$row['ser_id'];
   $serie_navn =$row['ser_navn'];
   echo '<input type="checkbox" name="serier[]" value="'.$serie_id.'" style="display: inline; margin-right:5px" />'.$serie_navn.'
'; }
?>
"Get"-variabel$fk_ser_id = (isset($_GET['serier']) ? $_GET['serier'] : "");
"Where"-variabel$where_fk_des_id = "";
Validering og opbygning if ($fk_ser_id != '')
{$string_serier = implode(",", $fk_ser_id);
$where_fk_ser_id = "AND fk_ser_id IN ($string_serier)";}
Select$where_fk_ser_id












































x
x