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