Fulltext - II - 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

Fulltext - II

redakcni system

19. února 2002, 00.00 | Sledujete náš seriál o tvorbě redakčního systému v PHP? Pak si nenechte ujít poslední díl! Tímto dílem zakončíme fulltextové vyhledávání, ale i celý seriál.

Dnes tedy budeme pokračovat ve fulltextovém vyhledávání. Ukážeme si jak zobrazit vybrané články. Je toho trochu více a tak se nebudeme zdržovat.

if(isset($c))
{
echo "<P>Počet článků kde je \"<FONT FACE=\"System\">".$slovo."</FONT>\" 
      obsaženo: <U><B>$i</B></U>\n";
echo "<HR ALIGN=\"CENTER\" WIDTH=\"100%\" COLOR=\"#5DBD2A\" SIZE=4>";
$ac=Mysql_query("SELECT id FROM rubriky ORDER BY id DESC"); 
$a=Mysql_result($ac,0,0);
mysql_free_result($ac); // zjistíme počet rubrik na zobrazení
while(list($k,)=each($c))
{
$ab=Mysql_query("SELECT id_rubrika FROM clanky WHERE id='$c[$k]'");
     // v tab. clanky vybereme id_rubrika článku
if($r=mysql_fetch_row($ab)) // pokud výsledek existuje
$rubriky[$r[0]]++; // pole s názvem rubrika
                   // a indexem=číslu rubriky zvětšíme o jednu
}
$n=$a; // pomocná proměnná
mysql_free_result($ab); //uvolníme výsledek z paměti.
$ab=Mysql_query("SELECT rubrika FROM rubriky ORDER BY id DESC"); 
  // z databáze vybereme název rubriky	
while($row=mysql_fetch_row($ab)) // načtem ho
{
if($rubriky[$n]==1) // pokud je tam jeden článek
echo "V rubrice <B>".$row[0]."</B> byl nalezen <B>jeden</B> článek.<BR>";
elseif($rubriky[$n]<5 && $rubriky[$n]>1) // při dvou až čtyřech článcích
echo "V rubrice <B>".$row[0]."</B> byly nalezeny <B>".$rubriky[$n]."</B>
      články.<BR>";
elseif($rubriky[$n]>=5) // při pěti a více 
echo "V rubrice <B>".$row[0]."</B> bylo nalezeno <B>".$rubriky[$n]."</B>
      článků.<BR>";
$n--;  // rubriky bereme od nejposlednější vytvořené
}

Popíšeme si předchozí úryvek. Ještě připomenu, že články, které se mají zobrazit, jsou uloženy v poli $c. Pokud tedy jsou nějaké články na zobrazení, Zjistíme nejvyšší číslo existující(!) rubriky. To je důvod proč používám MySQL_Result() a nikoliv MySQL_Num_Rows(). Druhá funkce by nám zjistila počet rubrik, nikoliv však nejvyšší číslo rubriky. Následuje cyklus, kde pro každý článek zjistíme číslo rubriky, ve které se nachází. Výsledek budeme uchovávat v poli $rubriky. Jako klíče budou čísla rubrik a hodnota jednotlivých klíčů bude počet nalezených článků jejíž číslo se rovná klíči v poli. Do pomocné proměnné $n přiřadíme nejvyšší číslo rubriky a vybereme z databáze jména včech rubrik seřazená podle id od největšího po nejmenší. Přesně tak jsou totiž seřazeny počty článků v poli rubriky. Následuje cyklus, který probíhá dokud nejsou názvy všech rubrik vyčerpány. Jak vidíte, script dokáže skloňovat podle počtu nalezených článků. To jest pro 1 (1.pád jednot. čísla), 2,3,4 (1.pád množ. čísla) a více než 5 (2.pád množ. čísla).

Následující část zařadíme do scriptu index.php hned za část předcházející.

echo "<HR ALIGN=\"CENTER\" WIDTH=\"100%\" COLOR=\"#5DBD2A\" SIZE=4>";
unset($n); // máme jistotu, že je prázdná
odkazy($i,$CL_PER_PAGE,
  "index.php?hledej=true&slovo=".$slovo."&nazev=".$nazev."&");
// pro zobrazení $CL_PER_PAGE článků na stránku
if($start) // pokud již neco bylo zobrazeno
$n=($CL_PER_PAGE*$start); // pokračujeme tam, kde jsme skončili
else
$n=0; // jinak začneme od 0
$f=0; // zde budeme ukládat počet zobrazených článků
rsort($c); // seřadíme články od nejmladšího k nejstaršímu
reset($c); // vrátíme se na začátek pole
while($f<$CL_PER_PAGE) // dokud je na stránce méně než $CL_PER_PAGE článků
{
If($c[$n]!="") 
zobraz($c[$n]);
$n++; // pořeskočíme na další článek
$f++; // zvýšíme počet zobrazených článků
}
echo "<BR>".$odkazy;
}
            if($d) // když žádné články nejsou zobrazíme hlášku a patičku
	echo "<B>Je nám líto, ale tento výraz se v našich článcích nenachází.
              </B>"; 
}
    // pokud existuje proměnná $clanek zobrazíme článek. Ten musí být schválený
    // a čas vydání musí být menší nebo shodný s aktuálním
elseif ($clanek > 0)  // if musíme změnit na elseif
    {

Máme již zobrazeny počty článků v jednotlivých rubrikách. Zbývá zobrazit samotné články. Jak jsem říkal, bude používat rozdělaní článků na stránky po 10. Proto funkce odkazy() (její funkci vysvětloval pan Kocman). Připomínám, že musíme předat proměnné, které budeme potřebovat. To jest: $hledej (true),$slovo (hledané slovo v lidské podobě) a $nazev (regulární výraz hledaného slova). Pokud již bylo něco zobrazeno, pokračujeme tam, kde jsme skončili. To znamená následujícím článkem. V opačném případě začneme od nuly. Počet zobrazených článků získáme pomocí $CL_PER_PAGE*$start. Říkáte si, že poslední článek na konci stránky se zobrazí znovu na prvním místě v další stránce? V tom případě si vzpomeňte, že pole jsou číslována od 0 a rázem je vše jasné. Pro zobrazení článků se používá funkce zobraz(). Její jediný parametr je id článku, který se má zobrazit. Tímto způsobem zobrazíme $CL_PER_PAGE článků. Pokud se vše nevešlo na jednu stránku, přidáme odkazy na zbytek. Ještě nám zbývá případ, kdy není nalezen žádný článek. V tom případě $d="true". Zobrazíme hlášku o neúspěchu.

Teď nám zbývá jen funkce zobraz(). Nebudu ji již více komentovat, neboť vše, co je v ní, již bylo zobrazeno a řečeno. Funkci vložíme do scriptu function.php.

function zobraz($id)
{
$cas=time();
@$sql = mysql_query("SELECT A.jmeno,A.email,R.rubrika,C.datum FROM clanky C,
 rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id 
 AND C.id = $id AND C.stav = 'a' AND datum <= $cas ");
if($data=mysql_fetch_row($sql))
{
@$sql = mysql_query("SELECT count(*) FROM fora WHERE id_clanku = $id");
$prispevku = mysql_result($sql,0,0);
mysql_free_result($sql);
?>
       <H3 ALIGN="LEFT"> <A HREF="index.php?clanek=<? echo $id; ?>">
       <? include "./clanky/n_$id.dat"; ?></A> </H3>
         <? include "./clanky/a_$id.dat"; ?> 
        <P>
        Publikováno: <B><? echo date("d.m.Y",$data[3]); ?></B> v rubrice 
        <B><? echo $data[2]; ?></B>.
        <BR>
        <B>Diskuze:</B>
          <A HREF="forum.php?clanek=<? echo $id; ?>">
        <?
          // pokud v diskuzi není příspěvek
          if ($prispevku == 0)
            { echo "žádný příspěvek"; }
          // pokud je v diskuzi jeden příspěvek
          elseif ($prispevku == 1)
            { echo "jeden příspěvek"; }
          // pokud jsou v diskuzi 2,3 nebo 4 příspěvky
          elseif ($prispevku > 1 && $prispevku < 5)
            { echo $prispevku . "příspěvky"; }
          // pokud je v diskuzi více než 4 příspěvky
          else
            { echo $prispevku . "příspěvků"; }
        ?>
        </A><BR>
        <B>Autor:</B> <A HREF="mailto:<? echo $data[1]; ?>"> 
         <? echo $data[0]; ?></A>
        </P>
        <?}
	if(File_Exists("./images/$id.jpeg")){ 
	$a=GetImageSize("./images/$id.jpeg");
	if($a[0]>80 || $a[1]>80)
	$pomer=$a[0]/$a[1];
	while($a[0]>40&&$a[1]>40||$a[0]<60&&$a[1]<60&&$a[0]/$a[1]==$pomer)
	{	
	$a[0]=round($a[0]/1.1);
	$a[1]=round($a[1]/1.1);
	}
	?>
	<IMG SRC="./images/<? echo $id; ?>.jpeg" WIDTH=<? echo $a[0]; ?> 
        HEIGHT=<? echo $a[1]; ?><P>
	<?}
	elseif(File_Exists("./images/$id.gif")){
	$a=GetImageSize("./images/$id.gif");
	if($a[0]>80 || $a[1]>80)
	$pomer=$a[0]/$a[1];
	while($a[0]>40&&$a[1]>40||$a[0]<60&&$a[1]<60&&$a[0]/$a[1]==$pomer)
	{	
	$a[0]=round($a[0]/1.1);
	$a[1]=round($a[1]/1.1);
	}
	?>
	<IMG SRC="./images/<? echo $id; ?>.gif" WIDTH=<? echo $a[0]; ?> 
        HEIGHT=<? echo $a[1]; ?>><P>
	<? 
	}
}

Tímto máme za sebou fulltextové vyhledávání a také celý seriál. Možná, že mě ještě něco napadne. Možná, že něco napadne vás. Pro všechny nedočkavé je možnost si stáhnou kompletní scripty zde. Myslím, že k větší dokonalosti tomu chybí jen lepší grafika a pár drobností, kde je za hodně peněz málo muziky. Tím myslím počítání zobrazených stránek, označení hledaných slov a tak dále.

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: