Sie sind auf Seite 1von 59

SKRIPTA IZ PREDMETA INTERNET TEHNOLOGIJE

PHP
SADRAJ
Uvod ..................................................................................................................................... 3
PHP OKRUENJE................................................................................................................ 3
Razlika izmeu server-side i client-side skripti...................................................................5
OSNOVE PHP KODA ........................................................................................................... 7
Osnovna sintaksa, promenljive i operatori .......................................................................7
Promenljive, tipovi podataka, konstante.............................................................................9
Funkcije........................................................................................................................... 10
Funkcije za upravljanje varijablama.............................................................................12
Domen vazenja promenljive............................................................................................ 13
Operatori......................................................................................................................... 14
PHP uslovne naredbe...................................................................................................... 16
PHP petlje........................................................................................................................ 18
Nizovi ............................................................................................................................. 19
Rad sa stringovima.......................................................................................................... 23
NAPREDNA SNTAKSA PHP KODA...................................................................................28
Date................................................................................................................................. 28
nclude and Require......................................................................................................... 29
ObjektnoOrijentisanoProgramiranje u PHP......................................................................30
PHP napredne funkcije za rukovanje fajlovima ...............................................................32
Superglobals.................................................................................................................... 33
Register globals............................................................................................................... 34
PHP napredne funkcije za rukovanje cookies.................................................................35
Slanje header-a........................................................................................................... 37
PHP napredne funkcije za sesijama ...............................................................................38
PHP napredne funkcije za upravljanje greskama ...........................................................44
UVOD U FORME................................................................................................................ 47
O formama uopsteno...................................................................................................... 47
Metode slanja i prihvatanja podataka..............................................................................48
Provera metode pristupa dokumentu / skripti...................................................................51
Forme i srpski znakovi..................................................................................................... 52
Prikaz i obrada unutar jednog dokumenta.......................................................................52
1.2 Elementi za unos podataka......................................................................................... 54
Text box polje.................................................................................................................. 54
Text area......................................................................................................................... 54
Hidden polje.................................................................................................................... 56
Checkbox........................................................................................................................ 56
Upload fajla...................................................................................................................... 58
2 Dinamicki linkovi................................................................................................................ 59
2
Uvod
Server - side skripting je web server tehnologija koja omogucava da se korisnicki zahtevi
obrauju pomocu skripti koje se izvrsavaju na serverskoj strani kako bi se generisale
dinamicke stranice. Najcesce se koristi da bi se interaktivne web stranice povezale sa
bazama podataka, radi identifikacije korisnika, azuriranja sadrzaja, stvaranja raznih
diskusionih grupa i jos zbog mnogo toga. Razlika izmeu skriptovanja na serverskoj i
korisnickoj strani je u tome sto se kod korisnicke strane skripte izvrsavaju u web browser-u
korisnika, najcesce pomocu JavaScript-a.
Najzastupljenije tehnike serverske strane :
Common Gateway nterface
Active Server Pages
Java Servlet i Java Server Pages
PHP
PHP je open source jezik koji se koristi za razvoj server-side aplikacija, kao i dinamickog
Web sadrzaja. PHP dozvoljava interakciju sa velikim brojem relacionih baza podataka kao
sto su MySQL, Oracle, BM D2, Microsoft SQL Server, PostgreSQL i SQLite. PHP radi na
vecini operativnih sistema danasnjice, kao sto su UNX, Linux, Windows i Mac OS i moze da
interaguje sa vecinom Web servera.
Personal Home Page Tools je predstavio PHP 1995. godine, a dve godine kasnije su razvoj
nastavila dva zraelska programera. Od 1999. godine se zasniva na Zend engine-u. PHP je
prvo bio akronim za Personal Home Page Tools, da bi kasnije promenio naziv u Hypertext
Preprocessor.
PHP je stekao popularnost zbog svoje jednostavnosti i sintakse nasleene iz programskog
jezika C. Tokom vremena jezik se prosirivao i sticao mogucnosti za objektno orijentisano
programiranje, narocito od verzije 5.0. Nalikuje jeziku C++ u smislu da dozvoljava i cisto-
proceduralno programiranje ali omogucava i koriscenje klasa i drugih koncepata objektno
orijentisanog programiranja (nasleivanje, apstraktne metode, interfejsi itd.).
Danas, PHP je instaliran na vise od 20 miliona sajtova i preko million web servera. Poslednja
realizovana stabilna verzija je 5.5.0 iz juna 2013.god.
PHP OKRUENJE
Neke od osnovnih odrednica PHP a su:
PHP je akronim za Hypertext Preprocessor
server side skriptni programski jezik
skripte se izvrsavaju na serveru
podrzava rad sa razlicitim bazama podatama (MySQL, nformix, Oracle, Sybase,
Solid, PostgreSQL, Generic ODBC, itd.)
open source softver (OSS)
3
radi na razlicitim platformama (Windows, Linux, Unix i td.)
kompatibilan je sa skoro svim serverima koji se danas koriste (Apache, S, itd. )
lak je za ucenje i efikasno funkcionise na strani servera.
Za PHP fajlove, bitne su sledece cinjenice:
mogu da sadrze tekst, HTML tagove i skripte
vracaju se klijentskom browser u kao HTML tekst (plain HTML)
imaju ekstenziju: ".php, ".php3 ili ".phtml
Najpopularnija arhitektura u okviru koje se PHP koristi je WAMP
(Windows/Apache/MySQL/PERL/PHP). Windows je operativni sistem gde se instaliraju
ostali elementi pomenute arhitekture. Apache je open source Web server, tako da se i na
lokalnoj masini uz pomoc Apache - a, moze simulirati klijent/server okruzenje. MySQL je
open source server baze podataka koji podrzava SQL (Structured Query Language) i
idealan je kako za manje, tako i za vece baze podataka. Ako se PHP koristi u kombinaciji sa
MySQL om moze se napraviti multiplatformska aplikacija, sto znaci da se moze razviti u
Windows okruzenju, a da se potom koristi na npr. Unix masinama.
PHP je bogat funkcijama za manipulisanje mnogo razlicitih tipova sadrzaja. Od
manipulisanja grafikom (png, jpg, flash.) do loado-vanja .NET modula i rada sa XML-om
Da bi se implementirala pomenuta arhitektura, neophodno je uraditi sledece:
Download Apache Web servera
1
(i njegova instalacija na lokalnoj masini).
Download MySQL
2
, server baze podataka i njegova instalacija na lokalnoj masini.
Download PHP
3
- i njegova instalacija na lokalnoj masini.
Takoe treba napomenuti da je moguce gore navedene komponente skinuti u formi paketa
koji sadrze sve pomenute komponente. Najpoznatiji paketi tog tipa su: EasyPHP
4
, WAMP
5
i
XAMPP
6
. Download i koriscenje ovih paketa je takoe besplatno.
Program koji se napise u PHP-u ne zahteva prevoenje (kompajliranje), nego se interpretira
pri svakom izvrsavanju. PHP interpreter moze raditi po CG principu, odnosno tako sto ce
interpreter postojati kao eksterna aplikacija koja se poziva da izvrsi datu skriptu svaki put
kad bude zahtevana od nekog korisnika, a moze biti instaliran i kao modul veb-servisa.
Druga varijanta je danas u najvecoj upotrebi jer pruza znatno vecu brzinu izvrsavanja -
interpreter je na taj nacin uvek ucitan u memoriju te se ne mora pozivati spoljasnji program.
Uobicajen scenario po kom se izvrsavaju PHP skripte na web serveru je sledeci:
klijent (korisnik nterneta koji koristi neki brauzer) zahteva PHP stranicu sa servera
server prosleuje zahtev servisu za veb (program veb-server na serveru)
veb-server prepoznaje da se trazi PHP datoteka
ne salje njegov sadrzaj klijentu, nego ga izvrsava kao program pomocu PHP modula
izlazni tekst programa (standardni izlaz) se salje klijentu kao rezultat zahteva
klijent prepoznaje vrstu rezultata (HTML kod, slika, PDF sadrzaj, arhiva itd.)
rezultat se prikazuju klijentu na odgovarajuci nacin
1
http://httpd.apache.org/download.cgi
2
http://www.mysql.com/downloads/index.html
3
http://www.php.net/downloads.php
4
http:///www. download .com/ EasyPHP /3000-797!"- #0$97309.html
5
http://www.wampser%er.org
6
http://www.apache&riends.org/en/ xampp .html
4
Razlika izmeu server-side i client-side skripti
Server side skripte se izvrsavaju na serveru kada server primi zahtev za obradom. Nakon
zahteva server izvrsava kod i na osnovu njega generise HTML kod i salje ga klijentu. To
znaci da stranica koja se prikazuje u pretrazivacu klijenta ne postoji u tom obliku nigde na
serveru odakle ju je klijent primio.
Glavni predstavnik client-side grupe jezika je JavaScript. Kod pisan u JavaScriptu je obicno
umetnut u HTML stranicu i izvrsava se tek u klijentovom pretrazivacu.
Osnovna razlika izmeu PHP i HTML stranica je u nacinu na koji web server upravlja njima.
Kada web serveru stigne zahtev za HTML stranicom, web server preduzima sledece
operacije:
Cita zahtev
Pronalazi stranicu na serveru
Salje stranicu ka browser-u
Slika 1 Obrada zahtea za HTML !tra"i#$%
Kada web server dobije zahtev za PHP stranicom, umesto slanja staticke HTML stranice,
server preduzima odreene akcije u skaldu sa PHP kodom:
Cita zahtev
Pronalazi stranicu na serveru
Obrauje sve instrukcije koje se nalaze u PHP fajlu, in a taj nacin kreira ili modifikuje
stranicu
Salje novu stranicu ka browser-u
5
Slika & Obrada zahtea za HTML !tra"i#$%
Server-side obrada omogucava:
Smanjuje kolicinu saobracaja izmeu server i klijenta
Otklanja problem kompatibilnosti browser-a
Obezbeuje razlicite tipove informacija za klijente
Poboljsava sigurnost aplikacije
Mozda bi bilo najbolje malo detaljnije razmotriti razlike izmeu njih na jednom trivijalnom
primeru. Neka je na primer, potrebno napisati skriptu koja prikazuje tacno vreme negde na
stranici. ako ovo zvuci kao vrlo trivijalan i lagan primer, gotovo ga je nemoguce izvesti.
Zasto? Prvo pitanje koje treba postaviti je 'Koje je vreme tacno vreme?'. Ono na serveru ili
ono na klijentovom racunaru? Ove dve skripte ce retko kada prikazati isti rezultat.
Primer 1 prikaz vremena kod klijenta
<html>
<head>
<script language="JavaScript">
var v = new Date()
document.write(v.getHours())
document.write(":")
document.write(v.getinutes())
document.write(":")
document.write(v.getSeconds())
<!script>
<!head>
<"od#>
<!"od#>
6
<!html>
Primer 2 prikaz serverskog vremena
<$php
%str&vreme= date("H:i:s")'
echo %str&vreme'
$>
OSNOE PHP KO!"
Osnovna sintaksa# promenl$ive i operatori
U PHP fajlu, blok koji je okruzen jezickim strukturama <?php i ?> se smatra PHP kodom i
izvrsava se, a ostatak van tih znakova se smatra tekstom koji jednostavno treba da se
ispise na standardni izlaz, bez interpretiranja. Ako se PHP kod izvrsava na serveru koji
podrzava skracenice, PHP blok moze poceti i sa <?, a zavrsiti se sa ?> tagom. PHP kod se
moze napisati bilo gde u okviru <body> taga HTML dokumenta. U nekim slucajevima, PHP,
kod se pise u okviru <head> taga.
Sa regularnim .html fajlovima, HTTP server (npr. Apache) samo prenosi sadrzaj stranice u
browser. Server ne pokusava da razume ili obrauje HTML fajl to je posao browser-a.
Fajlovi sa .php ekstenzijom se "skeniraju i obrauje se kod.
PHP fajl sadzi standardne HTML tagove i PHP skript kod. Sledi primer dva prosta PHP koda
koji na ekranu browser a ispisuju "Zdravo svete!.
Primer 3
<html>
<head> <title> (rimer outputa )dravo svete <!title> <!head>
<"od#>
<$php
echo ")dravo svete*"'
$>
<!"od#>
<!html>
Primer 4
<html>
<head> <title> (rimer outputa )dravo svete <!title> <!head>
<"od#>
<$php
print ( +)dravo svete+)'
$>
<!"od#>
<!html>
Kao sto iz primera vidi, svaka linija PHP koda mora da se zavrsi tackom zarez. Tacka
zarez se koristi da bi se jedan set instrukcija razdvojio od drugog seta. Postoje dve osnovne
7
komande koje sluze za prikazivanje teksta na browser u: e#h$ i 'ri"t
(
. Kao sto je vec
receno, PHP kod se nalazi u okviru HTML koda i izvrsava se na serveru. Tek kada se PHP
kod izvrsi na serveru, output se salje do browser - a klijenta koji izvrsava HTML kod i
prikazuje PHP kod koji je vec izvrsen na serveru,tj. prikazuje i rezultat PHP koda i rezultat
HTML koda. Ako se na primer u PHP skripti koristi komanda e#h$ "<br>, desava se
sledece:
Web server izvrsava echo "<br> kod.
Rezultat tog koda ce biti <br>.
Zatim, Web server salje browser u klijenta izvrseni kod.
Kada browser klijenta vidi <br>,kao rezultat PHP koda koji treba da prikaze,
razumece da je rezultat PHP koda ustvari HTML kod koji browser treba da izvrsi.
Browser ce izvrsiti HTML kod i konkretno u ovom primeru, kursor ce preci u sledeci
red.
Pomocu echo naredbe u PHP skriptama, mogu se pisati bilo koji HTML kodovi koje browser
treba da izvrsi.
Unutar koda je moguce prebaciti se, u bilo kojem trenutku, iz HTML moda u PHP mode. Cak
i unutar if, for i ostalih kontrolnih struktura. Ovo omogucuje rad sa template-ima u kojima se
na isti nacin prikazuju razliciti podaci iste strukture. Ovo je lustrovano jednostavnim
primerom:
Primer 5
<html>
<head>
<title>,ntitled<!title>
<!head>
<"od#>
<$
%ime="ar-o"'
%pre.ime="ar-ovic"'
$>
<ta"le width="/00" "order="1" cellspacing="0" cellpadding="0">
<tr>
<td>
<$
echo %ime'
$>
<!td>
<td><$=%pre.ime$><!td>
<!tr>
<!ta"le>
<!"od#>
<!html>
Rezultat gornjeg koda je:
Marko Markovic
Za ispis sadrzaja varijable koriscena su dva razlicita nacina koji su rezultirali istim krajnjim
ispisom. Naime unutar <? i ?> se nalazi php kod koji ce se izvrsiti ukoliko se u njemu ne
nalaze neke sintaksne greske. Druga metoda ispisa je izgledala ovako : <?=$prezime?> .
7
Razlika izmeu ove dve funkcije je samo u tome sto funkcija print moze da vrati vrednost true/false,
a echo nema tu mogucnost. Echo je za nijansu brza pri izvrsavanju programa
8
Ova metoda se koristi kada je potrebno ispisati neku varijablu ili string. Ova linija je identicna
<? echo $prezime ?> samo sto je umesto echo naredbe koriscen znak = koji PHP-u govori
da ispise ono sto se nalazi
izmeu <? i ?> oznaka.
Kao sto i u HTML u postoje komentari, tako se komentari mogu navoditi i u PHP bloku.
Postoje dve osnovne vrste komentara u PHP u: jednolinijski (single line comment) i
viselinijski (large comment block) komentari. Za jednolinijske komentare se koristi symbol
"))*, a za viselinijski komentari se pisu izmeu " )+" i " +) simbola. Sledi primer.
Primer 6
<html>
<head> <title> (rimer (H( -omentara <!title> <!head>
<"od#>
<$php
!! 2vo 3e 3ednolini3s-i -omentar
!4 2vo 3e vi5elini3s-i -omentar6
5to .na7i da se on mo8e pisati
u vi5e redova*
4!
$>
<!"od#>
<!html>
Promenl$ive# tipovi podataka# konstante
Promenljive (varijable) se u PHP u koriste za cuvanje konkretnih vrednosti kao npr. tekst
stringova, brojeva ili nizova. Kada se jednom promenljiva postavi, ona se moze koristiti vise
puta u PHP skripti. Sve varijable u PHP u pocinju simbolom dolar simbolom " , ". Pravilno
postavljena (setovana) promenljiva ima sledecu sintaksu:
$ime_promenljive=vrednost;
U PHP u promenljiva ne mora da se deklarise pre nego sto se postavi, sto znaci da ne
mora da se navede tip promenljive kao u drugim programskim jezicima. U PHP u se
promenljive automatski deklarisu kada se koriste.
<$php
%age = /0'
%age = /1'
echo %age'
$>
Postoje neka pravila za dodeljivanje imena promenljivima koja moraju da se postuju:
me promenljive mora poceti slovom ili doljnom crtom " - ".
me promenljive moze da sadrzi samo alfa numericki karakter i doljnu crtu (a Z, 0
9 i _)
me promenljive ne moze da sadrzi razmak (space). Ako ime promenljive treba da
sadrzi dve reci, koristi se " - " ( npr. moa!promenliva) ili velika slova (npr.
moa"romenliva).
Promenljiva se ispisuje na ekranu browser u pomocu naredbe e#h$, tako sto se
jednostavno navede ime promenljive nakon e#h$ naredbe:
9
echo mo3a(romenl3iva'
Ako se pomocu jedne e#h$ naredbe prikazuju dve promenljive, koristi se tzv. separator
simbol ." ".
echo mo3a(romenl3iva1 . " " . mo3a(romenl3iva9'
U primeru koda, koriscen je blank prostor " " , da bi se odvojilo prikazivanje promenljivih, tj.
da se ne bi prikazale promenljive jedna uz drugu
Primer 7
<html>
<head> <title> (rimer postavl3an3a promenl3ivih <!title> <!head>
<"od#>
<$php
%prva=1:'
%druga=")dravo narode* "'
echo %prva . " " . %druga'
!4 u echo nared"i -oristi se " " 6 da "i se odvo3ilo pri-a.ivan3e
promenl3ivih6 t3. da se ne "i na "rowseru ispisalo 1:)dravo narode*6 ve;
1: )dravo narode* 4!
$>
<!"od#>
<!html>
U PHP-u ne postoje fiksni tipovi podataka. Naime, "e %$ra !e de.i"i!ati ti' ari/able pre
njenog koriscenja i varijabla se moze deklarisati bilo kada unutar skripte i pridruzivati joj se
razliciti tipovi podataka tokom izvoenja skripte (iako ovo nije uobicajena niti previse
pametna praksa). sto tako se moze menjati tip podataka neke varijable jednog te istog
sadrzaja.
Tipovi podataka koje podrzava PHP su:
Celi brojevi (integer)
Realni brojevi (floating-point numbers )
Tekstualni podaci (String)
Logicke varijable
Nizovi
Objekti
K$"!ta"te
Konstante su vrednosti koje ne menjaju svoju vrednost. Za kreiranje konstanti u PHP, koristi
se funkcija define ()
define("kompanija", "FON");
Na ovaj nacin je formirana konstanta kompanija i dodeljena joj je odgovrajuca vrednost
%unkci$e
Funkcije u PHP-u se definisu sledecom sintaksom:
<$
<unction ime<un-ci3e(%argument16%argument9=%argument>)
10
?
!! = "lo- nared"i <un-ci3e
@
$>
Primer 8
<$php
phpin<o()'
$>
Primer 9: Funkcije sa povratnim rezultatom:
<$
<unction sa"eri(%"ro316%"ro39)
?
%."ir=%"ro31A%"ro39'
return %."ir'
@ !! pridru8ivan3e vari3a"li re.ultata <un-ci3e
%"r1=19'
%"r9=99'
echo sa"eri(%"r16%"r9)'
$>
U gornjem primeru su umesto varijabli $br1 i $br2 koriscene i varijable imena $broj1 i $broj2.
Ovo je moguce zato sto se funkciji ne daju same varijable vec njihove vrednosti koje se
cuvaju u lokalnim (funkcijske) varijablama koje postoje samo za vreme izvoenja funkcije.
Ukoliko je potrebno funkcijom izmeniti sadrzaj neke varijable, ona se mora dati funkciji
pomocu reference (pass by reference). Ne postoji oznaka za referencu u ovom slucaju pri
pozivu funkcije. Sama postavka funkcije cini da se varijabla daje funkciji pomocu reference.
U ovom slucaju je korisceno davanje varijable pomocu reference u liniji povecaj($neki_broj,10)
.
Primer 10 : Slanje varijabli pomocu reference
<$
<unction poveca3(B%"ro36%vrednost)?
%"ro3A=%vrednost'
@
%ne-i&"ro3=19'
poveca3(%ne-i&"ro3610)'
echo %ne-i&"ro3'
$>
Nije obavezno koristiti isto ime varijable u glavnom programu i funkciji, iako je moguce.
Rezultat ce u oba slucaja biti isti.
Primer 11 : Funkcije sa default vrednostima
<$
<unction <ri.ider(%stan3e="pun")?
echo "Cri.ider 3e %stan3e"'
@
!! ispis de<ault vrednosti
<ri.ider()'
echo "<hr>"'
!! ispis date vrednosti
<ri.ider("pra.an")'
$>
11
Rezultat :
Frizider je pun
__________________
Frizider je prazan
Pri radu sa funkcijama koje imaju default vrednost bitno je da ta vrednost mora biti konstanta
(string ili broj). sto tako ukoliko funkcija ima vise argumenata od kojih jedan ili vise imaju
default vrednosti oni moraju biti sa krajnje desne strane liste argumenata iza argumenata
bez default vrednosti:
Primer 12
<$
<unction automo"ili(%gori6%"ol3i="Dudi")?
echo "%"ol3i 3e "ol3i od %gori"'
@
automo"ili("(eglice")'
$>
%unkci$e za upravl$an$e vari$a&lama
Php poseduje niz ugraenih funkcija za rad sa varijablama:
gettype()
Ova funkcija vraca vrednost tipa promenljive. Moguce vrednosti:
"double"
"string"
"array"
"object"
"class"
"unknown type"
<$
%user&input= 9'
i< (gett#pe (%user&input) == "integer") ?
%age = %user&input'
@
$>
settype()
Funkcija postavlja vrednost tipa podataka:
array,
double, integer,
object
string.
<$
%a = E.F'
sett#pe(%a6 "integer")'
echo %a'
$>
12
isset() i unset()
unset() se koristi za brisanje promenljive i oslobaanje memorijske lokacije koju ona
zauzima.
isset() proverava da li je promenljivoj zadata vrednost.
<$
%(roductGD = "H/9II"'
i< (isset(%(roductGD)) ?
echo("Jhis will print")'
@
unset(%(roductGD)'
i< (isset (%(roductGD)) ?
echo("Jhis will >2J print")'
@
$>
is...() functions
Funkcija ispituje tip promenljive:
is&int()6 is&long()6 is&dou"le()6is&real()6 is&string()6 is&arra#()6
is&o"3ect()
<$
%(roductGD = "H/9II"'
i< (is&string (%(roductGD)) ?
echo ("String")'
@
$>
!omen va'en$a promenl$ive
Domen vazenja promenljive definise oblast u kojoj je promenljiva dostupna program.
<$
%position = "m"'
<unction change&pos()
?
%position = """'
@
change&pos()'
echo ("%position")'
$>
Kao izlaz se dobija "m". Varijabla $position unutar funkcije je dostupna samo u okviru
funkcije i ne moze joj se pristupiti van nje.
Ukoliko se koristi kljucna rec global, promenljiva postaje globalno dostupna.
<$
%position = "m"'
<unction change&pos() ?
glo"al %position'
%position = """'
@
change&pos()'
echo ("%position")' !! vra;a """
13
$>
Ako se definise varijabla kao static u nekoj funkciji, ona se inicijalizuje prilikom prvog
poziva funkcije i postavlcja na definisanu vrednost. Svaki sledeci poziv funkcije nece dovesti
do nove inicijaliizacije.
<$
<unction counter () ?
static %counter = 0'
AA%counter'
@
$>
Operatori
Operatori koji se koriste u PHP script programskom jeziku:
Arit%eti0ki $'erat$ri
O'erat$r O'i! Pri%er Rez1ltat
+ Sabiranje x=2
x+2
4
- Oduzimanje x=2
5-x
3
* Mnozenje x=4
x*5
20
/ Deljenje 15/5
5/2
3
2.5
% Moduo 5%2
10%8
10%2
1
2
0
++ Uvecanje za 1 x=5
x++
x=6
-- Smanjenje za 1 x=5
x--
x=4
O'erat$ri d$dele
O'erat$r Pri%er Je i!t$ ka$ i
= x=y x=y
+= x+=y x=x+y
-= x-=y x=x-y
*= x*=y x=x*y
/= x/=y x=x/y
%= x%=y x=x%y
O'erat$ri '$re2e"/a
O'erat$r O'i! Pri%er
14
== Jednako kao 5==8 vraca false
!= Nije jednako kao 5!=8 vraca true
> Vece od 5>8 vracafalse
< Manje od 5<8 vraca true
>= Vece ili jednako od 5>=8 vaca false
<= Manje ili jednako od 5<=8 vraca true
L$3i0ki $'erat$ri
O'erat$r O'i! Pri%er
&&
konjukcija. Konjukcija je tacna
ako i samo ako su oba iskaza tacna.
x=6
y=3
(x < 10 && y > 1) vraca true
||
L disjunkcija. Disjunkcija je tacna
ako i samo ako je jedan od iskaza
tacan.
x=6
y=3
(x==5 || y==5) vraca false
! Negacija
x=6
y=3
!(x==y) vraca true
4a!t $'erat$ri
Cast operatori u PHP su:
(int) ili (integer) pretvaranje u integer
(float) ili (real) pretvaranje u real
(string) pretvaranje u tip string
(bool) ili (boolean) u tip boolean
(array) pretvaranje u tip array
(object) pretvaranje u tip object
Primer 13: PHP primer sa operatorima
<html>
<head> <title> (rimer sa operatorima <!title>
<"od#>
<$php
%K=9F'
%#=100'
%.=F0'
%promenl3iva=(%K>%#) LL (%#>%.)'
echo %promenl3iva'
!! ovde se se vraca re.ultat 16 3er 3e is-a. true
%promenl3iva1=(%K*==%#) BB (%.<=%#) BB (%#*==10F)'
echo %promenl3iva1'
!! ovde se ne vraca re.ultat6 3er 3e is-a. <alse
$>
<"od#>
<!html>
15
PHP uslovne nared&e
Kao i u drugim programskim jezicima, u PHP u se koriste uslovne naredbe. f . else
uslovna naredba se koristi ako postoji neki uslov koji treba da se testira. Ako je zadati uslov
tacan (true), izvrsava se jedan set instrukcija, a ukoliko je uslov netacan (false), izvrsava se
drugi set instrukcija. Sintaksa:
Primer 14
G< (uslov) ?
Mod -o3i se i.vrsava u-oli-o 3e uslov true'
@
else ?
-od -o3i se i.vrsava u-oli-o 3e uslov <alse'
@
Primer 15:
<html>
<head> <title> (rimer i< N else uslovne nared"e <!title> <!head>
<"od#>
<$php
%promenl3iva=HF'
G<(%promenl3iva>90)
?
echo "Orednost promenl3ive 3e veca od 90"'
@
else
?
echo "Orednost promenl3ive 3e man3a od 90"'
@
$>
<!"od#>
<!html>
Primer 16: Tercijarni operator
<$
%logged&in = JP,Q'
%user = "Ddmin"'
%"anner = (%logged&in==JP,Q)$"Relcome "ac- %user*":"(lease login."'
echo "%"anner"'
$>
Ako treba da se izvrsi programski kod ukoliko su jedan ili vise uslova tacni, koristi se elseif
uslovna naredba.
<$
G< ( uslov ) ?
!! nared"e -o3e se i.vr5ava3u u-oli-o 3e uslov == true
@ elsei< ( uslov9 ) ?
!! nared"e -o3e se i.vr5ava3u u-oli-o 3e uslov == <alse i uslov9==true
@ elsei< ( uslov/ ) ?
!! nared"e -o3e se i.vr5ava3u u-oli-o 3e uslov == <alse i uslov9 == <alse i
uslov/
== true
@ else ?
!! nared"e -o3e se i.vr5ava3u u-oli-o su svi uslovi == <alse
@
16
$>
Primer 17
<html>
<head> <title> (rimer elsei< uslovne nared"e <!title> <!head>
<"od#>
<$php
%promenl3iva=/0'
G< (%promenl3iva<=/0) ?
echo "Iro3 3e man3i ili 3edna- /0"'
@
elsei<(%promenl3iva>/0 BB %promenl3iva<=HF) ?
echo "Iro3 3e veci od /06 a man3i ili 3edna- HF"'
@
else ?
echo "Iro3 3e veci od HF"'
@
$>
<!"od#>
<!html>
Ukoliko treba da se izvrsi jedan ili vise blokova programskog koda, koristi se switch naredba.
Switch naredba se koristi zbog izbegavanja velikih blokova programskog koda if . elseif .
else naredbi. Sintaksa:
switch (promenl3iva)
?
case slu7a31:
-od -o3i se i.vrsava a-o 3e promenl3iva = slu7a31 '
"rea-'
case slu7a39:
-od -o3i se i.vrsava a-o 3e promenl3iva=slu7a39'
"rea-'
case slu7a3/:
-od -o3i se i.vrsava a-o 3e promenl3iva=slu7a3/'
"rea-'
de<ault:
-od -o3i se i.vrsava a-o vrednost promenl3ive ni3e 3edna-a ni 3ednom
navedenom slu7a3u'
@
Primer 18: Primer switch naredbe
<html>
<head> <title> (rimer switch nared"e <!title> <!head>
<"od#>
<$php
%K=10'
switch(%K)
?
case 1:
echo "Iro3 3e 1"'
"rea-'
case 10:
echo "Iro3 3e 10"'
"rea-'
case 90:
echo "Iro3 3e 90"'
"rea-'
17
de<ault:
echo ">e .nam -o3i 3e "ro3"'
@
$>
<!"od#>
<!html>
Kljucna rec break oznacava zavrsetak grane. Ukoliko se izostavi izmeu dve grane naredbe,
obe grane ce se izvrsiti ukoliko je visa (ona koja sledi pre) aktivirana. Naredbe ce se
izvrsavati sve dok se ne pojavi break ili zavrsetak switcha.
Pri%er 15
<$
%int&var=F'
switch (%int&var)?
case 0:
echo +Iro3 3e nula+'
"rea-'
case F:
echo +Iro3 3e pet+'
case ::
echo +Iro3 3e :+'
"rea-'
de<ault:
echo +Iro3 ni3e po.nat+'
@
$>
PHP petl$e
Cesto se desava da je potrebno odreeni kod izvrsiti vise puta. Da bi se ovo postiglo, bez
suvisnog kucanja, koriste se petlje. U PHP u se koriste sledece petlje:
while odreeni kod se izvrsava sve dok je zadati uslov true.
do ... while odreeni kod se izvrsava jednom i onda se u okviru petelje ponovo
izvrsava sve dok je specijalni uslov true.
for kod se kroz petlju izvrsava onoliko puta koliko je to korisnik odredio
foreach kod se kroz petlju izvrsava za svaki element niza
While naredba ce izvrsavati blok koda ako i dok je uslov true. Sintaksa:
while(uslov)
programski kod koji se izvrsava;
Pri%er &5:
<html>
<head> <title> (rimer while nared"e <!title> <!head>
<"od#>
<$php
%K=1'
while(%K<=F) ?
echo "Iro3 3e" . %K'
echo "<"r>"'
%KAA'
@
18
$>
<!"od#>
<!html>
Do . while petlja ce izvrsiti blok programskog koda makar jednom, i onda ce ponavljati
petlju dok je uslov tacan. Sintaksa:
do
?
-od -o3i se i.vrsava'
@
Rhile(uslov)'
Pri%er 67:
<html>
<head> <title> (rimer .a do...while petl3u <!title> <!head>
<"od#>
<$php
%K=0'
do ?
%KAA'
echo "Iro3 3e : " . %K'
echo "<"r>"'
@
while(%K<=F)'
$>
<!"od#>
<!html>
Pri%er 61: Primer za for petlju:
<html>
<head> <title> (rimer .a <or petl3u <!title> <!head>
<"od#>
<$php
<or (%K=0'%K<F'%KAA)?
echo ")dravo svete*"'
echo "<"r>"'
@
$>
<!"od#>
<!html>
Foreach petlja se koristi da bi se prikaziali elemente niza. Za svaku petlju, vrednost tekuceg
elementa niza se dodeljuje nekoj promenljivoj, pa se u sledecoj petlji vrednost sledeceg
elementa niza dodeljuje istoj toj promenljivoj itd. Sintaksa:
<oreach(ni. as vrednost)
?
Mod -o3i se i.vrsava'
@
Nizovi
19
Kao sto je poznato, u nizovima se cuvaju vrednosti elemenata koji su istog tipa i koji su slicni
na neki nacin. Ti elementi se zovu elementi niza i svaki element ima svoj jedinstven D
(#denti$ier) i moze mu se lako pristupiti. Postoje tri tipa nizova:
Numericki niz, gde elementi imaju numericke D kljuceve
Asocijativni niz (associative array), gde je svaki D kljuc asociran sa vrednoscu, tj.
postoji par kljuc=>vrednost (key%&value)
Multidimenzioni nizovi (multidimensional array), niz koji se sastoji od jednog ili vise
nizova.
Element niza moze pripadatai bilo kom tipu podataka, bez obzira na ostale elemente.
U PHP u, numericki nizovi se mogu kreirati na dva nacina:
Automatskim dodeljivanjem D kljuceva, npr. :
$niz=array("Marko,Petar,Srdjan,Djura). U ovom primeru, dentifikator (D)
elementima niza je automatski dodeljen, pa tako Marko ima D=0, Petar D=1 itd.
Rucnim dodeljivanjem D kljuceva, npr.

%ni.=arra#()'
%ni.S0T=Uar-oU'
%ni.S1T=U(etarU'
%ni.S9T=USrd3anU'
%ni.S/T=UD3uraU'
Primer 32
<html>
<head> <title> (rimer numeric-ih ni.ova <!title> <!head>
<"od#>
<$php
%ni.=arra#("Gnternet tehnologi3e"6 "Simulaci3a" 6"Qle-trons-o poslovan3e")'
echo %ni.S0T . " " . " i" . " " . %ni.S1T . " " . "i" ." " . %ni.S9T . "su
na3"ol3i predmeti"'
$>
<!"od#>
<!html>
Kod asocijativnih nizova (associative arrays), svaki D kljuc je asociran sa odreenom
vrednoscu. U PHP u, asocijativni nizovi se mogu kreirati na dva nacina:
Dodeljivanjem D kljuceva i vrednosti svim elementima niza odjednom, npr.
$niz=array("Marko=>32,"Petar=>28,"Srdjan=>20, "Zdravko=>56). U navedenom
primeru, kljucevi su imena, a brojevi su vrednosti.
Dodeljivanjem D kljuceva i vrednosti svakom elementu niza posebno, npr.

$niz=array();
$niz["Marko]=32;
$niz["Petar]=28;
$niz["Srdjan]=20;
$niz["Zdravko]=56;
Pri%er 668 Primer asocijativnih nizova:
20
<html>
<head> <title> (rimer asoci3ativnih ni.ova <!title> <!head>
<"od#>
<$php
%ni.=arra#("3a"u-a"=>"crvena"6"-rus-a"=>".uta"6"tresn3a"=>"crvena"6"pomoran
d.a"=>"narand.asta")'
echo %ni.S"3a"u-a"T'
!! re.ultat ce "iti crvena
echo "<"r>"'
!! prela.a- u novi red u. pomoc HJV -oda
echo %ni.S"pomorand.a"T'
!! re.ultat ce "iti narand.asta
$>
<!"od#>
<!html>
Kod multidimenzionih nizova, svaki element moze da bude nov niz i svaki element pod
niza takoe moze da bude niz itd.
Pri%er 69: Primer multidimenzionih nizova:
<html>
<head> <title> (rimer multidimen.ionih ni.ova <!title> <!head>
<"od#>
<$php
%porodice=arra#
(
"Jovanovic"=>arra#
(
"ar-o"6
"(ed3a"6
"arina"
)6
"(etrovic"=>arra#
(
"ilena"6
"ar-o"6
"Jovana"
)6
"Stan-ovic"=>arra#
(
"(etar"6
"Jasmina"6
"ilica"6
"Gsidora"
)
)'
echo %porodiceS"Jovanovic"TS1T . " " . "3e clan porodice Jovanovic"'
!! ispisace se da 3e (ed3a clan porodice Jovanovic
$>
<!"od#>
<!html>
Nizovi su osnovni tip elementa koji se najcesce susrece u radu sa bazama podataka. Naime,
kada se izvrsi upit na bazu, vraceni rezultat je niz. Osnovne operacije nad nizovima su
setanje kroz niz, sortiranje niza, pretrazivanje niza pa lepljenje niza u string sto je vec
objasnjeno u prethodnom poglavlju.
21
Pri%er 6: : Prolazenje kroz jednodimenzionalni niz
<$
%arr&valute=arra#(",SD"6"Q,P"6"WI("6"HPM")'
<oreach (%arr&valute as %-l3uc=>%vrednost)
echo "S%-l3ucT => %vrednost <"r>"'
$>
Za prolazenje, koriscena je foreach petlja koja u svakom svom ponavljanju uzima novi
element iz niza. Uzima ih od manjeg indeksa prema vecem. sti ovaj ucinak se moze postici
na vise raznih nacina, od kojih je jedan da se prvo proveri ukupan broj elemenata niza pa da
se for petljom proseta kroz niz.
Za trazenje vrednosti u nizu koristi se funkcija
arra#&search(%tra.eno6%ni.&.a&pretra.iti):
Funkcija prima dva obavezna argumenta. Prvi argument je vrednost koja se trazi, a drugi je
niz u kojem se trazi vrednost. Postoji i treci, neobavezni, argument koji moze biti true ili false.
On sluzi ukoliko se zeli uporediti i tip podataka.
Recimo
%int&"ro3=111 i %str&"ro3=+111+
U slucaju da je treci argument postavljen na true ne bi rezultiralo pronalazenjem vrednosti u
nizu. Element iz niza se izbacuje unset($var) funkcijom. Funkcija unset() unistava datu
varijablu. Ukoliko je potrebno izbaciti samo jedan element niza funkciji se daje taj niz sa
zeljenim indeksom ($arr_niz[16]) i on ce biti izbacen.
U primeru se element izbacuje ovim redom
unset (%arr&mailoviS%nadeniT)'
Pri%er 6;: Sortiranje niza
<$
%arr&ni.=arra#(
0=>106
1=>1F6
9=>X6
/=>1X6
H=>1/6
F=>1F6
:=>XX6
E=>EH
)'
!! sortiran3e ni.a
asort(%arr&ni.)'
print&r(%arr&ni.)'
$><hr><$
arsort(%arr&ni.)'
print&r(%arr&ni.)'
$><hr><$
-sort(%arr&ni.)'
print&r(%arr&ni.)'
$><hr><$
22
-rsort(%arr&ni.)'
print&r(%arr&ni.)'
$>
U prvom slucaju niz je sortiran po vrednostima niza uzlazno. Za sortiranje je koriscena
funkcija asort($arr_niz). Njoj se kao argument daje niz koji se sortira. Funkcija ne vraca
vrednost, vec samo sortira niz, i nakon njenog izvrsenja je zadati niz sortiran i takvom mu se
pristupa kasnije. Sortiranje se obavlja tako da se elementi niza sortiraju uzlazno. Ono sto je
bitno kod ove funkcije je da se odrzava odnos indeks => vrednost, tako da ce nakon
sortiranja vrednost koja se nalazila na
indeksu 3 i dalje biti na tom indeksu, samo ce njena pozicija u samom nizu mozda biti
drugacija.
U drugom slucaju niz se sortira silazno (od najvece prema najmanjoj vrednosti). To se radi
pomocu funkcije arsort($arr_niz). Ova funkcija je identicna asort() funkciji po svojim
osobinama osim po redosledu elemenata nakon sortiranja.
U trecem slucaju niz se sortira po kljucu. Znaci da ce kljuc (indeks) sa manjom vrednoscu
biti pre u nizu posto funkcija ksort($arr_niz) sortira niz po indeksu uzlazno. Odnos indeks =>
vrednost je zadrzan nakon sortiranja.
Poslednji slucaj sortira niz po indeksu, ali silazno. Tu radnju obavlja funkcija krsort($arr_niz).
Ona je identicna funkciji ksort(), samo sto sortira niz obrnutim redosledom.
Rad sa strin(ovima
Stringovi su najcesci tip podataka kojim se radi u PHP-u zbog prirode PHP-a kao alata za
izradu HTML stranica na serveru. U PHP-u se nalaze vec gotove funkcije koje automatizuju
vecinu operacija koje su potrebne za manipulisanje i rad sa sadrzajem string podataka.
Sadrzaj string tipa varijable se nalazi izmeu navodnika. Mogu se koristiti dupli i jednostruki
navodnici. Postoje razlike u ispisu sadrzaja zavisno od tipa navodnika koji se koriste.
Koriscenjem duplih navodnika moze se koristiti 'special characters'. To su posebni znakovi
koji govore PHP-u da izvrsi odreene radnje pri ispisu sadrzaja varijable i slede iza znaka
backslash ( \ ). On se ujedno koristi za preskakanje odreenog znaka unutar stringa.
Lista escape znakova:
Ovi znakovi nece imati uticaja na izgled same stranice u prozoru browsera, vec ce njihov
uticaj biti vidljiv tek pri pregledu source-a dokumenta. Ovim se moze sasvim sakriti cinjenica
23
Znak Znacenje
\t Tab razmak (HT ili 0x09 u ASCu)
\\ Backslash
\$ Dolar znak
\" Dupli navodnik
\n Novi red(LF ili 0x0A u ASCu)
da je stranica stvorena putem PHP-a i pomocu njih je lakse pronaci gresku u generisanoj
stranici. U protivnom bi se sav sadrzaj ispisao u jedan red bez razmaka. U tom neredu bi bilo
tesko naci bilo sta, a kamoli gresku u ispisu, ako se trazi u source view-u.
Ukoliko je potrebno da se neki tekst prebaci u novi red pri gledanju stranice u prozoru
browsera treba se posluziti <br> i slicnim tagovima. Jos jedan bitna razlika izmeu duplih i
jednostrukih navodnika je ta da ce se pri koriscenju duplih navodnika sadrzaj varijable
ispisati a pri koriscenju jednostrukih navodnika ispisace se ime varijable skupa sa znakom $.
Primer 21
<$
%str&ime="Gnternet tehnologi3e"'
echo ("o3e ime 3e %str&ime")'
$>
spisuje:
o3e ime 3e Gnternet tehnologi3e
Primer 22
<$
%str&ime="Gnternet tehnologi3e"'
echo (+o3e ime 3e %str&ime+)'
$>
Moje ime je $str_ime
U PHP-u je takoe moguce spajanje vise stringova u jedan ispis. Ponekad pri radu sa
stringovima, a posebno pri obradi podataka iz formi, podaci u sebi sadrze nepotrebne
razmake na pocetku ili kraju stringa. Pod razmacima se podrazumevaju : razmak od jednog
mesta(space), tab razmak od vise space-ova (escape znak \t), znak za novi red na kraju
reda (escape znak \n).
Treba obratiti paznju na to da se nepotrebni prazni prostor i rezultati escape znakova ne vide
u HTML pogledu dokumenta vec tek kada pogledate source dokumenta ili ukoliko se nalaze
unutar <pre>.</pre> tagova za prikaz preformatiranog teksta.
Ovo su neki primeri:
Pri%er &6: zbacivanje nepotrebnog praznog prostora iz stringa
<$
%str&glavni=" Yt2vo 3e string Ynsa puno pra.nog prostora Yn"'
echo %str&glavni'
!! i."acivan3e pra.nog prostora sa pocet-a stringa
%str&"e.&pocet-a=ltrim(%str&glavni)'
echo "<hr>Yn"'
echo "<hH>String "e. pra.nog prostora na pocet-u stringa<!hH>Yn"'
echo "<pre>%str&"e.&pocet-a<!pre>Yn"'
!! i."acivan3e pra.nog prostora sa -ra3a stringa
%str&"e.&-ra3a=rtrim(%str&glavni)'
echo "<hr>Yn"'
echo "<hH>String "e. pra.nog prostora na -ra3u stringa<!hH>Yn"'
echo "<pre>%str&"e.&-ra3a<!pre>Yn"'
!! i."acivan3e pra.nog prostora i. celog stringa
%str&"e.&pra.nina=trim(%str&glavni)'
24
echo "<hr>Yn"'
echo "<hH>String "e. pra.nog prostora na -ra3u i pocet-u stringa<!hH>Yn"'
echo "<pre>%str&"e.&pra.nina<!pre>Yn"'
$>
U ovom primeru su koriscene tri funkcije za izbacivanje praznina sa pocetka i kraja stringa.
Prva je ltrim(string) - ltrim izbacuje praznine i escape znakove sa leve strane (pocetka)
stringa. Druga je rtrim(string) - rtrim izbacuje praznine i escape znakove sa desne strane
(kraja) stringa. Treca je trim(string) - trim izbacuje praznine i escape znakove sa obe strane
stringa. Ove funkcije mogu izbaciti praznine samo sa pocetka i kraja striga dok one unutar
stringa ostaju na svom mjestu.
PHP je opremljen funkcijama za pretrazivanje string tipova podataka na vise nacina i
metoda. Najjednostavnija metoda je koriscenjem string funkcija, a sintaksicki malo
komplikovaniji nacin je koriscenjem Regular expresiona.
Pri%er &9: Pretrazivanje stringa
<$php
%password="secretpassword1"'
i< (strstr(%password6"password"))?
echo(+(asswords cannot contain the word "password".+)'
@
else ?
echo ("(assword accepted.")'
@
$>
strstr(%str&.adati6%str&tra.eni)
Pri%er &: Pronalazenje pozicije prvog pojavljivanja znaka ili stringa u stringu i ispis
ukupnog broja pojavljivanja.
<hr>
<h/>Gspisivan3e po.ici3e pronad3enog stringa ili .na-a unutar .adatog
stringa<!h/>
<$
%string="Gnternet tehnologi3e 3e veoma ineresantan predmet"'
%tra.eni="3e"'
!! ispisivan3e po.ici3e prvog nala.en3a tra.enog strina unutar .adatog
stringa
%int&po.ici3a=strpos(%string6%tra.eni)'
echo %int&po.ici3a'
$>
<hr>
<h/>,-upan "ro3 po3avl3ivan3a tra8enog .na-a ili stringa<!h/>
<$
!! racunan3e "ro3a po3avl3ivan3a ne-og stringa ili .na-a unutar stringa
%suma=su"str&count(%string6%tra.eni)'
echo "Iro3 po3avl3ivan3a :%suma"'
$>
strpos(%string6%tra.eni)
Funkcija vraca integer vrednost koja predstavlja poziciju prvog znaka trazenog stringa unutar
zadatog stringa. Ukoliko trazeni string ne postoji unutar zadatog stringa funkcija vraca
vrednost False.
25
su"str&count(%str&.adani6%str&tra.eni)
Funkcija vraca integer vrednost koja reprezntira ukupan broj pojavljivanja trazenog stringa
unutar zadatog stringa. Funkcija vraca 0 ukoliko nema pojavljivanja. Ovo se interpretira kao
False vrednost unutar if strukture.
Kada se koristi promenljiva tipa string, mogu se koristiti ugraene PHP funkcije (built in
"H" $unctions) strlen() i strpos() koje izvrsavaju odreene operacije nad stringom Funkcija
strlen() izracunava duzinu stringa, tj. odreuje od koliko se karaktera dati string sastoji.
Sintaksa:
Strlen(ime promenljive kojoj je dodeljen dati string ili sam string);
Pri%er &; Primer strlen() funkcije:
<$php
%password="secret1"'
i< (strlen(%password) <= F)
?
echo("(asswords must "e a least F characters long.")'
@
else ?
echo ("(assword accepted.")'
@
$>
Strpos() funkcija trazi drugi string ili karakter u okviru stringa i vraca broj pozicije gde se
nalazi karakter, odnosno broj pozicije odakle pocinje string. Racunanje pozicija pocinje od
nule.
Strpos (string ili ime promenljive, karakter ili string kome se odreuje pozicija).
Pri%er &(8 Primer strpos() funkcije:
<html>
<head> <title> (rimer strpos <un-ci3e <!title> <!head>
<"od#>
<$php
%promenl3iva="Gnternet tehnologi3e"'
echo strpos(%promenl3iva6"tehn")'
$>
<!"od#>
<!html>
Pri%er &<: Rezanje i lepljenje stringa
<$
%string="2vo 3e string -o3i cemo i.re.ati na vi5e delova"'
!! re.an3e stringa
%arr&i.re.ani=eKplode(" "6%string)'
<oreach(%arr&i.re.ani as %-l3uc => %vrednost)?
echo %-l3uc . " => " . %vrednost . "<"r>Yn"'
@
$><hr><$
!! lepl3en3e stringa i. ni.a
%arr&stringovi=arra#("2vo"6"3e"6"string"6"-o3i"6"cemo"6".alepiti")'
%.alepl3eni=implode(" "6%arr&stringovi)'
echo %.alepl3eni'
26
$>
// rezanje stringa
$arr_izrezani=explode(" ",$string);
Ovaj fragment koda reze zadati string tako da podeli zadati string na fragmente od kojih je
svaki novi fragment deo originalnog stringa izmeu dva znaka data kao uslov razdvajanja u
prvom argumentu funkcije. Svi novi fragmenti se cuvaju u nizu u kojem indeksi odgovaraju
rednom broju fragmenta.
<$php

%email=+ne-oZnegde.com+'
%arr&<ragemnti=eKplode(+Z+6%email)'
echo +nic- : + . %arr&<ragemntiS0T' !! ispisivan3e imena i. e[mail adrese
echo +domena : + . %arr&<ragemntiS1T' !! ispisivan3e domena e[mail adrese
$>
Stri"3 1 i=e red$a
<html>
<head> <title> (rimer .a <or petl3u <!title> <!head>
<"od#>
<$php
%m#&string = <<<JQSJ
Ji.ag.com
Re"master Jutorials
,nloc- #our potential*
JQSJ'
echo %m#&string'
$>
<!"od#>
<!html
sti stringovi
<$php
%name1 = "Iill"'
%name9 = "IGVV"'
%result = strcasecmp(%name16 %name9)'
i< (*%result)?
echo "Jhe# match."'
@
$>
27
N"PRE!N" S)N*"KS" PHP KO!"
!ate
PHP ugraena funkcija date() je korisna i cesto koriscena funkcija. Ova funkcija formatira
timestamp (broj sekundi koji je protekao od 1. Januara 1970. godine) u razumljiv oblik
prikazivanja datuma i vremena. Sintaksa:
date(format, timestamp)
Prvi parametar date funkcije $ormat odreuje format prikazivanja datuma i vremena. Evo
nekih slova koja se mogu koristiti uz $ormat parametar:
>$r%at Z"a0e"/e Pri%er
a am ili pm Am
A AM or PM AM
d Dan u mesecu 01
D Dan u nedelji Sun
F me meseca January
h Sat u 12 - ocasovnom formatu 04
H Sat u 24 - ocasovnom formatu 16
g Sat u 12 - casovnom formatu bez nule ispred 4
G Sat u 24 - casovnom formatu bez nule ispred 16
i Minuti 35
j Dan u mesecu 2
l Dan u nedelji (ime) Sunday
L Prestupna godina (1 da, 0 ne) 1
m Mesec u godini tri slova Jul
M Mesec u godini, potpun naziv July
N Mesec u godini (redni broj) 7
Y Godina u standardnom formatu 1999, 2008
y Godina zapisana pomocu dva simbola 99, 08
s Sekund 58
S Sufiks za dan th, nd, st, rd
R Stardizovan format datuma Thu, 15 Dec 2005 16:49:39-0600
U Timestamp 1134512479
28
Primer 37
<html>
<head> <title> (rimer .a date() <un-ci3u <!title> <!head>
<"od#>
<$php
echo date("\!!D")'
echo "<"r>"'
echo date("D!!\")'
echo "<"r>"'
echo date("D..\")'
$>
<!"od#>
<!html>
Pri%er 6<: Maketime
<$php
echo("Oalidating: F!/1!900F<"r>")'
i< (chec-date(F6/16900F)) ?
echo(+Date accepted: +)'
%new&date=m-time(1]60F6/F6F6/16900F)'
echo date("r"6%new&date)'
@
else ?
echo (+Gnvalid date.+)'
@
echo("<"r>")'
$>
)nclude and Re+uire
U PHP fajl moze da se unese sadrzaj nekog drugog fajla, pre nego sto PHP fajl server izvrsi
uz pomoc funkcija include() ili require(). Obe navedene funkcije su skoro iste, jedino se
razlikuje nacin na koji tretiraju greske u kodu (code errors). Funkcija include() upozorava, ali
skripta nastavlja da se izvrsava, dok funkcija require() generise kljucnu gresku ($atal error) i
izvrsavanje skripte se prekida. Ova tehnologija je poznata ka SS (Server Side #ncludes).
Dve navedene funkcije se koriste u kreiranju funkcija, hedera (header), futera ($ooter) ili
drugih elemenata koji se mogu koristi vise puta, na razlicitim Web stranama.
Funkcija include() uzima ceo sadrzaj zeljenog fajla i kopira ga u fajl u kome se poziva
include() funkcija. Kao primer, uzeta su dva fajla, jedan se zove include.php, a drugi fajl, koji
ce biti ukljucen u prvi, zove se linkovi.html.
Pri%er 65: Kod fajla linkovi.html
<html>
<head> <title> Vin-ovi <!title> <!head>
<"od#>
<a hre<="http:!!www.google.com"> Mli-nite ovde a-o hocete na sa3lt Woogl [
a <!a>
<"r>
29
<a hre<="http:!!www.<on."g.ac.#u"> Mli-nite ovde a-o hocete na sa3t Con [ a
<!a>
<"r>
<a hre<="http:!!www.#ahoo.com"> Mli-nite ovde a-o hocete na sa3t \ahoo [ a
<!a>
<!"od#>
<!html>
Pri%er 97 : Kod fajla include.php'
<html>
<head> <title> (rimer .a include() <!title> <!head>
<"od#>
<$php
include("lin-ovi.html")'
echo "<"r>"'
echo "Oidite lin-ove$"'
!! mo.e se -oristiti i re^uire() <un-ci3a umesto include()6 isti 3e e<e-at6
samo 3e error report drugaci3i
$>
<!"od#>
<!html>
O&$ektnoOri$entisanoPro(ramiran$e u PHP
Kao i vecina drugih naprednih programskih jezika i PHP omogucava objektno orijentisano
programiranje. Osnovni koncepti objektnog programiranja su u potpunosti podrzane u PHP:
Abstrakcija
Enkapsulacija
Nasleivanje
Klasa se definise pomocu kljucne reci class.
Da bi se koristio objekat prvo se mora napraviti klasa (class) sa nekim funkcijama i poljima u
njoj, pa se pozivati unutar koda. Varijable unutar klase su proporties tog objekata, a njene
funkcije su metode istog objekata.
Primer 41 : Jednostavan objekat
<$
class o"3e-at?
var %testna'
<unction ispisi()?
echo %this[>testna'
@
@
!! -reiran3e instance o"3e-a
%o"3=new o"3e-at'
!! name5tan3e o"3e-tne vari3a"le %testna
%o"3[>testna="Je-st -o3i 3e 7uvan .a ispis"'
!! po.ivan3e <un-ci3e -o3a .a ispis
%o"3[>ispisi()'
$>
30
Rezultat :
Tekst koji je cuvan za ispis
U gornjem primeru uz osnovne tehnike kreiranje objekta i njegove instance u skripti moze se
primijetiti jos jedna stvar.
echo $this->testna;
Koriscenjem $this-> pre imena varijable pristupa se toj varijabli i moze se koristiti za ispis ili
izmenu podataka. Na isti nacin se pristupa i funkcijama. Ukoliko je potrebno pri instanciranju
objekta automatski izvrsiti neke radnje poput spajanja na bazu podataka ili bilo koju slicnu
operaciju koja je potrebna za dalji rad objekta treba koristiti konstruktore. Konstruktori su
funkcije objekta (klase) koji se izvrsavaju zajedno sa stvaranjem instance objekta.
Konstruktori imaju isto ime kao i sam objekat.
Pri%er 9& : Objekat sa konstruktorom (dodatak primeru 12)
<$
class o"3e-at?
var %testna'
!! -onstru-tor
<unction o"3e-at()?
%this[>testna="2vo 3e te-st -o3i smo stvorili -onstru-torom<"r>"'
%this[>ispisi()'
@
<unction ispisi()?
echo %this[>testna'
@
@
!! po.ivan3e o"3e-ta u -odu
%o"3=new o"3e-at'
!! name5tan3e o"3e-tne vari3a"le %testna
%o"3[>testna="Je-st -o3i 3e 7uvan .a ispis"'
!! po.ivan3e <un-ci3e -o3a .a ispis
%o"3[>ispisi()'
$>
Rezultat :
2vo 3e te-st -o3i smo stvorili -onstru-torom
Je-st -o3i 3e 7uvan .a ispis
PHP ne poseduje destruktore. Destruktori su specijalne metode koje sluze za uklanjanje
objekata. Ovaj problem se moze resiti na sledeci nacin:
<$php
%m#o"3ect[>destro#()'
unset(%m#o"3ect)'
$>

unset () uklanja objekte isto kao promenljive
31
PHP napredne ,unkci$e za rukovan$e ,a$lovima
Da bi se sadrzaj nekog fajla procitao/modifikovao iz PHP skripte, koristi se fopen() funkcija.
Fopen() funkcija prima dva parametra. Prvi parametar je ime fajla nad kojim se operise, a
drugi parametar je nacin na koji se manipulise zeljenim fajlom (mod).
Sintaksa:
<open(_ime&<a3la_6_mod_)'
Sledeca tabela prikazuje sve modove koje moze sadrzati fopen() funkcija.
Modovi O'i!
r Citanje. Pocinje od pocetka fajla, tj. prvog reda (line).
r+ Citanje/Pisanje. Pocinje od pocetka fajla, tj. prvog reda (line).
w Pisanje.Otvara fajl i brise ceo sadrzaj fajla, a ako fajl ne postoji, kreira fajl.
w+ Citanje/Pisanje.Otvara fajl i brise ceo sadrzaj fajla, a ako fajl ne postoji,
kreira fajl.
a Dodaje. Otvara fajl i dodaje nov sadrzaj na kraj fajla.
a+ Citanje/Dodaje. Otvara fajl i dodaje nov sadrzaj na kraj fajla.
x Pisanje. Kreira nov fajl, vraca error, ako fajl vec postoji.
x+ Citanje/Pisanje. Kreira nov fajl, vraca error, ako fajl vec postoji.
Funkcija $close() nije obavezna, ali kao dobra programerska praksa vazi da se otvoreni fajl
zatvori.
Funkcija $eo$ (na*iv!$ala ili promenlive koo e $al dodelen) proverava da li je dostignut kraj
fajla koji se cita, tj. da li je pokazivac dosao do poslednjeg reda fajla.
Funkcija $gets (na*iv $ala ili promenlive koo e $al dodelen) sluzi za citanje fajla i to red po
red.
Funkcija $getc (na*iv $ala ili promenlive koo e $al dodelen) sluzi za citanje fajla i to
karakter po karakter.
Za potrebe sledeceg primera, kreiran je fajl sa proizvoljnim tekstom koji je nazvan proba.t+t.
Nakon toga, novokreirani fajl ce biti otvoren iz PHP skripte i njegov sadrzaj ce biti iscitan i
prikazan na ekranu i to red po red. Kod izgleda ovako:
Primer 43
<html>
<head> <title> (rimer .a <open() <!title> <!head>
<"od#>
<$php
%<a3l=<open("pro"a.tKt"6 "r") or eKit (">e mogu da otvorim <a3l")'
!! otvara se <a3l pro"a.tKt u modu r(read)
while (*<eo<(%<a3l))?
!! do- se ne dod3e do -ra3a <a3la6 i.vrsava se -od u viticastim .agradama
echo <gets(%<a3l) . "<"r>"'
@
<close(%<a3l)'
$>
<!"od#>
<!html>
32
Super(lo&als
Sve promenljive koje spolja ulaze u PHP kod, dolaze u jednom od nekoliko specificnih
nizova pod nazivom superglobals. Superglobalne promenljive
8
su dostupne u bilo kom delu
skripta, cak i unutar objekata, funkcija, nizova. Drugim recima, one se ne definisu, one su
vec prisutne. Predstavljaju specificne nizove varijabli, koje dolaze spolja u PHP fajl.
Obuhvataju podatke poslate sa HTML formi, podatke o kukijima, informacije o sesiji, upload-
ovanim fajlovima serveru i cine ih raspolozivim na svakom mestu. Predstavljaju nacin da
PHP otkrije odakle odreena vrednost dolazi. Na ovaj nacin se ne dozvoljava da bilo koja
promenljiva submit ovana od strane korisnika, automatski ue u PHP kod. Varijable unutar
PHP skripta ostaju izolovane od potencijalnih napada.
Ako na primer korisnik popuni formu, server nece dodeliti te vrednosti globalnim
promenljivama $name, $password. Umesto toga, ti podaci ce biti podeljeni u niz:
$_POST['name'], $_POST['password'] i moze im se pristupiti samo preko globalne
promenljive $_POST
,-GLO?ALS
Asocijativni niz koji sadrzi reference ka svim globalnim (i superglobalnim) varijablama
dostupnim u okviru lokalne skripte. mena varijabli predstavljaju kljuceve ovog niza.
,-SER@ER
Sadrzi informacije o okruzenju web servera. Predstavlja niz varijabli podesenih od strane
servera ili povezanih sa izvrsnim okruzenjem trenutne skripte. Pre nego sto se uspostavi
kontrola nad skriptom, PHP postavlja niz vrednosti u vezi sa serverom, okruzenjem, i
zahtevima od strane kljienta. Sve one su smestene u $_SERVER superglobalnoj varijabli.
U sledecoj tabeli je prikazano samo nekoliko karakteristicnih varijabli iz niza smestenog u
$_!R"!R
me Vrednost
HTTP_REFERER
Ako je korisnik kliknuo na link da bi
dosao do trenutne stranice, ovo ce
sadrzati URL prethodne strane na kojoj je
bio ili ce biti prazno ako je direktno uneo
adresu
HTTP_USER_AGENT me korisnikovog browser -a
PATH_NFO
Sve podatke unete u URL u nakon
imena skripte
PHP_SELF me trenutne skripte, koja se izvrsava
...
8
Nisu bile raspolozive sve do verzije PHP 4.1, ali su postojale alternativne metode
33
,-GET i ,-POST
Opisane u delu o formama
,-4OOKIE
Sadrzi informacije iz HTTP kukija, detaljnije obraeno u delu o kukijima
,->ILES
Asocijativni niz varijabli poslatih u PHP fajl putem HTTP POST metode.
,-EN@
Sadrzi informacije o okruzenju. Ove varijable su importovane u PHP globalni namespace iz
okruzenja u kojem radi PHP paser.
,-SESSION
Asocijativni niz varijabli sa informacijama registrovanim u okviru sesije. Detaljnije obraeno u
delu o sesijama
,-REABEST
Sve informacije dobijene od strane korisnika. Sadrzi sve varijable prikupljene preko GET,
PUT, COOKE metoda.
Re(ister (lo&als
Register_globals predstavlja jedan od parametara koji se podesavaju u konfiguracionom
fajlu php.ini. ma dve vrednosti on i off, koje odreuju, da li je dozvoljeno registrovati
varijable EGPCS (Environment, GET, POST, Cookie, Server) kao globalne. Od verzije PHP
4.2.0, po default u je namesten na o$$
Uvoenje register_globals nije bila losa ideja, problem je nastao zbog toga sto se u vecini skriptova
ne proverava izvor varijable, pre nego sto se ona koristi. Opasnost je u tome sto PHP ne zahteva od
varijabli da budu predefinisane pre koriscenja. Postojala je mogucnost da zlonamerni korisnik pozove
PHP skriptu pomocu GET ili POST metode. Ukoliko se ime varijable, koja se salje, poklapa sa
imenom varijable koja se u skriptu koristi za nesto znacajno, moze doci do poremecaja
funkcionalnosti programa, slanjem nekog laznog parametra.
Sledi primer kao ilustracija.
Neka je korisnik u adress bar uneo : http://sample.php/?access=1
Sample.php:
<$php
i< (chec-&username&and&password())
?
!!the# logged in success<ull#
34
%access = JP,Q'
@
i< (%access) ?
echo "Relcome to the administrative control panel."'
!!more privileged code here...
@
else ?
echo "Dccess denied"'
@
$>
Ocigledno da u ovom slucaju neidentifikovani posetilac moze pristupiti
admninistratorskom delu.
PHP napredne ,unkci$e za rukovan$e cookies
Cookie se obicno koristi za identifikaciju korisnika, zbog prirode HTTP protokola koji ne cuva
podatke o interakciji klijent/server. Cookie je mali fajl koji server "prikaci za racunar
korisnika. Cookie se salje u okviru HTTP zahteva browser-a. Cookie se moze kreirati
pomocu JavaScript-a, ali cesto se cookie-ima u potpunosti upravlja preko servera. Ovo znaci
da se cookie salje u Set-Cookie header polju kao deo HTTP odgovora:
HJJ(!1.0 900
`ontent[Vength: 19E:
`ontent[J#pe: teKt!html
Date: Jue6 0: >ov 9001 0H:19:HX WJ
QKpires: Jue6 0: >ov 9001 0H:19:FX WJ
Server: simwe"s!/.1.:
Set[`oo-ie: animal=egg[la#ing[mammal

<html>...<!html>
Kada web server primi odgovor, u sledecem HTTP zahtevu ukjucuje cookie u header polju
Cookie:
WQJ !duc-!"ill.php HJJ(!1.0
`onnection: Meep[Dlive
`oo-ie: animal=egg[la#ing[mammal
Host: www.we"data"ase"oo-.com
Pe<erer: http:!!www.we"data"ase"oo-.com!
U PHP - u, mogu se i kreirati i citati vrednosti cookie fajla. Za potrebe kreiranje cookie
fajlova, PHP koristi ugraenu (built in) funkciju setcookie(). Sintaksa:
setcookie(ime, vrednost, datum_isteka (u sekundama), putanja, domen)
Prva dva parametra setcookie() funkcije su obavezna, dok su ostala 3 opciona.
Parametar Opis Primer
ime
me koje koristi cookie za
skladistenje ili izvlacenje
informacija
username
vrednost Vrednost smestena u cookie. nternet
35
Datum_isteka
Unix timestamp kad istice
cookie, ako nije podeseno istice
cim se zatvori browser
Time()+60*60*24*7 - istce za nedelju
dana
putanja
URL putanja na sajtu koja moze
da pristupi cookie u. Default
znaci da svaki direktorijum
moze pristupiti cookie - u
/testing
domen
Slicno putanji, samo sto pristup
moze biti ogranicen na
poddomen sajta,
Da bi se ogranicio pristup samo na www
na sajtu example.com koristi se
www.example.com. Za pristup svim
domenima sajta koristi se .example.com.
sigurnost
Ako je podeseno na 0, cookie
se salju samo preko HTTPS
connection. HTTPS konekcija
koristi enkripciju izmeu klijenta
servera
0 za sigurnu konekciju 1 za nesigurnu,
sto je i default vrednost
Za potrebe citanja vrednosti cookie fajlova, PHP koristi globalnu promenljivu $_COOKE[],
koja kao parametar uzima ime (name) parametar funkcije setcookie().
Funkcija isset() proverava da li je vrednost cookie ja podesena.
Takoe treba napomenuti da je neophodno PHP kod koji sadrzi setcookie() funkciju staviti
pre HTML koda (posto se cookie salje, odnosno razmenjuje u okviru header-a), da bi se
vrednosti mogle upisivati u cookie fajl i citati iz njega.
U sledecem primeru dat je prikaz setcookie() funkcije.. Datum isteka postavljen je na 1 cas
(3600 sekundi).
Primer 44
<$php
setcoo-ie("ime"6 "ime-u-i3a"6 time()A/:00)'
!! postavl3en 3e coo-ie ci3e 3e ime [ ime6 vrednost [ ime-u-i3a i datum
iste-a 1 sat
$>
<$php
i< (isset(%&`22MGQS+ime+T)) ?
!! proverava da li 3e .a ime [ ime podesena ne-a vrednost u coo-ie [ 3u
echo "Do"rodosla" . " " . %&`22MGQS+ime+T'
@
else ?
echo "Do"rodosao posetioce"'
@
$>
<html>
<head> <title> (rimer .a `oo-ie <!title> <!head>
<"od#>
<!"od#>
<!html>
Ako postoji potreba da se izbrise cookie pre isteka vremena, ponovo se koristi funkcija
setcookie() i kao argument time() navodi se negativno vreme, npr. setcookie("ime,
"nternet, time()-3600) ili se pozove funkcija setcookie("ime), sa samo jednim parametrom.
36
U sledecem primeru se preko kukija cita vreme poslednje posete sajtu.
<$php
%onth = 9FX9000 A time()'
!!this adds /0 da#s to the current time
setcoo-ie(D"outOisit6 date("C 3S [ g:i a")6 %onth)'
$>
<$php
i<(isset(%&`22MGQS+D"outOisit+T))
?
%last = %&`22MGQS+D"outOisit+T'
echo "Relcome "ac-* <"r> \ou last visited on ". %last'
@
else
?
echo "Relcome to our site*"'
@
Slan$e -eader-a
HTTP je protokol za prenos podataka izmeu servera i klijenta (bro,ser). Pored podataka
koje vidimo u bro,ser-u kao sto su tekst i slike ovim protokolom se istovremeno salju i
podaci koji se ne vid. Ovi podaci se nazivaju header-i i oni sadrze informacije o serveru,
browser-u, jeziku, tipu podataka koje podrzavaju i sl. Primer hedera koje salje bro,ser:
Host: www."igcompan#.com
,ser[Dgent: o.illa H.0 (`ompati"le' SGQ' F.F)
Dccept: teKt!46 teKt!html6 teKt!html'level=16 4!4
Dccept[Vanguage: da6 en[g"'^=0.]6 en'^=0.E
Header-e mozemo grubo podeliti u dve grupe: -e.uest header-e koje bro,ser salje kada se
zahteva neki fajl sa servera i -esponse header-e koje salje server kada isporucuje taj fajl.
Na osnovu tih podataka mozemo zakljuciti koji bro,ser korisnik koristi, koje servise
podrzava ureaj korisnika i sl.
U narednom kodu se vidi kako se u PHP-u citaju podatke iz header-a:
%accept = %&SQPOQPS"HJJ(&D``Q(J"T'
%user&agent = %&SQPOQPS"HJJ(&,SQP&DWQ>J"T'
%accept&charset = %&SQPOQPS"HJJ(&D``Q(J&`HDPSQJ"T'
%accept&language = %&SQPOQPS"HJJ(&D``Q(J&VD>W,DWQ"T'
%K&wap&pro<ile = %&SQPOQPS"HJJ(&a&RD(&(P2CGVQ"T'
%pro<ile = %&SQPOQPS"HJJ(&(P2CGVQ"T'
Funkcija header() omogucava slanje stringova preko HTTP header-a
int header(string string);
Format je:
"header_name: header_value"
Na primer za redirekciju browser-a na drugu stranicu, koristi se sledci zapis:
header("Location: http://www.myelab.net");
37
li da bi se sprecilo kesiranje stranica
header("Cache-Control: no-cache, must-revalidate");
Treba napomenuti da sve sto se nalazi u header-u, mora biti poslato browser-u pre bilo
kakvog ispisa u HTML
PHP napredne ,unkci$e za sesi$ama
Koncept HTTP protokola kao protokola "bez stanja veoma cesto moze da stvori probleme
kompleksinm aplikacijama koje podrazumevaju odreen vid interakcije sa korisnikom. Takvi
sajtovi se ne mogu implementirati kao niz nepovezanih stranica, odnosno niz stranica koje
ne cuvaju stanje. Obican HTML sajt ne prenosi podatke sa jedne stranice na drugu. Drugim
recima, sve informacije se zaboravljaju cim se ucita nova stranica. Ovo moze da bude veliki
problem, posebno u slucajevima kao sto je "potrosacka korpa, kada je neophodno imati sve
podatke(npr. koje proizvode je kupac uzeo), bez obzira da li su kupljeni na prvoj ili poslednjoj
stranici sajta. Svi selektovani proizvodi moraju biti zapamceni na neki nacin, pre dodavanja
sledeceg u nizu.
Sesija predstavlja apstraktni koncept, koji cini niz HTTP zahteva i odgovora izmeu
odreenog web servera i web browser-a . Sesija je veoma korisna u web aplikacijama kada
je neophodno deliti i prenositi informacije izmeu stranica. Posto HTTP kao protokol ne
podrzava ovaj koncept, svi server-side jezici su razvili tehnologije za upravljanje sesijama.
Postoje tri kljucne stvari koje treba posmatrati kada su u pitanju sesije na webu.
nformacije o stanju moraju biti negde zapamcene.
Svaki HTTP zahtev mora sadrzati nekakav identifikator koji omogucava serveru da
obradi zahtev sa svim skaldistenim (zapamcenim stanjima). Na primer, kada korisnik
zavrsi kupovinu, podaci o svim proizvodima u korpi, kao i podacima o korisniku
moraju biti na raspolaganju serveru.
Sesije moraju imatiu period trajanja (timeout)
PHP resava ovo pitanje, omogucavajuci skladistenje informacija o korisniku na serveru (npr.
ime, username, selektovani proizvodi i sl.). Uglavnom, informacije iz sesija se ne cuvaju
predugo, ali u potpunosti je izvodljivo cuvati ih u nekoj bazi.
Kljucno pitanje je na koji nacin identifikovati sesiju i odrzati tzv.Session D (identifikator, id
sesije).
PHP sesije rade tako sto kreiraju jedinstveni id tzv. UD (Unique D) za svakog posetioca
web sajta i cuvaju korisnicke promenljive koje su zasnovane na UD. UD se cuva ili u cookie
fajlu ili u URL u (Uniform Resource Locator).
Na sledecoj slici je prikazano kako PHP upravlja sesijama:
38
1) Kada korisnik zahteva odreenu stranicu u koju je ugraen concept sesije, PHP
generise id sesije i kreira fajl koji cuva sve varijable vezane za sesiju.
2) U okviru odgovora server postavlja cookie sa id sesije
3) Browser pamti cookie i salje ga u sledecem zahtevu
U primeru welcome.php pamti varijable sesije na odgovarajucoj lokaciji i one postaju
dostupne i u svakom sledecem zahtevu (next.php)
Da bi se koristila u PHP u, sesija mora da se aktivira. Sesija se otvara pomocu
session_start() funkcije. Ova funkcija u PHP fajlu se mora navesti pre HTML taga,
odnosno pre <html>. stovremeno, funkcija session_start() moze da sluzi i za nastavak
postojece sesije na osnovu id sesije poslatog u zahtevu za stranicom u kojoj je ova funkcija.
Njenim pozivom se automatski aktiviraju sve varijable sesije (ako je upitanju nastavak
postojece)
Kada se prvi put pozove funkcija session start(), osim kreiranja id sesije, automatski se u
odgovoru generise i polje Set-Cookie. Ubacuje se cookie bez potrebe za eksplicitnim
pozivanjem funkcija setcookie() ili header().
dentifikator sesije je dugacak string koji se sastoji iz 32 heksadecimalne cifre
(fcc17f071bca9bf7f85ca281094390b4) i smesten je u sistemskoj PHP varijabli pod imenom
PHPSESSD.
Direktorijum u kojem se cuvaju fajlovi sesija se definise u session.save_path u php.ini fajlu.
Po default-u, fajlovi se cuvaju u /tmp direktorijumu, koji ce u ovom slucaju izgledati
/tmp/sess_fcc17f071bca9bf7f85ca281094390b4.
Kada se u PHP stranici potrazi session_start( ), a pri tom PHPSESSD se nalazio u HTTP
zahtevu, PHP pokusava da pronae fajl sesije u koji su skladistene sve varijable sesije. Ako
ne postoji fajl pridruzen ovoj sesiji, kreira se novi.
Nakon startovanja sesije i prelaska na bilo koju drugu stranicu, PHP prenosi id sesije na
svaku stranu ili preko kukija ili preko PHPSESSD kao GET varijable.
Postoje dva nacina za prenos i odrzavanje identfikatora sesije sa stranice na stranicu:
39
Cookies
URL parametar
Cookies su optimalno resenje, ali se moze dogoditi da nisu omoguceni. Drugi nacin
podrazumeva ubacivanje id sesije direktno u URL.
Moguce je koristiti i konstantu SD, koja se automatski definise kada se sesija startuje. Ova
konstanta ima oblik session_name=session_id.
Sve varijable vezane za jednu odreenu sesiju se mogu procitati preko globalne promenljive
$_SESSON. U narednom primeru ce biti prikazano kako se uz pomoc $_SESSON[]
promenljive moze videti koliko puta je odreena web strana pregledana od strane korisnika.
Sesija zapocinje pomocu funkcije session_start() i na taj nacin se inicijalizuje niz varijabli u
okviru superglobalne $_SESSON[]. Nakon toga je moguce kreirati varijable i dodeljivati im
vrednosti. Sesija mora biti startovana pre bilo kakvog ispisa na ekranu, usled ogranicenja
HTTP protokola, koji zahteva slanje sesija u okviru header-a.
Primer 45 Brojanje pregleda stranica
<$php
session&start()'
$>
<html>
<head> <title> (rimer .a %&SQSSG2>() promenl3ivu <!title> <!head>
<"od#>
<$php
i< (isset(%&SQSSG2>S+view+T)) ?
%&SQSSG2>S+view+T = %&SQSSG2>S+view+T A 1'
@
else ?
%&SQSSG2>S+view+T=1'
@
echo "Stranica 3e pregledana" . " " . %&SQSSG2>S+view+T . " " . "puta"'
$>
<!"od#>
<!html>
U sledecem primeru se vidi sustina koncepta sesije. Prelaskom sa jedne na drugu stranicu
ne gubi se vrednost promenljive ukupani*nos.
Primer 46 : Sabiranje potrosenog novca
prva.php
<$php
!! pocetna stranica
session&start()'
%&SQSSG2>S"u-upani.nos"T = 1'
print "<a hre<=+druga.php+> (relas-om na sledecu stranicu povecavate i.nos
.a F dinara<!a>"'
?>
druga.php
<$php
40
!! druga.php
session&start()'
%&SQSSG2>S"u-upani.nos"T=%&SQSSG2>S"u-upani.nos"T A F'
print %&SQSSG2>S"u-upani.nos"T'
$>
Treba primetiti da se vrednost varijable ukupan iznos povecala prilikom prelaska na stranicu
druga.php. Sesija se vezuje za skup svih stranica koje se posecuju u okviru nje, a ne samo
na pojedinacne stranice. Prilikom poziva funkcije session_start(), ne inicijalizuje se nova
sesija, nego se samo ponovo aktivira postojeca sa svim svojim varijablama. Na slici se vidi
cookie, koji sa sobom nosi id sesije.
U ovom primeru se nakon izvrsavanja prve varijable njena vrednost cuva u fajlu sesije tako
sto se ona automatski serijalizuje i izgleda ovako: u-upani.nosLi:1'.
41
Nakon poziva druge stranice ona u serijalizovanom obliku izgleda ovako
Da bi varijable sesije ostale zapamcene, neophdno ih je ili postaviti preko globalne varijable
%&SQSSG2> ili registrovati pomocu funkcije session_register(). Na taj nacin, one se pamte u
definisanom fajlu:
!! Pegistru3 vari3a"lu "ime"
session&register("ime")'
%ime = "internet tehnologi3e"'
Kada je potrebno obrisati odreenu varijablu iz sesije koristi se funkcija unset()
unset(%&SQSSG2>S"session&name"T)6
ako treba obrisati sve podatke vezane za sesiju, upotrebljava se funkcija
session&destro#()'
Ukoliko bi se u prethodnom primeru koristio prenos id sesije preko URL deo koda:
print "<a hre<=+druga.php+> (relas-om na sledecu stranicu povecavate i.nos
.a F dinara<!a>"'
bi se promenio u:
print "<a hre<="druga.php$+ . SGD . +"> (relas-om na sledecu stranicu
povecavate i.nos .a F dinara<!a>"'
Kak$ 'r$eriti da li !e!i/a k$ri!ti #$$kie ili C1erD !tri"3
Kada se sesija startuje, po default-u se id sesije skaldisti na klijentskoj masini.
Meutim,ukoliko racunar korisnika ne podrzava cookie, PHP salje id sesije preko query
stringa. URL ce na primer izgledati ovako:
http://www.example.com/file.php?SD=43b4a19d1962304012a7531fb2bc50dd
Ovaj drugi nacin pamcenja i prenosenja id sesije nije preporuciv usled sigurnosnih
ogranicenja i pojedinih default podesavanja u konfiguracionim fajlovima PHP-a. Da bi se
proverilo koji nacin sesija koristi za prenos id sesije, moze se koristiti sledeci script:
<$
session&start()'
i<(isset(%&`22MGQS+(H(SQSSGD+T))
?
echo +Jhe session GD has "een store in a coo-ie+'
@
i< (de<ined(SGD))
42
?
echo +Jhe session GD has "een stored in the ^uer# string+'
@
$>
Sve operacije vezane za sesije se moraju obaviti pre nego sto se bilo kakav sadrzaj posalje
korisniku. Ovo se moze osigurati na vise nacina. Prvi je da se te operacije stave na sam
pocetak skripte. U tom slucaju pre tih operacija ne sme biti nikakav kod, HTML ili prazan red.
Ovo je u vecini situacija vrlo tesko postici. Drugi nacin za onemogucavanje slanja bilo
kakvog sadrzaja korisniku je koriscenjem output buffering funkcija. Output buffering je
kontrolisanje slanja generisanog HTML koda korisniku. Znaci da se na samom pocetku
skripte moze iskljuciti slanje outputa PHP koda (ili drugim recima ukljuciti output buffering).
Ovim se osigurava da se korisniku nece nista poslati pre nego sto treba. Ovom metodom se
operacije sesije mogu obavljati bilo gde na stranici.
<? ob_start() ;// output buffering
Ovim je ukljucen output buffering i korisniku se nece slati nikakv sadrzaj pre pojavljivanja
ob_end_flush();
B'$treba !e!i/a za a1te"tika#i/1
PHP sesije su idealne za web sajtove koji zahtevaju logovanje pomocu korisnickog imena i
sifre. Ovakvi sajtovi se veoma cesto sastoje iz veceg broja stranica i potrebno je informaciju
u logovanju preneti i na druge stranice (ne ocekuje se da se korisnik ponov loguje na svakoj
stranici). Postupak u PHP bi mogao da izgleda ovako:
1) Procitaju se podaci koje je korisnik uneo prilikom pokusaja logovanja na sistem
2) Vrsi se provera u bazi.
3) Ukoliko je korisnik uneo korektne podatke zapocinje se sesija i postavlja odreena
promenljiva sesije:
$_SESSON['login']='go';
4) Kada god korisnik pree na neku drugu stranicu, proverava se preko promenljive
login da li je ulogovan
5) Ako je ulogovan prikazuje se sadrzaj stranice, a ako nije korisnik se vraca na stranicu
za logovanje
Da bi se izvrsila provera da li je korisnik ulogovan ili ne, korsiti se sledeci kod:
<$php
session&start()'
i< (%&SQSSG2>S+login+T *= "go" ) ?
header("Vocation: login(age.php")'
eKit()'
@
else
i< (%&SQSSG2>S+login+T = "go" )
?
!!(ri-a8i sadr8a3 stranice
@
$>
43
Naravno, neopohodno je u okviru sesije voditi racuna i o tome da li je korisnik preduzeo
akciju logout i u skaldu sa tim podesiti i odgovarajucu promenljivu u sesiji.
PHP napredne ,unkci$e za upravl$an$e (re.kama
Vazan segment PHP koda je upravljanje greskama (tzv. error handler). Default error
handeler u PHP u je jako jednostavan. Poruka o gresci se salje do browser - a sa nazivom
php fajla u kome se greska nalazi, broju linije koda gde je greska i poruci koja opisuje
prirodu greske.
Kada se prave skripte i Web aplikacije, rukovanje greskama je nezaobilazan postupak. Ako
programskom kodu nedostaje provera gresaka, aplikacija izgleda neprofesionalno i moze biti
izlozena rizicima sigurnosti.
U nastavku teksta, bice prikazana tri metode za upravljanje greskama:
Jednostavna die() naredba
Personalizovane funkcije za upravljanje greskama i okidaci gresaka
zvestavanje o greskama
Najjednostavniji nacin za upravljanje greskama (error handling) je funkcija die(), koja je
ilustrovana sledecim primerom.
Primer 47
<html>
<head> <title> (rimer .a error handling [ <un-ci3a die() <!title> <!head>
<"od#>
<$php
i< (*<ile&eKists("do"rodosli.tKt")) ?
die ("Ca3l do"rodosli.tKt ne posto3i na Oasem <ile sistemu")'
@
else ?
%<a3l=<open("do"rodosli.tKt"6 "r")'
@
$>
<!"od#>
<!html>
U prethodnom primeru se vidi da ako fajl dobrodosli.t+t ne postoji, u browser u, se ispisuje
poruka da fajl ne postoji, a ako fajl postoji, fajl se otvara.
Drugi nacin za upravljanje greskama (error handling) je uz pomoc personalizovanih funkcija
za upravljanje greskama i okidacima gresaka (error triggers). Kreiranje personalizovanih
funkcija za upravljanje greskama je jednostavan postupak. Ta funkcija se poziva svaki put
kada se naie na gresku u PHP u. Personalizovana funkcija za upravljanje greskama
prima najmanje dva parametra - error level (nivo greske) i error message (poruka koja se
ispisuje kada se greska javi), a, najvise pet parametara. Poslednja tri parametara su opcioni.
Sledeca tabela prikazuje listu parametara koja moze primiti personalizovana funkcija za
upravljanje greskama:

44
Para%etar
1.1.1.1.1 Opis
error_level
Nephodan parametar. Odreuje tip izvestaja o greski za korisicko
definisanu gresku. Ovaj parametar mora biti ceo broj.
error_message
Nephodan parametar. Odreuje poruku kada se greska javi za korisnicko
definisanu gresku.
error_file Opcioni parametar. spisuje ime fajla u kome se greska javila.
error_line Opcioni parametar. spisuje broj linije koda gde se greska javila.
error_context
Opcioni parametar. pisuje imena svih promenljivih i njihovih vrednosti koje
su bile aktivne kada je doslo do gresle
Sledeca tabela prikazuje tip izvestaja o gresci, tj. broj koji se definise u parametru
error_message.
Vrednost Konstanta Opis
2 E_WARNNG
Nije fatalna run time greska. zvrsenje skripte se
nastavlja.
8 E_NOTCE
Run time primedba. Primeceno je nesto u toku
izvrsavanja koda sto moze biti , ali i ne mora biti
greska.
256 E_USER_ERROR Fatalna korisnicki definisana greska.
512 E_USER_WARNNG Nije fatalna korisnicki definisana greska.
1024 E_USER_NOTCE Korisnici generisana primedba.
4096 E_RECOVERABLE_ERROR Uhvatljiva (catchable) fatalna greska.
8191 E_ALL Sve greske i upozorenja.
U narednom primeru prikazana je personalizovana funkcija za upravljanje greskama (error
handling). Prvo ce biti kreirana takva funkcija koja ce prikazivati nivo greske (error level) i
poruku o gresci:
Primer 48
<html>
<head> <title> (rimer .a erorr handler [ personali.ovana gres-a <!title>
<!"od#>
<"od#>
<$php
<unction personali.ovanaWres-a(%errno6 %errstr) ?
echo "<"> Wres-a: <"> S%errnoT %errstr "'
@
!! sada ce se postaviti error&handler
set&error&handler("personali.ovanaWres-a")'
!! o-idan3e6 t3. naila.en3e na gres-u6pri-a.ace se vrednost promenl3ive
-o3a ne posto3i
echo (%test)'
$>
<!"od#>
<!html>
U nastavku, bice prikazan jos jedan primer u kome ako je dati broj veci od 2, izvrsavanje
skripte se prekida pomocu trigger_error() funkcije:
45
E_USER_WARNNG ce se aktivirati, ako je test promenljiva veca od 1. Ako se aktivira
E_USER_WARNNG, personalizovana funkcija za upravljanje greskama bice aktivirana da
bi se izvrsenje skripte prekinulo:
Primer 49
<html>
<head> <title> (rimer .a personali.ovani error handler(/) <!title> <head>
<"od#>
<$php
<unction personali.ovanaWres-a(%errno6%errstr)
?
echo "<"> Wres-a <!"> S%errnoT %errstr"'
echo "Mra3 s-ripte"'
die()'
@
set&error&handler("personali.ovanaWres-a"6Q&,SQP&RDP>G>W)'
!! o-idan3e gres-e
%test=9'
i<(%test>1)?
trigger&error("vrednost mora "iti veca od 1"6 Q&,SQP&RDP>G>W)'
@
$>
<!"od#>
<!html>
46
UO! U %OR/E
Jedna od kljucnih stavki u kreiranju aplikacija je prikupljanje podataka od korisnika. Ovo se
najcesce resava pomocu HTML formi. Korisnik unosi razlicite vrednosti u formu i nakon
selektovanja opcije za submit forme, browser formatira podatke i salje zahtev ka serveru.
zmeu ostalog u zahtevu se nalazi i naziv fajla na serveru koji bi trebalo da obradi zahtev.
Zbog prirode PHP-a kao serverskog skriptnog jezika za dinamicku manipulaciju web
sadrzajem koja u mnogim situacijama zavisi od korisnickog unosa ili korisnickih akcija
(kliktanje na linkove i slicne akcije), rad sa formama predstavlja jedno od najbitnijih oblasti.
Forme se koriste u velikom broju web aplikacija, nezavisno u kom je jeziku aplikacija
napisana. Zbog ovoga je potrebno imati znanje samih HTML formi (tipove polja, koja su za
koju namenu najbolja, nacine grupisanja elemenata . ).
Uz poznavanje HTML dela formi, potrebno je znati kako pomocu PHP-a prihvatiti i obraditi
vrednosti koje su unesene u formu.
O ,ormama uop.teno
Sa tehnicke strane gledano, forma je HTML element pomocu kojeg se grupise vise
elemenata za unos podataka (tipa text box, select izbornik, opcije. ). U elemente forme
korisnik moze uneti (ili izabrati) informacije koje se kasnije koriste za bilo koju svrhu (unos
informacija u bazu podataka, slanje e-maila sa unesenim informacijama . ). Razlog
grupisanja vise elemenata za unos podataka u jednu formu je vise manje ocigledan.
Uglavnom, kada se vrsi nekakav unos na web stranici, obicno se radi o vise povezanih
informacija koje cine celinu (primer : login forma sa username - om i password - om). Posto
su elementi forme grupisani salju se na obradu zajedno kada se forma submit - uje.
Primer 1 : Umetanje forme u HTML dokument
<html>
<head>
<title>(rimer 1 : ,metan3e <orme u HJV do-ument<!title>
<!head>
<"od#>
<h1>(rimer 1 : ,metan3e <orme <!h1>
<hr>
<p>Gspunite <ormu : <!p>
<<orm method="post" action="prihvat.php" name="<orma1">
<input name="su"mitdugme" t#pe="su"mit" value="(osal3i">
<!<orm>
<!"od#>
<!html>
Forma se predstavlja preko jednog od osnovnih HTML tagova koji ima svoj pocetak i kraj, i
odreene atribute.
Prvi atribut je method="post". Definise metodu kojom ce se podaci iz forme proslediti
dokumentu (skripti) za obradu forme.
47
Drugi atribut je action="prihvat.php". Preko action atributa se definise fajl na serveru, koji ce
obraditi zahtev
Treci atribut je name="forma1". Ovaj argument nije bitan za prihvatanje i obradu podataka
forme pomocu PHP-a. Vaznost ovog argumenta se vise ogleda u izradi JavaScript klijentskih
kodova, i sluzi za identifikaciju ove forme.
Preko input taga se kreiraju razliciti tipovi elemanat koji omogucavaju unos od strane
korisnika. Ukoliko je input elemenat tipa submit, na ekranu je prikazan kao dugme sto je
najvaznije klik na to dugme generise dogaaj onsubmit, odnosno dovodi do submit-ovanja
forme.
/etode slan$a i pri-vatan$a podataka
Dve osnovne metode prosleivanja podataka forme nekom dokumentu (skripti) su POST i
GET. Odabir metode prosleivanja podataka forme se vrsi navoenjem method argumenta
<form> taga. Moguce vrednosti metod argumenta su "post" i "get".
Odabirom metode se utice na koji nacin ce se sami podaci forme proslediti stranici, i to je
nezavisno od jezika u kojem ce se ti podaci prihvatiti i obraditi. U PHP-u odabirom metode
se bira i nacin na koji ce biti prihvaceni podaci.
Klasicna dilema u web aplikacijama je da li koristiti GET ili POST metodu. Pravi odgovor je
tesko definisati.
Prva razlika izmeu ovih metoda je najdrasticnija i odmah uocljiva. Kada se odabere metoda
GET podaci forme se salju kroz komandnu liniju (query string, tj. iza znaka ? u adress baru
browsera). Podaci se prenose u obliku kljuc=vrednost. Na primer:
http:!!www.m#ela".net!php!user<orm.php$username=internet6
znaci da ce se izvrsiti fajl userform.php u php direktorijumu na serveru myelab, a promenljiva
koja se salje je username sa vrednoscu nternet.
Odabirom metode POST podaci nisu vidljivi u komandnoj liniji vec se salju transparentno
kroz header HTTP requesta. POST-om se podaci forme salju kroz request header i time se
na njih ne moze uticati izmenom linka u adress baru. Takoe, postoji i ogranicenje na
kolicinu podataka koji se mogu poslati putem GET metode. Ogranicenje zavisi od postavki
samog servera na kom se nalazi dokument na kom se procesira forma i varira od 256 byte-
ova do cak 32 Kb. Zato, ukoliko se radi o formama koje u sebi sadrze polja za unos velikih
tekstova ili slicnih podataka GET i nije adekvatna metoda za prosleivanje informacija.
Metoda koja se koristi za prosleivanje informacija zavisi od situacije do situacije.
U GET metodi informacije stavljaju u URL, sto ovu metodu cini idealnom u slucaju kada
zelite omoguciti posetiocima sitea da ubace stranicu koju gledaju u svoje favorites, jer ce
staviti URL zajedno sa prikacenim query stringom.
GET je prilicno nesigurna metoda jer posetilac vrlo lako moze izmeniti zahtev jednostavnom
promenom URL-a u adress baru svog browsera, tako da nije preporucljivo koristiti ovu
metodu za prosleivanje recimo usernamea i passworda u login formama i slicnih osetljivih
48
informacija. Jedino pravilo koje se mora postovati je da se obavezno mora koristiti POST
metoda kada se preko forme uploa-uje odreen fajl
Primer # se sastoji od dva dela. Radi se o istoj formi, samo sto se u slucaju a) koristi GET
metoda, a u slucaju b) POST.
Primer se sastoji od dva dokumenta za oba slucaja. Prvi ce biti nazvan forma.php, a drugi
prihvat.php. z imena se zakljucuje da ce se u forma.php nalaziti sama forma, a u
prihvat.php ce se nalaziti PHP skripta koja ce prihvatiti informacije i ispisati ih na ekran. Ovi
primeri bi trebalo da ilustruju osnovnu metodu za prihvatanje podataka iz forme.
Primer 2 a) : Jednostavna forma pomocu GET metode
Dokument : forma.php
<html>
<head>
<title> (rosledivan3e in<ormaci3e WQJ metodom<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<<orm name="primer9[a" method="get" action="prihvat.php">
,nesi svo3e ime :
<input name="ime" t#pe="teKt" >
<"r>
<input name="su"mit" t#pe="su"mit" value="(osal3i">
<!<orm>
<!"od#>
<!html>
Dokument : prihvat.php
<html>
<head>
<title>(rimer 9 a) : (rihvatan3e podata-a WQJ metode<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<$php
echo "(o.drav " . %&WQJS"ime"T'
$>
<!"od#>
<!html>
Potrebno je uociti samo da je u metod argumentu namestena vrednost get. U ovom primeru
je u formu ubaceno dva elementa. Radi se o <input> tagu koji ima vise razlicitih tipova.
Prvi put je koriscen u svom text tipu :
<input name="ime" t#pe="teKt" >
a drugi put se radi o tasteru :
<input name="su"mit" t#pe="su"mit" value="(osal3i">
U oba elementa je potrebno primeniti koriscenje name argumenta. Pomocu njega se daje
polju ime i to ime se koristi u PHP-u za prihvatanje podataka koji su uneseni u to polje.
49
Ukoliko se ne imenuje polje, podaci koji se unesu u njega nisu vidljivi PHP skripti koja je
namenjena za prihvatanje podataka iz forme.
Prihvatanje podataka je sam po sebi vrlo jednostavan. Unutar PHP-u postoje superglobalne
varijable. To su varijable (nizovnog tipa) koje definise sam PHP pri pokretanju svake skripte.
,-GET
Sadrzi sve varijable poslate preko HTTP GET zahteva. Ovo se odnosi i na one poslate
direktno preko URL - a (http://www.example.com/page.php?id=2) i preko submit ovanja
forme koriscenjem GET metoda.
echo "(o.drav " . %&WQJS"ime"T'
Gornja linija ispisuje poruku koja se sastoji od konstantnog dela Pozdrav i dela u kojem se
ispisuje ono sto je uneseno u text box polje u forma.php dokumentu koje je nazvano ime. z
ovog jednostavnog primera je vidljivo da se podacima iz forme pristupa pomocu
odgovarajuce superglobalne varijable. Vrednost nekog elementa forme se nalazi unutar
superglobalne varijable na indeksu koji odgovara imenu tog elementa forme. U kojoj se
superglobalnoj varijabli nalaze podaci zavisi o izabranoj metodi prosleivanja podataka. U
ovom primeru je metoda bila GET, tako da je koriscena superglobalna varijabla $_GET.
Pre nego sto se krene sa drugim delom primera, treba primetiti da su se podaci koji su
ispunjeni u forma.php dokumentu zalepili na link u prihvat.php dokumentu koji ispisuje
podatke.
http:!!localhost!php"oo-!<orme!primer9!prihvat.php$ime=o3eGmeBsu"mit=(o
bXDal3i
Sve iza znaka ? u gornjem linku se naziva QUERY STRNG. Radi se o seriji parova imena i
vrednosti medusobno odvojenim znakom &.
Bilo bi moguce ovim nacinom preneti podatke iz jedne stranice na drugu cisto putem linkova.
Naime, PHP-u je svejedno da li se podaci u query stringu popunjavaju putem neke forme, ili
se radilo o <a> tagu u kojem je u href argumentu napisan url skupa sa query stringom.
Znaci, ovo bi bio ekvivalent formi iz primera, kada se u text box unese Marko
<a hre<=+prihvat.php$ime=ar-o+>o3e ime 3e ar-o<!a>
Cak je i izostavljena druga varijabla u query stringu posto ona za sada nije potrebna u
prihvat.php dokumentu.
Primer # $) : Jednostavna forma pomocu POST metode
Dokument : forma.php
<html>
<head>
<title>(rimer 9 ") : (rosledivan3e in<ormaci3e (2SJ metodom<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer 9 ") : (rosledivan3e in<ormaci3e (2SJ metodom <!h9>
<hr>
<<orm name="primer9["" method="post" action="prihvat.php">
50
,nesi svo3e ime :
<input name="ime" t#pe="teKt" >
<"r>
<input name="su"mit" t#pe="su"mit" value="(osal3i">
<!<orm>
<!"od#>
<!html>
Dokument : prihvat.php
<html>
<head>
<title>(rimer 9 ") : (rihvatan3e podata-a (2SJ metode<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<$php
echo "(o.drav " . %&(2SJS"ime"T'
$>
<!"od#>
<!html>
,-POST
Sadrzi sve varijable poslate preko HTTP PUT zahteva.
Princip prihvata podataka poslatih POST metodom je isti kao i kod prihvata podataka GET
metode, sa manjim razlikama.
Prva razlika je u forma.php dokumentu, gde je promenjena metoda u POST.
<form name="primer2-b" method="post" action="prihvat.php">
Druga razlika je u vec spomenutoj superglobalnoj varijabli koja je ovog puta $_POST.
echo "Pozdrav " . $_POST["ime"];
Dodatna i ocigledna razlika je da sada vise nema query stringa i nije moguce direktno uticati
na podatke nakon sto je forma ispunjena i submitovana.
Provera metode pristupa dokumentu 0 skripti
U nekim situacijama je potrebno znati kojom metodom je neki dokument / skripta otvorena,
pa na osnovu toga se obavljaju potrebne operacije. Ovo je moguce proverom vrednosti
$_SERVER["REQUEST_METHOD"] ili skraceno $REQUEST_METHOD varijable.
Njene moguce vrednosti su POST i GET, zavisno od metode otvaranja stranice. Njena
vrednost ce uvek biti GET osim u slucaju da se dokumentu pristupilo nakon submitovanja
forme sa POST metodom.
z tog razloga ovo nije najbolja metoda za proveru da li je neko stvarno ispunio formu i
pristupio dokumentu za prihvatanje i obradu podataka.
Kod search formi je dodatna, vec spomenuta, prednost ta sto se query string cuva zajedno
sa URL-om u favorites posetioca, tako da je moguce opet se vratiti na isto pretrazivanje
nakon vise dana jednostavnim odabirom bookmarka.
51
%orme i srpski znakovi
Problem neprikazivanja, tj. loseg prikazivanja srpskih znakova lezi u nepravilnom i
nedoslednom koriscenju charseta unutar svih dokumenata skripte. Naime, pre izrade skripti
dobra praksa je odluciti se za jedan charset pa ga dosledno koristiti na svim dokumentima
unutar sitea i time ce biti izbegnuti svi problemi sa njima. Ovo pravilo vredi i za rad sa bazom
podataka.
Otvorite prihvat.php iz jednog od slucaja Primera #, pa mu promenite
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
u
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
Zatim otvorite forma.php iz istog slucaja, ispunite formu sa nekim srpskim znakovima pa je
submitujte. Kao sto se vidi, neki od znakova se nisu prikazali pravilno. Ako se usklade
charset-ovi srpski znakovi ce se prikazivati bez problema.
Prikaz i o&rada unutar $edno( dokumenta
U srednjim i vecim aplikacijama je vrlo neprakticno imati odvojene dokumente za prikaz i
obradu forme iz ociglednog razloga sto bi se broj dokumenata nekog sajta popeo do tako
velikog broja da bi postao problem pracenja sta se gde odvija unutar strukture dokumenata
sajta.
z tog razloga je pozeljno stvari koje su usko povezane, poput prikaza i obrada forme drzati
unutar istog dokumenta u najmanju ruku.
U primeru ce biti koriscena ista forma i obrada iz b slucaja Primera #.
Primer 3 : Prikaz i obrada forme unutar jednog dokumenta
<html>
<head>
<title>(rimer / :(ri-a. i o"rada <orme unutar 3ednog do-umenta<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer / :(ri-a. i o"rada <orme unutar 3ednog do-umenta<!h9>
<hr>
<<orm name="primer/" method="post" action="<$=%&SQPOQPS+(H(&SQVC+T$>">
,nesi svo3e ime :
<input name="ime" t#pe="teKt" >
<"r>
<input name="su"mitu3" t#pe="su"mit" value="(osal3i">
<!<orm>
<$php
i< ( *isset(%&(2SJS"su"mitu3"T))
?
@
else ?
echo "(o.drav " . %&(2SJS"ime"T'
@
52
$>
<!"od#>
<!html>
Zapravo je eliminisana potrebu za dva odvojena dokumenta i sve se obavlja unutar istog
dokumenta. Prva stvar koja se odmah uocava je
i< ( *isset(%&(2SJS"su"mitu3"T))
U ovom primeru se proverava postojanje vrednosti unutar superglobalne $_POST varijable,
a ukoliko se u njoj nalazi neka vrednost podrazumeva i da je $REQUEST_METHOD ==
POST.
Ono sto treba primetiti u primeru je da se proverava postojanje vrednosti za submit taster
unutar forme. To se radi zato sto je ta vrednost obavezno prisutna ukoliko se forma ispunila i
submit - ovala.
Logika primera je poprilicno jednostavna. Ukoliko ne postoji vrednost u $_POST["submituj"]
znaci da forma nije jos ispunjena, a ukoliko ta vrednost postoji znaci da je forma ispunjena i
submito - vana, pa se ide na obradu podataka.
<<orm name="primer/" method="post" action="<$=%&SQPOQPS+(H(&SQVC+T$>">
$PHP_SELF je varijabla koju definise sam PHP i u njoj se nalazi ime trenutno aktivnog
dokumenta. Posto se zeli da se forma prikaze i obradi unutar istog dokumenta, to je tacno
ono sto je potrebno. ako se tu moglo rucno upisati ime dokumenta, koriscenje $PHP_SELF
je preporucljivo, zato sto se ovako moze promeniti ime dokumenta, a u njemu ce sve i dalje
raditi kako je zamisljeno, zato sto PHP sam namesta njenu vrednost.
U slucaju da se zeli imati u jednoj formi vise submit tastera, u zavisnosti od toga koji je
kliknut treba u obradi forme obaviti razlicite operacije. Na primer, kada se radi nekim
administrativnim alatima, gde je potrebno napraviti vise razlicitih operacija nad istim
podacima.
Primer %: Forme sa vise tastera
<html>
<head>
<title>(rimer H : Corma sa vise su"mit tastera<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer H :Corma sa vise su"mit tastera<!h9>
<hr>
<<orm name="primerH" method="post" action="<$=%&SQPOQPS+(H(&SQVC+T$>">
<input t#pe="su"mit" name="taster1" value="Jaster 1">
<"r>
<input t#pe="su"mit" name="taster9" value="Jaster 9">
<!<orm>
<$
i< (isset(%&(2SJS"taster1"T))
echo "(ritisnuli ste taster 1"'
i< (isset(%&(2SJS"taster9"T))
echo "(ritisnuli ste taster 9"'
$>
<!"od#>
53
<!html>
Ovog puta je kao uslov prikaza ili obrade forme koriscen $REQUEST_METHOD. On je
koriscen zato sto ovog puta postoje dva submit tastera, i pritiskom bilo kojeg od njih zeli se
umesto prikaza forme pokrenuti obradu iste.
Sustina je u tome (a to je i cela poenta ovog primera) da ce se nakon submit - ovanja forme
pomocu jednog od tih tastera popuniti vrednost unutar superglobalne $_POST varijable
samo onog tastera koji je pritisnut, sto dokazuje deo koda koji obrauje formu.
i< (isset(%&(2SJS"taster1"T))
echo "(ritisnuli ste taster 1"'
i< (isset(%&(2SJS"taster9"T))
echo "(ritisnuli ste taster 9"'
123 Elementi za unos podataka
Postoji ocigledna potreba za vise razlicitih nacina prikupljanja podataka od korisnika
Do sada je u primerima koriscen samo text box element, radi jednostavnosti primera.
Elementi HTML formi
9
:
Text box
Text area
Sakriveno polje / hidden field
Checkbox
Radio taster
Lista / meni select izbornik
Polje za upload datoteka
*e4t &o4 pol$e
<input t#pe="teKt" name="te-st">
Radi se o polju za unos jedne linije teksta. me pomocu kojeg mu se pristupa u PHP-u mu se
navodi u name atributu. Ukoliko se zeli da pri ucitavanju stranice u ovom elementu nalazi
neka vrednost mozet se navesti pomocu value atributa.
<input t#pe="teKt" name="te-st" value="2vo 3e de<aultna vrednost pol3a i
mo8e se
promeniti">
*e4t area
<teKtarea name="veli-iJe-st"><!teKtarea>
Ovo je polje za unos texta sa vise redova. Korisnik moze prebaciti unos teksta u novi red pa
ga kao takvog poslati na obradu. Pravila oko imenovanja su ista kao i za sve ostale
elemente. Za razliku od text boxa, text area nema value atribut, vec se defaultna vrednost
zadaje na sledeci nacin:
9
54
<teKtarea name="veli-iJe-st">2vo 3e de<ault vrednost elementa i mo8e imati
vi5e redova <!teKtarea>.
Kod davanja defaultne vrednosti je bitno paziti da ce se 2 space znaka u samom elementu
prikazati kao dva prazna prostora, pa da prelazak u novi red u HTML-u uzrokuje
prebacivanje unosa podataka u elementu u novi red.
Primer & : Koriscenje text area elementa
<html>
<head>
<title>(rimer : : Moriscen3e teKt area elementa<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer : : Moriscen3e teKt area elementa<!h9>
<hr>
<$
i< ( *isset(%&(2SJS"su"mitu3"T))?
$>
<<orm name="primer/" method="post" action="<$=%&SQPOQPS+(H(&SQVC+T$>">
,nesi te-st od vise redova :<"r>
<teKtarea name="te-st"><!teKtarea>
<"r>
<input name="su"mitu3" t#pe="su"mit" value="(osal3i">
<!<orm>
<$
@ else ?
echo "<">,neli ste : <!"><"r>" . %&(2SJS"te-st"T'
echo "<hr>"'
!! ispis sa o"racan3em pa.n3e na prela.a- u nov red.
echo "<">Je-st u i.vornom o"li-u : <!"><"r>"'
echo nl9"r(%&(2SJS"te-st"T)'
@
$>
<!"od#>
<!html>
Unesena vrednost u textarea elementu se nalazi unutar superglobalne varijable $_POST ili
$_GET, zavisno od metode prosleivanja podataka forme. Posto je u ovom primeru metoda
POST vrednost se nalazi unutar $_POST varijable.:
echo "<">,neli ste : <!"><"r>" . %&(2SJS"te-st"T'
Radi se o tome da HTML u svom source - u zanemaruje sve praznine, tj. vise uzastopnih
praznina interpretira poput jednog praznog prostora. Pod isto pravilo spada i prelazak u novi
red u HTML sourcu. Ugraena funkcija PHP - a je koriscena u drugom ispisu u primeru, a
ispis unesene vrednosti prati isti format teksta koji je upisan u text area polje.
Koriscena funkcija je :
echo nl9"r(%&(2SJS"te-st"T)'
(nl2br citaj new line to break)
me funkcije govori sto ona radi. U stringu koji joj se da kao argument menja sve nove
redove ( \n ) sa HTML <br> tagom koji prebacuje ispis u novi red pri gledanju dokumenta u
browseru.
55
Hidden pol$e
<input t#pe="hidden" name="nevidl3ivo(ol3e" value="Orednost pol3a">
Kao sto i samo ime elementa / polja kaze, radi se o polju koje nije vidljivo pri gledanju
dokumenta u browseru, pa korisnik ne moze direktno uticati na vrednost koja je sacuvana u
njemu. Vrednost koje se nalazi u u takvom polju se mora namestiti direktno u source - u
dokumenta ili unosom u HTML source rucno ili pomocu PHP-a. Drugi nacin promene
vrednosti je dinamicki, za vreme gledanja stranice u browseru putem JavaScripta. Kao i kod
text boxa, vrednost se unosi u value atribut. Ovo polje obicno sluzi za pamcenje nekih
vrednosti koje ne zavise od korisnika (posetioca), pa se na ovaj nacin stite od korisnickog
unosa i izmene.
5-eck&o4
<input t#pe="chec-"oK" name="3e.i-" value="srps-i">
Checkbox je element koji se uglavnom koristi u slucaju kada se korisniku zeli omoguciti da
izabere jednu, vise ili ni jednu vrednost iz nekog logicki povezanog skupa vrednosti. Recimo,
u gornjem primeru bi znacilo da korisnik prica srpski ukoliko je oznacio to polje, ili ga ne
prica ukoliko ga je ostavio neoznacenim. Normalno, posto se radi o grupi povezanih
informacija trebalo bi biti ponueno vise jezika pomocu vise checkboxova. ako gornja
tvrdnja ne mora biti uvek tacna, recimo moze se raditi o samo jednoj vrednosti, poput
oznacavanja saglasnosti sa necim ili slicnim da / ne situacijama.
Ovaj primer se moze koristiti u situaciji u kojoj je potrebna potvrda posetioca da je punoletan
i da je saglasan sa pravilima sajta
Primer ' a) : Prihvatanje checkbox elementa
<html>
<head>
<title>(rimer E a) : (rihvatan3e chec-"oK elementa<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer E a): (rihvatan3e chec-"oK elementa<!h9>
<hr>
<$
i< (* %&(2SJS"ime"T )?
$>
<<orm name="<orm1" method="post" action="">
<p>
<input t#pe="chec-"oK" name="punoletan" value="1">
(unoletan sam i saglasan sam sa pravilima sitea<!p>
<p>
<input name="ime" t#pe="su"mit" value=",la.">
<!p>
<!<orm>
<$
@ else ?
!! provera da li 3e o.na7en chec-"oK
i< (%&(2SJS"punoletan"T) ?
echo "(osto si punoletan mo.es dal3e -oristiti ove stranice"'
56
@ else ?
echo "(osto nisi punoletan ne mo.es pristupiti sadr.a3u ovih stranica"'
die()'
@
@
$>
<!"od#>
<!html>
Nacin prihvata informacije iz checkboxa je identican onom iz prethodnih primera.
Primer ' $) : Prihvatanje vrednosti vise povezanih checkbox elemenata
<html>
<head>
<title>(rimer E ") : (rihvatan3e vrednosti vise pove.anih chec-"oK
elemenata<!title>
<meta http[e^uiv="`ontent[J#pe" content="teKt!html' charset=iso[]]FX[9">
<!head>
<"od#>
<h9>(rimer E ") : (rihvatan3e vrednosti vise pove.anih chec-"oK
elemenata<!h9>
<hr>
<$
i< ((*isset(%&(2SJS"ime"T)) LL *%&(2SJS"ime"T)?
$>
<<orm name="<orm1" method="post" action="">
<p>Mo3e od ponudenih 3e.i-a pricate tecno$<!p>
<p>
<input t#pe="chec-"oK" name="3e.i-ST" value="engles-i">
Qngles-i<"r>
<input t#pe="chec-"oK" name="3e.i-ST" value="nemac-i">
>emac-i<"r>
<input t#pe="chec-"oK" name="3e.i-ST" value="<rancus-i">
Crancus-i<"r>
<input t#pe="chec-"oK" name="3e.i-ST" value="rus-i">
Pus-i <!p>
<p>
<input name="ime" t#pe="su"mit" id="ime" value="(osal3i">
<!p>
<!<orm>
<$
@ else ?
i< ((isset(%&(2SJS"3e.i-"T)) and (is&arra#(%&(2SJS"3e.i-"T) and count
(%&(2SJS"3e.i-"T) > 0 ))
?
echo "Je.ici -o3e pricate su :"'
<oreach (%&(2SJS"3e.i-"T as %pricam)?
echo %pricam . "6"'
@
@ else ?
echo "Jeste sigurni da ne pricate ni
3edan od navedenih 3e.i-a$"'
@
@
$>
<!"od#>
<!html>
57
Upload ,a$la
PHP upravlja upload-om fajlova preko superglobalne varijable $_FLES, koja sadrzi niz
varijabli, poslatih preko POST metode.
/!0#L1S23user$ile3423name34 - originalno ime fajla na klijentskoj masini
/!0#L1S23user$ile3423type34 - mime type fajla (npr."image/gif").
/!0#L1S23user$ile3423si*e34 - velicina fajla u bajtovima
/!0#L1S23user$ile3423tmp!name34 privremeni folder u kojem je smesten upload-ovani fajl
$_FILES['userfile']['error'] error code vezan za eventualnu gresku pri uploa-u
Da bi se omogucio upload fajla neophodno je podesiti atribut ENCTYPE attribute
na "multipart/form-data" i action atribut ka PHP stranici koja ce upravljati upload-om
<<orm enct#pe="multipart!<orm[data" action="upload.php" method="(2SJ">
2da"erite <a3l .a upload
<input name="uploaded" t#pe="<ile" !><"r !>
<input t#pe="su"mit" value=",pload" !>
<!<orm>
Fajl se cuva u temporary direktorijumu. Fajl ce biti uklonjen, odmah nakon zahteva, ako se
ne sacuva, t.j ne kopira na alternativnu lokaciju. Fajlu se pristupa preko imena isto kao i bilo
kom drugom input elementu. Funkcija koja se koristi za cuvanje je copy (). U novijim
verzijama PHP, koristi se funkcija move_uploaded_file (string $filename, string $destination)
<$php
%target = "upload!"'
%target = %target . "asename( %&CGVQSS+uploaded+TS+name+T) !!"asename da3e
ime <a3la -o3i 3e uploadovan '
i<(move&uploaded&<ile(%&CGVQSS+uploaded+TS+tmp&name+T6 %target))
?
echo "Ca3l 3e uspe5no uploadovan"'
@
else ?
echo ",pload ni3e uspeo"'
@
$>
58
3 !inami6ki linkovi
GET metoda u PHP-u se osim za obrade podatke u formi moze koristiti i za generisanje
dinamickih linkova koji sadrze razlicite parametre. Ovaj pristup koriscenja GET metode se u
praksi cesce srece nego upotreba GET metode kod obrade forme. POST metodu nije
moguce koristiti za generisanje linkova, posto se njeni parametri ne prenose putem URL
adrese. nternet pretrazivaci, kao sto su Mozilla Firefox, Google Chrome i drugi, za slanje
zahteva podrazumevano koriste GET metodu.
Generisanje dinamickih linkova je karakteristicno za dinamicke veb sajtove, tj. veb aplikacije.
Oni se koriste kada je potrebno napraviti linkove ka vestima koje se skladiste u bazi, kao i u
slucaju definisanja vise razlicitih HTML strana u jednom PHP dokumentu, sto omogucava
minimalne izmene u kodu u slucaju promene izgleda sajta.
Pri%er < : Dinamicki linkovi u PHP-u
<html>
<head>
<!head>
<"od#>
<h1>o3 sa3t<!h1>
<ul>
<li><a hre<="get[dinamic-i[lin-.php$strana=pocetna">(o7etna<!a><!li>
<li><a hre<="get[dinamic-i[lin-.php$strana=o[nama">2 nama<!a><!li>
<li><a hre<="get[dinamic-i[lin-.php$strana=-onta-t">Monta-t<!a><!li>
<!ul>
<$php
i< (isset(%&WQJS"strana"T))?
%strana = %&WQJS"strana"T'
@ else ?
%strana = "pocetna"'
@
switch(%strana)?
case "pocetna":
echo "Do"rodo5li na na5 sa3t*"'
"rea-'
case "o[nama":
echo "Va"oratori3a .a ele-trons-o poslovan3e -ao osnovni
cil3 poslovan3a ima unaprecen3e poslovnog6 nau7no[istra8iva7-og i
o"ra.ovnog rada u o"lasti primene in<ormaciono -omuni-acionih tehnologi3a u
poslovan3u6 -ao i pro3e-tovan3a in<ormacionih sistema u Gnternet o-ru8en3u.
Pad la"oratori3e .asniva se na primeni savremenih tehnologi3a i na
permanantnim inovaci3ama."'
"rea-'
case "-onta-t":
echo "QVDI se nala.i na Ca-ultetu organi.acionih nau-a u
Ieogradu. Ddresa 3e Jove Gli;a 1FH6 -a"inet /0H."'
"rea-'
de<ault:
echo "Wre5-a H0H: Stranica ni3e pronacena*"'
"rea-'
@
$>
<!"od#>
<!html>
59