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.
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.
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.
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] až $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).
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 |