You are on page 1of 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
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-

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.

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

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.

-2-
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
...
<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>

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

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.

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

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é.

-5-
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<?
$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;
?>

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

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

-7-
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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)

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

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.

-9-
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Čí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.

- 10 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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 á

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

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"]=jaroslav@gmail.com;
$adresy["Karol"]=karol@pobox.sk;

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

- 12 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:

- 13 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<?
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

- 14 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 15 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ý

- 16 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 17 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
$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.

- 18 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 19 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ý:

- 20 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
´
OR
XOR
AND
= += -= *= /= .= %= &= |= ^= >>= <<=
?:
||
&&
|
^
&
PRIORITA

PRIORITA
== != <>
< <= >= >
<< >>
+ - .
* / %
! ~ -- ++ 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.";

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

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

- 22 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 23 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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;

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

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;

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

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:

- 26 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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;

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

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

- 28 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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++).

- 29 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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;

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

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

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

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.

- 32 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 33 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 34 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
function Umocni($zaklad, $exponent=2)
{
$pom=$zaklad;
for($i=1; $i<$exponent; $i++) $pom*=$zaklad;
return $pom;
}
echo Umocni(10)."<br />\n"; // to isté ako Umocni(10,2)
echo Umocni(10,3);

Funkcia Umocni() 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;
}

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

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.

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

Vstupné pole

<form action="01.php" method="get">


<table>
<tr><td>Meno:</td>
<td><input type="text" name="meno" size="30" /></td></tr>
<tr><td>E-mail:</td>
<td><input type="text" name="email" size="30" /></td></tr>
<tr><td>Domovská 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.

- 37 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<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.

- 38 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<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ť

- 39 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 40 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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>

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

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

- 42 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
č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ý

- 43 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:

- 44 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<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é.

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

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.

- 46 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Č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

- 47 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ý.

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

Ú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:

- 49 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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%';

- 50 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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;

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

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:

- 52 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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().

- 53 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 54 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:

- 55 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

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

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ý:

- 57 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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>

- 58 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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).

- 59 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Pozn. Kvôli znemožneniu editovania osobného čísla je vhodné ako primárny kľúč požiť

idzamestnanec.

- 60 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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>

- 61 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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>

- 62 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:

- 63 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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";

- 64 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
echo "<td align=\"right\">".
mysql_result($result, $i, "plat").
"</td>\n";
echo "</tr>\n";
endfor;
echo "</table>\n";
endif;
mysql_close($spojenie);
endif;
endif;
?>
</body>
</html>

V parametri like 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.

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

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:heslo@server.sk","w");

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

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.

- 67 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
$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:

- 68 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
$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:

- 69 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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šo u 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 t o s funkcio u fileatime(). Tát o
fu nk cia vr ac 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ť.

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

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

- 71 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

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

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:

- 73 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
/* 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]. " />";

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

Ú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

- 75 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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;

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

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:

- 77 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
$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

- 78 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 79 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
/* 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

- 80 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ň.

- 81 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ú

- 82 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
ž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

- 83 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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é far by
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.

- 84 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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)

- 85 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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
palet y, 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.

- 86 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
$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:

- 87 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
/* 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))

- 88 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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,

- 89 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
č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");

- 90 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.

- 91 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
/* 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.

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

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

- 93 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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

- 94 -
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

You might also like