Professional Documents
Culture Documents
Zaklady PHP
Zaklady PHP
Andrej Trnka
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
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
...
<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.
...
<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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Druhou možnosťou je uviesť viac príkazov naraz. V tomto prípade však musia byť oddelené
pomocou bodkočiarky:
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.
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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
-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 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é
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.
array pole
object objekt
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’.
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
- 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.
$var=20;
echo "V premennej \$var je uložená hodnota $var <br />\n";
echo 'V premennej \$var je uložená hodnota $var'."\n";
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í:
$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";
Pokiaľ je potrebné, aby bolo pole inicializované od iného indexu, použije sa modifikovaný
príkaz array:
- 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:
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:
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:
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.
$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.
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ť.
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ý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;
$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);
$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:
- 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;
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
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
$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
Č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.
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 ´<>´.
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'.";
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' 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";
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.
Podmienený operátor
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.
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
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;
if ($a<$b)
{
$p = $a;
$a = $b;
$b = $p;
}
<?
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;
<?
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
?>
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;
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;
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;
...
}
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.
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;
$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);
$i=0;
do
{
echo "$i^2=".($i*$i)."<br />\n";
$i++;
} while ($i<100);
Cyklus for
Cyklus for je zo všetkých príkazov cyklu asi najvýkonnejší a tiež najzložitejší. Jeho syntax
je:
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.
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";
}
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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";
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;
function Pozdrav()
{
echo "Zdravím Vás.";
}
- 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";
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ť.
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.
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);
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á.
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á).
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.
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.
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
...
<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
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.
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>
...
<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ý.
Obslužnému skriptu dorazí hodnota value vybraného prepínacieho tlačidla (20, 40, 80, 120
alebo 250 v premennej $hd).
Zoznamy
- 40 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Ak má byť nejaká položka vybraná už hneď po zobrazení, označí sa pomocou atribútu
selected.
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).
- 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.
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ž
<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):
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.
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.
- 44 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
<input type="radio" name="pohlavie" value="muz"
checked="checked" />
- 45 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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.
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.
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.
- 48 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:
- 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)
);
Na pridanie nového záznamu do tabuľky s N atribútmi slúži v SQL príkaz insert into:
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:
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:
- 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.
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:
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:
- 51 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:
Príkaz zmení plat Jána Nováka na 14000 (osobné číslo pána Nováka je 1230).
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ť.
mysql_connect("localhost");
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).
- 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:
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.
- 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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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:
<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>
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>
- 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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Základné funkcie
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ť
a - otvorí súbor iba na 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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
fclose($subor);
$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);
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.
- 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.
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
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
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ť:
- 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";
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).
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:
- 74 -
Základy jazyka PHP
–––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––––-
Úvod do GD
Š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.
- 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).
$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().
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
- 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.
/* 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.
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);
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.
$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);
- 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.
- 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.
$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.
$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
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.
/* 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.
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.
if(Scervena=ImageColorExact($obr,255,0,0))==-1):
if((Scervena=ImageColorAllocate($obr,255,0,0))==-1)
$cervena=ImageColorClosest(Sobr,255,0,0);
endif;
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);
- 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.
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().
Ukladanie obrázkov
- 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().
- 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");
- 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