Redakční systém - generování V. - 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:

Soutěž

Sponzorem soutěže je:

IDIF

 

Kdo je autorem výstavy obrazových fotografií „Očima Hanse Christiana Andersena“?

V dnešní soutěži hrajeme o:



PHP

Redakční systém - generování V.

redakcni system

22. listopadu 2001, 00.00 | V dnešním díle seriálu o tvorbě vlastního redakčního systému budeme pokračovat v generování do souborů. Konkrétně se zaměříme na generování dat z diskuzního fora pod článkem.

Dnes tedy ukáži onen zdrojový kód od scriptu forum.php, jehož úpravy jsem načal minule. Proberu pouze části označené komentáři jako pravý sloupec. Vše ostatní je již známé.

Jak to probíhá? Pokud existuje proměnná $clanek, načteme ze souboru n_$clanek.dat (o názvech článků jsme se již bavili) nadpis článku. Načítání vypadá takto:

  // najdeme nadpis článku
       	if($name=="") 
	{
	@$p=FOpen("./clanky/n_$clanek.dat", "r");
	@$name=FRead($p, FileSize("./clanky/n_$clanek.dat"));
	@FClose($p);
	}

Pokud má proměnná $name nějakou hodnotu, otevřeme soubor čtení. Soubor je umístěný v adresáři clanky a má název například n_48.dat. Otevřeme ho pouze pro čtení. Funkce FRead() přečte ze souboru (první parametr) data o délce je uvedené v druhém parametru. Jelikož tato funkce čte data binárně, musíme jí předat velikost souboru v bajtech. Tu získáme pomocí funkce FileSize(). Zavináče nám zajistí, že se nebude vypisovat žádná chybová hláška. Pokud by například nešel otevřít soubor, PHP vypíše chybu i s cestou k souboru a pro šikovného hackera je pak jednoduché se nám do systému nabourat. FClose() nám soubor uzavře.

Další změna je u vkládání příspěvku do databáze. Jako vždy vše nejprve vložíme do databáze, a pak teprve generujeme. Tuto podmínku umístíte, za místo, kde se vkládají data do tabulky.

if($sql)
	{
	$id=MySQL_Insert_Id();
	$generuj="forum";
	@include "./admin/generuj.php";
	UnSet($id);
	}
            else
	{
	echo "Zprávu se nepodařilo uložit.";
	echo "<A HREF=\"forum.php?clanek=$clanek\">Zpět na fórum</A> ";
	}

Co se děje? Pokud se článek úspěšně vloží do databáze, zjistíme pomocí fce MySQL_Insert_Id(); hodnotu id posledního příkazu INSERT. Parametry nezadáváme žádné (tzv. void). Připravíme se na generování tak, že $generuj přiřadíme hodnotu forum. Načteme z adresáře admin script generuj.php. Následně zrušíme $id, protože by nám to mohlo dělat neplechu. Když se článek do databáze nevložil, vypíšeme chybové hlášení.

Do scriptu generuj.php umístíme tento kód:

if($generuj=="forum")
{
@$sql=mysql_query("SELECT predmet,text FROM fora WHERE id=$id", $conn);
$row=mysql_fetch_row($sql);
if(!$row[0]=="")
{
@$k=fopen("./fora/p_$id.dat", "w");
fputs($k, $row[0]);
fclose($k);
}
if(!$row[1]=="")
{
@$k=fopen("./fora/t_$id.dat", "w");
fputs($k, $row[1]);
fclose($k);
}
mysql_query("UPDATE fora SET predmet='',text='' WHERE id=$id",$conn);
}

Větev je podobná všem předchozím. Z tabulky fora, vybereme předmět a text příspěvku. Uložíme je do jednotlivých souborů do adresáře fora. Soubory se jmenují: p_$id.dat pro předmět a t_$id.dat pro text příspěvku. Následně nastavíme v tabulce předmět a text na prázdnou hodnotu. Možná se vám zdá divné, že položky updatuji, ale v tabulce ještě máme číslo článku, datum atd. Tyto položky je myslím zbytečné generovat, nehledě na to, že si s nimi lépe poradí SQL server. SQL příkaz DELETE by vymazal celý záznam.

Dál se musíme vypořádat se zobrazením příspěvků. To vypadá takhle:

  // článek byl nalezen
    else
    {
    @$sql = mysql_query("SELECT count(*) FROM fora
            WHERE id_clanku=$clanek ORDER BY datum DESC");
        // pokud je v databázi alespoň jeden příspěvek
        if (mysql_result($sql,0,0) > 0)
        {
          odkazy(mysql_result($sql,0,0),$CL_PER_PAGE, 
                 "forum.php?clanek=".$clanek."&");
         Mysql_free_result($sql);
         echo "<h3 align=\"center\">Diskuze ke článku 
		<A HREF=\"index.php?clanek=$clanek\">$name</A></h3>\n";

       // výběr diskusních příspěvků
      @$sql = mysql_query("SELECT * FROM fora WHERE id_clanku = $clanek 
      ORDER BY datum DESC LIMIT $odtud,$CL_PER_PAGE");
       // pokud ke článku existuje příspěvek a nebyl odeslán forulář
       if (@mysql_num_rows($sql)>0 && !$add && !$error)
       {
          while ($row = mysql_fetch_row($sql))
          {
            ?>
            <P>
            <B>Příspěvek ze dne:</B> <? echo date("d.m.Y H:i:s",$row[2]);?>
            <BR>
            <B>Přispěl:</B> <A HREF="mailto:<? echo $row[4]; ?>">
            <? echo $row[3];?></A>
            <BR>
            <B>Předmět:</B> 
	<? 
	include "./fora/p_$row[0].dat"; 
	echo "\n<BR>\n"; 
	include "./fora/t_$row[0].dat";
	?>
            </P>
            <?
          }
       echo "<BR>".$odkazy;
       }}

Z databáze zjistíme, jestli je tam alespoň jeden příspěvek. Když ano, použijeme fci odkazy(), kterou nadefinoval pan Kocman. Důvody použití funkce jsme si vysvětlovali minule. Dál vybereme všechny příspěvky k tomuto článku a postupně je zobrazíme. Trochu bych se zastavil u té poslední podmínky. Ta se vykoná, pokud nebyl formulář odeslán. To jest, že když přidáte příspěvek, tak se po odeslání zobrazí jen formulář bez příspěvků. Můžeme to vyřešit změnou podmínky na tento tvar:

if (@mysql_num_rows($sql)>0 && !$error)

Příspěvky se pak zobrazí vždy. Jak po přechodu z hlavní stránky, tak po odeslání formuláře. Myslím, že je to tak lepší, ale do ničeho vás nenutím.

Ještě malá poznámka: při odesílání e-mailu s upozorněním bych ještě použil funkci Set_Time_Limit() a jako hodnotu bych nastavil číslovku 0. Proč? Pokud budeme mít v databázi deset tisíc jedinečných e-mailových adres, které budou chtít upozorňovat na nové zprávy (takovým provozovatelům gratuluji), potřeboval by script poměrně dlouhou dobu na to, aby všechny obeslal. Pokud někdo konfiguroval Apache, tedy asi nejčastěji používaný webový server, dobře ví, že limit na provedení scriptu je standardně 30 sekund. Nejsem si jist, jestli by za 30 sekund zvládl rozeslat deset tisíc e-mailů. Z tohoto důvodu by možná bylo dobré nastavit neomezeně dlouhý interval. Script se ukončí po odeslání všech emailů. Funkce je v úryvku vložena. Stačí ji odkomentovat (odstranit zpětná lomítka).

 @$sql = mysql_query("SELECT DISTINCT email FROM fora 
         WHERE id_clanku = '$clanek'");
         // Set_Time_Limit(0);
         while (@$row = mysql_fetch_row($sql))
               {
                @mail($email,"Novy prispevek v diskuzi",$mess, 
			"From: \nReply-To: ");
               }

Tak to by bylo pro dnešek vše. Příště si trochu vylepšíme vzhled našeho RS.

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: