V předchozích dílech jsme se věnovali základnímu procházení katalogu stránek, nyní se podíváme na dva typy vyhledávání. Dnes se zaměříme na jednoduché hledání odkazů na základě jednoho klíčového výrazu.

Jednoduché hledání

Na hlavní stránku (do souboru index.php) vložíme na nějaké místo jednoduchý formulář, do kterého uživatel bude moci zadat výraz pro jednoduché vyhledání. HTML kód, který toto zajistí, by mohl vypadat takto:

<FORM ACTION=“hledej.php“ METHOD=“get“>
<INPUT TYPE=“text“ NAME=“retezec“ SIZE=20 MAXLENGTH=50>
<INPUT TYPE=“submit“ VALUE=“Najdi“>
<A HREF=“advanced.php“>[Pokročilé hledání]</A>

Výsledek bude vypadat nějak takto:

[Pokročilé hledání]

Skript hledej.php

Pro výpis nalezených odkazů dle zadaného výrazu použijeme skript hledej.php (v praxi pravděpodobně nebudeme vyhledávání separovat do samostatného skriptu, ale naimplementujeme jej přímo v hlavním skriptu index.php – zde tak činím pouze pro lepší přehlednost). Na vstupu skriptu hledej.php je argument „retezec“, jehož hodnotu máme přístupnou pomocí proměnné $retezec.

Podíváme-li se na naše tabulky v databázi, zjistíme, že v tabulce ODKAZ máme atribut ASCII_TEXT, nad kterým budeme provádět vyhledávání. Ze vstupního řetězce ořežeme možnou diakritiku. Příslušným SELECTEM vybereme ty odkazy, kde bude splněna podmínka na existenci zadaného podřetězce (už bez diakritiky) ve sloupci ASCII_TEXT. Pro zobrazení jednotlivého odkazu potřebujeme znát jeho název, popis a url (viz předchozí díl). Také nás bude u každého odkazu zajímat, z jaké je sekce. Část skriptu, která tento úkol řeší, je následující:

/* zakladni vyhledavani — hledej.php */
<?php
/* orezeme diakritiku */
$slovo = StrTr ($retezec, „áäčďéěëíňóöřšťúůüýžÁÄČĎÉĚËÍŇÓÖŘŠŤÚŮÜÝŽ“,
    „aacdeeeinoorstuuuyzAACDEEEINOORSTUUUYZ“);
$dotaz = „SELECT odkaz.nazev, popis, url, sekce.nazev AS \“sekce_nazev\“, sekce_id
  FROM odkaz, sekce
  WHERE odkaz.sekce_id = sekce.id
  AND ascii_text LIKE ‚%$slovo%‘
  ORDER BY odkaz.nazev“;
mysql_connect(„localhost“);
$odkazy = mysql(„katalog“, $dotaz);
$pocet_odkazu = mysql_num_rows($odkazy);
/* vypiseme zakladni udaje */
print „<B> Hledaný výraz: </B> $retezec“;
print „<B> Bylo nalezeno: </B>$pocet_odkazu záznamů“;
print „<UL>“;
/* vypiseme seznam odkazu, ktere vyhovely hledani */
for ($i = 0; $i<=$pocet_odkazu; $i++) {
  $nazev = mysql($odkazy, $i, „nazev“);
  $popis = mysql($odkazy, $i, „popis“);
  $url = mysql($odkazy, $i, „url“);
  $sekce = mysql($odkazy, $i, „sekce_nazev“);
  $sekce_id = mysql($odkazy, $i, „sekce_id“);

  print „<LI> <A HREF=\“$url\“>$nazev</A><BR>“;
  print „$popis<BR> <A HREF=\“$url\“>$url</A><BR>“;
  print „sekce <A HREF=\“$index.php?sekce=$sekce_id\“>~$sekce</A>“;
}
print „</UL>“;
mysql_close;
?>

Pár poznámek k uvedenému kódu. Nejprve ze vstupního řetězce pomocí funkce StrTr odstraníme diakritiku, to je nejspíš zřejmé. Pak sestrojíme SQL dotaz, který nám pro každý odkaz, kromě již uvedených atributů, bude vracet i číslo sekce, abychom ve výpisu mohli sekci zobrazit ve formě klikacího odkazu. (zavolá se skript index.php?sekce=$sekce_id).

Po provedení dotazu vypíšeme informaci, jaký řetězec jsme hledali a kolik záznamů bylo nalezeno. Po té začneme generovat seznam nalezených odkazů. Výpis každého odkazu je podobného tvaru, jak jsme si uváděli v předchozím díle s tím, že na nový řadek za ním, je uveden název sekce, ve které daný odkaz byl nalezen. Na název sekce lze kliknout a přenese nás na základní výpis odkazů v dané sekci. Nakonec po vygenerování celého seznamu nezapomeneme seznam uzavřít a skončit relaci s databází.

Zde bych měl připomenout, jakou hodnotu má pro každý odkaz atribut ASCII_TEXT. Tato hodnota obsahuje řetězec složený z názvu a popisu odkazu (bez diakritiky). Tento atribut se generuje automaticky při přidání odkazu. Uživatel zadá název, popis a další jiné informace, my ten název s popisem sloučíme, ořežeme diakritiku obdobným způsobem, jak je uvedeno v ukázce, a uložíme do ASCII_TEXT. Blíže se tomuto postupu budeme věnovat v díle, kde budeme řešit problém přidávání odkazu do katalogu stránek.

Na závěr mi dovolte ještě jednu poznámku. Pokud chceme, aby vyhledávání fungovalo bez ohledu na velikost písmen a diakritiku, máme samozřejmě i jiné možnosti, jak tento úkol implementovat. Můžete použít regulární výrazy v MySQL, které ovšem mají tu nevýhodu, že dotazy SQL s použitím regulárních výrazů jsou velmi pomalé. Proto bych tuto variantu obecně nedoporučoval. Naše varianta s atributem ASCII_TEXT nám zabírá více prostoru (každý záznam v tabulce je větší v podstatě o 240 bajtů), ale na druhou stranu je vyhledávání rychlé.

Pokročilé hledání

Jak jste si v úvodním příkladu jistě všimli, vedle tlačítka „Najdi“ je uveden odkaz [Pokročilé hledání], který bude odkazovat na skript advanced.php určeného pro složitější vyhledávání a obsah tohoto skriptu bude náplní příštího článku.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

2 Příspěvků v diskuzi

  1. zdravím, mám menší e-shop, vyhledávání mám, ale potřebuji s filtry(parametry), např. když chci něco vyhledat, tak aby si vybral například cenu vzestupně,atd.. prosím o nápad stačí mě nakopnout ať se chytnu.díky ;)

Odpovědět