Středoškolská odborná činnost 2007/2008. Naprogramování webové ankety pomocí jazyka PHP a databáze MySQL



Podobné dokumenty
1 Webový server, instalace PHP a MySQL 13

Ing. Přemysl Brada, MSc., Ph.D. Ing. Martin Dostal. Katedra informatiky a výpočetní techniky, FAV, ZČU v Plzni

Návrh a tvorba WWW stránek 1/14. PHP a databáze

STŘEDNÍ ŠKOLA INFORMAČNÍCH TECHNOLOGIÍ A SOCIÁLNÍ PÉČE

Současný svět Projekt č. CZ.2.17/3.1.00/32038, podpořený Evropským sociálním fondem v rámci Operačního programu Praha adaptabilita

PHP PHP je skriptovací programovací jazyk dynamických internetových stránek PHP je nezávislý na platformě

17. července :51 z moravec@yahoo.com

Úvodem 9. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10. Než začneme 11

Maturitní projekt do IVT Pavel Doleček

1. Webový server, instalace PHP a MySQL 13

Databázové aplikace pro internetové prostředí PHP úvod, základní princip, vkládání skriptu, komentáře, výpis na obrazovku

Úvod do tvorby internetových aplikací

Třídy a objekty. Třídy a objekty. Vytvoření instance třídy. Přístup k atributům a metodám objektu. $z = new Zlomek(3, 5);

Využití OOP v praxi -- Knihovna PHP -- Interval.cz

Obsah. Úvodem 9. Kapitola 1 Než začneme 11. Kapitola 2 Dynamické zobrazování obsahu 25. Zpětná vazba od čtenářů 10 Zdrojové kódy ke knize 10 Errata 10

Aplikační vrstva. Úvod do Php. Ing. Martin Dostal

Úvod do aplikací internetu a přehled možností při tvorbě webu

WNC::WebNucleatCreator

MODERNÍ WEB SNADNO A RYCHLE

INOVACE PŘEDMĚTŮ ICT. MODUL 11: PROGRAMOVÁNÍ WEBOVÝCH APLIKLACÍ Metodika

Škola: Gymnázium, Brno, Slovanské náměstí 7 III/2 Inovace a zkvalitnění výuky prostřednictvím ICT Název projektu: Inovace výuky na GSN

JSON API pro zjišťování cen MtG karet

Individuální projekt z předmětu webových stránek 2012/ Anketa

ANOTACE vytvořených/inovovaných materiálů

DELTA - STŘEDNÍ ŠKOLA INFORMATIKY A EKONOMIE, s.r.o. Obor informační technologie AJAX ESHOP. Maturitní projekt. Třída:

Protokol HTTP 4IZ228 tvorba webových stránek a aplikací

INFORMAČNÍ SYSTÉMY NA WEBU

Stručný manuál pro webový editor. Ukládáni základních informací, tvorba menu

Internet 2 css, skriptování, dynamické prvky

Principy fungování WWW serverů a browserů. Internetové publikování

Instalace a konfigurace web serveru. WA1 Martin Klíma

Vstupní požadavky, doporučení a metodické pokyny

Úvod do PHP s přihlédnutím k MySQL

Rezervační systém Tvorba WWW stránek

DUM č. 11 v sadě. 36. Inf-12 Počítačové sítě

Instalace systému Docházka 3000 na operační systém ReactOS Zdarma dostupné kompatibilní alternativě k systému Windows

Už ivatelska dokumentace

Redakční systém Joomla. Prokop Zelený

Inovace výuky prostřednictvím šablon pro SŠ

Střední odborná škola a Střední odborné učiliště, Hořovice

PHP tutoriál (základy PHP snadno a rychle)

5. POČÍTAČOVÉ CVIČENÍ

Příprava prostředí pro výuku PHP a MySQL

Instalace. Produkt je odzkoušen pro MS SQL server 2008 a Windows XP a Windows 7. Pro jiné verze SQL server a Windows nebyl testován.

Střední odborná škola a Střední odborné učiliště, Hořovice

PHP framework Nette. Kapitola Úvod. 1.2 Architektura Nette

1. Úvod do Ajaxu 11. Jak Ajax funguje? 13

Obsah přednášky. Představení webu ASP.NET frameworky Relační databáze Objektově-relační mapování Entity framework

HTML - Úvod. Zpracoval: Petr Lasák

CZ.1.07/1.5.00/

NÁVOD NA OBSLUHU INTERNETOVÉ PREZENTACE. Ataxo Czech s.r.o.

PHP a Large Objecty v PostgreSQL

Bottle -- příklad. Databáze. Testovací data. id Jedinečný identifikátor řádku: Bude typu INT s AUTO_INCREMENT a nastavíme ho jako primární klíč

Olga Rudikova 2. ročník APIN

Střední odborná škola a Střední odborné učiliště, Hořovice

HTTP protokol. HTTP protokol - úvod. Zpracoval : Petr Novotný novotny0@students.zcu.cz

HTTP protokol. Zpracoval : Petr Novotný

Webová aplikace Znalostní testy online UŽIVATELSKÁ PŘÍRUČKA

Individuální projekt z předmětu webových stránek Anketa Jan Livora

CERTIFIKOVANÉ TESTOVÁNÍ (CT) Výběrové šetření výsledků žáků 2014

Šifrování Autentizace Bezpečnostní slabiny. Bezpečnost. Lenka Kosková Třísková, NTI TUL. 22. března 2013

Informační systém pro e-learning manuál

language="javascript">... </script>.

Internetové služby isenzor

CMSSS manuál k použití

Kapitola 5 Dynamický obsah načítaný

Připravil: Ing. Jiří Lýsek, Ph.D. Verze: Webové aplikace

PROJEKT WEBOVÉ STRÁNKY Conor Anthony McGregor

DOKUMENTACE REDAKČNÍHO SYSTÉMU PINYA

Průvodce instalací modulu Offline VetShop verze 3.4

Kurz je rozdělen do čtyř bloků, které je možné absolvovat i samostatně. Podmínkou pro vstup do kurzu je znalost problematiky kurzů předešlých.

APS Administrator.ST

WWW a HTML. Základní pojmy. Ivo Peterka

Zobrazování bannerů podporují pouze nově vytvořené šablony motivů vzhledu.

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Vývoj Internetových Aplikací

Frilo Control Center správa projektů

Střední odborná škola a Střední odborné učiliště, Hořovice

Podpora šifrovaného spojení HTTPS

Platební systém XPAY [

Internet cvičení. ZS 2009/10, Cvičení 4., PHP. Tomáš Pop. DISTRIBUTED SYSTEMS RESEARCH GROUP

Uživatelský manuál.

Inovace výuky prostřednictvím šablon pro SŠ

EPLAN Electric P8 2.7 s databázemi na SQL serveru

Příručka pro editaci kontaktů na eagri

Systém elektronického rádce v životních situacích portálu

Gymnázium Vysoké Mýto nám. Vaňorného 163, Vysoké Mýto

Implementace LMS MOODLE. na Windows 2003 Server a IIS 6.0

rychlý vývoj webových aplikací nezávislých na platformě Jiří Kosek

WEBOVÉ STRÁNKY

Základy HTML, URL, HTTP, druhy skriptování, formuláře

Maturitní otázky z předmětu PROGRAMOVÁNÍ

Postup obnovy a nastavení nového připojovacího certifikátu pro úložiště SÚKL

Modul Ankety verze 1.11 pro redakční systém Marwel 2.8 a 2.7

Uživatelská příručka pro ředitele škol

Instalace a první spuštění Programu Job Abacus Pro

FAKULTA INFORMAČNÍCH TECHNOLOGIÍ SPOLEČNOST DECADIC PROJEKT FRAMETRIX

Internet 1 vývoj, html, css

TACHOTel manuál 2015 AURIS CZ

Transkript:

Středoškolská odborná činnost 2007/2008 Obor 18 Informatika Naprogramování webové ankety pomocí jazyka PHP a databáze MySQL Autor: Jan Tvrdík Ročník: kvinta Škola: Cyrilometodějské gymnázium, Komenského 17, Prostějov 796 01 Místo zpracování: Prostějov Konzultant práce: Mgr. Ivana Matyášková Vedoucí práce: Mgr. Ivana Matyášková

Prohlašuji tímto, že jsem soutěžní práci vypracoval samostatně pod vedením Mgr. Ivany Matyáškové a uvedl v seznamu literatury veškerou použitou literaturu a další informační zdroje včetně internetu. V Prostějově dne 29. 3. 2008 vlastnoruční podpis autora 2

Anotace Cílem práce bylo naprogramovat modul webové ankety, který by neomezoval pokročilé tvůrce webu a umožnil jim rychle a snadno dosáhnout požadovaného cíle. Zatímco začátečník si vystačí s nějakou free anketou 1, pokročilý tvůrce webu chce více. Nechce být ničím omezován a chce mít maximální možnou kontrolou nad tím, co se děje. Modul, který jsem naprogramoval, se snaží těmto cílům co nejvíce přiblížit. Za pokročilého tvůrce webu lze považovat toho, kdo absolvoval tutoriál na linuxsoftu 2 nebo má ekvivalentní znalosti (nebo samozřejmě vyšší). Neměla by mu činit problém práce s MySQL a s následným zpracováním výsledků na straně PHP. Znalost HTML považuji za samozřejmost. Aplikaci může použít i méně pokročilý tvůrce webu, ale nedokáže z ní vytěžit to, co pokročilý, a v některých případech by pro něj bylo lepší využít výše zmiňovaných služeb třetích stran. 1 Např. český služba http://blueboard.cz/sluzby-anketa 2 Nejlepší český PHP tutoriál http://www.linuxsoft.cz/php/ 3

Obsah Anotace... 3 Obsah... 4 1 Úvod... 5 2 Metodika... 6 3 Vysvětlení základních pojmů... 7 3.1 Stručné vysvětlení komunikace na internetu... 7 3.1.1 Příklad http požadavku... 7 3.1.2 Příklad http odpovědi... 7 4 Instalace modulu... 8 5 Teoretická část... 9 5.1 Požadavky na můj anketní modul... 9 5.2 Rozvržení architektury... 9 5.2.1 Struktura dat v databázi... 10 5.2.2 Rozdělení úkolů skriptům... 14 5.2.3 Struktura administračního rozhraní... 14 6 Praktická část... 15 6.1 Hlavní konfigurační soubor (config.php)... 15 6.2 Výpis ankety (anketa.php)... 18 6.3 Hlasovací skript (hlasuj.php)... 21 7 Ukázky použití... 24 7.1 Tvorba ankety... 24 7.2 Tvorba vlastní šablony... 24 7.3 Vložení vytvořené ankety do stránky... 25 8 Závěr... 26 9 Použité zdroje... 27 4

1 Úvod Ve svých 12-ti letech jsem se poprvé začal zabývat tvorbou webových stránek. Toto odvětví mě natolik zaujalo, že jsem se jím začal zabývat hlouběji a hlouběji. V současné době obstojně zvládám (X)HTML, CSS, PHP a základy JavaScriptu. Vím, co je to validita, sémantika, přístupnost, typografie, SEO i SEM. Internet je věc, která k 21. století neodmyslitelně patří. Téměř každý mladý člověk ve vyspělých státech světa má k němu přístup. Již dávno to není jen výsada hrstky nadšenců. Nyní může ovlivnit obsah internetu úplně každý. Této možnosti využívá stále více a více lidí a mít vlastní stránky či alespoň blog už je v současné době běžná záležitost. Pokud máte vlastní stránky, obvykle chcete dát čtenářům možnost na obsah reagovat. Jedním z nejjednodušších a nejpoužívanějších řešení je bezpochyby anketa. Existuje několik způsobů, jak dostat anketu na stránky. První, nejjednodušší způsob (určený hlavně začínajícím tvůrcům webu) je využít některé ze zdarma nabízených služeb na internetu. Jak už to tak ale bývá, co je zadarmo, má své omezení. Upravit vzhled ankety, aby ladil s ostatním obsahem vašeho webu, může být poměrně tvrdý oříšek. Druhý způsob, který nám umožní dokonalé přizpůsobení ankety našim představám, je naprogramovat si anketu sám. To je ale poměrně pracné a časově náročné a hlavně ne každý to zvládne. Já se proto pokusím představit řešení, které je kompromisem obou výše uvedených možností. Modul, který jsem naprogramoval je navržen tak, aby ho dokázal použít každý mírně pokročilý programátor webových stránek, a vzhled takto vytvořené ankety lze pomocí šablon takřka libovolně modifikovat. 5

2 Metodika Anketa je prvek dynamický, a proto dynamické musí být i technologie pro její tvorbu použité. Jako nejvhodnější se mi jeví jazyk PHP. Pro ukládání dat jsem zvolil databázi MySQL, která se s PHP výborně rozumí. Použití (X)HTML 3, CSS 4 a případně JavaScriptu 5 považuji za nezbytnou samozřejmost. Celá aplikace byla naprogramována ve výborném, zdarma dostupném editoru PSPad 6 4.5.2. Testovací server byl složen z Apache 7 2.2.4, PHP 8 5.2.3 a MySQL 9 5.0.45. Testována byla v internetovém prohlížeči Firefox 2.0 s rozšířením Web Developer 10 a Firebug 11, Opera 9.23, Internet Explorer 6, Internet Explorer 7 a Konqueror 12. 3 Zkratka anglického extensible hypertext markup language rozšiřitelný hypertextový značkovací jazyk 4 Zkratka pro anglický název Cascading Style Sheets, česky tabulky kaskádových stylů 5 Multiplatformní, objektově orientovaný skriptovací jazyk používaný při tvorbě webových stránek 6 Zdarma ke stažení z http://www.pspad.com/cz/ 7 Zdarma ke stažení z http://apache.org/ 8 Zdarma ke stažení z http://php.net/ 9 Zdarma ke stažení z http://mysql.com/ 10 Zdarma ke stažení z http://chrispederick.com/work/web-developer/ 11 Zdarma ke stažení z http://getfirebug.com/ 12 Internetový prohlížeč pro Linux zdarma ke stažení z http://konqueror.org/ 6

3 Vysvětlení základních pojmů PHP je skriptovací programovací jazyk používaný především pro tvorbu webových aplikací. Je vyhodnocován na straně serveru (např. Apache) a uživateli je posílán až výsledek. PHP je nezávislé na použitém operačním systému. MySQL je pravděpodobně nejpoužívanější databázový systém na webu. Syntaxe vychází z obecného SQL jazyka. Stejně jako PHP je nezávislá na použitém operačním systému. Apache je webový server. 3.1 Stručné vysvětlení komunikace na internetu Komunikace mezi uživatelem (internetovým prohlížečem) a vzdáleným serverem probíhá pomocí protokolu http 13. Prohlížeč pošle požadavek webovému serveru. Ten jej zpracuje (např. pokud se jedná o PHP skript, tak jej předá interpretu PHP) a společně s odpovědní hlavičkou pošle výsledek zpět prohlížeči. Prohlížeč si odpověď přečte a zobrazí výsledek uživateli. 3.1.1 Příklad http požadavku GET / HTTP/1.1 Host: example.com User-Agent: Opera/9.02 (Windows NT 5.0; U; en) Accept: application/xhtml+xml,text/html;q=0.9,image/png Accept-Charset: windows-1250,utf-8;q=0.7,*;q=0.7 3.1.2 Příklad http odpovědi HTTP/1.x 200 OK Date: Sat, 29 Mar 2008 18:38:39 GMT Server: Apache/2.2.3 (CentOS) Content-Length: 438 Connection: close Content-Type: text/html; charset=utf-8 13 Hypertext Transfer Protocol 7

4 Instalace modulu Instalace modulu probíhá pomocí skriptu instalace.php. Pokud modul není nainstalován, tak skript index.php automaticky na instalaci přesměruje. Celý proces trvá velmi krátce a spočívá v zadání několika nezbytných informací: Položka Vysvětlení Obvyklé hodnoty pro domácí server Host Informace přidělená poskytovatelem hostingu Localhost Přihlašovací jméno Jméno k připojení k databázi root Přihlašovací heslo Heslo k připojení k databázi Jméno databáze Jméno používané databáze 14 libovolné Tabulka anketa Tabulka odpovědí Tabulka hlasů Tabulka šablon Heslo do administrace Heslo znovu Jméno tabulky obsahující obecné informace o anketách Jméno tabulky obsahující možné odpovědi na anketní otázku Jméno tabulky obsahující záznamy všech hlasování Jméno tabulky obsahující informace o šablonách Heslo používané k přihlášení do administrace anket Stejné jako předchozí, slouží pro kontrolu správnosti ankety odpovedi hlasy sablony Libovolné Stejné jako předchozí 14 Skript předpokládá již existující databázi 8

5 Teoretická část 5.1 Požadavky na můj anketní modul První a velmi podstatnou věcí, kterou je dobré znát, než se pustím do vlastního programování, je vědět, co chceme naprogramovat. V mém případě půjde o modul webové ankety. V praxi to znamená, že musí být snadno přizpůsobitelný. Proto bude vlastní anketa vykreslováno pomocí šablony, kterou si bude moci uživatel vytvořit a následně upravit. O samotný chod ankety se bude starat jen minimum skriptů. Většina z nich se bude starat o uživatelské rozhraní, které by mělo dokázat: Vytvořit novou anketu Upravit existující anketu Smazat existující anketu Vytvořit novou šablonu Upravit existující šablonu Smazat existující šablonu Celé uživatelské rozhraní musí být samozřejmě chráněné heslem, aby nějaký nudící se uživatel nezačal ankety mazat. Jednou z dalších věcí, které nesmíme opomenout, je ochrana proti opakovanému hlasování (viz 6.3). 5.2 Rozvržení architektury Většina dat bude ukládána v databázích (jen šablony budou ukládány do adresáře, protože půjde o PHP skripty). Konkrétně nám půjde o anketní otázku možné odpovědi na danou otázku nastavení ankety doba blokace a použitá šablona hlasy kdy jaká IP adresa hlasovala v jaké anketě jméno, popis a adresář (ve kterém je šablona uložena) šablony 9

5.2.1 Struktura dat v databázi 5.2.1.1 Tabulka ankety Tabulka ankety obsahuje základní informace o každé anketě. Ke každé anketě náleží právě jeden řádek. idankety jednoznačný identifikátor každé ankety hojně používaný ve většině skriptů otazka otázka pokládaná v anketě ochrana počet sekund, po které nebude možné znovu hlasovat v dané anketě z jedné IP adresy sablona identifikátor šablony (v tabulce sablony), kterou daná anketa používá datum obsahuje časové razítko s datem poslední modifikace ankety Sloupec Typ Nulový Výchozí Extra Indexy idankety smallint(3) ne auto_increment primární klíč otazka varchar(255) ne ochrana bigint(20 ne sablona smallint(3) ano 1 datum int(12) ne 10

5.2.1.2 Tabulka odpovedi Tabulky odpovedi obsahuje seznam všech možných odpovědí na všechny ankety. Ke každé anketě náleží alespoň dva řádky. id jednoznačný identifikátor dané odpovědi anketa určuje, ke které anketě daná odpověď patří odpoved jedna z možností, jak odpovědět v dané anketě hlasu počet lidí, kteří zvolili danou odpověď Sloupec Typ Nulový Výchozí Extra Indexy id smallint(6) ne auto_increment primární klíč anketa smallint(3) ne odpoved varchar(255) ne hlasu mediumint(9) ano 0 11

5.2.1.3 Tabulka hlasy Tabulka hlasy obsahuje jeden řádek pro každé hlasování, takže na jednu anketu připadá neomezený počet řádků. idhlasu jednoznačný identifikátor každého hlasu idankety jednoznačně přiřazuje každý hlas k jedné anketě ip IP adresa, ze které hlasování proběhlo cas obsahuje přesný čas hlasování ve formě časového razítka Sloupec Typ Nulový Výchozí Extra Indexy idhlasu int(10) ne auto_increment primární klíč idankety smallint(3) ne ip varchar(30) ne unikátní klíč cas int(12) ne 12

5.2.1.4 Tabulka sablony Tabulka sablony obsahuje základní informace o šablonách. Obsahuje jméno, popis a jméno adresáře, ve kterém je šablona uložena. idsablony obsahuje jednoznačný identifikátor dané šablony jmeno obsahuje slovní pojmenování šablony adresar obsahuje jméno adresáře, ve kterém je šablona uložena; povoleny jsou pouze písmena anglické abecedy a čísla Sloupec Typ Nulový Výchozí Extra Indexy idsablony smallint(2) ne auto_increment primární klíč jmeno varchar(50) ne adresar varchar(50) ne unikátní klíč popis varchar(255) ano nic 13

5.2.2 Rozdělení úkolů skriptům Nyní se stručně podíváme na funkce některých důležitých skriptů. config.php skript načítaný všemi ostatními skripty. Má na starost nastavení sessions, připojení k databázi a definici spousty základních funkcí (více o souboru config.php viz 6.1) index.php stará se o přihlašování anketa.php po přijetí parametru idankety vekreslí požadovanou anketu (více viz 6.2) hlasuj.php má na starost provedení vlastního hlasování (více viz 6.3) nova-anketa.php, upravit-anketu.php, smazat-anketu.php skripty starající se o vkládání, úpravu a smazání ankety nova-sablona.php, upravit-sablonu.php, smazat-sablonu.php skripty starající se o vkládání, úpravu a smazání šablony instalace.php jediný skript, který nenačítá config.php. Je naprosto nezávislý na ostatních skriptech a staré se o prvotní instalaci anketního modulu (vytvoří tabulky a config.php). 5.2.3 Struktura administračního rozhraní Při vstupu do administračního rozhraní jste uvítání velmi jednoduchým přihlašovacím dialogem, který naznačuje jednoduchost celého rozhraní. Přihlášení je odesláno skriptu prihlas.php (u výkonných skriptů PHP používám imperativ 15 ). Pokud zadáte heslo správně, jste přesměrování na seznam anket. Pokud ho zadáte špatně, jste přesměrování na info.php a následně zpět na index.php. Aby se zabránilo opakovanému posílání dat (při obnovení stránky) je celá aplikace napsána metodou: Zobrazení rozhraní => výkonný skript PHP => přesměrování na info.php nebo na stránku, kam si uživatel přeje směřovat. 15 rozkazovací způsob 14

6 Praktická část Nyní se detailněji podíváme na některé důležité skripty. 6.1 Hlavní konfigurační soubor (config.php) První a také nejpoužívanější skript, na který se detailněji podíváme, je config.php. Jeho úkolem je spustit podporu sessions (řádek 2), připojit se k databázi (řádek 7 25) a definovat pár funkcí (řádek 27 90). Nastavení sessions je velmi jednoduché, takže ho není třeba dále vysvětlovat. Připojení k databázi už je věc podstatně složitější. Nejprve jsou všechny přihlašovací hodnoty uloženy do proměnných. Pokud je chceme změnit, není nic jednoduššího, než skript otevřít a hodnoty proměnných upravit. Za standardních podmínek by vše mělo proběhnout bez problému, ale je potřeba počítat i s možností náhlého výpadku databáze. V takovém případě je celý běh skriptu ukončen a vypsána informační hláška (Nemá smysl pokračovat, protože všechny skripty ke svému běhu databázi potřebují.). Pokud připojení k databázi proběhne bez problému, jsou nadefinována jména tabulek, která jsou využívány všemi skripty při práci s databází. Pokud by se pro názvy tabulek nepoužívaly proměnné (byly by nastaveny ve skriptech natvrdo), byla by pak jejich pozdější změna velmi náročná. Proto je vhodné používat pro názvy tabulek proměnné už od začátku. 001 <?php 002 session_start(); 003 004 //Nastavení hesla pro přihlášení do administrace 005 define("heslo","6e017b5464f820a6c1bb5e9f6d711a667a80d8ea"); 006 007 //Definice přihlašovacích proměných 008 $SQL_HOST = "localhost"; 009 $SQL_USERNAME = "root"; 010 $SQL_PASSWORD = ""; 011 $SQL_DBNAME = "anketa"; 012 013 //Připojení k databázi 014 @$spojeni = mysql_connect("$sql_host","$sql_username","$sql_password"); 015 if(!$spojeni) 016 die("nepodařilo se připojit k DB:<br />". mysql_error()); 017 if(!mysql_select_db("$sql_dbname",$spojeni)) 15

018 die("nepodařilo se zvolit DB:<br />". mysql_error()); 019 mysql_query("set NAMES utf8"); //kvůli problémům s kódováním 020 021 //Definice tabulek 022 define("ankety","ankety"); 023 define("odpovedi","odpovedi"); 024 define("hlasy","hlasy"); 025 define("sablony","sablony"); Další velmi podstatnou věcí, o kterou se config.php stará, je definice často používaných funkcí. Pokud bychom je chtěli změnit, stačí nám provést změnu na jednom místě a tím se vše opět usnadní. Jednou z velmi často používaných funkcí (vyplývá z rozvržení architektury) je přesměrování. Podle specifikace, by se mělo přesměrovávat absolutním URL (funguje i relativní). V PHP naštěstí není problém si napsat funkci, která nám převede relativní URL na absolutní. 027 //Definice funkcí 028 function VratAbsolitniUrl($url) 029 { 030 //kontrola, jestli už url není absolutní 031 if(ereg("^(http://)", $url)) 032 return $url; 033 034 //případné doplnění chybějícího úvodního lomítka 035 if(!ereg("^/", $url)) 036 $url = "/$url"; 037 038 $cesta = substr($_server["script_name"], 0, strrpos($_server["script_n AME"],"/")). $url; 039 return "http://". $_SERVER["SERVER_NAME"]. $cesta; 040 } 041 042 function presmeruj($cil) 043 { 044 header("location: ". VratAbsolitniUrl($cil)); 045 exit(); 046 } 047 Velmi často je také potřeba informovat uživatele o průběhu akce. K tomuto účelu slouží následující dvě funkce a skript info.php. Můžete si také všimnout, že funkce se 16

využívají vzájemně i v tomto skriptu. Funkce ZobrazInfo používá funkci VratAbsolitniUrl a funkci presmeruj. 048 //Zobrazí text na aktuální stránce 049 function ZobrazZpravu($text, $color = false) 050 { 051 if($color) $style = " style=\"color: $color;\""; 052 else $style = NULL; 053 054 echo " <div class=\"zprava\"$style>\n"; 055 echo " $text\n"; 056 echo " </div>\n"; 057 } 058 059 //Zobrazí text za pomocí info.php 060 function ZobrazInfo($zprava, $reload_url = false, $reload_time = false, $b arva = false) 061 { 062 if($zprava) $_SESSION["zprava"] = $zprava; 063 if($reload_url) $_SESSION["reload_url"] = VratAbsolitniUrl($reload_url ); 064 if($reload_time) $_SESSION["reload_time"] = $reload_time; 065 if($barva) $_SESSION["barva"] = $barva; 066 presmeruj("/info.php"); 067 } Z hlediska bezpečnosti hrají velmi důležitou roli následující funkce, které kontrolují přihlášení uživatele. 069 function JePrihlasen() 070 { 071 return isset($_session["prihlasen"]); 072 } 073 074 function VyzadovatPrihlaseni() 075 { 076 if(jeprihlasen()) return true; 077 078 ZobrazInfo("Tato stránka vyžaduje přihlášení","/index.php"); 079 } 17

Poslední funkcí obsaženou v tomto skriptu je funkce ZkontrolujDotaz, která je pravděpodobně nejpoužívanější funkce vůbec, neboť je volána po každém SQL dotazu. 081 function ZkontrolujDotaz($dotaz) 082 { 083 global $cislo_dotazu, $chyba; 084 $cislo_dotazu = isset($cislo_dotazu)? $cislo_dotazu + 1 : 1; 085 086 if($dotaz) return true; 087 088 $chyba = "Došlo k chybě SQL dotazu #$cislo_dotazu"; 089 return false; 090 } 091?> 6.2 Výpis ankety (anketa.php) Všimněte si, že config.php je načítán pomocí funkce require_once. Ta se postará hned o dvě věci. Zaprvé - pokud by se config.php z nějakých důvodu nepodařilo načíst, běh skriptu se zastaví. Zadruhé pokud by se z nějakých nepochopitelných důvodů vyskytl tento řádek v kódu vícekrát, je načten pouze jednou, čímž se předejte chybě (function is already defined ). Skript anketa.php slouží k vykreslení ankety. Aby byl anketu schopen vykreslit, musí být volán s parametrem idankety (např. anketa.php?idankety=1). 001 <?php 002 require_once("config.php"); 003 004 //kontrola dostupnosti ID ankety 005 if(isset($_get["idankety"])) 006 $idankety = $_GET["idankety"]; 007 Else 008 exit; 009 010 //funkce nahodny vrací náhodně sestavený řetězec o daném počtu znaků 011 //zde je používána pro sestavení hlasovacích kódů 012 function nahodny($delka = 12) 013 { 014 $znaky = "abcdefghijklmnopqrstuvwxz0123456789"; //seznam znaků, ze kterýc h bude sestaven výsledný řetězec 015 $retezec = ""; //počáteční inicializace 016 $max = strlen($znaky) - 1; 017 for($i = 0; $i < $delka; $i++) 018 $retezec.= $znaky[rand(0, $max)]; 019 return $retezec; 18

020 } První potřebnou věcí je načíst z databáze informace o dané anketě. Poté stačí zkontrolovat, zda načtení proběhlo úspěšně a zda požadovaná anketa vůbec existuje. 022 do 023 { 024 //načtení ankety z databáze 025 $dotaz = mysql_query(" 026 SELECT a.otazka, a.datum, o.id, o.odpoved, o.hlasu, s.adresar 027 FROM `".ANKETY."` AS a 028 JOIN `".ODPOVEDI."` AS o 029 ON a.idankety = o.anketa 030 JOIN `".SABLONY."` as s 031 ON a.sablona = s.idsablony 032 WHERE idankety = $idankety 033 ORDER BY o.id",$spojeni); 034 035 //kontrola správnosti průběhu dotazu 036 if(!zkontrolujdotaz($dotaz)) break; 037 038 //kontrola existence ankety 039 if(mysql_num_rows($dotaz) < 1) 040 { 041 ZobrazZpravu("Anketa s id = $idankety neexistuje."); 042 break; 043 } Další krok je poměrně náročný. Je potřeba zpracovat data z databáze tak, aby byla dále zpracovatelná. Všechny odpovědi uložíme do pole odpovědi. Každá odpověď přitom bude tvořena dalším polem obsahujícím identifikátor odpovědi, vlastní odpověď a počet hlasů pro danou odpověď. Později ještě doplníme, jak bude mít daná odpověď dlouhý graf a jakým kódem bude možné pro ni hlasovat (více o hlasovacím kódu viz 6.3) 045 //převedení dat načtených z databáze do proměných a polí 046 while($anketa = mysql_fetch_assoc($dotaz)) 047 { 048 if(!isset($otazka)) $otazka = $anketa["otazka"]; 049 if(!isset($datum)) $datum = $anketa["datum"]; 050 if(!isset($sablona)) $sablona = $anketa["adresar"]; 051 $odpovedi[] = array( 052 "id" => $anketa["id"], 053 "odpoved" => $anketa["odpoved"], 054 "pocet_hlasu" => $anketa["hlasu"] 19

055 ); 056 } 057 058 //zkusíme načíst individuální nastavení ankety (ze šablony) 059 if(file_exists("./sablony/$sablona/nastaveni.php")) //pokud nastavení exi stuje, 060 @include("./sablony/$sablona/nastaveni.php"); //tak ho načteme 061 if(!isset($sirka_ankety)) $sirka_ankety = 150; //neproběhlali inicializace, tak načteme výchozí hodnoty 062 if(!isset($minimalni_pocet_pixelu)) $minimalni_pocet_pixelu = 1; 063 064 //spočítáme celkový a nejvyšší počet hlasů 065 $celkem_hlasu = 0; 066 $nejvic_hlasu = 0; 067 068 foreach($odpovedi as $odpoved) 069 { 070 $celkem_hlasu += $odpoved["pocet_hlasu"]; 071 if($odpoved["pocet_hlasu"] > $nejvic_hlasu) $nejvic_hlasu = $odpoved[ "pocet_hlasu"]; 072 } 073 074 //ještě se nehlasovalo 075 if($celkem_hlasu < 1) 076 { 077 $_SESSION["kod"] = array(); 078 foreach($odpovedi as $klic => $odpoved) 079 { 080 $odpovedi[$klic]["procent"] = 0; 081 $odpovedi[$klic]["pixelu"] = $minimalni_pocet_pixelu; 082 083 //sestavíme kontrolní kód 084 $kontrolni_kod = nahodny(); 085 $_SESSION["kod"][$kontrolni_kod] = $odpoved["id"]; //uložíme ho do session 086 $odpovedi[$klic]["kod"] = $kontrolni_kod; //a přidáme jako parame tr odpovědi 087 } 088 } 089 //už se hlasovalo 090 else 091 { 092 //spočítáme parametry grafu 093 foreach($odpovedi as $klic => $odpoved) 094 { 095 $procent = round($odpoved["pocet_hlasu"] / $celkem_hlasu * 100,2) ; 20

096 $pixelu = round($odpoved["pocet_hlasu"] / $nejvic_hlasu * $sirka_ ankety); 097 //alternativní algoritmus na výpočet počtu pixelů 098 //$pixelu = round($odpoved["pocet_hlasu"] / $nejvic_hlasu * ($sir ka_ankety - $minimalni_pocet_pixelu)) + $minimalni_pocet_pixelu; 099 100 $odpovedi[$klic]["procent"] = $procent; 101 $odpovedi[$klic]["pixelu"] = $pixelu > $minimalni_pocet_pixelu? $pixelu : $minimalni_pocet_pixelu; 102 $kontrolni_kod = nahodny(); 103 $_SESSION["kod"][$kontrolni_kod] = $odpoved["id"]; 104 $odpovedi[$klic]["kod"] = $kontrolni_kod; 105 } 106 } 107 108 //načteme šablonu, která se postará o vykreslení 109 include("./sablony/$sablona/$sablona.php"); 110 } 111 while(false); 112 113 if(isset($chyba)) echo $chyba; 114?> 6.3 Hlasovací skript (hlasuj.php) Úkolem tohoto skriptu je přijmout hlasovací kód a identifikátor ankety. Pokud přijmutí proběhne v pořádku, pak se zkontroluje platnost hlasovacího kódu a jestli uživatel může hlasovat. Bezpečnost hlasování Aby výsledky hlasování měly nějakou vypovídací hodnotu, musí být zabráněno jejich manipulaci. Prvním základním bezpečnostním prvkem je zabránění opakovaného hlasování. To se v současné době řeší nejčastěji přes kontrolu IP adresy. Samotná ochrana proti opakovanému hlasování ale pro bezpečnost nestačí. Pokud se hlasování řešení pomocí metody GET, prvním nápadem může být hlasovací URL ve tvaru hlasuj.php?idankety=1&odpoved=2. Problémem tohoto řešení je, že hlasovací URL je statické. K manipulaci ankety pak stačí projít pár internetových fór s vysokou návštěvností a povoleným tagem img a vložit obrázek: <img src= http://example.com/hlasuj.php?idankety=1&odpoved=2 > Každý návštěvník, kterému se zobrazí váš příspěvek, bude nevědomě hlasovat v anketě. Tento problém jsem vyřešil přidělením nestatického (náhodně generovaného) kontrolního kódu (každé odpovědi jeden). Výsledné hlasovací URL je ve tvaru: hlasuj.php?kod=f600wopagmlz&anketa=1, kde hlasovací kód je pro každé načtení ankety jiný. 001 <?php 002 require_once("config.php"); 003 21

004 do 005 { 006 //situace, kdy při hlasování metodou post nevyberou žádnou možnost 007 if(isset($_post["anketa"]) &&!isset($_post["kod"])) 008 { 009 $id_ankety = $_POST["anketa"]; 010 break; 011 } 012 013 //kontrola příjmu proměných 014 if(!isset($_request["kod"],$_request["anketa"])) 015 { 016 exit("neplatný požadavek"); 017 } 018 $id_ankety = $_REQUEST["anketa"]; 019 $hlasovaci_kod = $_REQUEST["kod"]; 020 021 if(!isset($_session["kod"][$hlasovaci_kod])) 022 { 023 unset($_session["kod"]); 024 $chyba = "Neplatný hlasovací kód"; 025 break; 026 } 027 $id_odpovedi = $_SESSION["kod"][$hlasovaci_kod]; 028 029 //Zjistíme jak dlouhou dobu je nastavena blokace hlasování 030 $dotaz = mysql_query("select ochrana from `".ANKETY."` WHERE idankety = $id_ankety LIMIT 1",$spojeni); 031 if(!zkontrolujdotaz($dotaz)) break; 032 033 //kontrola existence ankety 034 if(mysql_num_rows($dotaz) < 1) 035 { 036 $chyba = "Anketa neexistuje"; 037 break; 038 } 039 $anketa = mysql_fetch_assoc($dotaz); 040 $blokovat_na = $anketa["ochrana"]; 041 $blokovat_do = time() + $anketa["ochrana"]; 042 043 //Zkontrolujeme, jestli může uživatel hlasovat 044 045 //1.test - kontrola cookies 046 if(isset($_cookie["anketa_$id_ankety"])) 047 { 048 if(($_cookie["anketa_$id_ankety"] + $blokovat_na) > time()) 049 { 22

050 $chyba = "Nemůžete hlasovat opakovaně."; 051 break; 052 } 053 } 054 055 //2. test - kontrola ip adresy 056 $ip_adresa = $_SERVER["REMOTE_ADDR"]; 057 058 $dotaz = mysql_query("select cas FROM `".HLASY."` WHERE idankety = $id_ ankety AND ip = '$ip_adresa' AND (cas + $blokovat_na) > ".time(), $spojeni) ; 059 if(!zkontrolujdotaz($dotaz)) break; 060 061 if(mysql_num_rows($dotaz) > 0) 062 { 063 $chyba = "Nemůžete hlasovat opakovaně."; 064 break; 065 } 066 067 //může hlasovat => vložíme hlas 068 $dotaz = mysql_query("update `".ODPOVEDI."` SET hlasu = (hlasu+1) WHERE id = $id_odpovedi AND anketa = $id_ankety LIMIT 1",$spojeni); 069 if(!zkontrolujdotaz($dotaz)) break; 070 071 if(mysql_affected_rows() < 1) 072 { 073 $chyba = "Hlasování se nepodařilo."; 074 break; 075 } 076 077 //nastavíme omezení před dalším hlasovaním 078 079 //1. Cookie 080 setcookie("anketa_$id_ankety",time(),$blokovat_do); 081 082 //2. vložení IP adresy do databáze 083 $dotaz = mysql_query("replace `".HLASY."` (idankety, ip, cas) values (' $id_ankety', '$ip_adresa', '".time()."')",$spojeni); 084 if(!zkontrolujdotaz($dotaz)) break; 085 } 086 while(false); 087 088 if(isset($chyba)) 089 $_SESSION["chyba"] = $chyba; 090 091 presmeruj("/anketa.php?idankety=$id_ankety"); 092?> 23

7 Ukázky použití 7.1 Tvorba ankety Tvorba ankety spočívá ve vyplnění jednoduchého formuláře. Jediná položka, která by se mohla jevit jako záhadná, je doba blokace. Ta určuje dobu v sekundách, po kterou nebude možná znovu hlasovat ze stejné IP adresy. 7.2 Tvorba vlastní šablony Jedna z nejpodstatnějších věcí, které modul umožňuje, je tvorba vlastní šablony. Nejprve vyplníme pár detailů, jako např. jméno šablony a složky, kde bude šablonu umístěna. Mnohem podstatnější ale je správné vyplnění textarey. Ta obsahuje vlastní PHP kód šablony. Automaticky je vložen kód výchozí šablony, který programátorovy naznačí, jak může asi vypadat. K dispozici je asociativní pole $odpovedi, $otazka, $sablona, $sirka_ankety a $_SESSION["chyba"]. Na základě vytvořené šablony může anketa nabýt zcela odlišného vzhledu. 24

7.3 Vložení vytvořené ankety do stránky V seznamu anket si otevřete náhled ankety. Zde klikněte na vygenerovat (X)HTML kód. Zkopírujte jej a vložte na požadované místo ve vašich stránkách. 25

8 Závěr Myslím si, že anketní modul, který se mi podařilo naprogramovat, postačuje účelu, pro který byl primárně určen, ale možnosti jeho rozšíření nejsou zdaleka vyčerpány. Jediným větším problémem zůstává použitelnost jen pro alespoň mírně pokročilé tvůrce webových stránek. Proto si myslím, že by bylo velmi zajímavé vytvořit jednoduchý generátor šablon s využitím GD knihovny 16, který by umožňoval použití celé aplikace i začínajícím tvůrcům webu. 16 PHP knihovna pro zpracovávání obrázků 26

9 Použité zdroje PHP: Hypertext Preprocessor URL: <http://php.net> [cit. 2007-12-26]. MySQL manuál URL: <http://mm.gene.cz/> [cit. 2007-12-26]. Jak ovlivnit libovolné hlasování na idnes.cz URL: http://myego.cz/item/jak-ovlivnit-libovolne-hlasovani-na-idnes-cz [cit. 07-12-26]. W3Schools Online Web Tutorials URL: <http://w3schools.com/> [cit. 2007-12-26]. IE Brouci Chyby / Bugy Internet Explorer URL: <http://w3schools.com/> [cit. 2007-12-26]. Wikipedia URL: <http://wikipedia.org/> [cit. 2008-03-29]. 27