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

| Rubrika Php / mysql

Diskusia k článku

Vyhľadávanie, pekné URI a diakritikaZobraziť článok

herki
Dátum a čas 03. 12. 2009, 05:15 E-mail herki 9at0 zatwor.sk

Aloha,
musim sa podakovat, velmi mi pomohol ten tip: collate 'utf8_general_ci'. Zacharnil mi dalsie hodiny hladania a skusania. Ale este som musel pred samotnym dotazom z db pouzit query:
set names utf8
lebo vysledok z DB mi hadzal v nejakom inom kodovani text nebol citatelny.

agino
Dátum a čas 02. 06. 2009, 21:40 E-mail agino [a] zoznam.sk

Čo je to pekné URI?
Pomohli by nejaké výsledky pre skripty, pre lepšie pochopenie.

Naspäť naspäť

Pridať komentár

Koľko je na ruke prstov?

Náhľad článku

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…

RSS