Redakční systém: Fulltext - I. - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

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ě:

<FORM METHOD="POST" ACTION="index.php?hledej=true">
 <BR>
 <B>Hledej:</B><BR>
 <INPUT TYPE="TEXT" NAME="nazev" SIZE=14 VALUE="<? echo $slovo; ?>"> 
      <INPUT TYPE="SUBMIT" VALUE="Hledej"><BR>
 <INPUT TYPE="CHECKBOX" NAME="velikost" VALUE="true"> Ignorovat velikost písmen
 </FORM>

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.

    <!-- levý slopec -->
    <?
      $nazev=StripSlashes($nazev); // !!!
      If(!isset($strat))
      $slovo=$nazev;
      // vložíme levý sloupec
     @include "./levy.php";
    ?>
    <!-- levý slopec - konec -->
  </TD>
  <TD VALIGN="TOP">
    <!-- pravý slopec -->

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.

    <!-- pravý slopec -->
    <?
    // pokud hledáme nějaký článek, použijem tohle
	
if($hledej=="true")
{
$d="true"; // zatím nebyl nalezen žádný článek
 $cas=Time();
 @$sl=mysql_query("SELECT id FROM clanky WHERE stav='a' AND datum<=$cas");
 $i=0;
 if($velikost)
 $nazev=SQL_Regcase($nazev);
while($a=mysql_fetch_row($sl))
      {
     $id=$a[0];
     
      if(File_Exists("./clanky/c_$id.dat"))
        {
        @$u=fopen("./clanky/c_$id.dat", "r");
        @$g=FRead($u, FileSize("./clanky/c_$id.dat"));
        FClose($u);
        $h=EReg($nazev,$g);
            if($h)
	    {
	    $c[$i]=$id;
	    $i++;
	    $d="false"; // nalezli jsme článek
	    continue; // vezmem další článek
	    }
        } 
      // to bylo pro článek
      if(File_Exists("./clanky/a_$id.dat"))
        {
        @$y=fopen("./clanky/a_$id.dat", "r");
        @$g=FRead($y, FileSize("./clanky/a_$id.dat"));
        FClose($y);
        $h=Ereg($nazev, $g);
        if($h)
	    {
	    $c[$i]=$id;
	    $i++;
	    $d="false";
	    continue;
    	    }
          }
   if(File_Exists("./clanky/n_$id.dat"))
            {
            @$y=fopen("./clanky/n_$id.dat", "r");
            @$g=FRead($y, FileSize("./clanky/n_$id.dat"));
            FClose($y);
            $h=EReg($nazev, $g);
            if($h)
	        {
	        $c[$i]=$id;
	        $i++;
	        $d="false";
	        continue;
	       }
            } 
          // to bylo pro anotaci
   }

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):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: