Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
PHP
Redakční systém: Fulltext - I.
redakcni system
13. února 2002, 00.00 | Sleduje seriál o tvorbě redakčního systému? Dnes máte možnost si přidat do svého RS podporu pro fulltextové prohledávání článků.
Vyhledávání v redakčním systému. Již je to tady. Už jste se nejspíš nemohli dočkat. Poznal jsem to i z vašich reakcí na seriál, kde byl fulltext nejdiskutovanější téma.Jistě si vzpomenete, že v některém z předešlých dílů jsme se do vyhledávání trochu ponořili. Nemyslím tím ty regulérní výrazy, ale vzhled scriptu levy.php. Tam jsme přidávali formulář pro vyhledávání. Ten trochu pozměníme přidáním jednoho prvku. Celý formulář bude vypadat následovně:
|
Malé vysvětlení. Formulář je odeslán scriptu index.php metodou POST (v těle HTTP požadavku) a proměnná $hledej je nastavena na hodnotu true (pokud je zaškrtnutý checkbox). Formulář obsahuje prvek, kam zadáme hledané slovo nebo regulerní výraz. Toto slovo pak bude pro zpracování přístupné v proměnné $nazev. Spolu s výsledkem vyhledávání se nám v tomto textovém poli objeví slovo, které jsme hledali. Další část fromuláře je tlačítko pro jeho odeslání a na konec zaškrtávací políčko, kterým oznamujeme, jestli nám záleží na velikosti písmen.
Tím máme zajištěn přístup informací potřebných pro vyhledávání. Nyní přistoupíme k samotné vyhledávací části. Začneme hezky kousek po kousku.
|
Asi se divíte, proč zobrazuji toto. Nejspíše také tomu červeně označenému. Je to jednoduché. Jak si tak mezi sebou klient a server "povídají", předávají si parametry s pomocí escape sekvencí. Když pak použijeme regulární výraz, před zpětným lomítkem se nám objeví ještě jedno, před "dolarem" další atd. Ty tam už ale nyní nepotřebujeme a tak je odstraníme, neboť nám úplně změnily význam výrazu a fulltext by nepracoval správně. Následuje podmínka. Je zde kvůli zobrazování po stránkách. Jistě chápete, že když najdete 2000 článků se stejným slovem (tomu, kdo dokáže takhle server naplnit gratuluji), nebylo by asi moudré zobrazit je na jedné stránce. Proto se v GET parametrech bude předávat proměnná $slovo a $nazev. Malý příklad. Máme slovo "fotbal" a ignorujeme velikost písmen. Regulární výraz pro toto slovo tedy bude "[Ff][Oo][Tt][Bb][Aa][Ll]". Zobrazit uživateli, že se hledá tento řetězec plný závorek, by asi nebylo moudré. Zkuste porovnat, co vypadá esteticky lépe. Proč je to ale již před načítáním scriptu levy.php? Podívejte se kousek výše, co se nachází v atributu VALUE u pole nazev. Rychle pochopíte.
Teď přichází to nejdůležitější. Jak zjistit, jestli se v tom kterém článku výraz nachází. Vše zjistí následující úsek scriptu index.php.
|
Vezmu to pomalu a podrobně. Musíme být odeslán formulář pro hledání ($hledej=true). Zjistíme si aktuální čas a z databáze
vybereme id článků, které jsou do té doby schválené k zobrazení. Nebudeme přece prohledávat články, které sice jsou
schválené, ale mají se zobrazit až zítra, pozítří, za rok... Pomocnou proměnnou $i nastavíme na hodnotu 0. V případě, že
uživatel zaškrtl "Ignorovat velikost písmen" použijeme funkci SQL_Regcase(), který nám z "není" udělá "[Nn][Ee][Nn][Íí]" (důvod - viz. regulární výrazy).
Teď již začíná samotné prohledávání. Jelikož $a[0] je trochu méně přehledná než $id, přiřadíme $id tuto hodnotu. Jiný
význam to nemá. Podmínka je pro všechny tři prohledávané objekty (objekty jako věci, ne typ proměnné, i když tady slovo
věc není moc na místě). Jsou to anotace, článek a nadpis, tedy to co se čtenáři zobrazí. Nejdříve zjistíme zda článek,
anotace či nadpis existuje. Někdo by si mohl pohrávat s vygenerovanými soubory a uživateli by se zobrazovala chybová
hláška. Když existuje, otevřeme jej pro čtení (mód r, druhý parametr). A celý ho binárně přečteme. Proč používám právě tuhle fci?
Protože pomocí této fce se dá obsah souboru načíst do jedné proměnné. Uzavřeme soubor a teď pozor. Přichází to úplně nejdůležitější.
Funkce EReg() nám zjistí, zda se v prohledávaném článku nachází něco, co odpovídá regulárnímu výrazu. Když ano, vrací true.
Jak prosté. Stačí tři příkazy. Možná je to pro vás překvapení, ale všechny geniální věci jsou geniálně jednoduché (v tomto
případě by se o použití slova geniální dalo s úspěchem polemizovat). Zbytek (zobrazení nalezených článků) je jen taková ozdoba, kde za mnoho peněz je
poměrně málo muziky, ale uživatele to potěší. A co bysme pro něj neudělali:-)))
Ale pokračujme dál. Již jste poznali, že $i používáme
pro zaznamenání počtu nalezených článků. V poli $c budeme ukládat id článků které zobrazíme, kdy $i označuje pořadí článku a $id
číslo článku. Pozor! Pole jsou číslována od 0. Na to nesmíme zapomínat. Pokud se v článku výraz nachází, pomocnou proměnnou $i inkrementujeme (přesně
postinkrementujeme - zvýšíme o jedna). Možná vás mate příkaz continue. Jeho použití je přeci jasné. Když najdeme slovo v nadpisu,
není potřeba prohledávat anotaci a článek. S největší pravděpodobností se tam bude nacházet také a v tom případě bychom tam měli
článek zobrazen hned třikrát. Příkaz continue přeskočí zbytek cyklu a začne u dalšího. Nemůžeme použít break. Ten by zastavil celý script.
To byla fuška. Příště si ukážeme, jak články zobrazit, ačkoliv je to již maličkost, kterou byste jistě zvládli sami. Alespoň se těšte,
že si ukážeme, jak spočítat kolik článků je v té které rubrice. Prozatím vstřebejte to vyhledávání:-)))
Obsah seriálu (více o seriálu):
- Redakční systém I.
- Redakční systém II.
- Redakční systém III.
- Redakční Systém IV.
- Redakční systém V.
- Redakční systém VI.
- Redakční systém VII.
- Redakční systém VIII
- Redakční systém - tisk
- Redakční systém - generování
- Redakční systém - generování II.
- Redakční systém - generování III.
- Redakční systém - generování IV
- Redakční systém - generování V.
- Redakční systém - krátké zprávy a CSS styly
- Upload obrázků
- Upload - II a logout
- Schvalování článků - II
- Dodatečné přidání obrázku
- Regulární výrazy I
- Regulární výrazy II
- Redakční systém: Fulltext - I.
- Fulltext - II
- Co s RS?
- Optimalizace databáze v RS
- Interní vzkazy - I
- Interní vzkazy - II
- Interní vzkazy - III
- Náměty od čtenářů - I
- Náměty od čtenářů - II
- Náměty od čtenářů - III
- Náměty od čtenářů - IV
- Náhrada FTP
- Ankety
-
25. listopadu 2012
-
30. srpna 2002
-
10. října 2002
-
4. listopadu 2002
-
12. září 2002
-
25. listopadu 2012
-
28. července 1998
-
31. července 1998
-
28. srpna 1998
-
6. prosince 2000
-
27. prosince 2007
-
4. května 2007