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

V tomto pokračování si trochu znesnadníme práci všelijakými kontrolními atributy formuláře dat tak, aby s nimi uživatel nemohl nikterak neoprávněně manipulovat a měnit je, či jen zabránit v chybném zpracování.

Doufám, že jste si poctivě od minula trénovali diskuzi a snad i tušíte, čemu se v tomto díle budeme věnovat. Bude to především kontrola vzkazu, aby nedošlo k chybě či nedovolenému formátování textu ze strany uživatele.

 if (!empty($zprava)&!empty($jmeno)){
   $vzkaz='<tr><td>'.$jmeno.'</td><td>'.$zprava.'</td></tr>';
   $otevrit = fopen ('note.txt','a');
   fwrite ($otevrit, $vzkaz);
   fclose ($otevrit); 
   }

Tučně jsem zvýraznil pasáž, která od minula přibyla. Je to komplikovanější podmínka, kterou si důkladněji rozebereme. Syntax funkce if() doufám už z minula umíte. Tato funkce kontroluje, jestli proměnné $zprava a $jmeno existují a jestli nejsou prázdné. Proč to? Když otevřete zpracovanou stránku diskuze.php v prohlížeči poprvé, žádné proměnné $zprava a $jmeno ještě neexistují - nebyly vytvořeny odesláním formuláře. Když budou prázdné, dostaneme prázdné buňky tabulky a to dělá neplechu. Kromě toho, nechceme dopustit zaneřádění diskuze tím, že se někdo přehlédne a odešle vzkaz bez jména či zprávy.

Funkce empty() je pravdivá, jestliže proměnná v závorce nebyla vytvořena, má nulovou nebo prázdnou hodnotu. Protože chceme opak (potřebujeme zjistit, jestli již vytvořena byla a nějakou hodnotu má), napíšeme před funkci vykřičník. Ten ji neguje, takže vrací pravdivou hodnotu právě v případě existující proměnné. Protože máme proměnné dvě a potřebujeme je mít funkční obě, vložíme mezi ně & (and), což znamená doslova a zároveň. Ve volném přepisu do češtiny bude tato podmínka znít: Když proměnné $zprava a $jmeno existují a nemají nenulovou hodnotu, proveď příkaz ve složených závorkách.

Postarali jsme se, aby návštěvník nemohl nechat kolonku prázdnou, teď ještě, aby nemohl zadat jakékoli formátovací příkazy. K tomu slouží funkce strip_tags(), která odfiltruje znaky < a > a vše mezi nimi. Nejde o to, zabraňovat čtenáři zvýraznit si pasáž ve vzkazu, <b> tag nám asi příliš vadit nebude, ale nezapomeňte, že může klidně použít třeba </body></html> a máme konec stránky tam, kde jej rozhodně mít nechceme. A to jsme jen u html, kdyby dal <? ?> už může psát libovolný php příkaz. V této diskuzi to nic nezpůsobí (zkuste si to), protože na čtení vzkazu je zde použita funkce readfile(), která obsah souboru nezpracuje, pouze přečte.

Další celkem důležitou funkcí je stripslashes(), ta odfiltruje zpětná lomítka dodaná samotným php. Když totiž zadáte některé znaky v php užívané (třeba uvozovky), bez této funkce se zapíše \" místo čistého ". Uznáte sami, že to kráse textu příliš neprospívá.

Pro diskuzi je důležité také vědět, kdy dotyčný psal svoji připomínku. Zde využijeme funkci date(), jež má velmi mnoho možných atributů. Uvedu jen ty nejpoužitelnější, více najdete v manuálu.

j - den v měsíci bez nul; tj. od "1" do "31"
n - měsíc bez nul; tj. od "1" do "12" 
Y - rok, 4 číslice; např.: "1999" 
H - hodina, 24-hodinový formát; tj. od "00" do "23" 
i - minuty; tj. od "00" do "59"

Následná proměnná pro získání data a času vypadá tedy následovně:

$datum=date('j.n.Y.H:i');

Jak vidíte, jednotlivé položky jsou od sebe odděleny tečkou nebo dvojtečkou. Záleží na naší potřebě formátování data a času. Tato proměnná zobrazí např.: 1.7.2001.10:56.

Soubor diskuze tedy po dnešním díle vypadá takto (tučně jsou zvýrazněny změny):

<?
$datum=date('j.n.Y.H:i');
if (!empty($zprava)&!empty($jmeno)){
   $zprava=strip_tags($zprava);
   $zprava=stripslashes($zprava);
   $jmeno=strip_tags($jmeno);
   $jmeno=stripslashes($jmeno);
   $vzkaz='<tr><td>'.$jmeno.'</td><td>'.$datum.'</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>Datum</td><td>Zpráva</td></tr>    
<? readfile ('note.txt'); ?>
</table>