PHP v praxi - 3. díl
autor: Jan Veselý  rubrika: HTML pro pokročilé   (16.07. 2001)

Dnešní díl se zabývá problematikou oživení stránek - ukážeme si, jak lze snadno vytvořit diskusi pro návštěvníky našeho webu. Podíváme se na daný problém jak z technického, tak i praktického hlediska.

Návštěvnost stránky závisí jednoznačně na jejím obsahu - pokud je statický, málokdy dostane surfař chuť znovu stránku navštívit. Internetový magazín těží z průběžně přibývajících článků, které si ale každý samozřejmě dovolit nemůže. Z mého pohledu nejlepším oživením stránek je nějaká forma diskuze mezi čtenáři. Surfař bude zvědav, copak se zde objevilo nového a stránky navštíví, kdykoli bude připojen k Internetu.

V PHP se dá diskuze udělat poměrně snadno (tedy jednodušší varianta). Podíváme-li se na tento problém z technického hlediska, pak potřebujeme: zpracovat data, která uživatel vloží a odešle, uložit je do souboru a načíst. Mou prioritou vždy bylo omezit soubory na minimální počet, k diskuzi proto využijeme pouze dva - diskuze.php (html formulář a zpracování dat), note.txt (uložená data - vzkazy).

Nejprve se tedy podíváme na formulář.

 	
<form action="diskuze.php" method="get">
<input type="text" name="jmeno" size="10">
<input type="text" name="zprava" size="60">
<input type="submit" value="Zapsat">
</form>

Jak vidíte, odkazuje sám na sebe (neboť se dále bude o data starat), method je po zkušenostech nastavená na get (někteří provideři nedovolují post), jinak je snad vše jasné.

Co se stane po odeslání? Kdo četl pozorně minulý díl, je už jistě v obraze - vytvoří se dvě proměnné, $zprava a $jmeno. S nimi tedy již můžeme pracovat. Pro diskuzi je vhodné formátování do tabulky, kde si můžeme také názorně ukázat, jak snadné je sloučení PHP s HTML.

$vzkaz='<tr><td>'.$jmeno.'</td><td>'.$zprava.'</td></tr>';

V proměnné $vzkaz máme nyní kompletní řádek tabulky pro zápis do souboru note.txt. Až si to budete zkoušet, nezapomeňte tomuto souboru na serveru změnit atributy - musí mít nastavena práva na zápis pro celý svět. Tak a teď už zbývá jen dotyčný řetězec do souboru zapsat:

$otevrit = fopen ('note.txt','a'); 
fwrite ($otevrit, $vzkaz); 
fclose ($otevrit);

Proměnná $otevrit po jejím vyžádání otevře soubor note.txt, atribut 'a' znamená 'otevři k zápsání dat a umísti kurzor na konec souboru'. Funkce fwrite() zapíše obsah proměnné $vzkaz do souboru otevřeného přes proměnnou $otevrit (data zapíše na konec tohoto souboru). Soubor otevřený obsahem proměnné $otevrit zavřeme funkcí fclose(). V tomto okamžiku již soubor note.txt obsahuje tu určitou řádku se vzkazem. Nyní už nám stačí do souboru diskuze.php dosadit následující:

<table>
<tr><td>Jméno</td><td>Zpráva</td></tr>
<? readfile ('note.txt');  ?>
</table>

Již popsaná funkce readfile() nám přečte obsah note.txt.

Byl bych rád, kdybyste si sami zkusili diskuzi vytvořit. Příště se podíváme na její rozšíření a hlavně zdokonalení - tato diskuze totiž funguje správně pouze v případě, že nenastane žádná chyba (ať úmyslná či neúmyslná). Např. když někdo nenapíše do jednoho z polí formuláře nic a odešle, vznikne řádek s prázdnou buňkou. Také zde není kontrola obsahu vzkazu - každý tak může vložit do souboru jak formátování HTML, tak i nějakou nebezpečnou funkci PHP. Proto bych byl velmi rád, abyste si tento příklad vyzkoušeli a zjistili, jak opatrní musíte být.

Na závěr tedy obsah souboru diskuze.php (bez základních html tagů):

<?
$vzkaz='<tr><td>'.$jmeno.'</td><td>'.$zprava.'</td></tr>';
$otevrit = fopen ('note.txt','a');
fwrite ($otevrit, $vzkaz);
fclose ($otevrit); 
?>
	
<form action="diskuze.php" method="get">
<input type="text" name="jmeno" size="10">
<input type="text" name="zprava" size="60">
<input type="submit" value="Zapsat">
</form>
<table>
<tr><td>Jméno</td><td>Zpráva</td></tr>  
<? readfile ('note.txt');  ?>
</table>