104
UNIVERZITA SV. CYRILA A METODA V TRNAVE FAKULTA PRÍRODNÝCH VIED – KATEDRA INFORMATIKY ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– Andrej Trnka Základy jazyka PHP Trnava 2008 Vydala Univerzita sv. Cyrila a Metoda v Trnave

Zaklady Php

Embed Size (px)

Citation preview

UNIVERZITA SV. CYRILA A METODA V TRNAVE

FAKULTA PRÍRODNÝCH VIED – KATEDRA INFORMATIKY –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Andrej Trnka

Základy jazyka PHP

Trnava 2008 Vydala Univerzita sv. Cyrila a Metoda v Trnave

UNIVERZITA SV. CYRILA A METODA V TRNAVE

FAKULTA PRÍRODNÝCH VIED – KATEDRA INFORMATIKY –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––

Andrej Trnka

Základy 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, určené pre predmet Internet a programovanie. ISBN 978-80-89220-99-1

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 1 -

Vkladanie PHP do XHTML Skripty v PHP sú obyčajné XHTML stránky doplnené o výkonné príkazy. Aby server od seba

odlíšil obyčajné XHTML stránky a stránky zapísané v PHP, ukladajú sa PHP skripty do

súborov so zvláštnou príponou. Táto prípona býva najčastejšie .phtml, .php3 alebo .php

– záleží na konfigurácii servera.

Pokiaľ WWW server obdrží požiadavku na súbor, ktorý končí na niektorú z uvedených

prípon, pošle požiadavku systému PHP. Ten sa postará o vykonanie všetkých príkazov

uložených v súbore a výsledok pošle späť serveru. Server výslednú stránku odošle ako

odpoveď klientovi.

<? PHPInfo(); ?> Súbor sa musí uložiť do adresára, ktorý je súčasťou stromu dokumentov WWW servera.

Tento adresár je na každom systéme iný.

Skript sa musí v prehliadači vždy vyvolať pomocou jeho URL adresy, ktorá môže vyzerať

napr. http://www.domena.sk/skripty/prvy.php alebo napr. http://localhost/prvy.php. Skript sa

nesmie v prehliadači otvárať ako súbor priamo z disku. Pokiaľ sa v prehliadači zadá ako URL

dokumentu iba cesta k súboru – napr. d:\www\php\prvy.php, nezobrazí sa výsledok skriptu.

Skript musí byť pred zaslaním interpretovaný systémom PHP. Interpret je vyvolaný iba

v prípade, kedy sa k dokumentu (skriptu) pristupuje cez WWW server, t.j. pomocou URL,

ktoré začína na http.

Skript obsahoval funkciu PHPInfo, ktorá vygeneruje informácie o celom systéme. Je to

trochu netypická funkcia, pretože vygeneruje celú webovú stránku.

Dvojica znakov <? a ?>, vo vnútri ktorých je príkaz uzavretý, slúži na oddelenie príkazov

PHP od XHTML kódu. PHP interpretuje iba príkazy uvedené medzi týmito značkami.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 2 -

Kombinácia PHP s XHTML kódom

Stránka spočíta, koľko je 2+3.

... <head> <title>Sčítanie</title> </head> <body> <h1>Sčítanie 2+3</h1> <? $a=2; $b=3; $c=$a+$b; echo "$a+$b=$c"; ?> </body> </html> V skripte sú použité tri premenné $a, $b a $c. Do premenných sa môžu priraďovať rôzne

hodnoty a vzájomne sa kombinovať pomocou matematických operácií. Príkaz echo slúži na

výpis textu za ním uvedeného.

Výsledné zobrazenie obsahuje nadpis a pod ním výpočet 2+3=5. Zdrojový text stránky, ktorá

dorazila do prehliadača, je čisté XHTML. Všetky príkazy PHP sú na serveri vykonané

a výsledkom je čisté XHTML, ktoré sa zobrazí v prehliadači.

V PHP nie je problém doplniť stránku o zobrazenie aktuálneho času.

... <head> <title>Čas</title> </head> <body> <div align="center"> <h1>Vitajte na serveri</h1> Prihlásený od <? echo date("H:i"); ?> </div> </body> </html> Všetko obstará funkcia date(), ktorej parametrom je požadovaný formát zobrazenia času.

H:i spôsobí vypísanie hodín a minút oddelených dvojbodkou.

Pri vytváraní stránky, kde sa nejaké úseky XHTML opakujú, sa môžu na uľahčenie práce

použiť cykly.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 3 -

... <head> <title>Stránka plná nadpisov</title> </head> <body> <h1>Stránka plná nadpisov</h1> <? for ($i=1; $i<=7; $i++): ?> <p><font size="<? echo $i ?>">Ukážkový text</font></p> <? endfor ?> </body> </html> ... <head> <title>Stránka plná nadpisov</title> </head> <body> <h1>Stránka 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 prehliadača ako omnoho dlhšia stránka v XHTML:

... <head> <title>Stránka plná nadpisov</title> </head> <body> <h1>Stránka plná nadpisov</h1> <p><font size="1">Ukážkový text</font></p> <p><font size="2">Ukážkový text</font></p> ... <p><font size="7">Ukážkový text</font></p> </body> </html>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 4 -

Jednoduchá práca s formulármi

Pomocou formulárov môžu používatelia na stránkach zadávať objednávky, klásť dotazy na

rôzne databázy apod. K formuláru musí existovať skript, ktorý používateľom zadané údaje

spracuje a na ich základe poskytne používateľovi adekvátnu odozvu.

Používateľ do formulára 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 formulára" /> </form> ... Obsah atribútu action určuje skript, ktorý bude vyvolaný pre obsluhu dát formulára. Skript

obsluha.php sa vyvolá potom, čo používateľ vyplní formulár a odošle ho stlačením

tlačítka Odoslanie formulára.

... <head> <title>Obsluha formulára</title> </head> <body> <h1>Výsledok formulára</h1> <? echo $meno ?> je <? if ($vek<10): echo "ešte dieťa"; elseif ($vek<20): echo "$vek násťročný"; elseif ($vek<40): echo "dospelý"; elseif ($vek<60): echo "v najlepších rokoch"; elseif ($vek<100): echo "pravdepodobne prarodič"; else: echo "niekde medzi stovkou a smrťou"; endif; ?>. </body> </html> V skripte je obsah polí prístupný pomocou premenných. Meno a vek používateľa sú dostupné

v premenných $meno a $vek. Pomocou podmienok potom skript v závislosti na zadanom

veku vyberie správny text, ktorý vypíše.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 5 -

Syntax jazyka PHP Ako v každom programovacom jazyku aj v PHP je každý program (skript) zložený zo

sekvencie príkazov. Ich syntax sa dosť podobá jazyku C. Každý príkaz sa môže uviesť

samostatne medzi znaky <? a ?>.

<? $premenna=20 ?> <? echo $premenna ?> Druhou možnosťou je uviesť viac príkazov naraz. V tomto prípade však musia byť oddelené

pomocou bodkočiarky:

<? $premenna=20; echo $premenna; ?> Medzi príkazy sa môže vkladať ľubovoľný počet medzier, tabelátorov a koncov riadkov. Toto

sa s výhodou využíva na prehľadnejšie sformátovanie zdrojového textu:

<? $premenna=20; echo $premenna; ?> Ďalšou podstatnou vlastnosťou každého jazyka je, ako reaguje na malé a veľké písmená.

V PHP sa môžu použiť pre zápis príkazov a funkcií ľubovoľné písmená – malé, veľké alebo

ich kombinácia. Je teda jedno, či sa zapíše echo, Echo alebo ECHO.

Na veľkosti písmen záleží iba v názvoch premenných. $Premenna, $premenna,

$PREMENNA a $preMENNA sú štyri rôzne premenné.

V názvoch premenných sa môžu okrem ľubovoľných písmen používať i podčiarnik a číslice.

Prvý znak názvu premennej však musí byť iba písmeno alebo podčiarnik. Prípustnými

názvami premenných sú teda $_ahoj, $Prva_Premenna, $citac0. Neprípustná je však

napríklad premenná $1x, pretože začína číslicou.

U dlhších skriptov, ktoré používajú nie úplne zrejmé programátorské obraty, je vhodné

niektoré miesta okomentovať pomocou komentárov. Komentár nijako neovplyvňuje program,

je iba pomôckou pre tých, ktorí budú program čítať.

V PHP sa používajú dva druhy komentárov. Pre kratšie poznámky je vhodné použiť komentár

‘//‘. Všetko od tejto dvojice znakov až do konca riadku, je v skripte ignorované.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 6 -

<? $premenna=20; //Priradenie do premennej echo $premenna; //Vypísanie obsahu premennej ?> Druhý druh komentára nájde uplatnenie hlavne pre dlhšie poznámky. Všetko medzi dvojicami

znakov ‘/*’ a ‘*/’ sa považuje za komentár. Tento druh komentára môže zaberať aj viac

riadkov.

<? /*Nasledujúci skript je dielom XYZ. Tu pokračuje komentár*/ $premenna=20; echo $premenna; ?>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 7 -

Ladenie skriptov a ošetrovanie chýb

Syntaktické chyby

PHP je interpretovaný jazyk. Asi najväčšou výhodou je veľká rýchlosť vývoja aplikácií. Stačí

napísať skript a pozrieť si jeho výsledok v prehliadači. Na rozdiel od jazykov, ktoré sa musia

prekladať do strojového kódu, je to nesmierna úspora času – nemusí sa spúšťať kompilátor

a linker.

Na druhú stranu kompilátor odhalí všetky syntaktické chyby, ako sú skomolené názvy

premenných a funkcií, zabudnuté bodkočiarky medzi príkazmi či reťazce neuzatvorené do

úvodzoviek. PHP podobné chyby odhalí až pri samotnom vykonávaní skriptu. Keď PHP na

nejakú syntaktickú chybu narazí, vypíše chybové hlásenie a preruší beh skriptu.

1 <? 2 $x = 10; 3 $y = 20 4 echo $x+$y; 5 ?> Výpis chyby: Parse error: parse error in skript.php on line 4. Z hlásenia je jasné, že ide o syntaktickú chybu (Parse error), v akom je skripte a na akom

riadku. Na prvý pohľad je chyba jasná – za príkazom $y = 20 chýba bodkočiarka, ktorá by

príkaz ukončila. Chyba je síce na riadku 3, aj keď PHP hlási chybu na riadku 4. Vysvetlenie

je jednoduché. Na treťom riadku nie je nič zle. Na ďalšom riadku totiž môže pokračovať

výraz, ktorý priraďuje hodnotu do premennej $y. Na štvrtom riadku PHP však zistí, že výraz

nepokračuje ani nie je ukončený bodkočiarkou, ale z ničoho nič sa objavil príkaz echo, ktorý

tu nemá čo robiť. PHP preto ohlási chybu.

Keď PHP ohlási, že je na nejakom riadku chyba, chyba môže byť kľudne na niektorom

z predchádzajúcich riadkov.

Logické chyby

Odhalenie syntaktických chýb je väčšinou jednoduché. Interpret PHP sa na prvej syntaktickej

chybe v skripte zastaví a vypíše hlásenie, ktoré pomôže veľmi rýchlo lokalizovať príčinu

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 8 -

chyby. Omnoho horšie sú logické chyby. Tie PHP ťažko zistí, pretože nemôže vedieť, čo chce

programátor naprogramovať.

V PHP sa chyby najčastejšie zapríčinia použitím neinicializovaných premenných a zámenou

operátora priradenia ‘=’ a porovnania ‘==’.

V PHP sa nemusia premenné pred ich použitím deklarovať. Ľahko sa však stane, že premenná

pred jej použitím nie je zinicializovaná. Pomocou konfiguračnej direktívy

error_reporting=15 v php.ini súbore sa môže aktivovať vypisovanie varovných

hlásení. Zároveň sa vypisujú aj varovania medzi ktoré patrí aj nezinicializovanie premenných.

Pri vývoji aplikácie sa odporúča túto voľbu používať a po odladení aplikácie ju vypnúť.

Ak skript nerobí to, čo by mal a nie je vidieť žiadna chyba, môže sa na rôznych miestach

skriptu použiť funkcia echo a vypisovať si obsahy premenných, ktoré sú dôležité pre

riadenie chodu skriptu. Tak sa dá zistiť, že niektorá premenná v danú chvíľu obsahuje inú

hodnotu ako by mala a z toho sa dá usúdiť miesto chyby.

Ošetrenie chýb

Pri volaní funkcií v PHP môže dôjsť k chybe – napríklad neexistuje súbor, ktorý je treba

otvoriť, nedá sa spojiť s databázovým serverom, z ktorého sa čítajú údaje apod. V tomto

prípade PHP do vygenerovanej stránky vypíše chybové hlásenie. Profesionálne napísané

aplikácie by mali používateľa od týchto hlásení odtieniť. Preto je možné v PHP vypnúť

generovanie chybových hlásení.

Aby nebolo nejakou funkciou generované chybové hlásenie, zapíše sa pred jej volanie zavináč

‘@’. Či došlo k chybe, musí ošetriť programátor. Väčšinou sa využije to, že neúspešne

vykonaná funkcia vracia hodnotu false.

$fp=@fopen("subor.txt","r"); if (!$fp): echo "Nepodarilo sa otvoriť dátový súbor. Kontaktujte správcu aplikácie!!!\n"; exit; endif; Ak jeden príkaz volá viac funkcií, môže sa potlačiť vypisovanie chybových správ uvedením

znaku ‘@’ na začiatok príkazu:

@$line=fget($fp1,512).fget($fp2,512).fget($fp3,512)

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 9 -

Premenné, polia, výrazy, vetvenie, cykly

Premenné

Premenné slúžia na uchovávanie hodnôt, ktoré sa používajú v skriptoch. Premenné začínajú

znakom ‘$’, po ktorom nasleduje meno premennej. V PHP nie je treba premenné deklarovať

vopred. Premenná je deklarovaná okamihom, kedy sa prvýkrát použije. Pokiaľ sa do

premennej nič neuloží priraďovacím príkazom, má premenná obsah prázdneho reťazca.

Pred použitím premennej by sa mala do nej uložiť nejaká hodnotu. Obsah premennej sa dá

nastaviť parametrom zadaným za URL. Napr. URL končiace na ?x=10 priradí premennej $x

hodnotu 10. Skript potom nemusí pracovať správne, pokiaľ programátor predpokladá, že v $x

je prázdny reťazec.

V okamihu priradenia do premennej sa automaticky určí jej typ. V PHP je k dispozícii 5

typov:

integer celé číslo

double desatinné číslo

string znakový reťazec

array pole

object objekt

Automatické rozpoznanie typov:

$a=5; // $a je celé číslo $b=5.0; // $b je desatinné číslo $c="5"; // $c je znakový reťazec Jednotlivé typy premenných sa podľa potreby konvertujú na vhodný typ.

Typ integer

Celé čísla majú rozsah od -2 147 483 648 do +2 147 483 647. Celočíselné konštanty sa

zapisujú ako čísla v desiatkovej sústave prípadne doplnené o znamienko.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 10 -

Číselné konštanty sa môžu zapisovať aj v šestnástkovej sústave. Musí sa pred ne ale pridať

dvojica znakov 0x alebo 0X. Pri zápise šesťnástkových číslic sa môžu používať malé a veľké

písmená ‘A’-‘F’.

$p=0xff; // v $p bude hodnota 255 $q=0x12345678; // v $q bude hodnota 305419896 V šesťnástkovej sústave akceptuje PHP iba čísla v rozsahu od 0x0 do 0x7fffffff.

Ostatné šesťnástkové čísla považuje za nulu.

V PHP sa môže použiť aj osmičková sústava. Pokiaľ sa na začiatku číselnej konštanty uvedie

0, považuje sa za číslo v osmičkovej sústave. Zápis 0333 je teda osmičková reprezentácia

čísla 219.

Typ double

Desatinné čísla sú v PHP reprezentované ako typ double. Jeho rozsah je približne od

-1,7.10308 do 1,7.10308. Najmenšie kladné číslo, ktoré dokáže typ double pojať je 3,4.10-324.

Pri použití tohto typu sa musí počítať s tým, že k dispozícii je 15 platných číslic. Pokiaľ je

treba pre výpočty väčšia presnosť, môže sa využiť matematická knižnicu BC, ktorej podpora

je do PHP zahrnutá.

Číselné konštanty typu double sa zapisujú ako čísla s voliteľným znamienkom a s desatinnou

bodkou. Pokiaľ je treba číslo zapísať v exponenciálnom tvare, nasleduje písmeno ‘e’ alebo

‘E’ a za ním je celé číslo vyjadrujúce exponent (napr. 4.2e3 = 4,2.103 ).

Typ string

Reťazce sa môžu v PHP zapisovať do úvodzoviek alebo do apostrofov. Pokiaľ je treba

úvodzovky použiť vo vnútri reťazca, použije sa prepis pomocou tzv. escape sekvencie ‘ \" ‘.

Pre zápis samotného spätného lomítka sa použije ‘\\‘. Pomocou spätného lomítka sa môžu

do reťazca vložiť aj ďalšie užitočné znaky.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 11 -

Sekvencia Význam

\\ ‘\‘ – spätné lomítko

\n nový riadok

\r návrat vozíka

\t Tabulátor

\" ‘"‘ – úvodzovky

\$ ‘$‘ – znak dolára

Okrem escape sekvencií uvedených v tabuľke sa môže znak zapísať priamo jeho ASCII-

kódom. Escape sekvencia ‘\nnn‘ zastupuje znak, ktorého kód je v osmičkovej sústave nnn.

Podobne zápis ‘\xNN‘ zastupuje znak, ktorého kód v šestnástkovej sústave je NN. Tak napr.

reťazec "A\301\x41" obsahuje tri písmená A.

Escape sekvencie sa môžu používať iba v reťazcoch uzatvorených v úvodzovkách.

Rovnako tak sa môže na premenné odkazovať iba v reťazcoch uzatvorených v úvodzovkách.

Reťazce uzatvorené v apostrofoch interpretujú celý svoj obsah iba ako obyčajný text bez

špeciálneho významu.

$var=20; echo "V premennej \$var je uložená hodnota $var <br />\n"; echo 'V premennej \$var je uložená hodnota $var'."\n"; Prvý príkaz echo zobrazí nasledujúci text:

V premennej $var je uložená hodnota 20

Vo výsledku druhého príkazu nebude zobrazený obsah premennej, pretože reťazce vo vnútri

apostrofov nie sú kontrolované na obsah premenných a escape sekvencií:

V premennej \$var je uložená hodnota $var

Pokiaľ je reťazec uložený do premennej, môže sa s ním pracovať dvoma základnými

spôsobmi. Jednak je možné s reťazcom pracovať ako s celkom – použije sa obyčajná

premenná. Pokiaľ treba pristupovať k jednotlivým znakom reťazca, napíše sa pozícia

požadovaného znaku v reťazci do hranatých zátvoriek za meno reťazcovej premennej. Znaky

sú pritom číslované od nuly.

$text="Ukážkový reťazec"; echo $text; // Vypíše Ukážkový reťazec echo $text[2]; // Vypíše á

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 12 -

Polia

Pole je špeciálna dátová štruktúra, v ktorej jedna premenná môže obsahovať niekoľko hodnôt.

Tieto hodnoty sú prístupné pomocou indexu. Index prvku pole sa zapisuje do hranatých

zátvoriek:

$a[0] = "Jablká"; $a[1] = "Hrušky"; $a[2] = "Slivky"; Pole $a obsahuje tri prvky. Jednotlivé prvky poľa môžu byť ľubovoľného typu.

$a[0] = "Jablká"; $a[1] = 12; $a[2] = 3.1415926535; V PHP sa môžu ako index poľa používať aj znakové reťazce. Získa sa potom tzv. asociatívne

pole:

$adresy["Jaroslav"][email protected]; $adresy["Karol"][email protected];

Inicializácia poľa

Pole sa môže inicializovať tak, že sa priradí hodnota jeho jednotlivým prvkom. Existujú však

aj pohodlnejšie spôsoby. Pokiaľ sa u poľa použije prázdny index, hodnota sa automaticky

uloží na miesto prvého voľného indexu. Indexy pritom začínajú od nuly. Nasledujúci skript je

teda ekvivalentný vyššie uvedenému skriptu.

$a[]="Jablká"; $a[]="Hrušky"; $a[]="Slivky"; Pole sa však dá inicializovať ešte úspornejším a pohodlnejším zápisom. Využíva sa na to

špeciálny príkaz Array:

$a=array("Jablká", "Hrušky", "Slivky"); Pokiaľ je potrebné, aby bolo pole inicializované od iného indexu, použije sa modifikovaný

príkaz array:

$dni=array(1=>"Po", "Ut", "St", "Št", "Pi", "So", "Ne");

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 13 -

Teraz bude mať prvý prvok poľa (Po) index 1. Dopadne to teda rovnako, ako keby sa

napísalo:

$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, môže sa index priradiť zvlášť každej hodnote.

Operátor => sa môže použiť u ľubovoľného prvku poľa. Najčastejšie sa však použije iba

u prvého prvku alebo u všetkých prvkov. Pokiaľ je treba vytvoriť asociatívne pole na prevod

anglických skratiek dňa v týždni na slovenské, použije sa nasledujúca inicializácia:

$day2Den=array("Mon"=>"Po", "Tue"=>"Ut", "Wed"=>"St", "Thu"=>"Št", "Fri"=>"Pi", "Sat"=>"So", "Sun"=>"Ne"); echo $day2Den["Fri"]; //Vypíše slovenskú skratku pre piatok

Funkcie pre prácu s poľom

Na zistenie počtu prvkov poľa slúži funkcia count(pole). Pokiaľ je pole vytvorené

štandardnou cestou a je teda indexované od nuly, môže sa na spracovanie všetkých prvkov

poľa $x použiť nasledujúci kód:

for ($i=0; $i<count($x); $i++): echo $x[$i]; endfor; Pokiaľ sa používa asociatívne pole alebo pole s indexom, ktorý nezačína od nuly, môže sa na

spracovanie celého poľa použiť funkcia reset(), current(), next() a key(). Pre

každé pole totiž v PHP existuje ukazovateľ, ktorý ukazuje na niektorý prvok poľa. Pomocou

reset(pole) sa presunie tento ukazovateľ na prvý prvok poľa. Funkcia current(pole)

vráti hodnotu prvku poľa, na ktorý ukazuje ukazovateľ. Podobne funguje aj funkcia

next(pole). Rozdiel je v tom, že sa najprv ukazovateľ presunie na ďalší prvok poľa a až

potom sa vráti hodnota prvku poľa. Funkcia key(pole) vráti index prvku poľa, na ktorý

ukazuje ukazovateľ. Vypísanie celého obsahu poľa sa dá realizovať napr. takto:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 14 -

<? reset($x); while($i<count($x)): echo "Index: ".key($x). "\n"; echo "Hodnota: ".current($x). "<br />\n"; $i++; next($x); endwhile; ?> Veľmi užitočnou funkciou pri práci s poľami je funkcia list(). Funkcia môže mať

ľubovoľný počet parametrov a slúži na načítanie prvkov poľa do premenných. Pokiaľ má

napr. pole $x štyri prvky, môžu sa tieto prvky uložiť do premenných $p1, $p2, $p3 a $p4

pomocou nasledujúceho príkazu:

list($p1, $p2, $p3, $p4)=$x; Pokiaľ je treba zistiť len prvý a štvrtý prvok, môžu sa niektoré parametre vynechať:

list($p1,,,$p4) = $x;

Viacrozmerné polia

V PHP sa môžu používať aj viacrozmerné polia. Pre každý rozmer stačí do hranatých

zátvoriek pridať ďalší index. Napr. dvojrozmerné polia sa často používajú pre uchovanie

rôznych matíc. Pre prístup k prvku v treťom riadku a piatom stĺpci dvojrozmerného poľa

$mat sa môže použiť zápis $mat[3][5].

Dvojrozmerné pole sa pritom chová ako jednorozmerné pole, ktorého prvky sú polia. Tieto

polia môžu mať dokonca rôzny počet prvkov. Zápis $mat[3] teda vráti pole, ktoré obsahuje

všetky prvky tretieho riadku matice.

Viacrozmerné polia sa môžu inicializovať pomocou vnorených príkazov array. Na

vytvorenie jednotkovej matice 3x3 sa použije príkaz:

$i=array(array(1,0,0),array(0,1,0),array(0,0,1);

Pretypovanie premenných

Vo väčšine prípadov nie je treba meniť typ premenných – o všetko sa postará PHP samé.

Pokiaľ sa napríklad sčítajú čísla, z ktorých je jedno double, všetky ostatné sa prevedú na typ

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 15 -

double a výsledok bude tiež typu double. Pokiaľ sú všetky čísla integer, bude tiež výsledok

integer.

Zistenie typu premennej

Na zistenie typu premennej sa môže použiť funkcia gettype(premenna). Tá vráti meno

typu premennej. Pre zistenie konkrétneho typu, sa môže použiť funkcia is_integer(),

is_double(), is_string(), is_array() a is_object().

Zmena typu premennej

Na zmenu typu premennej slúži funkcia settype(premenna, typ). Pokiaľ je treba

z číselnej premennej $N vytvoriť premennú $N typu string, použije sa volanie

settype($N, "string").

Pretypovanie

Funkcia settype() zmení typ premennej. Pokiaľ je však potrebné typ nejakej premennej

zmeniť iba jednorázovo pri jej použití vo výraze, použije sa pretypovanie. Pretypovanie sa

robí tak, že pred premennú sa napíše do guľatých zátvoriek typ, na ktorý ju treba previesť.

$i=10;// $i je typu integer $x=(double) $i;// $x je typu double Pri pretypovaní sa môžu použiť (int) a (integer) pre celé čísla (double), (real) a

(float) pre desatinné; (string) pre textové reťazce; (array) pre pole a (object)

pre objekty.

Vo vnútri zátvoriek s typom sa môže zapisovať ľubovoľný počet medzier, nasledujúce zápisy

sú teda identické:

$x=(double) $i; $x=( double ) $i;

Výrazy

Výraz je v podstate čokoľvek, čo má nejakú hodnotu. Najjednoduchším výrazom je teda

konštanta či premenná, ako '12' alebo '$x'.

Výrazom je však i volanie funkcie. Napríklad funkcia rand() vráti náhodné číslo. Jej

volanie je teda tiež výrazom, pretože funkcia vracia hodnotu – nejaké číslo. V PHP nemusí

byť hodnotou výrazu iba číslo. Výraz môže mať ľubovoľný typ, ktorý podporuje PHP.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 16 -

Pri priradení $x=10 sa do premennej $x priradí hodnota 10. Výrazom je v tomto prípade

číslo 10. Výraz je však aj $x – jeho hodnota je po priradení tiež 10. V ľavej časti priradenia

môže byť iba premenná. Priradenie má teda zvyčajne nasledujúci všeobecný tvar:

premenna=vyraz; V PHP je celé priradenie chápané ako výraz. Jeho hodnota je zhodná s hodnotou výrazu

v pravej časti priradenia. To sa dá využiť v mnohých prípadoch. Pokiaľ treba vynulovať

premenné $a a $b, môže sa použiť nasledujúci kód:

$a=0;$b=0; Pretože je po prvom priradení v $a hodnotu nula, je možný aj zápis:

$a=0; $b=$a; Pretože však zápis $a=0 je okrem priradenia aj výraz, môže sa použiť aj nasledujúce:

$b=($a=0); Pretože sú priradenia vyhodnocované sprava doľava, môžu sa zátvorky vynechať a písať:

$b=$a=0; Výraz sa získa aj tak, že uvedené elementárne výrazy sa poskladajú dokopy pomocou rôznych

operátorov.

Matematické operátory

PHP ponúka štandardné operátory na sčítanie ('+'), odčítanie ('-'), násobenie ('*')

a delenie ('/'). Pritom operátory pre násobenie a delenie majú väčšiu prioritu ako sčítanie

a odčítanie. Pokiaľ tieto priority nevyhovujú, môžu sa zmeniť zátvorkami:

echo 2+3*5; // Vypíše 17 echo (2+3)*5; // Vypíše 25 Ďalším z matematických operátorov je '%'. Ten slúži na určenie zvyšku po delení:

$zvysok=10%3; // Zvyšok by mal byť 1 echo "Zvyšok po delení 10:3 = $zvysok"; Veľmi častou operáciou v mnohých skriptoch je pričítanie nejakého výrazu k premennej. To

môžeme vykonať jednoducho príkazom $x=$x+vyraz. Tento zápis je však trocha zdĺhavý

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 17 -

a preto PHP ponúka kratšiu cestu: $x+=výraz. Obidva príkazy pritom majú rovnaký efekt –

do premennej $x pripočítajú výraz. Okrem operátorov '+=' sú k dispozícii aj ďalšie: '-=',

'*=', '/=' 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; Ďalším príkladom efektívnosti syntaxe jazyka sú operátory inkrementácie ('++')

a dekrementácie ('--'). Tieto operátory slúžia na zvýšenie, resp. zníženie obsahu premennej

o jedna. Zápis ++$x je ekvivalentný zápisu $x=$x+1. Obdobne --$i je to isté ako

$i=$i–1.

Operátory inkrementácie a dekrementácie sa môžu písať aj za premennú. Ich chovanie je však

trocha odlišné – všetko súvisí s tým, že i zápisy ++$i a $i++ sú výrazy. Prvý výraz pracuje

tak, že zvýši obsah premennej $i o jednotku a takto získanú hodnotu vráti ako svoj výsledok.

Oproti tomu hodnotu výrazu $i++ je zhodná s hodnotou premennej $i. Po vrátení tejto

hodnoty sa premenná $i zvýši o jedna.

Výrazu ++$i sa hovorí preinkrementácia, pretože je pred vrátením hodnoty výrazu vykonaná

inkrementácia premennej. Postinkrementácia je potom meno pre výraz typu $i++, kedy je

najprv vrátená hodnota a až potom je zvýšený obsah premennej. Obdobne všetko funguje i pri

dekrementácii.

$i=10; // $i=10 $a=$i++; // $a=10, $i=11 $b=++$i; // $b=12, $i=12 $c=$a+$i--; // $c=22, $i=11

Operátory na manipuláciu s bitmi čísla

PHP pracuje s číslami o veľkosti 32 bitov.

Prvým z operátorov je logický súčin zapisovaný pomocou operátora '&'. Jeho výsledkom je

číslo, v ktorom sú jednotky na tých binárnych cifrách, kde boli jednotky v oboch operandoch.

Na ostatných miestach sú nuly.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 18 -

$x = 00110011001100110101010101010101

$y = 01010101010101010011001100110011

$x & $y = 00010001000100010001000100010001

Ďalším operátorom je logický súčet '|'. Vo výsledku sú jednotky na miestach, kde bola

jednotka aspoň v jednom z operandov.

$x = 00110011001100110101010101010101

$y = 01010101010101010011001100110011

$x | $y = 01110111011101110111011101110111

Ďalším binárnym operátorom je nonekvivalencie 'ˆ'. Jeho výsledkom je prvé číslo,

v ktorom sú zmenené tie bity, ktoré sú v druhom operande jednotkové (xor).

$x = 00110011001100110101010101010101

$y = 01010101010101010011001100110011

$x ˆ $y = 01100110011001100110011001100110

Ďalší operátor má iba jeden operand (unárny operátor). Jeden operand má logická negácia

'~'. Vráti výsledok, v ktorom sú prehodené všetky hodnoty bitov.

$x = 00110011001100110101010101010101

~$x = 11001100110011001010101010101010

Logické výrazy a operátory

Často je potrebné skonštruovať výraz, ktorého výsledok je pravda alebo nepravda. Takéto

výrazy sa používajú ako podmienka v cykloch či podmienených príkazoch. PHP na to

používa celočíselný typ. Pokiaľ je hodnota nejakého výrazu nenulová, považuje sa tento výraz

za pravdivý (hodnota true). Pokiaľ je hodnota výrazu nulová, považuje sa výraz za nepravdivý

(hodnota false).

Pokiaľ sa ako logický výraz použije reťazec, považuje sa za nepravdivý, pokiaľ je prázdny

alebo ide o reťazec '0'. Ostatné reťazce sú považované za pravdivé výrazy. Pokiaľ sa

použije nejaký zložitejší typ – pole alebo objekt, bude chápaný ako true v prípade, že nie je

prázdny.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 19 -

Pre ľahšiu prácu sú v PHP definované dve konštanty true a false. True odpovedá pravdivej

hodnote a je reprezentované ako celé číslo 1. False odpovedá nepravde a ide o prázdny

reťazec.

Typickými operátormi, ktoré sa používajú na získanie logického výsledku, sú relačné

operátory. Relačné operátory slúžia na porovnávanie hodnôt dvoch výrazov.

Ak treba zistiť, či majú dva výrazy rovnakú hodnotu, použije sa operátor rovnosti '==':

if ($a==$b) echo "Premenné 'a' a 'b' obsahujú zhodnú hodnotu."; Na otestovanie nerovnosti dvoch výrazov, sa používa jeden z operátorov ´!=´ alebo ´<>´.

Operátory ostrej a neostrej nerovnosti:

if ($a>$b) echo "Premenná 'a' je väčšia ako premenná 'b'."; if ($a>=$b) echo "Premenná 'a' je väčšia alebo rovná premennej 'b'."; if ($a<$b) echo "Premenná 'a' je menšia ako premenná 'b'."; if ($a<=$b) echo "Premenná 'a' je menšia alebo rovná premennej 'b'."; Jednotlivé logické výrazy je možné skladať dohromady pomocou logických spojok

(logického súčinu '&&' a logického súčtu '||').

Logický súčin pracuje ako spojka „a zároveň“. Výsledkom logického súčinu je pravdivá

hodnota, pokiaľ sú obidva spájané výrazy pravdivé.

if ($a>=10 && $a<=20) echo "Premenná 'a' je niekde medzi 10 a 20."; Výsledkom logického súčtu je pravdivá hodnota, pokiaľ je aspoň jeden z operátorov

pravdivý:

if ($a==10 || $a==20) echo "Premenná 'a' má hodnotu 10 alebo 20."; Ako synonymum k operátoru '&&' sa môže použiť AND. Podobne pre '||' existuje OR.

Tieto operátory sa chovajú rovnako, majú však nižšiu prioritu. Naviac je možné použiť

operátor XOR, ktorý vracia pravdivú hodnotu, keď je práve jeden z operandov pravdivý

výraz.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 20 -

Na znegovanie logického výrazu slúži operátor '!'.

if (!$spojenie) echo "Nepodarilo sa pripojiť k databáze";

Operátor na spájanie reťazcov

Na spájanie reťazcov slúži špeciálny operátor '.'. Funguje tak, že svoje operandy prevedie

najprv na znakové reťazce a potom ich spojí do jedného reťazca.

echo "Zvyšok po delení 10:3 je ".(10%3); Okolo operátora sa môžu napísať medzery a sprehľadniť tak program:

echo "Zvyšok po delení 10:3 je " . (10%3); Ak je treba k nejakej premennej pripojiť reťazec, môže sa použiť nasledujúci postup:

$s = $s. "a niečo na koniec reťazca"; Výhodnejšie je použiť operátor '.=':

$s .= "a niečo na koniec reťazca";

Podmienený operátor

Podmienený operátor je jediným ternárnym operátorom (operátor s tromi operandami) v PHP.

Jeho syntax je nasledujúca:

výraz1 ? výraz2 : výraz3 Keď je výraz1 pravdivý, je výsledkom výraz2. V opačnom prípade je výsledkom

výraz3.

$min=$x<$y?$x:$y; // Do premennej $min sa uloží minimum z $x a $y $abs=$x<0?-$x:$x; // Do premennej $abs sa uloží absolútna hodnota $x

Priorita operátorov

V PHP má každý operátor definovanú svoju prioritu, takže je vždy jednoznačné, ktorá

operácia sa vykoná skôr. Prehľad priorít jednotlivých operátorov je nasledovný:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 21 -

´

OR XOR

AND = += -= *= /= .= %= &= |= ^= >>= <<=

?: ||

&& |

^ &

== != <> < <= >= >

<< >> + - .

* / % ! ~ -- ++ pretypovanie @

[index poľa]

Index poľa má najvyššiu prioritu. Pri zapísaní ++$a[0], PHP vie, že je treba

zvýšiť prvý prvok poľa $a, a nie zvýšiť premennú $a a potom pozerať do

nejakého poľa.

Zmena priority sa robí pomocou zátvoriek. Zátvorky sa môžu použiť

aj v prípadoch, keď je priorita operátorov neznáma.

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.";

PRIO

RIT

A

PRIO

RIT

A

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 22 -

Vetvenie

PHP ponúka dva príkazy, ktoré umožňujú vykonávanie časti skriptu podmienene – na základe

splnenia určitej podmienky. Tieto príkazy sú if a switch.

Príkaz if

Príkaz if slúži na podmienené vykonanie príkazu, pokiaľ je splnená určitá podmienka.

Podmienka sa musí zadať ako výraz, ktorý vracia logickú hodnotu:

if (výraz) príkaz; Príklad uloží do premennej $podiel podiel premenných $a a $b. Podiel sa však uloží iba

v prípade, že $b nie je nulové. Delenie nulou by inak vyvolalo chybu:

if ($b!=0) $podiel=$a/$b; V PHP sú logické hodnoty reprezentované ako obyčajné čísla. Nula pritom odpovedá hodnote

false. To sa dá využiť a podmienku zapísať skrátene:

if($b) $podiel=$a/$b; Pokiaľ je treba podmienene vykonať viac príkazov, uzatvoria sa do zložených zátvoriek.

if ($a<$b) { $p = $a; $a = $b; $b = $p; } Podmienene sa môže pomocou PHP vkladať aj XHTML kód:

<? if ($pocetPristupov==0) { echo "<h1>Vitajte na našom serveri. Ste tu prvýkrát. </h1>"; echo "Môžete sa <a href=\"register.php\">zaregistrovať</a>."; } ?>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 23 -

Pokiaľ je treba podmienene vložiť dlhší XHTML kód, je používanie príkazu echo

ťažkopádne. Využíva sa to, že PHP sa s XHTML môže prelínať.

<? if ($pocetPristupov==0) { ?> <h1>Vitajte na našom serveri. Ste tu prvýkrát.</h1> Môžete sa <a href="register.php">zaregistrovať</a> <? } ?> Tento zápis vetvenia nie je veľmi prehľadný a v zložitejších konštrukciách sa ľahko stratí

prehľad o tom, k čomu ktorá zátvorka patrí. V týchto prípadoch sa hodí druhá možná syntax

príkazu if:

if (výraz): príkaz1; príkaz2; ... endif; Predchádzajúci príklad sa môž prepísať do prehľadnejšej formy:

<? if ($pocetPristupov==0): ?> <h1>Vitajte na našom serveri. Ste tu prvýkrát.</h1> Môžete sa <a href="register.php">zaregistrovať</a> <? endif ?> Pri používaní if.....endif sa nesmie zabudnúť na dvojbodku, ktorá sa uvádza za

podmienkou.

Príkaz if-else

Častým prípadom je, že v závislosti na nejakej podmienke je treba vykonať dve rôzne

činnosti. Jednu, pokiaľ je podmienka splnená a druhú v prípade nesplnenia podmienky.

V týchto prípadoch nájde uplatnenie príkaz if doplnený o časť else. Príkaz uvedený za

else sa vykoná v prípade nesplnenia podmienky.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 24 -

if (výraz) príkaz1; else príkaz2; Pokiaľ je výraz pravdivý, vykoná sa príkaz1. V opačnom prípade sa vykoná príkaz2.

Keď treba podmienene vykonať viac príkazov, opäť sa musia zlúčiť pomocou zložených

zátvoriek:

if ($b!=0) { $podiel=$a/$b; echo "$a/$b=$podiel"; } else { echo "Nemôžem deliť nulou."; echo "......"; } Alternatívny zápis:

if (výraz): príkaz1-1; príkaz1-2; ... else: príkaz2-1; príkaz2-2; ... endif; Dvojbodka sa v tomto prípade musí uviesť aj za kľúčovým slovom else.

Pri vnáraní viac príkazov if-else, sa else viaže vždy k najbližšiemu príkazu if:

if (výraz1) if (výraz2) príkaz1; else príkaz2; je ekvivalentný so zápisom:

if (výraz1): if (výraz2): príkaz1; else: príkaz2; endif; endif;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 25 -

Príkaz if-elseif-else

Kľúčové slovo elseif ďalej rozširuje možnosti príkazu if. Príkaz uvedený za elseif sa

vykoná v prípade, že nie je splnená podmienka pre if a zároveň je splnená podmienka za

elseif. Častí elseif môže byť aj niekoľko za sebou. Nakoniec sa môže použiť aj časť

else, ktorá sa vykoná iba v prípade, že nie je splnená ani jedna z predchádzajúcich

podmienok.

if (výraz1) príkaz1; elseif (výraz2) príkaz2; elseif (výraz3) príkaz3; ... else príkazN;

if ($a<$b) echo "a je menšie ako b"; elseif ($a==$b) echo "a je rovné b"; else echo "a je väčšie ako b"; Ak sa v jednej vetve má vykonať viac príkazov, opäť sa môžu združovať pomocou zložených

zátvoriek alebo pomocou alternatívneho zápisu.

if (výraz1): príkaz1-1; príkaz1-2; ... elseif (výraz2): príkaz2-1; príkaz2-2; ... elseif (výraz3): príkaz3-1; príkaz3-2; ... ... else: príkazN-1; príkazN-2; ... endif;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 26 -

Príkaz switch

Často je treba na základe hodnoty jedného výrazu vykonať jednu z niekoľkých vetiev skriptu.

Pre tieto prípady sa optimálne hodí príkaz switch. Jeho syntax je nasledujúca:

switch (výraz) { case hodnota1: príkaz1-1; príkaz1-2; ... break; case hodnota2: príkaz2-1; príkaz2-2; ... break; ... default: príkazX-1; príkazX-2; ... } Najprv je vyhodnotený výraz. Potom sa postupne prechádza hodnotami uvedenými za

kľúčovým slovom case, dokedy sa nenájde hodnota zhodná s hodnotou výrazu. Následne sú

vykonávané príkazy, dokiaľ sa nenarazí na príkaz break alebo na koniec príkazu switch.

Jednotlivé varianty príkazu switch musia byť ukončené príkazom break. Keď sa break

nezadá, vykonajú sa aj príkazy, ktoré sa vykonať nemali a ktoré patria k iným vetvám

podmieneného príkazu.

Uvedená vlastnosť sa môže aj využiť. Aby sa jedna vetva príkazov vykonala pre viacero

rôznych hodnôt výrazu, môže sa za sebou uviesť niekoľko častí case:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 27 -

switch ($pismeno) { case "A": case "a": echo "Malé veľké, aj tak je to 'A'."; break; case "B": case "b": echo "Malé veľké, aj tak je to 'B'."; break; default: echo "Iné písmená nepoznám."; } Príkazy uvedené za default sa vykonajú v prípade, že výrazu nevyhovie ani jedna z hodnôt

uvedených za slovom case. Použitie default nie je povinné, ale dobrý program by mal

reagovať na všetky možné situácie, a preto sa jeho použitie odporúča.

K príkazu switch existuje aj alternatívna syntax:

switch (výraz): case hodnota1: príkaz1-1; príkaz1-2; ... break; case hodnota2: príkaz2-1; príkaz2-2; ... break; ... default: príkazX-1; príkazX-2; ... endswitch;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 28 -

Cykly

Cykly sa používajú pre opakované vykonanie niektorej časti skriptu. K dispozícii sú cykly

while, do-while a for. Všetky príkazy majú syntax prevzatú z jazyka C. K dispozícii je

aj alternatívna syntax, ktorá je vhodnejšia na kombinovanie skriptov s XHTML.

Príkaz while

Príkaz while je najjednoduchším príkazom cyklu. Zadaný príkaz vykonáva, dokedy platí

určitá podmienka. Často sa mu hovorí cyklus s podmienkou na začiatku.

while (výraz) príkaz; Väčšie množstvo príkazov, ktoré sa majú vykonávať v cykle, sa môže združiť pomocou

zložených zátvoriek:

$i = 0; while ($i<100) { echo "$i^2=".($i*$i)."<br />\n"; $i++; } Alternatívna syntax:

while (výraz): príkaz1; príkaz2; ... endwhile; Skript, ktorý vypisuje tabuľku druhých mocnín, môže 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 však umiestnená až na konci

cyklu. Rozdiel je v tom, že príkazy v tele cyklu do-while sú vykonané aspoň raz. Oproti

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 29 -

tomu telo cyklu while nemusí byť vykonané ani raz, pokiaľ hneď na začiatku nie je splnená

podmienka na vykonávanie cyklu.

do príkaz; while (výraz); Cyklus while môže byť zapísaný aj pomocou do-while:

$i=0; do { echo "$i^2=".($i*$i)."<br />\n"; $i++; } while ($i<100); K príkazu do-while neexistuje jeho ekvivalent s alternatívnou syntaxou.

Cyklus for

Cyklus for je zo všetkých príkazov cyklu asi najvýkonnejší a tiež najzložitejší. Jeho syntax

je:

for (výraz1;výraz2;výraz3) príkaz; Výraz1 je vyhodnotený pred začiatkom vykonávania cyklu. Potom je vyhodnotený

výraz2. Keď je jeho hodnota true, vykoná sa telo cyklu. Na konci každého prechodu telom

cyklu sa vyhodnotí výraz3. Telo cyklu sa vykonáva tak dlho, dokiaľ má výraz2 hodnotu

true.

Najobvyklejšie použitie cyklu for je pri vykonávaní cyklov, pri ktorých je dopredu známy

počet opakovaní. Výraz1 inicializuje riadiacu premennú, výraz3 sa stará o pravidelnú

aktualizáciu tejto premennej a výraz2 je podmienka na vykonávanie cyklu.

Predchádzajúci príklad má použitím for syntax:

for ($i=0;$i<100;$i++) echo "$i^2=".($i*$i)."<br />\n"; V tomto prípade sa na začiatku cyklu do premennej $i uloží nula. Telo cyklu (príkaz echo)

sa vykonáva, dokedy je premenná $i menšia ako 100. Na konci každého prechodu cyklom je

premenná $i zvýšená o jednotku (pomocou $i++).

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 30 -

Keď sa má v tele cyklu vykonávať viac príkazov, opäť sa uzavrú do zložených zátvoriek:

for ($i=0;$i<100;$i++) { echo "$i^2=".($i*$i)."\t"; echo "$i^3=".($i*$i*$i)."<br />\n"; } Alternatívna syntax príkazu for:

for (výraz1; výraz2; výraz3): príkaz1; príkaz2; ... endfor; Zápis predchádzajúceho príkladu pomocou alternatívnej syntaxe:

for ($i=0;$i<100;$i++): echo "$i^2=".($i*$i)."\t"; echo "$i^3=".($i*$i*$i)."<br />\n"; endfor;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 31 -

Príkazy na načítanie skriptov, definícia vlastných funkcií

Príkazy na načítanie skriptov

Pri rutinnej tvorbe stránok pomocou skriptov sa veľmi často vyskytuje potreba načítania iných

skriptov alebo častí stránok. Načítané súbory môžu obsahovať preddefinované funkcie, ktoré

sa používajú na viacerých stránkach alebo napr. štandardizované hlavičky a päty stránok. Pre

načítanie skriptov sú v PHP k dispozícii príkazy require a include.

Príkaz require

Príkaz require slúži na načítanie skriptu zo súboru. Načítaný skript sa vloží v mieste

použitia príkazu. Vykonajú sa všetky jeho príkazy a potom sa vo vykonávaní pokračuje

príkazom uvedeným za require. Syntax príkazu:

require "meno_suboru"; Meno_suboru je ľubovoľný výraz, ktorý sa vyhodnotí ako reťazec. Špecialitou príkazu

require je, že sa vykoná iba raz. Ak by bol volaný v cykle, súbor sa načíta iba pri prvom

prechode cyklom. Na opakované čítanie súborov je treba využiť príkaz include.

Parametrom príkazu je meno súboru. Meno súboru samozrejme môže obsahovať aj cestu.

Najčastejšie sa require používa na načítanie užívateľom definovaných funkcií:

require "mojefunkcie.php"; Mnoho tvorcov knižníc (súborov s rôznymi užitočnými funkciami) pre PHP používa pre tieto

knižnice príponu .inc. Keď však niekto zistí URL knižnice a tá má príponu .inc, môže si

ju stiahnuť a prezerať si zdrojový kód skriptu. Keď je však knižnica uložená do súboru

s príponou .php, bude vždy interpretovaná systémom PHP a neoprávnenému používateľovi

dorazí úplne prázdna stránka.

Keď sa pri mene súboru neuvedie cesta, PHP hľadá v adresároch určených pomocou direktívy

include_path v konfiguračnom súbore php.ini.

include_path štandardne neobsahuje nič a teda ani bodku označujúcu aktuálny adresár.

Pri načítaní súborov z aktuálneho adresára by sa mal tento explicitne určiť:

require "./mojefunkcie.php";

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 32 -

Príkaz include

Príkaz include slúži na načítanie skriptu zo súboru. Jeho použitie je rovnaké ako pri

príkaze require. Rozdiel je v tom, že jeden príkaz include sa môže volať niekoľkokrát –

napr. vo vnútri cyklu:

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

Definícia vlastných funkcií

Keď sa v skriptoch na rôznych miestach vykonáva rovnaká sekvencia príkazov, je praktické

a užitočné túto sekvenciu nadefinovať ako funkciu. V miestach, kde sa príkazy používali,

potom stačí uviesť volanie tejto funkcie. Funkcie sa hodia i v mnohých ďalších prípadoch –

keď program zahŕňa zložitejšie manipulácie s údajmi, je vhodné ich oddeliť do samostatných

funkcií. Výsledný skript je prehľadnejší a ľahšie sa v ňom hľadajú prípadné chyby.

Definícia funkcie má nasledujúci tvar:

function meno (parameter1, parameter2, ...) { príkazy; return hodnota; } Pomocou parametrov funkcií sa predávajú hodnoty, ktoré má funkcia spracovať. Príkazom

return funkcia vráti svoj výsledok. U niektorých funkcií sa môžu parametre úplne

vynechať, rovnako ako vrátenie hodnoty.

Funkcia Pozdrav vypíše text uvedený za príkazom echo:

function Pozdrav() { echo "Zdravím Vás."; } Za definíciou funkcie v skripte sa môže kdekoľvek vyvolať pomocou Pozdrav(). Zátvorky

za názvom funkcie sa musia používať aj keď funkcia nepracuje s žiadnymi parametrami.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 33 -

Pri použití parametrov sa môžu definovať rôzne užitočné funkcie, ktoré PHP štandardne

neponúka k dispozícii. Nasledujúci program vypíše tabuľku matematickej funkcie faktoriál

pre parametre od 1 do 100. Výpočet faktoriálu 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 definícii funkcie sa hovorí, že funkcia Faktorial má jeden parameter. Jeho obsah je

v tele funkcie prístupný pomocou premennej $n. Príkaz for v tele funkcie spočíta hodnotu

faktoriálu z $n a uloží ju do premennej $i. Táto hodnota sa potom pomocou príkazu

return vráti ako výsledok funkcie.

Ako parameter sa môžu funkcii predávať všetky typy dát, ktoré PHP podporuje – čísla,

reťazce ale i polia a objekty. Rovnaké typy dát môže funkcia i vrátiť.

Rozsah platnosti premenných

V bežných skriptoch je premenná s rovnakým názvom stále tá istá premenná a reprezentuje

jednu hodnotu. Pri použití funkcií sa situácia mení. Premenné, ktoré sa použijú vo vnútri

funkcie nemajú s ostatnými premennými nič spoločného – dokonca i keď sa rovnako volajú.

function Zmena() { $a=10; } $a=20; Zmena(); echo $a; Tento skript vypíše číslo 20. Hodnota 10 je do premennej $a priraďovaná vo vnútri funkcie.

Zmena premennej $a vo vnútri funkcie nijako neovplyvní hodnotu premennej $a použitej na

najvyššej úrovni programu.

Dôvod pre toto chovanie PHP je celkom zrejmý – programátor nemôže omylom vo funkcii

zmeniť obsah nejakej globálnej premennej.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 34 -

Ak je potrebné vo funkcii pracovať s hodnotou globálnej premennej, môže sa na začiatku

funkcie určiť, ktoré globálne premenné môže funkcia používať. Globálne premenné sa funkcii

sprístupnia pomocou príkazu global, za ktorý sa napíše čiarkami oddelený zoznam

premenných:

function Zmena() { global $a; $a=10; } $a=20; Zmena(); echo $a; Upravený príklad už vypíše číslo 10. V tomto prípade je premenná $a vo vnútri funkcie

totožná s globálnou premennou $a, a môže teda meniť jej hodnotu.

Okrem použitia príkazu global je ešte jedna možnosť ako zadefinovať globálne premenné.

Môže sa použiť asociatívne pole $GLOBALS, v ktorom sú prístupné všetky globálne

premenné. Ako index poľa sa použije názov premennej (bez znaku dolár):

function Zmena() { $GLOBALS["a"]=10; } $a=20; Zmena(); echo $a; Vo vnútri funkcií sa môžu definovať aj ďalšie funkcie. Neexistuje však spôsob, ako z týchto

vnorených funkcií pristupovať k premenným funkcie, ktorá je o úroveň vyššie. Prístup sa dá

zaistiť iba ku globálnym premenným.

Štandardné hodnoty parametrov

V praxi sa vyskytujú funkcie, ktoré sa väčšinou volajú s rovnakými parametrami. Je potom

zbytočné, aby sa do volania funkcie stále opisovali rovnaké parametre iba kvôli tomu, že

občas je treba funkciu zavolať s inými parametrami.

V definícii funkcie sa môže určiť pre každý parameter štandardná hodnota, ktorá sa použije,

keď sa pri volaní funkcie tento parameter nepoužije.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 35 -

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() slúži na počítanie mocnín. Pretože najčastejšie sa počítajú druhé

mocniny, je definícia funkcie napísaná tak, aby volanie funkcie s jedným parametrom

automaticky spôsobilo výpočet druhej mocniny.

Parametre, ktoré majú štandardnú hodnotu, musia byť v zozname parametrov funkcie uvedené

vždy posledné. V opačnom prípade by PHP nemohlo dosadiť štandardné hodnoty parametrov.

Ako štandardná hodnota parametra funkcie sa môžu použiť iba skalárne typy: integer, double

a string. Nie je možné používať polia a objekty.

Statické premenné

Príklad: je treba vytvoriť funkciu pracujúcu ako čítač. Pri každom zavolaní vráti hodnotu

o jedna vyššiu ako pri minulom volaní. Počítanie začne od jednotky.

function Citac() { $n = 0; $n++; return $n; } Táto funkcia však pri každom svojom zavolaní vráti 1, pretože pri každom volaní funkcie je

premenná $n, ktorá slúži ako čítač, vynulovaná.

V tomto prípade sa využije možnosť definovania statických premenných. Statickej premennej

sa hodnota priradí pri definícii funkcie a pri ďalších volaniach funkcie už nie je znova

inicializovaná. Statické premenné sa deklarujú pomocou príkazu static.

function Citac() { static $n=0; $n++; return $n; }

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 36 -

Funkčné formuláre U každého formulára by sa mali použiť aspoň dva atribúty - action a method. Atribút

action obsahuje URL-adresu skriptu, ktorý bude obsluhovať dáta z formulára. Atribút

method slúži na určenie metódy, ktorou budú dáta zaslané na server. Na výber sú dve

možnosti: get a post (odporúčaná).

<form action="skript" method="metoda"> definícia jednotlivých prvkov formulára </form> Formulár nemusí byť obsluhovaný len skriptom. Niektoré prehliadače umožňujú obsah

formulára odoslať na zadanú e-mailovú adresu. V adrese skriptu sa musí použiť schéma

mailto.

<form action="mailto:e-mail" method="post"> definícia jednotlivých prvkov formulára </form> Lepšie je však formuláre obsluhovať skriptom - aj keby mal skript iba odoslať dáta z

formulára na nejakú e-mailovú adresu. Skripty sú totiž nezávislé na prehliadači a pracujú

vždy správne.

Element <input /> slúži na vytvorenie väčšiny vstupných prvkov ako sú vstupné polia,

polia pre zadanie hesla, zaškrtávacie polia, prepínacie tlačidlá, tlačidlá pre odoslanie

formulára a ďalšie.

Pomocou elementu <select> sa vytvárajú zoznamy, z ktorých sa dá vyberať jedna alebo

viac položiek.

Pre vstup dlhších textov, ktoré zaberú viac riadkov, sa môže použiť element <textarea>.

Každý prvok formulára musí mať svoje meno určené pomocou atribútu NAME.

Prostredníctvom tohto atribútu je potom obsah prvku prístupný v obslužnom skripte.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 37 -

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á stránka:</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 obslužnom skripte 01.php sú jednotlivé polia formulára prístupné v premenných $meno,

$email a $web.

Skript v PHP vypíše obsah jednotlivých premenných :

... <head> <title>Obsluha formulára</title> </head> <body> <h1>Čo prišlo z formulára:</h1> <p>Meno: <?echo $meno?></p> <p>E-mail: <?echo $email?></p> <p>Web: <?echo $web?></p> </body> </html>

Odoslanie formulára

Každý formulár by mal obsahovať aspoň jedno tlačidlo s atribútom type="submit".

Stlačenie tohto tlačidla spôsobí odoslanie dát z formulára na server, ktorý dáta predá

príslušnému skriptu.

V jednom formulári sa môže použiť aj viac tlačidiel pre odoslanie, musia však mať rovnaké

meno (name) a rôzny obsah atribútu value. Ktoré tlačidlo bolo stlačené, sa potom v skripte

spozná podľa obsahu premennej s menom vzniknutým z atribútu name - premenná bude

obsahovať hodnotu atribútu.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 38 -

<form action="02.php" method="get"> Súhlasíte so znením licenčnej zmluvy: <input type="submit" name="suhlas" value="Ano" /> <input type="submit" name="suhlas" value="Nie" /> </form> Pri obsluhe tohto formulára sa v PHP skripte testuje hodnota premennej $suhlas. Na

základe jej obsahu sa urobia príslušné akcie.

<? if ($suhlas=="Ano"): ?> Úspešne ste si zaregistrovali náš program. Teraz si ho môžete <a href="/inst/setup.exe">nainštalovať</a>. <? elseif ($suhlas=="Nie"): ?> Bez odsúhlasenia licenčnej zmluvy program nezískate. <? else: ?> Snažíte sa oklamať náš registračný systém. Radšej si program bežne zaregistrujte. <? endif ?> Skript by mal vždy ošetriť všetky možné stavy. Prvé dve vetvy skriptu testujú prípady, ktoré

nastanú po odoslaní formulára. Keď však niekto vyvolá skript ručne (priamym zadaním

URL), nemusí premenná $suhlas obsahovať ani jednu z očakávaných hodnôt. Tento prípad

je ošetrený v poslednej vetve podmienky.

Zaškrtávacie polia

V praxi bývajú zobrazené ako štvorček, ktorý je možné nechať prázdny alebo ho zaškrtnúť.

Keď je štvorček zaškrtnutý, pošle sa jeho meno (obsah atribútu name) na server spoločne s

obsahom atribútu value. Vo formulári môže byť aj niekoľko zaškrtávacích polí s rovnakým

menom, ktoré k sebe logicky patria.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 39 -

<form action="03.php" method="get"> <table> <caption>Vyberte si doplňujúcu konfiguráciu počítača: </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="Odošli" /></th></tr> </table> </form> Vypísanie, ako sa má počítač rozšíriť:

... <head> <title>Doplnková konfigurácia</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 prácu so zaškrtávacími políčkami, kde jednému menu odpovedá viac hodnôt,

používajú polia. Namiesto mena vstupného prvku name="konfiguracia" sa musí písať

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 40 -

name="konfiguracia[]". Pre takto pomenovaný prvok formulára potom PHP samo

vytvorí pole.

Počet prvkov poľa sa zistí pomocou funkcie count(pole). Jednotlivé prvky poľa sú

prístupné pomocou indexu, ktorý sa musí zapísať do hranatých zátvoriek. Prvky poľa sú

indexované od nuly.

Prepínacie tlačidlá

Prepínacie tlačidlá odpovedajúce jednotlivým variantom musia mať nastavený atribút name

na rovnakú hodnotu. Atribút value musí mať každý variant jedinečný.

Požadovaná veľkosť pevného 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> Obslužnému skriptu dorazí hodnota value vybraného prepínacieho tlačidla (20, 40, 80, 120

alebo 250 v premennej $hd).

Zoznamy

Na vytvorenie zoznamu sa používa element <select>. Pri použití atribútu multiple

môže užívateľ vybrať aj viac položiek ako jednu. Meno vstupného prvku sa opäť určuje

pomocou atribútu name. Dôležitým atribútom je size, ktorý určuje počet riadkov, na

ktorých sa zoznam zobrazí. Položky, ktoré sa do tohto priestoru nevojdú, budú prístupné

rolovaním v zozname.

Jednotlivé položky zoznamu sa zapisujú pomocou elementu <option>. Ako hodnota

položky sa skriptu predá text uvedený medzi začiatočnou a koncovou značkou elementu

<option> . Text je však mnohokrát dlhý a nevhodný pre ďalšie spracovanie skriptom. Ak

sa u option použije atribút value, bude sa prenášať jeho obsah namiesto obsahu celého

elementu.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 41 -

Ak má byť nejaká položka vybraná už hneď po zobrazení, označí sa pomocou atribútu

selected.

<form action="04.php" method="post"> Čísla časopisov, o ktoré máte záujem: <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>Formát, v ktorom chcete čísla obdržať:</p> <select name="fmt" size="1"> <option value="xhtml">XHTML stránka</option> <option value="pdf">Portable document format</option> <option value="ps" selected="selected">Postscript</option> <option value="ascii">Textový súbor</option> </select> <p>E-mail pre zaslanie: <input name="email" /></p> <p><input type="submit" value=" OK " /></p> </form> V menu prvého zoznamu sú použité hranaté zátvorky (cisla[]), aby PHP pre údaje z tohto

prvku formulára vytvorilo pole. Je to nutné, pretože užívateľ môže vybrať viac čísel časopisu

naraz (vďaka atribútu multiple).

Obslužný skript vypíše hodnoty vyplnené vo formulári:

<p>Vybrané časopisy:<br /></p> <? for ($i=0; $i<count($cisla); $i++): echo $cisla[$i]."<br />\n"; endfor; ?> <p>Požadovaný formát: <?echo $fmt?></p> <p>Zaslať na: <?echo $email?></p>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 42 -

Formuláre na úrovni

Pre užívateľa je príjemné, keď vidí celý vyplňovaný formulár naraz na obrazovke. Ak je

potrebné od užívateľa získať toľko údajov, že sa formulár nevojde naraz na obrazovku, je

lepšie vytvoriť niekoľko stránok s menšími formulármi, ktoré postupne od užívateľa vyzvedia

požadované údaje.

Mnoho formulárov na webe (napr. rôzne registrácie) vyžaduje vyplnenie iba niektorých

povinných častí formulára. V týchto prípadoch je vhodné povinné polia nejako odlíšiť - napr.

použitím výraznejšieho písma alebo farebného písma pri popiske poľa.

Ak obsluhujúci skript zistí, že užívateľ nevyplnil všetky údaje, požaduje doplnenie

chýbajúcich. V tomto prípade by sa pred užívateľom mal objaviť formulár s už zadanými

údajmi.

Formulár, ktorý vyžaduje vyplnenie určitých polí, ale ponúka užívateľovi pohodlný spôsob

doplnenia chýbajúcich údajov:

... <head> <title>Ukážkový formulár</title> <style type="text/css"> <!-- td b { color: red; } --> </style> </head> <body> <? $formular=1; // príznak zobrazovania formulára if ($odoslane==1): // bol formulár odoslaný? if ($meno=="" || // kontrola vyplnenia $priezvisko=="" || // povinných údajov $email==""): echo "<h1>Musíte vyplniť všetky povinné údaje!</h1>"; echo "Sú označené tučným červeným popisom.\n"; else: // povinné dáta sú zadané -> spracujú sa $formular=0; // tu sa informácie z formulára spracujú echo "<h1>Ďakujeme za registráciu!</h1>"; endif; else: // formulár je zobrazený prvý krát echo "<h1>Pre zaregistrovanie vyplňte tento formulár!</h1>"; echo "Povinné údaje sú označené tučným

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 43 -

červeným popisom.\n"; endif; ?> <? if ($formular): // má sa zobrazovať formulár? ?> <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 stránka:</td> <td><input name="web" value="<?echo $web?>" size="30" /></td> </tr> <tr> <th colspan="2"><input type="submit" value=" Registrácia " /></th> </tr> </table> <input type="hidden" name="odoslane" value="1" /> </form> <? endif ?> </body> </html> Výsledkom skriptu môžu byť tri odlišné stránky. Pokiaľ je skript vyvolaný užívateľom

prvýkrát, zobrazí sa prázdny formulár. Ak užívateľ formulár odošle, môžu nastať dva prípady.

Keď sú všetky povinné údaje vyplnené, skript zobrazí iba potvrdenie registrácie. Ak nejaký

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 44 -

povinný údaj chýba, zobrazí sa formulár, ktorý obsahuje už skôr vyplnené polia a požaduje

doplnenie chýbajúcich polí.

Skript na obsluhu dát z formulára volá sám seba, a preto sa nemusí v elemente <form> uvádzať pomocou atribútu action meno skriptu určeného na spracovanie formulára.

Aby skript spoznal, že formulár je užívateľom vyvolaný prvýkrát alebo že užívateľ len

nevyplnil žiadne pole, je do formulára pridané skryté pole (type="hidden"). Toto pole sa

nezobrazuje, ale jeho hodnota sa prenáša s ostatnými údajmi z formulára. Podmienkou

if ($Odoslane==1): sa otestuje, či do skriptu už putujú údaje z formulára alebo či je spustený prvýkrát.

V ďalšej časti skriptu sa testuje, či všetky povinné polia obsahujú nejakú hodnotu. Ak nie,

vypíše sa záhlavie stránky, ktoré požaduje doplnenie chýbajúcich údajov. Keď sú všetky

povinné polia vyplnené, poďakuje skript za vyplnenie formulára.

Ďalšia vetva skriptu patrí k prvej podmienke. Vykoná sa iba ak je skript volaný užívateľom

prvýkrát a vyzve ho k vyplneniu formulára.

Nasleduje samotný XHTML kód na zobrazenie formulára. Tento kód sa do prehliadača

odošle iba ak má premenná $formular hodnotu true. Táto premenná je nastavená na

hodnotu false, ak skript obdržal všetky povinné polia (netreba žiadne údaje).

Ako hodnotu atribútu value pri jednotlivých vstupných poliach je uvedený krátky PHP

skript, ktorý doplní obsah tohto poľa z posledného odosielaného formulára. Tým je zaručené,

že keď užívateľ vyplní iba niektoré údaje a je požiadaný o doplnenie chýbajúcich povinných

údajov, nemusí znovu vyplňovať zbytok formulára. Pri prvom spustení skriptu neobsahujú

použité premenné žiadnu hodnotu a vstupné pole budú prázdne.

Pri prepínacích tlačidlách je situácia zložitejšia. Ak má byť tlačidlo zaškrtnuté, je treba pri

príslušnom elemente <input /> uviesť atribút checked.

<? echo $pohlavie=="muz" ? " checked=\"checked\"" : "" ?> Tá používa špeciálny operátor podmienka ? výraz1 : výraz2. Ak je podmienka

splnená, je výsledkom výraz1, inak výraz2. Ak bol formulár odoslaný so zaškrtnutým

tlačidlom muž, vráti skript prepínacie tlačidlo:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 45 -

<input type="radio" name="pohlavie" value="muz" checked="checked" /> Ak nebolo pohlavie muža vybrané, dorazí naopak:

<input type="radio" name="pohlavie" value="muz"> a tlačidlo teda zostane nezaškrtnuté.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 46 -

Spolupráca PHP s databázami Databáza je nejaké miesto, kam sa ukladajú všetky potrebné údaje. Prístup k údajom

uloženým v databáze obstaráva program, ktorému sa hovorí SRBD - Systém Riadenia Bázy

Dát (DBMS - DataBase Management System). Medzi SRBD patria také programy ako

Oracle, MS SQL Server, Sybase, Informix, Progress, mSQL, mySQL a PostgreSQL.

Prevažná väčšina dnes používaných SRBD pri usporiadaní údajov v databáze vychádza z

relačného modelu dát. Názov tohto modelu vychádza z relačnej algebry, čo je matematický

aparát, na ktorom relačný model dát stavia. V tomto modeli sú údaje usporiadané do tabuliek.

Tabuľka spravidla zhromažďuje údaje o jednom druhu objektov (osobné údaje

zamestnancov...). Jednotlivé riadky odpovedajú jednotlivým zamestnancom. Stĺpce potom

obsahujú informácie o pracovníkoch (osobné číslo, meno, rodné číslo, adresa a výška platu).

Stĺpcom tabuľky sa obvykle v databázovej terminológii hovorí položky alebo atribúty.

Jednotlivé riadky sa potom nazývajú záznamy.

Obr. 1 Štruktúra databáze

Aby šlo s tabuľkami a v nich uloženými údajmi pracovať, musia byť nejako jednoznačne

identifikované. Každý stĺpec má svoj názov. Tento názov sa používa pri odvolávaní sa na

obsah určitého atribútu a nie na celý záznam. Menom atribútu sú napr. meno a plat.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 47 -

Častou operáciou vykonávanou v tabuľkách je zmena obsahu jedného atribútu pri určitom

zázname. Na vykonanie tejto operácie musí byť k dispozícii spôsob, ako jednoznačne určiť

požadovaný záznam. Pre tieto účely by každá tabuľka mala obsahovať tzv. primárny kľúč.

Primárny kľúč je atribút, ktorého hodnota je pre každý záznam jedinečná.

Pre každý atribút tabuľky musí byť určené aký typ dát môže obsahovať. Medzi najbežnejšie

používané typy patria celé čísla, znakové reťazce a logické hodnoty (áno/nie). Ďalšie veľmi

často používané typy sú reálne čísla, menové údaje, dátum a čas.

Databáza môže obsahovať väčšie množstvo tabuliek. Každá tabuľka má preto svoje meno,

ktoré ju v rámci databázy jednoznačne identifikuje.

Tabuľka obyčajne obsahuje ucelené informácie. To však neznamená, že nijako nesúvisí s

ostatnými tabuľkami. Vo fiktívnej firme je treba evidovať informácie o odberateľoch. U

každého odberateľa sa eviduje jeho IČO, názov, sídlo a zamestnanec fiktívnej firmy, ktorý má

styk s odberateľom na starosti. Tabuľka odberatelia musí obsahovať atribúty IČO, názov

a sídlo. Má však u každého odberateľa obsahovať kompletné informácie o zamestnancovi (t.j.

jeho meno, rodné číslo, adresu a výšku platu). To by iste nebolo najefektívnejšie - pokiaľ by

niekto mal na starosti viac odberateľov, informácie by sa v tabuľke zbytočne opakovali.

Vyššie zmienené prípady sa riešia pomocou vzťahov medzi tabuľkami. Jeden zamestnanec

môže mať na starosti niekoľko odberateľov - hovorí sa o vzťahu 1:N. V praxi sa tento vzťah

rieši tak, že tabuľka odberatelia má atribút, ktorý obsahuje primárny kľúč určujúci

zamestnanca povereného stykom s firmou. Primárny kľúč v tabuľke zamestnanci je

osobné číslo, u každého odberateľa sa teda uvedie osobné číslo zamestnanca povereného

jednať za firmu.

Atribútu, ktorý slúži ako odkaz na inú tabuľku a obsahuje teda primárne kľúče inej tabuľky,

sa hovorí cudzí kľúč. Pokiaľ sa tabuľka zúčastní viac vzťahov s ostatnými tabuľkami, môže

obsahovať viac cudzích kľúčov. Primárny kľúč je však v každej tabuľke vždy len jeden.

Medzi tabuľkami môžu existovať aj iné vzťahy ako 1:N, i keď nie sú také časté. Vzťah 1:1

vyjadruje prípady, kedy záznam jednej tabuľky odpovedá jednému záznamu inej tabuľky.

Tieto vzťahy sa obvykle riešia ako špeciálny prípad vzťahu 1:N s využitím cudzieho kľúča.

Isté komplikácie prinášajú vzťahy typu M:N. Fiktívna firma spracováva naraz niekoľko

projektov. Na každom projekte môže pracovať niekoľko zamestnancov, ale zároveň môže

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 48 -

jeden zamestnanec pracovať na viacerých projektoch. Vzťah medzi tabuľkami projekty a

zamestnanci je práve vzťahom M:N.

Na prvý pohľad sa vzťah M:N nedá do relačného modelu dát napasovať. Našťastie je možné

každý vzťah M:N rozložiť na dva vzťahy 1:N s využitím pomocnej tabuľky.

Pre každý záznam platí, že jeho primárny kľúč je jedinečný.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 49 -

Úvod do jazyka SQL – vytvorenie tabuľky; pridanie, mazanie, modifikácia záznamu Pre zápis požiadaviek na databázový server sa najčastejšie používa jazyk SQL (Structured

Query Language). Jazyk SQL ponúka všetko potrebné na vytváranie, modifikovanie a rušenie

tabuliek a pre prácu s údajmi v tabuľke - vyhľadávanie, pridávanie, modifikovanie a mazanie

údajov.

V úlohe klienta pre SQL-server môže samozrejme vystupovať i skript zapísaný v PHP. To

znamená, že skripty môžu obsahovať príkazy zapísané v jazyku SQL a spracovávať ich

výsledky po vykonaní na SQL-serveri.

V PHP sa môže na pripojenie k SQL-serveru používať rozhranie ODBC. PHP naviac ponúka

pre niektoré servery priamu podporu - prístup k údajom je potom obvykle rýchlejší. Medzi

priamo podporované databázy mimo iné patrí Oracle, Sybase, Solid, mySQL a PostgreSQL.

Po nainštalovaní mySQL sa musí spustiť jeho serverová časť pomocou príkazu mysqld.

Teraz sa už môže k serveru pripájať pomocou jednoduchého riadkového klienta mysql. Ako

parameter je nutné uviesť meno databázy, ku ktorej sa užívateľ pripája.

Vytvorenie tabuľky

Na vytvorenie novej tabuľky v databáze slúži SQL príkaz CREATE TABLE. Jeho syntax je

nasledujúca:

create table meno_tabuľky (meno_položky dátový_typ_položky, ... ); Prehľad najpoužívanejších dátových typov

Vybrané dátové typy MySQL Typ Popis

int celé číslo float číslo s pohyblivou desatinnou čiarkou varchar(n) textový reťazec o maximálnej dĺžke n date dátum v tvare RRRR-MM-DD time čas v tvare HH:MM:SS

Na vytvorenie tabuľky zamestnanci sa môže použiť nasledujúci SQL príkaz:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 50 -

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

Pridanie nového záznamu

Na pridanie nového záznamu do tabuľky s N atribútmi slúži v SQL príkaz insert into:

insert into meno_tabuľky values (hodnota1, ..., hodnotaN); Pridanie informácie o pánovi Novákovi:

insert into zamestnanci values ( 1023, 'Novák Ján', '561220/0235', 'Dolná 13, Trnava', 18000); Textové reťazce sa musia uzatvárať do apostrofov alebo do úvodzoviek.

Výber a prezeranie záznamov

Na výber a vypísanie záznamov z tabuľky slúži príkaz SELECT. Na vypísanie obsah celej

tabuľky sa zadá príkaz:

select * from meno_tabuľky; Obsah tabuľky Zamestnanci sa môže overiť pomocou:

select * from zamestnanci; Informácie je možné vyberať i selektívne. Podmienka, ktorá musí pre vybrané záznamy platiť,

sa uvádza za kľúčové slovo where. Príklady selektívnych dotazov:

select * from zamestnanci where meno like 'Novák Ján'; Vyberie všetkých zamestnancov, ktorých meno je 'Novák Ján'.

select * from zamestnanci where meno like 'Nov%';

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 51 -

Znak '%' má vo vyhľadávanom reťazci za operátorom like špeciálny význam - nahrádza

ľubovoľnú sekvenciu znakov. Dotaz teda vyberie všetkých zamestnancov, ktorých meno

začína na Nov.

select * from zamestnanci where osobnecislo=1023; Vyberie zamestnanca s osobným číslom 1230.

select * from zamestnanci where plat>10000; Vyberie všetkých, ktorých plat prevyšuje 10000.

V podmienkach sa môžu používať aj logické spojky AND a OR. Ak je treba vyselektovať

všetkých Novákov, ktorých plat je menší ako 6000, použije sa dotaz:

select * from zamestnanci where meno like 'novák %' and plat<6000; Za príkazom select sa nemusí uvádzať iba hviezdička. Namiesto nej sa môže použiť

zoznam atribútov, ktoré majú byť vo výsledku zobrazené. Hviezdička má špeciálny význam a

zastupuje všetky atribúty.

Ak je treba vyselektovať mená a platy zamestnancov, ktorí majú plat väčší ako 15000, môže

sa použiť dotaz:

select meno, plat from zamestnanci where plat>15000;

Mazanie záznamov v tabuľke

Na mazanie záznamov v tabuľke slúži príkaz delete from. Záznamy, ktoré treba

zmazať, sa musia určiť podmienkou v klauzule WHERE:

delete from meno_tabuľky where podmienka; Zmazanie zamestnanca, ktorého osobné číslo je 1023:

delete from zamestnanci where osobnecislo=1023;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 52 -

Modifikácia záznamu v tabuľke

Na zmenu obsahu záznamu slúži príkaz update:

update meno_tabuľky set položka=hodnota, ... where podmienka; Ten modifikuje všetky záznamy, ktoré vyhovujú podmienke. Pre zmenenie iba jedeného

záznamu (najtypickejší príklad), je vhodné ako podmienku uviesť test primárneho kľúča na

jedinečnú hodnotu:

update zamestnanci set plat=14000 where osobnecislo=1023; Príkaz zmení plat Jána Nováka na 14000 (osobné číslo pána Nováka je 1230).

Začleňovanie SQL do skriptov

PHP ponúka spôsob na prácu s databázami práve pomocou jazyka SQL. Práca s databázou v

skripte sa skladá z niekoľkých krokov. Najprv je nutné sa k databáze pripojiť. Potom sa

môže na server odoslať SQL-dotaz. Späť sa vráti výsledok, s ktorým sa dá ďalej pracovať -

vyberať z neho jednotlivé záznamy a položky. Dotazy a spracovanie výsledkov sa môžu

vykonávať opakovane a nakoniec by sa malo od databázy odpojiť.

Na pripojenie k databáze slúži funkcia mysql_connect(). Tá má tri parametre. Prvým z

nich je adresa, na ktorej je dostupný SQL-server. Ďalšie dva parametre sú meno a heslo

užívateľa, pod ktorým sa k databázovému serveru pripája. Pre databázu, ktorá je prístupná

každému, sa môže meno a heslo vynechať. Na pripojenie sa použije príkaz:

mysql_connect("localhost"); Na samotné vykonávanie SQL-dotazov sa používa funkcia mysql. Tá má dva parametre -

prvým je meno databázy, v ktorej sa prevádza dotaz a druhý parameter je SQL-dotaz.

Funkcia vracia hodnotu, pomocou ktorej sa potom môže pracovať s výsledkom dotazu. Na

vyberanie údajov o všetkých zamestnancoch poslúži nasledujúci kód:

$result = mysql("test", "select * from zamestnanci"); Prostredníctvom premennej $result je teraz dostupný výsledok dotazu. Pre zistenie počtu

záznamov, ktorý vyhovuje dotazu, sa môže použiť funkcia mysql_numrows($result).

Na prístup k jednotlivým položkám výsledku slúži funkcia mysql_result(). Tá má tri

parametre:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 53 -

mysql_result(id_výsledku, číslo_záznamu, meno_položky); Záznamy sú vo výsledku číslované od nuly a ich počet sa zistí práve pomocou funkcie

mysql_numrows($result). Na vypísanie mena prvého zamestnanca, ktorý vyhovuje

dotazu, slúži príkaz:

echo mysql_result($result, 0, "meno"); Pre vypísanie všetkých záznamov, treba vytvoriť cyklus, ktorý všetky záznamy spracuje.

Počet opakovaní tohto cyklu určuje výsledok funkcie mysql_numrows().

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 54 -

select.php: ... <head> <title>Výpis všetkých zamestnancov</title> </head> <body> <h1>Výpis všetkých 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 tabuľke \"zamestnanci\" je $pocet záznamov.\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 všetkými záznamami výsledku bol použitý cyklus for, ktorého riadiaca

premenná ($i) bola použitá pri odvolávaní sa na jednotlivé záznamy výsledku.

Funkcia mysql_close()uzavrie spojenie s databázou.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 55 -

Do skriptu sa dá vložiť ľubovoľný SQL-príkaz. Cez webové rozhranie sa dajú pridávať nové

záznamy do tabuľky zamestnanci. Najprv sa musí vytvoriť formulár, ktorý bude slúžiť na

zadanie údajov o novom zamestnancovi.

insert.html: ... <head> <title>Pridanie nového záznamu do tabuľky zamestnanci</title> </head> <body> <h1>Pridanie nového záznamu do tabuľky 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 formulára slúži skript insert.php, ktorý obstará samotné vloženie údajov z

formulára do tabuľky:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 56 -

insert.php: ... <head> <title>Pridanie nového záznamu do tabuľky zamestnanci</title> </head> <body> <? @$spojenie = mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripojiť k databáze!</h1>"; else: @$vysledok = mysql("test", "insert into zamestnanci values( $osobnecislo, '$meno', '$rc', '$adresa', $plat)"); if (!$vysledok): echo "<h1>Nový záznam sa nepodarilo pridať!</h1>"; else: ?> <h1>Nový záznam bol úspešne pridaný</h1> <form action="select.php"> <input type="submit" value="Prehľad zoznamu zamestnancov" /> </form> <form action="insert.html"> <input type="submit" value="Pridanie nového zamestnanca" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Do stránky boli pomocou formulárov vložené dve tlačidlá, ktoré slúžia na vyvolanie skriptu

pre výpis obsahu tabuľky resp. pre pridanie ďalšieho zamestnanca.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 57 -

Manipulácia s dátami pomocou prehliadača Zmazanie záznamu je v SQL jednoduchá vec - stačí poznať hodnotu primárneho kľúča

záznamu, ktorý treba zmazať:

delete from zamestnanci where osobnecislo=hodnota; Od užívateľa je v tomto prípade potrebné získať osobné číslo zamestnanca, ktorého chce

zmazať. Jednou z možností je doplnenie výpisu obsahu tabuľky o tlačidlá vyvolávajúce

zmazanie jednotlivých záznamov.

Do každého riadku tabuľky sa pridá bunku s malým formulárom. Formulár bude obsahovať

iba dve polia - tlačidlo pre odoslanie a skryté pole, ktoré bude slúžiť na prenos osobného čísla

zamestnanca, ktorého treba zmazať. Do skriptu pre výpis zamestnancov sa pridá nasledujúci

príkaz:

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ý záznam tabuľky bude skriptom vygenerovaný formulár:

<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 názvom delete.php a jeho výpis bude nasledovný:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 58 -

delete.php: ... <head> <title>Výpis všetkých zamestnancov</title> </head> <body> <h1>Výpis všetkých 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 tabuľke \"zamestnanci\" je $pocet záznamov.\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>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 59 -

Samotný skript na zmazanie záznamu je obdobou skriptu na pridanie nového záznamu. Iba sa

líši vykonávaný SQL-príkaz. Skript obdrží osobné číslo zamestnanca určeného k zmazaniu v

premennej $osobnecislo.

delete2.php ... <head> <title>Zmazanie záznamu</title> </head> <body> <? @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "<h1>nepodarilo sa pripojiť k databáze!</h1>"; else: @$result = mysql("test", "delete from zamestnanci where osobnecislo=$osobnecislo"); if (!$result): echo "<h1>Záznam sa nepodarilo zmazať!</h1>"; else: ?> <h1>Záznam bol úspešne zmazaný</h1> <form action="select.php"> <input type="submit" value="Prehľad zoznamu" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Na zmenenie existujúcich údajov o zamestnancoch sa musí vytvoriť tlačidlo, ktoré vyvolá

modifikáciu určitého záznamu. Tlačidlo sa pridá k tabuľke s výpisom rovnakým spôsobom

ako bolo pridané tlačidlo pre mazanie. Stlačenie tlačidla však vyvolá formulár, ktorý bude

slúžiť na modifikáciu záznamu, ktorý bude vyzerať podobne ako formulár pre zadanie nového

záznamu - iba sa v ňom zobrazia údaje z aktuálne vybraného záznamu a bude umožnená ich

editácia. Užívateľovi musia byť umožnené editovať všetky údaje okrem primárneho kľúča

(osobného čísla).

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 60 -

Pozn. Kvôli znemožneniu editovania osobného čísla je vhodné ako primárny kľúč požiť

idzamestnanec.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 61 -

update1.php: <html> <head> <title>Výpis všetkých zamestnancov</title> </head> <body> <h1>Výpis všetkých 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 tabuľke \"zamestnanci\" je $pocet záznamov.\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>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 62 -

update2.php: <html> <head> <title>Modifikácia záznamu v tabuľke zamestnanci</title> </head> <body> <? @$spojenie = mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripojiť k databáze!</h1>"; else: @$vysledok = mysql("test", "select * from zamestnanci where osobnecislo=$osobnecislo"); if (!$vysledok || !mysql_fetch_row($vysledok)): echo "<h1>Záznam sa nepodarilo nájsť!</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>Modifikácia záznamu v tabuľke 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="Zapísanie zmien" /> </table> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html>

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 63 -

Skript pre zapísanie zmien do tabuľky môže vyzerať takto:

update3.php: <html> <head> <title>Zmena záznamu v tabuľke zamestnanci</title> </head> <body> <? @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "<h1>Nepodarilo sa pripojiť k databáze!</h1>"; else: @$vysledok = mysql("test", "update zamestnanci set meno = '$meno', rc = '$rc', adresa = '$adresa', plat = $plat where osobnecislo = $osobnecislo"); if (!$vysledok): echo "<h1>Záznam sa nepodarilo zmeniť!</h1>"; else: ?> <h1>Záznam bol úspešne zmenený</h1> <form action="select.php"> <input type="submit" value="Prehľad zoznamu zamestnancov" /> </form> <? endif; mysql_close($spojenie); endif; ?> </body> </html> Poslednou vecou v súvislosti s databázami, je možnosť vyhľadávania. V tabuľke o

zamestnancoch môže byť niekoľko stoviek či tisíc záznamov. Ak sa tabuľka nechá celá

vypísať v prehliadači, zobrazí sa neprehľadný dlhý zoznam, ktorý sa naviac bude naťahovať

neprimerane dlho. Riešením je vytvorenie jednoduchého formulára, ktorý užívateľovi umožní

zadať prvých pár písmen z mena zamestnanca a skript potom zobrazí iba vyhovujúce

záznamy:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 64 -

search.php: <html> <head> <title>Prehľadávanie zoznamu zamestnancov</title> </head> <body> <h1>Prehľadávanie zoznamu zamestnancov</h1> <form action="search.php"> Zadajte začiatok mena zamestnanca: <input name="meno" value="<?echo $meno?>" /> <input type="submit" value="Hľadaj" /> </form> <hr> <? if ($meno!=""): @$spojenie=mysql_connect("localhost"); if (!$spojenie): echo "Nepodarilo sa pripojiť k databáze."; else: @$result=mysql("test", "select * from zamestnanci where meno like '%$meno%'"); $pocet=mysql_numrows($result); if (!$result): echo "Chyba pri prevedení dotazu v databáze"; else: echo "Počet nájdených 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";

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 65 -

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 príkazu select, ktorý určuje reťazec na porovnanie sa môže použiť znak

'%', ktorý zastupuje ľubovoľný počet ľubovoľných znakov. Tým sa dosiahne to, že výsledkom

dotazu budú iba tie záznamy, ktorých atribút Meno začína na reťazec uložený v premennej

$meno.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 66 -

Práca so súbormi v PHP

Základné funkcie

Základnými funkciami práce so súbormi sa môžu nazvať funkcie na otváranie a zatváranie

súborov. Ide o funkcie fopen() a fclose(). Prvá funkcia slúži na otvorenie súboru.

Vracia premennú typu file pointer (teda niečo ako ukazovateľ súboru), ktorá má význam pri

pohybe po súbore. Má tri parametre, pričom ten tretí je nepovinný a skoro sa nepoužíva.

Prvým parametrom je reťazec obsahujúci meno súboru, ktorý treba otvoriť. Ak sa tento

reťazec začína na http:// otvorí sa HTTP pripojenie na špecifikovaný server. Takisto sa môžu

zadávať mená súborov na FTP, takže pripojenie na FTP je realizované v prípade, že meno

súboru sa začína na ftp://. Ak sa reťazec začína čímkoľvek iným, súbor je otvorený z

lokálneho filesystému. Druhým parametrom je takisto reťazec, v ktorom je identifikátor módu,

akým sa bude pristupovať k súboru. Ten môže byť jeden z nasledujúcich:

r - otvorí súbor iba na čítanie, ukazovateľ je nastavený na začiatok súboru

r+ - otvorí súbor na čítanie a na zápis, ukazovateľ je nastavený na začiatok súboru

w - otvorí súbor iba na zápis, ukazovateľ je nastavený na začiatok súboru a dĺžka súboru je

skrátená na nulu (všetko zo súboru je zmazané). Ak súbor neexistuje, pokúsi sa ho vytvoriť

w+ - otvorí súbor na zápis a čítanie, ukazovateľ je nastavený na začiatok súboru a dĺžka

súboru je skrátená na nulu. Ak súbor neexistuje, pokúsi sa ho vytvoriť

a - otvorí súbor iba na zápis, ukazovateľ je nastavený na koniec súboru. Ak súbor neexistuje,

pokúsi sa ho vytvoriť

a+ - otvorí súbor na čítanie a zápis, ukazovateľ je nastavený na koniec súboru. Ak súbor

neexistuje, pokúsi sa ho vytvoriť.

Ako bolo už spomenuté, funkcia vracia ukazovateľ daného súboru. Aby sa dal potom použiť,

musí sa táto návratová hodnota priradiť nejakej premennej. Táto premenná potom slúži pri

práci so súbormi pri ostatných funkciách.

Otváranie súborov:

$subor = fopen("data/meno.dat","r"); $subor = fopen("info.dat","w+"); $subor = fopen("ftp://login:[email protected]","w");

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 67 -

Funkcia fclose() má jediný parameter, a to už spomínaný ukazovateľ súboru, teda file

pointer. Táto funkcia nerobí nič iné, iba zatvorí súbor, ktorému je priradený príslušný

ukazovateľ, zadaný ako parameter tejto funkcie. Funkcia vracia hodnoty true alebo false v

závislosti od toho, či prebehlo zatváranie súboru úspešne alebo nie.

fclose($subor);

Ďalšie funkcie na prácu so súbormi

Funkcia fgets()slúži na prečítanie riadka zo súboru. To, čo zo súboru prečíta, je

interpretované ako návratová hodnota typu reťazec, takže výsledok tejto funkcie by bolo

vhodné priradiť nejakej premennej. Funkcia má dva parametre, pričom oba sú povinné. Prvým je

file pointer súboru, z ktorého sa číta (pred použitím funkcie musí byť súbor otvorený). Druhý

parameter špecifikuje počet bajtov (znakov), ktorý ma byť prečítaný zo súboru (pričom je

prečítaný vždy počet znakov o 1 nižší, než je zadané týmto parametrom). Znaky však budú čítané

iba na jednom riadku, pretože čítanie sa môže končiť nielen dosiahnutím dĺžky zadanej druhým

parametrom, ale aj dosiahnutím príznaku konca riadka alebo konca súboru. To znamená, že ak sa

prikáže prečítať väčší počet znakov, ako sa nachádza v riadku, bude prečítaný nižší počet

znakov, resp. budú prečítané iba znaky nachádzajúce sa v riadku, po prechode na nový riadok sa

čítanie končí.

$subor = fopen("text.txt","r"); $text = fgets($subor,1000); fclose($subor); Pre načítanie len jedného znaku zo súboru sa môže použiť funkcia fgetc(). Tá má iba jeden

parameter, ktorým je file pointer súboru, z ktorého sa číta. Návratovou hodnotou je jeden znak

načítaný zo súboru, ktorý je identifikovaný týmto file pointerom. V prípade, že ukazovateľ je

na konci súboru (príznak EOF), návratová hodnota je FALSE.

Funkcia fputs() zapíše reťazec do súboru. Táto funkcia má tri parametre. Prvým je file

pointer, druhým parametrom je reťazec alebo premenná typu reťazec, ktorej obsah sa bude

zapisovať do súboru. Tretí parameter je nepovinný a špecifikuje počet znakov, ktorý má byť

do súboru zapísaný. Pri neuvedení tohto parametra sa zapíše celý reťazec. Platí, že ak bude

špecifikovaný počet znakov väčší ako dĺžka samotného reťazca, bude zapísaných iba toľko

znakov, koľko ich reťazec skutočne obsahuje.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 68 -

$subor = fopen("text.txt","w"); fputs($subor,$text); fclose($subor); Funkcia file_exists() má pomerne časté využitie, pretože slúži na overenie skutočnosti,

že daný súbor existuje. Predtým ako sa bude z nejakého súboru čítať, mala by sa použiť táto

funkcia. Funkcia má jediný parameter, ktorým je reťazec obsahujúci meno súboru. Z

logických dôvodov sa nepoužíva file pointer, pretože testovať, či existuje súbor, ktorý je už

otvorený, je nezmyselné. Takže najprv sa testuje existencia súboru pomocou file_exists()

a až potom sa súbor otvorí pomocou fopen(). Funkcia vracia true vtedy, ak súbor existuje,

v opačnom prípade vracia false. Otváranie súboru text.txt v adresári docs by malo

prebiehať asi takto:

if (file_exists("docs/text.txt")) { $subor = fopen("docs/text.txt","r"); . . práca so súborom . fclose($subor); } else { echo "Súbor docs/text.txt neexistuje."; } V tomto prípade však môže nastať problém pri otvorení súboru viacerými užívateľmi (paralelná

práca so súborom).

Výsledky tejto funkcie sú ukladané do cache pamäte, z ktorej sa potom vyberajú výsledky pri

ďalšom volaní tejto funkcie. Preto vrátená hodnota funkcie bude rovnaká ako prvýkrát, aj keď

bude volaná niekoľkokrát po sebe. Funkcia clearstatcache()vymaže cache, čím sa

zabezpečí získanie skutočných a aktuálnych výsledkov funkcií. Funkcia nemá nijaké parametre a

nevracia nijakú hodnotu.

Funkcia feof() testuj koniec súboru, ktorého file pointer je parametrom tejto funkcie.

Návratovou hodnotou môže byť true alebo false v závislosti od toho, či je ukazovateľ súboru na

jeho konci (príznak EOF). Ak ukazovateľ koniec súboru dosiahol, vracia funkcia true.

Vypísanie všetkých riadkov súboru:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 69 -

$subor=fopen("text.txt","r"); while (!feof($subor)) { echo fgets($subor,$text); } fclose($subor); Môže sa stať, že pri čítaní zo súboru niekde v jeho prostriedku, treba znovu začať čítať zo

začiatku. Jedným zo spôsobov, ako to urobiť, je súbor zatvoriť a znovu otvoriť, čo je dosť zlé

riešenie. Funkcia rewind() previnie ukazovateľ súboru, ktorý je zadaný ako parameter, na

jeho začiatok. File pointer je zároveň jediným parametrom funkcie. Návratovou hodnotou je 0

v prípade, že nastala nejaká chyba.

Na posun ukazovateľa po súbore slúži aj funkcia fseek() ktorá nastaví file pointer na

pozíciu definovanú parametrom. Parametre sú dva, prvým je file pointer súboru, s ktorým sa

manipuluje a druhým je offset, teda pozícia, na ktorú sa má ukazovateľ umiestniť. Offset

vyjadruje počet bajtov od začiatku súboru k žiadanej pozícii. Návratová hodnota je 0 v prípade

úspešného presunutia, -1 v prípade, že sa vyskytla nejaká chyba. Zadanie offsetu väčšieho, ako

je veľkosť súboru, teda pokus umiestniť ukazovateľ za koniec súboru (EOF), sa nepokladá za

chybu. Na zistenie aktuálnej pozície ukazovateľa súboru sa používa funkcia ftell().

Jediným parametrom je file pointer súboru, návratovou hodnotou je pozícia ukazovateľa

súboru (offset), v prípade chyby vracia false.

Systémové funkcie

Pri používaní systémových funkcií nie je nutné súbor otvárať. Prvou je funkcia copy(), ktorá

slúži na kopírovanie súboru a zároveň jeho premenovanie. Má dva parametre, source a

destination, teda zdroj a cieľ. Prvý parameter (zdroj) špecifikuje meno súboru (prípadne aj s

cestou k nemu), ktorý sa bude kopírovať, druhý (cieľ) znamená umiestnenie cieľového

(skopírovaného) súboru a aj jeho meno. To značí, že pri kopírovaní sa môže zároveň súbor

premenovať, takže je možné kopírovať do rovnakého adresára, v akom sa nachádza zdroj.

Funkcia vracia true, ak prebehlo kopírovanie v poriadku, inak vráti false:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 70 -

if (!copy("zdroj.dat", "zdroj.bak")) { echo "Chyba pri kopírovaní... "; } else { echo "Kopírovanie prebehlo v poriadku...";} Ak je treba súbor iba premenovať a nie kopírovať, môže sa použiť funkcia rename().

Má dva parametre, prvým je meno súboru, ktorý treba premenovať, druhým je nové meno,

ktorým bude nazvaný súbor. Návratové hodnoty sú rovnaké ako pri copy() , teda true pri

úspešnom premenovaní, inak false.

Ďalšou užitočnou funkciou je filesize(). Táto funkcia umožňuje zistiť veľkosť

súboru. Jej jediným parametrom je meno súboru, ktorého veľkosť treba zistiť. Návratovou

hodnotou je veľkosť súboru alebo v prípade chyby false. Výsledky tejto funkcie sú ukladané do

pamäte cache a preto pri jej opätovnom použití je vhodné podľa okolností najprv zavolať

funkciu clearstatcache(). Podobne je to s funkciou fileatime() . Táto

funkcia vrac ia čas posledného prístupu k súboru, ktorý sa jej zadá ako jediný parameter.

Na zmazanie súboru slúži funkcia unlink(), ktorá má opäť jediný parameter - meno

súboru, ktorý treba zmazať. Návratová hodnota je 0 alebo false v prípade výskytu chyby.

Ďalšie možnosti čítania súborov

Ide o využitie funkcií file() a readfile(). Obe funkcie majú niekoľko spoločných

vlastností - každá má jeden povinný parameter, ktorým je meno súboru, ktorý sa bude čítať.

Obe funkcie slúžia na načítanie celého obsahu súboru. Rozdiel spočíva v spôsobe interpretácie

obsahu súboru. Funkcia readfile() obsah po načítaní celý vypíše do výstupu (teda

zväčša do výsledného generovaného dokumentu). Na druhej strane funkcia file() načíta

súbor do poľa, pričom jednému prvku poľa zodpovedá jeden riadok. Súbor s desiatimi riadkami

je načítaný do poľa s desiatimi prvkami. Z toho vyplýva, že výsledok funkcie file() sa

musí priradiť premennej typu pole, zatiaľ čo výsledok readfile() je počet prečítaných

bajtov, takže ak je táto informácia nepotrebná, nemusí sa funkcia priraďovať žiadnej premennej.

Keďže parametrom týchto funkcií je meno súboru a nie jeho file pointer, súbor netreba otvárať.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 71 -

Problémy pri paralelnej práci so súbormi

Najväčším problémom pri práci so súbormi na serveri, kde má prístup relatívne neobmedzený

počet používateľov, je takmer istá pravdepodobnosť, že sa naraz pokúsi pracovať so súborom

viac skriptov. To má väčšinou za následok poškodenie súboru, stratu dát a aj krach programu.

Preto je potrebné takéto prípady nejakým spôsobom ošetriť Jedným z riešení je vždy si

vytvárať nejaký pracovný súbor, ktorého existencia signalizuje, že s potrebným súborom sa

pracuje a preto treba počkať. Implementácia riešenie by bola približne takáto:

while (file_exists("work")) { sleep(1); clearstatcache(); } $subor = fopen("work","w"); fclose($subor); . . práca s potrebným súborom . . unlink("work");

Na začiatku je cyklus while, ktorý kontroluje, či existuje súbor work. Ak áno, na jednu

sekundu sa exekúcia skriptu zastaví, na čo slúži funkcia sleep(). Potom sa vymaže pamäť

cache a opäť sa testuj existencia súboru work. Toto sa opakuje, kým súbor work existuje.

Hneď ako je tento súbor zmazaný, pokračuje skript tým, že vytvorí znovu súbor work, čím si

užívateľ rezervuje právo používať potrebné súbory, takže všetky ostatné skripty budú musieť

počkať. Vytvorenie súboru work pozostáva z otvorenia na zápis a okamžitého zatvorenia. Potom

sa užívateľ môže venovať práci so samotnými súbormi, pre ktoré je skript určený. Po ukončení

práce skript zmaže súbor work a tým umožní ďalšiemu skriptu (alebo ďalšej inštancii toho

istého skriptu) prácu so súbormi a sám končí.

Druhá možnosť je použiť funkciu na uzamknutie súborov. Ide o funkciu flock() . Prvým

parametrom je file pointer, takže pred uzamknutím súboru je potrebné najprv ho otvoriť.

Druhým parametrom je číselný kód operácie, ktorá sa má na súbore vykonať:

1 - zdieľaný prístup, sprístupní súbor na čítanie

2 - exkluzívny prístup, sprístupní súbor na zápis

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 72 -

3 - uvoľní (odomkne) súbor uzamknutý predchádzajúcim volaním funkcie flock() s

parametrom 1 alebo 2

flock($subor,1); . . práca so súborom (čítanie) . . flock($subor,3); Aby bol systém používajúci flock() funkčný, musia túto funkciu používať všetky skripty,

inak nemá význam.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 73 -

PHP a obrázky

Pre prácu s obrázkami sa v PHP používa grafická knižnica GD, ktorá je súčasťou distribúcie

PHP. Táto knižnica sa dá stiahnuť aj na stránke http://www.boutell.com/gd, kde je aj

kompletná dokumentácia. Sú tu k dispozícii aj zdrojové kódy tejto knižnice. Od verzie PHP

4.0.6 je už pridaná knižnica php_gd.dll, takže stačí upraviť súbor php.ini.

Verzie 2.0.0 a vyššie poskytujú lepšie prostriedky na prácu s obrázkami, prinášajú podporu True

Color (teda 16 miliónov farieb) a pridali niektoré nové funkcie.

GD podporuje niekoľko grafických formátov, medzi inými aj dva vlastné formáty, ďalej JPEG,

PNG a WBMP. WBMP je formát využívaný v bezdrôtových zariadeniach, ako sú mobilne

telefóny (s podporou WAP), a preto sú výsledné obrázky v tomto formáte čiernobiele. Podpora

obrázkov GIF nie je zahrnutá od verzie 1.6.

Funkcia GetImageSize()

Táto funkcia je priamo podporovaná PHP a nepotrebuje na funkčnosť knižnicu GD. Funkcia

slúži na zistenie rozmerov obrázka. Podporované formáty sú JPEG, GIF a PNG. Ako parameter

berie názov súboru obsahujúceho obrázok a návratová hodnota predstavuje pole so štyrmi

prvkami. Prvé dva prvky obsahujú šírku a výšku obrázka v pixloch:

$obr=GetImageSize("img/obrazok.jpg"); echo "Šírka obrázka: ".$obr[0]. " pixlov <br /> Výška obrázka: ".$obr[l]. " pixlov"; Ďalším prvkom poľa vráteného funkciou GetImageSize() je identifikátor formátu

obrázku, ktorý nadobúda tri stavy v závislosti od formátu načítaného obrázka:

Hodnota Formát

1 GIF 2 JPEG 3 PNG

Nasledujúci skript ukazuje, ako vypísať názvy všetkých súborov v zadanom adresári

obsahujúcich obrázok vo formáte JPEG:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 74 -

/* premenná $adr obsahuje názov adresára, z ktorého sa číta */ $adr=opendir('.'); echo "Súbory obsahujúce obrázok JPEG:<br />"; /* čítanie súborov z adresára, pokiaľ ukazovateľ nie je na konci adresára */ while($sub=readdir($adr)): /* overenie, či nejde o adresár */ if (!Is_Dir($sub)): $atr=GetImageSize($sub); /* overenie, či súbor neobsahuje obrázok JPEG */ if ($atr[2]==2): echo "$sub<br />"; endif; endif; endwhile; /* koniec prehľadávania adresára */ closedir($adr); Skript otvorí aktuálny adresár a postupne v cykle while zisťuje pre každý súbor (adresáre sú

preskakované ošetrením funkciou Is_Dir()), či náhodou neobsahuje obrázok vo formáte

JPEG pomocou tretieho prvku návratového poľa funkcie GetImageSize(). Nezáleží na

názvoch ani na koncovkách súborov, pretože táto funkcia kontroluje obsah súboru, takže nájde aj

také súbory obsahujúce obrázok JPEG, ktoré nemajú príslušnú koncovku (.jpg).

Posledná položka návratového poľa obsahuje reťazec "height=hhh width=www", kde

hhh a www predstavujú príslušné hodnoty. Takýto reťazec je vhodný na použitie v

elementoch <img />:

/* Zistenie informácií o obrázku */ $atr=GetImageSize("img/obrazok.jpg"); /*a vygenerovanie príslušného kódu XHTML */ echo "<img src=\"img/obrazok.jpg\" ".$atr[3]. " />"; Tento skript vygeneruje XHTML element <img /> spolu s atribútmi width a height

s nastavenými hodnotami podľa skutočných rozmerov obrázka. Dá sa to dosiahnuť aj

bez použitia poslednej položky návratového poľa, ak by sa zamenil posledný riadok za

tento:

echo "<img src=\"img/obrazok.jpg\" width=".$atr[0] . " height=".$atr[1]. " />";

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 75 -

Úvod do GD

Základnou štruktúrou používanou GD je gdImage. Táto dátová štruktúra slúži na

uchovávanie obrázka v pamäti a na rôzne operácie s ním. Túto štruktúru využíva pri práci viacero

funkcií, pričom prístup k nej je prostredníctvom ukazovateľa typu gdImagePtr, ktorý sa

získa ako návratová hodnota akejkoľvek funkcie vytvárajúcej obrázok. Všetky operácie

vykonávané na tejto štruktúre prebiehajú v pamäti, pričom jej momentálny obsah sa dá

zapísať do súboru alebo na štandardný výstup pomocou ďalších funkcií.

Štruktúra gdFont slúži na definovanie vlastných fontov. Dátové zložky obsahujú údaje o

počte písmen vo fonte (nchars), číslo (kód) prvého písmena (offset), obyčajne 32 - medzera.

Ďalej štruktúra obsahuje informáciu o výške (h) a šírke (w) fontu. Najdô1ežitejšou dátovou

zložkou je zložka data obsahujúca daný font (dáta fontu). K štruktúre pristupujú funkcie

prostredníctvom ukazovateľa typu gdFontPtr. V prípade, že nie je treba definovať

vlastné fonty, nemusí sa táto štruktúra použiť, pretože sa môžu používať už preddefinované

fonty.

Štruktúra gdPoint je dôležitá pri práci s polygónmi. Táto štruktúra obsahuje iba dve

dátové zložky, x a y, ktoré vyjadrujú x-ovú a y-ovú súradnicu bodu v obrázku, resp.

štruktúre gdImage. Ukazovateľom na štruktúru gdPoint je gdPointPtr.

Na prácu s GD nie je potrebné poznať jej štruktúry, keďže knižnica poskytuje mnoho funkcií

na prácu s nimi a na dodržanie programátorských konvencií je priam žiaduce, aby

programátori nepristupovali k jednotlivým zložkám priamo, ale sprostredkovane pomocou

určených funkcií, aby sa tak zamedzila prípadná nekompatibilita v budúcnosti s príchodom

nových verzií knižnice, keď štruktúry nemusia mať rovnaké dátové zložky.

Vytváranie obrázkov a ich uvoľňovanie z pamäte

Základnou funkciou na vytváranie obrázkov je funkcia ImageCreate(). Ako parametre

sa jej musia zadať šírka a výška obrázka v pixloch. Po zavolaní funkcie je vytvorený prázdny

obrázok so zadanými rozmermi. Vytvorí sa vlastne štruktúra gdImage a vrátený je ukazovateľ

na ňu. V PHP je tento ukazovateľ reprezentovaný identifikátorom obrázka typu int, ktorý je

návratovou hodnotou funkcie ImageCreate(). Túto návratovú hodnotu je potrebné uchovávať

pre ďalšiu prácu s obrázkom, pretože ju vyžadujú funkcie GD. V prípade, použitia verzie

GD 2.0.0 a vyššej, sa môže použiť funkcia ImageCreateTrueColor(), ktorá je

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 76 -

takmer identická s ImageCreate(), pričom sa líši iba v tom, že vytvára obrázok True Color,

teda so 16 miliónmi farieb. Ďalším spôsobom, ako vytvoriť obrázok, je načítať ho zo súboru.

Pre tento prípad má GD funkciu ImageCreateFromJpeg(). Jediným argumentom funkcie je

reťazec obsahujúci meno súboru, z ktorého sa má načítať a vytvoriť obrázok. V prípade, že

sa načítanie podarí, funkcia vráti identifikátor vytvoreného obrázka. V opačnom prípade je

identifikátor obrázka prázdny, resp. obsahuje prázdny reťazec. To sa môže stať napr. vtedy,

keď súbor neobsahuje obrázok v danom formáte (v tomto prípade JPEG).

Príklad použitia funkcie ImageCreateFromJpeg():

/* súbor, z ktorého sa načíta obrázok JPG */ $subor="image.jpg"; /* vytvorenie obrazka */ $obrazok=ImageCreateFromJpeg($subor); /* ... tu príde kód pre prácu s obrázkom... */ ImageDestroy($obrazok);

Na poslednom riadku skriptu je volaná funkcia ImageDestroy(), ktorá s1úži na

uvoľnenie pamäte pridelenej obrázku. Ako parameter sa jej odovzdáva identifikátor obrázka,

ktorý má byť uvoľnený z pamäte. Je dôležité, aby sa táto funkciu volala vždy, pretože by

po skončení programu zostala zbytočne obsadená pamäť. Pamäť nie je uvoľňovaná

automaticky po skončení behu skriptu a preto je potrebné, aby sa korektne uvoľnili všetky

obrázky z pamäte funkciou ImageDestroy().

V skripte nie je ošetrený prípad, keď funkcia ImageCreateFromJpeg() zlyhá. To sa

môže stať v prípade, že súbor neexistuje alebo keď súbor neobsahuje platný obrázok JPEG.

Jeden zo spôsobov, ako ošetriť takýto prípad:

$subor="image.jpg"; $obrazok=@ImageCreateFromJpeg($subor); /*overenie, či identifikátor nie je neplatný */ if(!$obrazok): /* chybové hlásenie */ echo "nastala chyba"; else: echo "OK"; /*... všetko v poriadku, sem príde kód pre prácu s obrázkom ... ktorý sa nakoniec uvoľní z pamäte */ ImageDestroy($obrazok); endif;

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 77 -

Tento kód už spoľahlivo ošetruje prípadné chyby, ktoré môžu vzniknúť pri volaní funkcie

ImageCreateFromJpeg().

Obrázok vytvorený funkciou ImageCreateFromJpeg() je vždy True Color, teda so

16 miliónmi farieb.

Pre vytvorenie obrázka z formátu PNG, sa používa funkcia ImageCreateFromPNG().

Funkcia je podobná predchádzajúcej, takisto potrebuje ako parameter súbor s obrázkom

PNG. Návratovou hodnotou je opäť identifikátor obrázka, ktorého farebná hĺbka závisí od

farebnej hĺbky pôvodného obrázka v súbore. V prípade použitia GD knižnice verzie staršej

ako 1.6, sa môže používať funkciu ImageCreateFromGif() na vytváranie obrázkov

zo súborov s obrázkami vo formáte GIF. Táto funkcia má opäť rovnaké vlastnosti ako

predchádzajúce.

Skript na načítanie všetkých obrázkov typu JPEG, PNG a GIF z adresára, zistenie ich

formátu a ich spracovanie:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 78 -

$adr=opendir('.'); while($sub=readdir($adr)): if(!Is_Dir($sub)): $atr=GetImageSize($sub); switch($atr[2]): case 1: $obr=ImageCreateFromGif($sub); /*kód pre spracovanie obrázka GIF*/ echo $sub. " - GIF<br />"; /*koniec kódu pre spracovanie*/ ImageDestroy($obr); break; case 2: $obr=ImageCreateFromJpeg($sub); /*kód pre spracovanie obrázka JPEG*/ echo $sub. " - JPEG<br />"; /*koniec kódu pre spracovanie*/ ImageDestroy($obr); break; case 3: $obr=ImageCreateFromPng($sub); /*kód pre spracovanie obrázka PNG*/ echo $sub. " - PNG<br />"; /*koniec kódu pre spracovanie*/ ImageDestroy($obr); break; endswitch; endif; endwhile; closedir($adr);

Skript najprv zistí, či súbor obsahuje obrázok typu JPEG, PNG alebo GIF. Ak áno,

pomocou príznaku $atr[2] sa zistí, o ktorý konkrétny typ ide a podľa toho sa kód

vetví pre spracovanie príslušného typu obrázka.

Kresliace funkcie GD

Základnou jednotkou v obrázku je pixel. Funkcia na nastavenie (kreslenie) pixla Image-SetPixel(), ktorá vyžaduje štyri argumenty. Prvým je identifikátor obrázka v ktorom sa

funkcia používa. Tento identifikátor je vyžadovaný každou kresliacou funkciou GD knižnice.

Preto vždy pred kreslením musí byť vytvorený obrázok (buď vytvorením prázdneho obrázka

priamo v skripte alebo načítaním zo súboru). Druhým a tretím argumentom je daná pozícia

pixla, pričom druhý argument predstavuje x-ovú súradnicu a tretí y-ovú. Za počiatok sa

považuje ľavý horný roh, ktorý má súradnice [0,0]. Pozícia nastavovaného pixla by logicky

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 79 -

nemala prekročiť ani jeden z rozmerov obrázka, pretože hoci skript nevyvolá nijaké chybové

hlásenie, v obrázku nenastanú žiadne zmeny. Posledným parametrom funkcie je farba, na

ktorú má byť pixel nastavený. Tento parameter je typu int a zvykne sa odovzdávať vo forme

premennej, do ktorej sa uloží index farby v palete.

Vykreslenie vodorovnej čiary dlhej 10 pixlov:

/* vytvorenie obrázka */ $obrazok=ImageCreate(100,100); /* vykreslenie čiary pomocou cyklu a funkcie ImageSetPixel() */ for ($i=0; $i<10; $i++) ImageSetPixel($obrazok,$i,50,$cierna); /*uvoľnenie obrázka z pamäte*/ ImageDestroy($obrazok);

Tento kód vykreslí vodorovnú čiaru od pozície [0,50] po [10,50]. Na nastavenie jej farby treba

priradiť premennej $cierna index príslušnej farby v palete.

Na kreslenie čiar v obrázkoch je v GD knižnici už preddefinovaná funkcia ImageLine().

Táto funkcia umožní kresliť čiary oveľa pohodlnejšie ako predchádzajúca. Prvým parametrom

funkcie je identifikátor obrázka, v ktorom treba čiaru nakresliť. Ďalšie dva parametre určujú

súradnice v obrázku, kde sa bude čiara začínať, pričom druhý parameter predstavuje x-ovú

súradnicu a tretí y-ovú súradnicu. Ďalšie dva parametre rovnakým spôsobom opisujú súradnice

konca čiary. Posledným parametrom je index farby, ktorou bude čiara nakreslená. Tento index

môže byť nahradený vzorkou štetca, vďaka čomu sa dajú kresliť aj vzorkované čiary. Aby sa tento

spôsob vykresľovania čiary mohol používať, musí sa najprv príslušný vzor vytvoriť ako obrázok

(je jedno, akým spôsobom) a potom zavolať funkciu ImageSetBrush(), ktorej prvým

parametrom je identifikátor obrázka, v ktorom sa bude daný typ štetca používať a druhým

parametrom je identifikátor obrázka obsahujúci žiadaný štetec. Keďže štetec je tiež iba

obyčajným obrázkom, mal by byť vždy po použití uvoľnený z pamäte. Po uvoľnení z pamäte sa

už ale nesmie používať.

Príklad vykreslí čiaru od súradnice [10,10] po súradnicu [70,70]. Vzorec štetca je načítaný zo

súboru JPG.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 80 -

/* vytvorenie obrázka */ $obrazok=ImageCreate(100,100); /* načítanie štetca */ $stetec=ImageCreateFromJpeg("stetec.jpg"); /* nastavenie štetca pre obrázok */ ImageSetBrush($obrazok,$stetec); /* vykreslenie čiary */ ImageLine($obrazok,10,10,70,70,$Brushed); /* uvoľnenie štetca z pamäte */ ImageDestroy($stetec); /* uvoľnenie obrázka z pamäte */ ImageDestroy($obrazok); Typ štetca sa dá tiež nastaviť pomocou funkcie ImageSetStyle(). Tá sa líši od

predchádzajúcej tým, že typ štetca nie je nastavený iným obrázkom, ale dá sa priamo

definovať, ktoré pixle a akou farbou budú vykreslené. Tento spôsob vykresľovania čiary je

náhradou za zastaraný typ funkcie ImageDashedLine(). Funkcia ImageSetStyle()

vyžaduje podľa špecifikácie v GD knižnici tri parametre - identifikátor obrázka, pole

obsahujúce špecifikáciu pixlov (farby) a posledným je veľkosť tohto poľa.

GD knižnica tiež umožňuje kreslenie polygónov. Ide o dvojrozmerné tvary, ktoré sú

definované súradnicami ich vrcholov. Na kreslenie polygónov sa používa funkcia Image-Polygon(). Jej prvým parametrom je opäť identifikátor obrázka. Ďalším parametrom je

pole celočíselných prvkov, ktoré definujú súradnice jednotlivých bodov. Tieto súradnice

musia byť v poli uložene postupne, vždy najprv x-ová súradnica a za ňou y-ová súradnica.

Prvým prvkom v poli je x-ová súradnica prvého bodu a druhým prvkom je y-ová súradnica

toho istého bodu a tak to pokračuje ďalej.

Definovanie poľa 3 bodov, teda pre polygón s tromi vrcholmi (trojuholník):

$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; Tretím parametrom je počet bodov, ktorý má polygón obsahovať. Mala by to byť polovica

počtu prvkov poľa odovzdávaného ako druhý parameter, lebo jeden bod zodpovedá práve

dvom prvkom v poli. Je možné zadať aj menšie číslo, než je počet bodov obsiahnutých v

poli, čo sa môže využiť v prípade, ak netreba, aby boli použité všetky body. Táto hodnota

nesmie byť nižšia ako 3, preto6e polygón má minimálne 3 vrcholy. Posledným parametrom

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 81 -

funkcie ImagePolygon() je farba, ktorou bude polygón nakreslený. Funkcia

ImagePolygon() slúži na kreslenie nevyplnených polygónov, teda iba na kreslenie ich

obrysov. Na kreslenie vyplnených polygónov, slúži funkcia ImageFilledPolygon().

Špecifikácia a počet parametrov tejto funkcie sú úplne rovnaké ako u funkcie

ImagePolygon(), rozdiel spočíva iba v tom, že polygón vykreslený funkciou bude aj

vyplnený farbou, špecifikovanou posledným parametrom.

Nakreslenie vyplneného trojuholníka:

$obrazok = ImageCreate(100,100); /* súradnice bodov / $body[0]=10; $body[1]=10; $body[2]=20; $body[3]=10; $body[4]=15; $body[5]=20; /* vykreslenie trojuholníka */ ImageFilledPolygon($obrazok,$body,3,$farba); /* uvoľnenie z pamäte */ ImageDestroy($obrazok);

Špeciálnym typom polygónu je obdĺžnik. Na kreslenie obdĺžnikov (resp. štvorcov), slúži

špeciálna funkcia ImageRectangle(). Jej použitie je veľmi jednoduché - vždy sa jej

musí ako prvý argument odovzdať identifikátor obrázka, v ktorom sa má obdĺžnik

vykresliť. Ďalšími parametrami sú x-ová súradnica a y-ová súradnica pravého horného rohu

obdĺžnika a za nimi nasledujú súradnice pravého dolného rohu obdĺžnika v rovnakom

poradí: najprv x-ová a potom y-ová súradnica. Posledným parametrom funkcie je farba rámu

obdĺžnika. Jednotlivé súradnice vykresľovaného obdĺžnika nesmú prekračovať hranice

obrázka a ani byť menšie ako 0. Ak sa tak stane, vykreslí sa iba časť obdĺžnika, ktorá sa

zmestí na obrázok. Funkcia ImageRectangle() vykresľuje iba rám obdĺžnika, pričom

jeho vnútro zostáva nezmenené. To je vlastne ekvivalentom štvornásobného volania funkcie

ImageLine() s príslušnými parametrami. Pre vykreslene vyplneného obdĺžnika, sa musí

použiť funkcia ImageFilledRectangle. Táto funkcia m8 rovnaký počet a špecifikáciu

parametrov ako funkcia ImageRectangle(). Rozdiel spočíva v tom, že obdĺžnik

nepozostáva iba z rámu, ale je vyplnený farbou, ktorá sa zadá ako posledný parameter. To

znamená, že takýto obdĺžnik nebude mať žiadny viditeľný rám, pretože bude rovnakej

farby ako výplň.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 82 -

Vyplnený obdĺžnik s rámom inej farby:

$obrazok=ImageCreate(100,100); /* vykreslenie obsahu obdĺžnika */ ImageFilledRectangle($obrazok,10,10,90,90,$farbal); /* vykreslenie rámu obdĺžnika */ ImageRectangle($obrazok,10,10,90,90,$farba2); ImageDestroy($obrazok); Skript vykreslí obdĺžnik s rámom farby definovanej v premennej $farba2 a výplňou farby

definovanej v premennej $farbal. Najprv sa vykresľuje obsah a až potom rám. Je to

možne spraviť aj opačne, ale potom musí byť výplň menšia, aby nezakryla už nakreslený

rám.

GD knižnica takisto umožňuje kreslenie oblúkov, úplných aj neúplných, vo všeobecnosti

elipsovitého tvaru. V tomto prípade sa používa funkcia ImageArc(), ktorá opäť ako

prvý parameter vyžaduje identifikátor obrázka. Ďalšie dva parametre charakterizujú stred

elipsy (v prípade, že sa má vykresliť iba oblúk, charakterizujú súradnice stredu elipsy

danej pre vykresľovaný oblúk), pričom najprv sa zadáva x-ová súradnica a potom y-ová.

Ďalšie dva parametre špecifikujú rozmery elipsy (resp. charakteristickej elipsy pre daný

oblúk). Najprv sa musí zadať šírka a následne jej výška. Ďalšími dvoma parametrami sa

určuje, aká časť elipsy, resp. aký oblúk bude vykreslený. Prvý z týchto dvoch parametrov

vyjadruje počiatočnú a druhý konečnú pozíciu vykresľovaného oblúka v stupňoch, takže

by tieto dva parametre mali nadobúdať hodnoty od 0 do 360. Počiatočná pozícia musí byť

menšia ako koncová. V prípade, že koncová pozícia prekročí číslo 360, je na ňu použitá

operácia modulo 360 (teda za koncovú pozíciu sa považuje jej zvyšok po delení 360). Uhol

je určený vzhľadom na pomyselnú os x v obrázku, teda spomínane parametre určujú

veľkosť uhla zovretého s osou x v smere hodinových ručičiek. Pre vykreslenie kruhu, stačí

zadať rovnaké rozmery (šírka a výška), počiatočnú pozíciu 0 a koncovú pozíciu 360.

Posledným parametrom funkcie je opäť farba, ktorou má byť oblúk vykreslený. Pre

vykreslenie vyplnenej elipsy/oblúku, sa musí použiť funkcia ImageFilledArc(). Táto

funkcia preberá všetky parametre od funkcie ImageArc() a pridáva ešte jeden - štýl.

Tento posledný parameter zadáva funkcii spôsob, ktorým má byť vyplnený oblúk

vykreslený – pri hodnote 0 bude vykreslený klasický vyplnený oblúk, hodnota 1 vyjadruje

„odseknutie“ oblúkovitej časti kruhu, teda je vykreslený trojuholník. V poslednom

prípade musí byť rozdiel medzi koncovou a počiatočnou pozíciou vykresľovaného oblúka

menší ako 180, pretože inak nie je možne trojuholník vykresliť a na obrázku sa neudejú

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 83 -

žiadne zmeny. Väčšie využitie má však prvý uvedený spôsob, ktorý sa dá využiť napríklad

na kreslenie koláčových grafov.

Vykreslenie čiastky koláčového grafu:

$obrazok=ImageCreate(100,100); /* vykreslenie malého dielika koláčového grafu s uhlom 60 stupňov */ ImageFilledArc($obrazok,50,50,40,40,30,90,$farba,1); ImageDestroy($obrazok);

Ak treba určitú ohraničenú časť obrázka vymaľovať nejakou farbou, GD knižnica umožňuje

takzvaný flood fill, čo by sa dalo interpretovať ako vyliatie farby na jednom bode obrázka,

pričom farba sa rozleje na všetky strany a pokračuje, kým nenarazí na nejakú „bariéru“,

ktorá v tomto prípade predstavuje nejakú inú farbu. Základnou floodovaciou funkciou je

ImageFill(), ktorej použitie je veľmi jednoduché. Stačí jej zadať identifikátor obrázka

ako prvý parameter a x-ovú a y-ovú súradnicu bodu, kde sa má začať s „rozlievaním“

farby, ako ďalšie dva parametre. Posledným parametrom je farba, ktorá sa má použiť na

floodovanie. Funkcia vyfarbí danou farbou zadaný bod (pixel) a všetky priľahlé body

rovnakej farby, akú mal pôvodne zadaný bod. Na floodovanie je možne miesto jednej farby

použiť aj vzorku, ktorá musí byť pred použitím definovaná funkciou ImageSetTile().

Jej použitie je podobné ako použitie už spomínanej funkcie ImageSetBrush(). Najprv

sa musí vytvoriť obrázok (napr. načítaním zo súboru alebo pomocou funkcie

ImageCreate()) a následne odovzdať tento obrázok funkcii ImageSetTile() ako

druhý parameter. Prvým parametrom je opäť obrázok v ktorom sa vzorka používa. Keď sa

už vzorka nebude potrebovať, musí sa opäť uvoľniť z pamäte volaním funkcie

ImageDestroy(). Po priradení vzorky danému obrázku stačí miesto farby ako

posledného parametra zadať funkcii ImageFill() hodnotu $Tiled (gdTiled podľa

špecifikácie GD knižnice). Výplňová vzorka však nesmie mať transparentnú farbu.

Ak treba vyplniť farbou určitú časť obrázka, pričom sa má špecifikovať, ktorá farba bude

predstavovať spomínanú „bariéru“ pre zastavenie rozlievania, treba použiť funkciu

ImageFillToBorder(). Prvé tri parametre sú zhodné s prvými tromi parametrami

funkcie ImageFill(), teda identifikátor obrázka a x-ová a y-ová súradnica bodu

vyjadrujúceho začiatok, resp. centrum rozlievania. Ďalším parametrom sa však odlišuje. Je

ním farba, ktorá má znamenať bariéru pre rozlievanie farby. Táto farba nemôže byť

vzorkou, musí byť definovaná ako obyčajná, pevná farba. Posledným parametrom je farba

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 84 -

výplne, teda rozlievaná farba, pričom tá môže byť opäť vzorkou. Výsledkom funkcie je

vyfarbenie bodu zadaného súradnicami a všetkých priľahlých bodov až po také body,

ktorých farba zodpovedá farbe špecifikovanej ako bariéra.

Skript nakreslí úplný kruh a vymaľuje jeho vnútro 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 následne ho vyplní farbou $farba2 za

pomoci funkcie ImageFillToBorder(), pričom bariérou je práve farba $farbal.

Kreslenie textov

Pre „kreslenie” textov sa používajú funkcie ImageString() a ImageStringUp(),

ktoré majú úplne rovnaké parametre. Rozdiel medzi nimi spočíva v tom, že prvá vykreslí

reťazec horizontálne a druhá vert ikálne. Prvým parametrom je ident ifikátor

obrázka, za ním nasleduje font, ktorým má byť reťazec vykreslený. Zabudované fonty majú

hodnoty v rozpätí od 1 po 5. Ďalšími dvoma parametrami sú x-ová a y-ová súradnica, od

ktorých má byť reťazec vykreslený. Nasleduje samotný reťazec, ktorý má byť

vykreslený. Posledným parametrom je farba, ktorou má byť reťazec vykreslený.

Vykreslenie reťazca „Text“ na pozíciu [10,10] zabudovaným fontom 3 a farbou uloženou v

premennej $farba:

ImageString($obrazok,3,10,10,"Text",$farba);

Práca s farbami

Každý obrázok v štruktúre gdImage v knižnici GD má svoju paletu. Táto paleta je vlastne

pole indexované od nuly, ktoré obsahuje jednotlivé RGB hodnoty pre dané farby

v palete. Pri vytvorení obrázka funkciou ImageCreate() je paleta obrázka prázdna. Na

vytvorenie novej farby v palete sa musí použiť funkcia ImageColorAllocate(). Prvým

parametrom je identifikátor obrázka, v ktorom sa daná farba nastavuje (alokuje).

Nasledujú tri hodnoty, každá v rozpätí 0 až 255, ktoré predstavujú RGB hodnoty danej farby.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 85 -

Funkcia vyhľadá v palete prvý voľný prvok, nastaví jeho RGB hodnotu podľa jej zadaných

parametrov a vráti index tohto prvku. Preto je potrebné túto návratovú hodnotu uchovať na

ďalšie použitie v kresliacich funkciách. V prípade, že sa nepodarí nájsť voľný prvok v palete

(to sa môže stať hlavne v prípade, že obrázok má len 256 farieb), vráti funkcia hodnotu -1. Pri

vytváraní nového obrázka prvé volanie tejto funkcie po vytvorení obrázka s prázdnou paletou

funkcia ImageCreate() spôsobí nastavenie pozadia tohto obrázka, teda alokovane farby s

indexom 0. Táto funkcia však nedbá na už existujúce farby, takže ak farba s rovnakou RGB

hodnotou v palete existuje, funkcia ju ignoruje, vždy hľadá prázdny prvok v

palete.

Použitie funkcie ImageColorAllocate():

/* vytvorenie obrázku */ $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 červeného štvorca */ ImageFilledRectangle($obr,20,20,80,80,$cervna); /* zmazanie obrázka */ ImageDestroy($obr); Skript vytvorí obrázok s rozmermi 100 x 100 pixlov, nastaví jeho pozadie na čierne a

vykreslí do jeho stredu vyplnený červený štvorec.

Pri vytváraní farieb v palete s obmedzeným počtom položiek môže byť zbytočne neefektívne

alokovať farby, ktoré už v palete existujú. Preto existuje funkcia ImageColorExact(),

ktorá má rovnaký zoznam parametrov ako funkcia ImageColorAllocate(), pričom

rozdiel spočíva v tom, že namiesto alokovania novej farby vracia index v palete už existujúcej

farby. Funkcia vracia index prvej farby v palete, ktorej RGB hodnota je zhodná s tou, ktorá je

zadaná ako parameter. V prípade, že taká farba v palete neexistuje, návratovou hodnotou

je -1.

Predchádzajúci príklad, zlepšený o ošetrenie pre prípad, že červená farba v palete už

existuje (prakticky sa toto nemôže stať, keďže ide o úplne nový obrázok s prázdnou paletou).

Stačí nahradiť riadok, kde sa alokuje červená farba, nasledujúcim riadkom:

if(($cervena=ImageColorExact($obr,255,0,0))==1) $cervena=ImageColorAllocate($obr,255,0,0)

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 86 -

Funkcia ImageColorExact() sa použije na nájdenie farby s RGB hodnotou 255,0,0 a jej

návratová hodnota sa uloží do premennej $cervena. Táto premenna je hneď testovaná na

rovnosť s -1 a ak je podmienka splnená, znamená to, že funkcii sa nepodarilo nájsť danú

farbu, a teda je volaná funkcia ImageColorAllocate(), ktorej návratová hodnota sa

opäť uloží do premennej $cervena.

Môže sa však stať, že funkcia ImageColorExact() nemusí byť vo svojom hľadaní úspešná

a nová farba aj napriek tomu nemôže byť alokovaná. Stačí však nájsť farbu, ktorá je podobná

tej, ktorá je zadaná pomocou RGB hodnôt. Pre tento prípad sa používa funkcia

ImageColorClosest(). Táto funkcia má opäť rovnaký zoznam aj typy parametrov ako

predchádzajúce dve. Rozdiel spočíva v tom, že táto funkcia prejde celú paletu a hľadá

najpodobnejšiu farbu k farbe zadanej parametrami ako RGB hodnotu. V prípade, že v palete

ešte neboli alokované žiadne farby, vráti funkcia -1, inak vráti index najpodobnejšej farby.

Táto funkcia môže byť použitá napríklad vtedy, keď zlyhajú ImageColorExact() alebo

ImageColorAllocate(), čo sa môže stať v prípade, keď je paleta už plná a žiadaná

farba so žiadanou RGB hodnotou v nej neexistuje.

Doplnenie predchádzajúceho príkladu:

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 prípade, že zlyhá vyhľadanie farby so žiadanou RGB hodnotou a zlyhá aj alokovanie

novej farby, je vyhľadaná farba najpodobnejšia žiadanej farbe. To znamená, že týmto

spôsobom bude uložená do premennej $cervena vždy nejaká farba v závislost i od

palety, takže po tomto ošetrení sa môže táto premenná ako farba bezpečne

používať.

Tento spôsob ošetrovania správneho vyhľadania farby je dosť ťažkopádny. Preto je tu funkcia

ImageColorResolve(). Zoznam a typ parametrov je opäť rovnaký ako pri

predchádzajúcich funkciách, teda identifikátor obrázka a tri číselné hodnoty predstavujúce

RGB hodnotu danej farby. Táto funkcia sa najprv pokúsi nájsť farbu s danou RGB hodnotou

v palete. Ak uspeje, vráti jej index, inak sa pokúsi alokovať novú farbu so žiadanou RGB

hodnotou. V prípade úspechu vráti index novovytvorenej farby, v opačnom prípade

vyhľadá najpodobnejšiu farbu (ako funkcia ImageColorClosest()) a vráti jej index.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 87 -

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

Ďalšie funkcie pre prácu s farbami

Funkcia ImageColorsTotal() má jeden parameter, ktorým je identifikátor obrázka.

Vracia počet alokovaných farieb v palete daného obrázka.

Funkcie ImageColorRed(), ImageColorGreen() a ImageColorBlue()

potrebujú dva parametre, identifikátor obrázka a farbu (index farby). Vrátia príslušnú

hodnotu zložky RGB (červená, zelená, modrá) farby danej parametrom.

Funkcii ImageGetTransparent() sa odovzdáva ako parameter identifikátor obrázka a

ona vráti index farby, ktorá je definovaná ako transparentná. V prípade, že žiadna farba v

palete nie je definovaná ako transparentná, vráti funkcia hodnotu -1.

Funkcia ImageColorDeallocate()uvoľní v obrázku, ktorý sa jej zadá ako prvý

parameter, index farby, ktorá sa jej zadá ako druhý parameter.

Kopírovanie a zmena veľkosti

Na kopírovanie obrázka alebo jeho obdĺžnikovej časti slúži funkcia ImageCopy().

Táto funkcia má dlhší zoznam parametrov: prvým je identifikátor obrázka, do ktorého sa

bude kopírovať, teda cieľ. Druhým je identifikátor zdrojového obrázka. Nasledujú x-ová a y-

ová súradnica bodu v cieli, od ktorého bude kopírovaná časť vykreslená. Ďalšími

parametrami sú x-ová a y-ová súradnica bodu v zdroji, ktorý znamená počiatočný bod

kopírovaného obdĺžnika a nakoniec dĺžka a šírka kopírovaného obdĺžnika. Cieľ a zdroj môže

byť aj ten istý obrázok, ale iba v prípade, že sa kopírovaný obdĺžnik nekryje s cieľovým

obdĺžnikom.

Na zistenie veľkosti obrázka slúžia funkcie ImageSX() a ImageSY(), ktorým sa

odovzdáva ako jediný parameter identifikátor obrázka a ako návratová hodnota je šírku, resp.

výška obrázka.

Použitie funkcie ImageCopy() na skopírovanie časti obrázka do iného obrázka:

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 88 -

/* vytvorenie dvoch obrázkov */ $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); /* skopírovanie obrázka */ ImageCopy($ciel,$zdroj,0,0,20,20,ImageSX($ciel), ImageSY($ciel)); /* uvoľnenie obrázkov z pamäte */ ImageDestroy(Szdroj); ImageDestroy($ciel); Skript vytvorí najprv dva obrázky: $zdroj s veľkosťou 100 x 100 pixlov a $ciel s veľkosťou

50 x 50 pixlov. Následne sa nastaví farba pozadia oboch obrázkov na bielu. Potom je na zdrojový

obrázok vykreslený červený štvorec. Nasleduje použitie funkcie ImageCopy(). Zo zdroja sa

skopíruje obrázok od pozície [20,20] veľkosti rovnakej, akú má cieľ (veľkosť sa zisťuje

pomocou funkcii ImageSX() a ImageSY()) a vykreslí túto oblasť do cieľa od pozície [0,0].

Výsledkom bude to, že $ciel bude obsahovať červený štvorec veľkosti presne rovnej veľkosti

obrázka. Nebude vidieť nič z jeho bieleho pozadia. V cieľovom obrázku je štvorec vykreslený

rovnakou farbou ako v zdrojovom, aj keď v cieľovom obrázku táto farba nebola vôbec

alokovaná. Je to tak preto, že táto funkcia pri kopírovaní vždy hľadá v palete cieľového obrázka

pixle s RGB hodnotou totožnou s RGB hodnotou pixlov v zdrojovom obrázku. V prípade, že sa

to nepodarí, pokúsi sa funkcia danú farbu alokovať. Ak sa nepodarí ani to, je nájdená

najpodobnejšia farba.

Na zmenu veľkosti obrázka pri kopírovaní poskytuje GD knižnica funkciu Image-CopyResized(). Táto funkcia má rovnaký zoznam parametrov ako funkcia

ImageCopy(), ale pridáva k nemu ešte dva - šírku a výšku kopírovaného obrázka v cieľovom

obrázku. To znamená, že obrázok sa môže zväčšovať aj zmenšovať, stačí zadať výšku a šírku v

cieľovom obrázku väčšiu (resp. menšiu pri zmenšovaní), ako bola veľkosť kopírovanej plochy v

zdroji. Skopírovanie celého zdrojového obrázka v predchádzajúcom príklade a zmenšenie na

veľkosť cieľového obrázka (nahradenie riadku s funkciou ImageCopy()):

ImageCopyResized($ciel,$zdroj,0,0,0,0, ImageSX($ciel),ImageSY($ciel),ImageSX(Szdroj), ImageSY($zdroj))

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 89 -

Táto funkcia sa pri kopírovaní správa podobne ako ImageCopy() - vyhľadáva pixle s

rovnakou RGB hodnotou a pri neúspechu postupuje podobne, teda skúsi alokovať novú farbu

alebo nájsť najpodobnejšiu farbu, čiže využíva ImageColorResolve().

V prípade práce s True Color obrázkami, sa môže pri ich zväčšovaní a zmenšovaní

použif funkcia ImageCopyResampled(). Táto funkcia funguje podobne ako

ImageCopyResized(), má aj rovnaký zoznam a typy parametrov. Rozdiel spočíva v tom,

že pri zmene veľkosti obrázka má výsledný obrázok lepšiu kvalitu ako pri použití Image-CopyResized().

Špeciálnou funkciou na kopírovanie obrázkov je ImageCopyMerge(). Funkcia slúži na

,,splynutie" kopírovaného a pôvodného obrázka. Má rovnaký zoznam a typy parametrov ako

funkcia ImageCopy(), ale pridáva k nemu ešte jeden - percentuálny podiel splynutia. Pri

nastavení tejto hodnoty na 100 bude výsledok funkcie rovnaký ako pri použití

ImageCopy(). Skopírovaný obrázok bude vykreslený presne tak, ako bol v zdroji. Táto

funkcia môže byt využitá na zvýrazňovanie časti cieľového obrázka skopírovaním

jednofarebného obdĺžnika funkciou ImageCopyMerge() a zadaním 50 ako posledného

parametra.

Poslednou funkciou, v súvislosti s kopírovaním obrázkov, je ImagePaletteCopy(). Jej

použitie je užitočné vtedy, keď treba skopírovať paletu jedného obrázka do druhého.

Identifikátor cieľového obrázka sa zadáva ako prvý parameter a identifikátor zdroja ako

druhý parameter.

Ukladanie obrázkov

Na ukladanie vo formáte JPEG je k dispozícii funkcia ImageJpeg(). Funkcia má tri

parametre. Prvým je identifikátor obrázka. Nasleduje súbor, do ktorého sa má uložiť

obrázok. Ak subor už existuje, skript ho prepíše. Posledným parametrom funkcie je koeficient

kvality, ktorý by sa mal pohybovať v rozmedzí od 0 po 95. Ak je tento koeficient záporný,

použije sa implicitná hodnota, ktorá poskytuje dobrú kvalitu pri nízkom objeme výsledného

súboru. GD knižnica podporuje aj prekladaný režim obrázkov. Prekladaný režim obrázka,

ktorý je ešte v pamäti, sa môže nastaviť funkciou ImageInterlace(). Ako prvý

parameter sa jej zadá identifikátor obrázka a druhým parametrom je číslo, ktoré identifikuje,

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 90 -

či sa má prekladaný režim nastaviť alebo zrušiť. Hodnota 0 znamená vypnutie prekladaného

režimu, nenulová hodnota jeho zapnutie.

/* vytvorenie obrázka */ $obrazok=ImageCreate(100,100); /* kód pre prácu s obrázkom, kreslenie atď.. */ /* nastavenie prekladaného režimu */ ImageInterlace($obrazok,1); /* uloženie obrázka na disk */ ImageJpeg($obrazok, "obrazok.jpg",-1); /* uvoľnenie obrázka z pamäte */ ImageDestroy($obrazok); Skript vytvorí obrázok s veľkosťou 100 x 100 pixlov v pamäti. Následne by tam miesto

komentára mal byt' kód, ktorý nejakým spôsobom pracuje s obrázkom - kreslí, kopíruje,

mení veľkosť atď. Potom funkciou ImageInterlace() nastaví prekladaný režim. Potom

uloží obrázok na disk do súboru obrazok.jpg vo formáte JPEG v implicitnej kvalite

(parameter -1). Nakoniec treba uvoľniť pamäť funkciou ImageDestroy().

Na uloženie obrázka vo formáte PNG slúži funkcia ImagePng(). Jej použitie je o niečo

jednoduchšie ako použitie funkcie ImageJpeg(). Má iba dva parametre. Prvým je

identifikátor obrázka a druhým názov súboru, do ktorého sa má ukladať. Pri tomto formáte sa

môže použiť aj prekladaný režim a to rovnakým spôsobom ako pri formáte JPEG, teda

použitím funkcie ImageInterlace().

Ak to verzia GD knižnice podporuje, dajú sa ukladať aj obrázky vo formáte GIF pomocou

funkcie ImageGif(). Táto funkcia je podobná funkcii ImagePng(), takisto sa jej musí

odovzdať ako prvý parameter identifikátor ukladaného obrázka a ako druhý parameter názov

súboru, do ktorého má byť obrázok uložený.

Vykresľovanie na štandardný výstup

Pri zápise na štandardný výstup sa nesmie zabudnúť na zaslanie hlavičkovej informácie

o obsahu dát prehliadaču. Toto sa zabezpečí použitím funkcie header() a zaslaním para-

metra content-type. Jeho hodnota závisí od použitého grafického formátu, pre

obrázky JPEG to bude image/jpeg, pre PNG image/png a pre GIF image/gif.

header ("content-type: image/jpeg");

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 91 -

Posielanie obrázkov na štandardný výstup je veľmi jednoduché, vlastne funguje vďaka

rovnakým funkciám ako zápis do súborov, s tým rozdielom, že druhý parameter (názov súboru)

sa vynechá. Funkcii sa teda odovzdáva iba jediný parameter a tým je identifikátor obrázka,

ktorý sa má vykresliť. V prípade funkcie ImageJpeg() sa odovzdáva takisto iba jeden

parameter, identifikátor obrázka, takže sa vynechá nielen názov súboru, ale aj koeficient kvality.

V tomto prípade je použitý implicitný koeficient.

Predchádzajúci príklad prepracovaný tak, aby bol obrázok hneď zobrazený v prehliadači:

/* zaslanie hlavičky */ header("content-type: image/jpeg"); /* vytvorenie obrázka */ $obrazok=ImageCreate(100,100); /*... kód pre prácu s obrázkom, kreslenie atď. ...*/ /* nastavenie prekladaného režimu */ ImageInterlace($obrazok,l); /* vykreslenie obrázka na výstup */ ImageJpeg($obrazok); /* uvoľnenie obrázka z pamäte */ ImageDestroy($obrazok); Skript vykreslí obrázok priamo na výstup bez ukladania na disk. Týmto spôsobom sa dajú

vkladať obrázky kreslené pomocou PHP skriptov do XHTML dokumentov priamo do

elementu <img />. Ako hodnota atribútu src sa odovzdá cesta ku skriptu, ktorý obrázok

vykresľuje. Nesmie sa však zabudnúť na to, aby tento skript správne odoslal hlavičku a aby sa

počas behu skriptu nevyskytla chyba, ktorá by zaslala ako výstup nejaké chybové alebo varovné

hlásenie. Výhodou takéhoto prístupu je fakt, že skript vykresľujúci obrázok je

plnohodnotným PHP skriptom, ktorému sa môž zasielať parametre. Na základe nich potom

môže skript meniť výstup, pričom element <img /> bude stále odkazovať na rovnaký

súbor.

Pokiaľ treba obísť obmedzenie, že pri vykresľovaní JPEG obrázka na výstup sa nedá nastaviť

kvalita obrázka, môže sa toto obmedzenie obísť tak, že vytvorený obrázok sa najprv uloží na

disk a následne sa načíta obsah vytvoreného súboru a odošle na štandardný výstup.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 92 -

/* zaslanie hlavičky */ header("content-type: image/jpeg"); /* vytvorenie obrázka */ $obrazok=ImageCreate(100,100); /*... kód pre prácu s obrázkom, kreslenie atď. ...*/ /* nastavenie prekladaného režimu */ ImageInterlace($obrazok,1); /* vykreslenie obrázka do súboru */ ImageJpeg($obrazok,"obrazok.jpg",50); /* uvoľnenie obrázka z pamäte */ ImageDestroy($obrazok); /* zaslanie obsahu súboru na výstup */ readfile("obrazok.jpg"); /* zmazanie súboru */ unlink("obrazok.jpg"); Obrázok je najprv uložený na disk do súboru obrazok.jpg s koeficientom kvality 50.

Následne sa súbor načítal a jeho obsah zašle na štandardný výstup funkciou readfile().

Nakoniec sa súbor zmaže.

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 93 -

Obsah Vkladanie PHP do XHTML ...................................................................................................1

Kombinácia PHP s XHTML kódom ....................................................................................2 Jednoduchá práca s formulármi .........................................................................................4

Syntax jazyka PHP.................................................................................................................5 Ladenie skriptov a ošetrovanie chýb.......................................................................................7

Syntaktické chyby ...............................................................................................................7 Logické chyby.....................................................................................................................7 Ošetrenie chýb....................................................................................................................8

Premenné, polia, výrazy, vetvenie, cykly................................................................................9 Premenné ...........................................................................................................................9

Typ integer .....................................................................................................................9 Typ double ...................................................................................................................10 Typ string .....................................................................................................................10

Polia ................................................................................................................................12 Inicializácia poľa ..........................................................................................................12 Funkcie pre prácu s poľom ...........................................................................................13 Viacrozmerné polia ......................................................................................................14

Pretypovanie premenných.................................................................................................14 Výrazy ..............................................................................................................................15

Matematické operátory .................................................................................................16 Operátory na manipuláciu s bitmi čísla .........................................................................17 Logické výrazy a operátory...........................................................................................18 Operátor na spájanie reťazcov.......................................................................................20 Podmienený operátor....................................................................................................20 Priorita operátorov........................................................................................................20

Vetvenie............................................................................................................................22 Príkaz if........................................................................................................................22 Príkaz if-else.................................................................................................................23 Príkaz if-elseif-else .......................................................................................................25 Príkaz switch ................................................................................................................26

Cykly ................................................................................................................................28 Príkaz while..................................................................................................................28 Cyklus do-while ...........................................................................................................28 Cyklus for.....................................................................................................................29

Príkazy na načítanie skriptov, definícia vlastných funkcií .....................................................31 Príkazy na načítanie skriptov............................................................................................31

Príkaz require ...............................................................................................................31 Príkaz include...............................................................................................................32

Definícia vlastných funkcií................................................................................................32 Rozsah platnosti premenných .......................................................................................33 Štandardné hodnoty parametrov....................................................................................34 Statické premenné ........................................................................................................35

Funkčné formuláre ...............................................................................................................36 Vstupné pole .....................................................................................................................37 Odoslanie formulára ........................................................................................................37 Zaškrtávacie polia ............................................................................................................38 Prepínacie tlačidlá ...........................................................................................................40

Základy jazyka PHP –––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

- 94 -

Zoznamy ...........................................................................................................................40 Formuláre na úrovni ........................................................................................................42

Spolupráca PHP s databázami ..............................................................................................46 Úvod do jazyka SQL – vytvorenie tabuľky; pridanie, mazanie, modifikácia záznamu...........49

Vytvorenie tabuľky............................................................................................................49 Pridanie nového záznamu .................................................................................................50 Výber a prezeranie záznamov ...........................................................................................50 Mazanie záznamov v tabuľke ............................................................................................51 Modifikácia záznamu v tabuľke ........................................................................................52 Začleňovanie SQL do skriptov ..........................................................................................52

Manipulácia s dátami pomocou prehliadača..........................................................................57 Práca so súbormi v PHP .......................................................................................................66

Základné funkcie ..............................................................................................................66 Ďalšie funkcie na prácu so súbormi ..................................................................................67 Systémové funkcie.............................................................................................................69 Ďalšie možnosti čítania súborov .......................................................................................70 Problémy pri paralelnej práci so súbormi.........................................................................71

PHP a obrázky......................................................................................................................73 Funkcia GetImageSize() ...................................................................................................73 Úvod do GD .....................................................................................................................75

Vytváranie obrázkov a ich uvoľňovanie z pamäte .........................................................75 Kresliace funkcie GD ...................................................................................................78 Kreslenie textov............................................................................................................84 Práca s farbami .............................................................................................................84 Ďalšie funkcie pre prácu s farbami................................................................................87 Kopírovanie a zmena veľkosti ......................................................................................87 Ukladanie obrázkov......................................................................................................89 Vykresľovanie na štandardný výstup ............................................................................90

Obsah...................................................................................................................................93

Zoznam bibliografických odkazov (1) Kosek Jiří: PHP: Tvorba interaktivních internetových aplikací. Grada 1999, 490 s. ISBN 80-7169-373-1 (2) Ullman Larry: PHP: pokročilé programování pro World Wide Web. Softpress 2003, 512 s. ISBN 80-86497-36-4 (3) Gilmore W. Jason: PHP MySQL 5: Kompendium znalostí pro začátečníky i profesionály. Zoner Press 2007, 864 s. ISBN 80-86815-53-6

Poznámky

Autor Ing. Andrej Trnka Názov Základy jazyka PHP Určené Pre KI FPV UCM Vydanie 1. vydanie Dostupnosť http://ki.fpv.ucm.sk/skripta Rozsah 94 strán Tlač UCM Trnava Vydané Január 2008 ISBN 978-80-89220-99-1

ISBN 978-80-89220-99-1