Ještě jednou se vrátíme k práci se soubory ve dvou jednoduchých ukázkách s tím, že na internetu můžete najít řadu dalších příkladů a ukázek bez použití databází, které byste mohli vyzkoušet.

Návštěvní kniha

Návštěvní knihy mohou být různě složité, na ty složitější použijeme opět spíše databázi, můžete se ale setkat i s jednoduchými návštěvními knihami, do kterých se v podstatě jen připisují vzkazy. S následující ukázkou jednoduché návštěvní knihy jste se nejspíš také už setkali (viz obrázek).
Zdroj scriptu obsahuje některé nové drobnosti pro základní ochranu před nekorektními příspěvky. Zkuste si představit, co by se stalo, kdyby nějaký studovanější uživatel do příspěvku zapsal zdroj v php nebo html, mohl by snadno "rozbořit" vaši stránku. Proto je použita funkce HTMLSpecialChars, která převede speciální html znaky na znakové entity například < na &lt; a podobně. Další nové funkce a fungování scriptu jsou snad dostatečně okomentované, příkazy pro práci se soubory bychom měli znát z minulých lekcí.
Také pevně doufám, že víte, co je ještě potřeba, aby tato návštěvní kniha vypadala například jako ta na obrázku :-) .

<?php
if (!empty($_POST))
{
$jmeno = $_POST['jmeno'];
$zprava = $_POST['zprava'];
$jmeno=HTMLSpecialChars($jmeno); //převede některé znaky na entity
$zprava=HTMLSpecialChars($zprava);
$jmeno=stripslashes($jmeno); //odstraní lomítka
$zprava=stripslashes($zprava);
$zprava = str_replace("\n"," <br> ", $zprava); //nové řádky nahradí <br>
$zprava = substr($zprava, 0, 10000);//zpráva bude mít maximálně 10000 znaků pomocí substr
if ($zprava!="" and $jmeno!=""){ //provede se pokud není prázdná zpráva a jméno
$celek="<strong>$jmeno</strong>:<br>$zprava<hr>";
$soubor = fopen ('data.inc','a'); //otevře soubor pro doplňování
fwrite ($soubor, $celek); //zapíše zprávu
fclose ($soubor); //zavře soubor
}}
?>
<h2>Zprávy autorovi</h2>
<?php include "data.inc"; ?>
<h2>Přidání zprávy</h2>
<form action="" method="post">
Jméno: </br><input type="text" name="jmeno" maxlength="25">
Zpráva: </br><textarea cols="15" rows="5" name="zprava"></textarea>
<center><input type="submit" value="odeslat">
</form>


Testy jsme tvořili už v jedné z prvních lekcí. V této lekci použijeme univerzálnější script, který zpracuje testy uložené v souborech stejným způsobem.

Test ze souboru

Pro přehlednost jsem tentokrát rozdělil test do dvou souborů, v prvním načteme zadání z textového souboru a ve druhém scriptu vyhodnotíme odpovědi.
Podobně jako v minulé lekci u ankety oddělíme v textovém souboru otázky, odpovědi a písmeno správné odpovědi například znakem # :

Které slovo nejlépe vystihuje opak slova „dobrodružný“?#
klidný#
nezajímavý#
všední#
ostýchavý#
nevýbojný#a#

Které spojení slov vystihuje nejlépe význam úsloví „labutí píseň“:#
poslední umělecké dílo#
nejlepší umělecký počin#
skladba o ptácích#
elegantní chůze#
něžná píseň#a#

Z takto připraveného souboru test.txt načteme otázky a odpovědi do pole $test, které potom pomocí cyklu for vypisujeme do zdroje stránky (do formuláře). Všimněte si, jak je vytvořený název příslušných proměnných pro odpovědi (v parametru name).
<form action="test_hodn.php" method="post">
<?php
if (File_Exists ("test.txt")):
$fp = FOpen ("test.txt", "r");
$test = Explode ("#", FRead ($fp, filesize("test.txt"))); FClose ($fp); //"nasekání" souboru test.txt do pole
else:
echo"soubor s testem neexistuje";
endif;
for ($i=0;$i {echo $i/7+1,". ",$test[$i],"</br>"; //vypsání otázky
$j=$i+1; echo"<input type=\"radio\" name=\"","odpoved",$i,"\" value=\"a\">",$test[$j],"  "; //jednotlivé odpovědi
$j=$i+2; echo"<input type=\"radio\" name=\"","odpoved",$i,"\" value=\"b\">",$test[$j],"  ";
$j=$i+3; echo"<input type=\"radio\" name=\"","odpoved",$i,"\" value=\"c\">",$test[$j],"  ";
$j=$i+4; echo"<input type=\"radio\" name=\"","odpoved",$i,"\" value=\"d\">",$test[$j],"  ";
$j=$i+5; echo"<input type=\"radio\" name=\"","odpoved",$i,"\" value=\"e\">",$test[$j],"</br></br>";
};
?>
<input type="submit" value="vyhodnocení">
</form>

Jak vidíte z parametru formuláře, vyhodnocení je svěřeno souboru test_hodn.php. V první části je stejným způsobem načtený textový soubor do pole $test (mohl být ale například vytvořený jiný soubor jen pro odpovědi). Pomocí for cyklu projdeme všechny otázky a zjistíme, zda byla zodpovězená (existuje příslušná proměnná s odpovědí) a odpověď porovnáme s položkou pole, která je o šest položek za otázkou (má být písmeno správné odpovědi).
Za vyhodnocením jsou dva odkazy - první vlastně javascriptem nahrazuje tlačítko zpět prohlížeče, navrací předchozí stránku (s vyplněným formulářem), druhý odkaz formulář "vynuluje" (načítá jej znovu).
<?php
if (File_Exists ("test.txt")):
$fp = FOpen ("test.txt", "r");
$test = Explode ("#", FRead ($fp, filesize("test.txt"))); FClose ($fp);
else:
echo"soubor s testem neexistuje";
endif;
if (!empty($_POST)):
extract($_POST);
$spravne=0; //počet správných odpovědí
for ($i=0;$i {$odpoved="odpoved".$i; //vytvoření názvu proměnné pro příslušnou odpověď
echo $i/7+1,". otázka: ";
if (!isset($_POST[$odpoved])) echo"otázka nebyla zodpovězená"; //proměnná s odpovědí neexistuje
else
{$k=$i+6; //písmeno správné odpovědi je o 6 položek dál než otázka
if ($_POST[$odpoved]==$test[$k]) {echo"správná odpověď"; $spravne++;} else echo"bohužel chyba";};
echo"</br>";
}
echo"<h1>počet správných odpovědí: ",$spravne,"</h1>";
else: echo"nebyla zodpovězena ani jedna otázka! <br><br>";
endif;
?>
<a href="javascript: history.go(-1);"> opravit chyby </a></br>
<a href="test_soubor.php"> znovu zadání </a>


Úkoly:

Úkol (2 body+prémie)

Přidej například na index jednoduchou návštěvní knihu podle textu lekce. Pozor, pouhé zkopírování stačit nebude, zamysli se malinko, proč jsou po spuštění hlášené chyby a jak je co nejsnadněji odstranit. Prémiové body můžeš získat za stylovou úpravu (například podle obrázku v lekci).

Úkol (3 body + 4 body za každý test použitelný na školní stránku)

Vytvoř on-line test s deseti otázkami podle textu lekce. Pro testy použitelné na školní stránku se můžeš na zadání domluvit s vyučujícím.

Úkol (body podle užitečnosti a zpracování zdroje, minimálně 6 bodů)

Najdi na internetu další ukázku využití PHP (zdroj scriptu) bez databází, uprav ji pro PHP5 a dostatečně okomentuj (především doposud neprobírané příkazy). Nezapomeň uvést zdroj.

Název školy:Základní škola, Hradec Králové, M. Horákové 258
Název projektu:EU peníze školám
Číslo projektu:CZ.1.07/1.4.00/21.2575
Téma:Programování v PHP
Název:VY_32_INOVACE_13_10A_PHP13
Autor:Pavel Petr
Použité zdroje: Není-li uvedeno jinak, jsou všechny ilustrační obrázky dílem autora.