97
PHP uvo Prije korišćen Izvori: Pri pravljenju http://downlo http://www.b http://php.co http://imi.pm http://web.zp http://free-bj http://lekcije. od u dina nja ovog priru u priručnika k oad.tutoriali.o bubaj.com/ind om.hr mf.kg.ac.rs/com pr.fer.hr/ergon j.t-com.hr/arm .smiko.info/ht amičko pr učnika potrebn korišten je My org/Tutorials/P ex.php?php mponent/docm nomija/2004/a m/obrasci.html tml/forms/text. rogramir no se upoznati ySQL 5.6 Refe PHP/PHP_My man/doc_view/ aleta/php4.htm l .html 1 ranje i sa osnovama erence Manua ySQL_forme.p /480-wp-vezbe m Mater a HTML-a i S al i internet a n pdf e-4.html rijal prikupio i QL-a (mySQL najviše materij Mod obradio: Miros L-a). jala je preuzet deli i Baze Podataka slav Mihaljišin Arhitektura troslojne veb aplikacije to sa sajtova: a n

PHP dinamičko programiranje - razno.sveznadar.info · PHP pruža mogućnost za dobro i pravo objektno programiranje. I PHP ima jako mnogo ugrađenih gotovih funkcija koje mogu mnogo

  • Upload
    others

  • View
    8

  • Download
    1

Embed Size (px)

Citation preview

PHPuvo

Prije korišćen

Izvori: Pri pravljenjuhttp://downlohttp://www.bhttp://php.cohttp://imi.pmfhttp://web.zphttp://free-bjhttp://lekcije.

odudina

nja ovog priru

u priručnika koad.tutoriali.obubaj.com/indom.hr mf.kg.ac.rs/compr.fer.hr/ergonj.t-com.hr/arm.smiko.info/ht

amičkopr

učnika potrebn

korišten je Myorg/Tutorials/Pdex.php?php

mponent/docmnomija/2004/a

m/obrasci.htmltml/forms/text.

rogramir

no se upoznati

ySQL 5.6 RefePHP/PHP_My

man/doc_view/aleta/php4.html .html

1

ranje

i sa osnovama

erence ManuaySQL_forme.p

/480-wp-vezbem

Mater

a HTML-a i S

al i internet a npdf

e-4.html

rijal prikupio i

QL-a (mySQL

najviše materij

Mod

obradio: Miros

L-a).

jala je preuzet

deli i Baze Podataka

slav Mihaljišin

Arhitektura troslojne veb aplikacije

to sa sajtova:

a

n

2

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

3

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

Klijentse Odranije: PHP (Hypertenaučenim se posnovu koga one prikazuje koVećina sintaks

Doslovno, PHZnači da se skod. Na stranPHP kod mo

Osnovni smisaDa biste korisOsim nekih bePHP je skriona poslanaima .php ekskripe.

Nakon prijekod i šalje gnigdje na seDrugim rijese ona, popmože videtiNaglašavamside skripte Program koizvršavanjuPHP interpr

1. PHPda i

2. a mDruga varije na taj načUobičajen s

• klij• serv• veb

kaokaoitd.)

Za razliku oPaskalu, klasadrži skupsmatra i kra

erverarh

ext preprocessopostiže mnogo. određuje šta ćekorisniku, te korse je preuzeta izHP:Hypertext Psvi PHP prograni klijenta se vi

ože biti ugrađenao PFP jezika jtili vašu PHP s

esplatnih, većiniptni programa klijentu pokstenziju. N

ema zahtjevaga klijentu. Terveru odakleečima, PHP jpunjena dinai kod (skripmo: PHP je se izvršavaj

oji se napiše. retator može P CGI princiizvrši datu sk

može biti instaijanta je dančin uvijek učscenario po ent (korisnikver prosljeđub-server prepo program po rezultat za) rezultat se pod većine prasa sa main naredbi, ko

ajem PHP pro

hitekturai

r) je programskU trenutku ka

prikazati korisrisnik u Internetz C, Jave i PerlPreprocessor jeami izvode na sidi samo HTMLn u HTML ili u oje brzo i jednos

skriptu ili strania komercijalnih

mski jezik poopunjenu dina blok šemi

a sa PHP doTo znači da e ju je klijentje skript jezi

amičkim sadrt) koji je genserver-side su na serveru

u PHP-u n

raditi po ipu, odnosnokriptu svaki paliran i kao mnas u najveitan u memokom se izvr

k Interneta kouje zahtjev sepoznaje da spomoću PHahtjeva klijeprikazuje klirogramskih jmetodom u

oje se izvršavograma.

itehnolog

ki jezik raširen d korisnik posjsniku. Sve ostalt preglednik pria s nekoliko jede server-side HTserveru, a klijenL kod, dok je samodvojenoj datotstavno pisanje dicu s PHP kodoh servera podržomoću kojegnamičkim sad

ispod preds

okumentom sstranica kojat primio. Ovoik pomoću kržajem, pošanerisao sadrskriptni prog(poslužitelju

e zahtjeva p

o tako što će put kad budemodul veb-sećoj upotreb

oriju te se ne šavaju PHPoji koristi neervisu za vebse traži PHPP modula izent prepoznijentu na odgjezika koji p Javi itd.), Pvaju jedna z

4

gijaizvrša

i popularan prjeti vaše PHP slo kao npr. matima generisanudinstvenih speci

HTML-embeddedntu se potom šam program sakrteci. dinamički generom, vaš web seržava PHP. g možete kredržajem. Serstavljeno je

server izvršaa se prikazujo može stvoriti pkojeg možetealje klijentu.ržaj koji glegramski jeziku) kada serve

prevođenje (

interpretatore zahtjevana ervisa.

bi jer pruža mora poziva

P skripte je seki internet prb (program vP datoteka nezlazni tekst

naje vrstu regovarajući naposeduju počPHP datotekza drugom, o

avanjePH

ri izradi web strstranice, vaš wtematičke opera

u HTML stranicifičnosti. d skriptni jezik. alje samo rezultkriven od klijent

rirsanih stranicrver mora podrž

irati HTML rver zna da kako PHP p

ava PHP kodje u pretraživpoteškoće pri po

e kreirati HTM Ovim način

eda, već imak za dinamičer primi zaht

(kompajliran

r postojati kaod nekog ko

znatno većuati spoljašnji sljedeći: regledač) zah

veb-server nae šalje njego

programa ezultata (HTačin. četnu funkcijka, nalik na vod prve do p

HPskripti

ranica. Izuzetnoweb server autoacije, operacijeu bez PHP kod

Šta to uopšte zntat izvođenja, odta.

ca: dinamičko wžavati PHP.

stranicu na izvrši PHP kprogram izvr

d i na osnovuvaču klijentaozicioniranju-raML stranicunom generispristup čistčko generirantjev za PHP d

nje), nego se

ao eksterna aorisnika,

u brzinu izvprogram.

htjeva PHP sa serveru) v sadržaj kli(standardni

TML kod, sli

ju (main u Cvećinu skrip

posljednje, gd

i

o je jednostavanomatski obrađuje s datotekama,da.

znači? dnosno odgova

web programira

serveru prijekod kada zaršava dinam

vu njega genea ne postoji urangiranju vašihu na serveru anja sadržajtom HTML nje HTML kdokumentom

e interpretira

aplikacija, ko

vršavanja –

stranicu sa se

ijentu, nego i izlaz) se šalika, PDF sad

C-u, prvi bloptnih jezika, dje se poslje

n za učenje, a sje PHP kod na, varijable i dr.

arajući HTML

anje.

e nego što jeahtjevani fajl

mičke HTML

eriše HTMLu tom oblikuh stranica. pre nego štoa klijent nekodu.

koda. Serverm.

a pri svakom

oja se poziva

interpretator

ervera

ga izvršavaalje klijentudržaj, arhiva

ok BEGIN ujednostavno

ednja ujedno

s a .

e l

L

L u

o e

r

m

a

r

a u a

u o o

5

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. PHPstiloviPostoje (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.

PraznineTo 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. KomentariKomentari 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.

6

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 isset() 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)

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

7

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

8

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

9

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_connectOtvara 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_dbNakon š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_querySad 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"); ?>

10

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. IspispodatakaSlijedi 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).

PraktičnOBAVEZNSve se čini i

V1:Kreira Za kreiranjeCREATE D V1-A Sljede <?php $konekcijaif (!$kone{ die('Gresk} if (mysql_{ echo "Baza} else { echo "Gres} mysql_clos?>

AnalizirajtAko je jasno Inače (kao š V1-B Sljed"Prezime" <?php $konekcijaif (!$kone{ die('G} // Kreiramif (mysql_{ echo "} else { echo "} // Kreirammysql_sele$sql = "CR( Ime varchaPrezime vaGodine int)"; // Izvrsavmysql_quermysql_clos?>

nevježbeNO samostaln

isto kao što jPonavljam

anjebazepo

e baze podataDATABASE

eći primjer ć

a = mysql_cekcija)

ka: ' . mys

_query("CRE

a je kreira

ska 22 pri

se($konekci

te upotrebu šta i kako se i

što će biti ob

deći primjer i "Godine"

a = mysql_cekcija)

Greska u ko

mo bazu moj_query("CRE

"Baza mojab

"Greska pri

mo tabelu Kect_db("mojREATE TABLE

ar(15), archar(15),t

vanje SQL ury($sql,$kose($konekci

SET1:V1no provježbaje objašnjenomo: Neke od

odatakaita

aka koristimime_baze;

će uz pomoć

connect("lo

sql_error()

EATE DATABA

ana";

kreiranju:

ija);

operatora ! izvršava nako

bjašnjeno kas

će uz pom".

connect("lo

onekciji: '

jabaza2 EATE DATABA

baza2 je kr

i kreiranju

Korisnici jabaza2", $E Korisnici

,

upita onekcija); ija);

‐V3ati i analizirato, ali vježba komandi i st

abeleubaz

o SQL koma

PHP-a kreira

ocalhost","

));

ASE mojabaz

: " . mysql

on if (!$kosnije ! je nega

moć PHP-a

ocalhost","

' . mysql_e

ASE mojabaz

reirana";

u: " . mysq

$konekcija)i

11

ti ovdje datečini majstoratruktura ćem

zi

andu CREAT

ati bazu pod

"root","");

za",$konekc

l_error();

onekcija)dacija pa će re

kreirati tab

"root","");

error());

za2", $kone

ql_error();

);

primjere. a...

mo kasnije de

TE DATABA

ataka pod im

;

cija))

dobar dio ovoezultat if-a b

belu "Kori

;

ekcija))

;

taljnije obra

ASE:

menom "moja

og priručnika miti true, ako k

snici" sa tr

Kra - Nkonpod- Poprikbaz- Samyskrei - Uupis- Pofunk - Nfunk

aditi.

abaza".

možete samo pkonekcija ne

ri kolone i

atko objašnjenNakon uspostanekcije kreiraldataka "mojabomoću if - elskazujemo "staze. ada, pomoću Psql_select_dbiranu bazu.

U promjenljivusujemo SQL uomoću mysql_

nkcije izvršavaNajzad, zatvarankcijom mysql

prelistati. e postoji.

to: "Ime",

nje PHP kôda:avljene li smo bazu baza2" e grana

atus" kreirane

PHP funkcije selektujemo

u $sql upit (query) _query() amo upit amo konekcijul_close();

,

u

12

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

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.

13

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. CijelibrojeviU 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čnimzarezomPostoje 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.

14

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

15

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.

16

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

as

Nizovi‐P PHP podržabiti jednodim

socijativni ni

Ustvari, uop Primjer cje<?php $arr_boje echo $arr_echo $arr_echo $arr_ $arr_boje[$arr_boje[$arr_boje[ echo "Boje// želite foreach ($echo $int_} ?> Rezultat skr

Ispis se oba

Polja(Arr

ava više vrstmenzionalniiz

pšte nema ra

elobrojnog je

= array('p

_boje[0] . _boje[2] . _boje[1] .

[3]='crveno[2]='pink';[7]='roza';

e predstvljli ispisat

$arr_boje a_kljuc . "

ripte :

avla foreach p

rays)

ta nizova. Tei ili multidim

zlike između

ednodimenzi

plavo',"siv

"<br>"; //"<br>"; //"<br>"; //

o'; // doda; // mijenj; // indexi

jene nizom"ti sve elem

as $int_klj=> " . $st

petljom (koju

ekstualne (asmenzionalni.

u ta dva tipa

onalnog niza

vo","zeleno

/ ispisaće / ispisaće / ispisaće

aje novi elja vrijednoi ne moraju

" . "<br>";mente niza

juc => $strtr_vrijedno

u ćemo kasni

17

ssociative) i

inde

polja.

a:

o") ;

'plavo' 'zeleno' 'sivo'

lement u niost na indeu slijediti

; možete se

r_vrijednosost . "<br>

ije obraditi).

cjelobrojne

eksi niz

iz exu 2 - zeli hronološk

služiti ov

st){ >\n";

.

(vectors / in

leno prelazki redoslje

vom metodom

ndexed) inde

zi u ljubičed

m

xima. Mogu

často

u

18

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 …

19

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

Operatordodjele4Dodjeljuje 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"; // ispisuје 2 echo (5 % -3)."\n"; // ispisuје 2 echo (-5 % 3)."\n"; // ispisuје -2 echo (-5 % -3)."\n"; // 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

20

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.

21

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 Upotreba == jednako $a == $b

=== identično $a === $b != različito $a != $b <> različito $a <> $b < manje od $a < $b > veće od $a > $b

<= manje ili jednako od $a <= $b >= veće ili jednako od $a >= $b

22

Logičkioperatori Tabelarni pregled logičkih operatora:

Operator Ime Upotreba Rezultat ! negacija !$b vraća true ako je $b false i obrnuto

&& konjukcija $a && $b Vraća true samo ako su i $a i $b true || disjunkcija $a || $b Vraća true ako je ili $a ili $b true

and konjukcija $a and $b Isto kao && samo niži prioritet or disjunkcija $a or $b 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.

23

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) (object) @

Desno []

n/b new

n/b ( )

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.

24

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

Npr. konverzija integer varijable u string tip:

$a=13; $b=(string)$a; Vraćanje nazad: $a=(integer)$b;

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

25

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;

Praktičn

Vrlo bitna HTML-a. Tpotrebno prHTML kodaUnutar kodakontrolnih stpodatci iste s Podsjećamo<html> <head> <title>Pr</head> <body> // 1. nač<?php ech// 2. nač<?php ech?> // 3. nač<script lecho ("ne</script>// 4. nač<% echo (</body> </html> Najčešće se PodsjećamHTML):

• prinbez

• echoba

• prinoba

Primjer upo<html> <body> <?php print "Ovoprint "<p>echo "Ovo "P.S. Ovdj"ako strinprint "<p>printf ("Oprint "<p>printf ("Fkoristi zaprint "<p>printf ("Nfunkcijom ?> </body> </html>

nevježbe:

Neke od

karakteristikTako u PHP-rvo njega izva klijentu. O

a se možemo truktura. Ovostrukture. Zvu

o postoje 4 n

rimjer ugr

čin ho ("Ovo jčin ho("Ako ze

čin language="eki editor> čin ("Ako je o

e koristi 2. na

o i na to P

nt - najjednoz, i sa zagradaho - funkcijaavezno odvajntf - funkcijavezno zahtjotrebe:

o je print >"; je echo fu

je mozete dngove razdv>"; Ovo je prin>"; Funkcija pra formatira>"; Ne zaboraviprintf.");

PHPvari

d komandi i s

ka PHP-a i -u korištenjevršiti i tek n

Ovo je osnovau bilo kojem nam omoguć

uči nejasno? D

ačina za ume

radenog ko

je najjedn

elite posl

"php"> ri ne vole

omoguceno

ačin jer omog

HP koristi t

ostavnija funama. a slična prejamo zarezima koja najčejeva upotreb

funkcija."

unkcija.", dodati i drvojite zare

ntf funkcij

rintf se naanje brojki

ite zagradu;

ijableuH

struktura ćem

bilo kojeg dem <? I ?> gnakon toga pa server-clientrenutku prebćuje rad sa ša

Da ilustrujem j

etanje PHP k

oda</title

nostavniji

luzivati X

e bas proc

koristenj

gućuje imple

tri funkcije z

nkcija za slan

thodnoj, samma. Sa ovomšće služi za bu zagrada.

";

" ", rugi stringezom.";

ja.");

ajcesce i.");

u sa

26

HTMLmod

mo kasnije drazjas

drugog jezikgovorimo serposlati HTMnt mrežne kobaciti iz HTMablonima-tempjednim vrlo je

koda u HTM

e>

i nacin\n"

XHTML ili

cesirati i

je ASP tag

ementiranje n

za ispis (to

nje teksta u

mo što ovdjm funkcijom s

formatiranje

g", " ",

du

detaljnije obrnili u predho

ka je razdvajrveru da se

ML output toomunikacije pML moda u PHmplejtima u kojednostavnim p

L dokument

"); ?>

HML dokum

instrukcij

gova, onda

novih genera

su one koje

prozor brow

je možete dse ne koriste e brojki kao i

radit, a neke sodnim vježba

janje server između njih g koda skupputem TCP/IHP mode. Ča

ojima se na isrimjerom.

:

mente, ond

je (npr. F

a mozete i

acija XHTML

e služe za "s

wser-a. Funkc

a kombinujezagrade.

integera, dec

R

smo

ama.

side koda oh nalazi PHPpa sa ostatkoIP protokolaak i unutar if,sti način prika

da ovako..

Frontpage)

i ovako");

L-a PHP kod

slanje" običn

cija može da

ete više stri

cimala itd. O

Rezultat k

od statičkogP kod i da jeom statičkoga. f, for i ostalihazuju različiti

..\n");

)");

; %>

dom.

nog teksta u

a se navodi i

ingova, koje

Ova funkcija

koji server

g e g

h i

u

i

e

a

r vraća:

27

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.

28

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 jednu <b>boldanu</b> rijec</p>"; echo "<u>HTML koji se ureduje:</u><br>" . $str_HTML; ?> <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:

29

• ' &' (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 od 4 dijela\r"; echo nl2br($string); //samo tekst - izbacuju se kodovi za formatiranja print "<p>"; //novi red echo nl2br("Specijalni znakovi prekidaju neprkidan\n trakasti ispis"); ?>

30

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 } ?>

31

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

32

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' . '<br>'; switch ($i) { case 0: echo "i equals 0"; break; case 1: echo "i equals 1"; break; case 2: echo "i equals 2"; break; } ?>

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

33

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 Primjer B <?php $x = 1; while($x <= 5) { echo "The number is: $x <br>"; $x++; } ?>

<?php $int_var=10; while ($int_var<=20){ echo '$i = ' . $i . '<br>'; echo "vrijednost varijable je $int_var"; $int_var++; echo <br>; }

34

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 ) ?>

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!

Budite oprezni pri postavljanju uslova! 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>'; }

// što rezultira: // $i = 10 // $i = 9 // $i = 8 // $i = 7 // $i = 6 // $i = 5 // $i = 4 // $i = 3 // $i = 2 // $i = 1 // $i = 0

35

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

// rezultira // jaja => 12 // paprika => 6 // maslac => 0 // mlijeko => 0.5 // salama => 0.2 kg - narezano // sir => 0.4 kg - u komadu

Vježba:KGenerisa

Koristeći slj <?php $users = echo '<ceecho '<taecho '<thfor ($i ={ echo '<trecho "<tdecho "<tdecho '</t} echo '</t?> Rezultat skr

KorišćenjeanjeHTML

jedeći odsječ

array('Peenter>'; able bordeh>Number</= 0; $i <

r>'; d>$i</td>"d>$users[$tr>';

table>';

ripta:

ekontrolLkodapo

čak provježb

ero', 'Ana

er = 2 >';/th><th>Uscount($us

"; $i]</td>";

nihstrukomoćupet

baj generisanj

a', 'Marij

; sername</tsers); $i+

;

36

ktura/tlji

je HTML ko

ja', 'Zvek

th>'; ++)

oda korišćenj

kan', 'Kos

jem for petlje

sta');

e:

37

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šćenjeeksternihfunkcijaKoriš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.

38

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; } $neki_broj=12; povecaj($neki_broj,10); echo $neki_broj; ?>

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.

39

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. Ovaj slučaj ne radi: <?php function automobili($bolji="Audi",$gori){ echo "$bolji je bolji od $gori"; } automobili("Peglice"); ?>

Pravilno korištenje : <?php function automobili($gori,$bolji="Audi"){ echo "$bolji je bolji od $gori"; } automobili("Peglice"); ?>

40

Funkcijezaobradupromjenljivihgettype()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

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

41

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:

42

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.

43

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.

44

PozicijaznakaPronalaž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)

45

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.

46

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:

47

$skracenice["BA"]="Bosna i Hercegovina"; sort($skracenice); foreach($skracenice as $kljuc => $vrednost) { echo "<li>$kljuc = $vrednost </li>"; } ?> </ul> </body> </html> DužinanizaDuž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);

48

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а ?>

Vježbe:P

Rad s

U funkciji dnpr: d – dan u mm – tekući mY – tekuća gU format se Primjer skri<?php echo dateecho "<brecho dateecho "<brecho date?>

Za vraćanjeSintaksa: mktime(hNpr. ako že<?php $tomorroecho "Su?> Mogući rezuSutra je Analiziraj oCreate a simbirth day. <?php $target_day$today = ti$diff_days $days = (inprint "Days ?> Write a PHPSample dateExpected Re <?php $sdate = "1$edate = "2 $date_diff = $years = flo$months = $days = flo printf("%d ?>

PHPdate

a datumima j

date() obavez

mjesecu, brojčmjesec, brojčgodina, četv

e mogu upisa

ipta:

e("Y/m/d")r />"; e("Y.m.d")r />"; e("Y-m-d")

e sistemskog

hour,minulimo ispisati

ow = mktiutra je “

ultat skripte:e 14/05/2

ovdje date primple 'birthday

ys = mktimeme(); = ($target_dnt)($diff_day till next birt

P script to caes : 1981-11esult : 31 yea

1981-11-04"2013-09-04"

= abs(strtot

oor($date_d floor(($date

oor(($date_d

years, %d m

exercises

je često neop

zno je navest

čano (01-31)čtano (01-12eroznamenka

ati i znakovi

);

);

);

vremena i da

ute,seconi sutrašnji da

ime(0,0,0 . date(

: 015

imjere: y countdown

e(0,0,0,05,3

days - $todays/86400); thday: $day

alculate the d-04, 2013-09ars, 10 mont

"; ";

ime($edate)

diff / (365*60e_diff - $yeadiff - $years

months, %d

s

phodan pa o

ti format vrem

) ) asto “/”, “.” i dr,

atuma korist

d,month,dtum:

,date("m""d/m/Y",

n' script, the

1,2015);// m

ay);

s days!";

difference be9-04 ths, 11 days

) - strtotime(

0*60*24)); ars * 365*60* 365*60*6

days", $yea

49

ovdje dati pri

mena i datum

ti se funkcija

day,year,

"),date("$tomorro

script will co

modify the b

etween two d

($sdate));

0*60*24) / (60*24 - $mo

ars, $months

imjeri predstkasn

ma. U tu svrh

Moguć

a mktime()

,is_dst)

"d")+1,daow);

ount the num

birth day 12/

dates.

(30*60*60*onths*30*60

s, $days);

tavljaju osnoniji ozbiljan rhu koriste se

ći rezultat ov

ate("Y"))

mber of days

/31/2013

24)); *60*24)/ (6

ov za rad. predefiniran

ve skripte:

);

between cur

60*60*24));

na slova,

rrent day and

;

d

50

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'); ?>

51

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

52

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/endPrimjer 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.

53

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.

54

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 :

55

($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.

56

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.

Forme‐P

Forme se kokojem je jezkoja su za kUz poznavaunesene u finformacija Počnimo saSa tehničkepodataka (tU te elemenkoju svrhu (Razlog gruUglavnom kcjelinu (primObrasce koregistraciju,Forma je neSve forme s

1. NečUnua) b) Akc

2. Drupodpodelemizab

<fo

PHPobras

oriste u prekziku aplikaci

koju namjenuanje HTML formu. Ovdj.

a vrlo jednoste strane gledtipa text boxnte korisnik (unos inform

upisanja višekada se vrši mjer : login foristimo kako, popunjavanevidljiva. Njuse sastoje od čega što bi uutar njega seakcija i metod

cija i metod

ugi dio je kodatke koje odataka od komenti imaju bere jednu od

Ilu

orm actio

fajatr

atribut ac

sci

Podsjetni

ko 90% svih ija napisana.u najbolja, na

dijela forme ćemo se p

tavnim pitanjdano, forma x, select meni

(vidi Dodatmacija u bazue elemenata znekakav uno

forma sa usero bismo dobnje ankete i su možemo zatri osnovna slovno mogl

e definišu dva

definišu šta i

ontejner kojiona skuplja/sorisnika posmogućnost dd ponuđenih

ustracija koja

on="actio

l kome se ribut akcija ob

ction

ik koji se odn

manjih a go. Zbog ovogaačine grupisa

mi, potrebno pozabati tom

jem. Što je fje HTML e

i, opcije … )tak) može unu podataka, slza unos podaos na web strnameom i p

bili povratnulično. amisliti kao ndijela:

li nazvati zaga atributa:

i kako ćemo

i sadrži objesadrži. Postostoje različitdirektnog unvrijednosti.

a pokazuje ob

n.php" m

braća

atr

57

Za rad snosi na ovaj

otovo su nezaa je potrebnoanja elemenaje znati kak

m problematik

forma? element pom). nijeti (ili izalanje e-mailaataka u jednutranici, običnpasswordom)u informaciju

nevidljivi 'ko

glavlje ili dek

raditi sa obj

ekte (elemenoji vrlo očitati elementi nosa podatak

bjekt (izgled

metod koji j

ethod= "p

ribut method

sa obrascimadio HTML ko

amjenjive koo imati znanjata … ). ko prihvatiti kom od izra

moću kojeg

abrati) informa sa unesenimu formu je vino se radi o v). u od korisni

ontejner' u ko

klaracija form

ektima iz dru

nti- ulazi) saa potreba zaod kojih sv

ka od strane s

d i elemente) j

je izabrao atr

post" >

d

a potrebno jeodovanja mo

od većih webje samih HT

pomoću PHade jednostav

grupšemo v

macije koje sm informacijše – manje oviše povezan

ka. Puno pu

ojeg se umeć

me; to je sam

ugog dijela

a kojima se a više različvaki ima neksurfera, dok

jedne standa

ibut method

e predznanjeožete pronać

b aplikacija, TML formi (t

HP-a vrijednvnih formi i

više elemen

se kasnije koama…

očit. nih informac

uta tražimo o

ću novi elem

m <form> ta

u formi račitih načina ke svoje osmu drugi om

ardne forme

e iz HTML-a.ći u Dodatku.

nezavisno utipove polja,

nosti koje suprihvaćanja

ata za unos

oriste za bilo

ija koje čine

od korisnika

menti.

ag .

adi; odnosnoprikupljanja

sobine. Nekimogućuju da

u ,

u a

s

o

e

a

o a i a

58

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

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

59

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.

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.

PRIHVATuvarijabli(Xi,Yi...)

čitavanjje

Fajl2

Get ili Post

Varijable(Xi,Yi...)

Fajl1

Varijable Obrazac koja ako razmšKako proslijNaziv varijaNa taj načiMozilla Meobjašnjeni j

method="GAko je metlocation barNpr. http://dsadrži dvijeDakle, sve i Ova metodaPrvo, pomoserveru na ograničenjeDrugo, podaOvo iz siguovo biti požkorisnik dodDakle, ova sigurnost.

ji ne može dšljamo o dinaijediti varijabable se određn se stvara

essenger ...). e Dodatku (v

GET“thod="GET"ru vašeg brow

domena.co varijable (piza upitnika

a ima dva ogoću ove meto

kojem je oe od 32kB za aci koji se šaurnosnih razlželjno, ako nda u Favorite

metoda je

da proslijedi amičkom proble? đuje pomoćupar name="v Ovo će se r

vidi Input typ

tada se unewsera.

om/skriptodatka): boja

a jesu varijab

graničenja. ode može se obrazac i o

GET metodalju mogu se loga ponekanpr. želimo des. poželjna sam

do skripte kogramiranju n

u NAME atribvalue" koji razjasniti krope...).

eseni podaci

a.php?boja čija je vrijeble i njihove

poslati ograserveru na

du. vidjeti u adrd nije dopusda cjelokupn

mo ukoliko

60

koja će ih dalnema baš nik

buta, a njezinse prosljeđuoz praktične

prosljeđuju

ja=plava&ednost plava e vrijednost

aničena količkom je skr

ress tj. locatistivo. Npr. ani URL zajed

se radi o m

lje obraditi nkakvu.

na vrijednostuje do skript

primjere, a

u do servera

&oblik=koi oblik s vriji.

čina informacripta. Trenut

ion baru browako šaljete bdno s varijab

malo podata

nema praktičn

t s VALUE. e ili pak do samo deklari

kao dio UR

ockast ednošću koc

cije npr. 256tno većina b

wsera. roj kreditne blama ostane

aka koji ne

nu upotrebnu

o mail klijenrisanje varija

RL-a i mogu

ckast.

6byte ili 1kBbrowsera i

kartice. Noe u Favorites

zahtijevaju

u vrijednost;

ta (Outlook,abli u HTML

se vidjeti u

B što zavisi oservera ima

ponekad ćes-u kada nas

neku veliku

;

, L

u

o a

e s

u

61

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.

Primjer PO Zadatak: Krprikazuje u

�Kreiraj php <html> <head> <title>Pr</head> <body> <form act<p>Unesi <p>Koliko<p><input</form> </body> </html> Jasno je štadokumentu <html> <head> <title>Pr</head> <body> Zdravo <?php echo htmlImas <?php echo (intecho " go?> </body> </html> Pokrenimo

OST metode

reiraj jednofajlu akcija1

dokument sa

rimjer met

tion="akcisvoje imeo imad godt type="su

a šta hoćemoakcija1.php.

rimjer pri

lspecialch

t)$_POST['odina.";

skript form

e

ostavan upit1.

a imenom fo

tode POST<

ija1.php" e: <input dina: <inpubmit" val

o. Ovako kre. Pošto mu se

ihvata pre

hars($_POS

'age'];

ma1.php i dob

nik koji retu

orma1.php k

</title>

method="Ptype="texput type="lue="Pošal

eiran dokume imaju namj

eko submit

ST['name']

bićemo nešto

62

ultate upita iz

koji sadrži fo

POST"> xt" name=""text" namlji"></p>

ment sadrži fojeru obratiti

ta i POSTA

]); ?>.

o slično:

z fajla forma

ormu:

"name" /><me="age" /

ormu koja vakreirajmo do

A</title>

1 šalje i

</p> /></p>

arijable nameokument akc

e i age, kojecija1.php:

e se obraćajuu

Sad u teks„submitanje

Iz ovog jesuperglobalindeksu kojizabranoj mU ovom prim PrimjerGEZadatak: Krprikazuje u

Opet ćemo k<html> <head> <title>Pr</head> <body> <h3>Primj<hr> <form nam<! –KomenUnesi svo<input na<br> <input na</form> </body> </html> Dokument pprikazG.ph<html> <head> <title>Pr</head> <body> <? echo "Poz?> </body> </html>

t boksove fe“ i pristupili

ednostavnog lne varijablei odgovara i

metodi prosljemjeru je met

ETmetode

reiraj jednofajlu prikazG

kreirati dva d

rimjer GET

jer Proslj

me="primjentar atriboje ime : ame="ime"

ame="submi

prikazG.php hp:

rimjer Pri

zdrav " .

forme možemi akcija1.php

primjera jee. Vrijednostimenu tog eleđivanja podtoda bila PO

ostavan upitG.

dokumenta. N

T metode</

jedjvanje

er GET-a" but name="

type="tex

it" type="

se pokreće n

ihvat poda

$_GET["im

mo unijeti pp koji ispisuje

e vidljivo dt nekog elemementa form

dataka. ST, tako da j

nik koji retu

Neka dokum

/title>

informaci

method="g"primjer G

xt" >

"submit" v

nakon subita

ataka GET

me"];

63

podatke i pe uneseno im

da se podacmenta formeme. U kojoj s

je korištena

ultate upita iz

ment forma

ije GET me

get" actioGET-a" je

value="Pos

a i prihvata po

metode</t

potom klikomme nazad na e

cima iz forme se nalazi use supergloba

superglobaln

z fajla formaG

aG.php sadr

etodom </h

on="prihvaneobaveza

salji">

odatke uneše

title>

m na dugmeekran i dobil

me pristupaunutar te supalnoj varijab

na varijabla $

G šalje i

rži formu:

h3>

at.php"> an -->

ene u formu.

e Posalji izvli npr.:

a pomoću operglobalne

bli nalaze pod

$_POST.

vršili bismo

odgovarajućevarijable nadaci zavisi o

o

e a o

64

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

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.

rezultat GET-a smješten u adres bar

65

KorišćenjenizovauobradiformiNizovi 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.

66

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 URL-om 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.

67

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.

68

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>

69

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.

PrimjeriUkoliko ne definisanu p

Napravi PHZadatak1: PZadatak2: OZadatak3: P

pristupa

postoji kreirpoljima Id, Im

HP fajl: datoteProvjeriti da Omogućiti daPrikazivati sa

bazikori

rajte bazu Teme, Prezime

eku/skriptu, li postoji otva u postojećuadržaj baze z

išćenjem

elImenik, koj, Adresa, Gr

koji će sadržvorena baza (u bazu TelImzapis po zapis

70

formi

ja sadrži jednrad, BrojTel.

žavati formu (baza kojoj je

menik dodate s.

nostavnu Tab

koja će: e slobodan pnovi zapis.

belu T_Imen

pristup) sa im

nik

menom kojegg unesete

71

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

72

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

73

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

74

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

75

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:

76

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.

77

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 SID-om 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ćenihstranicaOvaj 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"); ?>

78

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

79

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

80

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.

81

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šariceAnalizitać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.

82

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 !

Dodatak HTMLtag Ovdje nećeelemente i vButton – duForm tag INPUT tag

• Tex• Tex• Che• Rad• Sub

Dropdown BUTTONT Tag <buttonZa razliku njegov zatv

Primjer: <html> <head> <title>Glu</head> <body> <button>kl</body> </html>

Primjetite kŠta radi (izvje da se defiFORMTag Tag <form>Unutar ova ili pak neštoNajjednosta

k

goviznač

emo ulaziti vrste obrazacugme

g xt - unos teksxtbox – unoseckbox – stadio – dodajebmit/ Reset – padajući m

Tag

n> </button>od INPUT B

varajući tag.

upo dugme</

likni me !!

kako će se texvršava ovaj pfinišu neke os

g,tagkojide

> </form> gdva taga mo

o treće. avniji oblik o

čajnizaPH

u detalje veca. Analizirać

sta u jednoms teksta u redavljamo kvačmo tačkicu u– potvrda un

meni/lista

> namjenjenBUTTON ta

Kor

/title>

!!</button>

xt između tagprimjer? Nišsobine (atrib

efinišeobra

govori browsože se smjest

obrasca može

HPforme

eć ćemo datćemo neke e

m redu dovima i koločicu u kvadrau kružić, mognosa (koristi

n je za stvaraaga BUTTO

risti se uglav

>

gova pojavitišta: napravljute metode i

azac

eru gdje obrtiti bilo koji

e izgledati ov

83

ti samo kratelemente HTM

onama atić, moguć jguć samo jed se u kombin

anje dugmaON tag je co

vnom kod poz

i na dugmetujeno je dugmi akcije).

razac počinjHTML tag,

vako: Njeg

tak podsjetnML-a:

je višestruki dan izbor naciji sa textb

di. ontainer što

ziva Java skr

u. e na koje mo

je i gdje zava to znači da

ga bi kreirao <FORM>ime: <email:</FORM

nik i kodove

izbor

box)

znači da se

ripti.

ožete da klikć

ršava. a se unutra m

sljedeći skripM> <INPUT><BR: <INPUT> M>

e koje kreir

obavezno m

ćete; očigled

može ubaciti

ipt (HTML k

R>

aju osnovne

mora pisati i

dno potrebno

slika, tabela

kod):

e

i

o

a

• • • • • • • • • • • • • • •

INPUTTag Tag <input Ovaj tag nij Vrsta poljatype = text Koji će se apopis svih aTYPE: određuNAME: name VALUE: počeSIZE: određuMAXLENGTH:CHECKED: chBORDER: debSRC: URL zaALT: alt. textLOWSRC: verWIDTH: širinHEIGHT: visALIGN: odreVSPACE: verHSPACE: horAtributi u pkoriste. PosKreiranje Text polje j<html> <head> <meta http-<title>Nasl</head> <body> <body bgcol<form> Ime:<input <br/><br/> Prezime:<in</form> </body> </html>

Radi se o poatributu.

Atributi INname Ovaj atribuatribut skriname="strPri imenovanvalue Ukoliko želpomoću val <input type

size="integOdređuje koDefault je 2

g

... > kreira pje container

a ovisi o type| password

atribut kada uatributa inputuje tip polja of this form fie

etna vrijednost puje širinu polja maximalni brheckira checkbbljina okvira oka sliku t za sliku rzija slike koja

na slike sina slike eđuje poravnanjrtikalna udaljenrizontalna udaljprvoj koloni ljednjih 7 atri

tekst polja

e najčešći ob

-equiv="Contlov stranice

lor="lightbl

type="text"

nput type="t

olju za unos

NPUT Text p

ut dodjeljujeipta neće prering" nju polja tj. va

limo da se plue atributa. e="text" nam

ger" olika će biti š

20

polja za unor te ne treba p

e atributu te m| checkbox |upotrijebiti pt taga.

eld polja

a roj znakova ox ili radio dug

ko slike

nije veliki fajl

je texta oko sliknost slike i textajenost slike i texse dosta če

ibuta (onClick

a sa: input

blik input tag

tent-Type" ce</title>

lue">

name="ime"

text" name="

jedne linije

polja

naziv varijepoznati o ko

arijable koristi

pri učitavanj

me="tekst" v

širina polja tj

os podatakapisati njegov

može biti: radio | subm

prvenstveno

gme

ke a xta sto upotrebljk,...) pozivaju J

type="text

ga koji se kor

ontent="text

>

prezime">

teksta. Ime p

abli koja ćeojoj se varijab

ite samo alfan

ju stranice u

alue="Ovo je

tj. koliko će z

84

. v zatvarajući

mit | reset | ovisi o tome

••••popunjav•poljima k•••••••

•javaju, dok JavaScript fun

t"

risti. Kreira

t/html; char

pomoću koje

e se proslijebli radi te će

numeričke zna

u ovom elem

e defaultna

znakova biti

tag </input>

button | hide o kojem se

READONLY: DISABLED: ACCESSKEY:AUTOCOMPLE

vanje TABINDEX:

kad se pritšće nLANGUAGE: onClick: konChange: onFocus: konBlur: kaonKeyPressonKeyUp: konKeyDown:

se atributi unkciju kad se

ga input tag

rset=utf-8">

eg mu pristup

editi do skriuneseni pod

akove (brojeve

mentu nalazi

vrijednost

vidljivo unu

>.

den | image e tipu polja ra

vrijednost poljkorisnik ne mo definira short

ETE: ako brow

određuje kojimna TAB tipku

upotrebljeni skkada korisnik kl

kad polje promkad polje dad polje izs: kad se pritiskad se tipka otpu kad se pritisn

u drugom (sivnad poljem iz

g te atribut

>

pamo u PHP

ipte. Ukolikdatak biti neu

e i slova) te un

neka vrijedn

polja i mož

utar polja.

e | file radi, a ovdje

ja se ne može pože s poljem uratcut key npr. A

wser koristi auto

m će se redom m

kriptni jezik likne

mijeni vrijednosdobije fokuzgubi fokussne tipka na tipusti

ne tipka a polje

ivoj-desnoj) zvrši nekakva

type="text"

P-u mu navod

ko ne upotrupotrebljiv.

nderscore crtic

nost možem

že se promij

možete naći

romijeniti aditi ništa ALT+g omatsko

mijenjati fokus

st us s kovnici

je u fokusu koloni rjeđeradnja.

".

dimo u name

ijebite ovaj

cu ( _ ).

mo ju navesti

eniti">

i

e

e

j

i

85

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>

86

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.

Napravite Kreiranje dbutton. (BkontejnerskPrimjer: <html> <head> <meta httpcharset=ut<title>Nas</head> <body> <body bgco<form acti<h1>Ako se<input typ</form> </body> </html>

INPUT s Kada posjeadresu odrPritiskom n Atribut subvalue="sNamjena ov Za detalje i

Kreiranje Padajući medok ne klikn<html> <head> <meta http-charset=utf<title>Prim</head> <body> <body bgcol<form actio<select nam<option val<option val<option val<option val</select> </form> </body> </html> U slučaju dnapisati sele

dugmesaI

dugmeta sa iBitno je da kka. type buton

p-equiv="Cotf-8"> slov strani

olor="lightion=""> e slažeš klpe="button"

submit, re

etilac vašeg ređenu sa acna dugme RE

bmit i reset string" vog atributa j

i primjere v

padajućeg

eni ima ponunemo na stre

-equiv="Contf-8"> mjer padajuć

lor="lightblon=""> me="boje"> lue="plava">lue="žuta">žlue="zelena"lue="crvena"

da želimo da ected uz nju.

INPUTtype

input type

kod input bun predstavlja

ontent-Type

ice</title>

tblue">

likni na OK" value="OK

eset

obrasca klikction="URLESET formula

dugmeta

je da umjesto

vidi Forme: P

g menija: D

uđene opcije elicu koja se

tent-Type" c

ćeg menija</

lue">

>plava</optižuta</option>zelena</op>crvena</op

nam prva v. Npr. <opti

e

="button"

uton type nia dio naredbe

e" content=

>

K</h1> K">

kne na SUB", odnosno ar postavlja v

o riječi 'Subm

PHP obrasc

Dropdown

koje izaberenalazi desno

ontent="text

title>

on> > tion> tion>

vidljiva opcijion value="

87

... se ne ije potrebnoe Input).

="text/html

MIT dugmena tu skriptvalue na pred

mit' na dugm

ci.

emo klikom mo od prvog iz

t/html;

a bude neka"žuta" sele

razlikuje bito da imate z

l;

e sve varijatu, te se u brdefinisanu vr

metu ispiše ne

miša na nekuzbora.

a koja nije prected="sele

tno od ranijezavršni tag –

ble unutar rowseru otvarijednost.

ešto drugo, n

u od njih. Sve

rva na popisected">žuta

e objašnjeno– ova klasa

formulara ara novi pro

na primjer 'Po

e opcije nisu

su, onda u koa</option>

og sa tagomtagova nije

šalju se naozor.

otvrdi'.

u vidljive

odu moramo

m e

a

o

88

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 Ć &#262; ć &#263; Č &#268; č &#269; Š &#352;

Slovo HTML kod š &#353; Đ &#272; đ &#273; Ž &#381; ž &#382;

ListaPHPfunkcija

AliasesAlias 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)

89

AliasesAlias 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

90

AliasesAlias 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

91

AliasesAlias 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

92

AliasesAlias 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

93

AliasesAlias 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)

94

AliasesAlias 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()

95

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

96

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. MetodeipromjenjiveMetode 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. �

97

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.