Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Vyhľadávanie, pekné URI a diakritika

Pri vyhľadávaní je vhodné použiť na odoslanie vyhľadávacieho formuláru metódu GET, pretože tým dáme užívateľovi možnosť skopírovať linku a odoslať ju trebárs známemu – a ten dostane presne tie isté výsledky vyhľadávania. V prípade POST metódy by to samozrejme nebolo možné. Čo však v prípade, že máme na celom webe optimalizované URI do „pekného“ tvaru a žiadny otázniky a & značky v adrese nechceme? GET metóda predáva premenné z formulára práve v URI. Ostáva teda použiť metódu POST.

Vyhľadávací formulár odošlem na rovnakú stránku, ako sa nachádza, teda action=„<?=$_SER­VER[‚REQUEST_U­RI‘]?>“. Pred odoslaním akéhokoľvek výstupu mám v tomto súbore podmienku, ktorá kontroluje, či bol odoslaný vyhľadácí formulár.

if(isset($_POST['searchString'])) {
   header("Location: http://www.domena.sk/vysledky-vyhladavania/".optimizeInput($_POST['searchString'])."/");
   exit;
}

Pokiaľ je podmienka splnená, stránku presmerúvam na výsledky vyhľadávania pričom vyhľadávaný string sa stáva súčasťou URI. Preto musí byť nejakou funkciou optimalizovaný (odstránene špeciálne znaky, diakritika, medzery prevedené na spojovníky a pod.). Výsledná adresa vyzerá asi takto:

http://www.domena.sk/vysledky-vyhladavania/vyhladavam-tento-string/

Čo s diakritikou?

V súbore, ktorý spracuje výsledky vyhľadávania si ľahko z URI vyparsujeme vyhľadávaný string (prípadne to necháme na mod_rewrite a .htaccess), spojovníky spätne prevedieme na medzery a môžeme vyhľadávať. Nevýhodou je nutnosť odstrániť diakritiku a teda výsledky vyhľadávania nemusia byť vždy celkom relevantné. Riešenia sa naskytujú dve – jedno čistejšie a druhé menej čisté.
Čistejším riešením je používať na stránke a v databáze kódovanie UTF-8, vďaka ktorému môžeme potom v obsahu databázy vyhľadávať tak, aby výsledky vyhľadávania neboli závislé na diakritike. MySQL príkaz

collate 'utf8_general_ci'

sa vkladá za LIKE podmienku používanú pri vyhľadávaní (v prípade použitia Fulltext indexu za príkaz Match). Za normálnych okolností SQL dotaz s použitím COLLATE vráti rovnaké výsledky vyhľadávania pre slovo s diakritikou aj pre slovo bez diakritiky (teda napr. činčila je to isté ako cincila ;) ). Celá podmienka môže vyzerať takto:

SELECT text FROM tabulka WHERE text LIKE '%".$string."%' COLLATE 'utf8_general_ci';

Druhou možnosťou je mať v tabuľke okrem štandardného formátovaného textu so všetkými HTML tagmi uložený aj čistý text, ktorý je bez diakritiky a akýchkoľvek nadbytočných znakov. Vyhľadáva sa potom priamo v tomto texte. Výsledok je v rovnaký ako v prípade použitia UTF-8 kódovania, ale zbytočne narastá databáza…

Tomáš Mašek

Naspäť naspäť Pridať komentár k článku prispieť do diskusie [2]

Vyhľadávanie

v názvoch článkov v textoch článkov

Pridať komentár

Koľko je na ruke prstov?

RSS