| 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=„<?=$_SERVER[‚REQUEST_URI‘]?>“. 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äť
prispieť do diskusie [2]
Vyhľadávanie
Posledných 5 komentárov
Viac z rubriky
Ako ochrániť includované PHP súbory?
Automatické generovanie formulárov z MySQL
Automatický prevod texu na hyperlink
Cachovanie do HTML súboru
Cachovanie s pomocou funkcií serialize/unserialize
Čiernobiele obrázky v PHP
Dynamická tvorba URL
Fulltext ako názov stĺpca v tabuľke
Getcwd – Ako ľahko získať absolútnu cestu
Import z Excelu do MySQL databázy
Maximálny timeout vykonávania SQL skriptu
Microtime – rýchlosť načítania stránky
Odstránenie diakritiky v PHP pomocou iconv()
Overovanie a kontrola formulárov v PHP
Parsovanie XML súboru v PHP
PHP a zachytenie nedoručených mailov
PHP funkcia implode
Porovnávanie a dátovy typ DATE
Práca so súbormi pri zapnutom safe_mode
Prihlasovanie uživateľa prostredníctvom $_SESSION
Real-time kontrola e-mailovej adresy AJAX-om
Spracovanie dátového typu ENUM do HTML selectu
Strpos a offset – nájdenie výskytu znaku v reťazci
Tip: Generovanie PDF súborov
Tip: jednoduché šifrovanie a dešifrovanie v PHP
Tip: správne includovanie súborov
Ukladanie jazykových verzií statických textov
Veľmi jednoduchý návod na pekné URI
Vkladanie obrázkov do databázy
Výber záznamov začínajúcich číslom
Vyčistenie viacrozmerného poľa
Vypísanie abecedy v PHP
Využívanie unikátnych kľúčov v MySQL databáze
Zaradenie jednej položky do viacerých kategórií
Zistenie hodnoty ďalšieho ID – autoincrement
Zložené MySQL dotazy – LEFT JOIN
Zvýrazňovanie syntaxe kódu – GeSHi
Pridať komentár



