Jednoduchá anketa

Jednoduchá anketa je dalším projektem, kde by použití databází mohlo být spíš nadbytečné. Pro anketu, kterou vytvoříme, stačí uložit jen IP adresu respondenta a pět čísel určujících počet jednotlivých voleb, k tomu bude jako v minulé lekci opět vhodnější uložení do souboru. Nejprve ale přidáme několik drobných novinek pro identifikaci uživatele a převod řetězce do pole. Zdrojem výkladu a příkladu v této lekci je článek J. Lahvičky ze serveru www.interval.cz (sekce Vývoj aplikací - PHP) upravený pro PHP5.


Pole $_SERVER

V minulých lekcích jsme často používali pole globálních proměnných $_POST, $_GET, případně $_REQUEST, které obsahují proměnné předané skriptu metodami POST nebo GET.
Připomeňte si také příkaz extract($_GET); pro "vybalení" proměnných z některého pole, nebo funkci empty($_POST), pomocí které jsme zjišťovali, jestli byl formulář odeslaný.

V některých případech potřebujeme zjistit nikoli jestli je některé pole úplně prázdné, ale jestli existuje některá konkrétní proměnná (například jestli byla vyplněná všechna povinná pole přihlašovacího formuláře), k tomu lze použít příkaz isset(proměnná) (viz také 10. lekce).

Další pole globálních proměnných $_SERVER obsahuje řadu předdefinovaných proměnných (všechny najdete v manuálu PHP5), například i následující:
$_SERVER["HTTP_REFERER"] - adresa, z níž byl script volán
$_SERVER["HTTP_USER_AGENT"] - typ prohlížeče
$_SERVER["REMOTE_ADDR"] - IP adresa klientského počítače
$_SERVER["REMOTE_HOST"] - název DNS klientského počítače
$_SERVER["PHP_SELF"] - název aktuálního skriptu
$_SERVER["PATH_TRANSLATED"] - cesta ke skriptu

V projektu této lekce využijeme právě zjištění IP adresy klienta k tomu, abychom v anketě nedovolili hlasovat podruhé za sebou z jednoho počítače.

Převod řetězce do pole proměnných

Protože budeme v našem projektu do souboru ukládat a zase načítat více čísel, můžeme využít další příkazy pro práci s řetězci, které převedou části řetězce do pole proměnných. Některé typy textových souborů se skládají z řetězců oddělených vždy stejnými znaky, typickým příkladem jsou soubory csv, v nichž jsou jednotlivé položky oddělené čárkami. Pro tyto typy souborů existuje v PHP speciální funkce explode, která rozdělí celý text na jednotlivé položky a ty uloží do pole. Funkce Explode má dva parametry. První parametr je oddělovač a druhý parametr je řetězec, který chceme rozdělit. Výsledkem příkazu
$pole = Explode (":", "Petr:Pavel:Karel")
by tedy bylo tříprvkové pole - v $pole[0] by byl řetězec Petr, v $pole[1] Pavel, v $pole[2] Karel.

Inverzní funkcí k Explode je Implode. Ta má opět dva parametry, tentokrát je však oddělovač jako druhý, první je pole, které chceme převést na řetězec. Po příkazu Explode v předchozím odstavci tedy můžeme provést
$puvodni_retezec = Implode ($pole,":") a jsme zase tam, kde jsme začali.

Pokud jste pozorně četli předešlé odstavce, tak už vám nic nebrání v tom, abyste zvládli vytvoření jednoduché ankety.

Oznámkujte moji stránku

Každého autora stránek samozřejmě zajímá, jak se jeho stránky líbí ostatním uživatelům, k tomu účelu může posloužit následující anketa:
Nejprve formulář pro hodnocení - obsahuje políčka pro jednotlivé známky, a neměl by pro nás být problém:
<form action="" method="post">
<center>
Jakou známku byste dali mé stránce? (1... nejlepší, 5 ... nejhorší)<br>
<input type="radio" name="znamka" value="1" checked> 1
<input type="radio" name="znamka" value="2"> 2
<input type="radio" name="znamka" value="3"> 3
<input type="radio" name="znamka" value="4"> 4
<br>
<input type="submit" value="Oznámkuj!">
</center>
</form>


Složitější to bude s vlastním scriptem, pozorně sledujte komentáře ve zdroji a snažte se program pochopit.
Do souboru stats.txt budeme ukládat šest řetězců - první bude IP adresa uživatele a dalších pět budou počty jednotlivých známek. Jednotlivé položky budou oddělené znakem #.
Ze souboru budou tyto údaje načtené do pole $stats, takže $stats[0] bude obsahovat IP adresu uživatele a $stats[1]$stats[5] budou obsahovat počty jednotlivých známek.

Pozor, následující zdroj obsahuje několik chybiček (co byste také po mizerně placeném učiteli mohli chtít, že :-) )!

<?php
extract($_POST);
if (isset($znamka)) // jestliže existuje proměnná $znamka
{ if (File_Exists ("stats.txt")): // jestliže existuje soubor se statistikou
$fp = FOpen ("stats.txt", "r"); // otevřeme ho
$stats = Explode ("#", FRead ($fp, filesize("stats.txt"))); // načteme obsah souboru do pole, jednotlivé části řetězce oddělené znakem # přijdou do jednotlivých proměnných
FClose ($fp);
else:
for ($i = 1; $i <= 5; $i++) $stats[$i] = 0; // pokud soubor neexistuje, dáme do všech šesti proměnných nuly
endif; //místo složených závorek byla použita dvojtečka, musí být endif

$adr=$_SERVER["REMOTE_ADDR"]; //do proměnné $adr uložíme IP adresu uživatele
if ($stats[0] != $adr) $stats[$znamka]++; // pokud tato známka přišla z jiné adresy než ta předchozí, přičteme ji
$stats[0] = $adr; // aktualizujeme poslední IP adresu

$hlasu = 0; // celkový počet hlasů (známek)
$suma = 0; // celková suma (počet každé známky násobená její hodnotou)
for ($i = 0; $i <= 5; $i++):
$hlasu += $stats[$i]; // přičteme počet této známky k celkovému počtu (viz 5. lekce)
$suma += $i * $stats[$i]; // přičteme počet známky krát její hodnotu k celkové sumě
endfor; // for s dvojtečkou, proto endfor
$prumer = (Round (100 * $suma / $hlasu)) / 100; // průměrná známka zaokrouhlená na dvě desetinná místa

$fp = FOpen ("stats.txt", "w"); // otevřeme soubor pro zápis
FWrite ($fp, Implode ($fp, "#")); // uložíme řetězec z prvků pole $stats oddělených znakem #
FClose ($fp);}
echo"celkem hlasů: ", $hlasu, "</br>průměr: ,$prumer;
?>


Program obsahuje ještě jednu zatím pro nás neznámou funkci round, ta má v popisu práce zaokrouhlení desetinného čísla na celé (jestliže desetinné číslo vynásobím 100, potom zaokrouhlím na celé číslo a zase vydělím 100, vyjde původní číslo zaokrouhlené na dvě desetinná místa).


Úkoly:

Úkol (3 body)

Vytvoř novou stránku s anketou podle textu lekce (znovu připomínám, že zdroj obsahuje chybičky), nezapomeň na odkaz na indexu, prémii můžeš získat za "stylové zpracování".

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_12_10A_PHP12
Autor:Pavel Petr
Použité zdroje: Není-li uvedeno jinak, jsou všechny ilustrační obrázky dílem autora.