PHP uvo od u dina amičko pr rogramir ranje

Mod
deli i Baze Podatakaa
PHPuvo
odudina
amičkoprrogramirranje
Materrijal prikupio i obradio: Mirosslav Mihaljišin
n
Prije korišćennja ovog priruučnika potrebn
no se upoznatii sa osnovamaa HTML-a i SQL-a (mySQL
L-a).
Arhitektura troslojne veb aplikacije
Izvori:
Pri pravljenjuu priručnika korišten
k
je My
ySQL 5.6 Refeerence Manuaal i internet a najviše
n
materijjala je preuzetto sa sajtova:
http://downlooad.tutoriali.oorg/Tutorials/P
PHP/PHP_MyySQL_forme.p
pdf
http://www.bbubaj.com/inddex.php?php
http://php.coom.hr
http://imi.pmf
mf.kg.ac.rs/com
mponent/docm
man/doc_view//480-wp-vezbee-4.html
http://web.zppr.fer.hr/ergonnomija/2004/a
aleta/php4.htm
m
http://free-bjj.t-com.hr/arm
m/obrasci.htmll
http://lekcije..smiko.info/httml/forms/text..html
1
Sadržaj
PHP uvod u dinamičko programiranje.....................................................................................................................................................1
Klijent server arhitektura i tehnologija izvršavanje PHP skripti .........................................................................................................4
Sintaksa PHP-a ...................................................................................................................................................................................5
PHP stilovi .....................................................................................................................................................................................5
Praznine .........................................................................................................................................................................................5
Komentari ......................................................................................................................................................................................5
Lista rezervisanih (ključnih) riječi kod PHP-a ....................................................................................................................................6
Izrаzi i iskazi.......................................................................................................................................................................................6
Varijable - promjenjive .......................................................................................................................................................................7
Vidljivost promjenljive: doseg varijabli.........................................................................................................................................8
Rad sa bazama podataka .....................................................................................................................................................................9
Funkcije za rad sa bazama podataka: mysql_connect/mysql_select_db/mysql_query ........................................................................9
1.
mysql_connect .....................................................................................................................................................................9
2.
mysql_select_db ...................................................................................................................................................................9
3.
mysql_query .........................................................................................................................................................................9
4.
Ispis podataka .....................................................................................................................................................................10
Praktične vježbe SET1: V1-V3........................................................................................................................................................11
V1: Kreiranje baze podataka i tabele u bazi .................................................................................................................................11
V2: Ubacivanje podataka u tabelu baze podataka ........................................................................................................................12
V3: Selektovanje podataka iz tabele baze podataka .....................................................................................................................12
Tipovi podataka ................................................................................................................................................................................13
Cijeli brojevi ................................................................................................................................................................................13
Realni brojevi - Brojevi s pomičnim zarezom..............................................................................................................................13
Tekstualni podaci - Znakovni niz (String) ...................................................................................................................................13
Logičke varijable .........................................................................................................................................................................16
Prikaz boolean vrijednosti............................................................................................................................................................16
Konstante ..........................................................................................................................................................................................16
Nizovi - Polja (Arrays) .....................................................................................................................................................................17
Operatori u PHP-u ............................................................................................................................................................................19
Operator dodjele ..........................................................................................................................................................................19
Aritmetički operatori....................................................................................................................................................................19
String (znakovni) operatori ..........................................................................................................................................................20
Kombinovani operator dodjele.....................................................................................................................................................20
Prefiksni i sufiksni operatori ........................................................................................................................................................20
Referentni operator dodjele..........................................................................................................................................................21
Operatori poređenja .....................................................................................................................................................................21
Logički operatori .........................................................................................................................................................................22
Operator @- operator kontrole /zanemarivanja/ greške- ..............................................................................................................22
Ostali operatori ............................................................................................................................................................................22
Prioritet operatora ........................................................................................................................................................................23
Još o imenovanju varijabli ................................................................................................................................................................24
Prebacivanje (konverzija) tipova varijabli ........................................................................................................................................24
Ispitivаnjе tipа prоmjеnlјivih .......................................................................................................................................................25
Promjenljiva promjenljive: Varijablina varijabla .........................................................................................................................25
Praktične vježbe: PHP varijable u HTML modu .............................................................................................................................26
Ubacivanje PHP varijabli u HTML .............................................................................................................................................27
Manipulisanje HTML markupa u stringu (zamjena specijalnih znakova)....................................................................................28
Kontrolne strukture ...........................................................................................................................................................................30
If.. else .........................................................................................................................................................................................30
Switch ..........................................................................................................................................................................................31
Petlje .................................................................................................................................................................................................33
While petlja..................................................................................................................................................................................33
Do … while .................................................................................................................................................................................34
For petlja ......................................................................................................................................................................................34
BREAK CONTINUE i EXIT ......................................................................................................................................................35
Foreach petlja...............................................................................................................................................................................35
Vježba: Korišćenje kontrolnih struktura/ ..........................................................................................................................................36
Generisanje HTML koda pomoću petlji ...........................................................................................................................................36
Funkcije ............................................................................................................................................................................................37
Doseg varijabli funkcije ...............................................................................................................................................................37
Include i require: korišćenje eksternih funkcija ...........................................................................................................................37
Definicija sopstvene funkcije .......................................................................................................................................................38
Rezultat funkcije ..........................................................................................................................................................................38
Primjeri kreiranja i korišćenja funkcija ........................................................................................................................................38
Funkcije za obradu promjenljivih ................................................................................................................................................40
gettype () ......................................................................................................................................................................................40
settype () ......................................................................................................................................................................................40
Ispitivanje i promjena stanja promjenljive ...................................................................................................................................40
Izvršenjem skripta bi se dobilo: ........................................................................................................................................................41
2
Rad sa stringovima ...........................................................................................................................................................................42
Tehnika 1: Izbacivanje nepotrebnog 'bijelog prostora' iz stringa .................................................................................................42
Izbacivanje nepotrebnog praznog prostora iz stringa ...................................................................................................................42
Tehnika 2: Traženje znaka ili stringa unutar stringa ....................................................................................................................43
Pretraživanje stringa ....................................................................................................................................................................43
Provjera postojanja stringa ili znaka unutar stringa .....................................................................................................................43
Pozicija znaka ..............................................................................................................................................................................44
Izvlačenje tačno određenog dijela stringa ....................................................................................................................................44
Neke funkcije za rad sa nizovima ................................................................................................................................................46
Dužina niza ..................................................................................................................................................................................47
Rezanje i lijepljenje stringa ..........................................................................................................................................................47
Vježbe: PHP date exercises ..............................................................................................................................................................49
Rad sa nizovima................................................................................................................................................................................51
Šetanje kroz jednodimenzionalni niz ...........................................................................................................................................51
Šetanje kroz niz korištenjem pointera niza ..................................................................................................................................51
Šetanje kroz multidimenzionalni niz korišćenjem poziva funkcije ..............................................................................................52
Pretraživanje niza sa array_search ...............................................................................................................................................54
Pretraživanje niza sa više pojavljivanja tražene vrijednosti .........................................................................................................55
Sortiranje niza i funkcije: asort/arsort/ksort/ krsort ......................................................................................................................56
Forme -PHP obrasci..........................................................................................................................................................................57
Definisanje aributa akcije .................................................................................................................................................................58
Primjer1: Umetanje forme u HTML dokument ...........................................................................................................................58
Definisanje metode slanja i prihvata podataka (POST i GET)..........................................................................................................59
Varijable ......................................................................................................................................................................................60
method="GET“ ............................................................................................................................................................................60
method="POST" ..........................................................................................................................................................................61
Izbor metode ................................................................................................................................................................................61
Primjer POST metode ..................................................................................................................................................................62
Primjer GET metode ....................................................................................................................................................................63
Korišćenje nizova u obradi formi.................................................................................................................................................65
Provjera metode pristupa dokumentu / skripti .............................................................................................................................66
Prikaz i obrada unutar jednog dokumenta ....................................................................................................................................67
Forme sa više dugmadi ................................................................................................................................................................68
Pristup globalnim varijablama .....................................................................................................................................................69
Primjeri pristupa bazi korišćenjem formi..........................................................................................................................................70
Višenamjenske stranice ....................................................................................................................................................................71
Višenamjenska stranica izvedena korištenjem kontrolne riječi ....................................................................................................71
Višenamjenska stranica korištenjem kontrolne varijable .............................................................................................................75
Session management (mehanizam praćenja posjete) ........................................................................................................................77
Brojanje posjećenih stranica ........................................................................................................................................................77
Objekti ..............................................................................................................................................................................................80
Klasa (class) .................................................................................................................................................................................80
Primjer : Objekt sa konstruktorom ...............................................................................................................................................81
Primjer korišćenja klase i metoda kod kreiranja potrošačke košarice ..........................................................................................81
Dodatak .................................................................................................................................................................................................83
HTML tagovi značajni za PHP forme...............................................................................................................................................83
BUTTON Tag ..............................................................................................................................................................................83
FORM Tag, tag koji definiše obrazac ..........................................................................................................................................83
INPUT Tag .......................................................................................................................................................................................84
Kreiranje tekst polja sa: input type="text" ...................................................................................................................................84
Textbox/ Text area .......................................................................................................................................................................85
INPUT checkbox .........................................................................................................................................................................86
INPUT radio ................................................................................................................................................................................86
Napravite dugme sa INPUT type .................................................................................................................................................87
INPUT submit , reset ...................................................................................................................................................................87
Kreiranje padajućeg menija: Dropdown ......................................................................................................................................87
HTML forme, PHP i srpska slova.....................................................................................................................................................88
Lista PHP funkcija ............................................................................................................................................................................88
Uvod u objektno orijentisano programiranje ....................................................................................................................................95
Klase i kreiranje objekata.............................................................................................................................................................95
Metode i promjenjive ...................................................................................................................................................................96
Osnovni principi objektno orjentisanog programiranja ................................................................................................................97
3
Klijentse
erverarh
hitekturaiitehnologgijaizvrša
avanjePH
HPskriptii
Odranije:
PHP (Hyperteext preprocessor) je programskki jezik raširen i popularan prri izradi web strranica. Izuzetnoo je jednostavan
n za učenje, a s
naučenim se ppostiže mnogo. U trenutku kad korisnik posjjeti vaše PHP stranice,
s
vaš web
w server autoomatski obrađujje PHP kod naa
osnovu koga oodređuje šta će prikazati korissniku. Sve ostallo kao npr. mattematičke opera
acije, operacijee s datotekama,, varijable i dr..
ne prikazuje ko
korisniku, te korrisnik u Internett preglednik priima generisanu
u HTML stranicu bez PHP kodda.
Većina sintaksse je preuzeta izz C, Jave i Perla s nekoliko jeddinstvenih speciifičnosti.
Doslovno, PH
HP:Hypertext Preprocessor
P
jee server-side HT
HTML-embedded
d skriptni jezik. Šta to uopšte zn
znači?
Znači da se ssvi PHP prograami izvode na serveru,
s
a klijenntu se potom ša
alje samo rezulttat izvođenja, oddnosno odgova
arajući HTML
kod. Na stranni klijenta se viidi samo HTML
L kod, dok je sam
m program sakr
kriven od klijentta.
PHP kod moože biti ugrađenn u HTML ili u odvojenoj
o
datotteci.
Osnovni smisaao PFP jezika je
j brzo i jednosstavno pisanje ddinamički generrirsanih stranicca: dinamičko w
web programira
anje.
Da biste koristili vašu PHP skriptu
s
ili straniicu s PHP kodoom, vaš web serrver mora podržžavati PHP.
Osim nekih beesplatnih, većina komercijalnih
h servera podržžava PHP.
PHP je skriiptni program
mski jezik po
omoću kojegg možete kreirati HTML stranicu na serveru prijee nego što jee
ona poslanaa klijentu poopunjenu din
namičkim saddržajem. Serrver zna da izvrši PHP kkod kada zaahtjevani fajll
ima .php ekkstenziju. Na blok šemi ispod predsstavljeno je kako PHP program
p
izvrršava dinam
mičke HTML
L
skripe.
okumentom sserver izvršaava PHP kod
d i na osnovu
vu njega geneeriše HTML
L
Nakon prijeema zahtjevaa sa PHP do
kod i šalje gga klijentu. To
T znači da stranica kojaa se prikazujje u pretraživ
vaču klijentaa ne postoji u tom oblikuu
nigdje na seerveru odaklee ju je klijentt primio. Ovoo može stvoriti poteškoće
p
pri po
ozicioniranju-ra
rangiranju vaših
h stranica.
Drugim rijeečima, PHP je
j skript jeziik pomoću kkojeg možetee kreirati HTM
ML stranicuu na serveru pre nego štoo
se ona, poppunjena dinaamičkim sadrržajem, pošaalje klijentu. Ovim način
nom generis anja sadržaja klijent nee
može videtii kod (skript) koji je gen
nerisao sadrržaj koji gleeda, već ima pristup čisttom HTML kodu.
Naglašavam
mo: PHP je server-side skriptni
s
proggramski jezik
k za dinamiččko generirannje HTML koda.
k
Serverr
side skripte se izvršavaju na serveru (poslužiteljuu) kada serveer primi zahttjev za PHP ddokumentom
m.
Program kooji se napiše u PHP-u ne zahtjeva pprevođenje (kompajliran
(
nje), nego see interpretiraa pri svakom
m
izvršavanju.
PHP interprretator može raditi po
1. PHP
P CGI princiipu, odnosno
o tako što će interpretatorr postojati kaao eksterna aaplikacija, ko
oja se pozivaa
da iizvrši datu skkriptu svaki put
p kad budee zahtjevana od nekog ko
orisnika,
2. a m
može biti instaaliran i kao modul
m
veb-seervisa.
Druga variijanta je dan
nas u najvećoj upotreb
bi jer pruža znatno veću
u brzinu izvvršavanja – interpretatorr
je na taj naččin uvijek učitan u memo
oriju te se ne mora pozivaati spoljašnji program.
Uobičajen sscenario po kom se izvršavaju PHP
P skripte je sljedeći:
s
• klijent (korisnikk Interneta ko
oji koristi neeki internet prregledač) zah
htjeva PHP sstranicu sa seervera
• servver prosljeđuuje zahtjev seervisu za vebb (program veb-server
v
naa serveru)
• vebb-server prep
poznaje da se
s traži PHP
P datoteka nee šalje njegov sadržaj kliijentu, nego ga izvršavaa
kaoo program pomoću
p
PHP modula izzlazni tekst programa (standardnii izlaz) se ša
alje klijentu
u
kaoo rezultat zaahtjeva klijeent prepozn
naje vrstu reezultata (HT
TML kod, slilika, PDF sad
držaj, arhivaa
itd.)) rezultat se prikazuje
p
kliijentu na odggovarajući naačin.
Za razliku ood većine prrogramskih jezika
j
koji pposeduju poččetnu funkcijju (main u C
C-u, prvi blo
ok BEGIN u
Paskalu, klaasa sa main metodom u Javi itd.), P
PHP datotek
ka, nalik na većinu
v
skripptnih jezika, jednostavnoo
sadrži skup naredbi, kooje se izvršav
vaju jedna zza drugom, od
o prve do posljednje,
p
gddje se posljeednja ujednoo
smatra i kraajem PHP proograma.
4
SintaksaPHP‐a
Krenućemo od opštepoznatih stvari:
Sav PHP kod nalazi između <? i ?> kvačica. Mali dodatak ovom pravilu bi bio korištenje <?php … ?>
kvačica radi razlikovanja između PHP i XML koda (naime i XML koristi iste ove kvačice).
Druga stvar (koja je opštepoznata) je da varijable prije svog imena imaju znak $.
Nadalje:
PHP pruža mogućnost za dobro i pravo objektno programiranje. I PHP ima jako mnogo ugrađenih gotovih
funkcija koje mogu mnogo toga da završe umjesto pisanja dugačkih potprograma, i samim tim da uštede i
vrijeme i napor. U tom smislu jako je preporučljivo da se nauče dobro što više ugrađenih funkcija, kao i
njihove mogućnosti.
Unutar PHP znakova za početak i kraj mogu se ubacivati i HTML kodovi ali isključivo pomoću PHP
naredbe prikaza PRINT ili ECHO unutar dvostrukih ili jednostrukih navodnika.
Svaki PHP kod sastavljen je od iskaza, praznina i komentara.
PHPstilovi
Postoje (najmanje) četiri stila za ispisivanje PHP oznaka:
• XML stil uz pomoć već pomenutih oznaka <?php i ?> i takav stil se preporučuje, a obavezan je kada je
PHP kod usađen u HTML kod. U specijalnom slučaju dozvoljava se da posljednja oznaka ?> u zadnjoj
PHP skripti ne bude navedena.
• skraćeni stil između oznaka <? i ?>. Može da se koristi u koliko se u konfiguraciskoj datoteci php.ini
aktivirana opcija short_open_tag, ali se njegova upotreba ne preporučuje zato jer u nekim okruženjima nije
podržan. Međutim, od verzije 5.4, skraćeni stil u obliku <?= ... ?> je omogućen bez obzira na podešavanja
unutar konfiguracijske datoteke, a služi kao zamjena za <?php ... ?>.
• skript stil između oznaka <script language="php"> i </script>, je duža verzija XML stila i obično se
preporučuje kada se istovremeno koriste i drugi skriptni jezici, posebno ako HTML editor pravi probleme.
• ASP stil između oznaka <% i %> predstavlja još jednu skraćenu verziju. Najčešće se koristi u ASP i
ASP.NET okruženju, ali je neophodno prethodno aktivirati opciju short_open_tag u konfiguracionoj
datoteci php.ini.
Praznine
To su znakovi kao što su novi red, tabulatori i razmaci. Oni se prilikom izvršenja koda zanemaruju, a
služe da bi nama (programeru) program bio čitljiv.
Komentari
Komentari služe za objašnjenje PHP koda prilikom našeg čitanja (čitanja programera, a ne korisnika), a pri
izvršenju programa se zanemaruju.
PHP podržava više tipova komentara.
Postoji višeredni komentar (tzv. se multiline komentar) koji počinje sa oznakom /* a završava se sa */ na
Primjer:
/* Autor Milenko Pantić
Skripta za rad kino sekcije
Napravljena 10.12.2014
*/
Komentar pisan samo u jednom redu (inline komentar) može početi sa dvije kose crte ili pak sa rjeđe sa
tarabom. Oni preskaču sav tekst koji se nalazi iza njih sve do početka novog reda.
Primjeri:
// Dio koda za provjeru vjerodostojnosti unijetog podatka za username
# Dio koda za provjeru vjerodostojnosti unoketog podatka za username
Sve iza dvije kose crte ili tarabe prilikom izvršenja programa se zanemaruje, sve dok se ne dođe do kraja
reda, ili do znake za kraj PHP koda.
Sve ostalo (sve što nisu komentari i praznine) u PHP kodu nazivamo izrazima i po njima se program
izvršava.
5
Listarezervisanih(ključnih)riječikodPHP‐a
Svaki programski jezik koristi vlastiti, ograničeni skup riječi koje imaju posebna značenja.
Kombininovanjem tih riječi po unaprijed zadanim pravilima pišemo nove programe Takve ćemo riječi
nazivati ključnim riječima (Keywords). (Ključne riječi se ne mogu se koristiti kao identifikatori.
Identifikatori se koriste se za imena promenljivih, tipova, funkcija, itd.)
I PHP posjeduje set ključnih riječi i ovde dajemo pregled (kroz primjere ćemo se upoznati sa njihovim značenjem):
PHP Keywords
__halt_compiler() abstract
and
array()
as
break
callable (as of PHP 5.4)
case
catch
class
clone
const
continue
declare
default
die()
do
echo
else
elseif
empty()
enddeclare
endfor
endforeach
endif
endswitch
endwhile
eval()
exit()
extends
final
finally (as of PHP 5.5)
for
foreach
function
global
goto (as of PHP 5.3)
if
implements
include
include_once
instanceof
insteadof (as of PHP 5.4) interface
list()
namespace (as of PHP 5.3) new
or
print
private
protected
public
require
require_once
return
static
switch
throw
trait (as of PHP 5.4)
try
unset()
use
var
while
xor
yield (as of PHP 5.5)
isset()
Izrаziiiskazi
Izrаzi (еxpressions) su јеdаn оd оsnоvnih pојmоvа svаkоg višеg prоgrаmskоg јеzikа, pа i PHP-a.
Izrаz rаčunа i dаје rеzultаt ili uzrоkuје nеku аktivnоst (koja se ponekad naziva bоčni еfеkаt). Izrazi su
kоmbinаciје оpеrаtоrа i оpеrаndа. Јеdnоstаvniје rеčеnо, izrаz је svе оnо štо imа nеku vrijеdnоst.
Vrеdnоst nеkоg izrаzа оdrеđuје sе nа оsnоvu sintаksе izrаzа, оdnоsnо prаvilа prvеnstvа svаkоg оd оpеrаtоrа
u izrаzu i аsоciјаtivnоst
Nаrеdbе (statements) ili iskаzi1 оdrеđuјu nеku аkciјu. Svаkа PHP skriptа је sаstаvlјеnа оd nizа nаrеdbi. Pо
prаvilu nаrеdbе sе izvršаvајu оnim rеdоm kојim su nаvеdеni u prоgrаmu, аli оvај rеdоsljеd mоžе dа sе
prоmjеni nеkоm оd nаrеdbi zа prеnоs tоkа prоgrаmа, pri čеmu prеnоs mоžе ići nа bilо kојi drugi diо
prоgrаmа ili vаn njеgа.
Оsnоvni оblik nаrеdbе је izrаz izа kоgа slijеdi znаk tаčkа sа zаrezom, kао zаvršni znаk nаrеdbе.
Slоžеnа nаrеdbа ili blоk nаrеdbа је mеhаnizаm kојi grupišе skup nаrеdbi u јеdnu sеmаntičku cеlinu. Blоkоvi
mоgu dа budu uklоplјеni i svаki mоžе dа sаdrži svоје sоpstvеnе dеklаrаciје, iniciјаlizаciје i izvršnе nаrеdbе.
Оpеrаtоri su simbоli kојi оmоgućаvајu izvršаvаnjе оpеrаciја nаd vrijеdnоstimа i prоmjеnlјivаmа. Моgu
imаti јеdаn, dvа ili višе аrgumеnаtа. Parametri, odnosno argumenti se još nazivaju i ulazni podaci, a
sam rezultat funkcije njenim izlaznim podatkom.
Uprаvlјаčkе strukturе: Nаrеdbе kојimа sе оdrеđuје tоk izvršаvаnjа pоd оdrеđеnim uslоvimа, mоgu dа sе
grupišu u јеdnu zаsеbnu strukturu. Оvаkvа strukturа sе pоstаvlја izmеđu vitičаstih zаgrаdа: { i }.
Uprаvlјаčkе strukturе, sаmе zа sеbе, prеdstаvlјајu јеdnu nаrеdbu u оbliku blоkа. Kоristе sе rаzličiti
оblici uprаvlјаčkih (kоntrоlnih) strukturа (control structure), kоје sе mеđusоbnо rаzlikuјu pо nаčinu
ispitivаnjа uslоvа.
1
iskaz (naredba) i izraz su formalno očigledno različiti pojmovi, koji se često POGREŠNO uzimaju kao jedno te isto,
ali u praksi to nema presudnu važnost
6
Varijable‐promjenjive
Promjenljive (varijable) su veličine koje tokom izvršavanja PHP programa mogu mijenjati svoju vrijednost.
U PHP-u oznake za promjenljive moraju početi sa znakom dolar $. Ovo je čisto način govorenja PHP
prevodiocu da se radi o varijabli a ne o tekstu. Ukoliko ga izostavite aplikacija će javiti grešku ( u najboljem
slučaju), a preći će preko nje (u najgorem slučaju) i umjesto sadržaja varijable će ispisati samo njeno ime.
Iza znaka dolar naziv mora početi slovom, a poslije toga možemo pisati brojeve, slova ili neke druge
znakove ali ne i razmak. Zapamtite da PHP razlikuje velika i mala slova u nazivu promjenljive, imena
varijabli su case-sensitive. Siguran sa da ste svi upoznati sa značenjem ovog pojma ali da vam ilustrujem ovo
pravilo možda bi bio dobar jedan mali primjer:
$mojeime ? $MojeIme
Isto tako, u imenima varijabli ne smijete koristiti razmake niti bilo kakve znakove osim [ i ] koji se koriste u
nizovima i kod nekih metoda rada sa stringovima, ali o tome malo kasnije, te znaka '_'. Svi ostali znakovi su
zabranjeni u imenima varijabli. Isto tako, ime varijable ne smije početi sa brojem, ali ga može sadržavati na
bilo kojoj drugoj poziciji u imenu.
Osnovne osobine varijabli: šta se mora znati o promjenjivim:
Kreiranje promjenljive
Promjenljiva se deklariše prvi put kada joj se dodjeljuje vrijednost.
Pomoću deklaracije promenljive rezerviše se prostor u memoriji i specificira tip podatka kojiće biti smešten u toj
memorijskoj lokaciji:
$a = 1.1 // deklaracija i inicijalizacija realnog broja
$a = true // deklaracija i inicijalizacija boolean promenljve
$a = ‘fat stuff’ // deklaracija i inicijalizacija string promenljive
Default (predefinisane) vrijednosti
Promenljive imaju default vrednosti
$a = $a + 1; // $a=0 po default
$s = $s."Marko"; // default$s=""
PHP pruža velik broj predefinisanih varijabli koje može koristiti svaka pokrenuta skripta. Mogućnost
korištenja velikog broja od tih varijabli zavisi o tome koji je server pokrenut, koja verzija, te o podešavanju
servera i drugim faktorima. Za listu svih predefinisanih varijabli koristite funkciju phpinfo().
Environment varijable su unesene u PHP-ov globalni namespace iz okruženja u kojem je pokrenut PHP
parser2. Pošto okruženja ima puno, broj različitih environment varijabli je ogroman, tako da je teško naći
definitivnu listu svih environment varijabli. Za popis Vaših environment varijabli najbolje je da pogledate
dokumentaciju Vaše ljuske u kojoj je pokrenut PHP parser.
Preporuka je da se ne koriste default vrijednosti, već da se eksplicitno navode inicijalne vrijednosti
promenljivih. Npr,:
$a = 0;
$s = "";
$b = false;
U PHP ne moramo prvo deklarisati promjenljive kao kod nekih drugih programskih jezika, već jednostavno
samo dodijelimo vrijednost. Promjenljivama dodjeljujemo vrijednost upotrebom operatora za dodjelu
vrijednosti a to je znak “ = ”.3
Za imenovanje promjenljivih postoji nekoliko pravila:
– Ime promjenljive mora početi znakom dolara ($)
2
Većina programera voli ovakvu terminologiju. Ipak da bar na početku malo razjasnimo: Enviroment varijable su
promjenjive iz PHP okruženja. Unutar globalnog prostora OS vrši raspodjelu reursa tako da pojedini programi (pa i
varijable koje se koriste u programima) dobijaju dio memorjskog prostora. Pošto je ovo uvod u PHP programiranje,
dovoljno je shvatiti kako se varijable pamte: vidi Vidljivost promjenjvih doseg varijabli.
Šta je PHP parser? PHP prevodioc (parser) prepoznaje PHP kod unutar dokumenta putem tagova <?php ?> Kako se to
obavlja objašnjeno je ranije; vidi Klijent server arhitektura i tehnologija izvršavanje PHP skripti
3
detaljnije vidi Operatori u PHP-u, zasad ne mješajte dodjeljivanje sa matematičkom jednakošću
7
– Ime promjenljive treba da bude definisano u skladu sa značenjem vrijednosti koja se pamti u okviru
promjenljive
– U okviru imena mogu se pojavljivati mala ili velika slova, cifre ili karakter
– Nije dozvoljeno da prvi karakter poslije znaka dolara ($) bude cifra
– Inicijalna vrijednost promjenljive se dodjeljuje pomoću znaka (=) jednako
U PHP-u se ne morate brinuti o brisanju varijabli radi štednje memorijskog prostora jer se sve varijable
automatski brišu iz memorije kada se trenutna skripta koja ih je stvorila završi.
Ukoliko stvarno želite obrisati neku varijablu iz bilo kojeg razloga to možete učiniti pomoću
unset($varijabla); naredbe.
Validna imena varijabli
$str_ime | $varijabla2 | $niz[1] | $string[0]
NE validna imena varijabli
$2varijabla | $var*ijabla | $_var | $var(1)
Promjenljivoj možete dodijeliti i vrijednost druge promjenljive na primjer:
$visina=8;
$visina2=$visina;
Sada i promjenljiva $visina2 ima vrednos 8.
Vidljivostpromjenljive:dosegvarijabli
Doseg varijable u PHP je kontekst u kojem je varijabla definisana.
Sve promjenljive nisu vidljive svuda u skripti. U PHP-u imamo sljedeće vidljivosti promjenljive:
1.
Superglobalne promjenljive vidljive su svuda.
2.
Globalne promjenljive vidljive su svuda u skripti ali ne i u funkciji koju smo izradili. Takođe nije
vidljiva i fajlovima koji se umeću u tu skriptu iskazima include i require.
3.
Promjenljive unutar funkcije vidljive su samo u tu funkciju
4.
Promjenljive unutar funkcije koje definišemo kao globalne vidljive su kao globalne.
Spisak superglobalnih promjenljivih je sljedeći:
•
$GLOBALS – niz svih globalnih promjenljivih
•
$_SERVER – niz svih serverskih promjenljivih
•
$_GET – niz promjenljivih koje se prosljeđuju skripti metodom GET
•
$_POST – niz promjenljivih koje se prosljeđuju skripti metodom POST
•
$_COOKIE – niz kolačića
•
$_FILES – niz promjenljivih koje sadrže razne tipove podataka, pa i fajlove koje se prenose
internetom
•
$_ENV – niz promjenljivih okruženja
•
$_REQUEST – niz promjenljivih korisnika
•
$_SESSION – niz promjenljivih sesije
Najčešće sve PHP varijable imaju jedan doseg koji uključuje i includane file-ove i cijelu .php skriptu.
Primjer:
$a = 1;
include "b.inc";
U gornjem primjeru, varijabla $a se može koristiti i unutar b.inc skripte.
8
Radsabazamapodataka
Pošto ste već savladali osnove HTML, SQL-a i mySQL-a, rad u PHP-u započećemo sa konkretnim
primjerima kako koristeći PHP pri izradi web aplikacija povezati aplikaciju s nekom bazom podataka.
Pokazaćemo kako najjednostavnije povezati aplikaciju s mySQL bazom podataka koristeći PHP.
Prije nego što nastavimo daćemo objašnjenje funkcije koja koja vrši prekid izvršenja skripte: die().
die() je funkcija koja prekida izvršavanje skripte. Ako joj u argument upišete tekst ili broj ispisaće ga.
Može da prima i neku funkciju kao argument.
Ovaj pristup nije konzistentan, jer bi trebali da se upoznamo sa definicijama varijabli, operatora i funkcija
kod PHP-a (jer ćemo ih koristiti u ovim primjerima). Međutim to bi zahtjevalo da ovo poglavlje obrađujemo
na kraju priručnika, a čini mi se će ako započnemo sa relativno kompleksnom temom (kao što je ova) jasno
sagledati cilj i efekte programiranja u PHP-u, pa će kasnije (teoretsko) objašnjenje i definicije varijabli,
operatora, funkcija... dobiti i jasanu praktičnu vrijednost i cilj.
Funkcijezaradsabazamapodataka:
mysql_connect/mysql_select_db/mysql_query
Prije neko što započnemo sa vježbama daćemo (objasniti i komentarisati) upotrebu tri osnovne funkcije i
koraka (3+1) koji ogućavaju pristup i rad sa MySQL serverima. Da bi ove funkcije bile dostupne, potrebno
je kompajlirati php sa mysql podrškom koristeći --with-mysql .
NAPOMENA: Za postavljanje upita trebate detaljnije poznavati mySQL.
1. mysql_connect
Otvara vezu prema mySQL serveru.
int mysql_connect ([string hostname [:port] [:/path/to/socket] [, string username [, string password]]])
Načešće su defaultni parametri koji se koriste su: host:port = 'localhost:3306', username = ime korisnika
koji je vlasnik serverskog procesa i password ="".
<?php
$link = mysql_connect ("localhost", "username", "secret")
or die ("Could not connect");
print ("Connected successfully");
mysql_close ($link);
?>
Bitno je da se svaki otvoreni connection zatvori sa funkcijom mysql_close. Ako to ne navedemo, veza će
se zatvoriti tek nakon izvršenog cijelog PHP programa.
2. mysql_select_db
Nakon što smo otvorili vezu s mySQL serverom, potrebno je odabrati bazu podataka s kojom ćemo raditi na
serveru.
int mysql_select_db (string database_name [, int link_identifier])
Vraća cijeli broj veći od nule, ako je sve ok, inače vraća nulu.
mysql_select_db() postavlja trenutno aktivnu bazu na trenutno otvorenom linku na server. Ako
nije naveden link u pozivu funkcije, koristi se posljednji otvoreni.
3. mysql_query
Sad kad smo se povezali na server i odabrali bazu s kojom ćemo raditi, potrebno je izvršiti upit nad bazom!
int mysql_query (string query [, int link_identifier])
Funkcija vraća nulu ako je došlo do greške, a ako je sve prošlo ok, onda vraća cijeli broj različit od nule.
Povratna vrijednost (onu koju vraća server) nema veze s brojem redova koji su vraćeni, tako da vas to ne
zbunjuje...
<?php
$result = mysql_query ("SELECT my_col FROM my_tbl")
or die ("Invalid query");
?>
9
U varijabli $result se nalaze svi rezultati našeg upita... Najčešće se $result varijabla obrađuje foreach petljom
(vidi kasnije) kako bi obavili potrebne radnje nad svim rezultatima. Nakon završenog rada s $result-om,
potrebno je osloboditi resurse naredbom mysql_free_result($result);
4. Ispispodataka
Slijedi konkretan primjer koji koristi sve navedene funkcije i ispisuje podatke:
<?php
$veza = mysql_connect('localhost','adtresa','Sifra_blablabla');
if (!$veza) die("Greska: Ne mogu se spojiti na server !");
$ok = mysql_select_db('moja_baza');
if(!$ok)
die("<BR> Greska: Ne mogu otvoriti bazu ! <BR>");
if (mysql_errno())
die("<BR>".mysql_errno().": ".mysql_error()."<BR>");
$upit="SELECT * FROM tablica1 WHERE 1=1";
$rezultat_upita = mysql_query($upit);
if (mysql_errno())
die("<BR>".mysql_errno().": ".mysql_error()."<BR>");
while($redak=mysql_fetch_array($rezultat_upita)) {
echo $redak['PrviPodatak'],' '.$redak['DrugiPodatak'];
echo <BR>;
}
mysql_free_result($rezultat_upita);
mysql_close($veza);
?>
Dakle, prvo otvaramo vezu na server, potom biramo bazu na serveru, te izvršavamo upit i rezultati se nalaze
u $rezultat_upita. Potom idemo red po red kroz $rezultat_upita i ispisujemo red po red iz tablice1 u bazi
moja_baza.
Na kraju je potrebno osloboditi resurse koje smo zauzeli pri dohvatu iz baze.
Postoje mnoge funkcije za rad s mySQL-om, ovdje su prikazane samo osnovne...
Nastavićemo sa vježbama, gdje ćemo se podsjetiti još nekih. (Sjetite se da smo na uvodnoj strani
pretpostavili poznavanje SQL-a).
10
Praktičn
nevježbeSET1:V1‐V3
OBAVEZN
NO samostalnno provježbaati i analiziratti ovdje date primjere.
Sve se čini iisto kao što je
j objašnjeno
o, ali vježba čini majstoraa...
Ponavljam
mo: Neke od komandi i sttruktura ćem
mo kasnije detaljnije obraaditi.
V1:Kreira
anjebazepo
odatakaita
abeleubazzi
Za kreiranjee baze podataaka koristimo SQL komaandu CREAT
TE DATABA
ASE:
CREATE D
DATABASE ime_baze;
V1-A Sljedeeći primjer će
ć uz pomoć PHP-a kreiraati bazu podataka pod im
menom "mojaabaza".
<?php
$konekcija
a = mysql_c
connect("lo
ocalhost","
"root","");
;
if (!$kone
ekcija)
{
die('Gresk
ka: ' . mys
sql_error()
));
}
if (mysql_
_query("CRE
EATE DATABA
ASE mojabaz
za",$konekc
cija))
{
echo "Baza
a je kreira
ana";
}
else
{
echo "Gres
ska 22 pri kreiranju:
: " . mysql
l_error();
}
mysql_clos
se($konekci
ija);
?>
Analizirajtte upotrebu operatora !
Ako je jasno šta i kako se izvršava
i
nako
on if (!$ko
onekcija)d
dobar dio ovo
og priručnika m
možete samo prelistati.
p
Inače (kao ššto će biti obbjašnjeno kassnije ! je negaacija pa će reezultat if-a biti true, ako kkonekcija nee postoji.
moć PHP-a kreirati tab
belu "Korisnici" sa trri kolone i to: "Ime",,
V1-B Sljeddeći primjer će uz pom
"Prezime" i "Godine"
".
<?php
$konekcija
a = mysql_c
connect("lo
ocalhost","
"root","");
;
if (!$kone
ekcija)
{
die('G
Greska u ko
onekciji: ' . mysql_e
error());
}
// Kreiram
mo bazu moj
jabaza2
if (mysql_
_query("CRE
EATE DATABA
ASE mojabaz
za2", $kone
ekcija))
{
echo "
"Baza mojab
baza2 je kr
reirana";
}
else
{
echo "
"Greska pri
i kreiranju
u: " . mysq
ql_error();
;
}
// Kreiram
mo tabelu Korisnici
K
mysql_sele
ect_db("moj
jabaza2", $konekcija)
$
);
$sql = "CR
REATE TABLE
E Korisnici
i
(
Ime varcha
ar(15),
Prezime va
archar(15),
,
Godine int
t
)";
// Izvrsav
vanje SQL upita
u
mysql_quer
ry($sql,$ko
onekcija);
mysql_clos
se($konekci
ija);
?>
11
Kraatko objašnjen
nje PHP kôda:
-N
Nakon uspostaavljene
konnekcije kreiralli smo bazu
poddataka "mojab
baza2"
- Poomoću if - else grana
prikkazujemo "staatus" kreirane
bazze.
- Saada, pomoću PHP
P funkcije
myssql_select_db selektujemo
kreiiranu bazu.
- U promjenljivu
u $sql
upissujemo SQL upit
u (query)
- Poomoću mysql_
_query()
funk
nkcije izvršavaamo upit
-N
Najzad, zatvaraamo konekcijuu
funk
nkcijom mysqll_close();
V2:Ubacivanjepodatakautabelubazepodataka
Za unos podataka u tabelu baze koristimo SQL komandu INSERT.
INSERT INTO ime_tabele (kolona1, kolona2, kolona 3,...)
VALUES (vrijednost1, vrijednost2, vrijednost3,...);
Sljedeći primjer će uz pomoć PHP-a dodati 2 nova reda u tabelu "korisnici".
<?php $konekcija = mysql_connect("localhost","root",""); if (!$konekcija) { die('Greska: ' . mysql_error()); } mysql_select_db("mojabaza2", $konekcija); mysql_query("INSERT INTO Korisnici (Ime, Prezime, Godine) VALUES ('Petar', 'Petrovic', '25')"); mysql_query("INSERT INTO Korisnici (Ime, Prezime, Godine) VALUES ('Mara', 'Maric', '23')"); mysql_close($konekcija); ?> Kratko objašnjenje PHP kôda:
- Nakon uspostavljene konekcije i selektovanja baze, SQL komandom INSERT ubacujemo podatke u tebelu
- Sada smo u mysql_query() funkciju direktno ubacili SQL upit.
V3:Selektovanjepodatakaiztabelebazepodataka
Za selektovanje podataka iz tabele baze podataka koristimo SQL komandu SELECT.
SELECT ime_kolone-a
FROM ime_tabele;
SELECT upit je najkorišćeniji SQL upit. Pomoću SELECT-a i klauzula kao što su WHERE, GROUP BY, ORDER BY itd. precizno
određujemo koje podatke želimo da "povučemo" iz baze podataka.
Sljedeći primjer će uz pomoć PHP-a selektovati sve podatke iz tabele "korisnici".
Karakter * se koristi kada je potrebno selektovati sve podatke po određenom kriterijumu.
<?php $konekcija = mysql_connect("localhost","root",""); if (!$konekcija) { die('Greska: ' . mysql_error()); } mysql_select_db("mojabaza2", $konekcija); $rezultat = mysql_query("SELECT * FROM Korisnici"); while($red = mysql_fetch_array($rezultat)) { echo $red['Ime'] . " " . $red['Prezime']; echo "<br />"; } mysql_close($konekcija); ?>
12
Kratko objašnjenje PHP kôda:
- U promjenljivu $rezultat smeštamo
rezultat unijetog SQL upita
- Kroz while petlju "puštamo" funkciju
mysql_fetch_array()
- Pomenuta fukcija učitava red po red iz
tabele a na osnovu unijetog SQL upita
- Sa echo prikazujemo kolone koje želimo
da prikažemo
- Kao što vidite, u ispisu možete koristiti i
HTML tagove.
Tipovipodataka
U PHP-u ne postoje fiksni tipovi podataka. Naime, ne morate definisati tip varijable prije njenog
korištenja i varijablu možete deklarisati bilo kada unutar skripte i pridruživati joj različite tipove podataka
tokom izvođenja skripte (iako ovo nije uobičajena niti previše pametna praksa). Isto tako možete mijenjati
tip podataka neke varijable jednog te istog sadržaja, ali o tome kasnije.
Tipovi podataka koje podržava PHP su:
• Cijeli brojevi (integer)
• Realni brojevi (floating-point numbers )
• Tekstualni podaci (String)
• Logičke varijable
• Nizovi
• Objekti
• NULL - promjenljive kojima nije dodjeljena vrijednos imaju vrjednost tipa NULL. NULL je nepostojaća vrijednos,
prazno polje ili ti polje bez vrijednosti. Napomena da je i nula vrijednost i zato ne treba mješati nulu i NULL.
•
Resurs - promjenljive za rad sa bazama podataka imaju vrijednost tipa resurs.
U sljedećim primjerima koristit ću neke funkcije koje će vam možda biti nepoznate i neće vam odmah biti
jasno čemu one služe. Njih zanemarite i pokušajte shvatiti primjere što bolje možete. Sve funkcije će biti
detaljnije objašnjene malo kasnije, kada bude bilo priče o kontrolnim strukturama i sličnim stvarima.
Cijelibrojevi
U ovaj tip varijable možemo pohraniti pozitivne i negativne brojeve u rasponu od -2147483648 do
2147483647 tj. 32 bita podataka. Možemo ih zapisati u decimalnom, oktalnom ili heksadecimalnom zapisu.
Par primjera:
$int_var=123; //pozitivan decimalni broj
$int_var=-123; //negativni decimalni broj
$int_var=0123; //oktalni broj
$int_var=0#123; //heksadecimalni broj
Realnibrojevi‐Brojevispomičnimzarezom
Postoje dva načina spremanja realnih brojeva
$dbl_var=0.123;
// ili
$dbl_var=1.123e8;
Veličina brojeva s pomičnim zarezom zavisi o platformi, a najčešća maksimalna vrijednost je ~1.8e308 s
preciznošću na 14 decimala (IEEE 64-bitni format).
Budite pažljivi kada koristite realne brojeve. Naime njihova tačnost nije garantovana (ima veze sa
pretvaranje ovog broja u njegov binarni ekvivalent. Recimo 0.33333 nikada neće biti tačno prebačen u
binarni ekvivalent). Stoga, nemojte ih uspoređivati za jednakost i vjerovati im do posljednje decimale.
Tekstualnipodaci‐Znakovniniz(String)
Stringovi se mogu specificirati koristeći jedna od dva seta delimitera. Sadržaj string tipa varijable se nalazi
između navodnika. Možete koristiti duple i jednostruke navodnike. Postoje razlike u ispisu sadržaja
zavisno o tipu navodnika koje koristite.
Korištenjem duplih navodnika (") možete koristiti 'special characters'. To su posebni znakovi koji govore
PHP-u da izvrši određene radnje pri ispisu sadržaja varijable. Ako ste ikada radili u C-u ili Perlu već ste
upoznati za ovim znakovima. To su znakovi koji slijede iza znaka backslash ( \ ). On se ujedno koristi za
preskakanje određenog znaka unutar stringa.
13
Lista escape znakova:
Znak
Značenje
\n
Novi red(LF ili 0x0A u ASCIIu)
\t
Tab razmak (HT ili 0x09 u ASCIIu)
\\
Backslash
\$
Dolar znak
\"
Dupli navodnik
Ovi znakovi neće imati uticaja na izgled same stranice u prozoru browsera, već će njihov utjecaj biti vidljiv
tek pri pregledu sourcea dokumenta. Ovime možete sasvim sakriti činjenicu da je stranica stvorena
putem PHP-a i pomoću njih je lakše pronaći grešku u geerisanoj stranici. U protivnom bi se sav sadržaj
ispisao u jedan red bez razmaka.
Uviđate da bi bilo vrlo teško u tom neredu naći bilo što, a kamoli grešku u ispisu, ako ju tražite u source
viewu.
Ukoliko želite da se neki tekst prebaci u novi red pri gledanju stranice u prozoru browsera moraćete se
poslužiti <br> i sličnim tagovima. Znači, ako se želite koristiti PHP-om morate se jako dobro znati služiti
HTML-om.
Drugi način odvajanja stringova su jednostruki navodnici ('). Kad je string unutar jednostrukih navodnika,
jedini escape znakovi koje ce PHP razumjeti su "\\" i "\'". Varijable navedene unutar jednostrukih navodnika
se nece koristiti kao varijable, vec kao najobicniji niz znakova.
Još jedan bitna razlika između duplih i jednostrukih navodnika je ta da će se pri korištenju duplih
navodnika sadržaj varijable ispisati a pri korištenju jednostrukih navodnika ispisaće se ime varijable
skupa sa znakom $.
Sljedeći primjer bi ovo dobro ilustrirao:
<?php
/* Assigning a string. */
$str = "This is a string";
/* Appending to it. */
$str = $str . " with some more text";
/* Another way to append, includes an escaped newline. */
$str .= " and a newline at the end.\n";
echo $str;
echo "<br />";
/* This string will end up being '<p>Number: 9</p>' */
$num = 9;
$str = "<p>Number: $num</p>";
/* This one will be '<p>Number: $num</p>' */
$num = 9;
$str = '<p>Number: $num</p>';
/* Get the first character of a string */
$str = 'This is a test.';
$first = $str[0];
/* Get the last character of a string. */
$str = 'This is still a test.';
$last = $str[strlen($str)-1];
echo $num . " " . $str. " " . $last ;
echo "<br />";
echo $first
?>
14
Obrati pažnju u primjeru su korištene i funkcije ($last/$first).
Rezultat gornjeg skripta:
Primjeri za analizu
Primjer A
<?
$str_ime="Petar";
echo ("Moje ime je $str_ime");
?>
Ispisuje:
moje ime je Petar
Dok će,
Primjer B
<?
$str_ime="Petar";
echo ('Moje ime je $str_ime');
?>
ispisati:
moje ime je $str_ime
U PHP-u je takođe moguće spajanje više stringova u jedan ispis. To radimo pomoću '.' .
Primjer C:
<?php
$str_var1='Dijete';
$str_var2='ide'; //nema razmaka prije ili poslije riječi
echo $str_var1 . ' ' . $str_var2 . ' u školu';
// rezultuje sa
// Dijete ide u školu
?>
Uočite da su u gornjem primjeru korišteni jednostruki navodnici, ali varijable se ne nalaze u njima tako
da će se njihov sadržaj ispisati. Takođe su izostavljene zagrade, što je dozvoljeno.
Kao što je pomenuto, pri radu sa stringovima možemo u njihovom imenu koristiti znakove [ i ]. Njih
koristimo kada želimo izdvojiti određeni znak iz stringa, tj. String zamislimo kao jednodimenzionalni
numerički niz indeksiran na taj način da se na svakom broju, počevši od 0, nalazi jedan znak stringa. Raspon
indexa je od 0 do n-1; gdje je n broj znakova niza.
<?php
$str_tekst='Dijete ide u školu';
$str_znak=$str_tekst[0];
echo $str_znak; //ispisuje 'D'
echo $str_tekst[3]; //ispisuje 'e'
echo $str_tekst[strlen($str_tekst)-1] //ispisuje zadnji znak 'u'
?>
Kao što vidite u njih možete smjestiti bilo koji izraz koji će na kraju rezultirati cijelim brojem
(integerom).
U ovom primjeru je korištena naredba strlen($neki_string)koja vraća dužinu (broj znakova)
nekog stringa.
15
Logičkevarijable
Logički tip podataka ima dvije moguće vrijednosti : true i false
Deklaracija logičke varijable:
$logicka=true;
$logicka=false;
Koristi se u okviru izraza, promjenljivih, konstanti, kao i bilo koji drugi primitivni tip.
Svaki izraz se može prikazati kao logički (boolean):
– 0, 0.0, ‘0’, ‘’ su vrijednosti za false
– Sve ostale vrijednosti se prepoznaju kao true
Ovaj tip podataka je takođe rezultat logičkih izraza (npr. iz if uslova) te nekih PHP funkcija:
$is_drinking_age = ($age >= 21);
Prikazbooleanvrijednosti
Komande za prikaz na ekranu konvertuju logičke (boolean) vrijednosti u string prije prikaza i to na sljedeći
način
– true se konvertuje u ‘1’
– false se konvertuje u ‘’ (prazan string)
• echo true
1
• echo false
<bez izlaza>
Konstante
Konstanta nosi (sadrži) vrijednost isto kao i promjenljiva ali za razliku od promjenljive koja može da se
mijenja u toku izvršavanja programa konstanta se ne mijenja.
Konstantu u programu možemo pisati kao vrijednost bez ikakve oznake, (na primer 3.14 za vrijednost PI) ili
da joj damo oznaku za promjenljivu ali da je ne mijenjamo. Ipak ako izrađujemo veliki sajt da ne bi došlo do
grešaka i zabuna poželjno je da definišemo konstante jednom za uvokek.
Definisanje konstanti se vrši funkcijom DEFINE na sljedeći način:
define ("HLJEB",1);
define ("PIVO",2);
define ("SALAMA",5);
Kasnije kad nam treba konstanta u programu pozivamo je sa HLJEB, PIVO ili SALAMA. Oznake za
konstante su bez znaka dolar ispred naziva. Vrijednosti naših gornjih konstanti redom su 1, 1, 5. Poželjno je
konstante pisati velikim slovima kako bi se uočavale ali mogu se pisati i malim slovima.
Primjer:
<?php
// case-sensitive constant name
define("BRAVO", "ispis PHP konstante");
define ("pivo",2);
echo BRAVO;
echo "<br>";
echo pivo;
?>
Rezultat primjera (skripta):
16
Nizovi‐P
Polja(Arrrays)
PHP podržaava više vrstta nizova. Teekstualne (asssociative) i cjelobrojne (vectors / inndexed) indexima. Moguu
biti jednodim
menzionalnii ili multidim
menzionalni.
associjativni niiz
indeeksi niz
Ustvari, uoppšte nema razlike između
u ta dva tipa polja.
Primjer cjeelobrojnog jeednodimenzionalnog nizaa:
<?php
$arr_boje = array('p
plavo',"siv
vo","zeleno
o") ;
echo $arr_
_boje[0] . "<br>"; //
/ ispisaće 'plavo'
echo $arr_
_boje[2] . "<br>"; //
/ ispisaće 'zeleno'
echo $arr_
_boje[1] . "<br>"; //
/ ispisaće 'sivo'
$arr_boje[
[3]='crveno
o'; // doda
aje novi el
lement u ni
iz
$arr_boje[
[2]='pink';
; // mijenj
ja vrijedno
ost na inde
exu 2 - zel
leno prelaz
zi u ljubič
často
$arr_boje[
[7]='roza';
; // indexi
i ne moraju
u slijediti
i hronološk
ki redoslje
ed
echo "Boje
e predstvlj
jene nizom"
" . "<br>";
;
// želite li ispisat
ti sve elem
mente niza možete se služiti ov
vom metodom
m
foreach ($
$arr_boje as
a $int_klj
juc => $str
r_vrijednos
st){
echo $int_
_kljuc . " => " . $st
tr_vrijedno
ost . "<br>
>\n";
}
?>
Rezultat skrripte :
Ispis se obaavla foreach petljom
p
(koju
u ćemo kasniije obraditi)..
17
Primjer (šta radi unset?-ko je pojeo čvarke?)
Rezultat:
<?php
$hrana = array('sarma','cvarci','kajmak');
print_r($hrana);
unset($hrana[1]);
$hrana[] = 'corbast pasulj';
print "<br>";
print_r($hrana);
?>
Obrati pažnju na funkciju print_r()
Funkciја print_r() prоlаzi krоz ciо niz i rаzlаžе gа, prilаžući svе njеgоvе klјučеvе i pridružеnе vrijеdnоsti.
Asocijativni nizovi umjesto cijelih brojeva kao ključ koriste string:
$obrok = array( 'dorucak' => 'cvarci',
'rucak' => 'corbast pasulj',
'vecera' => 'pihtije' );
print_r($obrok);
daje sledeći izlaz:
Array ( [dorucak] => cvarci [rucak] => corbast pasulj [vecera] => pihtije )
Potpuno isto se postiže i sljedećim kodom:
$obrok['dorucak'] = 'cvarci';
$obrok['rucak'] = 'corbast pasulj';
$obrok['vecera'] = 'pihtije';
print_r($obrok);
Iz prethodnog koda se vidi i kako se vrši dodavanje novih asocijativnih članova. Brisanje i modifikacija se
kod asocijativnog niza rade na potpuno isti način kao i kod niza sa numeričkim indeksom:
unset($hrana['rucak']); // Brisanje
$hrana['vecera'] = 'leskovacka muckalica'; // Modifikacija
Ako dosad niste primjetili:
Sadržaju niza se pristupa pomoću imena promejnljive i indeksa (ključa), koji se navodi u uglastim zagradama.
PHP: indeksi uvek počinju sa nulom.
onda niste ni čitali, ili …
18
OperatoriuPHP‐u
U svakom programskom jeziku postoje razni operatori kojima se vrši manipulacija, matematičke operacije ili
poređenje vrijednosti. Operatori omogućavaju izvršavanje operacija nad promenljivima i konstantama, na
primjer sabiranja, množenja, itd. Operatori se mogu pisati sa jednim, dva ili tri znaka (unarni, binarni i
ternarni operatori). Kod PHP-a postoje sljedeći tipovi operatora:
• Operatori dodjele
• Aritmetički operatori
• Operator nad znakovnim nizom
• Operatori poređenja
• Logički operatori
• Operatori nad bitovima
• Ostali operatori
Operatordodjele
4
Dodjeljuje vrednost promenljivoj. Nema značenje “identično je” Nije isto kao u algebri
Pravo značenje -“Dodjeljuje se vrijednost izraza na desnoj strani promjenljivoj na lijevoj strani.”
Promjenljive se mogu pojavljivati i na desnoj strani jednakosti:
Na primjer:
$masa = 5;
Navedeni iskaz bi trebalo čitati: "promjenljivoj masi dodjeljujemo vrijednost 5".
Možemo pisati izraze slične sljedećem:
$a = 2 + ($b = 3);
Vrijednost promjenjlive $a biće 5.
Aritmetičkioperatori
Operator
Naziv
Primjer
+
Sabiranje
$a + $b
-
oduzimanje
$a - $b
*
množenje
$a * $b
/
djelenje
$a / $b
%
Modul (ostatak dj.)
$a % $b
Evo primjera upotrebe operatora:
$a = $b + $c;
Znak minus se koristi i za označavanje negativnih brojeva.
$a = - 1;
Ne treba posebno objašnjavati ove operatore, osim operatora modul (оpеrаtоr оstаtkа %). Modul vraća
ostatak cjelobrojnog dijeljenja promjenljive $a promjenljivom $b.
Rеzultаt оpеrаtоrа оstаtkа % imа isti znаk kао djеlјеnik — tо јеst, rеzultаt $a % $b ćе imаti isti znаk kао $a.
Na primjer:
<?php
echo (5 % 3)."\n";
echo (5 % -3)."\n";
echo (-5 % 3)."\n";
echo (-5 % -3)."\n";
// ispisuје 2
// ispisuје 2
// ispisuје -2
// ispisuје -2
?>
Aritmetički operatori se isključivo primjenjuju nad brojevima.
4
ovdje ćemo se malo više pozabaviti operatorom dodjele kojeg koristimo od prvog primjera
19
String(znakovni)operatori
Jedini operator nad stringovima je tačka ".".
Ovaj operator se koristi za koristi za sabiranje (konkatenaciju) stringova: spajanje dva i više znakovna
izraza u jedan. Sve će biti jasnije nakon sljedećeg primjera:
$a = "Ana ";
$b = "voli ";
$c = "Bobana";
$rezultat = $a . $b . $c;
Znakovna promjenljiva $rezultat imaće vrijednost "Ana voli Bobana".
Kombinovanioperatordodjele
Kombinovani operatori dodjele su sljedeći:
$a += 5;
Isti iskaz možemo napisali:
$a = $a +5;
Pored kombinovanog operatora " += " postoje i sljedeći:
Operator
Upotreba
Ekvivalentan izrazu
+=
$a += $b
$a = $a + $b
-=
$a -= $b
$a = $a - $b
*=
$a *= $b
$a = $a * $b
/=
$a /= $b
$a = $a / $b
%=
$a %= $b
$a = $a % $b
.=
$a .= $b
$a = $a .$b
Prefiksniisufiksnioperatori
Prefiksni i sufiksni operatori uvećanja imaju oznaku " ++ " a umanjenja " -- ".
$a = 10;
echo ++$a;
Prefiksni operator uvećanja ++ poveća vrijednost promjenljive $a za 1 pa tek onda se izvršava izraz echo$a.
Znači kao rezultat ovih izraza ispisaće se u našem slučaju 11. Potpuno identičan efekat ima i prefiksni
operator umanjenja, naravno sa tom razlikom što se vrijednost promjenljive $a umanjuje za 1.
A sufiksno uvećanje (umanjenje) je sljedeća logika:
$a = 10;
echo $a++;
U ovom slučaju prvo se ispisuje prvobitna vrijednost promjenljive $a (znači ispisuje se broj 10) pa nakon
toga se vrijednost promjenljive uvećava za 1 i dodjeljuje promjenljivoj $a. Tako na primjer ako nastavimo
gornju skriptu izrazom:
echo $a;
Tek sada biće ispisan broj 11.
Sve isto se odnosi i na sufiksno umanjenje, naravno samo što je upitanju umanjenje vrijednosti promjenljive
za 1.
20
Referentnioperatordodjele
Oznaka za referencu je znak " & ". Efekat ovog operatora najbolje možemo objasniti na primjeru:
$a = 5;
$b = $a;
Drugim iskazom kao što znamo pravimo kopiju promjenljive $a koju imenujemo sa $b. E sad nakon toga u
daljem toku programa ako promjenimo vrijednost promjenljive $a, vrijednost promjenljive $b kao što znamo
i dalje će naravno ostati nepromjenjena. Međutim ako napišemo ovako:
$a = 5;
$b = &$a;
Efekat će biti taj da ako u daljem toku programa promjenimo vrijednost promjenljive $a, vrijednost
promjenljive $b neće ostati nepromjenjen već će i on biti automatski promjenjen u novu vrijednost koju ima
promjenljiva $a.
Operatoripoređenja
Operator poređenja ima simbol duplo jednako " == ". Kao rezultat operatora poređenja uvek dobijamo
logičku vrijednost true (istina) ili false (laž) u zavisnosti od rezultata poređenja.
Ako napišemo:
$a == $b;
Ovim izrazom provjeravamo da li su vrijednosti ove dvije promjenljive jednake. Rezultat koji vraća ovaj
izraz je true (istina) ako su jednake i false (laž) ako nisu jednake. Operator jednakosti se lako brka sa
operatorom dodjele i ako dođe do toga program neće raditi ono sto mi želimo.
Na primjer:
$a = 5;
$b = 7;
Rezultat izraza $a=$b biće TRUE jer operator " = " služi za dodjeljivanje i u ovom našem slučaju
promjenljivoj $a uspešno je program dodijelio vrijednost koju ima promjenljiva $b, odnosno vrijednost 7. To
je vrijednost koja nije nula pa je logička vrijednost tog iskaza TRUE.
Ako bi smo napisali $a == $b rezultat bi bio FALSE jer 5 nije jednako 7.
Kao što vidimo operator poređenja i operator dodjele daju često kao rezultat suprotnu logiku, i zato moramo
voditi računa da ih ne pomješamo.
Postoji i operator identičnosti čija je oznaka trostruko jednako " === ".
Operator identičnosti vraća TRUE ako su obje vrijednosti jednake i istog su tipa.
Tabelarni pregled operatora poređenja:
Operator
==
===
!=
<>
<
>
<=
>=
Ime
jednako
identično
različito
različito
manje od
veće od
manje ili jednako od
veće ili jednako od
21
Upotreba
$a == $b
$a === $b
$a != $b
$a <> $b
$a < $b
$a > $b
$a <= $b
$a >= $b
Logičkioperatori
Tabelarni pregled logičkih operatora:
Operator
!
&&
||
and
or
Ime
Upotreba
negacija
!$b
konjukcija $a && $b
disjunkcija $a || $b
konjukcija $a and $b
disjunkcija $a or $b
Rezultat
vraća true ako je $b false i obrnuto
Vraća true samo ako su i $a i $b true
Vraća true ako je ili $a ili $b true
Isto kao && samo niži prioritet
Isto kao || samo niži prioritet
Želimo provjeriti da li je vrijednost promjenljive $a između 10 i 100. Znači treba provjeriti uslove $a >= 10 i
$a <= 100.
To radimo upotrebom logičkog operatora konjukcije koji ima znak " && " ili " and " na sljedeći način:
$a >= 10 && $a <= 100
Operator@‐operatorkontrole/zanemarivanja/greške‐
PHP podržava operator kontrole greške (error control operator) koji se označava se @. Kada se taj znak
doda ispred izraza sve greške koji bi taj izraz generisao prilikom izvođenja se ignorišu tj. php interpreter ih
ne generiše što je zgodno ukoliko želite da se greške ne prikažu korisniku kada pristupi skripti.
Operator kontrole greške "@" trenutno onemogućava i kritične greške koje bi dovele do prestanka izvođenja
skripte.
Npr.: $a = @(27/0) bez operatora @, izvršno okruženje bi generisalo upozorenje “dijelite nulom”.
Ako upotrebite ovaj operator, greška se zanemaruje (ali kad se zanemaruju upozorenja o greškama, trebalo
bi da napišete kod za obradu grešaka).
Ukoliko je u interpreteru postavljena opcija track_errors greške će se sačuvati u varijabli $php_errormsg
tako da se naknadno mogu obraditi.
Ostalioperatori
Ostali operatori su:
• Operator zarez " , " koristi se ze razdvajanje argumenata funkcija i stavki u spisku.
• Operatori " new " i " - > " koriste se za pravljenje objekta i za pristup članovima objekta
• Operatori elementa niza " [ ] " omogućavaju pristupu elementima niza. Koristi se i oznaka " => "
• Uslovni operator ima oznaku " ? : " . Logika ovog operatora videćemo na primjeru:
($visina > 200 ? $b="visok" : $b="nizak");
Ako je promjenljiva $visina veća od 200 onda promjenljiva $b dobija vrijednost "visok" a ako je
$visina manja od 200 onda $b dobija vrijednost "nizak". Ako želimo da se odmah rezultat ispiše na
ekranu onda nam ne treba promjenljiva $b već izraz možemo napisati ovako:
•
echo ($ocena > 50 ? "Položio" : "Pao");
Operator izvršenja ima oznaku " ` ` " . Radi se o paru inverznih polunavodnika. Inverzni
polunavodnik se nalazi na tastaturu gdje i znak ~. PHP će izvršiti sve šta se nalazi između inverznih
polunavodnika u komandnom okruženju na serveru. izlazni podaci komande pretstavljaju vrijednost
izraza.
$out = `dir c:`;
echo "<pre>".$iz."</pre>"
Pošto su primjeri uglavnom za windows servere samo ćemo spomenuti da je kod Linux-a nešto drugačije.
22
Prioritetoperatora
Kada se u jednom izrazu nađe više operatora onda redosljed po kojima će se izvršavati operatori zavisi od
njihovog prioriteta. Ukoliko dva i više operatora imaju isti prioritet onda se oni izvršavaju sa lijeva na desno
ili obrnuto u zavisnosti od toga koji su operatori u pitanju – što se naziva asocijativnost. Daćemo tabelu
prioriteta operatora i to tako da najmanji prioritet imaju operatori pri vrhu a najveći pri dnu tabele.
Napomena da smo sa "n/b" u tabeli označili ukoliko je asocijativnost takva da je svejedno da li se izvršava sa
lijeva na desno ili sa desna na lijevo.
Asocijativnost
Operatori
Lijevo
,
Lijevo
or
Lijevo
xor
Lijevo
and
Desno
echo (ili print)
Lijevo
=
+=
-= *=
/=
.=
%= &=
Lijevo
|=
^=
~=
<<= >>=
?:
Lijevo
||
Lijevo
&&
Lijevo
|
Lijevo
^
Lijevo
&
n/b
==
n/b
<
!=
<=
Lijevo
<<
Lijevo
+
Lijevo
*
Desno
!
~
++ --
(int)
===
> >=
>>
-
.
/
(double)
%
(string) (array)
Desno
[]
n/b
new
n/b
()
(object)
@
Najveći prioritet ima mala zagrada, zato uz pomoć malih zagrada možemo zaobići prioritete tako što ako
želite da se prvo izvrši nešto manjeg prioriteta stavite to (taj izraz) u male zagrade.
Na primjer:
$a = (5 + 2) * 7;
Vrijednost promjenljive biće 49 a da smo napisali:
$a = 5 + 2 * 7;
Bio bi 19 jer množenje ima veći prioritet tako da će se prvo pomnožiti 7 * 2 pa nakon toga rezultat toga će se
sabrati sa 5.
U prvom slučaju zbog zagrada će se prvo izvršiti sabiranje pa nakon toga rezultat sabiranja će se pomnožiti
sa 7. Možemo koristiti neograničen broj malih zagrada i uvijek će se prvo izvršavati onaj izraz koji se nalazi
u zagradi koja je najviše ugnježdena.
23
Jošoimenovanjuvarijabli
Postoji standardna preporuka za imenovanja varijabli:
Na prvom mjestu imena se nalazi opis tipa varijable od tri znaka.
Nakon njega odvojeno sa '_' slijedi ime varijable koje bi trebalo pobliže opisati ime sadržaj same varijable.
Ime se obično sastoji od jedne ili dvije riječi koje pobliže opisuju sadržaj varijable. Riječi možete odvajati sa
znakom '_' ili svako početno slovo riječi možete napisati velikim slovom.
Zašto se pridržavati ovih pravila?
Pridržavanjem ovih pravili činite uslugu sebi jednako koliko i ostalima koji će jednog dana pokušati pročitati
i razumjeti vaše kodove.
Pokušajte si zamisliti ovaj primjer:
Nalazite se između dva posla i odlučili ste razviti forum za vlastiti site. Krenete ga razvijati i u usred posla
primite narudžbu za novi site. Normalno, trenutno zaboravljate na forum i bacate se na posao. Recimo da
završite sa poslom za mjesec dana i sjetite se da ste prije posla izrađivali forum za vlastiti site. Otvorite
editor, otvorite mjesto gdje ste stali kada ste ga zadnji put pogledali i… pred vama se sada nalazi hrpa slova i
znakova koji vam više nemaju nekakvo značenje (ako ste koristili imena poput $post, $ime, $mail – čije ime,
kakav post (tek stvoreni, već postojeći…). Sada morate cijelu aplikaciju ponovo 'projektovati' i tek onda
nastaviti sa radom.
Vrlo jednostavnom upotrebom standarda pri imenovanju varijabli i čestim komentarisanjem koda ovih
problema ne bi bilo. A zamislite da je netko drugi otvorio takve kodove...
Zato i pišite kodove sa komentarima i standardizovanim imenima varijabli. Vrijedno je truda.
Prebacivanje(konverzija)tipovavarijabli
Sadržaj bilo koje varijable podložan je izmjeni svog tipa. Znači da nekakav broj može vrlo lako postati string
i obratno. Tipovi se mogu mijenjati implicitno (definisanjem i deklarisanjem varijable) i eksplicitno.
Eksplicitna primjena tipa varijable se vrši tako da u neku novu varijablu pridružite neku već postojeću
varijablu i ispred nje navedete u zagradama tip u koji želimo prebaciti varijablu koju pridružujete. Isto tako
možete u varijablu pridružiti nju samu sa eksplicitnom izmjenom tipa podatka.
Moguće konverzije su:
• (int), (integer) – prebaci u integer
• (real), (double), (float) – prebaci u double (realni broj)
• (string) – prebaci u string
• (array) – prebaci u niz
• (object) – prebaci u objekt
// implicitno
$var=1; // varijabla je tipa integer
$var+=1.5 // varijabla je tipa double (realni broj)
$var = 5 + "10 Little Piggies"; // varijabla je integer (15)
$var = 5 + "10 Small Pigs"; // varijabla je integer (15)
// eksplicitno
$int_neki_broj=10;
$str_neki_broj= (string) $int_neki_broj // broj u string (ASCII znakove)
PHP vrši automatsku konverziju tipova podataka na osnovu operacija koje se vrše nad podacima.
Npr.:
$TipMotora="20L";
$PoreskaStopa=3;
$Porez=$TipMotora*$PoreskaStopa;
Rrezultat je 60. Ignoriše se L i množi 20*3.
Npr. konverzija integer varijable
u string tip:
$a=13;
$b=(string)$a;
Vraćanje nazad:
$a=(integer)$b;
24
Ispitivаnjеtipаprоmjеnlјivih
Zа strukturnо prikаzivаnjе nа izlаzu tipа prоmjеnlјivе, kоristi sе funkciја gettype($int_var)
Funkciја је pоsеbnо kоrisnа u tоku rаzvоја prоgrаmа. Primjеr:
<?php
$int_var=10;
$int_var2="marko";
$int_var=(double) $int_var;
echo gettype($int_var)."<br>"; // gettype($int_var) vraća tip dane varijable
echo gettype($int_var2); // gettype($int_var2) vraća tip dane varijable2
?>
Zа strukturnо prikаzivаnjе nа izlаzu tipа i vrijеdnоsti prоmjеnlјivе, kоristi sе funkciја var_dump.
Primjеr:
<?php
$b = 3.55;
$c = true;
var_dump($b, $c); // nа izlаzu ćе prikаzаti: float(3.55) bool(true)
?>
Zа ispitivаnjе tipа prоmjеnlјivih mоgu sе kоristiti i funkciје iz tаbеlе:
Ispitivаnjе tipа prоmjеnlјivih
funkciја
ispituје dа li је
is_array
prоmjеnlјivа niz
is_double, is_float, is_real
prоmjеnlјivа u fоrmаtu sа pоkrеtnоm zаpеtоm
is_long, is_int, is_integer
prоmjеnlјnivа cео brој
is_string
prоmjеnlјivа znаkоvni niz
is_object
prоmjеnlјivа оbјеkаt
is_resource
prоmjеnlјivа rеsurs
is_null
prоmjеnlјivа imа vrеdnоst null
is_scalar
prоmjеnlјivа skаlаrnоg tipа: numеrički, lоgički ili znаkоvni pоdаtаk
is_numeric
prоmjеnlјivа brој ili znаkоvni niz kојi sе mоžе prеtvоriti u brој
is_callable
vrijеdnоst prоmjеnlјivе imе pоstојеćе funkciје
Za razliku od funkcije gettype () koja ispituje tipove promenjljivih i koja kao rezultat vraća ime tipa
promenjljive ove funkcije ispituju tačno određene tipove promenjljivih i vraćaju logički true ako je
promenjljiva tog tipa ili false ako nije.
Promjenljivapromjenljive:Varijablinavarijabla
PHP podržava tip - promjenljiva promjenljive (engl. variable variable).
Takve promjenljive omogućavaju da ime promjenljive mijenjamo dinamički.
Primjer:
$ocena = "Deset";
$$ocena = 10;
što je ekvivalentno izrazu:
$Deset = 10;
25
Praktičn
nevježbe:PHPvariijableuH
HTMLmod
du
Neke odd komandi i struktura
s
ćem
mo kasnije detaljnije
d
obrradit, a neke ssmo
razjasnili u predho
odnim vježbaama.
Vrlo bitna karakteristikka PHP-a i bilo kojeg ddrugog jezik
ka je razdvajjanje server side koda od
o statičkogg
HTML-a. T
Tako u PHP--u korištenjeem <? I ?> ggovorimo serrveru da se između njihh nalazi PHP
P kod i da jee
potrebno prrvo njega izvvršiti i tek nakon
n
toga pposlati HTM
ML output tog koda skuppa sa ostatko
om statičkogg
HTML kodaa klijentu. Ovo
O je osnovaa server-cliennt mrežne ko
omunikacije putem
p
TCP/IIP protokolaa.
Unutar kodaa se možemo u bilo kojem trenutku prebbaciti iz HTM
ML moda u PH
HP mode. Čaak i unutar if,
f, for i ostalihh
kontrolnih sttruktura. Ovo nam omoguććuje rad sa šaablonima-temp
mplejtima u koj
ojima se na issti način prika
azuju različitii
podatci iste sstrukture. Zvuuči nejasno? Da
D ilustrujem jjednim vrlo jeednostavnim primjerom.
Podsjećamoo postoje 4 načina za umeetanje PHP kkoda u HTML dokument:
<html>
<head>
<title>Pr
rimjer ugr
radenog ko
oda</title
e>
</head>
<body>
// 1. nač
čin
<?php ech
ho ("Ovo je
j najjedn
nostavniji
i nacin\n"
"); ?>
// 2. nač
čin
<?php ech
ho("Ako ze
elite posl
luzivati X
XHTML ili HML dokum
mente, ond
da ovako..
..\n");
?>
// 3. nač
čin
<script l
language="
"php">
echo ("ne
eki editor
ri ne vole
e bas proc
cesirati instrukcij
i
je (npr. F
Frontpage)
)");
</script>
>
// 4. nač
čin
<% echo (
("Ako je omoguceno
o
koristenj
je ASP tag
gova, onda
a mozete i ovako");
; %>
</body>
</html>
Najčešće see koristi 2. naačin jer omog
gućuje impleementiranje novih
n
generaacija XHTML
L-a PHP kod
dom.
Podsjećamo i na to PHP koristi tri
t funkcije zza ispis (to su one kojee služe za "sslanje" običn
nog teksta u
HTML):
• prin
nt - najjednoostavnija fun
nkcija za slannje teksta u prozor brow
wser-a. Funkccija može daa se navodi i
bezz, i sa zagradaama.
• ech
ho - funkcijaa slična prethodnoj, sam
mo što ovdjje možete da kombinujeete više striingova, kojee
obaavezno odvajjamo zarezim
ma. Sa ovom
m funkcijom se
s ne koriste zagrade.
• prin
ntf - funkcija koja najčešće služi za formatiranjee brojki kao integera,
i
deccimala itd. Ova
O funkcijaa
obaavezno zahtjjeva upotreb
bu zagrada.
Primjer upootrebe:
<html>
<body>
<?php
print "Ovo
o je print funkcija."
";
print "<p>
>";
echo "Ovo je echo fu
unkcija.", " ",
"P.S. Ovdj
je mozete dodati
d
i dr
rugi string
g", " ",
"ako strin
ngove razdv
vojite zare
ezom.";
print "<p>
>";
printf ("O
Ovo je prin
ntf funkcij
ja.");
print "<p>
>";
printf ("F
Funkcija pr
rintf se na
ajcesce
koristi za
a formatira
anje brojki
i.");
print "<p>
>";
printf ("N
Ne zaboravi
ite zagradu
u sa
funkcijom printf.");
;
?>
</body>
</html>
26
R
Rezultat koji
k
server
r vraća:
UbacivanjePHPvarijabliuHTML
Jednostavan primjer kreiranja i ubacivanja PHP varijabli:
<?php
$prva = 'Pero';
// Dodjela vrijed. 'Pera' varijabli $prva
$druga = &$prva;
// Referenciranje varijable $prva varijabli $druga
$druga = "Moje ime je $druga";
// Nadgradnja varijable $druga
echo "$prva <br>";
// I varijable $prva je promjenjena
echo $druga;
?>
Rezultat koji server vraća:
Zašto $prva i $druga ispisuje Moje ime je ...
Primjer ubacivanja PHP varijabli u formatirane ćelije (tabelu):
<?php
$urls = array('www.google.com', 'www.yahoo.com', 'wwww.sveznadar.info');
foreach($urls as $url) {
echo $url;
}
// ispis: www.google.com www.yahoo.com wwww.sveznadar.info
echo "<br>";
foreach($urls as $url) {
echo '<td><input type="text" size="25" value="' .$url. '"/></td>';
}
// ispis: www.google.com www.yahoo.com wwww.sveznadar.info celijama tabele
// obrati paznju na duple navodnike/navodnike kod value ="'...
?>
Analiziraćemo skript:
<html>
<head> <title>Mikijeva HTMLtabela sa PHP var </title> </head>
<body>
<?php
$ime="Pajo";
$prezime="Patak";
?>
<table width="300" border="1" >
<tr>
<td> <?php echo "$ime";?></td>
<td> <?=$prezime;?> </td>
</table>
</body>
</html>
Rezultat gornjeg koda bi izgledao
Uočite da se za ispis sadržaja varijable koriste dva različita
načina koji rezutuju istim krajnjim ispisom.
Naime unutar <? i ?> se nalazi php kod koji će se izvršiti
ukoliko se u njemu ne nalaze neke sintaksne pogreške.
27
Druga metoda ispisa je izgledala ovako:
<?=$prezime;?>
Ovu metodu koristimo kada želimo ispisati neku varijablu ili string. Ova linija je identična
<? echo $prezime; ?>
samo što se umjesto echo naredbe koristi znak = koji PHP-u govori da ispiše ono što se nalazi između
<? i ?> kvačica (znakova veće/manje).
ManipulisanjeHTMLmarkupaustringu(zamjenaspecijalnihznakova)
Podsjećam i objašnjavam šta hoćemo:
HTML je skraćenica od Hyper Text Markup Language. Pojam "Hypertext Markup" upućuje na jezik za označavnje, te
mogućnost međusobnog povezivanja dokumenata hipervezama (Hyperlink), pa bi manipulacija HTML markapima u
stringu značilo da želimo da nekom znakovnom nizu vršimo razdvajanje i prepoznavanje oznaka i sadržaja.
Ovo se najbolje može shvatiti na praktičim primjerima koji slijede.
Primjer
<hr>
<h3>Manipulacija HTML stringova</h3>
<?
$str_HTML="<p>Ovo je prvi pragraf koji se prikazuje</p>".
"<p>Ovo je drugu paragraf,<br>ali on ima dva reda i
rijec</p>";
echo "<u>HTML koji se ureduje:</u><br>" . $str_HTML;
jednu
<b>boldanu</b>
?>
<hr>
<h3>Zamjena HTML specijalnih znakova</h3>
<?
// zamjena specijalnih znakova
$str_bez_HTML=htmlspecialchars($str_HTML);
echo "<u>HTML sa zamijenjenim specijalnim znakovima:</u><br>" . $str_bez_HTML;
?>
<hr>
<h3>Zamjena nove linije sa &lt;br&gt; tagom</h3>
<?
$str_nl="Ovo je\nstring koji sadrzi\nvise linija";
echo "Originalni string:<br>$str_nl";
echo "<br><br>String sa zamjennom novih linija sa &lt;br&gt; tagom: <br>";
echo nl2br($str_nl);
?>
Rad sa HTML kodom je vrlo bitno pitanje u izradi web aplikacija što se tiče sigurnosti nekih aplikacija
poput foruma, formi i sličnih aplikacija koje se oslanjaju na korisnički unos.
HTML markupom militantni posjetitelj vrlo lako može natjerati aplikaciju da se ponaša nepredvidivo, čudno
i koa rezultat takvog ponašan može doći do probijanja sigurnosti aplikacije ili preopterećenja te time i
rušenje servera.
Iz tog razloga vrlo je bitno da područja osjetljiva na HTML markup (ona koja prikazuju unesenu sadržaj kao
npr. u forumu ili guestbooku) imaju validaciju unosa te da se sav HTML izbaci iz unosa ili da se svi HTMl
znakovi ( < , > , ' , ") zamjene sa kodovima za posebne znakove. Za ovo postoje ugrađene funkcije u PHP-u.
$str_bez_HTML=htmlspecialchars($str_HTML);
echo "<u>HTML sa zamjenjenim specijalnim znakovima:</u><br>" . $str_bez_HTML;
Ovaj fragment koda zamjenjuje sve HTML znakove sa njihovim kodovima za posebne znakove.
Za ovo se koristi funkcija htmlspecialchars($str_HTML).
Njoj kao argument dajemo string za kojeg postoji mogućnost da sadrži HTML markup i ona vraća taj isti
string za izmijenjenim HTML znakovima. Ova funkcija mijenja sljedeće znakove:
28
•
•
•
•
•
' &' (ampersand) postaje '&amp;'
'"' (dupli navodnik) postaje '&quot;'.
''' (Jednostruki navodnik) postaje '&#039;'
'<' (manje) postaje '&lt;'
'>' (veće) postaje '&gt;'
Druga funkcija koja služi istoj svrsi je htmlentities(). Ona takođe kao argument prima string i vraća
ga sa izmenjenim znakovima. Razlika između ove dvije funkcije je ta što htmlentities() mijenjae sve znakove
koji se mogu promijeneitiu u kodove specijalnih znakova. Ovo znači da će se i znakovi poput č,ć,Č,Đ…
mijenjati u njihove reprezentacije u kodu za posebne zakove.
$str_nl="Ovo je\nstring koji sadrzi\nvise linija";
echo "Originalni string:<br>$str_nl";
echo "<br><br>String sa zamjennom novih linija sa &lt;br&gt; tagom: <br>";
echo nl2br($str_nl);
Druga stvar koja je vrlo česta u aplikacijama je formatiranje unesene vrijednosti.
Naime, kada korisnik unosi neki tekst u tekst polje i pritisne enter da bi prenio unos u novi red na mjesto na
mjestu na kojem je stisnut enter se nalazi '\n'.
Ovo se neće vidjeti pri HTMl prikazu ovog unosa u browseru već će se vidjeti tek kada se pogleda source
dokumenta. Da bi izbjegli ovo u PHP-u postoji funkcija koja zamjenjuje '\n' sa <br> elementom tako da se
novi red iz unosa stvarno prikaže kao novi red u pogledu unosa u browseru.
Za to koristimo funkciju nl2br($str_nl)
<?php
$string = "Ovo \r\n je\n\r kratki tekst\n
dijela\r";
echo nl2br($string);
//samo tekst - izbacuju se kodovi za formatiranja
print "<p>"; //novi red
echo nl2br("Specijalni
trakasti ispis");
znakovi
prekidaju
od
4
neprkidan\n
?>
29
Kontrolnestrukture
Pomoću kontrolnih struktura određujemo tok skripti, odlučujemo i računamo. One su zadužene za logiku
aplikacija.
Strukturno programiranje temelji se na tri osnovne kontrolne strukture:
• sekvenca (programski blok, slijed),
• selekcija (grananje, izbor) i
• iteracija (petlja).
Nestrukturno programiranje pridodaje još i skokove. Tipična instrucija skoka je break i continue.
If..else
If.. else je najčešće korištena kontrolna struktura. Njoj dajemo logički izraz koji se provjerava i zavisno o
njegovom ishodu koji može biti true ili false izvršava se blok naredbi.
<?php
If ( uslov ) {
// naredbe koje se izvršavaju ukoliko je uslov == true
} else {
// naredbe koje se izvršavaju ukoliko je uslov == false
}
?>
Vitičaste zagrade ( {} ) označavaju blok naredbi. Njih možete izostaviti ukoliko grana ima samo jednu
naredbu. Kroz primjer je najlakše objasniti:
if ( $a > 0 ) echo "vrijednost je veća od nule i ona je: " . $a;
Znači, ukoliko vrijednost promjenljive $a veća od nule izvršiće se echo iskaz, a u suprotno neće.
Primjer
<?php
$t = date("H");
// date("H") je funkcija koja daje sistemske sate (trenutno vrijeme)
if ($t < "20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
$str_ime='Milan';
if ($str_ime=='Milan')
echo ' Zdravo Milane';
else
die ('Ti nisi Milan.');
// die() je funkcija koja prekida izvršavanje skripte. Ako joj u
// argument date neki tekst ili broj ispisaće ga. Prima i funkciju kao argument
?>
Umjesto else ključne riječi može se koristiti i elseif ključna riječ. Ona se izvršava ako je uslov u if-u
rezultirao false. Ona takođe ispituje logički izraz.
<?php
If ( uslov ) {
// naredbe koje se izvršavaju ukoliko je uslov == true
} elseif ( uslov2 ) {
// naredbe koje se izvršavaju ukoliko je uslov == false i uslov2==true
} elseif ( uslov3 ) {
// naredbe koje se izvršavaju ukoliko je uslov == false i uslov2 == false i uslov3 == true
} else {
// naredbe koje se izvršavaju ukoliko su svi uslovi == false
}
?>
30
Ponekad treba donijeti i više od dvije odluke.
Pogledajmo na primjeru: Za veće kupovine daje se popust:
• Za manje od 5 kupljenih artikla nema popusta,
• 5 do 10 – popust 10%,
• 11 do 15 – popust 12%,
• 16 i više - popust 15%
Evo kako bi izgledao kod:
if ($količina < 5) $procenat = 0;
else if ($količina > 4 && $količina < 11) $procenat = 10;
else if ($količina > 10 && $količina < 16) $procenat = 12;
else ($količina > 15) $procenat = 15;
Ovdje uslovi jedan drugi isključuje pa će se izvršiti samo jedan ali ako se uslovi preklapaju biće izvršen onaj
na koga se prvo naiđe a ostali će biti preskočeni.
Primjer
<?php
$t = date("H");
if ($t < "10") {
echo "Have a good morning!";
} elseif ($t < "20") {
echo "Have a good day!";
} else {
echo "Have a good night!";
}
?>
Ukoliko pokušavate riješiti situaciju sa mnogo mogućih ishoda nije praktično koristiti if … elseif tip
grananja. U tom slučaju koristite se switch strukturom.
Switch
Switch uzima za argument nekakav izraz i onda gleda da li je on jednak jednom od zadanih slučaja. Ukoliko
nije jednak niti jednom od njih izvršava default akciju ili ne izvršava ništa.
Switch je idealan alat za izradu višenamjenskih stranica.
<?php
switch ( uslov ){
case < slučaj1 >:
// naredbe koje se izvršavaju ukoliko je uslov jednak slučaju 1
break;
case < slučaj2 >:
// naredbe koje se izvršavaju ukoliko je uslov jedanak slučaju 2
break;
case < slučaj3 >:
// naredbe koje se izvršavaju ukoliko je uslov jedanak slučaju 3
break;
default:
// naredbe koje se izvršavaju ukoliko uslov nije jednak niti jednom slučaju
// može se izostaviti ukoliko se niti jedana naredba ne treba izvršiti u tom slučaju
}
?>
Ključna riječ break označava završetak grane. Ukoliko ga izostavite između dvije grane naredbe obje grane
će se izvršiti ukoliko je viša (ona koja slijedi prije) aktivirana. Naredbe će se izvršavati sve dok se ne pojavi
break ili završetak switcha
31
Analizirajmo primjer:
switch ($količina) {
case ($količina<5):
$procenat=0;
break;
case ($količina>4 && $količina<11):
$procenat=10;
break;
case ($količina>10 && $količina<16):
$procenat=12;
break;
default :
$procenat=15;
break;
}
Za one bez programerskog iskustava daćemo isto na dva načina: analizirajte Paralel slalom višestruki if vs switch:
<?php
$i = 0;
echo 'Koristimo IF'. '<br>';
if ($i == 0) {
echo "i equals 0";
} elseif ($i == 1) {
echo "i equals 1";
} elseif ($i == 2) {
echo "i equals 2";
}
echo '<br>';
echo 'Koristimo
switch ($i) {
case 0:
echo "i
break;
case 1:
echo "i
break;
case 2:
echo "i
break;
}
?>
SWITCH' . '<br>';
equals 0";
equals 1";
equals 2";
Napravimo program koji će brojeve od 1 do 5 imenovati, a ako je u pitanju neki drugi broj izvan skupa od 1
do 5 da ispiše "vrijednost promjenljive nije iz skupa jedan do pet".
switch ($a) {
case 1:
echo "jedan";
break;
case 2:
echo "dva";
break;
case 3:
echo "tri";
break;
case 4:
echo "četri";
break;
case 5:
echo "pet";
break;
default:
echo "vrijednost promjenljive nije iz skupa od jedan do pet";
break;
}
32
Umjesto na primjer "case 1:" možemo pisati i neki matematički izraz ako je neophodno, pa tako bi bilo na
primjer:
case ($b * 25 + 4);
Isto može na primjer i neki ovakav program da se pojavi nekad:
switch ($x) {
case ($y * 4):
case (9 * 3):
echo "Zapamti";
break;
default:
echo "Zaboravi";
}
Dakle mogu da se pojave vise CASE naredbe sa jednom BREAK naredbom.
Petlje
Ponekad se dijelovi programa trebaju izvršit više puta (iterirati). Struktura koja to omogućuje naziva se
programska petlja. Programskom petljom dijelovi programa se mogu ponavljati unaprijed zadani broj puta ili
sve dok je određeni uslov ispunjen.
Petlje se u programu ostvaruju naredbama:
• for,
• while,
• do-while.
Whilepetlja
While petlje su najjednostavnije petlje u PHP-u. Tijelo petlje se izvršava dok god je uvjet while-a ispunjen.
While petlja izvršava svoj blok naredbi dokle god je izraz u uslovu istinit (true). Uslov se ispituje prije
izvođenja bloka naredbi. Zbog toga je moguće da se blok ne izvrši niti jednom ukoliko je uslov na početku
false.
<?php
while ( uslov ) {
// naredbe koje se izvršavaju dok je uslov true
}
?>
Ili konkretani primjeri:
Primjer A
<?php
$x = 1;
Primjer B
<?php
$int_var=10;
while($x <= 5) {
echo "The number is: $x <br>";
$x++;
}
?>
while ($int_var<=20){
echo '$i = ' . $i . '<br>';
echo "vrijednost varijable je $int_var";
$int_var++;
echo <br>;
}
33
Do…while
Do..while petlje su vrlo slične while petljama. Za razliku od normalne while petlje, kod Do … while petlje
uslov se ispituje tek nakon izvršavanja bloka naredbi. Tako da je uvijek garantirano barem jedno
izvršavanje bloka naredbi iako je uslov odmah na početku false.
<?php
do {
// naredbe koje se izvršavaju dok je uslov true
} while ( uslov )
?>
Budite oprezni pri postavljanju uslova!
Primjer:
<?php
$i = 0;
do {
print $i;
} while ($i>0);
?>
U ovom primjeru će se petlja izvršiti, odnosno ispisati će
"0" iako uslov u zagradama nije ispunjen!
ovo je još drastičnije (nelogičnije) za primjer:
<?php
$x = 6;
do {
echo "The number is: $x <br>";
$x++;
} while ($x <= 5);
?>
Forpetlja
For petlja koristi brojač petlje koji se prije svakog izvršavanja bloka naredbi petlje uveća ili smanji. For
petlje su najsloženije petlje u PHP-u. For petlju koristite kada znate tačan broj potrebnog ponavljanja
bloka petlje. Brojač petlje može biti bilo koja već postojeća varijabla ili možete stvoriti novu varijablu za
potrebe petlje.
Sintaksa je sljedeća:
for (expr1; expr2; expr3) {
statement1;
.
.
statementN;
}
expr1 se bezuslovno izvršava (evaluira) jedan put na početku petlje. Ako se evaluira u TRUE, petlja se
nastavlja i naredbe unutar for bloka se izvršavaju. Ako se evaluira u FALSE, petlja se prekida.
Na kraju svake iteracije se evaluira expr3. Ispravno je koristiti termin evaluira, pošto postoji mogućnost i
inkrementa i dekrementa.
Mada je moguće koristiti proizvoljan tip uobičajena imena varijabli su $i, $j, $k i njih ćete sresti u gotovim
svim aplikacijama diljem svijeta, pa je sintasa (i značenje) uobičajeno:
<?php
for ($i=0;$i (operator poređenja) (vrijednost sa kojom poređenja); (operator
uvećanja ili smanjenja){
// naredbe koje se izvrašavaju svki put dok je uslov jednak true
}
?>
ili na konkretnom primjeru (Obavezno napišite kompletan kod i provjerite nekoliko varijacija ove petlje):
//
//
//
//
//
//
//
//
//
//
//
//
for ($i=10;$i>=0;$i--){
echo '$i = ' . $i . '<br>';
}
34
što rezultira:
$i = 10
$i = 9
$i = 8
$i = 7
$i = 6
$i = 5
$i = 4
$i = 3
$i = 2
$i = 1
$i = 0
BREAKCONTINUEiEXIT
Kod swich naredbe smo objasnili način korišćenja naredbe (ključne riječi) break. Postoji mogućnost
upotrebe ove ključne riječi i kod drugih struktura. U opštem slučaju Break prekida izvođenje trenutne for,
while ili switch structure.
Ekvivalentno, ali suprotno se koristi naredba Continue. Continue se koristi u petljama da se preskoči
ostatak trenutne iteracije petlje i da se izvođenje nastavi na početku nove iteracije petlje.
Iskaz Exit se koristi kada se želi prekinuti izvršenje čitave skripte.
Foreachpetlja
Kod objašnjenja nizova koristili smo ovu naredbu. Da bi prošli kroz sve elemente asocijativnih polja koristiti
se foreach petlja. Za razliku od „normalnih“ petlja ova nema brojača niti limite nego sama ide od prvog do
zadnjeg elementa redosljedom kako smo ih unosili.
Ovo nam daje mogućnost jednostavnog iteriranja po svim stavkama polja.
Sintaksa:
foreach(array_expression as $value) statement
Petlja se vrti kroz polje array_expression i u svakoj iteraciji vrijednost elementa polja stavlja u $value
varijablu.
Foreach petlja se koristi za rad sa nizovima. Ona prolazi kroz svaki element danog niza i obavlja blok
naredbi. Može spremiti ključ i vrijednost svakog elementa niza u posebne varijable u kojim se za svako
ponavljanje petlje nalaze ključ i vrijednost elementa niza na kojem se trenutno nalazi nutarnji pokazivač.
Unutrašnji pokazivač se prije ulaska u petlju nalazi na 0 i svakim novim krugom u petlji povećava se za 1.
Novim zvanjem foreach petlje unutrašnj pokazivač se resetuje. Petlja se vrti sve dok ne ostane bez elemenata
niza.
<?php
// uopšte
foreach ($neki_niz as $vrijednost){
// naredbe koje se izvršavaju za svaki element niza
}
// ili
foreach ($neki niz as $kljuc => $vrijednost){
// naredbe koje se izvršavaju za svaki element niza
}
// evo jedan primjer:
<?php
$arr_hladnjak=array(
"jaja"=>12,
"paprika"=>6,
"maslac"=>0,
"mlijeko"=>0.5,
"salama"=>"0.2 kg - narezano",
"sir"=>"0.4 kg - u komadu"
);
foreach ($arr_hladnjak as $kljuc => $vrijednost){
echo "$kljuc => $vrijednost <br>";
}
?>
35
// rezultira
// jaja => 12
// paprika => 6
// maslac => 0
// mlijeko => 0.5
// salama => 0.2 kg narezano
// sir => 0.4 kg - u komadu
Vježba:K
Korišćenje
ekontrolnihstruk
ktura/
Generisa
anjeHTML
Lkodapo
omoćupettlji
Koristeći sljjedeći odsječčak provježb
baj generisanjje HTML ko
oda korišćenjjem for petljee:
<?php
$users = array('Pe
ero', 'Ana
a', 'Marij
ja', 'Zvek
kan', 'Kos
sta');
echo '<ce
enter>';
echo '<ta
able borde
er = 2 >';
;
echo '<th
h>Number</
/th><th>Us
sername</t
th>';
for ($i = 0; $i < count($us
sers); $i+
++)
{
echo '<tr
r>';
echo "<td
d>$i</td>"
";
echo "<td
d>$users[$
$i]</td>";
;
echo '</t
tr>';
}
echo '</t
table>';
?>
Rezultat skrripta:
36
Funkcije
Funkciје оmоgućаvајu izvršаvаnjе оdrеđеnоg blоkа nаrеdbi, kоје sе pоnаvlјајu. PHP imа dоstа vеć
ugrаđеnih, аli pоstојi mоgućnоst dеfinisinjа sоpstvеnih funkciја. Funkciја mоžе dа sе pоzоvе iz nеkоg
drugоg dijеlа skriptе, prоsljеđuјući јој аrgumеnаtе, а оnа zаtim, kаdа sе izvrši, mоžе dа vrаti nеku
vrijеdnоst.
Funcije se slično koriste kao i u C-u. Razlika je prvestveno u tome da se ne predaju i ne inicijaliziraju tipovi
varijabli i pošto ne postoji direktan pristup memoriji normalno prima stringove i array. Isto tako funkcija
može vratiti bilo koji tip varijable.
Dva su osnovna razloga zbоg kојеg sе kоristе funkciје:
• izbjеgаvаnjе pоnоvnоg pisаnjа vеć nаpisаnоg dijеlа kоdа
• lаkšе rаzumjеvаnjе kоdа
Listu gotovo svih funkcija (a ima ih preko 700) možete pronaći na kraju ovof priručbika a preporuka je da i
praktičnom radu koristite referentnu listu sa sajta http://php.net/manual/en/
Umjesto teoretske razrade (što nikako nije predmet ovog priručnika razmotrićemo koncept fumkcije na
jednostavnom primjeru (gdje možete vidjeti sintaksu i strukturu i realnih funkcija):
function dodjeli () {
return 5;
}
Možete pretpostaviti da ova funkcija služi dodjeli vrijednosti (u ovom slučaju vrijednosti 5). Probajte sada da
napišete: $x=dodjeli()
Ovim izrazom varijabli "$x" dodjeljujemo vrijednost 5, to vam je isto kao da ste napisali "$x=5".
Funkcije predstavljaju izraze, koje u sebi sadrže druge izraze, a služe za vraćanje neke vrijednosti. U našem
slučaju ova funkcija vraća vrijednost 5, a inače funkcije ne služe samo za jednostavno vraćanje neke statičke
vrijednosti, već uglavnom za neka izračunavanja.
Ove vrijednosti pri tome ne moraju da budu samo numeričke (integer), već mogu da budu bilo koji tip
podataka. PHP pri tome podržava, osim spomenutog integer-a, i skalarne vrijednosti, stringove i realne
brojeve. PHP, takođe, podržava i dva kompozitna tipa (tipovi sastavljeni od drugih tipova): nizove i objekte.
Naravno, pri tome, svaki od nabrojanih tipova podataka može biti dodjeljen nekoj varijabli ili može biti
vraćen od strane funkcija.
Dosegvarijablifunkcije
Po dosegu varijable dijelimo na:
• lokalne varijable. Vidljive samo unutar funkcije
• globalne varijable- Varijable definirane izvan funkcija, vidljive su unutarcijele datoteke i svih
uključenih datoteka.
Deklaracijasa global $a;– predefinirane globalne varijable (superglobalne varijable). Polja dostupna na bilo
kojem mjestu u svim skriptama.
Includeirequire:korišćenjeeksternihfunkcija
Korištenjem ključne riječi include moguće je uključiti eksternu (vanjsku) datoteku u kojoj je definisana
funkcija koju želimo koristiti
include("mnozenje..php");
$c = Mnozii(3, 4);
Datoteka se može uključiti i upotrebom naredbe require. Ukoliko neme datoteke, prekida se izvršavanje
skripte za razliku od uključivanja s include.
Upotreba naredbi include i require nije ograničena samona uključivanje datoteka koje sadrže funkcije: druge
PHP naredbe, HTML kod ili običan tekst.
37
Definicijasopstvenefunkcije
Funkciја sе dеklаrišе pоmоću klјučnе rеči function.
Funkcije u PHP-u definišemo sljedećom sintaksom bilo gdje u skripti:
<?
function funk($argument1,$argument2…$argumentN){
// … blok naredbi funkcije
}
?>
odnosno, možda je pregledniji i uobičajeniji zapis:
function <identifier>( <parameters>) {
// kod funkcije
return <expression>
}
Rezultatfunkcije
Rezultat funkcije se može koristiti u okviru regularnih izraza:
$guess = rand(1,10);
3.14159*rand(1,10);
echo phpinfo();
$yummy = “piece of ” . substr(“piece”,0,3);
if( is_int($guess) ) ...
Kao rezultat može se dobiti (vratiti) i logička vrijednost (boolean tipa):
• true ako je funkcija operacije izvršila korektno
• false ako funkcija nije obavila željene operacije
if( !writeFile() ) echo “file not written”;
Primjerikreiranjaikorišćenjafunkcija
Primjer: Funkcije sa povratnim rezultatom:
<? function saberi($broj1,$broj2){ $zbir=$broj1+$broj2;
return $zbir;
} // pridruživanje varijabli rezultata funkcije
$suma=saberi(2,2);
// direktan ispis rezultata funkcije
$br1=12;
$br2=22;
echo saberi($br1,$br2);
?>
U ovom primjeru smo umjesto varijabli
$br1 i $br2 koristiti i varijable imena
$broj1 i $broj2. Ovo je moguće zato što
funkciji ne dajemo same varijable već
njihove vrijednosti koje se spremaju u
lokalne (funkcijeske) varijable koje
postoje samo za vrijeme izvođenja
funkcije.
Ukoliko želite funkcijom izmijeniti
sadržaj neke varijable morate ju dati
funkciji pomoću reference (pass by
reference)
Primjer: Davanje funkciji varijablu pomoću reference
<?
function povecaj(&$broj,$vrijednost){
$broj+=$vrijednost;
}
Uočite da nije obavezno koristiti isto
ime varijable u glavnom programu i
funkciji, iako je moguće. Rezultat će u
oba slučaja biti isti.
$neki_broj=12;
povecaj($neki_broj,10);
echo $neki_broj;
?>
38
U PHP-u je moguće proslijediti parametar po referenci i na taj način ga učiniti „mutabilnim“. Mehanizam
je sličan navođenju ključne reči VAR ispred parametra u programskom jeziku Pascal. Znak koji PHP koristi
za referencu je &.
Primjer zamjeni promjenjive
<?php
function zamjeni(&$a, &$b) {
$temp = $a;
$a = $b;
$b = $temp;
}
$a = "Mika";
$b = "Pera";
echo "Pravi redosljed: $a i $b.<br />";
zamjeni($a, $b);
echo "Obrnuti redosljed: $a i $b.<br />";
?>
Primjer: Funkcije sa default vrijednostima
<?php
function frizider($stanje="pun"){
echo "Frizider je $stanje";
}
// ispis default vrijednosti
frizider();
echo "<hr>";
// ispis dane vrijednosti
frizider("prazan");
?>
Rezultat :
Frižider je pun
__________________
Frižider je prazan
Pri radu sa funkcijama koje imaju default vrijednost bitno je da ta vrijednost mora biti konstanta (string ili
broj). Isto tako ukoliko funkcija ima više argumenata od kojih je jedan ili više imaju default vrijednosti oni
moraju biti sa krajnje desne strane liste argumenata iza argumenata bez default vrijednosti.
Pravilno korištenje :
<?php
function automobili($gori,$bolji="Audi"){
echo "$bolji je bolji od $gori";
}
automobili("Peglice");
?>
Ovaj slučaj ne radi:
<?php
function automobili($bolji="Audi",$gori){
echo "$bolji je bolji od $gori";
}
automobili("Peglice");
?>
39
Funkcijezaobradupromjenljivih
gettype()
gettype () funkcija utvrđuje kog je tipa promjenljiva i vraća naziv tipa promjenljive. Naziv tipa
promjenljive može biti sljedeći:
• boolean
• integer
• double
• string
• array
• object
• resource
• NULL
• unknown type - ako je tip promjenljive nepoznat
Evo primjera:
$a= 4.12;
echo gettype($a);
Rezultat će biti: double
Za razliku od funkcije gettype () koja ispituje tipove promjenljivih i koja kao rezultat vraća ime tipa
promjenljive postoje i funkcije koje ispituju tačno određene tipove promjenljivih i vraćaju logički true ako je
promjenljiva tog tipa ili false ako nije. Te funkcije su:
• is_array - utvrdjuje da li je promjenljiva niz
• is_double, is_float, is_real, (sve je to ista funkcija) - ispituje da li je promjenljiva realan broj
• is_long, is_int, is_integer, (takodje je sve to ista funkcija) - ispituje da li je promjenljiva ceo broj
• is_string - ispituje da li je promjenljiva string
• is_object - ispituje da li je promjenljiva objekat
settype()
Funkcija settype () ima sljedeći oblik:
settype ($a, "string");
settype () mijenja tip promjenljive $a iz prvog argumenta u tip promjenljive koji je naveden u drugom
argumentu funkcije koji je pod navodnicima. U našem slučaju je tipa "string". Evo primjer:
$a=4.12;
settype($a, "integer");
echo $a;
Rezultat: 4
Postoje i funkcije koje mijenjaju tip promjenljive u tačno određen tip. Evo tih funkcija:
• intval ($a) - menja vrednost u ceo broj
• doubleval ($a) - menja vrednost promjenjljve u realan broj
• strval ($a) - menja vrednost u string
Ispitivanjeipromjenastanjapromjenljive
Te funkcije su:
• isset ($a) funkcija vraća true ako je promjenljiva definisana a ako nije vraća false.
• unset ($a) čini nedefinisanom promjenljivu $a.
• empty ($a) vraća true ako nije definisana promjenljiva $a ili ako je vrednost promjenljive nula, a u
suprotno ako je vrednost promjenjljve različita od nule i definisana je vraća false.
40
Primjer koji demonstrira kako se iz funkcije operiše nekom globalnom promenljivom:
<?php
$danas = "Utorak";
function dan() {
// varijabla je globalna
global $danas;
$danas = "Nedelja";
// stampaj varijablu
print "Unutar fukcije je $danas pa odmaramo.<br />";
}
// print the variable
print "Prije poziva funkcije je $danas. <br />";
dan();
print "Poslije poziva funkcije je $danas. <br />";
?>
Ukoliko bi se izostavila linija “global $danas” promenljiva $danas bila bi lokalna za funkciju.
Izvršenjem skripta bi se dobilo:
41
Radsastringovima
Stringovi su najčešći tip podataka kojim se barata u PHP-u zbog prirode PHP-a kao alata za izradu HTML
stranica na serveru. Iz ovog vrlo logičnog razloga bitno je znati baratati sa njima i manipulirati njihovim
sadržajem. U PHP-u se nalaze već gotove funkcije koje automatiziraju većinu operacija koje su potrebne za
manipuliranje i rad sa sadržajem string podataka.
Tehnika1:Izbacivanjenepotrebnog'bijelogprostora'izstringa
Ponekada pri radu sa stringovima, a posebno pri obradi podataka iz formi, podatci u sebi sadrže nepotrebne
razmake na početku ili kraju stringa. Pod razmacima se podrazumijevaju : razmak od jednog mjesta(space),
tab razmak od više spaceova (escape znak \t), znak za novi red na kraju reda (escape znak \n)
Treba obratiti pozornost na to da se nepotrebni prazni prostor i rezultati escape znakova ne vide u HTML
pogledu dokumenta već tek kada pogledate source dokumenta ili ukoliko se nalaze unutar <pre>…</pre>
tagova za prikaz predformatiranog teksta.
Pogledajmo neke primjere:
Izbacivanjenepotrebnogpraznogprostoraizstringa
<?php
$str_glavni=" \tOvo je string \nsa puno praznog prostora \n";
/* ispis stringa na ekran - prikazuje se normalno na ekran,
ali u source pogledu su razmaci vidljivi*/
echo $str_glavni;
// ispis stringa u <pre> tag. Sada su razmaci vidljivi
echo "<pre>$str_glavni</pre>\n";
// izbacivanje praznog prostora sa pocetka stringa
$str_bez_pocetka=ltrim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na pocetku stringa</h4>\n";
echo "<pre>$str_bez_pocetka</pre>\n";
// izbacivanje praznog prostora sa kraja stringa
$str_bez_kraja=rtrim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na kraju stringa</h4>\n";
echo "<pre>$str_bez_kraja</pre>\n";
// izbacivanjepraznog prostora iz cijelog stringa
$str_bez_praznina=trim($str_glavni);
echo "<hr>\n";
echo "<h4>String bez praznog prostora na kraju i pocetku stringa</h4>\n";
echo "<pre>$str_bez_praznina</pre>\n";
?>
Objašnjenje:
U ovom primjeru su korištene tri funkcije za izbacivanje praznina sa početka i kraja stringa.
Prva je ltrim(string)
• ltrim izbacuje praznine i escape znakove sa lijeve strane (početka) stringa
Druga je rtrim(string)
• rtrim izbacuje praznine i escape znakove sa desne strane (kraja) stringa
Treća je trim(string)
• trim izbacuje praznine i escape znakove sa obje strane stringa
Ove funkcije mogu izbaciti praznine samo sa početka i kraja striga dok one unutar stringa ostaju na svom
mjestu. Ukoliko njih želite izbaciti moraćete koristiti druge metode poput explode() funkcije.
42
Tehnika2:Traženjeznakailistringaunutarstringa
PHP je opremljen funkcijama za pretraživanje string tipova podataka na više načina i metoda.
Najjednostavnija metoda je korištenjem string funkcija, a sintaktički malo kompliciraniji način je
korištenjem Regular expresiona. U ovoj tehnici je objašnjeno korištenje string funkcija.
Pretraživanjestringa
<?
$string="Ovo je tekst u kojem se trazi neka rijec. Sastoji se od vise recenica.\nTakoder ima i dva reda
ilustracije radi";
$trazeni="je";
// ispis stringa kakav je
?>
<h3>Originalni string</h3>
<?
echo $string;
echo "<hr>\n";
?><h3>Traženje stringa ili znaka unutar zadanog stringa</h3><?
// trazenje nekog stringa ili znaka unutar stringa
$str_pretraga=strstr($string,$trazeni);
echo $str_pretraga;
?>
Objašnjenje:
U gornjem primjeru je za pretraživanje korištena funkcija strstr($str_zadani,$str_trazeni)
Njoj se kao prvi argument daje string u kojem želimo naći neku vrijednost i kao drugi joj dajemo vrijednost
koju tražimo. Ukoliko postoji tražena vrijednost rezultat je ostatak stringa zajedno sa pronađenom vrijednosti
na početku rezultata. Svi znakovi prije pojavljivanja su izbačeni.
Napomena : Ukoliko želimo ponovno koristiti ovaj 'skraćeni' string za ponovnu pretragu uvijek ćemo dobiti
isti rezultat jer se nađeni string ili znak ne izbacuje iz rezultat već se stavlja na početak. Ukoliko želite opet
pretražiti ovaj string
Provjerapostojanjastringailiznakaunutarstringa
<hr>
<h3>Ispitivanje postojanja stringa ili znaka unutar zadanog stringa</h3>
<?php
// provjeravanje da li postoji string ili znak unutra stringa
if($str_pretraga=strstr($string,"zzz")){
echo "Pronaden je string ili znak<br>".$str_pretraga;
} else {
echo "Trazeni string ili znak ne postoji u stringu";
}
?>
Objašnjenje:
if($str_pretraga=strstr($string,"zzz")){...
Ovom linijom ispitujemo da li se tražena vrijednost nalazi u danom stringu. U isto vrijeme rezultat
spremamo u varijablu za kasnije korištenje. Ovo je u potpunosti legalno ispitivanje jer funkcija strstr( ) vraća
False ukoliko tražena vrijednost nije pronađena. Ovime se u varijablu sprema vrijednost False koju
provjerava if struktura i izvršava se njen else blok koda. U slučaju da je vrijednost pronađena u varijablu se
sprema rezultat funkcije koji if struktura gleda kao na true rezultat izraza u uslovu.
43
Pozicijaznaka
Pronalaženje pozicije prvog pojavljivanja znaka ili stringa u stringu i ispis ukupnog broja pojavljivanja.
<hr>
<h3>Ispisivanje pozicije pronadenog stringa ili znaka unutar zadanog stringa</h3>
<?php
// ipsisivanje pozicije prvog nalazenja trazenog strina unutar zadanog stringa
$int_pozicija=strpos($string,$trazeni);
echo $int_pozicija;
?>
<hr>
<h3>Ukupan broj pojavljivanja traženog znaka ili stringa</h3>
<?php
// racunanje broja pojavljivanja nekog stringa ili znaka unutar stringa
$suma=substr_count($string,$trazeni);
echo "Broj pojavljivanja :$suma";
?>
Objašnjenje:
<hr> tag (horizontalna linija)
// ipsisivanje pozicije prvog nalazenja trazenog strina unutar zadanog stringa
$int_pozicija=strpos($string,$trazeni);
echo $int_pozicija;
U ovom dijelu koda ispisujemo prvu poziciju pronađenog stringa u zadanom stringu. Za to se koristi
funkcija strpos($str_zadani,$str_trazeni);
Funkcija vraća integer vrijednost koja predstavlja poziciju prvog znaka traženog stringa unutar zadanog
stringa. Ukoliko trazeni string ne postoji unutar zadanog stringa funkcija vraća vrijednost False.
Napomena : Brojanje pozicije kreće od 0!!!
// racunanje broja pojavljivanja nekog stringa ili znaka unutar stringa
$suma=substr_count($string,$trazeni);
echo "Broj pojavljivanja :$suma";
Ovaj blok naredbi računa i ispisuje ukupan broj pojavljivanja traženog stringa unutar zadanog stringa.
Za računanje se koristi funkcija substr_count($str_zadani,$str_trazeni)
Funkcija vraća inteher vrijednost koja reprezntira ukupan broj pojavljivanja traženog stringa unutar zadanog
stringa. Funkcija vraća 0 ukoliko nema pojavljivanja. Ovo se interpretira kao False vrijednost unutar if
strukture.
Izvlačenjetačnoodređenogdijelastringa
<hr>
<h3>Ispisivanje tacno odredenog dijela stringa</h3>
<?php
// ispisvanje prvih 4 znaka stringa
$str_izvuceni=substr($string,0,4);
echo "Prva 4 znaka stringa : '$str_izvuceni'<br>";
// ispisivanje zadnja 4 znaka stringa
$str_izvuceni=substr($string,-4,4);
echo "Zadnja 4 znaka stringa : '$str_izvuceni'<br>";
// ispisivanje 10 znaka stringa
$str_izvuceni=substr($string,10,1);
echo "Deseti znak stringa : '$str_izvuceni'<br>";
// ispis 15 i svih ostalih znakova do kraja stringa
$str_izvuceni=substr($string,15);
echo "Svi znakovi od 15. znaka: '$str_izvuceni'<br>";
?>
Objašnjenje:
Za izvlačenje tačno određenog dijela stringa koristi se funkcija
substr($str_zadani, $int_pocetna_pozicija, $int_broj_znakova)
44
Postoji više načina primjene ove funkcije, zavisno o komadu stringa kojeg želimo izvući.
// ispisvanje prvih 4 znaka stringa
$str_izvuceni=substr($string,0,4);
echo "Prva 4 znaka stringa : '$str_izvuceni'<br>";
Ovim načinom vadimo znakove od nultog znaka pa četiri sljedeća znaka. Ukoliko je potrebno izvući
znakove sa kraja stringa funkciji dajemo kao početnu poziciji negativni broj.
// ispisivanje zadnja 4 znaka stringa
$str_izvuceni=substr($string,-4,4);
echo "Zadnja 4 znaka stringa : '$str_izvuceni'<br>";
Ovime govorimo PHP-u da počne izvlačiti znakove za zadanu vrijednost od kraja stringa, te da izvuče
onoliko znakova od te pozicije koliko je zadano trećim argumentom.
Ukoliko treći argument ne postoji vraćaju se svi preostali znakovi od zadane pozicije do kraja stringa.
// ispis 15 i svih ostalih znakova do kraja stringa
$str_izvuceni=substr($string,15);
echo "Svi znakovi od 15. znaka: '$str_izvuceni'<br>";
Ukoliko je potrebno izvući samo jedan znak iz stringa funkciji kao treći argument dajemo 1 što će izvući
samo znak sa zadane pozicije iz drugog argumenta.
// ispisivanje 10 znaka stringa
$str_izvuceni=substr($string,10,1);
echo "Deseti znak stringa : '$str_izvuceni'<br>";
U ovom slučaju smo mogli koristiti i drugu metodu koja je u nekim situacijama jednostavnija i praktičnija.
Naime, string možemo zamisliti kao niz znakova i kako takvom možemo pristupati svakom znaku preko
njegovog indeksa. Pozicije znakova tj. indeksi kreću od 0
// ispis 10 znaka stringa
echo $string[10];
Ova metoda se koristi kada želimo provjeravati svaki znak u stringu posebno. Da bi izvršili ovakav način
šetnja kroz string možemo koristiti dvije metode.
Prva je korištenjem for petlje:
$duljina=strlen($string);
for ($i=0;$i<$duljina;$i++){
echo "[$i]=>".$string[$i]."<br>";
}
Da bi znali koliko se for petlja puta mora ponoviti moramo znati dužinu strniga. Nju dobijemo preko
funkcije strlen($string) koja vraća integer vrijednost.
Drugi način je korištenjem while petlje.
$i=0;
while ($string[$i]){
echo "[$i]=>".$string[$i]."<br>";
$i++;
}
While petlji kao uslov ponavljanja dajemo jedan znak iz stringa. Petlja će se izvršavati sve dok postoji neki
znak na danom indeksu, a prekinuće se kada se na danom indeksu više ne nalazi znak.
Problem kod ovog načina je taj što će se petlja prestati izvršavati ukoliko se na danom indeksu nalazi 0
(nula) čime ova metoda nije pogodna za sigurno šetanje kroz string.
45
Nekefunkcijezaradsanizovima
Dodavanje i brisanje na početku i na kraju niza
Funkcija array_push dodaje jedan ili više elemenata na kraj niza:
int array_push ( array &$array, mixed $var [, mixed $... ] )
<?php
$hrana = array('sarma','cvarci');
// dodaje dva elementa nizu $hrana
array_push($hrana, 'corbast pasulj','zeljanica');
print_r($hrana);
?>
Funkcija array_pop() uzima element sa kraja niza:
mixed array_pop ( array &$array )
<?php
$hrana = array('sarma','cvarci', 'batak','kajmak');
echo array_pop($hrana) . '<br/>';
print_r($hrana);
?>
echo kao nešto ćopa skraja, a print_r služi nešto kao leskovački voz.
Pored dodavanja elemenata na kraj niza i skidanja elemenata sa kraja niza, postoji mogućnost da se isto
to učini i na početku niza, i to pomoću funkcija array_shift i array_unshift:
mixed array_shift ( array &$array )
int array_unshift ( array &$array, mixed $var [, mixed $... ] )
Sortiranje niza sort/rsort
<?php
// defnisi CSV string (Comma Separated
Values)
$boje = array('plava', 'zelena',
'crvena', 'bijela', 'crna');
// vraca niz sortiran abecednim redom
sort($boje);
print_r($boje);
print "<br />";
// vraca niz sortiran reverznim poretkom
rsort($boje);
print_r($boje);
?>
Međutim, funkcija sort() prilikom sortiranja asicijativnog niza postavlja cjelobrojne indekse, što
uglavnom nije ono što se želi kada se govori o sortiranju asocijativnog niza:
<html>
<head></head>
<body>
<ul>
<?php
$skracenice["SAD"]="Sjedinjene Americke Drzave";
$skracenice["MS"]="Masacusec";
$skracenice["CA"]="Kalifornija";
$skracenice["RS"]="Republika Srbija";
Rezultat:
46
$skracenice["BA"]="Bosna i Hercegovina";
sort($skracenice);
foreach($skracenice as $kljuc => $vrednost) {
echo "<li>$kljuc = $vrednost </li>";
}
?>
</ul>
</body>
</html>
Dužinaniza
Dužina niza $anArray je rezultat funkcije count($anArray) ili sizeof($anArray).
Često se koristi u okviru petlji:
$counter=0;
while( $count < sizeof($anArray) ) {
echo “element $counter is
{$anArray[$counter]}”;
$counter++;
}
Rezanjeilijepljenjestringa
korištenje funkcija explode (podjeli/reži) i imlode (lijepi/sastavi)
Primjer ljepljenja stringa iz niza
<?php
$string="Ovo je string kojeg ćemo izrezati na više dijelova";
// rezanje stringa
$arr_izrezani=explode(" ",$string);
foreach($arr_izrezani as $kljuc => $vrijednost){
echo $kljuc . " => " . $vrijednost . "<br>\n";
}
?>
<hr>
<?php
// lijepljenje stringa iz niza
$arr_stringovi=array("Ovo","je","string","kojeg","ćemo","zalijepiti");
$zalijepljeni=implode(" ",$arr_stringovi);
echo $zalijepljeni;
?>
Objašnjenje:
// rezanje stringa
$arr_izrezani=explode(" ",$string);
Ovaj fragment koda reže zadani string na taj način da podijeli zadani string na fragmente na taj način da je
svaki novi fragment dio originalnog stringa između dva znaka koji smo dali kao uslov razdvajanja u prvom
argumentu funkcije. Svi novi fragmenti se spremaju u niz u kojem indeksi odgovaraju rednom broju
fragmenta.
Da ovo malo ilustrujem na praktičnom primjeru:
// razdjeljivanje e-maila
$email='[email protected]';
$arr_fragemnti=explode('@',$email);
47
echo 'nick : ' . $arr_fragemnti[0]; // ispisivanje imena iz e-mail adrse
echo 'domena : ' . $arr_fragemnti[1]; // ispisivanje domene e-mail adrese
Za fragmentiranje stringa se koristi funkcija explode($str_uslov_razdvanjanja,$string_koji_se_razdvaja)
Funkcija prima kao prvi argument znak ili niz znakova koji služe za stvaranje fragmenata. Fragmenti će
sadržavati sadržaj danog stringa u drugom argumentu koji se nalazi između dva ponavljanja prvog
argumenta. Rezultat funkcije je niz koji sadrži nastale fragmente, a ukoliko se u danom stringu ne nalazi
znak ili niz znakova kojim dijelimo string rezultat će biti niz koji sadrži originalni string u cijelosti na svom
nultom indeksu.
// lijepljenje stringa iz niza
$arr_stringovi=array("Ovo","je","string","kojeg","ćemo","zalijepiti");
$zalijepljeni=implode(" ",$arr_stringovi);
echo $zalijepljeni;
Suprotni proces bi bio lijepljenje niza u novi string. Ovo je moguće korištenjem funkcije
implode($str_lijepilo,$arr_niz_koji_se_lijepi);
Funkcija uzima sve elemente niza iz drugog argumenta i spaja ih tako da zalijepi dva susjedna elementa niza
pomoću stringa iz prvog argumenta.
??
Zа lаkšе rukоvаnjе nizоvimа, nа rаspоlаgаnju su nаprеdnе funkciје. Funkciја list() dоdеlјuје vrijеdnоsti
еlеmеnаtа nizа, prоmеnlјivаmа iz listе аrgumеnаtа[42]
<?php
$picha = array("kаfа", "čај", "sоk");
list($piche1, $piche2, $piche3) = $piche; // dоdеlјuје vrijеdnоsti:
// $piche1 = "kаfа", $piche2 = "čај" $piche3 = "sоk"
list( , , $moje_piche) = $piche; // dоdеlјuје vrijеdnоst $moje_piche = ”sоk”
?>
Funkciја array_walk(), prоlаzi cijeli niz i vrаćа vrijеdnоsti svih njеgоvih еlеmеnаtа, bеz klјučеvа.
array_flip(), zаmеnjuје vrijеdnоsti klјučеvа sа njihоvim vrijеdnоstimа, а u slučајu аsоciјаtivnоg nizа,
istоvrеmеnо rаdi i оbrnutо: zаmеnjuје svе vrijеdnоsti еlеmеnаtа nizа vrijеdnоstimа njihоvih klјučеvа. [43]
Zа dоdеlјivаnjе vrijеdnоsti оdrеđеnim еlеmеntimа nizа kоristi sе funkciја array_fill().[44]
<?php
$a = array ("a" => "јаbukа", "b" => "bаnаnа", "v" => array ("kаrаmаnkа", "kаluđеrkа", "vilјаmоvkа"));
print_r ($a);
// rеzultаt štаmpа u оbliku
// [а] => јаbukа
// [b] => bаnаnа
// [v] => Array
// (
// [0] => kаrаmаnkа
// [1] => kаluđеrkа
// [2] => vilјаmоvkа
// )
array_walk($a);
// vrаćа rеzultаt
// јаbukаbаnаnаkаrаmаnkаkаluđеrkаvilјаmоvkа
?>
48
Vježbe:P
PHPdateexercisess
Rad sa datumima je
j često neop
phodan pa oovdje dati priimjeri predsttavljaju osnoov za
kasn
niji ozbiljan rrad.
U funkciji ddate() obavezzno je navestti format vrem
mena i datum
ma. U tu svrh
hu koriste se predefiniran
na slova,
npr:
d – dan u m
mjesecu, brojččano (01-31))
m – tekući m
mjesec, brojččtano (01-12)
Y – tekuća ggodina, četveroznamenkaasto
U format see mogu upisaati i znakovi “/”, “.” i dr,
Primjer skriipta:
Mogućći rezultat ovve skripte:
<?php
echo date
e("Y/m/d")
);
echo "<br
r />";
echo date
e("Y.m.d")
);
echo "<br
r />";
echo date
e("Y-m-d")
);
?>
Za vraćanjee sistemskog vremena i daatuma koristti se funkcijaa mktime()
Sintaksa:
hour,minu
ute,second,month,d
day,year,
,is_dst)
mktime(h
Npr. ako želimo ispisatii sutrašnji datum:
<?php
$tomorro
ow = mkti
ime(0,0,0,date("m"
"),date("
"d")+1,da
ate("Y"))
);
echo "Su
utra je “ . date("d/m/Y", $tomorro
ow);
?>
Mogući rezuultat skripte::
Sutra je
e 14/05/2015
Analiziraj oovdje date priimjere:
Create a sim
mple 'birthdayy countdown
n' script, the script will co
ount the num
mber of days between currrent day andd
birth day.
<?php
$target_day
ys = mktime
e(0,0,0,05,31,2015);// m
modify the birth
b
day 12/
/31/2013
$today = time();
$diff_days = ($target_d
days - $toda
ay);
$days = (in
nt)($diff_day
ys/86400);
print "Days till next birtthday: $days days!";
?>
Write a PHP
P script to caalculate the difference
d
beetween two dates.
d
Sample datees : 1981-11-04, 2013-09
9-04
Expected Reesult : 31 yeaars, 10 montths, 11 days
<?php
$sdate = "1
1981-11-04"";
$edate = "2
2013-09-04"";
$date_diff = abs(strtotime($edate)) - strtotime(($sdate));
$years = flo
oor($date_d
diff / (365*60
0*60*24));
$months = floor(($date
e_diff - $yea
ars * 365*60
0*60*24) / (30*60*60*
(
24));
$days = flo
oor(($date_d
diff - $years * 365*60*6
60*24 - $mo
onths*30*60*60*24)/ (6
60*60*24));;
printf("%d years, %d months,
m
%d days", $yea
ars, $months
s, $days);
?>
49
Write a PHP script which will display the copyright information in the following format. To get current year
you can use date() function
Expected Format : © 2015 PHP Exercises - w3resource
<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Copyright Information</title>
</head>
<body>
<p>&copy; <?php echo date('Y'); ?> PHP Exercises - w3resource</p>
</body>
</html>
Write a PHP script to add/subtract number of days from a particular date
<?php
$dt='2011-01-01';<br/>echo 'Original date : '.$dt.'<br />';
$no_days = 40;
$bdate = strtotime("-".$no_days." days", strtotime($dt));
$adate = strtotime("+".$no_days." days", strtotime($dt));
echo 'Before 40 days : '.date("Y-m-d", $bdate).'<br />';
echo 'After 40 days : '.date("Y-m-d", $adate).'<br />';
?>
Write a PHP script to convert seconds into days, hours, minutes and seconds.
Sample seconds : 200000
Expected output : 2 days, 7 hours, 33 minutes and 20 second
<?php
function convert_seconds($seconds)
{
$dt1 = new DateTime("@0");
$dt2 = new DateTime("@$seconds");
return $dt1->diff($dt2)->format('%a days, %h hours, %i minutes and %s seconds');
}<
echo convert_seconds(200000)
?>
Write a PHP script to increment date by one month
Sample date : 2012-12-21
Expected Output : 2013-01-21
<?php
$dt = strtotime("2012-12-21");
echo date("Y-m-d", strtotime("+1 month", $dt));
?>
Write a PHP script to get the number of days of the current month.
<?php
echo 'Number of days for the month of '.date('M'). ' is :' .date('t');
?>
50
Radsanizovima
Nizovi su osnovni tip elementa koji se vrlo često susreće u radi sa bazama podataka. Naime, kada se izvrši
upit na bazu vraćeni rezultat je niz. Zato je potrebno znati baratati nizovima i shvatiti njihovu logičku
strukturu.
Osnovne operacije nad nizovima su šetanje kroz niz, sortiranje niza, pretraživanje niza te lijepljenje niza u
string što je već objašnjeno u prethodnom poglavlju.
Šetanjekrozjednodimenzionalniniz
<?php
// a) setanje kroz jednodimenzionalni niz.
$arr_valute=array("USD","EUR","GBP","KMB");
foreach ($arr_valute as $kljuc=>$vrijednost)
echo "[$kljuc] => $vrijednost <br>";
?>
Objašnjenje:
Ovo je tehnika koja bi već trebala biti poznata jer je korištena kroz cijeli vodič za ispisivanje sadržaja niza.
Za šetanje smo koristili foreach petlju koja u svakom svom ponavljanju uzima novi element iz niza. Uzima
ih od manjeg indeksa prema večem.
Isti ovaj učinak se može postići na više raznih načina, od kojih je jedan da prvo provjerimo ukupan broj
elemenata niza te for petljom prošećemo kroz niz.
for($i=0;$i<count($arr_valute);$i++)
echo "[$i] => $arr_valute[$i] <br>";
Da bi saznali broj elemenata u nizu koristili smo funkciju count($arr_niz) koja vraća ukupan broj elemenata
varijable. Ova tehnika kao što se može vidjeti iz gornjeg primjera radi savršeno za jednodimenzi sa
numeričkim indeksima.
Šta ako se radi o asocijativnom nizu?
U tom slučaju će prva metoda šetanja pomoću foreach petlje raditi savršeno, ali postoje i alternative. Naime,
u PHP-u možemo sami određivati koji element niza želimo obrađivati pomoću internog pointera niza.
Pointer niza zamislite kao strelicu koja nam pokazuje na kojem se elementu niza nalazimo u danom trenutku.
Osnovne funkcije ovakvog načina rada su pomicanje sljedeći – prijašnji te pribavljanje trenutnog indeksa i
vrijednosti. Ovom metodom se šetanje obavlja na sljedeći način:
Šetanjekroznizkorištenjempointeraniza
// Asocijativni niz
$arr_assoc=array(
"USD" => 9,
"EUR" => 8,
"GBP" => 10,
"KMB" => 1);
reset($arr_assoc); // resetiranje niza na pocetak
do{
$kljuc=key($arr_assoc); // pribavlajnje klljuca
$vrijednost=current($arr_assoc); // pribavljanje
echo "[$kljuc] => $vrijednost <br>";
} while (next($arr_assoc));
Objašnjenje:
Ovaj primjer je univerzalno šetanje kroz jednodimenzionalni niz, iako postoje i druge slične metode. Da bi
bili sigurni da će šetanje uvijek početi od prvog unesenog elementa potrebno je prije petlje koja obavlja
šetanje vratiti pokazivač niza na početni elemente – resetirati ga. To obavlja funkcija reset($arr_niz).
51
Druga bitna stvar koju je potrebno uočiti u ovom primjeru je korištenje do..while petlje. Ona je korištena
zbog svoje osobine da se njen blok naredbi uvijek izvrši barem jednom prije provjeravanja uslova
ponavljanja.
U samoj petlji izlučujemo indeks i vrijednost elementa na kojeg trenutno pokazuje pokazivač (pointer) niza.
Za svako ponavljanje petlje pokazivač se prenosi za jedno mjesto unaprijed. Redosljed kojim se pokazivač
pomiče je u slučaju asocijativnog niza po redu unosa (prije unesene vrijednosti su na redu prije od kasnije
unesenih vrijednosti). Ovo pravilo ne vrijedi nakon sortiranja niza. Nakon njega redoslijed kretanja
pokazivača je onakav kako ga je namjestilo sortiranje.
Za izdvajanje (izlučivanje) trenutnog ključa koristi se funkcija key($arr_niz), a za trenutnu vrijednost se
koristi funkcija current($arr_niz)
Kao uslov ponavljanje do … while petlje primjer koristi funkciju next($arr_niz).
Funkcija prebacuje pokazivač niza na sljedeći element u nizu, a ukoliko ne postoji sljedeći element funkcija
vraća False i petlja se prestaje izvršavati.
Suprotna radnja od ove bi bilo ispisivanje elemenata niza od zadnjeg prema prvom. Ovo se izvode tako da se
niz prvo namjesti na zadnji element pomoću funkcije end($arr_niz) , a u uslovu ponavljanja petlje se
koristi funkcija prev($arr_niz) koja pomiče pokazivač niza za jedno mjesto unazad.
Šetanjekrozmultidimenzionalninizkorišćenjempozivafunkcije
key/current/next/end
Primjer koristi rekurzivno pozivanje funkcije
<?php
// funkcija za setanje kroz niz
function proseci($niz,$pomak=0){
echo "<pre>";
foreach ($niz as $kljuc => $vrijednost){
for ($i=0;$i<$pomak;$i++)
echo "\t";
if (is_array($vrijednost)){
echo "[$kljuc] => \n";
proseci($vrijednost,$pomak+1);
} else {
echo "[$kljuc] => $vrijednost\n";
}
}
echo "</pre>";
}
// nas niz
$arr_multidim=array(
0 => array("francuz","bijeli","polubijeli","crni","kifla"),
1 => array(3.5, 5, 4, 3, 0.5),
"kasa" => 500
);
// poziv setanja kriz niz
proseci($arr_multidim);
?>
Objašnjenje:
Ovo je malo kompleksniji primjer zbog korištenja rekurzivnog zvanja funkcije sa default vrijednosti
argumenta. Uz to, pri izradi funkcije je uzet u obzir i krajnji izgled rezultata. Razlog ovome je očit. Bez
formatiranog ispisa bilo bi vrlo teško odgonetnuti koji ključ (indeks) pripada kojoj dimenziji niza.
52
Zanimljiva stvar koju možete primijetiti kod ovog multidimenzionalnog niza je da se u PHP-u mogu
kombinovati razni tipovi niza (numerički i asocijativni) te da nema predodređenog tipa vrijednosti u nizu za
cijeli niz. Vrijednosti unutar jednog niza mogu varirati po volji programera ili potrebi same skripte.
Idemo pogledati funkciju.
function proseci($niz,$pomak=0){
echo "<pre>";
foreach ($niz as $kljuc => $vrijednost){
for ($i=0;$i<$pomak;$i++)
echo "\t";
if (is_array($vrijednost)){
echo "[$kljuc] => \n";
proseci($vrijednost,$pomak+1);
} else {
echo "[$kljuc] => $vrijednost\n";
}
}
echo "</pre>";
}
Ovdje se radi se o funkciji sa default argumentom. Riječ je o argumentu $pomak. Prvo da pokušamo ukratko
opisati šta radi ova funkcija.
Očito je da funkcija kao ulazni parametar prima niz, nebitno koje dimenzije, te stvara formatirani ispis tog
niza. Za formatiranje su korišteni tzv. escape znakovi \n za novi red i \t za tabulatore. Iz tog razloga je
potrebno sav ispis umetnuti između <pre> … </pre> tagova jer bi u protivnom cijeli ispis bio u jednom redu.
Ispis se formatira na taj način da se svaka nova dimenzija niza ispisuje za jedno 'tabulatorsko' mjesto
udesno. I ovdje dolazi defaultni argument na djelo. Pomoću njega govorimo funkciji u kojoj se dimenziji
nalazimo tj. za koliko mjesta treba pomaknuti ispis udesno. Bez ovog pomicanja bilo bi teško odrediti
pripadajuće dimenzije i indekse pošto se ponavljaju za svaku dimenziju. Istina, funkcija se mogla riješiti i
bez defaultnog argumenta, ali radi jednostavnosti, razumljivosti i čistine krajnjeg koda je ipak upotrijebljen.
Ovako se u glavnom programu funkciji daje samo niz, a funkcija se sama brine za formatiranje ispisa.
Sada kada je svrha i funkcija funkcije opisana idemo se pozabaviti njenom logikom. Pošto funkcija ispisuje
niz logično je da ćemo se prošetati nizom. Najjednostavniji način za to je foreach petljom. Sljedeća stvar
koju je potrebno napraviti je utvrditi kojeg je tipa trenutni element niza.
Nas zanimaju dva tipa. Niz i neniz. Ukoliko se radi o nizu njega je potrebno ispisati na isti način kao i
njegovog roditelja, tj. dimenziju u kojoj se on nalazi. Ukoliko se ne radi o nizu želimo ispisati vrijednost na
ekran.
Za ispitivanje tipa varijable postoji asortiman funkcija za tu namjenu.
Nama je potrebana funkcija is_array($varijabla) koja, kako joj ime govori, ispituje da li je zadana
varijabla niz. Ukoliko je niz, rezultat je true, a u suprotnom je rezultat false.
if (is_array($vrijednost)){
echo "[$kljuc] => \n";
proseci($vrijednost,$pomak+1);
}
Ovaj blok koda se izvršava ukoliko je trenutna vrijednost niz. On ispisuje trenutni ključ (indeks) na kojem se
nalazimo i prenosi ispis u novi red. Sljedeći korak je pozivanje ove iste funkcije, ali ovog puta joj dajemo
drugi argument.
Sada je bitno razumjeti zašto služi drugi, default argument. Pomoću njega formatiramo ispis. On
označava pomak udesno naspram trenutnog pomaka. Pomak se realizira for petljom prije bilo kakvog ispisa
u foreach petlji. Ovime osiguravamo da će svaki element dimenzije, ukoliko nije niz biti ispisan na istom
pomaku, ili ukoliko je niz njegov indeks će biti u tom pomaku, a njegovi elementi će opet biti pomaknuti za
jedno mjesto udesno.
for ($i=0;$i<$pomak;$i++)
echo "\t";
Drugim riječima, argumentom $pomak govorimo skripti koliko se duboko nalazimo u nizu.
} else {
echo "[$kljuc] => $vrijednost\n";
}
U slučaju da element niza nije i sam niz, ispisuje se njegova vrijednost i indeks te se ispis prenosi u novi
red.
53
Pretraživanjenizasaarray_search
Niz :<br>
<?<?php
$arr_mailovi=array(
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]",
"[email protected]"
);
// ispisivanje niza
foreach ($arr_mailovi as $mail){
echo $mail ." <br>";
}
$str_trazeni="[email protected]";
?>
<hr>
String koji se traži :<?=$str_trazeni?><br>
<?php
// traženje vrijednosti u nizu i vracanje indeksa na kojem se nalazi vrijednost
if ($nadeni=array_search ($str_trazeni,$arr_mailovi) or $nadeni===0){
echo
"Pronađen
je
element
u
nizu
na
indeksu
$nadeni
=>
$arr_mailovi[$nadeni]<br>";
} else {
echo "Traženi string ne postoji u nizu<br>";
}
?><hr><?
//pretraživanje cijelog niza i ispis svih indeksa - FALIENO
while ($nadeni=array_search ($str_trazeni,$arr_mailovi) or $nadeni===0){
echo "Pronađeno na poziciji : $nadeni => $arr_mailovi[$nadeni]<br>";
unset ($arr_mailovi[$nadeni]);
}
?>
Objašnjenje:
U ovom primjeru cilj nam je izdvojiti zadani e-mail iz niza koji sadrži popis e-mailova. E-mail koji tražimo
se zadaje u varijablu $str_trazeni.
Prvi način pretraživanja pronalazi samo prvo pojavljivanje u nizu, a ostala su zanemarena.
// traženje vrijednosti u nizu i vracanje indeksa na kojem se nalazi vrijednost
if ($nadeni=array_search ($str_trazeni,$arr_mailovi) or $nadeni===0){
echo "Pronadjen je element u nizu na indeksu $nadeni => $arr_mailovi[$nadeni]<br>";
} else {
echo "Traženi string ne postoji u nizu<br>";
}
Za traženje vrijednosti u nizu koristi se funkcija array_search($trazeno,$niz_za_pretraziti):
Funkcija prima dva obavezna argumenta. Prvi argument je vrijednost koja se traži, a drugi je niz u kojem se
traži vrijednost. Postoji i treći, neobavezni, argument koji može biti true ili false. On služi ukoliko se želi
uporediti i tip podataka. Recimo $int_broj=111 i $str_broj='111' u slučaju da je treći argument postavljen na
true ne bi rezultiralo pronalaženjem vrijednosti u nizu.
Funkcija će vratiti indeks na kojem je pronađena vrijednost, a ukoliko tražena vrijednost ne postoji vraća se
False.
Primijetite uslov koji se nalazi u if strukturi :
54
($nadeni=array_search ($str_trazeni,$arr_mailovi) or $nadeni===0)
Prvo u varijablu $nadeni spremamo rezultat traženja. U nju će se spremiti indeks na kojem je pronađena
vrijednost ili False. Drugi uslov provjerava da li je ta vrijednost slučajno broj 0. Ovo je potrebno zato što
ukoliko se tražena vrijednost nalazi na indeksu 0 if struktuta taj rezultat tretira kao False i obavlja se else
grana if-a. Znači da bi se bez drugog uslova nulti elemnt niza zanemarivao pri pretraživanju. Uslov
$nadeni===0 provjerava da li je rezultat funkcije broj nula ili vrijednost false. Ukoliko je broj nula ipak
će se obaviti true grana if-a i ovime je zagarantirana tačnost pretraživanja.
Ali naš niz sadrži dvije iste vrijednosti na indeksima 0 i 2. Prijašnji kod neće pretražiti cijeli niz već će stati
nakon prvog pronalaženja.
Da bi pretražili cijeli niz očito je da je potrebno koristiti neku ponavljačku petlju.
//pretraživanje cijelog niza i ispis svih indeksa - FALICNO
while ($nadeni=array_search ($str_trazeni,$arr_mailovi) or $nadeni===0){
echo "Pronadjeno na poziciji : $nadeni => $arr_mailovi[$nadeni]<br>";
unset ($arr_mailovi[$nadeni]);
}
Za ovaj slučaj while petlja je vrlo praktična. Ona će se ponavljati sve dok u nizu postoji tražena vrijednost.
Ako se pitate kako se petlja neće ponavljati u beskonačnost zato što je u prošlom primjeru rečeno da se ona
zaustavlja nakon pronalaska prvog pojavljivanja, dobro se pitate. Naime, petlja će uvijek pronaći samo prvo
pojavljivanje i vrtiti će se u beskonačnost. Da bi izbjegli ovo ponavljanje potrebno je nakon što pronađemo
traženu vrijednost nju i izbaciti iz niza tako da sljedeće ponavljanje petlje pretražuje ostatak niza.
Element iz niza se izbacuje unset($var) funkcijom.
Funkcija unset() uništava danu varijablu. Nju se više ne može kasnije koristiti u skripti. Ukoliko je potrebno
izbaciti samo jedan element niza funkciji dajemo taj niz sa željenim indeksom ($arr_niz[16]) i on će biti
izbačen.
U primjeru se element izbacuje ovim redom
unset ($arr_mailovi[$nadeni]);
Ova metoda je falična zato što nakon što pretražimo niz u njemu se neće nalaziti pronađene vrijednosoti, pa
ih se time ne može koristiti kasnije u skripti. Ovo se može izbjeći korištenjem funkcije koja će obaviti
traženje što je objašnjeno u sljedećem primjeru:
Pretraživanjenizasavišepojavljivanjatraženevrijednosti
<?php
// traženje ponovljenih vrijednosti pomocu funkcije
function trazi($vrijednost,$niz){
while ($nadeni=array_search ($vrijednost,$niz) or $nadeni===0){
echo "Pronađeno na poziciji : $nadeni => $niz[$nadeni]<br>";
unset ($niz[$nadeni]);
}
}
// provjeranje postojanja tražene vrijednosti u nizu
if (in_array($str_trazeni,$arr_mailovi)){
trazi($str_trazeni,$arr_mailovi);
} else {
echo "U nizu ne postoji trazena vrijednost";
}
?>
Objašnjenje:
U ovom primjeru prije ispisivanja prvo provjeravamo da li u nizu postoje tražene vrijednosti. Postojanje
vrijednosti u nizu se provjerava funkcijom in_array($str_trazeni,$str_niz_pretrazivanje).
Funkcija vraća True ukoliko vrijednost postoji,a false u suprotnom. Struktura argumenata funkcije je
identična i array_search() funkciji, pa i ova takođe prima treću, neobavezni, argument za poređenje tipa
podataka.
Prednost ove metode nad one bez korištenja funkcije je ta što kada predamo niz funkciji ona stvara lokalne
(funkcijske) varijable za svoje argumente, te izbacivanje elemenata iz niza ne utječe na sadržaj
predanog niza iz glavnog programa te taj niz možemo opet naknadno koristiti u skripti.
55
Sortiranjenizaifunkcije:asort/arsort/ksort/krsort
Postoji mnogo raznih algoritama za sortiranje niza i u ovom primjeru će biti objašnjeni samo neki od njih.
Isto tako PHP je opremljen već gotovim funkcijama za sortiranje po indexu, ili vrijednosti
jednodimenzionalnih i multidimenzionalnih nizova.
<?php
$arr_niz=array(
0=>10,
1=>15,
2=>9,
3=>19,
4=>13,
5=>15,
6=>99,
7=>74
);
// sortiranje niza
asort($arr_niz);
print_r($arr_niz);
?><hr><?
arsort($arr_niz);
print_r($arr_niz);
?><hr><?
ksort($arr_niz);
print_r($arr_niz);
?><hr><?
krsort($arr_niz);
print_r($arr_niz);
?>
U ovom vrlo jednostavnom primjeru se zadani niz sortira po raznim uslovima.
U prvom slučaju niz je sortiran po vrijednostima niza uzlazno. Za sortiranje je korištena funkcija
asort($arr_niz). Njoj se kao argument daje niz koji se sortira. Funkcija ne vraća vrijednost, već samo sortira
niz, i nakon njenog izvršenja je zadani niz sortiran i takvom mu pristupamo kasnije u skripti. Sortiranje se
obavlja tako da se elementi niza sortiraju uzlazno. Ono što je bitno kod ove funkcije je da se održava odnos
indeks => vrijednost, tako da će nakon sortiranja vrijednost koja se nalazila na indeksu 3 i dalje biti na tom
indeksu, samo će njena pozicija u samom nizu možda biti drugačija.
U drugom slučaju niz se sortira silazno (od najveće prema najmanjoj vrijednosti). To se radi pomoću
funkcije arsort($arr_niz). Ova funkcija je identična asort() funkciji po svom osobinama osim po redosljedu
elemenata nakon sortiranja.
U trećem slučaju niz se sortira po ključu. Znači da će ključ (indeks) sa manjom vrijednosti biti prije u nizu
pošto funkcija ksort($arr_niz) sortira niz po indeksu uzlazno. Odnos indeks => vrijednost je zadržan
nakon sortiranja.
Zadnji slučaj sortira niz po indesku, ali silazno. Tu radnju obavlja funkcija krsort($arr_niz). Ona je
identična funkciji ksort(), samo što sortira niz obrnutim redosljedom.
56
Forme‐P
PHPobrassci
Za rad sa
s obrascima
a potrebno jee predznanjee iz HTML-a.
Podsjetniik koji se odnnosi na ovaj dio HTML ko
odovanja moožete pronaćći u Dodatku.
od većih webb aplikacija, nezavisno u
Forme se kooriste u prekko 90% svih manjih a gootovo su nezaamjenjive ko
kojem je jezziku aplikaciija napisana.. Zbog ovogaa je potrebno
o imati znanjje samih HT
TML formi (ttipove polja,,
koja su za kkoju namjenuu najbolja, naačine grupisaanja elemenaata … ).
Uz poznavaanje HTML dijela form
mi, potrebno je znati kak
ko prihvatiti pomoću PH
HP-a vrijedn
nosti koje suu
unesene u fformu. Ovdje ćemo se pozabati
p
tom
m problematik
kom od izraade jednostavvnih formi i prihvaćanjaa
informacija.
Počnimo saa vrlo jednosttavnim pitanjjem. Što je fforma?
Sa tehničkee strane gleddano, forma je HTML eelement pom
moću kojeg grupšemo vviše elemenata za unoss
podataka (ttipa text boxx, select menii, opcije … )).
U te elemennte korisnik (vidi Dodattak) može unnijeti (ili izaabrati) inform
macije koje sse kasnije ko
oriste za biloo
koju svrhu ((unos inform
macija u bazu
u podataka, sllanje e-mailaa sa unesenim
m informacij ama…
Razlog gru
upisanja višee elemenata za
z unos podaataka u jednu
u formu je više – manje oočit.
Uglavnom kkada se vrši nekakav uno
os na web sttranici, običn
no se radi o više
v povezannih informacija koje činee
cjelinu (prim
mjer : login forma
f
sa userrnameom i ppasswordom)).
Obrasce kooristimo kakoo bismo dob
bili povratnuu informaciju
u od korisnika. Puno puuta tražimo od
o korisnikaa
registraciju,, popunjavannje ankete i slično.
Forma je neevidljiva. Njuu možemo zaamisliti kao nnevidljivi 'ko
ontejner' u ko
ojeg se umećću novi elem
menti.
Sve forme sse sastoje od tri osnovna dijela:
1. Neččega što bi uslovno moglli nazvati zagglavlje ili dek
klaracija form
me; to je sam
m <form> taag .
Unuutar njega see definišu dva
a atributa:
a) akcija i
b) metod
Akccija i metod definišu šta i kako ćemo raditi sa objektima iz dru
ugog dijela
atribut acction
atrribut methodd
<fo
orm actio
on="action.php" method= "p
post" >
fajl kome se
braća
atrribut akcija ob
metod koji je
j izabrao atribut method
2. Druugi dio je koontejner kojii sadrži objeekte (elemen
nti- ulazi) sa
a kojima se u formi ra
adi; odnosnoo
poddatke koje ona
o skuplja/ssadrži. Postooji vrlo očitaa potreba zaa više različčitih načina prikupljanjaa
poddataka od koorisnika posstoje različitti elementi od kojih sv
vaki ima nekke svoje ossobine. Nekii
elem
menti imaju mogućnost direktnog
d
unnosa podatak
ka od strane surfera,
s
dok mu drugi om
mogućuju daa
izabbere jednu odd ponuđenih vrijednosti.
Iluustracija koja
a pokazuje obbjekt (izgled
d i elemente) jedne
j
standaardne forme
57
U dodatku se možete upoznati sa nekim od tih elemenata (tekst, area, meniji, dugmad...) načinom
kreiranja i njihovim karakteristikama. Ovi elementi forme su vidljivi i oni sakupljaju podatke.
Kad se klikne na submit dugme sve te podatke, iz svih elemenata, forma šalje nekoj skripti na
obradu.
3. Deklaracije završetka forme predstavljene </form> tagom
Praktično oni ulazi između tagova 1 i 3 biće dostavljeni od strane forme na odgovarajuće mjesto
(nekoj skripti) definisano akcijom i metodom (atributima forme).
Definisanjeaributaakcije
U vrijednost atributa ACTION se stavlja adresa skripte za obradu podataka5.
action="URL"
Određuje put do PHP skripte (procesa) koja će obraditi unesene podatke kad kliknemo na SUBMIT dugme
action="../mojaskripta.php" PHPskripta,
Forme se koriste i u drugim jezicima, a samim tim i sličan moguće je pristupati drugim skriptama iz forme; pa npr. može biti:
action="../cgi-bin/mojaskripta.pl" Pearl skripta,
action="../cgi-bin/mojaskripta.cgi" CGI skripta,
action="http://domena.om/cgi-bin/nekaskripta.asp" ASP skripta na serveru različitom od našeg,
action="javascript: nekafunkcija();" JavaScript skripta u našem html dokumentu,
action="http://novadomena.com/strana.html" otvara novi html dokument,
...
Primjer1:UmetanjeformeuHTMLdokument
Otvorite HTML editor i upišite slijedeći kod. Dokument spremite pod imenom forma.htm i pogledajte ispis
u svom browseru.
<html>
<head>
<title>Primjer 1 : Umetanje forme u HTML dokument</title>
</head>
<body>
<h1>Primjer 1 : Umetanje forme </h1>
<hr>
<p>Ispunite formu : </p>
<form method="post" action="prihvat.php" name="forma1">
</form>
</body>
</html>
Objašnjenje
Kao što se vidi u ispisu, sama forma je nevidljiva. Nju možemo zamisliti kao nevidljivi 'kontejner' u kojeg se
umeću novi elementi.
Analizitajmo HTML kod pomoću kojeg smo umetnuli formu u dokument.
<form method="post" action="prihvat.php" name="forma1">
</form>
Kao što vidite, radi se o običnom HTML tagu koji ima svoj početak i kraj, te neke argumente. Argumenti
određuju parametre o kojima zavisi tok događaja nakon slanja (submitanja) forme.
Prvi argument je method="post"
5
Moguće izvršiti obradu podataka i u samom fajlu u kome se i nalazi tako da pišemo <form ACTION = "">.
Samo navodnici; mada i u takvim slučajevima možemo pisati adresu skripte u kojoj se nalazi i sama forma.
58
On govori kojom metodom će se podaci iz forme proslijediti dokumentu (skripti) za obradu unesenih
podataka. Metodama slanja podataka forme ćemo kasnije razjasniti i objasniti na nekoliko konktretnih
primjera, tako da ćemo za sada preći preko ovoga.
Drugi argument je action="prihvat.php"
Pomoću njega govorimo formi koji dokument se otvara kada se forma submita. Vrijednost argumenta
može biti bilo kakav URL, uključujući i dokument na kojem se prikazuje forma sa jedne strane, te dokument
na drugom siteu sa druge. O obradi forme u istom dokumentu na kojem se forma prikazuje će biti više
govora kasnije. Za sada je bitno znati da forma očekuje da se kod koji obrađuje njene informacije nalazi u
dokumentu prihvat.php koji se nalazi u istom direktoriju kao i forma.htm
Treći navedeni argument je name="forma1" je neobavezan.
On, očito, imenuje ovu formu. Ovaj argument nije bitan za prihvat i obradu podataka forme pomoću
PHP-a. Važnost ovog argumenta se više veže uz izradu JavaScript klijentskih kodova, i služi
zaidentifikovanje ove forme. Pošto je naša tema PHP i forme, nećemo ulaziti u detalje te problematike. Bitno
je znati da se forma može imenovati, te da je kod PHP-a ovaj argument moguće i izostaviti.
Formalno to je to: kreirali smo formu. Imamo formu bez elemenata za unos informacija koju ne možemo
submitati pošto ne postoji submit dugme, a i da postoji nisu definisane varijable.
Fajl1
Fajl2
Get ili Post
PRIHVAT
učitavanjje
varijabli
(Xi,Yi...)
Varijable
(Xi,Yi...)
Definisanjemetodeslanjaiprihvatapodataka(POSTiGET)
Moguće je odabrati metodu kojom će se podaci forme proslijediti dokumentu (skripti) za obradu njenih
informacija.
Atribut kojim se definiše metoda prenosa je METHOD. Određuje na koji način će se podaci (varijable)
proslijediti do skripte.
Postoje dva načina GET ili POST. Default je GET, a to znači da ako izostavimo ovaj atribut da će se podaci
tako prosljeđivati do skripte.
Izborom metode utičemo na koji način će se sami podaci forme proslijediti stranici, i to je nezavisno o jeziku
u kojem će se ti podaci prihvatiti i obraditi. U PHP-u izborom metode biramo i način na koji ćemo prihvatiti
te podatke.
Kod requesta, ili zahtijeva za nekom stranicom od strane klijenta na nekom serveru se obično radi o čistom
headeru zahtjeva koji u sebi sadrži adresu stranice koja se želi vidjeti, neke informacije o samom klijentu (tip
browsera, OS …), te GET i POST podaci.
Kod responsa, ili uzvraćanja informacija servera klijentu se može raditi o više situacija. Ukoliko je nastala
neka greška pri pribavljanju zatražene stranice onda se šalje samo response header sa kodom greške te nekim
dodatnim informacijama (tip servera, protokol …).
Ukoliko se requestom zatražila postojeća stranica onda se šalje response koji se sastoji od dva dijela:
1. od headera koji sadrži opet te generalne informacije skupa sa nekim dodacima, poput COOKIESA, i
2. od body-a koji u sebi obično sadrži HTML kod stranice koju smo zatražili.
59
Varijable
d proslijedi do skripte kkoja će ih dallje obraditi nema
n
praktičnnu upotrebnu
u vrijednost;;
Obrazac kojji ne može da
a ako razmššljamo o dinaamičkom pro
ogramiranju nnema baš nik
kakvu.
Kako proslij
ijediti varijabble?
Naziv varijaable se određđuje pomoću
u NAME atribbuta, a njezin
na vrijednostt s VALUE.
Na taj način se stvara par name="v
value" koji se prosljeđu
uje do skripte ili pak doo mail klijenta (Outlook,,
Mozilla Meessenger ...). Ovo će se razjasniti
r
krooz praktične primjere, a samo deklari
risanje varijaabli u HTML
L
objašnjeni je Dodatku (vvidi Input typ
pe...).
method="G
GET“
Ako je metthod="GET" tada se uneeseni podaci prosljeđuju
u do servera kao dio UR
RL-a i mogu se vidjeti u
location barru vašeg brow
wsera.
Npr.
domena.co
om/skripta.php?boj
ja=plava&
&oblik=ko
ockast
http://d
sadrži dvije varijable (podatka): bojaa čija je vrijeednost plava i oblik s vrijednošću kocckast.
Dakle, sve iiza upitnikaa jesu varijab
ble i njihovee vrijednosti.
Ova metodaa ima dva oggraničenja.
Prvo, pomooću ove metoode može se poslati ograaničena količčina informaccije npr. 2566byte ili 1kB
B što zavisi o
serveru na kojem je obrazac
o
i o serveru na kom je skrripta. Trenuttno većina bbrowsera i servera imaa
ograničenjee od 32kB za GET metod
du.
Drugo, podaaci koji se šaalju mogu se vidjeti u adrress tj. locatiion baru brow
wsera.
Ovo iz siguurnosnih razlloga ponekad nije dopusstivo. Npr. ako
a šaljete broj kreditne kartice. No ponekad ćee
ovo biti požželjno, ako npr.
n želimo da
d cjelokupnni URL zajed
dno s varijab
blama ostanee u Favoritess-u kada nass
korisnik dodda u Favoritees.
Dakle, ova metoda je poželjna sam
mo ukoliko se radi o malo
m
podataaka koji ne zahtijevaju neku velikuu
sigurnost.
60
method="POST"
POST je metoda koja prosljeđuje varijable obrasca kao blok podataka http protokola.
Metoda method="POST" je češća jer nema takva ograničenja. Dobro je da POST napišete velikim slovima
jer 'post' možda neće raditi.
.Nešto je sigurnija od GET no budući da se radi o slanju čistog texta postoji mogućnost da vam podaci budu
"preuzeti".
Preporuka: Ako vaši podaci ne sadrže ASCII znakove ili ako su podaci veći od 100 znakova upotrijebite
POST.
Izbormetode
Izborom metode utičemo na koji način će se sami podaci forme proslijediti stranici, i to je nezavisno o jeziku
u kojem će se ti podaci prihvatiti i obraditi. U PHP-u izborom metode biramo i način na koji ćemo prihvatiti
te podatke.
Analizirajmo koje su tačno te razlike u metodama pri samom prosljeđivanju informacija.
Prva razlika je ona najdrastičnija i odmah uočljiva: Kada se izabere metoda GET podaci forme se šalju kroz
komandnu liniju (query string, tj. iza znaka ? u adress baru browsera).
Izborom metode POST podaci nisu vidljivi u komandnoj liniji već se šalju transparentno kroz header HTTP
requesta. Ono što je bitno je da se pri komunikaciji između klijenta i servera (browser – web server) šalju
zahtjevi i odgovori koji se sastoje od više dijelova.
POST-om se podaci forme šalju kroz request header i time se na njih ne može utjecati izmjenom linka u
adress baru browsera i shvaćanje procesa komunikacije između servera i klijenta nam može kasnije dobro
doći.
Kako se odlučiti koju metodu koristiti? Metoda koja se koristi za prosljeđivanje informacija zavisi o
situaciji u kojoj se nalazite. Svaka metoda ima svoje vrline i mane.
Kod GET metode informacije lijepe na sam URL, što ovu metodu čini idealnom u slučaju kada želite
omogućiti posjetiteljima sitea da spreme stranicu koju gledaju u svoje favoritese, jer će spremiti URL
zajedno sa zalijepljenim query stringom. Primjer ovoga bi bio Google i njihov pretraživač koji sve podatke iz
formi lijepi u query string baš iz tog razloga.
Sa druge strane GET je vrlo nesigurna metoda jer ju posjetitelj vrlo lako može izmijeniti jednostavnom
izmjenom URL-a u adress baru svog browsera, tako da nije preporučljivo koristiti ovu metodu za
prosljeđivanje recimo usernamea i passworda u login formama i sličnih osjetljivih informacija.
Ali neka pravila u izboru metode ne postoje i kao programeri aplikacija odlučujemo koju ćemo metodu
koristiti, zavisno o situaciji u kojoj se nalazimo.
Jedino pravilo koje se mora poštovati je da se obavezno mora koristiti POST metoda kada se izrađuju upload
forme.
Idemo sada vidjeti sve gore spomenute implikacije o metodama na praktičnim primjerima.
Ovi primjeri bi trebali ilustrirati osnovnu metodu za prihvat podataka iz forme.
61
Primjer PO
OST metodee
Zadatak: Krreiraj jednoostavan upitnik koji retuultate upita izz fajla forma1 šalje i
prikazuje u fajlu akcija11.
Kreiraj php dokument saa imenom fo
orma1.php kkoji sadrži fo
ormu:
<html>
<head>
<title>Pr
rimjer met
tode POST<
</title>
</head>
<body>
<form act
tion="akci
ija1.php" method="P
POST">
<p>Unesi svoje ime
e: <input type="tex
xt" name="
"name" /><
</p>
<p>Koliko
o imad god
dina: <inp
put type="
"text" nam
me="age" /></p>
/
<p><input
t type="su
ubmit" val
lue="Pošal
lji"></p>
</form>
</body>
</html>
Jasno je štaa šta hoćemoo. Ovako kreeiran dokum
ment sadrži fo
ormu koja vaarijable namee i age, kojee se obraćajuu
dokumentu akcija1.php.. Pošto mu see imaju namjjeru obratiti kreirajmo do
okument akccija1.php:
<html>
<head>
<title>Pr
rimjer pri
ihvata pre
eko submit
ta i POSTA
A</title>
</head>
<body>
Zdravo
<?php
echo html
lspecialch
hars($_POS
ST['name']
]); ?>.
Imas
<?php
echo (int
t)$_POST['
'age'];
echo " go
odina.";
?>
</body>
</html>
Pokrenimo skript form
ma1.php i dob
bićemo neštoo slično:
62
Sad u tekst boksove forme
f
možem
mo unijeti ppodatke i potom
p
klikom
m na dugmee Posalji izv
vršili bismoo
„submitanjee“ i pristupilii akcija1.php
p koji ispisujee uneseno im
me nazad na ekran
e
i dobilli npr.:
Iz ovog jeednostavnog primjera jee vidljivo dda se podaccima iz form
me pristupaa pomoću odgovarajuće
o
e
supergloballne varijablee. Vrijednostt nekog elem
menta formee se nalazi unutar
u
te supperglobalne varijable naa
indeksu koji odgovara imenu
i
tog elementa form
me. U kojoj se
s superglobaalnoj varijabbli nalaze pod
daci zavisi o
izabranoj m
metodi prosljeeđivanja pod
dataka.
U ovom prim
mjeru je mettoda bila POST, tako da jje korištena superglobaln
na varijabla $
$_POST.
ETmetode
PrimjerGE
Zadatak: Krreiraj jednoostavan upitnik koji retuultate upita izz fajla formaG
G šalje i
prikazuje u fajlu prikazG
G.
Opet ćemo kkreirati dva dokumenta.
d
Neka
N
dokum
ment forma
aG.php sadrrži formu:
<html>
<head>
<title>Pr
rimjer GET
T metode</
/title>
</head>
<body>
<h3>Primj
jer Proslj
jedjvanje informaci
ije GET me
etodom </h
h3>
<hr>
<form nam
me="primje
er GET-a" method="g
get" actio
on="prihva
at.php">
<! –Komen
ntar atrib
but name="
"primjer G
GET-a" je neobaveza
an -->
Unesi svo
oje ime :
<input na
ame="ime" type="tex
xt" >
<br>
<input na
ame="submi
it" type="
"submit" v
value="Pos
salji">
</form>
</body>
</html>
Dokument pprikazG.php se pokreće nakon
n
subitaa i prihvata po
odatke unešeene u formu.
prikazG.ph
hp:
<html>
<head>
<title>Pr
rimjer Pri
ihvat poda
ataka GET metode</t
title>
</head>
<body>
<?
echo "Poz
zdrav " . $_GET["im
me"];
?>
</body>
</html>
63
Pokrenite formaG.php i ispunite polje sa svojim imenom te kliknite na dugmena kojem piše Pošalji. To bi
trebali izgledati otprilike ovako:
Nakon pritiska dugmea, tj. submitanja forme se u prozoru otvara dokument prikazG.php
rezultat GET-a smješten u adres bar
Prihvat podataka je sam po sebi vrlo jednostavan. Unutar PHP-u postoje superglobalne varijable. To su
varijable (nizovnog tipa) koje definiše sam PHP pri pokretanju svake skripte.
Prva je $_GET i ona je korištena u prihvat.php dokumentu našeg primjera.
echo "Pozdrav " . $_GET["ime"];
Gornja linija ispisuje poruku koja se sastoji od konstantnog dijela Pozdrav i dijela u kojem se ispisuje ono što
je uneseno u text box polje u forma.php dokumentu koje smo nazvali ime.
Primijetite da su se podaci koji smo ispunili u formaG.php dokumentu zalijepili na link u prikazG.php
dokumentu koji ispisuje te podatke.
Sve iza znaka ? u gornjem linku se naziva QUERY STRING.
Radi se o seriji parova imena i vrijednosti međusobno odvojenim znakom &.
Ako ste pomislili da bi bilo moguće ovim načinom prenijeti podatke iz jedne stranice na drugu čisto putem
linkova, onda dobro mislite. 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.
Znači, ovo bi bio ekvivalent našoj formi iz primjera, kada se u text box unese Marko
<a href='prihvat.php?ime=Marko'>Moje ime je Marko</a>
Čak smo i izostavili drugu varijablu u query stringu pošto nam ona za sada nije potrebna u prihvat.php
dokumentu.
64
Korišćenjenizovauobradiformi
Nizovi su veoma korisni i u obradi formi, i to posebno onih sa poljima za označavanje (checklist) ili listama
sa višestukom selekcijom. Niz se koristi kako bi “uhvatio” sve selektovane vrednosti.
Sljedeći primer to ilustruje:
<html>
<head></head>
<body>
<?php
// provera submit-a
if (!isset($_POST['submit'])) {
// prikazi formu
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="checkbox" name="muzicar[]" value="Bon Jovi">Bon Jovi
<input type="checkbox" name="muzicar[]" value="KUD Idijoti">KUD Idijoti
<input type="checkbox" name="muzicar[]" value="Nervozni Postar">Nervozni postar
<input type="checkbox" name="muzicar[]" value="MJ">MJ
<input type="checkbox" name="muzicar[]" value="Jethro Tull">Jethro Tull
<input type="checkbox" name="muzicar[]" value="Rokeri s Moravu">Rokeri s Moravu
<input type="submit" name="submit" value="Izaberi">
</form>
<?php
}
else {
// ili prikazi listu izabranih muzicara
// foreach petlja ispisuje elemente
if (is_array($_POST['muzicar'])) {
echo 'Izabrano je: <br />';
foreach ($_POST['muzicar'] as $a) {
echo "<i>$a</i><br />";
}
}
else {
echo 'Nista nije izabrano.';
}
}
?>
</body>
</html>
1.
2.
65
3.
Provjerametodepristupadokumentu/skripti
U nekim situacijama je potrebno znati kojom metodom je neki dokument / skripta otvorena, te na osnovi
toga obavljamo potrebne operacije.
Ovo je moguće provjerom vrijednosti $_SERVER["REQUEST_METHOD"]
ili skraćeno $REQUEST_METHOD varijable.
Njene moguće vrijednosti su POST i GET, zavisno o metodi otvaranja stranice. Njena vrijednost će uvijek
biti GET osim u slučaju da se dokumentu pristupilo nakon submitanja forme sa POST metodom.
Iz tog razloga ovo nije najbolja metoda za provjeru da li je neko stvarno ispunio formu i pristupio dokumentu
za prihvat i obradu podataka. O toj provjeri će biti govora malo kasnije kada ćemo napraviti obradu forme sa
više submit dugmadi.
No prije toga, da razmotrimo jednu zanimljivu činjenicu.
Otvorite formu slučaja Primjera za POST metodom te ju ispunite i submitajte. Kada se otvori prihvat.php
refreshajte stranicu. Sada bi vas browser trebao pitati da li želite opet poslati podatke forme stranici te morate
odabrati potvrdnu akciju ukoliko želite opet vidjeti prihvat.php. U slučaju da izaberete da ne želite opet
poslati podatke dobijete error page (iako ovo zavisi o konfiguraciji samog browsera).
Sada pokušajte ovo isto učiniti za a slučaj Primjera sa GET metodom. Kod njega vas browser ništa ne pita
već odmah prikazuje stranicu. Zbog ovoga je GET metoda puno praktičnija kada se prave forme za
pretraživanje, jer svako dodatno kliktanje pri surfanju kroz site samo može iznervirati posjetitoce.
Takođe, kod search formi je dodatna, već spomenuta, prednost ta što se query string sprema zajedno sa URLom u favoritese surfera, tako da se moguće opet vratiti na isto pretraživanje nakon više dana jednostavnim
izborom bookmarka.
Ova činjenica takođe dobro dođe kod otklanjanja grešaka (debugiranja) skripti za prihvat podataka forme.
Ukoliko postoji greška u prihvat.php dokumentu možete ju ispraviti u editoru u kojem pišete skriptu, te
nakon što sačuvate izmjene kliknete refresh u browseru i dokument će se prikazati ukoliko ste ispravili sve
greške. Radi toga se nije potrebno vratiti na formu te ju ponovno ispuniti da bi testirali da li su sve greške
ispravljene.
66
Prikaziobradaunutarjednogdokumenta
Bitno je samo da shvatite princip po kojem će se forma prikazivati i obrađivati.
U srednjim i većim aplikacijama nepraktično je imati odvojene dokumente za prikaz i obradu forme iz
očitog razloga što bi se broj dokumenata nekog sitea popeo do tako velikog broja da bi postao problem
praćenja što se gdje odvija unutar strukture dokumenata sitea, te si takvom praksom samo bespotrebno
kompliciramo izradu sitea tj. aplikacije. Zato je poželjno stvari koje su usko povezane, poput prikaza i
obrada forme držati unutar istog dokumenta u najmanju ruku.
Idemo pogledati konkretan primjer pa ćemo ga prokomentarisati.
U primjeru ćemo koristiti istu formu i obradu iz b slučaja Primjera 2.
Primjer 3 : Prikaz i obrada forme unutar jednog dokumenta
<html>
<head>
<title>Primjer 3 :Prikaz i obrada forme unutar jednog dokumenta</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primjer 3 :Prikaz i obrada forme unutar jednog dokumenta</h2>
<hr>
<?php
if ( ! $_POST["submitaj"] ){
?>
<form name="primjer3" method="post" action="<?=$PHP_SELF?>">
Unesi svoje ime :
<input name="ime" type="text" >
<br>
<input name="submitaj" type="submit" value="Pošalji">
</form>
<?
} else {
echo "Pozdrav " . $_POST["ime"];
}
?>
</body>
</html>
Objašnjenje:
Ovaj primjer je ništa više nego malo presložen raniji primjer POST metode.
Zapravo smo eliminisali potrebu za dva odvojena dokumenta i sve se obavlja unutar istog dokumenta.
Na neki način ovo se može smatrati prvim stepenom strukturiranja koda formi. Prvi zato što je ovo zapravo
tek prvi od više koraka u izradi naprednih i tzv. pametnih form sistema.
Idemo sada proći kroz novine u ovom primjeru.
Prva stvar koju odmah uočavate je
if ( ! $_POST["submitaj"] ){
Ova linija provjerava da li postoji neka vrijednost u varijabli $_POST["submitaj"]. Ako se sjećate, već smo
radili ponešto sličnu provjeru. (Provjeru kojom metodom je prestupljena stranica pomoću provjere
$REQUEST_METHOD varijable.)
Ta provjera i nije najbolja za našu situaciju. Razlog tome je što u toj varijabli uvijek postoji neka vrijednost,
po defaultu GET, iako ne postoji query string , tako da njena vrijednost ne garantuje da je neko stvarno
ispunio formu i došao na stranicu.
U našem primjeru provjeravamo postojanje vrijednosti unutar superglobalne $_POST varijable, a ukoliko se
u njoj nalazi neka vrijednost podrazumijeva i da je $REQUEST_METHOD = = POST.
Ono što treba primijetiti u primjeru je da se provjerava postojanje vrijednosti za submit dugme unutar forme.
To radimo zato što je ta vrijednost obavezno prisutna ukoliko se forma ispunila i submitala, zato što smo joj
u samom HTML-u dali vrijednost pomoću value argumenta u kodu submit dugmeta.
67
Primjetimo da u ovoj logici ima smisla provjeravati samo vrijednosti za submit dugmee jer je jedino njima
garantovano postojanje vrijednosti. Recimo, u primjeru nema smisla provjeravati postojanje vrijednosti u
$_POST["ime"] kao uslov prikaza ili obrade forme, jer surfer možda ne ispuni to polje, te bi mu se nakon
submitanja forme nanovo prikazala forma ukoliko bi ostavio polje ime prazno.
Logika primjera je jednostavna. Ukoliko ne postoji vrijednost u $_POST["submitaj"] znači da forma nije još
ispunjena i treba ju prikazati, a ukoliko ta vrijednost postoji znači da je forma ispunjena i submitana, te
želimo obraditi te podatke.
U samoj formi je dodana još jedna novina (boldano u liniji ispod)
<form name="primjer3" method="post" action="<?=$PHP_SELF?>">
$PHP_SELF je varijabla koju definiše sam PHP i u njoj se nalazi ime trenutno aktivnog dokumenta. Pošto
mi želimo da se forma prikaže i obradi unutar istog dokumenta, to je tačno ono što nama treba. Iako smo tu
mogli ručno upisati ime našeg dokumenta, korištenje $PHP_SELF se preporučuje, zato što ovako možemo
promijeniti ime našeg dokumenta, a u njemu će sve i dalje raditi kako je zamišljeno, pošto PHP sam
namješta njenu vrijednost.
Ovo je vrlo jednostavan model prikaza i obrade formi, i on je idealan za login forme, forme za unos i
izmjenu podataka. Postoje neki problemi za koje ovo nije idelano rješenje, posebno u administracijskim
alatima.
Formesavišedugmadi
Da malo razjasnimo praktičnu vrijednost i upotrebu submit dugmeta. Radi se o slučaju kada želimo imati u
jednoj formi više submit dugmadi, te zavisno o tome na koje je kliknuto želimo u obradi forme obaviti
različite operacije.
Razlozi za ovako nečim su vrlo česti, pogotovo kada se radi o nekim administrativni alatima, gdje je
potrebno moći napraviti više različitih operacija nad istim podacima (recimo želimo omogućiti brisanje
većeg broja novosti u našoj news skripti, ali želimo imati i dugme koje bi obrislo sve poruke odjednom).
Idemo ovo promotriti na konkretnom primjeru. Primjer se sastoji od forme sa dva submit dugmea, te od
obrade te forme unutar istog dokumenta. U obradi forme ćemo ispisati poruku koji je dugme izabrano.
Primjer 4: Forme sa više dugmadi
<html>
<head>
<title>Primjer 4 : Forma sa više submit dugmadi</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
</head>
<body>
<h2>Primjer 4 :Forma sa više submit dugmadi</h2>
<hr>
<?php
if ( $REQUEST_METHOD != "POST"){
?>
<form name="primjer4" method="post" action="<?=$PHP_SELF?>">
<input type="submit" name="dugme1" value="Dugme1">
<br>
<input type="submit" name="dugme2" value="Dugme2">
</form>
<?
} else {
// obrada forme
if ($_POST["dugme1"])
echo "Pritisnuli ste dugme1";
if ($_POST["dugme2"])
echo "Pritisnuli ste dugme2";
}
?>
</body>
</html>
68
Pristupglobalnimvarijablama
PHP je opremljen nizom globalnih varijabli (pogledaj Vidljivost promjenljive) u kojima se nalaze razni
podaci vezani uz server, operativni sistem, informacije o korisniku, cookije te varijable iz formi i Query
string.
Globalne varijable su same po sebi nizovi indeksirani na taj način da se na tekstualnom indeksu jedne
nalazi vrijednost te varijable.
Recimo na konkretnom primjeru. Uzmimo da smo negdje na siteu kliknuli na link koji nas odvodi na
sljedeću adresu:
http://www.server.com/skripta.php?ime=Kreso&id=123
U ovoj adresi je sve prije znaka ? najobičniji URL koji odvodi korisnika na stranicu. Informacije iza znaka ?
spadaju pod tzv komandnu liniju ili Query string. (vidi GET metodu)
Nakon što se otvori stranica skripta.php na njoj imamo pristup dvijema varijablama koje su proslijeđene
skripti GET metodom. One su spremljene u $_GET globalnu varijblu i možemo im pristupiti na više načina.
Prvi, koji je sigurniji i radiće u svim situacijama je pozivanjem varijable iz globalne varijable $_GET
<?
echo $_GET['ime']; // ili echo $HTTP_GET_VARS['ime']
?>
GET možemo proslijediti skripti na više načina.
Prvi je gore objašnjen – direktnim upisom varijabli u sam URL iza znaka ?.
Drugi način je preko forme koja ima namješten method='GET'. O drugoj metodi će biti više govora u
sljedećem odjeljku kada će biti govora o formama.
Generalno pravilo kod globalnih varijabli je da se njihova vrijednost ne može promijeniti direktnim
upisom vrijednosti na neki indeks. One su konstante koje namješta sam PHP.
Za njihovo namještanje postoje posebne funkcije, ali ovo može biti vrlo velika sigurnosna rupa u aplikaciji.
U pravilu globalne varijable namještamo tako da na jednoj stranici namjestimo varijable ili putem forme
ili linka sa GET metodom ili registrovanjem session ili cookie varijabli. O zadnje dvije metode malo
kasnije.
Drugi način za pristup globalnim varijablama je izostavljanjem imena globalne varijable. U ovom slučaju im
pristupamo kao i normalnim varijablama preko njihovog originalnog imena.
Za ovo mora u php.ini-ju biti namještena direktiva register_globals na true ili Yes
Za gornji primjer bi to izgledalo ovako:
<?
Echo $id;
?>
Ova metoda je vrlo nesigurna. Naime, ne znamo kojom metodom podatak dolazi. Ovako neki militantni
hacker može poslati varijable iz forme preko GET metode. Ovo je velika sigurnosna rupa i uvijek treba
izbjegavati ovakav pristup globalnim varijablama.
69
Primjeripristupabazikoriišćenjemformi
Ukoliko ne postoji kreirrajte bazu TeelImenik, kojja sadrži jedn
nostavnu Tab
belu T_Imennik
me, Prezime, Adresa, Grrad, BrojTel.
definisanu ppoljima Id, Im
Napravi PH
HP fajl: datoteeku/skriptu, koji će sadržžavati formu koja će:
Zadatak1: P
Provjeriti da li postoji otv
vorena baza ((baza kojoj jee slobodan pristup)
p
sa im
menom kojeg
g unesete
Zadatak2: O
Omogućiti daa u postojeću
u bazu TelIm
menik dodate novi zapis.
Zadatak3: P
Prikazivati saadržaj baze zapis
z
po zapiss.
70
Višenamjenskestranice
Pokušaćemo objasniti logiku upotrebe višenamjenskih stranica a potom u konkretnim primjerima objasniti
njihove različite implementacije. Prije samih primjera potrebno je postaviti i objasniti problem i sam pojam
višenamjenskih stranica.
U izradi serverskih aplikacija, nebitno u kojem jeziku su one izvedene, je ponekada praktičnije koristiti jedan
fizički dokument za obavljanja različitih logički povezanih operacija. Ovakve situacije se najčešće javljaju
u portalskim aplikacija koji se sastoje od više sekcija i servisa. Korištenjem višenamjenskih stranica je
moguće fizički separirati svaki odjeljak ili servis cjelokupne aplikacije u posebne datoteke (skripte) koje
imaju specijalizovanu namjenu. U konkretnom slučaju, jedna višenamjenska stranica bi se koristila za
listanje, pretraživanje i prikazivanje vijesti iz arhive vijesti, a druga recimo za servis e-razglednica ili
forum.
Tehnički gledano, višenamjenske stranice nisu ništa drugo nego obavljanje drugog niza instrukcija
(operacija) za različite situacije koje se određuju pomoću nekog kontrolnog uslova koji može biti
kontrolna riječ, koja je za svaku situaciju drugačija, ili kontrolna varijabla koja za svaku situaciju ima drugu
vrijednost.
Uobičajena praksa prosljeđivanja kontrolnog uslova je putem komandne linije (dijelu URL-a iza znaka ? ).
Višenamjenskastranicaizvedenakorištenjemkontrolneriječi
Ovo je jedna od metoda implementacije višenamjenskih stranica. Kontrolna riječ je fragment komandne
linije (ASP-ovci ovo znaju kao Querry String) kojem nije pridružena nikakva vrijednost (nema niti znak = ) i
odvojen je od ostalih parametara komandne linije (uobičajeno razdvajanje za PHP je pomoću znaka & ).
Evo ako bi izgledao primjer:
http://www.webmajstori.net/visenamjenska.php? webmajstori
Znači, u gornjem primjeru kontrolna riječ je 'webmajstori' . Evo i skripte:
<?php
switch(@$_SERVER["QUERY_STRING"]){
case "mika":
echo "Pozdrav majstore";
break;
case "webmajstori":
echo "To su isto majstori";
break;
default:
echo "A ko si ti?";
}
echo "<hr>";
echo "<p>Sadržaj query stringa<br>";
echo $_SERVER["QUERY_STRING"];
echo "</p>";
echo "<hr>";
echo "<p>Provjera postojanja varijable putem isset funkcije<br>";
if (isset($_GET["mika"])){
echo "varijabla mika postoji<br>";
}else{
echo "varijabla mika ne postoji<br>";
}
if (isset($_GET["webmajstori"])){
echo "varijabla webmajstori postoji<br>";
}else{
echo "varijabla webmajstori ne postoji<br>";
}
echo "</p>";
?>
71
Analiza:
Za gore navedeni primjer rezultat bi izgledao ovako :
To su isto majstori
Sadržaj query stringa
webmajstori
Provjera postojanja varijable putem isset funkcije
varijabla mika ne postoji
varijabla webmajstori ne postoji
Idemo sada proći kroz sam kod.
Prvi dio skripte obavlja neke radnje na osnovi zadane kontrolne riječi i tu zapravo izvodimo višestruku
namjenu ove skripte.
switch(@$_SERVER["QUERY_STRING"]){
case "mika":
echo "Pozdrav majstore";
break;
case "webmajstori":
echo "To su isto majstori";
break;
default:
echo "A ko si ti?";
}
Podsjećanje šta i kako radi switch: Switch provjerava tekst koji se nalazi u komandnoj liniji i uspoređuje ga
sa vrijednostima u case granama. Ukoliko je taj string jednak jednoj od ponuđenih vrijednosti ispisuje se
odgovarajuća poruka, a ukoliko ne odgovara niti jednoj od tih vrijednosti ili nema vrijednosti vraća se
poruka 'A ko si ti?' tj. default grana switch strukture.
Zašto je potrebno pristupati kontrolnoj riječi na gornji način (preko (@$_SERVER["QUERY_STRING"])?
Razlog je zapravo vrlo jednostavan. Prosljeđivanjem kontrolne riječi u komandnoj liniji bez pridružene
vrijednosti i znaka = ne definiše nikakvu varijablu, pa time nije moguće ispitivati njenu vrijednost ili
njeno postojanje.
Umjesto toga pristupamo cijelom tekstu iza znaka ? (tj. query stringu) koji se nalazi u varijabli
$_SERVER["QUERY_STRING"]
Da prosljeđivanjem ključne riječi PHP ne definiše varijablu dokazujem slijedećim kodom u skripti.
echo "<p>Provjera postojanja varijable putem isset funkcije<br>";
if (isset($_GET["mika"])){
echo "varijabla mika postoji<br>";
}else{
echo "varijabla mika ne postoji<br>";
}
if (isset($_GET["webmajstori"])){
echo "varijabla webmajstori postoji<br>";
}else{
echo "varijabla webmajstori ne postoji<br>";
}
echo "</p>";
Ovaj dio koda vraća za gornji primjer :
varijabla mika ne postoji
varijabla webmajstori ne postoji
Korištenje kontrolne riječi otvara više novih problema. Naime, ukoliko želimo skripti proslijediti preko
komandne linije i neku varijablu koja nosi isto ime kao i jedna od naših kontrolnih riječi, ili samoj kontrolnoj
72
riječi pridružimo neku vrijednost uvijek će se obavljati default grana switch strukture pošto cijela komandna
linija u tim slučajevima (pogledaj dole) neće odgovarati ponuđenim mogućim stanjima u svakoj od case
grana switch strukture.
http://www.webmajstori.net/visenamjenska.php?
webmajstori=123
http://www.webmajstori.net/visenamjenska.php?
webmajstori&webmajstori=123
http://www.webmajstori.net/visenamjenska.php?
webmajstori&mika=123
Kako to izbjeći?
Dobro pitanje. Ono što moramo u tom slučaju (za podsjetnik – imati još dodatne argumente u query stringu)
napraviti je postaviti neka pravila. Ta su da se kontrolna riječ uvijek mora nalaziti prva iz znaka ? u URL-u.
Nakon uvođenja ovog pravila možemo izbjeći gore navedeni problem sa sljedećim kodom :
/*
Pribavljanje ključne riječi
znakom @ izbjegavamo prikaz greške ukoliko je query string prazan
*/
$arr_komandna_linija=@explode("&", $_SERVER["QUERY_STRING"]);
$str_komandna_rijec=$arr_komandna_linija[0];
echo "<br>Vraćena vrijednost nakon provjere je <br>";
switch(@$str_komandna_rijec){
case "mika":
echo "Pozdrav majstore";
break;
case "webmajstori":
echo "To su isto majstori";
break;
default:
echo "A ko si ti?";
}
echo '</p>';
echo "<hr>";
echo "<p>Sadržaj query stringa<br>";
echo $_SERVER["QUERY_STRING"];
echo "</p>";
echo "<hr>";
echo "<p>Provjera postojanja varijable putem isset funkcije<br>";
if (isset($_GET["mika"])){
echo "varijabla mika postoji<br>";
}else{
echo "varijabla mika ne postoji<br>";
}
if (isset($_GET["webmajstori"])){
echo "varijabla webmajstori postoji<br>";
}else{
echo "varijabla webmajstori ne postoji<br>";
}
echo "</p>";
Idemo analizirati ovaj kod.
$arr_komandna_linija=@explode$_SERVER["QUERY_STRING"]);
73
Ovim kodom u varijablu $arr_komandna_linija spremao sav sadržaj komandne linije tako da svaki element
niza sadrži string vrijednost između dva znaka &. Ovime će u nultom elementu toga niza biti naša kontrolna
riječ koju kasnije možemo provjeravati, a u isto vrijeme možemo imati i dodatne varijable za kasnije
korištenje u skripti. Ukoliko se u query stringu nalazi samo kontrolna riječ bez znaka & u nultom elementu
će se i dalje nalaziti kontrolna riječ. Ukoliko je query string prazan znakom @ smo onemogućili javljanje
greške i u switchu će se obaviti default grana, tj. vratiti će se poruka 'A ko si ti?'.
Za izlučivanje smo koristili funkciju
explode($str_znak_odvajanja , $str_koji_zelimo_razdvojiti)
Ova funkcija rastavlja $str_koji_zelimo_odvojiti tako da u niz vraća dijelove tog stringa koji su u njemu bili
odvojeni sa $str_znak_odvajanja.
Da malo ovo ilustrujem.
Imamo string:
Maja,Ivana,Matea,Branka,Ana
I želimo ga razdvojiti tako da je svako ime odvojeno tj. želimo imati ovo:
Maja
Ivana
Matea
Branka
Ana
Za to koristimo explode funkciju na sljedeći način:
$str_imena=' Maja,Ivana,Matea,Branka,Ana';
$arr_imena=explode(',',$str_imena);
Sada se u $arr_imena nalaze sljedeće vrijednosti
$arr_imena[0]='Maja'
$arr_imena[1]='Ivana'
…
Vratimo se našoj skripti.
Ostatak koda u njoj funkcioniše isto kao i prvobitnom primjeru.
Sada će ako samo dodamo ovaj kod na kraj skripte
http://www.webmajstori.net/visenamjenska.php?webmajstori&mika=123
vratiti:
Vraćena vrijednost nakon provjere je
To su isto majstori
Sadržaj query stringa
webmajstori&mika=123
Provjera postojanja varijable putem isset funkcije
varijabla mika postoji
varijabla webmajstori ne postoji
74
Višenamjenskastranicakorištenjemkontrolnevarijable
Ovo je jednostavnija metoda implementacije višenamjenskih stranica. Ideja je koristiti varijablu koja se daje
skripti preko komandne linije. Ova varijabla (zapravo njena vrijednost) određuje šta će se prikazivati na
stranici. Kao dodatno pravilo koje se uvodi radi jednostavnosti same skripte i sigurnosti aplikacije je
određivanje akcije ukoliko kontrolna varijabla ne postoji. U ovoj skripti u toj situaciji se prikazuje nešto kao
početna stranica na kojoj se nalaze linkovi na druge moguće slučajeve. Problem (ili prednost) kod ovakvog
rješenja je da će se ta početna stanica prikazivati i u slučaju da korisnik sam promijeni vrijednost kontrolne
varijable u nepostojeću (nepodržanu) vrijednost ili ju izostavi u cijelosti.
Evo skripte:
<?php
// visenamjenska stranica koristenjem kontrolne varijable
// kontrolna varijabla : $kon
switch (@$kon){
case 1:
echo "Gledate stranicu 1<br>";
echo "<a href='$PHP_SELF'>Povratak na poeetnu stranicu</a>";
break;
case 2:
echo "Gledate stranicu 2<br>";
echo "<a href='$PHP_SELF?kon=33'>Povratak na poeetnu stranicu</a>";
break;
case 3:
echo "Gledate stranicu 3<br>";
echo "<a href='$PHP_SELF'>Povratak na poeetnu stranicu</a>";
break;
default:
echo "<h2>Poeetna stranica </h2>";
echo "<p>Odaberite jednu od stranica<br>";
echo "<ul><li><a href='$PHP_SELF?kon=1'>Stranica 1</a></li><li><a
href='$PHP_SELF?kon=2'>Stranica 2</a></li><li><a href='$PHP_SELF?kon=3'>Stranica 3</a></li><ul>";
echo "</p>";
}
?>
Rezultat skripte zavisi o stanju kontrolne varijable, ali ilustracije radi promotrite ove situacije
Za
http://www.host.com/skripta.php
Rezultat izgleda:
Početna stranica
Odaberite jednu od stranica
Stranica 1
Stranica 2
Stranica 3
Za
http://www.host.com/skripta.php?kon=1
Rezultat izgleda:
Gledate stranicu 1
Povratak na početnu stranicu
Za
http://www.host.com/skripta.php?kon=33
Rezultat izgleda:
75
Početna stranica
Odaberite jednu od stranica
Stranica 1
Stranica 2
Stranica 3
Analizirajmo kod:
Cijela skripta se zapravo sastoji od jednog 'velikog' switcha koji odlučuje šta se obavlja zavisno o kontrolnoj
varijabli. Kontrolna varijabla u ovoj skripti je $kon.
Ova varijabla ne mora postojati da bi skripta radila. Ovo je moguće zato što je u switchu korišten znak @
koji isključuje prikaz greške koja bi se prikazala u situaciji da kontrolna varijabla ne postoji. Ovako će se u
slučaju da ona ne postoji obaviti default grana switcha. Ista grana će se obaviti i ako trenutna vrijednost
kontrolne varijable nije ponuđena niti u jednom caseu.
Ostatak skripte objašnjava sam sebe. U defaultu se prikazuje popis svih ostalih mogućih izbora za ovu
skriptu, a u svakom caseu se obavljaju radnje specifične za taj izbor.
U svakom case je takođe ponuđen povratak na početnu stranicu. Linkovi se razlikuju u svakom od njih čisto
ilustracije radi.
Mogući povratci su :
<a href='$PHP_SELF'>Povratak na pocetnu stranicu</a>
Ovim linkom se stranici ne daje kontrolna varijabla i iz već objašnjenih razloga se obavlja default grana
switcha. Ovo je ujedno i najbolji način vraćanja korisnika na početnu stranicu.
<a href='$PHP_SELF?kon=33'>Povratak na poeetnu stranicu</a>
U ovom primjeru se skripti daje nepostojeća (neponuđena) vrijednost (stanje) kontrolne varijable. Pošto
vrijednost ne postoji obavlja se default grana switcha. U ovoj situaciji se može postaviti bilo koja
neponuđena vrijednost kontrolne varijable. Ova metoda vraćanja možda nije najbolji izbor. Naime, šta
ako se tokom vremena poveća broj mogućih stanja kontrolne varijable? Bićete prisiljeni mijenjati cijelu
skriptu.
Moguća stanja kontrolne varijable mogu biti bilo šta. U ovom primjeru su korišteni cijeli brojevi radi
jednostavnosti. Naime, mogućnost greške je mnogo veća ukoliko su moguća stanja neki veliki stringovi.
Ali kod ovog izbora potrebno uzeti u obzir neke sigurnosne posljedice: Ukoliko se koriste integer vrijednosti
militantni korisnik uvijek može vrlo lako pogoditi stanje, dok će kod korištenja stringova imati malo više
problema oko pogađanja stanja.
76
Sessionmanagement(mehanizampraćenjaposjete)
Sessioni su vrlo bitna stvar pri izradi Internet aplikacija. Prvo da razjasnimo šta su to sessioni, kako
funkcionišu i čemu služe.
U izradi Internet aplikacija postoji velika potreba za nekakvim mehanizmom za pamćenje informacija
vezanih uz jedan posjet korisnika našoj aplikaciji (siteu). Taj mehanizam su sessioni. Iz ovoga se može
izvući i zaključak šta je session. On bi bio jedan posjet siteu jednog korisnika. Session traje sve dok je
korisnik na siteu. Kada korisnik prestane otvarati stranice na siteu PHP ima kojim nakon zadanog vremena
(vrijeme se zadaje u php.ini-u) briše sve informacije koje su spremljene tokom sessiona na hard disc servera.
Ovako se štedi na prostoru.
Da vam malo ilustrujem kako funkcionišu sessionu pokušat ću vam ispričati jednu malu priču.
Korisnik X dolazi na site. PHP mu automatski pridružuje SID (session ID). Pomoću tog id-a se naš korisnik
X kasnije identificira kada posjeti neku drugu stranicu na siteu. Kada korisnik dođe na site, skripta
automatski stvori session varijablu u koju će se spremati broj posjećenih stranica u ovom sesionu. Ta
varijabal se namješta na 0. Sada korisnik bira svoju omiljenu temu na našem siteu i odlazi na stranicu na
kojoj se nalazi više informacija o toj temi. Normalno, mi žalimo dodati u našu session varijablu i ovaj posjet.
Skripta to i čini, te mu prikazuje traženi sadržaj. Korisnik čita tekst koji je tražio na prvoj stranici i polako se
počinje živcirati jer se ne slaže sa fundamentalnim pitanjima koje je autor teksta koji čita predstavio vrlo
neprofesionalno i nepromišljeno. Pred kraj teksta korisnik već počinje nervozno micati miš po ekranu sa
krajnjim odredištem na svojim favoritesima i izabere neki site iz njih koji mu neće prouzročiti toliko stresa
koliko naš site te odlazi sa našeg sitea.
Sada je ostatak session managmenta na samom PHP-u. Pošto korisnik X koji je identifikovan sa svojim SIDom ne koristi nove zahtjeve na našem siteu (pošto nam je skinuo sve svece sa neba i pobjegao od
neprofesionalnosti našeg autora teksta) PHP zna da se session 'gasi' nakon 30 minuta nakon što je korisnik
otišao sa našeg sitea. Sada PHP strpljivo čeka da to vrijeme prođe da može obrisati varijable iz svog temp
direktorija koje je skripta stvorila za korisnika X. Ali nekim čudom se korisnik vraća nakon 15 minuta, sada
još ljući nego kada je otišao, i traži način kako da nam da do znanja da smo potpuno promašili člankom koji
smo objavili na našem siteu. Vraća se na stranicu na kojoj je čitao tekst i primjećuje na dnu stranice formu u
koju može unijeti svoj komentar. U trenutku kada se korisnik X vratio na site, sve session informacije (broj
posjećenih stranica) i dalje postoje i umjesto da se stvara nova session varijabla sa brojem posjećenih
stranica sa nulom za vrijednost, brojanje se nastavlja tamo gdje je stalo kada je korisnik otišao skidajući nam
svece sa neba.
Iako je ovo vrlo jednostavna situacija (samo se broje posjećene stranice) ipak znamo da se ne radi o novom
korisniku, već o starom korisniku koji nam je pomogao.
Sada dolazimo do pitanja zašto koristiti session-e. U gornjoj situaciji smo ga koristili za brojanje posjećenih
stranica korisnika X. To je jedan od mogućih namjena. Druga bi recimo bila brojanje ukupnih posjeta našem
siteu koji bi bili jednaki broju stvorenih sessiona. U toj situaciji bi pri stvaranju session varijable negdje u
bazu ili neki flat file (npr. txt file je flat file) spremili novi broj posjeta siteu.
Još jedna korisna stvar koja se može 'čuvati' u session varijablama su korisničke informacije poput
nicknamea, userID-a i sličnih stvari, zatim sadržaj košarice u e-shop aplikaciji.
Generalno bi se dalo reći da u session varijable spremamo informacije koje tiču korisnika i njegovom posjetu
siteu. Te informacije ne moraju, ali mogu biti od velike važnosti za cijelu aplikaciju, ali u 99% situacija one
služe samo za olakšan rad tom korisniku (zamislite da korisnik mora negdje na papir zapisivati sve artikle
koje želi kupiti na našem siteu).
Brojanjeposjećenihstranica
Ovaj primjer koristi višenamjensku strancu!
<? ob_start() ;// output buffering
session_start(); // pokreatnje sessiona
// namještanje session varijable
if (session_is_registered("posjeta")){
$posjeta++;
} else {
$posjeta=1;
}
// registrovanje session varijable
session_register("posjeta");
?>
77
<html>
<head>
<title>Session managment</title>
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
</head>
<body>
<?php
// višenamjenska stranica
// kontrolna varijabla $k
/* STANJA $k
1 - ispsi elanka koji je jako stresan
2 - stranica za unos i gledanje komentara
default - poeetna stranica sitea
*/
switch (@$k){
case 1:
?>
<h1>Elanak</h1>
<p>Ovo je taj elanak od kojeg se eovjeku diže kosa na glavi</p>
<p>Nažalost morali smo ga cenzurirati zbog velikog broja pritužbi koje su dospjele
na naš mail</p>
<form action="<?=$PHP_SELF?>?k=2" method="post" name="forma" id="forma">
<p>Vaše ime:
<input type="text" name="ime">
<br>
Vaš mail
<input type="text" name="textfield">
<br>
Komentar:
<textarea name="komentar" cols="25" rows="10" id="komentar"></textarea>
<br>
<input type="submit" name="Submit" value="Dodaj komentar">
</p>
</form>
<?
break;
case 2:
// obarda forme i prikaz komentara
if (@$_POST["Submit"]){
// fali validacija forme!!!
echo "Vase ime : <b>" . $_POST["ime"] . "</b><br>";
echo "Vaš komentar <pre>\n" . $_POST["komentar"] . "</pre><br>";
?>
<a href="<?=$PHP_SELF?>">Povratak na poeetnu stranicu</a>
<?
} else {
// prikaz svih ostalih komentara
// potrebno je negdje spremiti komentare, npr u bazu
?>
<p>Nažalost nismo još uvijek u moguenosti prikazati sve komenatre</p>
<?
}
break;
default:
?>
<p>DObrodošli na ovaj potono otkvaeen site</p>
<p><a href="<?=$PHP_SELF?>?k=1">Pogledaj elanak od kojeg ae ti se dignuti kosa
na glavi </a>
<?
}
echo "<p>Do sada ste posjetili $posjeta stranica na ovom siteu</p>";
ob_end_flush();
?>
</p>
</body>
</html>
78
Objašnjenje:
Postoji jedna vrlo bitna stvar kod rada sa sessionima. Sve operacije vezane uz njih se moraju obaviti prije
nego što se bilo kakav sadržaj pošalje korisniku. Ovo se može osigurati na više načina.
Prvi je da se te operacije stave na sam početak skripte. U tom slučaju prije tih operacija ne smije biti nikakav
kod, HTML ili prazan red. Ovo je u većini situacija vrlo teško postići. Gotovo nemoguće.
Drugi način za onemogućiti slanje bilo kakvog sadržaja korisniku je korištenjem output buffering funkcija.
Output buffering je kontroliranje slanja geerisanog HTML koda korisniku. Znači da na samom početku
skripte možemo isključiti slanje outputa PHP koda (ili drugim riječia uključiti output buffering). Ovime
osiguravamo da se korisniku neće ništa poslati prije nego li mi kažemo da se šalje. Ovom metodom se
session operaciej mogu obavljati bilo gdje na stranici.
<? ob_start() ;// output buffering
Ovime je uključen output buffering i korisniku se neće slati nikakv sadržaj prije pojavljivanja
ob_end_flush(); Koji se nalazi pri kraju skripte.
Sada kada smo to riješili možemo se pozabaviti logikom koja je potrebna za brojanje posjećenih stranica.
Praktično, ono što želimo napraviti je pri svakom otvaranju skripte uvećati neku varijablu za jedan te
zapamtiti vrijednost te varijable za kasnije korištenje kroz session.
Problem koji se otvara je kako znamo da li je trenutno otvaranje skripte (stranice) prvo, ili je korisnik
već posjetio neku stranicu na siteu. Iz tog razloga prvo provjeravamo da li postoji varijabla u koju se
sprema broj posjećenih stranica te ukoliko postoji njena vrijednost se uvećava, a ukoliko ne postoji stvaramo
tu varijablu i namještamo joj početnu vrijednost na 1 pošto je korisnik posjetio jednu (ovu koju gleda)
stranicu.
Nakon toga je samo potrebno spremiti namještenu varijablu u session scope (natjerati PHP da ju zapamti)
Evo PHP zapisa loki to radi
// namještanje session varijable
if (session_is_registered("posjeta")){
$posjeta++;
} else {
$posjeta=1;
}
// registrovanje session varijable
session_register("posjeta");
Provjeru da li postoji varijabla u koju se sprema broj posjećenih stranica vršimo pomoću funkcije
session_is_registered("posjeta")
Funkciji se daje string koji mora biti identičan imenu varijable koju provjeravamo. Funkcija vraća true
ukoliko varijabla postoji i false u suprotnom.
Nakon te provjere, zavisno o rezultatu se namješta nova vrijednost te varijable.
Pridruživanje se vrši tako da se varijabli koja ima identično ime kao i provjerena varijabla u if-u red prije.
Nakon namještan je potrebno 'registrovati' novu vrijednost varijable pomoću funkcije
session_register("posjeta");
Ovoj funkciji se takođe daje string vrijednost koja sadrži identično ime kao i maloprije nesmještena
varijabla. Zašto su ove operacije objavljenje prije switcha koji implementira višenamjensku stranicu?
Zato što je ovo brojenje zajedničko svim stranicama, tj. situacijama. Brojimo ukupan broj otvaranja stranica
sitea, a ne samo određene situacije.
Iza switcha u kojem se nalazi sadržaj sitea se ispisuje broj posjećenih stranica.
echo "<p>Do sada ste posjetili $posjeta stranica na ovom siteu</p>";
79
Objekti
Ukoliko se prvi put srećete sa objektnim programiranjem OBAVEZNO pogledajte Dodatak i
Uvod u objektno orijentisano programiranje.
I PHP podržava objektno programiranje. Iako ne onako kako ga podržava C++ ili slični jezici, ali svoje
funkcije možete grupisati u klase te stvarati instance tog objekta kroz cijelu aplikaciju.
Sve u svemu, da bi ste koristili objekte prvo morate stvoriti klasu (class) sa nekim funkcijama i varijablama u
njoj te ju pozivati unutar koda. Varijable unutar klase zamišljamo kao proporties tog objekta, a njene
funkcije kao metode istog objekta.
Jednostavan objekt primjer:
<?php
class foo {
function do_foo() {
echo "Doing foo.";
}
}
$bar = new foo;
$bar->do_foo();
?>
U gornjem primjeru prvo definišemo klasu foo i unutar klase funkciju do_foo() koja ispisuje tekst.
Naredbom $bar=new foo; instanciramo objekt izveden iz klase foo i pridruzujemo ga varijabli $bar. Sada
preko varijable $bar mozemo pokrenuti funkciju do_foo().
Klasa(class)
Klasa je skup varijabli i funkcija koje radi s tim varijablama. Za instanciranje objekta može se koristiti "new"
da bi se instancirao objekt koji se kasnije pridružuje varijabli.
Intuitivno je jasan primjer koji sadrži i komentare:
<?php
class objekt{
var $testna;
function ispisi(){
echo $this->testna;
}
}
// kreiranje instance objeka
$obj=new objekt;
// namještanje objektne varijable $testna
$obj->testna="Tekst koji je spreman za ispis";
// pozivanje funkcije koja za ispis
$obj->ispisi();
?>
Rezultat :
Tekst koji je spreman za ispis
U gornjem primjeru uz osnovne tehnike kreiranje objekta i njegove instance u skripti možete primijetiti još
jednu stvar.
echo $this->testna;
Korištenjem $this-> prije imena varijable pristupamo toj varijabli i možemo ju koristiti za ispis ili izmjenu
podataka. Na isti način pristupamo i funkcijama.
Ukoliko želite pri instanciranju objekta automatski izvršiti neke radnje poput spajanja na bazu podataka ili
bilo koju sličnu operaciju koja je potrebna za daljnji rad objekta koristite konstruktore.
Konstruktori su funkcije objekta (klase) koji se izvršavaju zajedno sa stvaranjem instance objekta.
Konstruktori imaju isto ime kao i sam objekt.
80
Primjer:Objektsakonstruktorom
<?php
class objekt{
var $testna;
// konstruktor
function objekt(){
$this->testna="Ovo je tekst koji smo stvorili konstruktorom<br>";
$this->ispisi();
}
function ispisi(){
echo $this->testna;
}
}
// pozivanje objekta u kodu
$obj=new objekt;
// namještanje objektne varijable $testna
$obj->testna="Tekst koji je spreman za ispis";
// pozivanje funkcije koja za ispis
$obj->ispisi();
?>
Rezultat :
Ovo je tekst koji smo stvorili konstruktorom. Tekst koji je spreman za ispis.
Za objekte i varijable i funkcije u njemu vrijede sva pravila kao i za normalne varijable i funkcije!
Primjerkorišćenjaklaseimetodakodkreiranjapotrošačkekošarice
Analizitaćemo jedanu moguću imlementaciju korišćenja metode i klasa na čestom primjeru potrošačke
korpe:
<?php
class Kosarica {
var $artikli; // artikli u kosarici
// Dodaj $broj artikala $sifArtikla u kosaricu
function dodaj_artikl ($sifArtikla, $broj) {
$this->artikli[$sifArtikla] += $broj;
}
// Izvadi$broj artikala $sifArtikla iz kosarice
function brisi_artikl ($sifArtikla, $broj) {
if ($this->artikli[$sifArtikla] > $broj) {
$this->artikli[$sifArtikla] -= $broj;
return true;
} else {
return false;
}
}
}
?>
NAPOMENA: varijable unutar istog objekta se dohvaćaju sa $this->imeVarijable
Gornji primjer definiše klasu Kosarica koja se sastoji od polja artikala u košarici i metoda za dodavanje i
brisanje artikala iz košarice...
Klase su tipovi, odnosno, one su predložak za stvarne varijable. Da bi kreirali varijablu tipa neke klase,
potrebno je koristiti operator new.
81
Primjer:
$moja_kosara = new Kosarica;
$moja_kosara->dodaj_artikl("200342",5)
Gornjim primjerom smo kreirali objekt moja_kosara klase Kosarica, a potom smo u objekt moja_kosara
dodali 5 artikala sifre 200342.
Klase također mogu biti proširena verzija osnovne klase... To znači, da nova klasa ima sve varijable i
funkcije kao i osnovna klasa, ali ima i dodatne funkcije i varijable koje osnovna klasa nema. Ovo se radi uz
pomoć ključne riječi extends.
<?php
class Kosarica_s_imenom extends Kosarica {
var $vlasnik;
}
function postavi_vlasnika($ime) {
$this->vlasnik=$ime;
}
?>
Dakle, gornja klasa ima sve metode i varijable klase Kosarica, ali uvodi i novu vlastitu varijablu $vlasnik i
novu vlastitu metodu postavi_vlasnika.
Primjer:
$imenovana_kosarica = new Kosarica_s_imenom;
$imenovana_kosarica->postavi_vlasnika("Djoni Bravo");
echo $imenovana_kosarica->vlasnik;
$imenovana_kosarica->dodajArtikl("200320",23);
Ne postoji mogućnost višestrukog nasljeđivanja u PHP-u, a to znači da proširena klasa može naslijediti
svojstva i metode samo jedne osnovne klase !
82
Dodatak
k
HTMLtag
goviznaččajnizaPH
HPforme
Ovdje nećeemo ulaziti u detalje veeć ćemo datti samo krattak podsjetn
nik i kodovee koje kreiraju osnovnee
elemente i vvrste obrazacca. Analiziraććemo neke eelemente HTM
ML-a:
Button – duugme
Form tag
INPUT tagg
• Texxt - unos tekssta u jednom
m redu
• Texxtbox – unoss teksta u red
dovima i koloonama
• Cheeckbox – staavljamo kvaččicu u kvadraatić, moguć je
j višestruki izbor
• Rad
dio – dodajemo tačkicu u kružić, mogguć samo jed
dan izbor
• Sub
bmit/ Reset – potvrda un
nosa (koristi se u kombin
naciji sa textb
box)
Dropdown – padajući meni/lista
m
BUTTONT
Tag
Tag <buttonn> </button>
> namjenjen
n je za stvaraanje dugmadi.
Za razliku od INPUT BUTTON
B
taaga BUTTO
ON tag je co
ontainer što znači da se obavezno mora
m
pisati i
njegov zatvvarajući tag.
Korristi se uglavvnom kod pozziva Java skrripti.
Primjer:
<html>
<head>
<title>Glu
upo dugme</
/title>
</head>
<body>
<button>kl
likni me !!
!!</button>
>
</body>
</html>
Primjetite kkako će se texxt između tag
gova pojavitii na dugmetu
u.
Šta radi (izvvršava ovaj primjer?
p
Niššta: napravljjeno je dugme na koje mo
ožete da klikććete; očigled
dno potrebnoo
je da se defi
finišu neke ossobine (atribute metode i akcije).
g,tagkojide
efinišeobra
azac
FORMTag
Tag <form>
> </form> govori
g
browseru gdje obrrazac počinjje i gdje završava.
Unutar ova dva taga moože se smjesttiti bilo koji HTML tag, a to znači daa se unutra m
može ubaciti slika, tabelaa
ili pak neštoo treće.
Najjednostaavniji oblik obrasca
o
možee izgledati ovvako: Njeg
ga bi kreirao sljedeći skrip
ipt (HTML kod):
k
<FORM>
M>
ime: <INPUT><BR
<
R>
email:
: <INPUT>
</FORM
M>
83
INPUTTag
g
Tag <input ... > kreira polja
p
za uno
os podataka .
Ovaj tag nijje containerr te ne treba pisati
p
njegovv zatvarajući tag </input>
>.
Vrsta poljaa ovisi o typee atributu te može
m
biti:
mit | reset | button | hidden | imagee | file
type = text | password | checkbox | radio | subm
ovisi o tomee o kojem see tipu polja ra
Koji će se aatribut kada upotrijebiti
u
prvenstveno
p
radi, a ovdje možete naćii
popis svih aatributa inputt taga.
•
•
•
•
•
•
•
•
•
•
•
•
•
•
TYPE: određuuje tip polja
NAME: name of this form fieeld
VALUE: počeetna vrijednost polja
p
SIZE: određuuje širinu poljaa
MAXLENGTH: maximalni brroj znakova
gme
CHECKED: chheckira checkbox ili radio dug
BORDER: debbljina okvira okko slike
SRC: URL zaa sliku
ALT: alt. textt za sliku
LOWSRC: verrzija slike koja nije veliki fajl
WIDTH: širinna slike
HEIGHT: vissina slike
ALIGN: odreeđuje poravnanjje texta oko slik
ke
VSPACE: verrtikalna udaljennost slike i textaa
•
HSPACE: horrizontalna udaljjenost slike i tex
xta
•
READONLY: vrijednost poljja se ne može promijeniti
•
DISABLED: korisnik ne moože s poljem uraaditi ništa
•
ACCESSKEY: definira shorttcut key npr. ALT+g
A
•
AUTOCOMPLE
ETE: ako brow
wser koristi auto
omatsko
popunjav
vanje
•
TABINDEX: određuje kojim
m će se redom mijenjati
m
fokus
poljima kad
k se pritšće na
n TAB tipku
•
LANGUAGE: upotrebljeni skkriptni jezik
•
onClick: kada
k
korisnik kllikne
•
onChange: kad polje prom
mijeni vrijednosst
•
onFocus: kad
k
polje d
dobije foku
us
•
onBlur: ka
ad polje iz
zgubi fokus
s
•
onKeyPress
s: kad se pritissne tipka na tipkovnici
•
onKeyUp: kad
k se tipka otpuusti
•
onKeyDown: kad se pritisnne tipka a polje je u fokusu
Atributi u pprvoj koloni se dosta često upotrebljjavaju, dok se atributi u drugom (siv
ivoj-desnoj) koloni rjeđee
koriste. Posljednjih 7 atriibuta (onClickk,...) pozivaju JJavaScript funnkciju kad se nad poljem izzvrši nekakva radnja.
Kreiranje tekst poljaa sa: input type="textt"
Text polje je najčešći obblik input tag
ga koji se korristi. Kreira ga input tag
g te atribut type="text"
".
<html>
<head>
<meta http-equiv="Cont
tent-Type" content="text
t/html; char
rset=utf-8">
>
<title>Nasl
lov stranice
e</title>
</head>
<body>
<body bgcol
lor="lightbl
lue">
<form>
Ime:<input type="text" name="ime">
<br/><br/>
nput type="t
text" name="prezime">
Prezime:<in
</form>
</body>
</html>
Radi se o poolju za unos jedne linije teksta. Ime ppomoću kojeeg mu pristup
pamo u PHPP-u mu navod
dimo u namee
atributu.
Atributi IN
NPUT Text polja
p
name
Ovaj atribuut dodjeljuje naziv varijabli koja ćee se proslijeediti do skriipte. Ukolikko ne upotrijebite ovajj
atribut skriipta neće preepoznati o ko
ojoj se varijabbli radi te će uneseni pod
datak biti neuupotrebljiv.
name="str
ring"
Pri imenovannju polja tj. vaarijable koristiite samo alfannumeričke znaakove (brojevee i slova) te unnderscore crticcu ( _ ).
value
Ukoliko žellimo da se pri
p učitavanjju stranice u ovom elem
mentu nalazi neka vrijednnost možem
mo ju navestii
pomoću vallue atributa.
<input type
e="text" nam
me="tekst" value="Ovo je
e defaultna vrijednost polja i mož
že se promijeniti">
size="integger"
Određuje koolika će biti širina
š
polja tj.
tj koliko će zznakova biti vidljivo unu
utar polja.
Default je 220
84
maxlength="integer"
Definiše maximalni broj znakova koje korisnik može unijeti u polje. Obavezno je maxlength < size.
Primjer:
<form action="">
userID: <input type="text" size="5" maxlength="3">
</form>
Pokušajte unijeti više od 3 znaka. Nemoguće? Pa, naravno kad je napisano maxlength="3".
readonly | disabled
readonly - onemogućava izmjenu polja, prenosi varijablu u skriptu
disabled - onemogućava izmjenu polja, ne prenosi varijablu u skriptu
Primjer:
<form action="">
Ime: <input type="text" size="5" name="ime" value="Pero" readonly>
Prezime: <input type="text" size="5" name="prezime" value="Perić" disabled>
</form>
Textbox/Textarea
Ukoliko imate potrebu unijeti veću količinu teksta, umjesto <INPUT type="text"> koristićete TEXTAREA.
Textarea tag omogućuje da se veća količina teksta proslijedi na obradu u neku skriptu (PHP, JS, CGI itd.)
<textarea name="velikiTekst"></textarea>
Ovo je polje za unos texta od više redova. Znači, korisnik može prebaciti unos teksta u novi red te ga kao
takvog poslati na obradu.
Pravila oko imenovanja su mu ista kao i za sve ostale elemente.
Za razliku od text boxa, text area nema value atribut, već mu se defaultna vrijednost zadaje na slijedeći
način: Atribut cols određuje koliko će kolona (stupaca) polje biti široko, a rows koliko će redova biti visoko.
Integer je broj koji određuje dimenzije u broju znakova (ne u pixelima).
Kod davanja te defaultne vrijednosti je bitno paziti da će se 2 space znaka u samom elementu prikazati kao
dva prazna prostora, te da prelazak u novi red u HTML-u uzrokuje prebacivanje unosa podataka u elementu
u novi red.
Primjer:
<html>
<head>
<title>Naslov: Primjer definisanja polja textarea</title>
</head>
<body>
<FORM>
ime: <INPUT><BR>
email: <INPUT>
<br>oglas:
<textarea name="oglas" cols="45" rows="5">
Nekakav predefinisani tekst !!!
</textarea>
</FORM>
</body>
</html>
85
INPUTcheckbox
Više checkbox polja upotrebljava se kada želimo da korisnik izabere više stavki jednostavnim klikom na
kvadratić. Time kvadratić postaje checkiran odnosno u kvadrtiću se pojavljuje kvačica. Primjetite kako u
donjem primjeru može se čekirati 1, 2 ili sva tri kvadratića
<html>
<head>
<title>Izbor jela2</title>
</head>
<body>
<form>
<h2>Volim jesti:<h2>
<font size="3">
jabuke <input type="checkbox" name="voce" value="Jabuke"> <br>
banane <input type="checkbox" name="voce" value="Banane"> <br>
marelice <input type="checkbox" name="voce" value="Marelice">
</font>
</form>
</body>
</html>
Atributi checkbox polja:
name="string"
Ovaj atribut dodjeljuje naziv varijabli koja će se proslijediti do skripte. Pri imenovanju koristiti alfanumeričke znakove i
underscore (_). Ne koristiti slova sa apokrifima (kao što su č,ć,ž,š i đ).
value="string"
Atribut 'value' određuje koja će vrijednost biti pridružena varijabli (checkbox polju) kada ga korisnik checkira.
Dakle, 'name' atribut određuje naziv, a 'value' vrijednost varijable. Na taj način se definira par name="value" koji se
prosljeđuje skripti i koja ga prihvaća kao nekakvu varijablu. Budući da više checkboxova ima isti name, onda se
varijabla name proslijeđuje kao niz value vrijednosti. Npr. u gornjem primjeru će biti niz: voce="kruške, jabuke,
šljive"
Ovdje se mogu koristiti slova sa apokrifima.
checked
Ako se upotrijebi ovaj atribut tada će kvadratić biti checkiran pri otvaranju obrasca u browseru.
INPUTradio
Radio dugmad dozvoljavaju korisniku da izabere samo jednu stavku (za razliku od checkbox-a). Pri izboru
jednog radio dugmeta prethodno odabrano dugme se deselektira.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=utf-8">
<title>Naslov stranice</title>
</head>
<body>
<body bgcolor="lightblue">
<form>
<input type="radio" name="pol" value="muško"> Muško<br>
<input type="radio" name="pol" value="žensko"> Žensko
</form>
</body>
</html>
Atributi input RADIO isti kao kod checkbox polja.
Šta bi se desilo kad izostavite atribut name?
Ne bi bila moguća selekcija.
86
NapravitedugmesaIINPUTtype
e
Kreiranje ddugmeta sa input
i
type="button" ... se ne razlikuje bittno od ranijee objašnjeno
og sa tagom
m
button. (B
Bitno je da kod
k input bu
uton type niije potrebno
o da imate završni
z
tag – ova klasa tagova nijee
kontejnerskka. type butonn predstavlja
a dio naredbee Input).
Primjer:
<html>
<head>
<meta http
p-equiv="Co
ontent-Type
e" content=
="text/html
l;
charset=ut
tf-8">
<title>Nas
slov strani
ice</title>
>
</head>
<body>
<body bgco
olor="light
tblue">
<form acti
ion="">
<h1>Ako se
e slažeš kl
likni na OK
K</h1>
<input typ
pe="button"
" value="OK
K">
</form>
</body>
</html>
INPUT ssubmit, reeset
Kada posjeetilac vašeg obrasca klik
kne na SUB MIT dugmee sve varijable unutar formulara šalju se naa
adresu odrređenu sa acction="URL", odnosno na tu skripttu, te se u brrowseru otvaara novi pro
ozor.
Pritiskom nna dugme RE
ESET formulaar postavlja vvalue na pred
definisanu vrrijednost.
bmit i reset dugmeta
Atribut sub
value="s
string"
Namjena ovvog atributa je
j da umjesto
o riječi 'Subm
mit' na dugm
metu ispiše neešto drugo, nna primjer 'Po
otvrdi'.
v Forme: PHP
P
obrascci.
Za detalje i primjere vidi
Kreiranje padajućegg menija: Dropdown
D
Padajući meeni ima ponuuđene opcije koje izabereemo klikom miša
m na neku
u od njih. Svee opcije nisu
u vidljive
dok ne kliknnemo na streelicu koja se nalazi desnoo od prvog izzbora.
<html>
<head>
-equiv="Cont
tent-Type" content="text
t/html;
<meta httpcharset=utf
f-8">
<title>Prim
mjer padajuć
ćeg menija</title>
</head>
<body>
<body bgcol
lor="lightbl
lue">
<form actio
on="">
<select nam
me="boje">
<option val
lue="plava">
>plava</option>
<option val
lue="žuta">ž
žuta</option>
<option val
lue="zelena">zelena</option>
<option val
lue="crvena">crvena</option>
</select>
</form>
</body>
</html>
U slučaju dda želimo da nam prva vidljiva
v
opcij a bude nekaa koja nije prrva na popissu, onda u ko
odu moramoo
napisati seleected uz nju.. Npr. <opti
ion value="
"žuta" sele
ected="sele
ected">žuta
a</option>
87
HTMLforme,PHPisrpskaslova
Problem srpskih znakova leži u nepravilnom i nedosljednom korišćenju charseta unutar svih dokumenata
skripte. Prije izrade skripti dobra praksa je odlučiti se za jedan (ili oba) charset taga te ga dosljedno koristiti
na svim dokumentima unutar sitea. Time ćete izbjeći sve probleme.
Ovo pravilo vrijedi i za rad sa bazom podataka. (SQL)
Obično je dovoljno postaviti slejdeće meta tagove između <head><head> tagova:
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1250">
U slučaju korišćenja charset-a u tekstovima na stranici možemo preko tastature pisati domaća slova.
Postoji mogućnost i nekorišćenja charset-a, ali onda moramo za svako naše slovo koristiti šifru.
Te šifre su sljedeće:
Slovo HTML kod
Slovo HTML kod
Ć
&#262;
š
&#353;
ć
&#263;
Đ
&#272;
Č
&#268;
đ
&#273;
č
&#269;
Ž
&#381;
Š
&#352;
ž
&#382;
ListaPHPfunkcija
Aliases
Alias
Master function
Extension used
_
gettext()
Gettext
add
swfmovie_add()
Ming (flash)
add
swfsprite_add()
Ming (flash)
addaction
swfbutton_addAction()
Ming (flash)
addcolor
swfdisplayitem_addColor()
Ming (flash)
addentry
swfgradient_addEntry()
Ming (flash)
addfill
swfshape_addfill()
Ming (flash)
addshape
swfbutton_addShape()
Ming (flash)
addstring
swftext_addString()
Ming (flash)
addstring
swftextfield_addString()
Ming (flash)
align
swftextfield_align()
Ming (flash)
chop
rtrim()
Base syntax
close
closedir()
Base syntax
com_get
com_propget()
COM
com_propset
com_propput()
COM
com_set
com_propput()
COM
die
exit()
Miscellaneous
functions
diskfreespace
disk_free_space()
Filesystem
doubleval
floatval()
Base syntax
drawarc
swfshape_drawarc()
Ming (flash)
drawcircle
swfshape_drawcircle()
Ming (flash)
drawcubic
swfshape_drawcubic()
Ming (flash)
drawcubicto
swfshape_drawcubicto()
Ming (flash)
88
Aliases
Alias
Master function
Extension used
drawcurve
swfshape_drawcurve()
Ming (flash)
drawcurveto
swfshape_drawcurveto()
Ming (flash)
drawglyph
swfshape_drawglyph()
Ming (flash)
drawline
swfshape_drawline()
Ming (flash)
drawlineto
swfshape_drawlineto()
Ming (flash)
fbsql
fbsql_db_query()
FrontBase
fputs
fwrite()
Base syntax
getascent
swffont_getAscent()
Ming (flash)
getascent
swftext_getAscent()
Ming (flash)
getdescent
swffont_getDescent()
Ming (flash)
getdescent
swftext_getDescent()
Ming (flash)
getheight
swfbitmap_getHeight()
Ming (flash)
getleading
swffont_getLeading()
Ming (flash)
getleading
swftext_getLeading()
Ming (flash)
getshape1
swfmorph_getShape1()
Ming (flash)
getshape2
swfmorph_getShape2()
Ming (flash)
getwidth
swfbitmap_getWidth()
Ming (flash)
getwidth
swffont_getWidth()
Ming (flash)
getwidth
swftext_getWidth()
Ming (flash)
gzputs
gzwrite()
Zlib
i18n_convert
mb_convert_encoding()
Multi-bytes Strings
i18n_discover_encoding
mb_detect_encoding()
Multi-bytes Strings
i18n_http_input
mb_http_input()
Multi-bytes Strings
i18n_http_output
mb_http_output()
Multi-bytes Strings
i18n_internal_encoding
mb_internal_encoding()
Multi-bytes Strings
i18n_ja_jp_hantozen
mb_convert_kana()
Multi-bytes Strings
i18n_mime_header_decode
mb_decode_mimeheader()
Multi-bytes Strings
i18n_mime_header_encode
mb_encode_mimeheader()
Multi-bytes Strings
imap_create
imap_createmailbox()
IMAP
imap_fetchtext
imap_body()
IMAP
imap_getmailboxes
imap_list_full()
IMAP
imap_getsubscribed
imap_lsub_full()
IMAP
imap_header
imap_headerinfo()
IMAP
imap_listmailbox
imap_list()
IMAP
imap_listsubscribed
imap_lsub()
IMAP
imap_rename
imap_renamemailbox()
IMAP
imap_scan
imap_listscan()
IMAP
imap_scanmailbox
imap_listscan()
IMAP
ini_alter
ini_set()
Base syntax
is_double
is_float()
Base syntax
is_integer
is_int()
Base syntax
is_long
is_int()
Base syntax
is_real
is_float()
Base syntax
is_writeable
is_writable()
Base syntax
89
Aliases
Alias
Master function
Extension used
join
implode()
Base syntax
key_exists
array_key_exists()
Base syntax
labelframe
swfmovie_labelFrame()
Ming (flash)
labelframe
swfsprite_labelFrame()
Ming (flash)
ldap_close
ldap_unbind()
LDAP
magic_quotes_runtime
set_magic_quotes_runtime()
Base syntax
mbstrcut
mb_strcut()
Multi-bytes Strings
mbstrlen
mb_strlen()
Multi-bytes Strings
mbstrpos
mb_strpos()
Multi-bytes Strings
mbstrrpos
mb_strrpos()
Multi-bytes Strings
mbsubstr
mb_substr()
Multi-bytes Strings
ming_setcubicthreshold
ming_setCubicThreshold()
Ming (flash)
ming_setscale
ming_setScale()
Ming (flash)
move
swfdisplayitem_move()
Ming (flash)
movepen
swfshape_movepen()
Ming (flash)
movepento
swfshape_movepento()
Ming (flash)
moveto
swfdisplayitem_moveTo()
Ming (flash)
moveto
swffill_moveTo()
Ming (flash)
moveto
swftext_moveTo()
Ming (flash)
msql
msql_db_query()
mSQL
msql_createdb
msql_create_db()
mSQL
msql_dbname
msql_result()
mSQL
msql_dropdb
msql_drop_db()
mSQL
msql_fieldflags
msql_field_flags()
mSQL
msql_fieldlen
msql_field_len()
mSQL
msql_fieldname
msql_field_name()
mSQL
msql_fieldtable
msql_field_table()
mSQL
msql_fieldtype
msql_field_type()
mSQL
msql_freeresult
msql_free_result()
mSQL
msql_listdbs
msql_list_dbs()
mSQL
msql_listfields
msql_list_fields()
mSQL
msql_listtables
msql_list_tables()
mSQL
msql_numfields
msql_num_fields()
mSQL
msql_numrows
msql_num_rows()
mSQL
msql_regcase
sql_regcase()
mSQL
msql_selectdb
msql_select_db()
mSQL
msql_tablename
msql_result()
mSQL
mssql_affected_rows
sybase_affected_rows()
Sybase
mssql_affected_rows
sybase_affected_rows()
Sybase
mssql_close
sybase_close()
Sybase
mssql_close
sybase_close()
Sybase
mssql_connect
sybase_connect()
Sybase
mssql_connect
sybase_connect()
Sybase
mssql_data_seek
sybase_data_seek()
Sybase
90
Aliases
Alias
Master function
Extension used
mssql_data_seek
sybase_data_seek()
Sybase
mssql_fetch_array
sybase_fetch_array()
Sybase
mssql_fetch_array
sybase_fetch_array()
Sybase
mssql_fetch_field
sybase_fetch_field()
Sybase
mssql_fetch_field
sybase_fetch_field()
Sybase
mssql_fetch_object
sybase_fetch_object()
Sybase
mssql_fetch_object
sybase_fetch_object()
Sybase
mssql_fetch_row
sybase_fetch_row()
Sybase
mssql_fetch_row
sybase_fetch_row()
Sybase
mssql_field_seek
sybase_field_seek()
Sybase
mssql_field_seek
sybase_field_seek()
Sybase
mssql_free_result
sybase_free_result()
Sybase
mssql_free_result
sybase_free_result()
Sybase
mssql_get_last_message
sybase_get_last_message()
Sybase
mssql_get_last_message
sybase_get_last_message()
Sybase
mssql_min_client_severity
sybase_min_client_severity()
Sybase
mssql_min_error_severity
sybase_min_error_severity()
Sybase
mssql_min_message_severity sybase_min_message_severity()
Sybase
mssql_min_server_severity
sybase_min_server_severity()
Sybase
mssql_num_fields
sybase_num_fields()
Sybase
mssql_num_fields
sybase_num_fields()
Sybase
mssql_num_rows
sybase_num_rows()
Sybase
mssql_num_rows
sybase_num_rows()
Sybase
mssql_pconnect
sybase_pconnect()
Sybase
mssql_pconnect
sybase_pconnect()
Sybase
mssql_query
sybase_query()
Sybase
mssql_query
sybase_query()
Sybase
mssql_result
sybase_result()
Sybase
mssql_result
sybase_result()
Sybase
mssql_select_db
sybase_select_db()
Sybase
mssql_select_db
sybase_select_db()
Sybase
multcolor
swfdisplayitem_multColor()
Ming (flash)
mysql
mysql_db_query()
MySQL
mysql_createdb
mysql_create_db()
MySQL
mysql_db_name
mysql_result()
MySQL
mysql_dbname
mysql_result()
MySQL
mysql_dropdb
mysql_drop_db()
MySQL
mysql_fieldflags
mysql_field_flags()
MySQL
mysql_fieldlen
mysql_field_len()
MySQL
mysql_fieldname
mysql_field_name()
MySQL
mysql_fieldtable
mysql_field_table()
MySQL
mysql_fieldtype
mysql_field_type()
MySQL
mysql_freeresult
mysql_free_result()
MySQL
mysql_listdbs
mysql_list_dbs()
MySQL
91
Aliases
Alias
Master function
Extension used
mysql_listfields
mysql_list_fields()
MySQL
mysql_listtables
mysql_list_tables()
MySQL
mysql_numfields
mysql_num_fields()
MySQL
mysql_numrows
mysql_num_rows()
MySQL
mysql_selectdb
mysql_select_db()
MySQL
mysql_tablename
mysql_result()
MySQL
nextframe
swfmovie_nextFrame()
Ming (flash)
nextframe
swfsprite_nextFrame()
Ming (flash)
ociassignelem
OCI-Collection::assignElem
OCI8
ocibindbyname
oci_bind_by_name()
OCI8
ocicancel
oci_cancel()
OCI8
ocicloselob
OCI-Lob::close
OCI8
ocicollappend
OCI-Collection::append
OCI8
ocicollassign
OCI-Collection::assign
OCI8
ocicollmax
OCI-Collection::max
OCI8
ocicollsize
OCI-Collection::size
OCI8
ocicolltrim
OCI-Collection::trim
OCI8
ocicolumnisnull
oci_field_is_null()
OCI8
ocicolumnname
oci_field_name()
OCI8
ocicolumnprecision
oci_field_precision()
OCI8
ocicolumnscale
oci_field_scale()
OCI8
ocicolumnsize
oci_field_size()
OCI8
ocicolumntype
oci_field_type()
OCI8
ocicolumntyperaw
oci_field_type_raw()
OCI8
ocicommit
oci_commit()
OCI8
ocidefinebyname
oci_define_by_name()
OCI8
ocierror
oci_error()
OCI8
ociexecute
oci_execute()
OCI8
ocifetch
oci_fetch()
OCI8
ocifetchinto
oci_fetch_array(), oci_fetch_row(), oci_fetch_assoc(),
oci_fetch_object()
OCI8
ocifetchstatement
oci_fetch_all()
OCI8
ocifreecollection
OCI-Collection::free
OCI8
ocifreecursor
oci_free_statement()
OCI8
ocifreedesc
oci_free_descriptor()
OCI8
ocifreestatement
oci_free_statement()
OCI8
ocigetelem
OCI-Collection::getElem
OCI8
ociinternaldebug
oci_internal_debug()
OCI8
ociloadlob
OCI-Lob::load
OCI8
ocilogon
oci_connect()
OCI8
ocinewcollection
oci_new_collection()
OCI8
ocinewcursor
oci_new_cursor()
OCI8
ocinewdescriptor
oci_new_descriptor()
OCI8
ocinlogon
oci_new_connect()
OCI8
92
Aliases
Alias
Master function
Extension used
ocinumcols
oci_num_fields()
OCI8
ociparse
oci_parse()
OCI8
ocipasswordchange
oci_password_change()
OCI8
ociplogon
oci_pconnect()
OCI8
ociresult
oci_result()
OCI8
ocirollback
oci_rollback()
OCI8
ocisavelob
OCI-Lob::save
OCI8
ocisavelobfile
OCI-Lob::import
OCI8
ociserverversion
oci_server_version()
OCI8
ocisetprefetch
oci_set_prefetch()
OCI8
ocistatementtype
oci_statement_type()
OCI8
ociwritelobtofile
OCI-Lob::export
OCI8
ociwritetemporarylob
OCI-Lob::writeTemporary
OCI8
odbc_do
odbc_exec()
ODBC
odbc_field_precision
odbc_field_len()
ODBC
output
swfmovie_output()
Ming (flash)
pdf_add_outline
pdf_add_bookmark()
PDF
pg_clientencoding
pg_client_encoding()
PostgreSQL
pg_setclientencoding
pg_set_client_encoding()
PostgreSQL
pos
current()
Base syntax
recode
recode_string()
Recode
remove
swfmovie_remove()
Ming (flash)
remove
swfsprite_remove()
Ming (flash)
rewind
rewinddir()
Base syntax
rotate
swfdisplayitem_rotate()
Ming (flash)
rotateto
swfdisplayitem_rotateTo()
Ming (flash)
rotateto
swffill_rotateTo()
Ming (flash)
save
swfmovie_save()
Ming (flash)
savetofile
swfmovie_saveToFile()
Ming (flash)
scale
swfdisplayitem_scale()
Ming (flash)
scaleto
swfdisplayitem_scaleTo()
Ming (flash)
scaleto
swffill_scaleTo()
Ming (flash)
setaction
swfbutton_setAction()
Ming (flash)
setbackground
swfmovie_setBackground()
Ming (flash)
setbounds
swftextfield_setBounds()
Ming (flash)
setcolor
swftext_setColor()
Ming (flash)
setcolor
swftextfield_setColor()
Ming (flash)
setdepth
swfdisplayitem_setDepth()
Ming (flash)
setdimension
swfmovie_setDimension()
Ming (flash)
setdown
swfbutton_setDown()
Ming (flash)
setfont
swftext_setFont()
Ming (flash)
setfont
swftextfield_setFont()
Ming (flash)
setframes
swfmovie_setFrames()
Ming (flash)
setframes
swfsprite_setFrames()
Ming (flash)
93
Aliases
Alias
Master function
Extension used
setheight
swftext_setHeight()
Ming (flash)
setheight
swftextfield_setHeight()
Ming (flash)
sethit
swfbutton_setHit()
Ming (flash)
setindentation
swftextfield_setIndentation()
Ming (flash)
setleftfill
swfshape_setleftfill()
Ming (flash)
setleftmargin
swftextfield_setLeftMargin()
Ming (flash)
setline
swfshape_setline()
Ming (flash)
setlinespacing
swftextfield_setLineSpacing()
Ming (flash)
setmargins
swftextfield_setMargins()
Ming (flash)
setmatrix
swfdisplayitem_setMatrix()
Ming (flash)
setname
swfdisplayitem_setName()
Ming (flash)
setname
swftextfield_setName()
Ming (flash)
setover
swfbutton_setOver()
Ming (flash)
setrate
swfmovie_setRate()
Ming (flash)
setratio
swfdisplayitem_setRatio()
Ming (flash)
setrightfill
swfshape_setrightfill()
Ming (flash)
setrightmargin
swftextfield_setRightMargin()
Ming (flash)
setspacing
swftext_setSpacing()
Ming (flash)
setup
swfbutton_setUp()
Ming (flash)
show_source
highlight_file()
Base syntax
sizeof
count()
Base syntax
skewx
swfdisplayitem_skewX()
Ming (flash)
skewxto
swfdisplayitem_skewXTo()
Ming (flash)
skewxto
swffill_skewXTo()
Ming (flash)
skewy
swfdisplayitem_skewY()
Ming (flash)
skewyto
swfdisplayitem_skewYTo()
Ming (flash)
skewyto
swffill_skewYTo()
Ming (flash)
snmpwalkoid
snmprealwalk()
SNMP
strchr
strstr()
Base syntax
streammp3
swfmovie_streamMp3()
Ming (flash)
swfaction
swfaction_init()
Ming (flash)
swfbitmap
swfbitmap_init()
Ming (flash)
swfbutton
swfbutton_init()
Ming (flash)
swffill
swffill_init()
Ming (flash)
swffont
swffont_init()
Ming (flash)
swfgradient
swfgradient_init()
Ming (flash)
swfmorph
swfmorph_init()
Ming (flash)
swfmovie
swfmovie_init()
Ming (flash)
swfshape
swfshape_init()
Ming (flash)
swfsprite
swfsprite_init()
Ming (flash)
swftext
swftext_init()
Ming (flash)
swftextfield
swftextfield_init()
Ming (flash)
xptr_new_context
xpath_new_context()
94
Uvoduobjektnoorijentisanoprogramiranje
Objektno orijentisano programiranje – Pri učenju novog jezika uvijek se
najveća pažnja posvećuje učenju sintakse tog jezika i specifičnostima vezanim
za taj jezik. Međutim, jako je bitno razumjeti principe i metodologiju koji stoje
iza tog jezika.
Tema ovog kratkog teksta su osnovni pojmovi objektno orjentisanog
programiranja, govorićemo o jezicima koji su ili potpuno objektno orjentisani
ili to nisu, ali podržavaju OOP pristup programiranju.
Ovdje ćemo načelno analizirati opšte OOP princip i pojmove, koji su nezavisani od programskog jezika, a
samo kao ilustraciju navoditi neke konkretne primjere (c#).
U OOP-u se teži pisanju dijelova koda koji su laki za održavanje i ponovno upotrebljivi (code reuse), a sa
druge strane omogućavaju izvršavanje kompleksnih zadataka. Kompletna struktura objektno orjentisanih
programa veoma se razlikuje od strukture programa napisanih u nekom proceduralnom jeziku i daje
programu intuitivnu, prirodnu stukturu.
Televizor, ulica, drvo, kuća, knjiga su samo neki od objekata koje susrećemo u svakodnevnom životu.
Ideja objektnog programiranja je da se taj model objekata iz realnog života prenese i na programiranje. Tako
je u programiranju objekat svaki element koga treba predstaviti programu, podrazumjevajući pod tim i „žive“
objekte odnosno ljude i životinje. Uopšte OOP i njegova analogija sa objektima i događajima iz
svakodnevnog života, nam omogućava drugačiji pristup programiranju – nama lakše razumljivi i prirodniji
način, kao i mogućnost razbijanja programa na manje cjeline, čime obezbjeđujemo lakše upravljanje. OOP
principi su zasnovani na primjeni koncepta crne kutije.
Koncept crne kutije podrazumjeva korišćenje nekog objekta, bez konkretnog znanja o načinu
funkcionisanja tog objekta. Kao primjer možemo navesti televizor. Svako od nas zna šta je i kako da ga
koristi, ali se ne zamaramo time kako on radi. Takođe zamjena televizora drugim modelom podrazumjeva
neke razlike između modela, ali suština i osnovna namjena televizora ostaje ista, kao i standardi kako ga
priključujemo na električnu struju, gdje priključiti antentu itd.
Klaseikreiranjeobjekata
U programiranju klasa predstavlja definiciju ili šablon na osnovu koje kreiramo objekat.
Klasa se sastoji iz članova klase. Članovi klase su svi elementi koji sačinjavaju tu klasu i koristeći c#
terminologiju to su najčešće metode i polja. Često korišćen sinonim za metode u drugim jezicima je
funkcija.
Pričajući o objektima, pravili smo analogiju sa televizorom, i rekli da svi znamo „kako se koristi“, ali ne ne
znamo „kako radi“. Najčešće nam metode obezbjeđuju funkcionalnost „kako se koristi“, a cjelokupna
klasa sa svim njenim članovima nam obezbjeđuje „kako radi“.
Na slici 1 možete videti definiciju klase Imenik. Dodavanje, brisanje i pretraživanje predstavljaju
metode klase. Korišćenjem datih metoda korisnici mogu da manipulišu sa poslovnim imenikom, a polje
kontakti (List<string> kontakti) sadrži potrebne podatke sa kojima se radi.
95
Kao što možete primijetiti ispred definicije svakog člana klase stoji, u našem slučaju private ili public i to je
takozvani modifikator pristupa. Modifikatori pristupa služe da odrede koji će članovi klase biti vidljivi
ostatku sveta, a koji će biti vidljivi samo u datoj klasi i biti njeni interni članovi. Modifikator private uz
polje kontakti označava da će ovo polje biti vidljivo samo u klasi imenik, dok su public metode dodavanje,
brisanje i pretraživanje biti vidljive i van klase.
Klasa predstavlja šablon na osnovu koga ćemo kreirati objekat. Uobičajeni naziv za kreiranje objekta je
instanciranje.
Objekat objectImenik smo kreirali na osnovu klase Imenik. U sledećem redu smo startovali metodu
dodavnje, objekta objectImenik.
Metodeipromjenjive
Metode se sastoji iz potpisa i tijela metode. Pod potpisom podrazumjevamo modifikator pristupa o kome je
bilo reči, zatim povratni tip, naziv same metode i ulazne parametre. Telo metode sadrži samu funkcionalnost
metode, odnosno egzaktni posao koji ona odrađuje. Napomenimo da c#, c++ i java koriste tipizirane
podatke. To znači da neka promjenjiva ne može da sadrži bilo koji tip podatka, kao na primjer u shell
programiranju ili u php-u već je svaka promjenjiva određenog tipa i shodno tome sadrži podatke samo
određenog tipa (string, int, float itd). Povratni tip je rezultat koji metoda vraća. Na slici 1 povratni tip za sve
tri metode je bio void, što znači da metoda ne treba da vrati nikakvu vrijednost. Ulazni parametri su podaci
koje prosljeđujemo metodi, pri njenom pozivanju, ali metoda ne mora sadržati nijedan ulazni parametar
što je i slučaj na slici 1.
Jedna od objektno orjenitsanih mogućnosti koju implementiraju c++, c#, java itd., pa i php; je takozvano
preopterećenje metoda (overload), odnosno situacija da nekoliko metoda nazovemo istim imenom, a da
imaju drugačije potpise.
Preopterećenje metoda često koristimo u situaciji kada trebamo da izvršimo istu operaciju, sabiranje u
našem slučaju, ali broj ulaznih parametara varira. Tako prva metoda kao ulazne parametre uzima dvije
cjelobrojne (int – integer) vrijednosti, a kao rezultat vraća cjelobrojnu vrijednost zbira ulaznih vrijednosti.
Druga metoda prima tri cjelobrojna broja kao argumente i vraća njihov zbir, a treća metoda prima četiri
cjelobrojne vrijednosti kao ulazne parametre, a povratni tip je njihov zbir.
96
Osnovniprincipiobjektnoorjentisanogprogramiranja
Osnovni principi objektno orjentisanog programiranju su:
Apstrakcija
Enkapsulacija
Modularanost
Polimorfizam
Nasljeđivanje
•
•
•
•
•
Osnove vrijednosti OOP-a
1. Objekti. U OOP metafori osnovna jedinica je objekt, što je konkretna realizacija klase. U objektno orijentiranom svijetu izbjegava
se korištenje globalnih varijabli, nego svaki objekt ima svoje varijable, koje još zovemo i podatkovni članovi klase. Isto tako nema
više ni samostojećih funkcija, nego funkcije pripadaju klasi, bilo da vanjskom svijetu nešto kazuju o stanju objekta, ili mijenjaju
stanje objekta, a zovemo ih funkcijski članovi klase ili metode.
2. Učahurivanje ili enkapsulacija objekata. Pošto ne postoje globalne varijable, iz drugih dijelova koda nije moguć pristup
varijablama klase nikako osim ugrađenim metodama za njihovo čitanje i pisanje (ukoliko smo ih deklarirali kao privatne, što je
preporučeno). Na taj način se osigurava da objekt ne može doći u neko nepredviđeno stanje iz bilo kojeg razloga, npr. kad mu se
pristupa istovremeno iz više dijelova koda (ako imamo višenitno programiranje) jer nužno je koristiti funkcijske članove objekta u
koje se mogu ugraditi sigurnosni mehanizmi poput sinkronizacije.
3. Apstrakcija - čest je slučaj da se neki objekti minimalno razlikuju, i zasebno definiranje svakog od njih je redundantno. Osim toga
za samo efikasno projektiranje praktično je pojednostavljivanje konkretnog problema. Tu ulaze u igru apstraktne klase i sučelja.
4. Nasljeđivanje - kad već definiramo neki objekt, a zatreba nam neki sličan objekt koji je zapravo podskup početnog objekta,
moguće je naslijediti početni objekt, čime štedimo vrijeme za programiranje (makar to bio copy-paste) i diskovni prostor.
5. Višeobličje ili polimorfizam - kao što je preopterećivanje operatora zgodna stvar ponekad, tako preopterećivanje metoda zovemo
polimorfizmom. Moguće je definisati nekoliko metoda istog imena, a svaka će kao parametre primati objekte različitih tipova.
Enkapsulacija i apstrakcija su pojmovi koji se međusobno nadopunjuju i teško ih je do kraja razdvojiti.
Apstrakcija predstavlja proces zapažanja osobina i ponašanja objekata, a enkapsulacija se fokusira na
implementaciji koja će dovisti do takvog ponašanja. Najprostije rečeno, na primjeru našeg televizora s
početka, apstrakcija bi bila gledanje televizora iz ugla korisnika – odnosno šta radi, a enkapsulacija bi bila
konkretna implementacija – kako radi. Pri tome bitan faktor enkapsulacije je skrivanje unutrašnje strukture
klase i prikazivanje korisnicima samo onog dijela koji treba da vide.
Jedan od fundamentalnih aspekata OOP-a je nasljeđivanje. Postoji više vrsta nasljeđivanja – nasljeđivanje
implementacije i nasljeđivanje interfejsa. Takođe zavisno od programskog jezika i njegove OOP
implementacije nasljeđivanja, može se podijeliti na jednostruko ili višestruko. Ali da vas ne bi zbunjivali
ovim podijelama, neka suštinska definicija nasljeđivanje je da ono predstavlja vezu između klasa u kojoj
jedna klasa nasljeđuje strukturu i ponašanje druge klase – jednostruko nasljeđivanje ili više klasa –
višestruko nasljeđivanje. Jedan od OOP jezika koji podržava sistem višestrukog nasljeđivanja je c++, dok
recimo c# podržava samo jednostrano nasljeđivanje.
Klasa koja se nasljeđuje naziva se baznom ili osnovnom klasom, a klasa koja je nasljeđuje naziva se
izvedenom klasom. Dakle, nasljeđivanje je hijerarhijska organizacija klasa, gdje jedna klasa nasljeđuje
drugu i zadržava kompletan sadržaj klase koju nasljeđuje i taj sadržaj može proširiti ili redefinisati.
U direktnoj vezi sa nasljeđivanjem je i polimorfizam – vjerovatno jedno od najmoćnijih svojstava objektno
orjentisanog programiranja. To je svojstvo da objekat izvršava operaciju na način svojstven izvedenoj klasi
kojoj pripada, mada mu se pristupa kao objektu osnovne klase.
Modularnost se odnosi na postupak razbijanja programa na manje dijelove koji mogu autonomno
funkcionisati. Modularnost se primjenjuje kako bi se omogućila višestruka upotreba softverskih
komponenti, odnosno takozvana ponovna upotreba koda (code reuse).
Umjesto zaključaka ovog uvoda u objektno programiranje recimo da mi možemo koristiti date kontrole i bez
poznavanje objektnih principa, ali neophodno je razumjevanje istih.
Korišćenje raznih frameworka i paterna podrazumjeva razumjevanje objektnih principa.
97