Základy PHP Josef Podstata KTE/IZTT - Zpracování textu, tabulek a prezentací Univerzita Palackého v Olomouci
Tento výukový text slouží k seznámení se základy vývoje dynamických webových stránek za použití jazyka PHP. Pro pochopení látky je doporučeno znát alespoň základy jazyku HTML. Text byl zpracován v Microsoft Word for Mac (0) za účelem semestrálního projektu do předmětu KTE/IZTT vyučovaného na Univerzitě Palackého v Olomouci. Obsah. Úvod.... Struktura.... Proměnné, datové typy.... Pole.... Řetězce... 0. Konstanty, komentáře.... Operátory, speciální znaky.... Podmínky, logické výrazy.... Cykly... 0. Funkce... Zdroje jakpsatweb.cz tvorba-webu.cz cs.wikipedia.org en.wikipedia.org PHP a MySQL - Michael Kofler, Bernd Öggl
. Úvod PHP (zkratka Hypertext Preprocessor) je skriptovací, objektově orientovaný programovací jazyk se syntaxí podobnou například jazykům C nebo Java. Byl vyvinut v roce k tomu, aby se statické HTML stránky obohatily o dynamičnost. Při jeho použití pro dynamické stránky jsou skripty prováděny na straně serveru. Je multiplatformní, takže skripty lze většinou přenášet bez jakýchkoli úprav mezi všemi operačními systémy. PHP je nejrozšířenějším skriptovacím jazykem pro web. PHP má tu zvláštnost, že jeho zdrojový kód se vkládá přímo do HTML dokumentu. Přitom je PHP kód zřetelně oddělený od HTML kódu. Protože k instalaci a nastavení vlastního serveru na osobním počítači by byl potřeba velice obsáhlý návod, tyhle kroky přeskočíme a budeme předpokládat, že všechny naše PHP dokumenty vkládáme přímo na nějaký už fungující server. Tak se budeme moci soustředit pouze na PHP.
. Struktura Tady je malý příklad, ve kterém ukážeme umístění kódu PHP a jeho strukturu. Dokument v PHP by mohl vypadat například takto: 0 <html> <head> <title>hello World v PHP</title> </head> <body> echo "<p>hello World!</p>"; </body> </html> Když tuto stránku zavoláme pomocí prohlížeče, předá server celý soubor ke zpracování interpretu PHP. Ten vyhodnotí část začínající (. řádek) a končící (. řádek) a nahradí ji výstupem z interpretu. Zbylá část souboru se nezmění. Poté je výsledný soubor předán serveru a ten jej předá klientovi (prohlížeči). V našem případě by se celá PHP část vyhodnotila na <p>hello World!</p>, protože příkaz echo slouží pro vypisování. V prohlížeči bychom pak uviděli pouze napsané "Hello world". Identifikace PHP kódu: echo blah; Standartní značky <? echo blah; Krátký zápis <script language="php"> Dlouhý zápis echo blah; </script> <% echo blah; %> Verze ASP První a třetí zápis fungují vždy, zatímco krátký zápis a tvary ASP pouze pokud máte správně nastaven program PHP. Proto dále budeme používat jen první způsob zápisu.
. Proměnné, datové typy Pod pojmem proměnná si můžeme představit vyhrazené místo v paměti, které se chová jako úložiště nějaké informace. V PHP začíná název proměnné vždy znakem dolaru ($), v názvu se mohou vyskytovat pouze znaky ASCII, číslice a znak podtržítka. Zároveň za znakem $ nesmí následovat číslice. V PHP se při deklarování proměnné nemusí uvést její typ (jako ve spoustě programovacích jazyků). PHP podle obsahu proměnné většinou sám pozná, o jaký typ se jedná. PHP rozlišuje osm základních datových typů: boolean (bool) může nabývat dvou hodnot - TRUE nebo FALSE integer (int) kladné i záporné celočíselné hodnoty, obvykle v rozsahu dvou miliard float kladné i záporné hodnoty s plovoucí desetinnou čárkou string textový řetězec, může obsahovat znaků array pole uchovává několik prvků, prvky můžou být proměnné i další pole object může obsahovat různé prvky PHP, např. proměnné, konstanty či funkce resource zdroj je speciální typ, který odkazuje na vnější zdroj NULL zvláštní datový typ, který nemá žádnou hodnotu Název proměnné v PHP musí začínat znakem $, hodnotu do proměnné přiřadíme znaménkem = (rovná se). Každý řádek (příkaz) musí končit středníkem. Vše si ukážeme na následujícím kódu: 0 $cislo_ = ; $cislo_ =.; $retezec = "Vysledek souctu: "; echo $retezec; echo $cislo_+$cislo_."\n"; $cislo_ = (int) $cislo_; echo "cislo_ je: ".$cislo_;
Na druhém řádku deklarujeme proměnnou $cislo_ a přiřadíme mu hodnotu (PHP samo rozpozná celé číslo - int). Na třetím řádku to samé s proměnnou $cislo_ a hodnotou. (číslo s řadovou čárkou - float). Na čtvrtém řádku vložíme do proměnné $retezec textový řetězec (string) "Vysledek souctu: ". Pátý řádek je vynechaný pouze pro přehlednost. Na šestém a sedmém vypisujeme pomocí echo. První co se vypíše je proměnná $retezec, která se vyhodnotí na text "Vysledek souctu: ", poté chceme vypsat výsledek součtu proměnných $cislo_ a $cislo_, tedy, ( +,). PHP si samo poradí s typem výsledku. I když jsme sčítali typy int a float, výsledek je typu float. Na odřádkování slouží "\n", tedy další výpis bude pokračovat na dalším řádku. Více hodnot v příkazu echo oddělujeme tečkou, resp. tečka slouží ke sloučení několika řetězců (i mimo echo). Někdy je potřeba typ proměnné změnit manuálně, tzv. přetypovat. Nový typ proměnné se napíše do kulatých závorek jako na devátém řádku. Tím, že budeme chtít přetypovat číslo, na celočíselný typ int, se číslo nezaokrouhlí, pouze ztratí číslo svou desetinnou část. V proměnné $cislo_ bude tedy hodnota a díky příkazu echo na jedenáctém řádku ji vypíšeme. V předešlém sčítání ale vidíme, že si PHP s přetypováním poradilo samo, proto se manuální převod datových typů nemusí provádět tak často. Všechny výpočty a práce s proměnnými provede interpret PHP interně, ve výpisu uvidíme pouze: Vysledek souctu:. cislo_ je:
. Pole Pole se používají velmi často snad ve všech programovacích jazycích. V PHP mají výhodu velké flexibility. Pole se skládá z klíčů a k nim přiřazených hodnot (key a value), přičemž klíče jsou typu integer nebo string a hodnoty mohou být libovolného typu. Příklad práce s polem: 0 $pole = array("prvni", "druhy"); $pole[] = "treti"; $pole[] = "ctvrty" echo "0: ".$pole[0]."\n: ".$pole[]; print_r($pole); var_dump($pole); Na druhém řádku inicializujeme pole o dvou prvcích typu string. Prvky pole se indexují od nuly, tedy první prvek je vlastně nultý atd. Momentálně máme na nultém indexu řetězec "prvni" a na prvním indexu řetězec "druhy". Na čtvrtém řádku přidáváme prvek do pole pomocí indexu, který je momentálně přázdný. Na pátém řádku děláme to samé pomocí prázdného indexu, ten zajistí, že se řetězec "ctvrty" přidá na konec pole jako nový prvek. Na sedmém řádku chceme vypsat pouze prvky na indexech 0 a, tedy řetězce "prvni" a "treti". Na devátém řádku voláme funkci, která vypíše obsah pole, v našem případě takhle: ( ) [0] => prvni [] => druhy [] => treti [] => ctvrty Pro podrobnější vypsání slouží funkce var_dump($pole) na jedenáctém řádku, která zobrazí i název pole, počet prvků v poli a ke každému prvku jeho datový typ. V našem případě takto: pole() { [0] => string() "prvni" [] => string() "druhy" [] => string() "treti" [] => string() "ctvrty"
Chceme-li využít místo indexování klíče, můžeme libovolnému klíči přiřadit hodnotu pomocí znaku =>. Prvek pole může bez problému být další pole. Ukážeme si to na tomto kódu: 0 $pole = array( "jmeno" => "Jan", "prijmeni" => "Novak", "vek" => "adresa" => array( "ulice" => "Dlouha 0" "mesto" => "Olomouc" "psc" => 00 ) ); echo $pole["jmeno"]." ".$pole["prijmeni"]; echo "psc: ".$pole["adresa"]["psc"]; Na klíč "jmeno" přiřadíme řetězec "Jan" a tak dále, až se dostaneme ke klíči "adresa", na který navážeme pole o třech prvcích. Všimněte si, že prvky "vek" a "psc" jsou celočíselné a všechny ostatní jsou řetězce. Ve většině programovacích jazyků dokážou pole uchovávat hodnoty pouze jednoho typu, v PHP ne. Nakonec se vypíše: Jan Novak psc: 00
. Řetězce Řetězce (string) jsme zatím vytvářeli jen pomocí dvojitých uvozovek ("řetězec"). Druhý způsob je pomocí jednoduchých ('řetezec'). Rozdíl je v tom, že u dvojitých uvozovek dochází k interpretaci speciálních znaků. Tabulka speciálních znaků: \n posun na nový řádek (znak ASCII 0) \r carriage return (znak ASCII ) \t tabulátor (znak ASCII ) \$ znak dolaru \" dvojité uvozovky \\ zpětné lomítko Se znakem \n už jsme se setkali. Je zřejmé, že pokud budeme mít v řetězci (uzavřeném ve dvojitých závorkách) znak dolaru, bude se chtít automaticky vyhodnotit na proměnnou, dvojité uvozovky pak budou značit konec řetězce. Pokud tyto znaky budeme chtít mít ale přímo jako část řetězce, zpětným lomítkem zajistíme, aby se zobrazily správně. Stejný trik platí na samotné zpětné lomítko. V následujícím kódu ukážeme rozdíl dvojitých a jednoduchých uvozovek: $cislo = ; A vypíše se: echo "\$cislo je: $cislo \n"; echo '\$cislo je: $cislo \n'; $cislo je: \$cislo je: $cislo \n Čtvrtý řádek kódu využívá vyhodnocení proměnné $cislo, kdybychom chtěli stejný postup použít na prvky v poli, byla by to chyba. Pro práci s prky pole musíme vždy slučovat řetězce tečkou, např. echo "číslo je: ".$pole[];. 0
. Konstanty, komentáře Konstanty obsahují hodnoty, které se během činnosti programu nemění. Na rozdíl od proměnných se v jejich názvu nepoužívá znak dolaru a kvůli lepší přehlednosti se zapisují velkými písmeny. Patří mezi ně například konstanta PHP_VERSION, která obsahuje verzi PHP. Vlastní konstantu vytvoříme pomocí funkce define: define("my_os", "Mac OS X Lion, 0.."); echo "Muj operacni system je: ".MY_OS."\n"; // nebo // echo "Muj operacni system je Ubuntu\n"; Komentáře (například na pátém a šestém řádku) jsou části kódu, které interpret PHP ignoruje a nevyhodnocuje. Slouží jen pro přehlednost, aby se programátor vyznal ve svém kódu například i po několika letech. Vypíše se: Muj operacni system je: Mac OS X Lion, 0.. Komentáře lze v PHP vkládat třemi způsoby: // komentář jednořádkový komentář známý z jazyků C, C++ atd. /* komentáře... */ komentář na více řádků, začíná /* a končí */ # komentář jednořádkový komentář známý ze shell skriptů
. Operátory, speciální znaky Operátory se používají při změně nebo porovnání dat. S některými už jsme se setkali, například sčítání (+), dále máme samozřejmě odčítání (-), násobení (*) a dělení (/). Méně častěji používané je modulo (%), tedy zbytek po celočíselném dělení. Rovná se (=) slouží k přiřazení hodnoty. Pro porovnávání máme operátory větší (>), menší (<), rovnost (==), nerovnost (!=), větší nebo rovno (>=) a menší nebo rovno (<=). Důležité je si neplést operátor přiřazení a porovnání na rovnost (= a ==). Existuje také ternární operátor, ten ale vysvětlíme až později. Operátory lze různě kombinovat. Například budeme chtít přičíst trojku k celočíselné proměnné &a. Můžeme to udělat dvěma způsoby: $a = ; $a = $a + ; $a += ; echo $a; $a++; // to samé jako $a = $a + ; Třetí a čtvrtý řádek jsou ekvivalentní. Takže k $a přičteme dvakrát dvojku, tedy + +. Vypíše se. Na sedmém řádku jsme použili zkrácený zápis přičtení jedničky. Tento zápis se používá skoro v každém programovacím jazyku, funguje jak ++, tak -- pro snížení o jedna. S několika speciálními znaky už jsme se setkali. Následující tabulka vypisuje ty nejdůležitější a nejpoužívanější: $ označení proměnné [ ] označení indexu prvku pole { označuje skupinu, používají se u řídících struktur (if, while,...) a funkcí & předává proměnnou, funkci nebo třídu jako odkaz => způsob zápisu prvku pole a jeho hodnoty
. Podmínky, logické výrazy Podmíněný příkaz slouží k rozdělení části programu na dvě větve, kde jedna se má provést jen tehdy, když je splněná nějaká podmínka, a druhá větev se provede, když podmínka splněna není. Výsledek podmínky je datového typu boolean, tedy TRUE nebo FALSE. Operátory pro porovnávání jsou vypsány v předchozí kapitole. Syntaxe je stejná jak u jiných programovacích jazyků: 0 $a = ; $b = ; if ($a > $b) { echo "Cislo a je vetsi nez b"; else { echo "Cislo b je vetsi nez a"; Za klíčové slovo if (pátý řádek) píšeme do kulatých závorek podmínku. V našem případě se ptáme, jestli je $a větší než $b, tedy jestli je větší než. Protože je podmínka pravdivá, provedou se příkazy ve složených závorkách následujících za podmínkou, tedy jen šestý řádek, a vypíše se "Cislo a je vetsi nez b". Za else následuje záporná větev, tedy příkazy ve složených závorkách. Naše podmínka byla pravdivá, proto se záporná větev ignoruje. Další dotazování můžeme spustit příkazy elseif nebo else if (v PHP fungují oba tvary): 0 $cislo = ; if ($cislo == 0) { echo "Cislo je nula"; else if ($cislo > 0) { echo "Cislo je kladne"; else { echo "Cislo je zaporne"; Často nestačí vyhodnocovat pouze jednu podmínku. Je možné do sebe vnořovat více if příkazů, ale při více podmínkách se pak stává kód nepřehledný. Proto existuje možnost dát podmínky do logické soustavy
pomocí logických výrazů. Logický výraz "a zároveň" (&& nebo AND) je pravdivý pokud obě podmínky jsou pravdivé, "nebo" ( nebo OR) je pravdivý pokud alespoň jedna z podmínek je pravdivá. Negace (! nebo NOT) zneguje následující výraz. Příklad: 0 $a = ; $b = ; $c = ; echo "Trojuhelnik o stranach $a, $b a $c"; if (($a+$b > $c) && ($a+$c > $b) && ($b+$c > $a)) { echo " LZE sestavit\n"; else { echo " NELZE sestavit\n"; Kód zjišťuje jestli lze nebo nelze sestavit trojúhelník o stranách $a, $b a $c. Tedy jestli součet délky libovolných dvou stran je větší než délka strany třetí. Protože + je menší než, trojúhelník nelze sestavit a vypíše se: Trojuhelnik o stranach, a NELZE sestavit Kratší zápis podmínky můžeme udělat přes ternární operátor, tedy konstrukci (podmínka)? (kladná větev) : (záporná větev). Například echo ($a > $b)? "a je vetsi" : "b je vetsi";.
. Cykly Cykly slouží k opakování nějaké části kódu. Například budeme chtít vypsat všechny prvky pole, které má 0 prvků. Buď můžeme každý prvek vypisovat zvlášť, nebo jeden jediný příkaz budeme opakovat cyklem, jen pokaždé s navýšeným indexem. Mezi nejpoužívanější cykly patří cyklus while a for. Méně používaný je například cyklus do. Ekvivalentní použití while a for: 0 $c = 0; while ($c < 00) { echo $c.", "; $c++; for ($i = 0; $i < 00; $i++) { echo $i.", "; while (podmínka) { tělo; While opakuje příkazy v těle tak dlouho, dokud je splněná podmínka. Do proměnné $c vložíme hodnotu 0. Pak while vyhodnocuje podmínku (je 0 menší jak 00?), vyhodnotí ji na TRUE a provede příkazy ve složené závorce. Tedy vypíše $c, čárku s mezerou a $c navýší o, pak se znova ptá na podmínku a pořád se opakuje. Pokračuje tak dlouho, dokud je splněná podmínka. Jakmile se $c navýší na 00, podmínka se vyhodnotí na FALSE a cyklus skončí. Celý cyklus tedy vypíše čísla od do. for (inicializace; podmínka; inkrementace) { tělo; For funguje tak, že inicializace se provede pouze jednou, a to na začátku, podmínka je testována pokaždé před provedením příkazů v těle a inkrementace se vyhodnotí pokaždé, jakmile se vyhodnotí tělo. Tedy do proměnné $i jsme uložili nulu, podmínka testuje, jestli je 0 menší jak 00, tedy TRUE. Provede se tělo (vypíše se $i, čárka a mezera) a $i se navýší o. Poté se znova vyhodnocuje podmínka a tak dále. V našem případě jsme použili oba cykly pro stejnou věc - vypsání čísel od do. do { tělo; while (podmínka); Do funguje téměř stejně jako cyklus while. Rozdíl je v tom, že u do se tělo vyhodnotí vždy alespoň jednou a pak se teprve vyhodnocuje podmínka, u while se tělo nemusí vyhodnotit ani jednou pokud je podmínka už od začátku FALSE. Obecně se ale každý cyklus hodí pro řešení jiných problémů. U cyklů je důležité správně stanovit podmínku, jinak se cyklus může zacyklit a opakovat se do nekonečna. Příkaz break; slouží k předčasnému ukončení cyklu. Příkaz continue; přeruší vykonávání aktuálního průchodu tělem cyklu a začne nový průchod.
0. Funkce Pokud budeme chtít nějakou část kódu někam uložit a posléze jen volat z různých částí programu, slouží k tomu funkce. Funkce mají tu výhodu, že je lze opakovaně volat s jinými parametry. Například můžeme mít funkci na vypočítání objemu nebo obsahu trojúhelníku o stranách a, b a c. V PHP definujeme funkce příkazem function, funkci pak předáváme jednotlivé parametry v kulatých závorkách (oddělené čárkou), tělo funkce píšeme do složených závorek a návratovou hodnotu vrátíme příkazem return: 0 0 function obvod_trojuhelniku($a, $b, $c) { return ($a + $b + $c); function sestavitelnost_trojuhelniku($a, $b, $c) { if (($a+$b > $c) && ($a+$c > $b) && ($b+$c > $a)) { return TRUE; else { return FALSE; $x = ; $y = ; $z = ; echo "Trojuhelnik o stranach $y, $y a $z "; if (sestavitelnost_trojuhelniku($x, $y, $z) == TRUE) { echo "LZE sestavit.\njeho obvod by byl: "; echo obvod_trojuhelniku($x, $y, $z)."\n"; else { echo "NELZE sestavit.\n" První deklarujeme dvě funkce, jednu na výpočet obvodu trojúhelníku (sečtení všech tří předaných argumentů - stran) a druhou na zjištění zda lze sestrojit trojúhelník, známe-li všechny tři strany. (vrací TRUE pokud lze sestavit, FALSE pokud nelze). Vypíše se: Trojuhelnik o stranach, a LZE sestavit. Jeho obvod by byl: Příkaz return okamžitě ukončí činnost funkce, tedy kdyby za ním v těle byly libovolné příkazy, budou ignorovány. Funkce ale můžou být jak bez parametrů (argumentů), tak bez návratové hodnoty (nevrací nic, může ale například něco vypsat atd.).