You are on page 1of 104

UNIVERZITA SV.

CYRILA A METODA V TRNAVE


FAKULTA PRRODNCH VIED KATEDRA INFORMATIKY

Andrej Trnka

Zklady jazyka PHP

Trnava 2008 Vydala Univerzita sv. Cyrila a Metoda v Trnave

UNIVERZITA SV. CYRILA A METODA V TRNAVE


FAKULTA PRRODNCH VIED KATEDRA INFORMATIKY

Andrej Trnka

Zklady jazyka PHP

Trnava 2008 Vydala Univerzita sv. Cyrila a Metoda v Trnave

Ing. Andrej Trnka


Vydala Univerzita sv. Cyrila a Metoda v Trnave ako skript pre tudentov Katedry informatiky FPV UCM v Trnave, uren pre predmet Internet a programovanie. ISBN 978-80-89220-99-1

Zklady jazyka PHP

Vkladanie PHP do XHTML


Skripty v PHP s obyajn XHTML strnky doplnen o vkonn prkazy. Aby server od seba odlil obyajn XHTML strnky a strnky zapsan v PHP, ukladaj sa PHP skripty do sborov so zvltnou prponou. Tto prpona bva najastejie .phtml, .php3 alebo .php zle na konfigurcii servera. Pokia WWW server obdr poiadavku na sbor, ktor kon na niektor z uvedench prpon, pole poiadavku systmu PHP. Ten sa postar o vykonanie vetkch prkazov uloench v sbore a vsledok pole sp serveru. Server vsledn strnku odole ako odpove klientovi. <? PHPInfo(); ?> Sbor sa mus uloi do adresra, ktor je sasou stromu dokumentov WWW servera. Tento adresr je na kadom systme in. Skript sa mus v prehliadai vdy vyvola pomocou jeho URL adresy, ktor me vyzera napr. http://www.domena.sk/skripty/prvy.php alebo napr. http://localhost/prvy.php. Skript sa nesmie v prehliadai otvra ako sbor priamo z disku. Pokia sa v prehliadai zad ako URL dokumentu iba cesta k sboru napr. d:\www\php\prvy.php, nezobraz sa vsledok skriptu. Skript mus by pred zaslanm interpretovan systmom PHP. Interpret je vyvolan iba v prpade, kedy sa k dokumentu (skriptu) pristupuje cez WWW server, t.j. pomocou URL, ktor zana na http. Skript obsahoval funkciu PHPInfo, ktor vygeneruje informcie o celom systme. Je to trochu netypick funkcia, pretoe vygeneruje cel webov strnku. Dvojica znakov <? a ?>, vo vntri ktorch je prkaz uzavret, sli na oddelenie prkazov PHP od XHTML kdu. PHP interpretuje iba prkazy uveden medzi tmito znakami.

-1-

Zklady jazyka PHP

Kombincia PHP s XHTML kdom


Strnka spota, koko je 2+3. ... <head> <title>Stanie</title> </head> <body> <h1>Stanie 2+3</h1> <? $a=2; $b=3; $c=$a+$b; echo "$a+$b=$c"; ?> </body> </html> V skripte s pouit tri premenn $a, $b a $c. Do premennch sa mu priraova rzne hodnoty a vzjomne sa kombinova pomocou matematickch operci. Prkaz echo sli na vpis textu za nm uvedenho. Vsledn zobrazenie obsahuje nadpis a pod nm vpoet 2+3=5. Zdrojov text strnky, ktor dorazila do prehliadaa, je ist XHTML. Vetky prkazy PHP s na serveri vykonan a vsledkom je ist XHTML, ktor sa zobraz v prehliadai. V PHP nie je problm doplni strnku o zobrazenie aktulneho asu. ... <head> <title>as</title> </head> <body> <div align="center"> <h1>Vitajte na serveri</h1> Prihlsen od <? echo date("H:i"); ?> </div> </body> </html> Vetko obstar funkcia date(), ktorej parametrom je poadovan formt zobrazenia asu. H:i spsob vypsanie hodn a mint oddelench dvojbodkou. Pri vytvran strnky, kde sa nejak seky XHTML opakuj, sa mu na uahenie prce poui cykly.

-2-

Zklady jazyka PHP

... <head> <title>Strnka pln nadpisov</title> </head> <body> <h1>Strnka pln nadpisov</h1> <? for ($i=1; $i<=7; $i++): ?> <p><font size="<? echo $i ?>">Ukkov text</font></p> <? endfor ?> </body> </html> ... <head> <title>Strnka pln nadpisov</title> </head> <body> <h1>Strnka pln nadpisov</h1> <? for ($i=1; $i<=6; $i++) { echo "<h$i>Nadpis$i</h$i>\n"; } ?> </body> </html> Prv skript doraz po svojom vykonan do prehliadaa ako omnoho dlhia strnka v XHTML: ... <head> <title>Strnka pln nadpisov</title> </head> <body> <h1>Strnka pln nadpisov</h1> <p><font size="1">Ukkov text</font></p> <p><font size="2">Ukkov text</font></p> ... <p><font size="7">Ukkov text</font></p> </body> </html>

-3-

Zklady jazyka PHP

Jednoduch prca s formulrmi


Pomocou formulrov mu pouvatelia na strnkach zadva objednvky, kls dotazy na rzne databzy apod. K formulru mus existova skript, ktor pouvateom zadan daje spracuje a na ich zklade poskytne pouvateovi adekvtnu odozvu. Pouvate do formulra zad svoje meno a svoj vek. Skript potom vyhodnot jeho vek. ... <form action="obsluha.php" method="post"> Meno: <input name="meno" /><br /> Vek: <input name="vek" /><br /> <input type="submit" value="Odoslanie formulra" /> </form> ... Obsah atribtu action uruje skript, ktor bude vyvolan pre obsluhu dt formulra. Skript obsluha.php sa vyvol potom, o pouvate vypln formulr a odole ho stlaenm tlatka Odoslanie formulra. ... <head> <title>Obsluha formulra</title> </head> <body> <h1>Vsledok formulra</h1> <? echo $meno ?> je <? if ($vek<10): echo "ete diea"; elseif ($vek<20): echo "$vek nsron"; elseif ($vek<40): echo "dospel"; elseif ($vek<60): echo "v najlepch rokoch"; elseif ($vek<100): echo "pravdepodobne prarodi"; else: echo "niekde medzi stovkou a smrou"; endif; ?>. </body> </html> V skripte je obsah pol prstupn pomocou premennch. Meno a vek pouvatea s dostupn v premennch $meno a $vek. Pomocou podmienok potom skript v zvislosti na zadanom veku vyberie sprvny text, ktor vype.

-4-

Zklady jazyka PHP

Syntax jazyka PHP


Ako v kadom programovacom jazyku aj v PHP je kad program (skript) zloen zo sekvencie prkazov. Ich syntax sa dos podob jazyku C. Kad prkaz sa me uvies samostatne medzi znaky <? a ?>. <? $premenna=20 ?> <? echo $premenna ?> Druhou monosou je uvies viac prkazov naraz. V tomto prpade vak musia by oddelen pomocou bodkoiarky: <? $premenna=20; echo $premenna; ?> Medzi prkazy sa me vklada ubovon poet medzier, tabeltorov a koncov riadkov. Toto sa s vhodou vyuva na prehadnejie sformtovanie zdrojovho textu: <? $premenna=20; echo $premenna; ?> alou podstatnou vlastnosou kadho jazyka je, ako reaguje na mal a vek psmen. V PHP sa mu poui pre zpis prkazov a funkci ubovon psmen mal, vek alebo ich kombincia. Je teda jedno, i sa zape echo, Echo alebo ECHO. Na vekosti psmen zle iba v nzvoch premennch. $Premenna, $premenna, $PREMENNA a $preMENNA s tyri rzne premenn. V nzvoch premennch sa mu okrem ubovonch psmen pouva i podiarnik a slice. Prv znak nzvu premennej vak mus by iba psmeno alebo podiarnik. Prpustnmi nzvami premennch s teda $_ahoj, $Prva_Premenna, $citac0. Neprpustn je vak naprklad premenn $1x, pretoe zana slicou. U dlhch skriptov, ktor pouvaj nie plne zrejm programtorsk obraty, je vhodn niektor miesta okomentova pomocou komentrov. Komentr nijako neovplyvuje program, je iba pomckou pre tch, ktor bud program ta. V PHP sa pouvaj dva druhy komentrov. Pre kratie poznmky je vhodn poui komentr //. Vetko od tejto dvojice znakov a do konca riadku, je v skripte ignorovan.

-5-

Zklady jazyka PHP

<? $premenna=20; //Priradenie do premennej echo $premenna; //Vypsanie obsahu premennej ?> Druh druh komentra njde uplatnenie hlavne pre dlhie poznmky. Vetko medzi dvojicami znakov /* a */ sa povauje za komentr. Tento druh komentra me zabera aj viac riadkov. <? /*Nasledujci skript je dielom XYZ. Tu pokrauje komentr*/ $premenna=20; echo $premenna; ?>

-6-

Zklady jazyka PHP

Ladenie skriptov a oetrovanie chb


Syntaktick chyby
PHP je interpretovan jazyk. Asi najvou vhodou je vek rchlos vvoja aplikci. Sta napsa skript a pozrie si jeho vsledok v prehliadai. Na rozdiel od jazykov, ktor sa musia preklada do strojovho kdu, je to nesmierna spora asu nemus sa spa kompiltor a linker. Na druh stranu kompiltor odhal vetky syntaktick chyby, ako s skomolen nzvy premennch a funkci, zabudnut bodkoiarky medzi prkazmi i reazce neuzatvoren do vodzoviek. PHP podobn chyby odhal a pri samotnom vykonvan skriptu. Ke PHP na nejak syntaktick chybu naraz, vype chybov hlsenie a preru beh skriptu. 1 2 3 4 5 <? $x = 10; $y = 20 echo $x+$y; ?>

Vpis chyby: Parse error: parse error in skript.php on line 4. Z hlsenia je jasn, e ide o syntaktick chybu (Parse error), v akom je skripte a na akom riadku. Na prv pohad je chyba jasn za prkazom $y = 20 chba bodkoiarka, ktor by prkaz ukonila. Chyba je sce na riadku 3, aj ke PHP hlsi chybu na riadku 4. Vysvetlenie je jednoduch. Na treom riadku nie je ni zle. Na alom riadku toti me pokraova vraz, ktor prirauje hodnotu do premennej $y. Na tvrtom riadku PHP vak zist, e vraz nepokrauje ani nie je ukonen bodkoiarkou, ale z nioho ni sa objavil prkaz echo, ktor tu nem o robi. PHP preto ohlsi chybu. Ke PHP ohlsi, e je na nejakom riadku chyba, chyba me by kudne na niektorom z predchdzajcich riadkov. Logick chyby Odhalenie syntaktickch chb je vinou jednoduch. Interpret PHP sa na prvej syntaktickej chybe v skripte zastav a vype hlsenie, ktor pome vemi rchlo lokalizova prinu

-7-

Zklady jazyka PHP

chyby. Omnoho horie s logick chyby. Tie PHP ako zist, pretoe neme vedie, o chce programtor naprogramova. V PHP sa chyby najastejie zaprinia pouitm neinicializovanch premennch a zmenou opertora priradenia = a porovnania ==. V PHP sa nemusia premenn pred ich pouitm deklarova. ahko sa vak stane, e premenn pred jej pouitm nie je zinicializovan. Pomocou konfiguranej direktvy error_reporting=15 v php.ini sbore sa me aktivova vypisovanie varovnch hlsen. Zrove sa vypisuj aj varovania medzi ktor patr aj nezinicializovanie premennch. Pri vvoji aplikcie sa odpora tto vobu pouva a po odladen aplikcie ju vypn. Ak skript nerob to, o by mal a nie je vidie iadna chyba, me sa na rznych miestach skriptu poui funkcia echo a vypisova si obsahy premennch, ktor s dleit pre riadenie chodu skriptu. Tak sa d zisti, e niektor premenn v dan chvu obsahuje in hodnotu ako by mala a z toho sa d usdi miesto chyby. Oetrenie chb Pri volan funkci v PHP me djs k chybe naprklad neexistuje sbor, ktor je treba otvori, ned sa spoji s databzovm serverom, z ktorho sa taj daje apod. V tomto prpade PHP do vygenerovanej strnky vype chybov hlsenie. Profesionlne napsan aplikcie by mali pouvatea od tchto hlsen odtieni. Preto je mon v PHP vypn generovanie chybovch hlsen. Aby nebolo nejakou funkciou generovan chybov hlsenie, zape sa pred jej volanie zavin @. i dolo k chybe, mus oetri programtor. Vinou sa vyuije to, e nespene vykonan funkcia vracia hodnotu false. $fp=@fopen("subor.txt","r"); if (!$fp): echo "Nepodarilo sa otvori dtov sbor. Kontaktujte sprvcu aplikcie!!!\n"; exit; endif; Ak jeden prkaz vol viac funkci, me sa potlai vypisovanie chybovch sprv uvedenm znaku @ na zaiatok prkazu: @$line=fget($fp1,512).fget($fp2,512).fget($fp3,512)

-8-

Zklady jazyka PHP

Premenn, polia, vrazy, vetvenie, cykly


Premenn
Premenn slia na uchovvanie hodnt, ktor sa pouvaj v skriptoch. Premenn zanaj znakom $, po ktorom nasleduje meno premennej. V PHP nie je treba premenn deklarova vopred. Premenn je deklarovan okamihom, kedy sa prvkrt pouije. Pokia sa do premennej ni neulo priraovacm prkazom, m premenn obsah przdneho reazca. Pred pouitm premennej by sa mala do nej uloi nejak hodnotu. Obsah premennej sa d nastavi parametrom zadanm za URL. Napr. URL koniace na ?x=10 prirad premennej $x hodnotu 10. Skript potom nemus pracova sprvne, pokia programtor predpoklad, e v $x je przdny reazec. V okamihu priradenia do premennej sa automaticky ur jej typ. V PHP je k dispozcii 5 typov: integer double string array object cel slo desatinn slo znakov reazec pole objekt

Automatick rozpoznanie typov: $a=5; // $a je cel slo $b=5.0; // $b je desatinn slo $c="5"; // $c je znakov reazec Jednotliv typy premennch sa poda potreby konvertuj na vhodn typ.

Typ integer
Cel sla maj rozsah od -2 147 483 648 do +2 147 483 647. Celoseln kontanty sa zapisuj ako sla v desiatkovej sstave prpadne doplnen o znamienko.

-9-

Zklady jazyka PHP

seln kontanty sa mu zapisova aj v estnstkovej sstave. Mus sa pred ne ale prida dvojica znakov 0x alebo 0X. Pri zpise esnstkovch slic sa mu pouva mal a vek psmen A-F. $p=0xff; // v $p bude hodnota 255 $q=0x12345678; // v $q bude hodnota 305419896 V esnstkovej sstave akceptuje PHP iba sla v rozsahu od 0x0 do 0x7fffffff. Ostatn esnstkov sla povauje za nulu. V PHP sa me poui aj osmikov sstava. Pokia sa na zaiatku selnej kontanty uvedie 0, povauje sa za slo v osmikovej sstave. Zpis 0333 je teda osmikov reprezentcia sla 219.

Typ double
Desatinn sla s v PHP reprezentovan ako typ double. Jeho rozsah je pribline od -1,7.10308 do 1,7.10308. Najmenie kladn slo, ktor doke typ double poja je 3,4.10-324. Pri pouit tohto typu sa mus pota s tm, e k dispozcii je 15 platnch slic. Pokia je treba pre vpoty via presnos, me sa vyui matematick kninicu BC, ktorej podpora je do PHP zahrnut. seln kontanty typu double sa zapisuj ako sla s volitenm znamienkom a s desatinnou bodkou. Pokia je treba slo zapsa v exponencilnom tvare, nasleduje psmeno e alebo E a za nm je cel slo vyjadrujce exponent (napr. 4.2e3 = 4,2.103 ).

Typ string
Reazce sa mu v PHP zapisova do vodzoviek alebo do apostrofov. Pokia je treba vodzovky poui vo vntri reazca, pouije sa prepis pomocou tzv. escape sekvencie \" . Pre zpis samotnho sptnho lomtka sa pouije \\. Pomocou sptnho lomtka sa mu do reazca vloi aj alie uiton znaky.

- 10 -

Zklady jazyka PHP

Sekvencia \\ \n \r \t \" \$ Vznam \ sptn lomtko nov riadok nvrat vozka Tabultor " vodzovky $ znak dolra

Okrem escape sekvenci uvedench v tabuke sa me znak zapsa priamo jeho ASCIIkdom. Escape sekvencia \nnn zastupuje znak, ktorho kd je v osmikovej sstave nnn. Podobne zpis \xNN zastupuje znak, ktorho kd v estnstkovej sstave je NN. Tak napr. reazec "A\301\x41" obsahuje tri psmen A. Escape sekvencie sa mu pouva iba v reazcoch uzatvorench v vodzovkch. Rovnako tak sa me na premenn odkazova iba v reazcoch uzatvorench v vodzovkch. Reazce uzatvoren v apostrofoch interpretuj cel svoj obsah iba ako obyajn text bez pecilneho vznamu. $var=20; echo "V premennej \$var je uloen hodnota $var <br />\n"; echo 'V premennej \$var je uloen hodnota $var'."\n"; Prv prkaz echo zobraz nasledujci text: V premennej $var je uloen hodnota 20 Vo vsledku druhho prkazu nebude zobrazen obsah premennej, pretoe reazce vo vntri apostrofov nie s kontrolovan na obsah premennch a escape sekvenci: V premennej \$var je uloen hodnota $var Pokia je reazec uloen do premennej, me sa s nm pracova dvoma zkladnmi spsobmi. Jednak je mon s reazcom pracova ako s celkom pouije sa obyajn premenn. Pokia treba pristupova k jednotlivm znakom reazca, nape sa pozcia poadovanho znaku v reazci do hranatch ztvoriek za meno reazcovej premennej. Znaky s pritom slovan od nuly. $text="Ukkov reazec"; echo $text; // Vype Ukkov reazec echo $text[2]; // Vype

- 11 -

Zklady jazyka PHP

Polia
Pole je pecilna dtov truktra, v ktorej jedna premenn me obsahova niekoko hodnt. Tieto hodnoty s prstupn pomocou indexu. Index prvku pole sa zapisuje do hranatch ztvoriek: $a[0] = "Jablk"; $a[1] = "Hruky"; $a[2] = "Slivky"; Pole $a obsahuje tri prvky. Jednotliv prvky poa mu by ubovonho typu. $a[0] = "Jablk"; $a[1] = 12; $a[2] = 3.1415926535; V PHP sa mu ako index poa pouva aj znakov reazce. Zska sa potom tzv. asociatvne pole: $adresy["Jaroslav"]=jaroslav@gmail.com; $adresy["Karol"]=karol@pobox.sk;

Inicializcia poa
Pole sa me inicializova tak, e sa prirad hodnota jeho jednotlivm prvkom. Existuj vak aj pohodlnejie spsoby. Pokia sa u poa pouije przdny index, hodnota sa automaticky ulo na miesto prvho vonho indexu. Indexy pritom zanaj od nuly. Nasledujci skript je teda ekvivalentn vyie uvedenmu skriptu. $a[]="Jablk"; $a[]="Hruky"; $a[]="Slivky"; Pole sa vak d inicializova ete spornejm a pohodlnejm zpisom. Vyuva sa na to pecilny prkaz Array: $a=array("Jablk", "Hruky", "Slivky"); Pokia je potrebn, aby bolo pole inicializovan od inho indexu, pouije sa modifikovan prkaz array: $dni=array(1=>"Po", "Ut", "St", "t", "Pi", "So", "Ne");

- 12 -

Zklady jazyka PHP

Teraz bude ma prv prvok poa (Po) index 1. Dopadne to teda rovnako, ako keby sa napsalo: $dni[1]="Po"; $dni[2]="Ut"; $dni[3]="St"; $dni[4]="t"; $dni[5]="Pi"; $dni[6]="So"; $dni[7]="Ne"; Pokia sa inicializuje pole pomocou Array, me sa index priradi zvl kadej hodnote. Opertor => sa me poui u ubovonho prvku poa. Najastejie sa vak pouije iba u prvho prvku alebo u vetkch prvkov. Pokia je treba vytvori asociatvne pole na prevod anglickch skratiek da v tdni na slovensk, pouije sa nasledujca inicializcia: $day2Den=array("Mon"=>"Po", "Tue"=>"Ut", "Wed"=>"St", "Thu"=>"t", "Fri"=>"Pi", "Sat"=>"So", "Sun"=>"Ne"); echo $day2Den["Fri"]; //Vype slovensk skratku pre piatok

Funkcie pre prcu s poom


Na zistenie potu prvkov poa sli funkcia count(pole). Pokia je pole vytvoren tandardnou cestou a je teda indexovan od nuly, me sa na spracovanie vetkch prvkov poa $x poui nasledujci kd: for ($i=0; $i<count($x); $i++): echo $x[$i]; endfor; Pokia sa pouva asociatvne pole alebo pole s indexom, ktor nezana od nuly, me sa na spracovanie celho poa poui funkcia reset(), current(), next() a key(). Pre kad pole toti v PHP existuje ukazovate, ktor ukazuje na niektor prvok poa. Pomocou reset(pole) sa presunie tento ukazovate na prv prvok poa. Funkcia current(pole) vrti hodnotu prvku poa, na ktor ukazuje ukazovate. Podobne funguje aj funkcia next(pole). Rozdiel je v tom, e sa najprv ukazovate presunie na al prvok poa a a potom sa vrti hodnota prvku poa. Funkcia key(pole) vrti index prvku poa, na ktor ukazuje ukazovate. Vypsanie celho obsahu poa sa d realizova napr. takto:

- 13 -

Zklady jazyka PHP

<? reset($x); while($i<count($x)): echo "Index: ".key($x). "\n"; echo "Hodnota: ".current($x). "<br />\n"; $i++; next($x); endwhile; ?> Vemi uitonou funkciou pri prci s poami je funkcia list(). Funkcia me ma ubovon poet parametrov a sli na natanie prvkov poa do premennch. Pokia m napr. pole $x tyri prvky, mu sa tieto prvky uloi do premennch $p1, $p2, $p3 a $p4 pomocou nasledujceho prkazu: list($p1, $p2, $p3, $p4)=$x; Pokia je treba zisti len prv a tvrt prvok, mu sa niektor parametre vynecha: list($p1,,,$p4) = $x;

Viacrozmern polia
V PHP sa mu pouva aj viacrozmern polia. Pre kad rozmer sta do hranatch ztvoriek prida al index. Napr. dvojrozmern polia sa asto pouvaj pre uchovanie rznych matc. Pre prstup k prvku v treom riadku a piatom st pci dvojrozmernho poa $mat sa me poui zpis $mat[3][5]. Dvojrozmern pole sa pritom chov ako jednorozmern pole, ktorho prvky s polia. Tieto polia mu ma dokonca rzny poet prvkov. Zpis $mat[3] teda vrti pole, ktor obsahuje vetky prvky tretieho riadku matice. Viacrozmern polia sa mu inicializova pomocou vnorench prkazov array. Na vytvorenie jednotkovej matice 3x3 sa pouije prkaz: $i=array(array(1,0,0),array(0,1,0),array(0,0,1);

Pretypovanie premennch
Vo vine prpadov nie je treba meni typ premennch o vetko sa postar PHP sam. Pokia sa naprklad staj sla, z ktorch je jedno double, vetky ostatn sa preved na typ

- 14 -

Zklady jazyka PHP

double a vsledok bude tie typu double. Pokia s vetky sla integer, bude tie vsledok integer. Zistenie typu premennej Na zistenie typu premennej sa me poui funkcia gettype(premenna). T vrti meno typu premennej. Pre zistenie konkrtneho typu, sa me poui funkcia is_integer(), is_double(), is_string(), is_array() a is_object(). Zmena typu premennej Na zmenu typu premennej sli funkcia settype(premenna, typ). Pokia je treba z selnej premennej $N vytvori premenn $N typu string, pouije sa volanie settype($N, "string"). Pretypovanie Funkcia settype() zmen typ premennej. Pokia je vak potrebn typ nejakej premennej zmeni iba jednorzovo pri jej pouit vo vraze, pouije sa pretypovanie. Pretypovanie sa rob tak, e pred premenn sa nape do guatch ztvoriek typ, na ktor ju treba previes. $i=10;// $i je typu integer $x=(double) $i;// $x je typu double Pri pretypovan sa mu poui (int) a (integer) pre cel sla (double), (real) a (float) pre desatinn; (string) pre textov reazce; (array) pre pole a (object) pre objekty. Vo vntri ztvoriek s typom sa me zapisova ubovon poet medzier, nasledujce zpisy s teda identick: $x=(double) $i; $x=( double ) $i;

Vrazy
Vraz je v podstate okovek, o m nejak hodnotu. Najjednoduchm vrazom je teda kontanta i premenn, ako '12' alebo '$x'. Vrazom je vak i volanie funkcie. Naprklad funkcia rand() vrti nhodn slo. Jej volanie je teda tie vrazom, pretoe funkcia vracia hodnotu nejak slo. V PHP nemus by hodnotou vrazu iba slo. Vraz me ma ubovon typ, ktor podporuje PHP.

- 15 -

Zklady jazyka PHP

Pri priraden $x=10 sa do premennej $x prirad hodnota 10. Vrazom je v tomto prpade slo 10. Vraz je vak aj $x jeho hodnota je po priraden tie 10. V avej asti priradenia me by iba premenn. Priradenie m teda zvyajne nasledujci veobecn tvar: premenna=vyraz; V PHP je cel priradenie chpan ako vraz. Jeho hodnota je zhodn s hodnotou vrazu v pravej asti priradenia. To sa d vyui v mnohch prpadoch. Pokia treba vynulova premenn $a a $b, me sa poui nasledujci kd: $a=0;$b=0; Pretoe je po prvom priraden v $a hodnotu nula, je mon aj zpis: $a=0; $b=$a; Pretoe vak zpis $a=0 je okrem priradenia aj vraz, me sa poui aj nasledujce: $b=($a=0); Pretoe s priradenia vyhodnocovan sprava doava, mu sa ztvorky vynecha a psa: $b=$a=0; Vraz sa zska aj tak, e uveden elementrne vrazy sa poskladaj dokopy pomocou rznych opertorov.

Matematick opertory
PHP ponka tandardn opertory na stanie ('+'), odtanie ('-'), nsobenie ('*') a delenie ('/'). Pritom opertory pre nsobenie a delenie maj viu prioritu ako stanie a odtanie. Pokia tieto priority nevyhovuj, mu sa zmeni ztvorkami: echo 2+3*5; // Vype 17 echo (2+3)*5; // Vype 25 alm z matematickch opertorov je '%'. Ten sli na urenie zvyku po delen: $zvysok=10%3; // Zvyok by mal by 1 echo "Zvyok po delen 10:3 = $zvysok"; Vemi astou operciou v mnohch skriptoch je pritanie nejakho vrazu k premennej. To meme vykona jednoducho prkazom $x=$x+vyraz. Tento zpis je vak trocha zdhav

- 16 -

Zklady jazyka PHP

a preto PHP ponka kratiu cestu: $x+=vraz. Obidva prkazy pritom maj rovnak efekt do premennej $x pripotaj vraz. Okrem opertorov '+=' s k dispozcii aj alie: '-=', '*=', '/=' a '%='. $x+=16; // $x=$x+16 $x-=$a+$b; // $x=$x($a+$b) $x/=2; // $x=$x/2; $x*=$y; // $x=$x*$y; $a%=$b; // $a=$a%$b; alm prkladom efektvnosti syntaxe jazyka s opertory inkrementcie ('++') a dekrementcie ('--'). Tieto opertory slia na zvenie, resp. znenie obsahu premennej o jedna. Zpis ++$x je ekvivalentn zpisu $x=$x+1. Obdobne --$i je to ist ako $i=$i1. Opertory inkrementcie a dekrementcie sa mu psa aj za premenn. Ich chovanie je vak trocha odlin vetko svis s tm, e i zpisy ++$i a $i++ s vrazy. Prv vraz pracuje tak, e zvi obsah premennej $i o jednotku a takto zskan hodnotu vrti ako svoj vsledok. Oproti tomu hodnotu vrazu $i++ je zhodn s hodnotou premennej $i. Po vrten tejto hodnoty sa premenn $i zvi o jedna. Vrazu ++$i sa hovor preinkrementcia, pretoe je pred vrtenm hodnoty vrazu vykonan inkrementcia premennej. Postinkrementcia je potom meno pre vraz typu $i++, kedy je najprv vrten hodnota a a potom je zven obsah premennej. Obdobne vetko funguje i pri dekrementcii. $i=10; // $i=10 $a=$i++; // $a=10, $i=11 $b=++$i; // $b=12, $i=12 $c=$a+$i--; // $c=22, $i=11

Opertory na manipulciu s bitmi sla


PHP pracuje s slami o vekosti 32 bitov. Prvm z opertorov je logick sin zapisovan pomocou opertora '&'. Jeho vsledkom je slo, v ktorom s jednotky na tch binrnych cifrch, kde boli jednotky v oboch operandoch. Na ostatnch miestach s nuly.

- 17 -

Zklady jazyka PHP

$x $y $x & $y = 00110011001100110101010101010101 = 01010101010101010011001100110011 = 00010001000100010001000100010001

alm opertorom je logick set '|'. Vo vsledku s jednotky na miestach, kde bola jednotka aspo v jednom z operandov. $x $y $x | $y = 00110011001100110101010101010101 = 01010101010101010011001100110011 = 01110111011101110111011101110111

alm binrnym opertorom je nonekvivalencie ''. Jeho vsledkom je prv slo, v ktorom s zmenen tie bity, ktor s v druhom operande jednotkov (xor). $x $y $x $y = 00110011001100110101010101010101 = 01010101010101010011001100110011 = 01100110011001100110011001100110

al opertor m iba jeden operand (unrny opertor). Jeden operand m logick negcia '~'. Vrti vsledok, v ktorom s prehoden vetky hodnoty bitov. $x ~$x = 00110011001100110101010101010101 = 11001100110011001010101010101010

Logick vrazy a opertory


asto je potrebn skontruova vraz, ktorho vsledok je pravda alebo nepravda. Takto vrazy sa pouvaj ako podmienka v cykloch i podmienench prkazoch. PHP na to pouva celoseln typ. Pokia je hodnota nejakho vrazu nenulov, povauje sa tento vraz za pravdiv (hodnota true). Pokia je hodnota vrazu nulov, povauje sa vraz za nepravdiv (hodnota false). Pokia sa ako logick vraz pouije reazec, povauje sa za nepravdiv, pokia je przdny alebo ide o reazec '0'. Ostatn reazce s povaovan za pravdiv vrazy. Pokia sa pouije nejak zloitej typ pole alebo objekt, bude chpan ako true v prpade, e nie je przdny.

- 18 -

Zklady jazyka PHP

Pre ahiu prcu s v PHP definovan dve kontanty true a false. True odpoved pravdivej hodnote a je reprezentovan ako cel slo 1. False odpoved nepravde a ide o przdny reazec. Typickmi opertormi, ktor sa pouvaj na zskanie logickho vsledku, s relan opertory. Relan opertory slia na porovnvanie hodnt dvoch vrazov. Ak treba zisti, i maj dva vrazy rovnak hodnotu, pouije sa opertor rovnosti '==': if ($a==$b) echo "Premenn 'a' a 'b' obsahuj zhodn hodnotu."; Na otestovanie nerovnosti dvoch vrazov, sa pouva jeden z opertorov != alebo <>. Opertory ostrej a neostrej nerovnosti: if ($a>$b) echo "Premenn if ($a>=$b) echo "Premenn if ($a<$b) echo "Premenn if ($a<=$b) echo "Premenn 'a' je via ako premenn 'b'."; 'a' je via alebo rovn premennej 'b'."; 'a' je menia ako premenn 'b'."; 'a' je menia alebo rovn premennej 'b'.";

Jednotliv logick vrazy je mon sklada dohromady pomocou logickch spojok (logickho sinu '&&' a logickho stu '||'). Logick sin pracuje ako spojka a zrove. Vsledkom logickho sinu je pravdiv hodnota, pokia s obidva spjan vrazy pravdiv. if ($a>=10 && $a<=20) echo "Premenn 'a' je niekde medzi 10 a 20."; Vsledkom logickho stu je pravdiv hodnota, pokia je aspo jeden z opertorov pravdiv: if ($a==10 || $a==20) echo "Premenn 'a' m hodnotu 10 alebo 20."; Ako synonymum k opertoru '&&' sa me poui AND. Podobne pre '||' existuje OR. Tieto opertory sa chovaj rovnako, maj vak niiu prioritu. Naviac je mon poui opertor XOR, ktor vracia pravdiv hodnotu, ke je prve jeden z operandov pravdiv vraz.

- 19 -

Zklady jazyka PHP

Na znegovanie logickho vrazu sli opertor '!'. if (!$spojenie) echo "Nepodarilo sa pripoji k databze";

Opertor na spjanie reazcov


Na spjanie reazcov sli pecilny opertor '.'. Funguje tak, e svoje operandy prevedie najprv na znakov reazce a potom ich spoj do jednho reazca. echo "Zvyok po delen 10:3 je ".(10%3); Okolo opertora sa mu napsa medzery a sprehadni tak program: echo "Zvyok po delen 10:3 je " . (10%3);

Ak je treba k nejakej premennej pripoji reazec, me sa poui nasledujci postup: $s = $s. "a nieo na koniec reazca"; Vhodnejie je poui opertor '.=': $s .= "a nieo na koniec reazca";

Podmienen opertor
Podmienen opertor je jedinm ternrnym opertorom (opertor s tromi operandami) v PHP. Jeho syntax je nasledujca: vraz1 ? vraz2 : vraz3 Ke je vraz1 pravdiv, je vsledkom vraz2. V opanom prpade je vsledkom vraz3. $min=$x<$y?$x:$y; // Do premennej $min sa ulo minimum z $x a $y $abs=$x<0?-$x:$x; hodnota $x // Do premennej $abs sa ulo absoltna

Priorita opertorov
V PHP m kad opertor definovan svoju prioritu, take je vdy jednoznan, ktor opercia sa vykon skr. Prehad priort jednotlivch opertorov je nasledovn:

- 20 -

Zklady jazyka PHP

OR XOR AND = += -= *= /= .= %= &= |= ^= >>= <<= ?: || && | ^ PRIORITA == != <> < <= >= > << >> + - . * / % ! ~ -- ++ pretypovanie @ [index poa] PRIORITA &

Index poa m najvyiu prioritu. Pri zapsan ++$a[0], PHP vie, e je treba zvi prv prvok poa $a, a nie zvi premenn $a a potom pozera do nejakho poa. Zmena priority sa rob pomocou ztvoriek. Ztvorky sa mu poui aj v prpadoch, ke je priorita opertorov neznma.
if ($a==10 || $a==20) echo "Premenn 'a' m hodnotu 10 alebo 20."; if (($a==10) || ($a==20)) echo "Premenn 'a' m hodnotu 10 alebo 20.";

- 21 -

Zklady jazyka PHP

Vetvenie
PHP ponka dva prkazy, ktor umouj vykonvanie asti skriptu podmienene na zklade splnenia uritej podmienky. Tieto prkazy s if a switch.

Prkaz if
Prkaz if sli na podmienen vykonanie prkazu, pokia je splnen urit podmienka. Podmienka sa mus zada ako vraz, ktor vracia logick hodnotu: if (vraz) prkaz; Prklad ulo do premennej $podiel podiel premennch $a a $b. Podiel sa vak ulo iba v prpade, e $b nie je nulov. Delenie nulou by inak vyvolalo chybu: if ($b!=0) $podiel=$a/$b; V PHP s logick hodnoty reprezentovan ako obyajn sla. Nula pritom odpoved hodnote false. To sa d vyui a podmienku zapsa skrtene: if($b) $podiel=$a/$b; Pokia je treba podmienene vykona viac prkazov, uzatvoria sa do zloench ztvoriek. if ($a<$b) { $p = $a; $a = $b; $b = $p; } Podmienene sa me pomocou PHP vklada aj XHTML kd: <? if ($pocetPristupov==0) { echo "<h1>Vitajte na naom serveri. Ste tu prvkrt. </h1>"; echo "Mete sa <a href=\"register.php\">zaregistrova</a>."; } ?>

- 22 -

Zklady jazyka PHP

Pokia je treba podmienene vloi dlh XHTML kd, je pouvanie prkazu echo akopdne. Vyuva sa to, e PHP sa s XHTML me prelna. <? if ($pocetPristupov==0) { ?> <h1>Vitajte na naom serveri. Ste tu prvkrt.</h1> Mete sa <a href="register.php">zaregistrova</a> <? } ?> Tento zpis vetvenia nie je vemi prehadn a v zloitejch kontrukcich sa ahko strat prehad o tom, k omu ktor ztvorka patr. V tchto prpadoch sa hod druh mon syntax prkazu if: if (vraz): prkaz1; prkaz2; ... endif; Predchdzajci prklad sa m prepsa do prehadnejej formy: <? if ($pocetPristupov==0): ?> <h1>Vitajte na naom serveri. Ste tu prvkrt.</h1> Mete sa <a href="register.php">zaregistrova</a> <? endif ?> Pri pouvan if.....endif sa nesmie zabudn na dvojbodku, ktor sa uvdza za podmienkou.

Prkaz if-else
astm prpadom je, e v zvislosti na nejakej podmienke je treba vykona dve rzne innosti. Jednu, pokia je podmienka splnen a druh v prpade nesplnenia podmienky. V tchto prpadoch njde uplatnenie prkaz if doplnen o as else. Prkaz uveden za else sa vykon v prpade nesplnenia podmienky.

- 23 -

Zklady jazyka PHP

if (vraz) prkaz1; else prkaz2; Pokia je vraz pravdiv, vykon sa prkaz1. V opanom prpade sa vykon prkaz2. Ke treba podmienene vykona viac prkazov, op sa musia zli pomocou zloench ztvoriek: if ($b!=0) { $podiel=$a/$b; echo "$a/$b=$podiel"; } else { echo "Nemem deli nulou."; echo "......"; } Alternatvny zpis: if (vraz): prkaz1-1; prkaz1-2; ... else: prkaz2-1; prkaz2-2; ... endif; Dvojbodka sa v tomto prpade mus uvies aj za kovm slovom else. Pri vnran viac prkazov if-else, sa else viae vdy k najbliiemu prkazu if: if (vraz1) if (vraz2) prkaz1; else prkaz2; je ekvivalentn so zpisom: if (vraz1): if (vraz2): prkaz1; else: prkaz2; endif; endif;

- 24 -

Zklady jazyka PHP

Prkaz if-elseif-else
Kov slovo elseif alej roziruje monosti prkazu if. Prkaz uveden za elseif sa vykon v prpade, e nie je splnen podmienka pre if a zrove je splnen podmienka za elseif. ast elseif me by aj niekoko za sebou. Nakoniec sa me poui aj as else, ktor sa vykon iba v prpade, e nie je splnen ani jedna z predchdzajcich podmienok. if (vraz1) prkaz1; elseif (vraz2) prkaz2; elseif (vraz3) prkaz3; ... else prkazN;

if ($a<$b) echo "a je menie ako b"; elseif ($a==$b) echo "a je rovn b"; else echo "a je vie ako b"; Ak sa v jednej vetve m vykona viac prkazov, op sa mu zdruova pomocou zloench ztvoriek alebo pomocou alternatvneho zpisu. if (vraz1): prkaz1-1; prkaz1-2; ... elseif (vraz2): prkaz2-1; prkaz2-2; ... elseif (vraz3): prkaz3-1; prkaz3-2; ... ... else: prkazN-1; prkazN-2; ... endif;

- 25 -

Zklady jazyka PHP

Prkaz switch
asto je treba na zklade hodnoty jednho vrazu vykona jednu z niekokch vetiev skriptu. Pre tieto prpady sa optimlne hod prkaz switch. Jeho syntax je nasledujca: switch (vraz) { case hodnota1: prkaz1-1; prkaz1-2; ... break; case hodnota2: prkaz2-1; prkaz2-2; ... break; ... default: prkazX-1; prkazX-2; ... } Najprv je vyhodnoten vraz. Potom sa postupne prechdza hodnotami uvedenmi za kovm slovom case, dokedy sa nenjde hodnota zhodn s hodnotou vrazu. Nsledne s vykonvan prkazy, dokia sa nenaraz na prkaz break alebo na koniec prkazu switch. Jednotliv varianty prkazu switch musia by ukonen prkazom break. Ke sa break nezad, vykonaj sa aj prkazy, ktor sa vykona nemali a ktor patria k inm vetvm podmienenho prkazu. Uveden vlastnos sa me aj vyui. Aby sa jedna vetva prkazov vykonala pre viacero rznych hodnt vrazu, me sa za sebou uvies niekoko ast case:

- 26 -

Zklady jazyka PHP

switch ($pismeno) { case "A": case "a": echo "Mal vek, aj tak je to 'A'."; break; case "B": case "b": echo "Mal vek, aj tak je to 'B'."; break; default: echo "In psmen nepoznm."; } Prkazy uveden za default sa vykonaj v prpade, e vrazu nevyhovie ani jedna z hodnt uvedench za slovom case. Pouitie default nie je povinn, ale dobr program by mal reagova na vetky mon situcie, a preto sa jeho pouitie odpora. K prkazu switch existuje aj alternatvna syntax: switch (vraz): case hodnota1: prkaz1-1; prkaz1-2; ... break; case hodnota2: prkaz2-1; prkaz2-2; ... break; ... default: prkazX-1; prkazX-2; ... endswitch;

- 27 -

Zklady jazyka PHP

Cykly
Cykly sa pouvaj pre opakovan vykonanie niektorej asti skriptu. K dispozcii s cykly while, do-while a for. Vetky prkazy maj syntax prevzat z jazyka C. K dispozcii je aj alternatvna syntax, ktor je vhodnejia na kombinovanie skriptov s XHTML. Prkaz while Prkaz while je najjednoduchm prkazom cyklu. Zadan prkaz vykonva, dokedy plat urit podmienka. asto sa mu hovor cyklus s podmienkou na zaiatku. while (vraz) prkaz; Vie mnostvo prkazov, ktor sa maj vykonva v cykle, sa me zdrui pomocou zloench ztvoriek: $i = 0; while ($i<100) { echo "$i^2=".($i*$i)."<br />\n"; $i++; } Alternatvna syntax: while (vraz): prkaz1; prkaz2; ... endwhile; Skript, ktor vypisuje tabuku druhch mocnn, me vyzera aj takto: $i=0; while ($i<100): echo "$i^2=".($i*$i)."<br />\n"; $i++; endwhile;

Cyklus do-while
Tento cyklus pracuje podobne ako cyklus while, podmienka je vak umiestnen a na konci cyklu. Rozdiel je v tom, e prkazy v tele cyklu do-while s vykonan aspo raz. Oproti

- 28 -

Zklady jazyka PHP

tomu telo cyklu while nemus by vykonan ani raz, pokia hne na zaiatku nie je splnen podmienka na vykonvanie cyklu. do prkaz; while (vraz); Cyklus while me by zapsan aj pomocou do-while: $i=0; do { echo "$i^2=".($i*$i)."<br />\n"; $i++; } while ($i<100); K prkazu do-while neexistuje jeho ekvivalent s alternatvnou syntaxou.

Cyklus for
Cyklus for je zo vetkch prkazov cyklu asi najvkonnej a tie najzloitej. Jeho syntax je: for (vraz1;vraz2;vraz3) prkaz; Vraz1 je vyhodnoten pred zaiatkom vykonvania cyklu. Potom je vyhodnoten vraz2. Ke je jeho hodnota true, vykon sa telo cyklu. Na konci kadho prechodu telom cyklu sa vyhodnot vraz3. Telo cyklu sa vykonva tak dlho, dokia m vraz2 hodnotu true. Najobvyklejie pouitie cyklu for je pri vykonvan cyklov, pri ktorch je dopredu znmy poet opakovan. Vraz1 inicializuje riadiacu premenn, vraz3 sa star o pravideln aktualizciu tejto premennej a vraz2 je podmienka na vykonvanie cyklu. Predchdzajci prklad m pouitm for syntax: for ($i=0;$i<100;$i++) echo "$i^2=".($i*$i)."<br />\n"; V tomto prpade sa na zaiatku cyklu do premennej $i ulo nula. Telo cyklu (prkaz echo) sa vykonva, dokedy je premenn $i menia ako 100. Na konci kadho prechodu cyklom je premenn $i zven o jednotku (pomocou $i++).

- 29 -

Zklady jazyka PHP

Ke sa m v tele cyklu vykonva viac prkazov, op sa uzavr do zloench ztvoriek: for ($i=0;$i<100;$i++) { echo "$i^2=".($i*$i)."\t"; echo "$i^3=".($i*$i*$i)."<br />\n"; } Alternatvna syntax prkazu for: for (vraz1; vraz2; vraz3): prkaz1; prkaz2; ... endfor; Zpis predchdzajceho prkladu pomocou alternatvnej syntaxe: for ($i=0;$i<100;$i++): echo "$i^2=".($i*$i)."\t"; echo "$i^3=".($i*$i*$i)."<br />\n"; endfor;

- 30 -

Zklady jazyka PHP

Prkazy na natanie skriptov, defincia vlastnch funkci


Prkazy na natanie skriptov
Pri rutinnej tvorbe strnok pomocou skriptov sa vemi asto vyskytuje potreba natania inch skriptov alebo ast strnok. Natan sbory mu obsahova preddefinovan funkcie, ktor sa pouvaj na viacerch strnkach alebo napr. tandardizovan hlaviky a pty strnok. Pre natanie skriptov s v PHP k dispozcii prkazy require a include.

Prkaz require
Prkaz require sli na natanie skriptu zo sboru. Natan skript sa vlo v mieste pouitia prkazu. Vykonaj sa vetky jeho prkazy a potom sa vo vykonvan pokrauje prkazom uvedenm za require. Syntax prkazu: require "meno_suboru"; Meno_suboru je ubovon vraz, ktor sa vyhodnot ako reazec. pecialitou prkazu require je, e sa vykon iba raz. Ak by bol volan v cykle, sbor sa nata iba pri prvom prechode cyklom. Na opakovan tanie sborov je treba vyui prkaz include. Parametrom prkazu je meno sboru. Meno sboru samozrejme me obsahova aj cestu. Najastejie sa require pouva na natanie uvateom definovanch funkci: require "mojefunkcie.php"; Mnoho tvorcov kninc (sborov s rznymi uitonmi funkciami) pre PHP pouva pre tieto kninice prponu .inc. Ke vak niekto zist URL kninice a t m prponu .inc, me si ju stiahnu a prezera si zdrojov kd skriptu. Ke je vak kninica uloen do sboru s prponou .php, bude vdy interpretovan systmom PHP a neoprvnenmu pouvateovi doraz plne przdna strnka. Ke sa pri mene sboru neuvedie cesta, PHP had v adresroch urench pomocou direktvy include_path v konfiguranom sbore php.ini. include_path tandardne neobsahuje ni a teda ani bodku oznaujcu aktulny adresr. Pri natan sborov z aktulneho adresra by sa mal tento explicitne uri: require "./mojefunkcie.php";

- 31 -

Zklady jazyka PHP

Prkaz include
Prkaz include sli na natanie skriptu zo sboru. Jeho pouitie je rovnak ako pri prkaze require. Rozdiel je v tom, e jeden prkaz include sa me vola niekokokrt napr. vo vntri cyklu:

for ($i=0;$i<10;$i++): include "./skript.php"; endfor; Defincia vlastnch funkci


Ke sa v skriptoch na rznych miestach vykonva rovnak sekvencia prkazov, je praktick a uiton tto sekvenciu nadefinova ako funkciu. V miestach, kde sa prkazy pouvali, potom sta uvies volanie tejto funkcie. Funkcie sa hodia i v mnohch alch prpadoch ke program zaha zloitejie manipulcie s dajmi, je vhodn ich oddeli do samostatnch funkci. Vsledn skript je prehadnej a ahie sa v om hadaj prpadn chyby. Defincia funkcie m nasledujci tvar: function meno (parameter1, parameter2, ...) { prkazy; return hodnota; } Pomocou parametrov funkci sa predvaj hodnoty, ktor m funkcia spracova. Prkazom return funkcia vrti svoj vsledok. U niektorch funkci sa mu parametre plne vynecha, rovnako ako vrtenie hodnoty. Funkcia Pozdrav vype text uveden za prkazom echo: function Pozdrav() { echo "Zdravm Vs."; } Za definciou funkcie v skripte sa me kdekovek vyvola pomocou Pozdrav(). Ztvorky za nzvom funkcie sa musia pouva aj ke funkcia nepracuje s iadnymi parametrami.

- 32 -

Zklady jazyka PHP

Pri pouit parametrov sa mu definova rzne uiton funkcie, ktor PHP tandardne neponka k dispozcii. Nasledujci program vype tabuku matematickej funkcie faktoril pre parametre od 1 do 100. Vpoet faktorilu sa realizuje ako funkcia: function Faktorial($n) { for($i=1; $n>0; $n--) $i*=$n; return $i; } for ($k=1; $k<=100; $k++) echo "$k!=".Faktorial($k)."<br />\n"; V defincii funkcie sa hovor, e funkcia Faktorial m jeden parameter. Jeho obsah je v tele funkcie prstupn pomocou premennej $n. Prkaz for v tele funkcie spota hodnotu faktorilu z $n a ulo ju do premennej $i. Tto hodnota sa potom pomocou prkazu return vrti ako vsledok funkcie. Ako parameter sa mu funkcii predva vetky typy dt, ktor PHP podporuje sla, reazce ale i polia a objekty. Rovnak typy dt me funkcia i vrti.

Rozsah platnosti premennch


V bench skriptoch je premenn s rovnakm nzvom stle t ist premenn a reprezentuje jednu hodnotu. Pri pouit funkci sa situcia men. Premenn, ktor sa pouij vo vntri funkcie nemaj s ostatnmi premennmi ni spolonho dokonca i ke sa rovnako volaj. function Zmena() { $a=10; } $a=20; Zmena(); echo $a; Tento skript vype slo 20. Hodnota 10 je do premennej $a priraovan vo vntri funkcie. Zmena premennej $a vo vntri funkcie nijako neovplyvn hodnotu premennej $a pouitej na najvyej rovni programu. Dvod pre toto chovanie PHP je celkom zrejm programtor neme omylom vo funkcii zmeni obsah nejakej globlnej premennej.

- 33 -

Zklady jazyka PHP

Ak je potrebn vo funkcii pracova s hodnotou globlnej premennej, me sa na zaiatku funkcie uri, ktor globlne premenn me funkcia pouva. Globlne premenn sa funkcii sprstupnia pomocou prkazu global, za ktor sa nape iarkami oddelen zoznam premennch: function Zmena() { global $a; $a=10; } $a=20; Zmena(); echo $a; Upraven prklad u vype slo 10. V tomto prpade je premenn $a vo vntri funkcie toton s globlnou premennou $a, a me teda meni jej hodnotu. Okrem pouitia prkazu global je ete jedna monos ako zadefinova globlne premenn. Me sa poui asociatvne pole $GLOBALS, v ktorom s prstupn vetky globlne premenn. Ako index poa sa pouije nzov premennej (bez znaku dolr): function Zmena() { $GLOBALS["a"]=10; } $a=20; Zmena(); echo $a; Vo vntri funkci sa mu definova aj alie funkcie. Neexistuje vak spsob, ako z tchto vnorench funkci pristupova k premennm funkcie, ktor je o rove vyie. Prstup sa d zaisti iba ku globlnym premennm.

tandardn hodnoty parametrov


V praxi sa vyskytuj funkcie, ktor sa vinou volaj s rovnakmi parametrami. Je potom zbyton, aby sa do volania funkcie stle opisovali rovnak parametre iba kvli tomu, e obas je treba funkciu zavola s inmi parametrami. V defincii funkcie sa me uri pre kad parameter tandardn hodnota, ktor sa pouije, ke sa pri volan funkcie tento parameter nepouije.

- 34 -

Zklady jazyka PHP

function Umocni($zaklad, $exponent=2) { $pom=$zaklad; for($i=1; $i<$exponent; $i++) $pom*=$zaklad; return $pom; } echo Umocni(10)."<br />\n"; // to ist ako Umocni(10,2) echo Umocni(10,3); Funkcia Umocni() sli na potanie mocnn. Pretoe najastejie sa potaj druh mocniny, je defincia funkcie napsan tak, aby volanie funkcie s jednm parametrom automaticky spsobilo vpoet druhej mocniny. Parametre, ktor maj tandardn hodnotu, musia by v zozname parametrov funkcie uveden vdy posledn. V opanom prpade by PHP nemohlo dosadi tandardn hodnoty parametrov. Ako tandardn hodnota parametra funkcie sa mu poui iba skalrne typy: integer, double a string. Nie je mon pouva polia a objekty.

Statick premenn
Prklad: je treba vytvori funkciu pracujcu ako ta. Pri kadom zavolan vrti hodnotu o jedna vyiu ako pri minulom volan. Potanie zane od jednotky. function Citac() { $n = 0; $n++; return $n; } Tto funkcia vak pri kadom svojom zavolan vrti 1, pretoe pri kadom volan funkcie je premenn $n, ktor sli ako ta, vynulovan. V tomto prpade sa vyuije monos definovania statickch premennch. Statickej premennej sa hodnota prirad pri defincii funkcie a pri alch volaniach funkcie u nie je znova inicializovan. Statick premenn sa deklaruj pomocou prkazu static. function Citac() { static $n=0; $n++; return $n; }

- 35 -

Zklady jazyka PHP

Funkn formulre
U kadho formulra by sa mali poui aspo dva atribty - action a method. Atribt action obsahuje URL-adresu skriptu, ktor bude obsluhova dta z formulra. Atribt method sli na urenie metdy, ktorou bud dta zaslan na server. Na vber s dve monosti: get a post (odporan). <form action="skript" method="metoda"> defincia jednotlivch prvkov formulra </form> Formulr nemus by obsluhovan len skriptom. Niektor prehliadae umouj obsah formulra odosla na zadan e-mailov adresu. V adrese skriptu sa mus poui schma mailto. <form action="mailto:e-mail" method="post"> defincia jednotlivch prvkov formulra </form> Lepie je vak formulre obsluhova skriptom - aj keby mal skript iba odosla dta z formulra na nejak e-mailov adresu. Skripty s toti nezvisl na prehliadai a pracuj vdy sprvne. Element <input /> sli na vytvorenie viny vstupnch prvkov ako s vstupn polia, polia pre zadanie hesla, zakrtvacie polia, prepnacie tlaidl, tlaidl pre odoslanie formulra a alie. Pomocou elementu <select> sa vytvraj zoznamy, z ktorch sa d vybera jedna alebo viac poloiek. Pre vstup dlhch textov, ktor zaber viac riadkov, sa me poui element <textarea>. Kad prvok formulra mus ma svoje meno uren pomocou atribtu NAME. Prostrednctvom tohto atribtu je potom obsah prvku prstupn v obslunom skripte.

- 36 -

Zklady jazyka PHP

Vstupn pole
<form action="01.php" method="get"> <table> <tr><td>Meno:</td> <td><input type="text" name="meno" size="30" /></td></tr> <tr><td>E-mail:</td> <td><input type="text" name="email" size="30" /></td></tr> <tr><td>Domovsk strnka:</td> <td><input type="text" name="web" size="30" value="http://" /></td></tr> <tr><th colspan="2"> <input type="submit" value="Odoslanie" /></th></tr> </table> </form> V obslunom skripte 01.php s jednotliv polia formulra prstupn v premennch $meno, $email a $web. Skript v PHP vype obsah jednotlivch premennch : ... <head> <title>Obsluha formulra</title> </head> <body> <h1>o prilo z formulra:</h1> <p>Meno: <?echo $meno?></p> <p>E-mail: <?echo $email?></p> <p>Web: <?echo $web?></p> </body> </html>

Odoslanie formulra
Kad formulr by mal obsahova aspo jedno tlaidlo s atribtom type="submit". Stlaenie tohto tlaidla spsob odoslanie dt z formulra na server, ktor dta pred prslunmu skriptu. V jednom formulri sa me poui aj viac tlaidiel pre odoslanie, musia vak ma rovnak meno (name) a rzny obsah atribtu value. Ktor tlaidlo bolo stlaen, sa potom v skripte spozn poda obsahu premennej s menom vzniknutm z atribtu name - premenn bude obsahova hodnotu atribtu.

- 37 -

Zklady jazyka PHP

<form action="02.php" method="get"> Shlaste so znenm licennej zmluvy: <input type="submit" name="suhlas" value="Ano" /> <input type="submit" name="suhlas" value="Nie" /> </form> Pri obsluhe tohto formulra sa v PHP skripte testuje hodnota premennej $suhlas. Na zklade jej obsahu sa urobia prslun akcie. <? if ($suhlas=="Ano"): ?> spene ste si zaregistrovali n program. Teraz si ho mete <a href="/inst/setup.exe">naintalova</a>. <? elseif ($suhlas=="Nie"): ?> Bez odshlasenia licennej zmluvy program nezskate. <? else: ?> Snate sa oklama n registran systm. Radej si program bene zaregistrujte. <? endif ?> Skript by mal vdy oetri vetky mon stavy. Prv dve vetvy skriptu testuj prpady, ktor nastan po odoslan formulra. Ke vak niekto vyvol skript rune (priamym zadanm URL), nemus premenn $suhlas obsahova ani jednu z oakvanch hodnt. Tento prpad je oetren v poslednej vetve podmienky.

Zakrtvacie polia
V praxi bvaj zobrazen ako tvorek, ktor je mon necha przdny alebo ho zakrtn. Ke je tvorek zakrtnut, pole sa jeho meno (obsah atribtu name) na server spolone s obsahom atribtu value. Vo formulri me by aj niekoko zakrtvacch pol s rovnakm menom, ktor k sebe logicky patria.

- 38 -

Zklady jazyka PHP

<form action="03.php" method="get"> <table> <caption>Vyberte si doplujcu konfigurciu potaa: </caption> <tr><td> <input type="checkbox" name="konfiguracia[]" value="cd-rom" /> Mechanika CD-ROM</td></tr> <tr><td> <input type="checkbox" name="konfiguracia[]" value="zip" /> Mechanika ZIP 100mb</td></tr> <tr><td> <input type="checkbox" name="konfiguracia[]" value="sound" /> Zvukov karta</td></tr> <tr><td> <input type="checkbox" name="konfiguracia[]" value="modem" /> Modem</td></tr> <tr><th> <input type="submit" value="Odoli" /></th></tr> </table> </form> Vypsanie, ako sa m pota rozri: ... <head> <title>Doplnkov konfigurcia</title> </head> <body> <? for ($i=0; $i<count($konfiguracia); $i++): $konf = $konfiguracia[$i]; if ($konf=="cd-rom"): echo "Namontuj cd-rom!<br />\n"; elseif ($konf=="zip"): echo "Namontuj mechaniku zip!<br />\n"; elseif ($konf=="sound"): echo "Namontuj zvukov kartu!<br />\n"; elseif ($konf=="modem"): echo "Namontuj modem!<br />\n"; endif; endfor; ?> </body> </html> V PHP sa pre prcu so zakrtvacmi polkami, kde jednmu menu odpoved viac hodnt, pouvaj polia. Namiesto mena vstupnho prvku name="konfiguracia" sa mus psa

- 39 -

Zklady jazyka PHP

name="konfiguracia[]". Pre takto pomenovan prvok formulra potom PHP samo vytvor pole. Poet prvkov poa sa zist pomocou funkcie count(pole). Jednotliv prvky poa s prstupn pomocou indexu, ktor sa mus zapsa do hranatch ztvoriek. Prvky poa s indexovan od nuly.

Prepnacie tlaidl
Prepnacie tlaidl odpovedajce jednotlivm variantom musia ma nastaven atribt name na rovnak hodnotu. Atribt value mus ma kad variant jedinen. Poadovan vekos pevnho disku: <blockquote> <input type="radio" name="hd" value="20" />20 GB<br /> <input type="radio" name="hd" value="40" />40 GB<br /> <input type="radio" name="hd" value="80" checked="checked" /> 80 GB<br /> <input type="radio" name="hd" value="120" />120 GB<br /> <input type="radio" name="hd" value="250" />250 GB </blockquote> Obslunmu skriptu doraz hodnota value vybranho prepnacieho tlaidla (20, 40, 80, 120 alebo 250 v premennej $hd).

Zoznamy
Na vytvorenie zoznamu sa pouva element <select>. Pri pouit atribtu multiple me uvate vybra aj viac poloiek ako jednu. Meno vstupnho prvku sa op uruje pomocou atribtu name. Dleitm atribtom je size, ktor uruje poet riadkov, na ktorch sa zoznam zobraz. Poloky, ktor sa do tohto priestoru nevojd, bud prstupn rolovanm v zozname. Jednotliv poloky zoznamu sa zapisuj pomocou elementu <option>. Ako hodnota poloky sa skriptu pred text uveden medzi zaiatonou a koncovou znakou elementu <option> . Text je vak mnohokrt dlh a nevhodn pre alie spracovanie skriptom. Ak sa u option pouije atribt value, bude sa prena jeho obsah namiesto obsahu celho elementu.

- 40 -

Zklady jazyka PHP

Ak m by nejak poloka vybran u hne po zobrazen, ozna sa pomocou atribtu selected. <form action="04.php" method="post"> sla asopisov, o ktor mte zujem: <blockquote> <select name="cisla[]" size="6" multiple="multiple"> <option>1/08</option> <option>2/08</option> <option>3/08</option> <option>4/08</option> <option>5/08</option> <option>6/08</option> </select> </blockquote> <p>Formt, v ktorom chcete sla obdra:</p> <select name="fmt" size="1"> <option value="xhtml">XHTML strnka</option> <option value="pdf">Portable document format</option> <option value="ps" selected="selected">Postscript</option> <option value="ascii">Textov sbor</option> </select> <p>E-mail pre zaslanie: <input name="email" /></p> <p><input type="submit" value=" OK " /></p> </form> V menu prvho zoznamu s pouit hranat ztvorky (cisla[]), aby PHP pre daje z tohto prvku formulra vytvorilo pole. Je to nutn, pretoe uvate me vybra viac sel asopisu naraz (vaka atribtu multiple). Obslun skript vype hodnoty vyplnen vo formulri: <p>Vybran asopisy:<br /></p> <? for ($i=0; $i<count($cisla); $i++): echo $cisla[$i]."<br />\n"; endfor; ?> <p>Poadovan formt: <?echo $fmt?></p> <p>Zasla na: <?echo $email?></p>

- 41 -

Zklady jazyka PHP

Formulre na rovni
Pre uvatea je prjemn, ke vid cel vyplovan formulr naraz na obrazovke. Ak je potrebn od uvatea zska toko dajov, e sa formulr nevojde naraz na obrazovku, je lepie vytvori niekoko strnok s menmi formulrmi, ktor postupne od uvatea vyzvedia poadovan daje. Mnoho formulrov na webe (napr. rzne registrcie) vyaduje vyplnenie iba niektorch povinnch ast formulra. V tchto prpadoch je vhodn povinn polia nejako odli - napr. pouitm vraznejieho psma alebo farebnho psma pri popiske poa. Ak obsluhujci skript zist, e uvate nevyplnil vetky daje, poaduje doplnenie chbajcich. V tomto prpade by sa pred uvateom mal objavi formulr s u zadanmi dajmi. Formulr, ktor vyaduje vyplnenie uritch pol, ale ponka uvateovi pohodln spsob doplnenia chbajcich dajov: ... <head> <title>Ukkov formulr</title> <style type="text/css"> <!-td b { color: red; } --> </style> </head> <body> <? $formular=1; // prznak zobrazovania formulra if ($odoslane==1): // bol formulr odoslan? if ($meno=="" || // kontrola vyplnenia $priezvisko=="" || // povinnch dajov $email==""): echo "<h1>Muste vyplni vetky povinn daje!</h1>"; echo "S oznaen tunm ervenm popisom.\n"; else: // povinn dta s zadan -> spracuj sa $formular=0; // tu sa informcie z formulra spracuj echo "<h1>akujeme za registrciu!</h1>"; endif; else: // formulr je zobrazen prv krt echo "<h1>Pre zaregistrovanie vyplte tento formulr!</h1>"; echo "Povinn daje s oznaen tunm

- 42 -

Zklady jazyka PHP

ervenm popisom.\n"; endif; ?> <? if ($formular): // m sa zobrazova formulr? ?> <form method="post"> <table border="0"> <tr> <td><b>Meno:</b></td> <td><input name="meno" value="<?echo $meno?>" size="30" /></td></tr> <tr> <td><b>Priezvisko:</b></td> <td><input name="priezvisko" value="<?echo $priezvisko?>" size="30" /></td> </tr> <tr> <td>Pohlavie:</td> <td><input type="radio" name="pohlavie" value="muz" <?echo $pohlavie=="muz" ? " checked=\"checked\"" : ""?> /> Mu&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <input type="radio" name="pohlavie" value="zena" <?echo $pohlavie=="zena" ? " checked=\"checked\"" : ""?> /> ena</td> </tr> <tr> <td><b>E-mail:</b></td> <td><input name="email" value="<?echo $email?>" size="30" /></td> </tr> <tr> <td>WWW strnka:</td> <td><input name="web" value="<?echo $web?>" size="30" /></td> </tr> <tr> <th colspan="2"><input type="submit" value=" Registrcia " /></th> </tr> </table> <input type="hidden" name="odoslane" value="1" /> </form> <? endif ?> </body> </html> Vsledkom skriptu mu by tri odlin strnky. Pokia je skript vyvolan uvateom prvkrt, zobraz sa przdny formulr. Ak uvate formulr odole, mu nasta dva prpady. Ke s vetky povinn daje vyplnen, skript zobraz iba potvrdenie registrcie. Ak nejak

- 43 -

Zklady jazyka PHP

povinn daj chba, zobraz sa formulr, ktor obsahuje u skr vyplnen polia a poaduje doplnenie chbajcich pol. Skript na obsluhu dt z formulra vol sm seba, a preto sa nemus v elemente <form> uvdza pomocou atribtu action meno skriptu urenho na spracovanie formulra. Aby skript spoznal, e formulr je uvateom vyvolan prvkrt alebo e uvate len nevyplnil iadne pole, je do formulra pridan skryt pole (type="hidden"). Toto pole sa nezobrazuje, ale jeho hodnota sa prena s ostatnmi dajmi z formulra. Podmienkou if ($Odoslane==1): sa otestuje, i do skriptu u putuj daje z formulra alebo i je spusten prvkrt. V alej asti skriptu sa testuje, i vetky povinn polia obsahuj nejak hodnotu. Ak nie, vype sa zhlavie strnky, ktor poaduje doplnenie chbajcich dajov. Ke s vetky povinn polia vyplnen, poakuje skript za vyplnenie formulra. alia vetva skriptu patr k prvej podmienke. Vykon sa iba ak je skript volan uvateom prvkrt a vyzve ho k vyplneniu formulra. Nasleduje samotn XHTML kd na zobrazenie formulra. Tento kd sa do prehliadaa odole iba ak m premenn $formular hodnotu true. Tto premenn je nastaven na hodnotu false, ak skript obdral vetky povinn polia (netreba iadne daje). Ako hodnotu atribtu value pri jednotlivch vstupnch poliach je uveden krtky PHP skript, ktor dopln obsah tohto poa z poslednho odosielanho formulra. Tm je zaruen, e ke uvate vypln iba niektor daje a je poiadan o doplnenie chbajcich povinnch dajov, nemus znovu vyplova zbytok formulra. Pri prvom spusten skriptu neobsahuj pouit premenn iadnu hodnotu a vstupn pole bud przdne. Pri prepnacch tlaidlch je situcia zloitejia. Ak m by tlaidlo zakrtnut, je treba pri prslunom elemente <input /> uvies atribt checked. <? echo $pohlavie=="muz" ? " checked=\"checked\"" : "" ?> T pouva pecilny opertor podmienka ? vraz1 : vraz2. Ak je podmienka splnen, je vsledkom vraz1, inak vraz2. Ak bol formulr odoslan so zakrtnutm tlaidlom mu, vrti skript prepnacie tlaidlo:

- 44 -

Zklady jazyka PHP

<input type="radio" name="pohlavie" value="muz" checked="checked" /> Ak nebolo pohlavie mua vybran, doraz naopak: <input type="radio" name="pohlavie" value="muz"> a tlaidlo teda zostane nezakrtnut.

- 45 -

Zklady jazyka PHP

Spoluprca PHP s databzami


Databza je nejak miesto, kam sa ukladaj vetky potrebn daje. Prstup k dajom uloenm v databze obstarva program, ktormu sa hovor SRBD - Systm Riadenia Bzy Dt (DBMS - DataBase Management System). Medzi SRBD patria tak programy ako Oracle, MS SQL Server, Sybase, Informix, Progress, mSQL, mySQL a PostgreSQL. Prevan vina dnes pouvanch SRBD pri usporiadan dajov v databze vychdza z relanho modelu dt. Nzov tohto modelu vychdza z relanej algebry, o je matematick apart, na ktorom relan model dt stavia. V tomto modeli s daje usporiadan do tabuliek. Tabuka spravidla zhromauje daje o jednom druhu objektov (osobn daje zamestnancov...). Jednotliv riadky odpovedaj jednotlivm zamestnancom. Stpce potom obsahuj informcie o pracovnkoch (osobn slo, meno, rodn slo, adresa a vka platu). Stpcom tabuky sa obvykle v databzovej terminolgii hovor poloky alebo atribty. Jednotliv riadky sa potom nazvaj zznamy.

Obr. 1 truktra databze Aby lo s tabukami a v nich uloenmi dajmi pracova, musia by nejako jednoznane identifikovan. Kad stpec m svoj nzov. Tento nzov sa pouva pri odvolvan sa na obsah uritho atribtu a nie na cel zznam. Menom atribtu s napr. meno a plat.

- 46 -

Zklady jazyka PHP

astou operciou vykonvanou v tabukch je zmena obsahu jednho atribtu pri uritom zzname. Na vykonanie tejto opercie mus by k dispozcii spsob, ako jednoznane uri poadovan zznam. Pre tieto ely by kad tabuka mala obsahova tzv. primrny k. Primrny k je atribt, ktorho hodnota je pre kad zznam jedinen. Pre kad atribt tabuky mus by uren ak typ dt me obsahova. Medzi najbenejie pouvan typy patria cel sla, znakov reazce a logick hodnoty (no/nie). alie vemi asto pouvan typy s relne sla, menov daje, dtum a as. Databza me obsahova vie mnostvo tabuliek. Kad tabuka m preto svoje meno, ktor ju v rmci databzy jednoznane identifikuje. Tabuka obyajne obsahuje ucelen informcie. To vak neznamen, e nijako nesvis s ostatnmi tabukami. Vo fiktvnej firme je treba evidova informcie o odberateoch. U kadho odberatea sa eviduje jeho IO, nzov, sdlo a zamestnanec fiktvnej firmy, ktor m styk s odberateom na starosti. Tabuka odberatelia mus obsahova atribty IO, nzov a sdlo. M vak u kadho odberatea obsahova kompletn informcie o zamestnancovi (t.j. jeho meno, rodn slo, adresu a vku platu). To by iste nebolo najefektvnejie - pokia by niekto mal na starosti viac odberateov, informcie by sa v tabuke zbytone opakovali. Vyie zmienen prpady sa rieia pomocou vzahov medzi tabukami. Jeden zamestnanec me ma na starosti niekoko odberateov - hovor sa o vzahu 1:N. V praxi sa tento vzah riei tak, e tabuka odberatelia m atribt, ktor obsahuje primrny k urujci zamestnanca poverenho stykom s firmou. Primrny k v tabuke zamestnanci je osobn slo, u kadho odberatea sa teda uvedie osobn slo zamestnanca poverenho jedna za firmu. Atribtu, ktor sli ako odkaz na in tabuku a obsahuje teda primrne ke inej tabuky, sa hovor cudz k. Pokia sa tabuka zastn viac vzahov s ostatnmi tabukami, me obsahova viac cudzch kov. Primrny k je vak v kadej tabuke vdy len jeden. Medzi tabukami mu existova aj in vzahy ako 1:N, i ke nie s tak ast. Vzah 1:1 vyjadruje prpady, kedy zznam jednej tabuky odpoved jednmu zznamu inej tabuky. Tieto vzahy sa obvykle rieia ako pecilny prpad vzahu 1:N s vyuitm cudzieho ka. Ist komplikcie prinaj vzahy typu M:N. Fiktvna firma spracovva naraz niekoko projektov. Na kadom projekte me pracova niekoko zamestnancov, ale zrove me

- 47 -

Zklady jazyka PHP

jeden zamestnanec pracova na viacerch projektoch. Vzah medzi tabukami projekty a zamestnanci je prve vzahom M:N. Na prv pohad sa vzah M:N ned do relanho modelu dt napasova. Naastie je mon kad vzah M:N rozloi na dva vzahy 1:N s vyuitm pomocnej tabuky.

Pre kad zznam plat, e jeho primrny k je jedinen.

- 48 -

Zklady jazyka PHP

vod do jazyka SQL vytvorenie tabuky; pridanie, mazanie, modifikcia zznamu


Pre zpis poiadaviek na databzov server sa najastejie pouva jazyk SQL (Structured Query Language). Jazyk SQL ponka vetko potrebn na vytvranie, modifikovanie a ruenie tabuliek a pre prcu s dajmi v tabuke - vyhadvanie, pridvanie, modifikovanie a mazanie dajov. V lohe klienta pre SQL-server me samozrejme vystupova i skript zapsan v PHP. To znamen, e skripty mu obsahova prkazy zapsan v jazyku SQL a spracovva ich vsledky po vykonan na SQL-serveri. V PHP sa me na pripojenie k SQL-serveru pouva rozhranie ODBC. PHP naviac ponka pre niektor servery priamu podporu - prstup k dajom je potom obvykle rchlej. Medzi priamo podporovan databzy mimo in patr Oracle, Sybase, Solid, mySQL a PostgreSQL. Po naintalovan mySQL sa mus spusti jeho serverov as pomocou prkazu mysqld. Teraz sa u me k serveru pripja pomocou jednoduchho riadkovho klienta mysql. Ako parameter je nutn uvies meno databzy, ku ktorej sa uvate pripja. Vytvorenie tabuky Na vytvorenie novej tabuky v databze sli SQL prkaz CREATE TABLE. Jeho syntax je nasledujca: create table meno_tabuky (meno_poloky dtov_typ_poloky, ... ); Prehad najpouvanejch dtovch typov Vybran dtov typy MySQL Typ Popis cel slo int slo s pohyblivou desatinnou iarkou float varchar(n) textov reazec o maximlnej dke n dtum v tvare RRRR-MM-DD date as v tvare HH:MM:SS time Na vytvorenie tabuky zamestnanci sa me poui nasledujci SQL prkaz:

- 49 -

Zklady jazyka PHP

create table zamestnanci ( osobnecislo int not null, meno varchar(40), rc varchar(11), adresa varchar(60), plat float, primary key (osobnecislo) );

Pridanie novho zznamu


Na pridanie novho zznamu do tabuky s N atribtmi sli v SQL prkaz insert into: insert into meno_tabuky values (hodnota1, ..., hodnotaN); Pridanie informcie o pnovi Novkovi: insert into zamestnanci values ( 1023, 'Novk Jn', '561220/0235', 'Doln 13, Trnava', 18000); Textov reazce sa musia uzatvra do apostrofov alebo do vodzoviek.

Vber a prezeranie zznamov


Na vber a vypsanie zznamov z tabuky sli prkaz SELECT. Na vypsanie obsah celej tabuky sa zad prkaz: select * from meno_tabuky; Obsah tabuky Zamestnanci sa me overi pomocou: select * from zamestnanci; Informcie je mon vybera i selektvne. Podmienka, ktor mus pre vybran zznamy plati, sa uvdza za kov slovo where. Prklady selektvnych dotazov: select * from zamestnanci where meno like 'Novk Jn'; Vyberie vetkch zamestnancov, ktorch meno je 'Novk Jn'. select * from zamestnanci where meno like 'Nov%';

- 50 -

Zklady jazyka PHP

Znak '%' m vo vyhadvanom reazci za opertorom like pecilny vznam - nahrdza ubovon sekvenciu znakov. Dotaz teda vyberie vetkch zamestnancov, ktorch meno zana na Nov. select * from zamestnanci where osobnecislo=1023; Vyberie zamestnanca s osobnm slom 1230. select * from zamestnanci where plat>10000; Vyberie vetkch, ktorch plat prevyuje 10000. V podmienkach sa mu pouva aj logick spojky AND a OR. Ak je treba vyselektova vetkch Novkov, ktorch plat je men ako 6000, pouije sa dotaz: select * from zamestnanci where meno like 'novk %' plat<6000; and

Za prkazom select sa nemus uvdza iba hviezdika. Namiesto nej sa me poui zoznam atribtov, ktor maj by vo vsledku zobrazen. Hviezdika m pecilny vznam a zastupuje vetky atribty. Ak je treba vyselektova men a platy zamestnancov, ktor maj plat v ako 15000, me sa poui dotaz: select meno, plat from zamestnanci where plat>15000;

Mazanie zznamov v tabuke


Na mazanie zznamov v tabuke sli prkaz delete from. Zznamy, ktor treba zmaza, sa musia uri podmienkou v klauzule WHERE: delete from meno_tabuky where podmienka; Zmazanie zamestnanca, ktorho osobn slo je 1023: delete from zamestnanci where osobnecislo=1023;

- 51 -

Zklady jazyka PHP

Modifikcia zznamu v tabuke


Na zmenu obsahu zznamu sli prkaz update: update meno_tabuky set poloka=hodnota, ... where podmienka; Ten modifikuje vetky zznamy, ktor vyhovuj podmienke. Pre zmenenie iba jedenho zznamu (najtypickej prklad), je vhodn ako podmienku uvies test primrneho ka na jedinen hodnotu: update zamestnanci set plat=14000 where osobnecislo=1023; Prkaz zmen plat Jna Novka na 14000 (osobn slo pna Novka je 1230).

Zaleovanie SQL do skriptov


PHP ponka spsob na prcu s databzami prve pomocou jazyka SQL. Prca s databzou v skripte sa sklad z niekokch krokov. Najprv je nutn sa k databze pripoji. Potom sa me na server odosla SQL-dotaz. Sp sa vrti vsledok, s ktorm sa d alej pracova vybera z neho jednotliv zznamy a poloky. Dotazy a spracovanie vsledkov sa mu vykonva opakovane a nakoniec by sa malo od databzy odpoji. Na pripojenie k databze sli funkcia mysql_connect(). T m tri parametre. Prvm z nich je adresa, na ktorej je dostupn SQL-server. alie dva parametre s meno a heslo uvatea, pod ktorm sa k databzovmu serveru pripja. Pre databzu, ktor je prstupn kadmu, sa me meno a heslo vynecha. Na pripojenie sa pouije prkaz: mysql_connect("localhost"); Na samotn vykonvanie SQL-dotazov sa pouva funkcia mysql. T m dva parametre prvm je meno databzy, v ktorej sa prevdza dotaz a druh parameter je SQL-dotaz. Funkcia vracia hodnotu, pomocou ktorej sa potom me pracova s vsledkom dotazu. Na vyberanie dajov o vetkch zamestnancoch posli nasledujci kd: $result = mysql("test", "select * from zamestnanci"); Prostrednctvom premennej $result je teraz dostupn vsledok dotazu. Pre zistenie potu zznamov, ktor vyhovuje dotazu, sa me poui funkcia mysql_numrows($result). Na prstup k jednotlivm polokm vsledku sli funkcia mysql_result(). T m tri parametre:

- 52 -

Zklady jazyka PHP

mysql_result(id_vsledku, slo_zznamu, meno_poloky); Zznamy s vo vsledku slovan od nuly a ich poet sa zist prve pomocou funkcie mysql_numrows($result). Na vypsanie mena prvho zamestnanca, ktor vyhovuje dotazu, sli prkaz: echo mysql_result($result, 0, "meno"); Pre vypsanie vetkch zznamov, treba vytvori cyklus, ktor vetky zznamy spracuje. Poet opakovan tohto cyklu uruje vsledok funkcie mysql_numrows().

- 53 -

Zklady jazyka PHP

select.php: ... <head> <title>Vpis vetkch zamestnancov</title> </head> <body> <h1>Vpis vetkch zamestnancov</h1> <table border="1" cellpadding="2"> <tr><th>Osobn slo</th> <th>Meno</th> <th>Rodn slo</th> <th>Adresa</th> <th>Plat</th> </tr> <? mysql_connect("localhost"); $result=mysql("test","select * from zamestnanci"); $pocet=mysql_numrows($result); echo "V tabuke \"zamestnanci\" je $pocet zznamov.\n"; for($i=0; $i<$pocet; $i++): echo "<tr>\n"; echo "<td align=\"center\">". mysql_result($result, $i, "osobnecislo"). "</td>\n"; echo "<td>".mysql_result($result, $i, "meno"). "</td>\n"; echo "<td>".mysql_result($result, $i, "rc"). "</td>\n"; echo "<td>".mysql_result($result, $i, "adresa"). "</td>\n"; echo "<td align=\"right\">". mysql_result($result, $i, "plat"). "</td>\n"; echo "</tr>\n"; endfor; mysql_close(); ?> </table> </body> </html> Na prechod vetkmi zznamami vsledku bol pouit cyklus for, ktorho riadiaca premenn ($i) bola pouit pri odvolvan sa na jednotliv zznamy vsledku. Funkcia mysql_close()uzavrie spojenie s databzou.

- 54 -

Zklady jazyka PHP

Do skriptu sa d vloi ubovon SQL-prkaz. Cez webov rozhranie sa daj pridva nov zznamy do tabuky zamestnanci. Najprv sa mus vytvori formulr, ktor bude sli na zadanie dajov o novom zamestnancovi. insert.html: ... <head> <title>Pridanie novho zznamu do tabuky zamestnanci</title> </head> <body> <h1>Pridanie novho zznamu do tabuky zamestnanci</h1> <strong>Zadajte daje o novom zamestnancovi:</strong> <form action="insert.php"> <table> <tr> <td>Osobn slo:</td> <td><input name="osobnecislo" /></td> </tr> <tr> <td>Meno:</td> <td><input name="meno" /></td> </tr> <tr> <td>Rodn slo:</td> <td><input name="rc" /></td> </tr> <tr> <td>Adresa:</td> <td><input name="adresa" /></td> </tr> <tr> <td>Plat:</td> <td><input name="plat" /></td> </tr> <tr> <th colspan=2><input type="submit" value="Pridanie zamestnanca" /></th> </tr> </table> </form> </body> </html> Na obsluhu formulra sli skript insert.php, ktor obstar samotn vloenie dajov z formulra do tabuky:

- 55 -

Zklady jazyka PHP

insert.php: ... <head> <title>Pridanie novho zznamu do tabuky zamestnanci</title> </head> <body> <? @$spojenie = mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripoji k databze!</h1>"; else: @$vysledok = mysql("test", "insert into zamestnanci values( $osobnecislo, '$meno', '$rc', '$adresa', $plat)"); if (!$vysledok): echo "<h1>Nov zznam sa nepodarilo prida!</h1>"; else: ?> <h1>Nov zznam bol spene pridan</h1> <form action="select.php"> <input type="submit" value="Prehad zoznamu zamestnancov" /> </form> <form action="insert.html"> <input type="submit" value="Pridanie novho zamestnanca" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Do strnky boli pomocou formulrov vloen dve tlaidl, ktor slia na vyvolanie skriptu pre vpis obsahu tabuky resp. pre pridanie alieho zamestnanca.

- 56 -

Zklady jazyka PHP

Manipulcia s dtami pomocou prehliadaa


Zmazanie zznamu je v SQL jednoduch vec - sta pozna hodnotu primrneho ka zznamu, ktor treba zmaza: delete from zamestnanci where osobnecislo=hodnota; Od uvatea je v tomto prpade potrebn zska osobn slo zamestnanca, ktorho chce zmaza. Jednou z monost je doplnenie vpisu obsahu tabuky o tlaidl vyvolvajce zmazanie jednotlivch zznamov. Do kadho riadku tabuky sa prid bunku s malm formulrom. Formulr bude obsahova iba dve polia - tlaidlo pre odoslanie a skryt pole, ktor bude sli na prenos osobnho sla zamestnanca, ktorho treba zmaza. Do skriptu pre vpis zamestnancov sa prid nasledujci prkaz: echo "<td><form action=\"delete2.php\"> <input type=\"hidden\" name=\"osobnecislo\" value=\"".mysql_result($vysledok, "osobnecislo")."\" /> <input type=\"submit\" value=\"Zmaza\" /></form></td>"; Pre prv zznam tabuky bude skriptom vygenerovan formulr: <td><form action="delete2.php"> <input type="hidden" name="osobnecislo" value="1023" /> <input type="submit" value="Zmaza" /></form></td> Po prave sa skript ulo pod nzvom delete.php a jeho vpis bude nasledovn:

- 57 -

Zklady jazyka PHP

delete.php:
... <head> <title>Vpis vetkch zamestnancov</title> </head> <body> <h1>Vpis vetkch zamestnancov</h1> <table border="1" cellpadding="2"> <tr><th>Osobn slo</th> <th>Meno</th> <th>Rodn slo</th> <th>Adresa</th> <th>Plat</th> </tr> <? mysql_connect("localhost"); $result = mysql("test", "select * from zamestnanci"); $pocet = mysql_numrows($result); echo "V tabuke \"zamestnanci\" je $pocet zznamov.\n"; for($i=0; $i<$pocet; $i++): echo "<tr>\n"; echo "<td align=\"center\">". mysql_result($result, $i, "osobnecislo"). "</td>\n"; echo "<td>".mysql_result($result, $i, "meno"). "</td>\n"; echo "<td>".mysql_result($result, $i, "rc"). "</td>\n"; echo "<td>".mysql_result($result, $i, "adresa"). "</td>\n"; echo "<td align=right>". mysql_result($result, $i, "plat"). "</td>\n"; echo "<td> <form action=\"delete2.php\"> <input type=\"hidden\" name=\"osobnecislo\" value=\"". mysql_result($result, $i, "osobnecislo")."\" /> <input type=\"submit\" value=\"Zmaza\" /></td></form>"; echo "</tr>\n"; endfor; mysql_close(); ?> </table> </body> </html>

- 58 -

Zklady jazyka PHP

Samotn skript na zmazanie zznamu je obdobou skriptu na pridanie novho zznamu. Iba sa li vykonvan SQL-prkaz. Skript obdr osobn slo zamestnanca urenho k zmazaniu v premennej $osobnecislo. delete2.php ... <head> <title>Zmazanie zznamu</title> </head> <body> <? @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "<h1>nepodarilo sa pripoji k databze!</h1>"; else: @$result = mysql("test", "delete from zamestnanci where osobnecislo=$osobnecislo"); if (!$result): echo "<h1>Zznam sa nepodarilo zmaza!</h1>"; else: ?> <h1>Zznam bol spene zmazan</h1> <form action="select.php"> <input type="submit" value="Prehad zoznamu" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Na zmenenie existujcich dajov o zamestnancoch sa mus vytvori tlaidlo, ktor vyvol modifikciu uritho zznamu. Tlaidlo sa prid k tabuke s vpisom rovnakm spsobom ako bolo pridan tlaidlo pre mazanie. Stlaenie tlaidla vak vyvol formulr, ktor bude sli na modifikciu zznamu, ktor bude vyzera podobne ako formulr pre zadanie novho zznamu - iba sa v om zobrazia daje z aktulne vybranho zznamu a bude umonen ich editcia. Uvateovi musia by umonen editova vetky daje okrem primrneho ka (osobnho sla).

- 59 -

Zklady jazyka PHP

Pozn. Kvli znemoneniu editovania osobnho sla je vhodn ako primrny k poi idzamestnanec.

- 60 -

Zklady jazyka PHP

update1.php: <html> <head> <title>Vpis vetkch zamestnancov</title> </head> <body> <h1>Vpis vetkch zamestnancov</h1> <table border="1" cellpadding="2"> <tr><th>Osobn slo</th> <th>Meno</th> <th>Rodn slo</th> <th>Adresa</th> <th>Plat</th> </tr> <? mysql_connect("localhost"); $result = mysql("test", "select * from zamestnanci"); $pocet = mysql_numrows($result); echo "V tabuke \"zamestnanci\" je $pocet zznamov.\n"; for($i=0; $i<$pocet; $i++): echo "<tr>\n"; echo "<td align=\"center\">". mysql_result($result, $i, "osobnecislo"). "</td>\n"; echo "<td>".mysql_result($result, $i, "meno"). "</td>\n"; echo "<td>".mysql_result($result, $i, "rc"). "</td>\n"; echo "<td>".mysql_result($result, $i, "adresa"). "</td>\n"; echo "<td align=right>". mysql_result($result, $i, "plat"). "</td>\n"; echo "<td><form action=\"update2.php\"> <input type=\"hidden\" name=\"osobnecislo\" value=\"". mysql_result($result, $i, "osobnecislo")."\"> <input type=\"submit\" value=\"Upravi\" /> </td></form>"; echo "</tr>\n"; endfor; mysql_close(); ?> </table> </body> </html>

- 61 -

Zklady jazyka PHP

update2.php:
<html> <head> <title>Modifikcia zznamu v tabuke zamestnanci</title> </head> <body> <? @$spojenie = mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripoji k databze!</h1>"; else: @$vysledok = mysql("test", "select * from zamestnanci where osobnecislo=$osobnecislo"); if (!$vysledok || !mysql_fetch_row($vysledok)): echo "<h1>Zznam sa nepodarilo njs!</h1>"; else: $meno=mysql_result($vysledok, $i, "meno"); $rc=mysql_result($vysledok, $i, "rc"); $adresa=mysql_result($vysledok, $i, "adresa"); $plat=mysql_result($vysledok, $i, "plat"); ?> <h1>Modifikcia zznamu v tabuke zamestnanci</h1> <strong>Opravte daje o zamestnancovi:</strong> <form action="update3.php"> <table> <tr><td>Osobn slo:</td> <td><?echo $osobnecislo?> <input type="hidden" name="osobnecislo" value="<?echo $osobnecislo?>" /></td></tr> <tr><td>Meno:</td> <td><input name="meno" value="<?echo $meno?>" /> </td></tr> <tr><td>Rodn slo:</td> <td><input name="rc" value="<?echo $rc?>" /></td></tr> <tr><td>Adresa:</td> <td><input name="adresa" value="<?echo $adresa?>" /> </td></tr> <tr><td>Plat:</td> <td><input name="plat" value="<?echo $plat?>" /> </td></tr> <tr><th colspan="2"> <input type="submit" value="Zapsanie zmien" /> </table> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html>

- 62 -

Zklady jazyka PHP

Skript pre zapsanie zmien do tabuky me vyzera takto: update3.php: <html> <head> <title>Zmena zznamu v tabuke zamestnanci</title> </head> <body> <? @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripoji k databze!</h1>"; else: @$vysledok = mysql("test", "update zamestnanci set meno = '$meno', rc = '$rc', adresa = '$adresa', plat = $plat where osobnecislo = $osobnecislo"); if (!$vysledok): echo "<h1>Zznam sa nepodarilo zmeni!</h1>"; else: ?> <h1>Zznam bol spene zmenen</h1> <form action="select.php"> <input type="submit" value="Prehad zoznamu zamestnancov" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Poslednou vecou v svislosti s databzami, je monos vyhadvania. V tabuke o zamestnancoch me by niekoko stoviek i tisc zznamov. Ak sa tabuka nech cel vypsa v prehliadai, zobraz sa neprehadn dlh zoznam, ktor sa naviac bude naahova neprimerane dlho. Rieenm je vytvorenie jednoduchho formulra, ktor uvateovi umon zada prvch pr psmen z mena zamestnanca a skript potom zobraz iba vyhovujce zznamy:

- 63 -

Zklady jazyka PHP

search.php: <html> <head> <title>Prehadvanie zoznamu zamestnancov</title> </head> <body> <h1>Prehadvanie zoznamu zamestnancov</h1> <form action="search.php"> Zadajte zaiatok mena zamestnanca: <input name="meno" value="<?echo $meno?>" /> <input type="submit" value="Hadaj" /> </form> <hr> <? if ($meno!=""): @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "Nepodarilo sa pripoji k databze."; else: @$result=mysql("test", "select * from zamestnanci where meno like '%$meno%'"); $pocet=mysql_numrows($result); if (!$result): echo "Chyba pri preveden dotazu v databze"; else: echo "Poet njdench zamestnancov: ". mysql_num_rows($result)."<br>\n"; ?> <table border="1" cellpadding="2"> <tr><th>Osobn slo</th> <th>Meno</th> <th>Rodn slo</th> <th>Adresa</th> <th>Plat</th> </tr> <? for($i=0; $i<$pocet; $i++): echo "<tr>\n"; echo "<td align=\"center\">". mysql_result($result, $i, "osobnecislo"). "</td>\n"; echo "<td>".mysql_result($result, $i, "meno"). "</td>\n"; echo "<td>".mysql_result($result, $i, "rc"). "</td>\n"; echo "<td>".mysql_result($result, $i, "adresa"). "</td>\n";

- 64 -

Zklady jazyka PHP

echo "<td align=\"right\">". mysql_result($result, $i, "plat"). "</td>\n"; echo "</tr>\n"; endfor; echo "</table>\n"; endif; mysql_close($spojenie); endif; endif; ?> </body> </html> V parametri like prkazu select, ktor uruje reazec na porovnanie sa me poui znak '%', ktor zastupuje ubovon poet ubovonch znakov. Tm sa dosiahne to, e vsledkom dotazu bud iba tie zznamy, ktorch atribt Meno zana na reazec uloen v premennej $meno.

- 65 -

Zklady jazyka PHP

Prca so sbormi v PHP


Zkladn funkcie
Zkladnmi funkciami prce so sbormi sa mu nazva funkcie na otvranie a zatvranie sborov. Ide o funkcie fopen() a fclose(). Prv funkcia sli na otvorenie sboru. Vracia premenn typu file pointer (teda nieo ako ukazovate sboru), ktor m vznam pri pohybe po sbore. M tri parametre, priom ten tret je nepovinn a skoro sa nepouva. Prvm parametrom je reazec obsahujci meno sboru, ktor treba otvori. Ak sa tento reazec zana na http:// otvor sa HTTP pripojenie na pecifikovan server. Takisto sa mu zadva men sborov na FTP, take pripojenie na FTP je realizovan v prpade, e meno sboru sa zana na ftp://. Ak sa reazec zana mkovek inm, sbor je otvoren z loklneho filesystmu. Druhm parametrom je takisto reazec, v ktorom je identifiktor mdu, akm sa bude pristupova k sboru. Ten me by jeden z nasledujcich: r - otvor sbor iba na tanie, ukazovate je nastaven na zaiatok sboru r+ - otvor sbor na tanie a na zpis, ukazovate je nastaven na zaiatok sboru w - otvor sbor iba na zpis, ukazovate je nastaven na zaiatok sboru a dka sboru je skrten na nulu (vetko zo sboru je zmazan). Ak sbor neexistuje, poksi sa ho vytvori w+ - otvor sbor na zpis a tanie, ukazovate je nastaven na zaiatok sboru a dka sboru je skrten na nulu. Ak sbor neexistuje, poksi sa ho vytvori a - otvor sbor iba na zpis, ukazovate je nastaven na koniec sboru. Ak sbor neexistuje, poksi sa ho vytvori a+ - otvor sbor na tanie a zpis, ukazovate je nastaven na koniec sboru. Ak sbor neexistuje, poksi sa ho vytvori. Ako bolo u spomenut, funkcia vracia ukazovate danho sboru. Aby sa dal potom poui, mus sa tto nvratov hodnota priradi nejakej premennej. Tto premenn potom sli pri prci so sbormi pri ostatnch funkcich. Otvranie sborov: $subor = fopen("data/meno.dat","r"); $subor = fopen("info.dat","w+"); $subor = fopen("ftp://login:heslo@server.sk","w");

- 66 -

Zklady jazyka PHP

Funkcia fclose() m jedin parameter, a to u spomnan ukazovate sboru, teda file pointer. Tto funkcia nerob ni in, iba zatvor sbor, ktormu je priraden prslun ukazovate, zadan ako parameter tejto funkcie. Funkcia vracia hodnoty true alebo false v zvislosti od toho, i prebehlo zatvranie sboru spene alebo nie. fclose($subor);

alie funkcie na prcu so sbormi


Funkcia fgets()sli na pre tanie riadka zo sboru. To, o zo sboru preta, je interpretovan ako nvratov hodnota typu reazec, take vsledok tejto funkcie by bolo vhodn priradi nejakej premennej. Funkcia m dva parametre, priom oba s povinn. Prvm je file pointer sboru, z ktorho sa ta (pred pouitm funkcie mus by sbor otvoren). Druh parameter pecifikuje poet bajtov (znakov), ktor ma by pretan zo sboru (priom je pretan vdy poet znakov o 1 ni, ne je zadan tmto parametrom). Znaky vak bud tan iba na jednom riadku, pretoe tanie sa me koni nielen dosiahnutm dky zadanej druhm parametrom, ale aj dosiahnutm prznaku konca riadka alebo konca sboru. To znamen, e ak sa prike preta v poet znakov, ako sa nachdza v riadku, bude pretan ni poet znakov, resp. bud pretan iba znaky nachdzajce sa v riadku, po prechode na nov riadok sa tanie kon. $subor = fopen("text.txt","r"); $text = fgets($subor,1000); fclose($subor); Pre natanie len jednho znaku zo sboru sa me poui funkcia fgetc(). T m iba jeden parameter, ktorm je file pointer sboru, z ktorho sa ta. Nvratovou hodnotou je jeden znak natan zo sboru, ktor je identifikovan tmto file pointerom. V prpade, e ukazovate je na konci sboru (prznak EOF), nvratov hodnota je FALSE. Funkcia fputs() zape reazec do sboru. Tto funkcia m tri parametre. Prvm je file pointer, druhm parametrom je reazec alebo premenn typu reazec, ktorej obsah sa bude zapisova do sboru. Tret parameter je nepovinn a pecifikuje po et znakov, ktor m by do sboru zapsan. Pri neuveden tohto parametra sa zape cel reazec. Plat, e ak bude pecifikovan poet znakov v ako dka samotnho reazca, bude zapsanch iba toko znakov, koko ich reazec skutone obsahuje.

- 67 -

Zklady jazyka PHP

$subor = fopen("text.txt","w"); fputs($subor,$text); fclose($subor); Funkcia file_exists() m pomerne ast vyuitie, pretoe sli na overenie skutonosti, e dan sbor existuje. Predtm ako sa bude z nejakho sboru ta, mala by sa poui tto funkcia. Funkcia m jedin parameter, ktorm je reazec obsahujci meno sboru. Z logickch dvodov sa nepouva file pointer, pretoe testova, i existuje sbor, ktor je u otvoren, je nezmyseln. Take najprv sa testuje existencia sboru pomocou file_exists() a a potom sa sbor otvor pomocou fopen(). Funkcia vracia true vtedy, ak sbor existuje, v opanom prpade vracia false. Otvranie sboru text.txt v adresri docs by malo prebieha asi takto: if (file_exists("docs/text.txt")) { $subor = fopen("docs/text.txt","r"); . . prca so sborom . fclose($subor); } else { echo "Sbor docs/text.txt neexistuje."; } V tomto prpade vak me nasta problm pri otvoren sboru viacermi uvatemi (paraleln prca so sborom). Vsledky tejto funkcie s ukladan do cache pamte, z ktorej sa potom vyberaj vsledky pri alom volan tejto funkcie. Preto vrten hodnota funkcie bude rovnak ako prvkrt, aj ke bude volan niekokokrt po sebe. Funkcia clearstatcache()vymae cache, m sa zabezpe zskanie skutonch a aktulnych vsledkov funkci. Funkcia nem nijak parametre a nevracia nijak hodnotu. Funkcia feof() testuj koniec sboru, ktorho file pointer je parametrom tejto funkcie. Nvratovou hodnotou me by true alebo false v zvislosti od toho, i je ukazovate sboru na jeho konci (prznak EOF). Ak ukazovate koniec sboru dosiahol, vracia funkcia true. Vypsanie vetkch riadkov sboru:

- 68 -

Zklady jazyka PHP

$subor=fopen("text.txt","r"); while (!feof($subor)) { echo fgets($subor,$text); } fclose($subor); Me sa sta, e pri tan zo sboru niekde v jeho prostriedku, treba znovu zaa ta zo zaiatku. Jednm zo spsobov, ako to urobi, je sbor zatvori a znovu otvori, o je dos zl rieenie. Funkcia rewind() previnie ukazovate sboru, ktor je zadan ako parameter, na jeho zaiatok. File pointer je zrove jedinm parametrom funkcie. Nvratovou hodnotou je 0 v prpade, e nastala nejak chyba. Na posun ukazovatea po sbore sli aj funkcia fseek() ktor nastav file pointer na pozciu definovan parametrom. Parametre s dva, prvm je file pointer sboru, s ktorm sa manipuluje a druhm je offset, teda pozcia, na ktor sa m ukazovate umiestni. Offset vyjadruje poet bajtov od zaiatku sboru k iadanej pozcii. Nvratov hodnota je 0 v prpade spenho presunutia, -1 v prpade, e sa vyskytla nejak chyba. Zadanie offsetu vieho, ako je vekos sboru, teda pokus umiestni ukazovate za koniec sboru (EOF), sa nepoklad za chybu. Na zistenie aktulnej pozcie ukazovate a sboru sa pouva funkcia ftell(). Jedinm parametrom je file pointer sboru, nvratovou hodnotou je pozcia ukazovatea sboru (offset), v prpade chyby vracia false.

Systmov funkcie
Pri pouvan systmovch funkci nie je nutn sbor otvra. Prvou je funkcia copy(), ktor sli na koprovanie sboru a zrove jeho premenovanie. M dva parametre, source a destination, teda zdroj a cie. Prv parameter (zdroj) pecifikuje meno sboru (prpadne aj s cestou k nemu), ktor sa bude koprova, druh (cie) znamen umiestnenie cieovho (skoprovanho) sboru a aj jeho meno. To zna, e pri koprovan sa me zrove sbor premenova, take je mon koprova do rovnakho adresra, v akom sa nachdza zdroj. Funkcia vracia true, ak prebehlo koprovanie v poriadku, inak vrti false:

- 69 -

Zklady jazyka PHP

if (!copy("zdroj.dat", "zdroj.bak")) { echo "Chyba pri koprovan... "; } else { echo "Koprovanie prebehlo v poriadku...";} Ak je treba sbor iba premenova a nie koprova, me sa poui funkcia rename() . M dva parametre, prvm je meno sboru, ktor treba premenova, druhm je nov meno, ktorm bude nazvan sbor. Nvratov hodnoty s rovnak ako pri copy() , teda true pri spenom premenovan, inak false. alo u uito nou funkciou je filesize(). Tto funkcia umouje zisti vekos sboru. Jej jedinm parametrom je meno sboru, ktorho vekos treba zisti. Nvratovou hodnotou je vekos sboru alebo v prpade chyby false. Vsledky tejto funkcie s ukladan do pamte cache a preto pri jej optovnom pouit je vhodn pod a okolnost najprv zavola funkciu clearstatcache(). Podobne je t o s funkcio u fileatime() . Tt o fu nk cia vr ac ia as poslednho prstupu k sboru, ktor sa jej zad ako jedin parameter. Na zmazanie sboru sli funkcia unlink(), ktor m op jedin parameter - meno sboru, ktor treba zmaza. Nvratov hodnota je 0 alebo false v prpade vskytu chyby.

alie monosti tania sborov


Ide o vyuitie funkci file() a readfile(). Obe funkcie maj niekoko spolonch vlastnost - kad m jeden povinn parameter, ktorm je meno sboru, ktor sa bude ta. Obe funkcie slia na natanie celho obsahu sboru. Rozdiel spova v spsobe interpretcie obsahu sboru. Funkcia readfile() obsah po natan cel vype do vstupu (teda zva do vslednho generovanho dokumentu). Na druhej strane funkcia file() nata sbor do poa, priom jednmu prvku poa zodpoved jeden riadok. Sbor s desiatimi riadkami je natan do poa s desiatimi prvkami. Z toho vyplva, e vsledok funkcie file() sa mus priradi premennej typu pole, zatia o vsledok readfile() je poet pretanch bajtov, take ak je tto informcia nepotrebn, nemus sa funkcia priraova iadnej premennej. Kee parametrom tchto funkci je meno sboru a nie jeho file pointer, sbor netreba otvra.

- 70 -

Zklady jazyka PHP

Problmy pri paralelnej prci so sbormi


Najvm problmom pri prci so sbormi na serveri, kde m prstup relatvne neobmedzen poet pouvateov, je takmer ist pravdepodobnos, e sa naraz poksi pracova so sborom viac skriptov. To m vinou za nsledok pokodenie sboru, stratu dt a aj krach programu. Preto je potrebn takto prpady nejakm spsobom oetri Jednm z rieen je vdy si vytvra nejak pracovn sbor, ktorho existencia signalizuje, e s potrebnm sborom sa pracuje a preto treba po ka. Implementcia rieenie by bola pribline takto: while (file_exists("work")) { sleep(1); clearstatcache(); } $subor = fopen("work","w"); fclose($subor); . . prca s potrebnm sborom . . unlink("work"); Na zaiatku je cyklus while, ktor kontroluje, i existuje sbor work. Ak no, na jednu sekundu sa exekcia skriptu zastav, na o sli funkcia sleep(). Potom sa vymae pam cache a op sa testuj existencia sboru work. Toto sa opakuje, km sbor work existuje. Hne ako je tento sbor zmazan, pokrauje skript tm, e vytvor znovu sbor work, m si uvate rezervuje prvo pouva potrebn sbory, take vetky ostatn skripty bud musie poka. Vytvorenie sboru work pozostva z otvorenia na zpis a okamitho zatvorenia. Potom sa uvate me venova prci so samotnmi sbormi, pre ktor je skript uren. Po ukonen prce skript zmae sbor work a tm umon aliemu skriptu (alebo alej intancii toho istho skriptu) prcu so sbormi a sm kon. Druh monos je poui funkciu na uzamknutie sborov. Ide o funkciu flock() . Prvm parametrom je file pointer, take pred uzamknutm sboru je potrebn najprv ho otvori. Druhm parametrom je seln kd opercie, ktor sa m na sbore vykona: 1 - zdiean prstup, sprstupn sbor na tanie 2 - exkluzvny prstup, sprstupn sbor na zpis

- 71 -

Zklady jazyka PHP

3 - uvon (odomkne) sbor uzamknut predchdzajcim volanm funkcie flock() s parametrom 1 alebo 2 flock($subor,1); . . prca so sborom (tanie) . . flock($subor,3); Aby bol systm pouvajci flock() funkn, musia tto funkciu pouva vetky skripty, inak nem vznam.

- 72 -

Zklady jazyka PHP

PHP a obrzky
Pre prcu s obrzkami sa v PHP pouva grafick kninica GD, ktor je sasou distribcie PHP. Tto kninica sa d stiahnu aj na strnke http://www.boutell.com/gd, kde je aj kompletn dokumentcia. S tu k dispozcii aj zdrojov kdy tejto kninice. Od verzie PHP 4.0.6 je u pridan kninica php_gd.dll, take sta upravi sbor php.ini. Verzie 2.0.0 a vyie poskytuj lepie prostriedky na prcu s obrzkami, prinaj podporu True Color (teda 16 milinov farieb) a pridali niektor nov funkcie. GD podporuje niekoko grafickch formtov, medzi inmi aj dva vlastn formty, alej JPEG, PNG a WBMP. WBMP je formt vyuvan v bezdrtovch zariadeniach, ako s mobilne telefny (s podporou WAP), a preto s vsledn obrzky v tomto formte iernobiele. Podpora obrzkov GIF nie je zahrnut od verzie 1.6.

Funkcia GetImageSize()
Tto funkcia je priamo podporovan PHP a nepotrebuje na funknos kninicu GD. Funkcia sli na zistenie rozmerov obrzka. Podporovan formty s JPEG, GIF a PNG. Ako parameter berie nzov sboru obsahujceho obrzok a nvratov hodnota predstavuje pole so tyrmi prvkami. Prv dva prvky obsahuj rku a vku obrzka v pixloch: $obr=GetImageSize("img/obrazok.jpg"); echo "rka obrzka: ".$obr[0]. " pixlov <br /> Vka obrzka: ".$obr[l]. " pixlov"; alm prvkom poa vrtenho funkciou GetImageSize() je identifiktor formtu obrzku, ktor nadobda tri stavy v zvislosti od formtu natanho obrzka: Hodnota 1 2 3 Formt GIF JPEG PNG

Nasledujci skript ukazuje, ako vypsa nzvy vetkch sborov v zadanom adresri obsahujcich obrzok vo formte JPEG:

- 73 -

Zklady jazyka PHP

/* premenn $adr obsahuje nzov adresra, z ktorho sa ta */ $adr=opendir('.'); echo "Sbory obsahujce obrzok JPEG:<br />"; /* tanie sborov z adresra, pokia ukazovate nie je na konci adresra */ while($sub=readdir($adr)): /* overenie, i nejde o adresr */ if (!Is_Dir($sub)): $atr=GetImageSize($sub); /* overenie, i sbor neobsahuje obrzok JPEG */ if ($atr[2]==2): echo "$sub<br />"; endif; endif; endwhile; /* koniec preh advania adresra */ closedir($adr); Skript otvor aktulny adresr a postupne v cykle while zisuje pre kad sbor (adresre s preskakovan oetrenm funkciou Is_Dir()), i nhodou neobsahuje obrzok vo formte JPEG pomocou tretieho prvku nvratovho poa funkcie GetImageSize(). Nezle na nzvoch ani na koncovkch sborov, pretoe tto funkcia kontroluje obsah sboru, take njde aj tak sbory obsahujce obrzok JPEG, ktor nemaj prslun koncovku (.jpg). Posledn poloka nvratovho poa obsahuje reazec "height=hhh width=www", kde hhh a www predstavuj prslun hodnoty. Takto reazec je vhodn na pouitie v elementoch <img />: /* Zistenie informci o obrzku */ $atr=GetImageSize("img/obrazok.jpg"); /*a vygenerovanie prslunho kdu XHTML */ echo "<img src=\"img/obrazok.jpg\" ".$atr[3]. " />"; Tento skript vygeneruje XHTML element <img /> spolu s atribtmi width a height s nastavenmi hodnotami pod a skuto nch rozmerov obrzka. D sa to dosiahnu aj bez pouitia poslednej poloky nvratovho po a, ak by sa zamenil posledn riadok za tento: echo "<img src=\"img/obrazok.jpg\" width=".$atr[0] . " height=".$atr[1]. " />";

- 74 -

Zklady jazyka PHP

vod do GD
Zkladnou truktrou pouvanou GD je gdImage. Tto dtov truktra sli na uchovvanie obrzka v pamti a na rzne opercie s nm. Tto truktru vyuva pri prci viacero funkci, priom prstup k nej je prostrednctvom ukazovatea typu gdImagePtr, ktor sa zska ako nvratov hodnota akejkovek funkcie vytvrajcej obrzok. Vetky opercie vykonvan na tejto truktre prebiehaj v pamti, priom jej momentlny obsah sa d zapsa do sboru alebo na tandardn vstup pomocou alch funkci. truktra gdFont sli na definovanie vlastnch fontov. Dtov zloky obsahuj daje o pote psmen vo fonte (nchars), slo (kd) prvho psmena (offset), obyajne 32 - medzera. alej truktra obsahuje informciu o vke (h) a rke (w) fontu. Najd1eitejou dtovou zlokou je zloka data obsahujca dan font (dta fontu). K truktre pristupuj funkcie prostrednctvom ukazovatea typu gdFontPtr. V prpade, e nie je treba definova vlastn fonty, nemus sa tto truktra poui, pretoe sa mu pouva u preddefinovan fonty. truktra gdPoint je dleit pri prci s polygnmi. Tto truktra obsahuje iba dve dtov zloky, x a y, ktor vyjadruj x-ov a y-ov sradnicu bodu v obrzku, resp. truktre gdImage. Ukazovateom na truktru gdPoint je gdPointPtr. Na prcu s GD nie je potrebn pozna jej truktry, kee kninica poskytuje mnoho funkci na prcu s nimi a na dodranie programtorskch konvenci je priam iaduce, aby programtori nepristupovali k jednotlivm zlokm priamo, ale sprostredkovane pomocou urench funkci, aby sa tak zamedzila prpadn nekompatibilita v budcnosti s prchodom novch verzi kninice, ke truktry nemusia ma rovnak dtov zloky.

Vytvranie obrzkov a ich uvoovanie z pamte


Zkladnou funkciou na vytvranie obrzkov je funkcia ImageCreate(). Ako parametre sa jej musia zada rka a vka obrzka v pixloch. Po zavolan funkcie je vytvoren przdny obrzok so zadanmi rozmermi. Vytvor sa vlastne truktra gdImage a vrten je ukazovate na u. V PHP je tento ukazovate reprezentovan identifiktorom obrzka typu int, ktor je nvratovou hodnotou funkcie ImageCreate(). Tto nvratov hodnotu je potrebn uchovva pre aliu prcu s obrzkom, pretoe ju vyaduj funkcie GD. V prpade, pouitia verzie GD 2.0.0 a vyej, sa me poui funkcia ImageCreateTrueColor(), ktor je

- 75 -

Zklady jazyka PHP

takmer identick s ImageCreate(), priom sa li iba v tom, e vytvra obrzok True Color, teda so 16 milinmi farieb. alm spsobom, ako vytvori obrzok, je na ta ho zo sboru. Pre tento prpad m GD funkciu ImageCreateFromJpeg(). Jedinm argumentom funkcie je reazec obsahujci meno sboru, z ktorho sa m na ta a vytvori obrzok. V prpade, e sa natanie podar, funkcia vrti identifiktor vytvorenho obrzka. V opanom prpade je identifiktor obrzka przdny, resp. obsahuje przdny reazec. To sa me sta napr. vtedy, ke sbor neobsahuje obrzok v danom formte (v tomto prpade JPEG). Prklad pouitia funkcie ImageCreateFromJpeg(): /* sbor, z ktorho sa nata obrzok JPG */ $subor="image.jpg"; /* vytvorenie obrazka */ $obrazok=ImageCreateFromJpeg($subor); /* ... tu prde kd pre prcu s obrzkom... */ ImageDestroy($obrazok); Na poslednom riadku skriptu je volan funkcia ImageDestroy(), ktor s1i na uvonenie pamte pridelenej obrzku. Ako parameter sa jej odovzdva identifiktor obrzka, ktor m by uvo nen z pamte. Je dleit, aby sa tto funkciu volala vdy, pretoe by po skonen programu zostala zbyto ne obsaden pam. Pam nie je uvoovan automaticky po skonen behu skriptu a preto je potrebn, aby sa korektne uvonili vetky obrzky z pamte funkciou ImageDestroy(). V skripte nie je oetren prpad, ke funkcia ImageCreateFromJpeg() zlyh. To sa me sta v prpade, e sbor neexistuje alebo ke sbor neobsahuje platn obrzok JPEG. Jeden zo spsobov, ako oetri takto prpad: $subor="image.jpg"; $obrazok=@ImageCreateFromJpeg($subor); /*overenie, i identifiktor nie je neplatn */ if(!$obrazok): /* chybov hlsenie */ echo "nastala chyba"; else: echo "OK"; /*... vetko v poriadku, sem prde kd pre prcu s obrzkom ... ktor sa nakoniec uvo n z pamte */ ImageDestroy($obrazok); endif;

- 76 -

Zklady jazyka PHP

Tento kd u spo ahlivo oetruje prpadn chyby, ktor mu vznikn pri volan funkcie ImageCreateFromJpeg(). Obrzok vytvoren funkciou ImageCreateFromJpeg() je vdy True Color, teda so 16 milinmi farieb. Pre vytvorenie obrzka z formtu PNG, sa pouva funkcia ImageCreateFromPNG(). Funkcia je podobn predchdzajcej, takisto potrebuje ako parameter sbor s obrzkom PNG. Nvratovou hodnotou je op identifiktor obrzka, ktorho farebn hbka zvis od farebnej hbky pvodnho obrzka v sbore. V prpade pouitia GD kninice verzie starej ako 1.6, sa me pouva funkciu ImageCreateFromGif() na vytvranie obrzkov zo sborov s obrzkami vo formte GIF. Tto funkcia m op rovnak vlastnosti ako predchdzajce. Skript na natanie vetkch obrzkov typu JPEG, PNG a GIF z adresra, zistenie ich formtu a ich spracovanie:

- 77 -

Zklady jazyka PHP

$adr=opendir('.'); while($sub=readdir($adr)): if(!Is_Dir($sub)): $atr=GetImageSize($sub); switch($atr[2]): case 1: $obr=ImageCreateFromGif($sub); /*kd pre spracovanie obrzka GIF*/ echo $sub. " - GIF<br />"; /*koniec kdu pre spracovanie*/ ImageDestroy($obr); break; case 2: $obr=ImageCreateFromJpeg($sub); /*kd pre spracovanie obrzka JPEG*/ echo $sub. " - JPEG<br />"; /*koniec kdu pre spracovanie*/ ImageDestroy($obr); break; case 3: $obr=ImageCreateFromPng($sub); /*kd pre spracovanie obrzka PNG*/ echo $sub. " - PNG<br />"; /*koniec kdu pre spracovanie*/ ImageDestroy($obr); break; endswitch; endif; endwhile; closedir($adr); Skript najprv zist, i sbor obsahuje obrzok typu JPEG, PNG alebo GIF. Ak no, pomocou prznaku $atr[2] sa zist, o ktor konkrtny typ ide a pod a toho sa kd vetv pre spracovanie prslunho typu obrzka.

Kresliace funkcie GD
Zkladnou jednotkou v obrzku je pixel. Funkcia na nastavenie (kreslenie) pixla ImageSetPixel(), ktor vyaduje tyri argumenty. Prvm je identifiktor obrzka v ktorom sa funkcia pouva. Tento identifiktor je vyadovan kadou kresliacou funkciou GD kninice. Preto vdy pred kreslenm mus by vytvoren obrzok (bu vytvorenm przdneho obrzka priamo v skripte alebo natanm zo sboru). Druhm a tretm argumentom je dan pozcia pixla, priom druh argument predstavuje x-ov sradnicu a tret y-ov. Za poiatok sa povauje av horn roh, ktor m sradnice [0,0]. Pozcia nastavovanho pixla by logicky

- 78 -

Zklady jazyka PHP

nemala prekroi ani jeden z rozmerov obrzka, pretoe hoci skript nevyvol nijak chybov hlsenie, v obrzku nenastan iadne zmeny. Poslednm parametrom funkcie je farba, na ktor m by pixel nastaven. Tento parameter je typu int a zvykne sa odovzdva vo forme premennej, do ktorej sa ulo index farby v palete. Vykreslenie vodorovnej iary dlhej 10 pixlov: /* vytvorenie obrzka */ $obrazok=ImageCreate(100,100); /* vykreslenie iary pomocou cyklu a funkcie ImageSetPixel() */ for ($i=0; $i<10; $i++) ImageSetPixel($obrazok,$i,50,$cierna); /*uvonenie obrzka z pamte*/ ImageDestroy($obrazok); Tento kd vykresl vodorovn iaru od pozcie [0,50] po [10,50]. Na nastavenie jej farby treba priradi premennej $cierna index prslunej farby v palete. Na kreslenie iar v obrzkoch je v GD kninici u preddefinovan funkcia ImageLine(). Tto funkcia umon kresli iary ovea pohodlnejie ako predchdzajca. Prvm parametrom funkcie je identifiktor obrzka, v ktorom treba iaru nakresli. alie dva parametre uruj sradnice v obrzku, kde sa bude iara zana, priom druh parameter predstavuje x-ov sradnicu a tret y-ov sradnicu. alie dva parametre rovnakm spsobom opisuj sradnice konca iary. Poslednm parametrom je index farby, ktorou bude iara nakreslen. Tento index me by nahraden vzorkou tetca, vaka omu sa daj kresli aj vzorkovan iary. Aby sa tento spsob vykresovania iary mohol pouva, mus sa najprv prslun vzor vytvori ako obrzok (je jedno, akm spsobom) a potom zavola funkciu ImageSetBrush(), ktorej prvm parametrom je identifiktor obrzka, v ktorom sa bude dan typ tetca pouva a druhm parametrom je identifiktor obrzka obsahujci iadan tetec. Kee tetec je tie iba obyajnm obrzkom, mal by by vdy po pouit uvonen z pamte. Po uvonen z pamte sa u ale nesmie pouva. Prklad vykresl iaru od sradnice [10,10] po sradnicu [70,70]. Vzorec tetca je natan zo sboru JPG.

- 79 -

Zklady jazyka PHP

/* vytvorenie obrzka */ $obrazok=ImageCreate(100,100); /* na tanie tetca */ $stetec=ImageCreateFromJpeg("stetec.jpg"); /* nastavenie tetca pre obrzok */ ImageSetBrush($obrazok,$stetec); /* vykreslenie iary */ ImageLine($obrazok,10,10,70,70,$Brushed); /* uvonenie tetca z pamte */ ImageDestroy($stetec); /* uvonenie obrzka z pamte */ ImageDestroy($obrazok); Typ tetca sa d tie nastavi pomocou funkcie ImageSetStyle(). T sa li od predchdzajcej tm, e typ tetca nie je nastaven inm obrzkom, ale d sa priamo definova, ktor pixle a akou farbou bud vykreslen. Tento spsob vykresovania iary je nhradou za zastaran typ funkcie ImageDashedLine(). Funkcia ImageSetStyle() vyaduje poda pecifikcie v GD kninici tri parametre - identifiktor obrzka, pole obsahujce pecifikciu pixlov (farby) a poslednm je vekos tohto poa. GD kninica tie umouje kreslenie polygnov. Ide o dvojrozmern tvary, ktor s definovan sradnicami ich vrcholov. Na kreslenie polygnov sa pouva funkcia ImagePolygon(). Jej prvm parametrom je op identifiktor obrzka. alm parametrom je pole celo selnch prvkov, ktor definuj sradnice jednotlivch bodov. Tieto sradnice musia by v poli uloene postupne, vdy najprv x-ov sradnica a za ou y-ov sradnica. Prvm prvkom v poli je x-ov sradnica prvho bodu a druhm prvkom je y-ov sradnica toho istho bodu a tak to pokrauje alej. Definovanie po a 3 bodov, teda pre polygn s tromi vrcholmi (trojuholnk): $body[0]=10; // prv bod [10,10] $body[1]=10; $body[2]=20; // druh bod [20,10] $body[3]=10; $body[4]=15; // prv bod [15,20] $body[5]=20; Tretm parametrom je po et bodov, ktor m polygn obsahova. Mala by to by polovica po tu prvkov po a odovzdvanho ako druh parameter, lebo jeden bod zodpoved prve dvom prvkom v poli. Je mon zada aj menie slo, ne je po et bodov obsiahnutch v poli, o sa me vyui v prpade, ak netreba, aby boli pouit vetky body. Tto hodnota nesmie by niia ako 3, preto6e polygn m minimlne 3 vrcholy. Poslednm parametrom

- 80 -

Zklady jazyka PHP

funkcie ImagePolygon() je farba, ktorou bude polygn nakreslen. Funkcia ImagePolygon() sli na kreslenie nevyplnench polygnov, teda iba na kreslenie ich obrysov. Na kreslenie vyplnench polygnov, sli funkcia ImageFilledPolygon(). pecifikcia a po et parametrov tejto funkcie s plne rovnak ako u funkcie ImagePolygon(), rozdiel spo va iba v tom, e polygn vykreslen funkciou bude aj vyplnen farbou, pecifikovanou poslednm parametrom. Nakreslenie vyplnenho trojuholnka: $obrazok = ImageCreate(100,100); /* sradnice bodov / $body[0]=10; $body[1]=10; $body[2]=20; $body[3]=10; $body[4]=15; $body[5]=20; /* vykreslenie trojuholnka */ ImageFilledPolygon($obrazok,$body,3,$farba); /* uvonenie z pamte */ ImageDestroy($obrazok); pecilnym typom polygnu je obdnik. Na kreslenie obd nikov (resp. tvorcov), sli pecilna funkcia ImageRectangle(). Jej pouitie je vemi jednoduch - vdy sa jej mus ako prv argument odovzda identifiktor obrzka, v ktorom sa m obdnik vykresli. almi parametrami s x-ov sradnica a y-ov sradnica pravho hornho rohu obdnika a za nimi nasleduj sradnice pravho dolnho rohu obdnika v rovnakom porad: najprv x-ov a potom y-ov sradnica. Poslednm parametrom funkcie je farba rmu obdnika. Jednotliv sradnice vykresovanho obdnika nesm prekraova hranice obrzka a ani by menie ako 0. Ak sa tak stane, vykresl sa iba as obdnika, ktor sa zmest na obrzok. Funkcia ImageRectangle() vykresuje iba rm obdnika, priom jeho vntro zostva nezmenen. To je vlastne ekvivalentom tvornsobnho volania funkcie ImageLine() s prslunmi parametrami. Pre vykreslene vyplnenho obdnika, sa mus poui funkcia ImageFilledRectangle. Tto funkcia m8 rovnak poet a pecifikciu parametrov ako funkcia ImageRectangle() . Rozdiel spo va v tom, e obd nik nepozostva iba z rmu, ale je vyplnen farbou, ktor sa zad ako posledn parameter. To znamen, e takto obdnik nebude ma iadny viditen rm, pretoe bude rovnakej farby ako vpl.

- 81 -

Zklady jazyka PHP

Vyplnen obd nik s rmom inej farby: $obrazok=ImageCreate(100,100); /* vykreslenie obsahu obdnika */ ImageFilledRectangle($obrazok,10,10,90,90,$farbal); /* vykreslenie rmu obdnika */ ImageRectangle($obrazok,10,10,90,90,$farba2); ImageDestroy($obrazok); Skript vykresl obdnik s rmom farby definovanej v premennej $farba2 a vplou farby definovanej v premennej $farbal. Najprv sa vykresuje obsah a a potom rm. Je to mone spravi aj opane, ale potom mus by vpl menia, aby nezakryla u nakreslen rm. GD kninica takisto umouje kreslenie oblkov, plnch aj neplnch, vo veobecnosti elipsovitho tvaru. V tomto prpade sa pouva funkcia ImageArc(), ktor op ako prv parameter vyaduje identifiktor obrzka. alie dva parametre charakterizuj stred elipsy (v prpade, e sa m vykresli iba oblk, charakterizuj sradnice stredu elipsy danej pre vykresovan oblk), priom najprv sa zadva x-ov sradnica a potom y-ov. alie dva parametre pecifikuj rozmery elipsy (resp. charakteristickej elipsy pre dan oblk). Najprv sa mus zada rka a nsledne jej vka. almi dvoma parametrami sa uruje, ak as elipsy, resp. ak oblk bude vykreslen. Prv z tchto dvoch parametrov vyjadruje po iaton a druh konen pozciu vykresovanho oblka v stupoch, take by tieto dva parametre mali nadobda hodnoty od 0 do 360. Poiaton pozcia mus by menia ako koncov. V prpade, e koncov pozcia prekro slo 360, je na u pouit opercia modulo 360 (teda za koncov pozciu sa povauje jej zvyok po delen 360). Uhol je uren vzhadom na pomyseln os x v obrzku, teda spomnane parametre uruj vekos uhla zovretho s osou x v smere hodinovch rui iek. Pre vykreslenie kruhu, sta zada rovnak rozmery (rka a vka), poiaton pozciu 0 a koncov pozciu 360. Poslednm parametrom funkcie je op farba, ktorou m by oblk vykreslen. Pre vykreslenie vyplnenej elipsy/oblku, sa mus poui funkcia ImageFilledArc(). Tto funkcia preber vetky parametre od funkcie ImageArc() a pridva ete jeden - tl. Tento posledn parameter zadva funkcii spsob, ktorm m by vyplnen oblk vykreslen pri hodnote 0 bude vykreslen klasick vyplnen oblk, hodnota 1 vyjadruje odseknutie oblkovitej asti kruhu, teda je vykreslen trojuholnk. V poslednom prpade mus by rozdiel medzi koncovou a po iato nou pozciou vykresovanho oblka men ako 180, pretoe inak nie je mone trojuholnk vykresli a na obrzku sa neudej

- 82 -

Zklady jazyka PHP

iadne zmeny. Vie vyuitie m vak prv uveden spsob, ktor sa d vyui naprklad na kreslenie kolovch grafov. Vykreslenie iastky kolovho grafu: $obrazok=ImageCreate(100,100); /* vykreslenie malho dielika kolovho grafu s uhlom 60 stupov */ ImageFilledArc($obrazok,50,50,40,40,30,90,$farba,1); ImageDestroy($obrazok); Ak treba ur it ohranien as obrzka vymaova nejakou farbou, GD kninica umouje takzvan flood fill, o by sa dalo interpretova ako vyliatie farby na jednom bode obrzka, priom farba sa rozleje na vetky strany a pokrauje, km nenaraz na nejak bariru, ktor v tomto prpade predstavuje nejak in farbu. Zkladnou floodovaciou funkciou je ImageFill(), ktorej pouitie je ve mi jednoduch. Sta jej zada identifiktor obrzka ako prv parameter a x-ov a y-ov sradnicu bodu, kde sa m zaa s rozlievanm farby, ako alie dva parametre. Poslednm parametrom je farba, ktor sa m poui na floodovanie. Funkcia vyfarb danou farbou zadan bod (pixel) a vetky priahl body rovnakej farby, ak mal pvodne zadan bod. Na floodovanie je mone miesto jednej farby poui aj vzorku, ktor mus by pred pouitm definovan funkciou ImageSetTile(). Jej pouitie je podobn ako pouitie u spomnanej funkcie ImageSetBrush(). Najprv sa mus vytvori obrzok (napr. natanm zo sboru alebo pomocou funkcie ImageCreate()) a nsledne odovzda tento obrzok funkcii ImageSetTile() ako druh parameter. Prvm parametrom je op obrzok v ktorom sa vzorka pouva. Ke sa u vzorka nebude potrebova, mus sa op uvoni z pamte volanm funkcie ImageDestroy(). Po priraden vzorky danmu obrzku sta miesto farby ako poslednho parametra zada funkcii ImageFill() hodnotu $Tiled (gdTiled poda pecifikcie GD kninice). Vplov vzorka vak nesmie ma transparentn farbu. Ak treba vyplni farbou urit as obrzka, priom sa m pecifikova, ktor farba bude predstavova spomnan bariru pre zastavenie rozlievania, treba poui funkciu ImageFillToBorder(). Prv tri parametre s zhodn s prvmi tromi parametrami funkcie ImageFill(), teda identifiktor obrzka a x-ov a y-ov sradnica bodu vyjadrujceho za iatok, resp. centrum rozlievania. alm parametrom sa vak odliuje. Je nm farba, ktor m znamena bariru pre rozlievanie farby. Tto farba neme by vzorkou, mus by definovan ako obyajn, pevn farba. Poslednm parametrom je farba

- 83 -

Zklady jazyka PHP

vplne, teda rozlievan farba, priom t me by op vzorkou. Vsledkom funkcie je vyfarbenie bodu zadanho sradnicami a vetkch priahlch bodov a po tak body, ktorch farba zodpoved farbe pecifikovanej ako barira. Skript nakresl pln kruh a vymauje jeho vntro inou farbou: $obrazok=ImageCreate(100,100); /* vykreslenie kruhu */ ImageArc($obrazok,50,50,40,40,0,360,$farbal); /* vyplnenie kruhu */ ImageFillToBorder($obrazok,50,50,$farbal,$farba2); ImageDestroy($obrazok); Skript nakresl kruh s okrajom farby $farbal a nsledne ho vypln farbou $farba2 za pomoci funkcie ImageFillToBorder(), priom barirou je prve farba $farbal.

Kreslenie textov
Pre kreslenie textov sa pouvaj funkcie ImageString() a ImageStringUp(), ktor maj plne rovnak parametre. Rozdiel medzi nimi spova v tom, e prv vykresl re azec horizontlne a druh vert iklne. Prvm parametrom je ident ifiktor obrzka, za nm nasleduje font, ktorm m by reazec vykreslen. Zabudovan fonty maj hodnoty v rozpt od 1 po 5. almi dvoma parametrami s x-ov a y-ov sradnica, od ktorch m by re azec vykreslen. Nasleduje samotn re azec, ktor m by vykreslen. Poslednm parametrom je farba, ktorou m by reazec vykreslen. Vykreslenie reazca Text na pozciu [10,10] zabudovanm fontom 3 a farbou uloenou v premennej $farba: ImageString($obrazok,3,10,10,"Text",$farba);

Prca s farbami
Kad obrzok v truktre gdImage v kninici GD m svoju paletu. Tto paleta je vlastne pole indexovan od nuly, ktor obsahuje jednotliv RGB hodnoty pre dan far by v palete. Pri vytvoren obrzka funkciou ImageCreate() je paleta obrzka przdna. Na vytvorenie novej farby v palete sa mus poui funkcia ImageColorAllocate(). Prvm parametrom je identifiktor obrzka, v ktorom sa dan farba nastavuje (alokuje). Nasleduj tri hodnoty, kad v rozpt 0 a 255, ktor predstavuj RGB hodnoty danej farby.

- 84 -

Zklady jazyka PHP

Funkcia vyhad v palete prv von prvok, nastav jeho RGB hodnotu poda jej zadanch parametrov a vrti index tohto prvku. Preto je potrebn tto nvratov hodnotu uchova na alie pouitie v kresliacich funkcich. V prpade, e sa nepodar njs von prvok v palete (to sa me sta hlavne v prpade, e obrzok m len 256 farieb), vrti funkcia hodnotu -1. Pri vytvran novho obrzka prv volanie tejto funkcie po vytvoren obrzka s przdnou paletou funkcia ImageCreate() spsob nastavenie pozadia tohto obrzka, teda alokovane farby s indexom 0. Tto funkcia vak nedb na u existujce farby, take ak farba s rovnakou RGB hodnotou v palete existuje, funkcia ju ignoruje, vdy h ad przdny prvok v palete. Pouitie funkcie ImageColorAllocate(): /* vytvorenie obrzku */ $obr = ImageCreate(100,100); /* nastavenie pozadia na iernu farbu */ $cierna = ImageColorAllocate($obr,0,0,0); /* alokovanie ervenej farby */ $cervena = ImageColorAllocate($obr,255,0,0); /* vykreslenie ervenho tvorca */ ImageFilledRectangle($obr,20,20,80,80,$cervna); /* zmazanie obrzka */ ImageDestroy($obr); Skript vytvor obrzok s rozmermi 100 x 100 pixlov, nastav jeho pozadie na ierne a vykresl do jeho stredu vyplnen erven tvorec. Pri vytvran farieb v palete s obmedzenm potom poloiek me by zbytone neefektvne alokova farby, ktor u v palete existuj. Preto existuje funkcia ImageColorExact(), ktor m rovnak zoznam parametrov ako funkcia ImageColorAllocate(), priom rozdiel spova v tom, e namiesto alokovania novej farby vracia index v palete u existujcej farby. Funkcia vracia index prvej farby v palete, ktorej RGB hodnota je zhodn s tou, ktor je zadan ako parameter. V prpade, e tak farba v palete neexistuje, nvratovou hodnotou je -1. Predchdzajci prklad, zlepen o oetrenie pre prpad, e erven farba v palete u existuje (prakticky sa toto neme sta, kee ide o plne nov obrzok s przdnou paletou). Sta nahradi riadok, kde sa alokuje erven farba, nasledujcim riadkom: if(($cervena=ImageColorExact($obr,255,0,0))==1) $cervena=ImageColorAllocate($obr,255,0,0)

- 85 -

Zklady jazyka PHP

Funkcia ImageColorExact() sa pouije na njdenie farby s RGB hodnotou 255,0,0 a jej nvratov hodnota sa ulo do premennej $cervena. Tto premenna je hne testovan na rovnos s -1 a ak je podmienka splnen, znamen to, e funkcii sa nepodarilo njs dan farbu, a teda je volan funkcia ImageColorAllocate(), ktorej nvratov hodnota sa op ulo do premennej $cervena. Me sa vak sta, e funkcia ImageColorExact() nemus by vo svojom hadan spen a nov farba aj napriek tomu neme by alokovan. Sta vak njs farbu, ktor je podobn tej, ktor je zadan pomocou RGB hodnt. Pre tento prpad sa pouva funkcia ImageColorClosest(). Tto funkcia m op rovnak zoznam aj typy parametrov ako predchdzajce dve. Rozdiel spova v tom, e tto funkcia prejde cel paletu a had najpodobnejiu farbu k farbe zadanej parametrami ako RGB hodnotu. V prpade, e v palete ete neboli alokovan iadne farby, vrti funkcia -1, inak vrti index najpodobnejej farby. Tto funkcia me by pouit naprklad vtedy, ke zlyhaj ImageColorExact() alebo ImageColorAllocate(), o sa me sta v prpade, ke je paleta u pln a iadan farba so iadanou RGB hodnotou v nej neexistuje. Doplnenie predchdzajceho prkladu: if(Scervena=ImageColorExact($obr,255,0,0))==-1): if((Scervena=ImageColorAllocate($obr,255,0,0))==-1) $cervena=ImageColorClosest(Sobr,255,0,0); endif; Tu v prpade, e zlyh vyhadanie farby so iadanou RGB hodnotou a zlyh aj alokovanie novej farby, je vyhadan farba najpodobnejia iadanej farbe. To znamen, e tmto spsobom bude uloen do premennej $cervena vdy nejak farba v zvislost i od palet y, take po tomto oetren sa me tto premenn ako farba bezpe ne pouva . Tento spsob oetrovania sprvneho vyhadania farby je dos akopdny. Preto je tu funkcia ImageColorResolve(). Zoznam a typ parametrov je op rovnak ako pri predchdzajcich funkcich, teda identifiktor obrzka a tri seln hodnoty predstavujce RGB hodnotu danej farby. Tto funkcia sa najprv poksi njs farbu s danou RGB hodnotou v palete. Ak uspeje, vrti jej index, inak sa poksi alokova nov farbu so iadanou RGB hodnotou. V prpade spechu vrti index novovytvorenej farby, v opanom prpade vyhad najpodobnejiu farbu (ako funkcia ImageColorClosest()) a vrti jej index.

- 86 -

Zklady jazyka PHP

$cervena = ImageColorResolve($obr,255,0,0);

alie funkcie pre prcu s farbami


Funkcia ImageColorsTotal() m jeden parameter, ktorm je identifiktor obrzka. Vracia poet alokovanch farieb v palete danho obrzka. Funkcie ImageColorRed(), ImageColorGreen() a ImageColorBlue() potrebuj dva parametre, identifiktor obrzka a farbu (index farby). Vrtia prslun hodnotu zloky RGB (erven, zelen, modr) farby danej parametrom. Funkcii ImageGetTransparent() sa odovzdva ako parameter identifiktor obrzka a ona vrti index farby, ktor je definovan ako transparentn. V prpade, e iadna farba v palete nie je definovan ako transparentn, vrti funkcia hodnotu -1. Funkcia ImageColorDeallocate()uvon v obrzku, ktor sa jej zad ako prv parameter, index farby, ktor sa jej zad ako druh parameter.

Koprovanie a zmena vekosti


Na koprovanie obrzka alebo jeho obd nikovej asti sli funkcia ImageCopy() . Tto funkcia m dlh zoznam parametrov: prvm je identifiktor obrzka, do ktorho sa bude koprova, teda cie. Druhm je identifiktor zdrojovho obrzka. Nasleduj x-ov a yov sradnica bodu v cieli, od ktorho bude koprovan as vykreslen. almi parametrami s x-ov a y-ov sradnica bodu v zdroji, ktor znamen poiaton bod koprovanho obdnika a nakoniec dka a rka koprovanho obdnika. Cie a zdroj me by aj ten ist obrzok, ale iba v prpade, e sa koprovan obdnik nekryje s cieovm obdnikom. Na zistenie vekosti obrzka slia funkcie ImageSX() a ImageSY(), ktorm sa odovzdva ako jedin parameter identifiktor obrzka a ako nvratov hodnota je rku, resp. vka obrzka. Pouitie funkcie ImageCopy() na skoprovanie asti obrzka do inho obrzka:

- 87 -

Zklady jazyka PHP

/* vytvorenie dvoch obrzkov */ $zdroj=ImageCreate(100,100); $ciel=ImageCreate(50,50); /* nastavenie pozadia na bielu farbu */ $biela=ImageColorAllocate($zdroj,255,255,255); $biela=ImageColorAllocate($ciel,255,255,255); /* erven tvorec na zdroj */ $cervena=ImageColorAllocate($zdroj,255,0,0); ImageFilledRectangle($zdroj,20,20,80,80,$cervena); /* skoprovanie obrzka */ ImageCopy($ciel,$zdroj,0,0,20,20,ImageSX($ciel), ImageSY($ciel)); /* uvonenie obrzkov z pamte */ ImageDestroy(Szdroj); ImageDestroy($ciel); Skript vytvor najprv dva obrzky: $zdroj s vekosou 100 x 100 pixlov a $ciel s vekosou 50 x 50 pixlov. Nsledne sa nastav farba pozadia oboch obrzkov na bielu. Potom je na zdrojov obrzok vykreslen erven tvorec. Nasleduje pouitie funkcie ImageCopy(). Zo zdroja sa skopruje obrzok od pozcie [20,20] vekosti rovnakej, ak m cie (vekos sa zisuje pomocou funkcii ImageSX() a ImageSY()) a vykresl tto oblas do ciea od pozcie [0,0]. Vsledkom bude to, e $ciel bude obsahova erven tvorec vekosti presne rovnej vekosti obrzka. Nebude vidie ni z jeho bieleho pozadia. V cieovom obrzku je tvorec vykreslen rovnakou farbou ako v zdrojovom, aj ke v cieovom obrzku tto farba nebola vbec alokovan. Je to tak preto, e tto funkcia pri koprovan vdy had v palete cieovho obrzka pixle s RGB hodnotou totonou s RGB hodnotou pixlov v zdrojovom obrzku. V prpade, e sa to nepodar, poksi sa funkcia dan farbu alokova. Ak sa nepodar ani to, je njden najpodobnejia farba. Na zmenu vekosti obrzka pri koprovan poskytuje GD kninica funkciu ImageCopyResized(). Tto funkcia m rovnak zoznam parametrov ako funkcia

ImageCopy(), ale pridva k nemu ete dva - rku a vku koprovanho obrzka v cieovom obrzku. To znamen, e obrzok sa me zvova aj zmenova, sta zada vku a rku v cieovom obrzku viu (resp. meniu pri zmenovan), ako bola vekos koprovanej plochy v zdroji. Skoprovanie celho zdrojovho obrzka v predchdzajcom prklade a zmenenie na vekos cieovho obrzka (nahradenie riadku s funkciou ImageCopy()): ImageCopyResized($ciel,$zdroj,0,0,0,0, ImageSX($ciel),ImageSY($ciel),ImageSX(Szdroj), ImageSY($zdroj))

- 88 -

Zklady jazyka PHP

Tto funkcia sa pri koprovan sprva podobne ako ImageCopy() - vyhadva pixle s rovnakou RGB hodnotou a pri nespechu postupuje podobne, teda sksi alokova nov farbu alebo njs najpodobnejiu farbu, ie vyuva ImageColorResolve(). V prpade prce s True Color obrzkami, sa me pri ich zv ovan a zmenovan pouif funkcia ImageCopyResampled(). Tto funkcia funguje podobne ako ImageCopyResized(), m aj rovnak zoznam a typy parametrov. Rozdiel spova v tom, e pri zmene vekosti obrzka m vsledn obrzok lepiu kvalitu ako pri pouit ImageCopyResized(). pecilnou funkciou na koprovanie obrzkov je ImageCopyMerge(). Funkcia sli na ,,splynutie" koprovanho a pvodnho obrzka. M rovnak zoznam a typy parametrov ako funkcia ImageCopy(), ale pridva k nemu ete jeden - percentulny podiel splynutia. Pri nastaven tejto hodnoty na 100 bude vsledok funkcie rovnak ako pri pouit ImageCopy(). Skoprovan obrzok bude vykreslen presne tak, ako bol v zdroji. Tto funkcia me byt vyuit na zvrazovanie asti cieovho obrzka skoprovanm jednofarebnho obdnika funkciou ImageCopyMerge() a zadanm 50 ako poslednho parametra. Poslednou funkciou, v svislosti s koprovanm obrzkov, je ImagePaletteCopy(). Jej pouitie je uiton vtedy, ke treba skoprova paletu jednho obrzka do druhho. Identifiktor cieovho obrzka sa zadva ako prv parameter a identifiktor zdroja ako druh parameter.

Ukladanie obrzkov
Na ukladanie vo formte JPEG je k dispozcii funkcia ImageJpeg(). Funkcia m tri parametre. Prvm je identifiktor obrzka. Nasleduje sbor, do ktorho sa m uloi obrzok. Ak subor u existuje, skript ho prepe. Poslednm parametrom funkcie je koeficient kvality, ktor by sa mal pohybova v rozmedz od 0 po 95. Ak je tento koeficient zporn, pouije sa implicitn hodnota, ktor poskytuje dobr kvalitu pri nzkom objeme vslednho sboru. GD kninica podporuje aj prekladan reim obrzkov. Prekladan reim obrzka, ktor je ete v pamti, sa me nastavi funkciou ImageInterlace(). Ako prv parameter sa jej zad identifiktor obrzka a druhm parametrom je slo, ktor identifikuje,

- 89 -

Zklady jazyka PHP

i sa m prekladan reim nastavi alebo zrui. Hodnota 0 znamen vypnutie prekladanho reimu, nenulov hodnota jeho zapnutie. /* vytvorenie obrzka */ $obrazok=ImageCreate(100,100); /* kd pre prcu s obrzkom, kreslenie at .. */ /* nastavenie prekladanho reimu */ ImageInterlace($obrazok,1); /* uloenie obrzka na disk */ ImageJpeg($obrazok, "obrazok.jpg",-1); /* uvonenie obrzka z pamte */ ImageDestroy($obrazok); Skript vytvor obrzok s vekosou 100 x 100 pixlov v pamti. Nsledne by tam miesto komentra mal byt' kd, ktor nejakm spsobom pracuje s obrzkom - kresl, kopruje, men vekos at. Potom funkciou ImageInterlace() nastav prekladan reim. Potom ulo obrzok na disk do sboru obrazok.jpg vo formte JPEG v implicitnej kvalite (parameter -1). Nakoniec treba uvo ni pam funkciou ImageDestroy(). Na uloenie obrzka vo formte PNG sli funkcia ImagePng(). Jej pouitie je o nieo jednoduchie ako pouitie funkcie ImageJpeg(). M iba dva parametre. Prvm je identifiktor obrzka a druhm nzov sboru, do ktorho sa m uklada. Pri tomto formte sa me poui aj prekladan reim a to rovnakm spsobom ako pri formte JPEG, teda pouitm funkcie ImageInterlace(). Ak to verzia GD kninice podporuje, daj sa uklada aj obrzky vo formte GIF pomocou funkcie ImageGif(). Tto funkcia je podobn funkcii ImagePng(), takisto sa jej mus odovzda ako prv parameter identifiktor ukladanho obrzka a ako druh parameter nzov sboru, do ktorho m by obrzok uloen.

Vykresovanie na tandardn vstup


Pri zpise na tandardn vstup sa nesmie zabudn na zaslanie hlavi kovej informcie o obsahu dt prehliadau. Toto sa zabezpe pouitm funkcie header() a zaslanm parametra content-type. Jeho hodnota zvis od pouitho grafickho formtu, pre obrzky JPEG to bude image/jpeg, pre PNG image/png a pre GIF image/gif. header ("content-type: image/jpeg");

- 90 -

Zklady jazyka PHP

Posielanie obrzkov na tandardn vstup je vemi jednoduch, vlastne funguje vaka rovnakm funkcim ako zpis do sborov, s tm rozdielom, e druh parameter (nzov sboru) sa vynech. Funkcii sa teda odovzdva iba jedin parameter a tm je identifiktor obrzka, ktor sa m vykresli. V prpade funkcie ImageJpeg() sa odovzdva takisto iba jeden parameter, identifiktor obrzka, take sa vynech nielen nzov sboru, ale aj koeficient kvality. V tomto prpade je pouit implicitn koeficient. Predchdzajci prklad prepracovan tak, aby bol obrzok hne zobrazen v prehliadai: /* zaslanie hlavi ky */ header("content-type: image/jpeg"); /* vytvorenie obrzka */ $obrazok=ImageCreate(100,100); /*... kd pre prcu s obrzkom, kreslenie at . ...*/ /* nastavenie prekladanho reimu */ ImageInterlace($obrazok,l); /* vykreslenie obrzka na vstup */ ImageJpeg($obrazok); /* uvonenie obrzka z pamte */ ImageDestroy($obrazok); Skript vykresl obrzok priamo na vstup bez ukladania na disk. Tmto spsobom sa daj vklada obrzky kreslen pomocou PHP skriptov do XHTML dokumentov priamo do elementu <img />. Ako hodnota atribtu src sa odovzd cesta ku skriptu, ktor obrzok vykresuje. Nesmie sa vak zabudn na to, aby tento skript sprvne odoslal hlaviku a aby sa poas behu skriptu nevyskytla chyba, ktor by zaslala ako vstup nejak chybov alebo varovn hlsenie. Vhodou takhoto prstupu je fakt, e skript vykresujci obrzok je plnohodnotnm PHP skriptom, ktormu sa m zasiela parametre. Na zklade nich potom me skript meni vstup, priom element <img /> bude stle odkazova na rovnak sbor. Pokia treba obs obmedzenie, e pri vykresovan JPEG obrzka na vstup sa ned nastavi kvalita obrzka, me sa toto obmedzenie obs tak, e vytvoren obrzok sa najprv ulo na disk a nsledne sa nata obsah vytvorenho sboru a odole na tandardn vstup.

- 91 -

Zklady jazyka PHP

/* zaslanie hlavi ky */ header("content-type: image/jpeg"); /* vytvorenie obrzka */ $obrazok=ImageCreate(100,100); /*... kd pre prcu s obrzkom, kreslenie at . ...*/ /* nastavenie prekladanho reimu */ ImageInterlace($obrazok,1); /* vykreslenie obrzka do sboru */ ImageJpeg($obrazok,"obrazok.jpg",50); /* uvonenie obrzka z pamte */ ImageDestroy($obrazok); /* zaslanie obsahu sboru na vstup */ readfile("obrazok.jpg"); /* zmazanie sboru */ unlink("obrazok.jpg"); Obrzok je najprv uloen na disk do sboru obrazok.jpg s koeficientom kvality 50. Nsledne sa sbor natal a jeho obsah zale na tandardn vstup funkciou readfile(). Nakoniec sa sbor zmae.

- 92 -

Zklady jazyka PHP

Obsah
Vkladanie PHP do XHTML ...................................................................................................1 Kombincia PHP s XHTML kdom ....................................................................................2 Jednoduch prca s formulrmi .........................................................................................4 Syntax jazyka PHP .................................................................................................................5 Ladenie skriptov a oetrovanie chb.......................................................................................7 Syntaktick chyby ...............................................................................................................7 Logick chyby .....................................................................................................................7 Oetrenie chb ....................................................................................................................8 Premenn, polia, vrazy, vetvenie, cykly................................................................................9 Premenn ...........................................................................................................................9 Typ integer .....................................................................................................................9 Typ double ...................................................................................................................10 Typ string .....................................................................................................................10 Polia ................................................................................................................................12 Inicializcia poa ..........................................................................................................12 Funkcie pre prcu s poom ...........................................................................................13 Viacrozmern polia ......................................................................................................14 Pretypovanie premennch.................................................................................................14 Vrazy ..............................................................................................................................15 Matematick opertory .................................................................................................16 Opertory na manipulciu s bitmi sla .........................................................................17 Logick vrazy a opertory...........................................................................................18 Opertor na spjanie reazcov.......................................................................................20 Podmienen opertor....................................................................................................20 Priorita opertorov........................................................................................................20 Vetvenie............................................................................................................................22 Prkaz if........................................................................................................................22 Prkaz if-else.................................................................................................................23 Prkaz if-elseif-else .......................................................................................................25 Prkaz switch ................................................................................................................26 Cykly ................................................................................................................................28 Prkaz while..................................................................................................................28 Cyklus do-while ...........................................................................................................28 Cyklus for.....................................................................................................................29 Prkazy na natanie skriptov, defincia vlastnch funkci .....................................................31 Prkazy na natanie skriptov............................................................................................31 Prkaz require ...............................................................................................................31 Prkaz include...............................................................................................................32 Defincia vlastnch funkci................................................................................................32 Rozsah platnosti premennch .......................................................................................33 tandardn hodnoty parametrov....................................................................................34 Statick premenn ........................................................................................................35 Funkn formulre ...............................................................................................................36 Vstupn pole .....................................................................................................................37 Odoslanie formulra ........................................................................................................37 Zakrtvacie polia ............................................................................................................38 Prepnacie tlaidl ...........................................................................................................40

- 93 -

Zklady jazyka PHP

Zoznamy ...........................................................................................................................40 Formulre na rovni ........................................................................................................42 Spoluprca PHP s databzami ..............................................................................................46 vod do jazyka SQL vytvorenie tabuky; pridanie, mazanie, modifikcia zznamu...........49 Vytvorenie tabuky............................................................................................................49 Pridanie novho zznamu .................................................................................................50 Vber a prezeranie zznamov ...........................................................................................50 Mazanie zznamov v tabuke ............................................................................................51 Modifikcia zznamu v tabuke ........................................................................................52 Zaleovanie SQL do skriptov ..........................................................................................52 Manipulcia s dtami pomocou prehliadaa..........................................................................57 Prca so sbormi v PHP .......................................................................................................66 Zkladn funkcie ..............................................................................................................66 alie funkcie na prcu so sbormi ..................................................................................67 Systmov funkcie .............................................................................................................69 alie monosti tania sborov .......................................................................................70 Problmy pri paralelnej prci so sbormi.........................................................................71 PHP a obrzky......................................................................................................................73 Funkcia GetImageSize() ...................................................................................................73 vod do GD .....................................................................................................................75 Vytvranie obrzkov a ich uvoovanie z pamte .........................................................75 Kresliace funkcie GD ...................................................................................................78 Kreslenie textov............................................................................................................84 Prca s farbami .............................................................................................................84 alie funkcie pre prcu s farbami................................................................................87 Koprovanie a zmena vekosti ......................................................................................87 Ukladanie obrzkov......................................................................................................89 Vykresovanie na tandardn vstup ............................................................................90 Obsah...................................................................................................................................93

- 94 -

Zoznam bibliografickch odkazov


(1) Kosek Ji: PHP: Tvorba interaktivnch internetovch aplikac. Grada 1999, 490 s. ISBN 80-7169-373-1 (2) Ullman Larry: PHP: pokroil programovn pro World Wide Web. Softpress 2003, 512 s. ISBN 80-86497-36-4 (3) Gilmore W. Jason: PHP MySQL 5: Kompendium znalost pro zatenky i profesionly. Zoner Press 2007, 864 s. ISBN 80-86815-53-6

Poznmky

Autor Nzov Uren Vydanie Dostupnos Rozsah Tla Vydan

Ing. Andrej Trnka Zklady jazyka PHP Pre KI FPV UCM 1. vydanie http://ki.fpv.ucm.sk/skripta 94 strn UCM Trnava Janur 2008

ISBN 978-80-89220-99-1

ISBN 978-80-89220-99-1

You might also like