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:
- Opret strukturdelen af den side, hvorfra avanceret søgning skal foretages.
- 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.
- Slet de 6 linier med "Her indsættes ....". Lad der være god plads tilbage.
- Tilret SELECT-queryen (både før og efter WHERE) i den nederste del af templaten, så den passer til den aktuelle situation.
- Indsæt genbrugbar uddatakode, eller etabler anden uddatakode, der kan vise at søgningen fungerer.
- Åbn programmet i din normale browser
- Tryk på 'Søg'
- Du har nu lavet en 'vis alle' og er klar til at lave avancerede afgrænsninger for et felt ad gangen.
- 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 navn | Række- følge | Aktivitet pr sektion |
'Get'-variabler | 2 | Her foretages kopiering fra templaten eller linien ovenfor og navn på variabel tilpasses 3 steder. |
'where'-variabler | 3 | Her 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 ...) |
Form | 1 | Her opbygges en traditionel <input type ... tilpasset den aktuelle situation. |
Validering og opbygning | 4 | Opbygges 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. |
Select | 5 | Her 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 opbygning | if ($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 opbygning | if ($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 opbygning | if ($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 header | css 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 opbygning | if ($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 |
|