You are on page 1of 170

AlefBrain PHP Trening, Kragujevac 2006.

Skripta 1

1.1

Predstavljanje programa treninga

Cilj mi je da vas upoznam sa osnovnim znanjima potrebnim za pocetak bavljenja Internet programiranjem. Kada kazem Internet programiranje mislim na pisanje aplikacija koje mozete sresti na svakom koraku dok krstarite mrezom. Iz licnog iskustva mi je poznato da je najteze poceti, jer Internet tehnologije su u poslednjoj deceniji zauzele veoma sirok prostor. Zato sam odlucio da napravim ovaj kratak kurs koji ce svakom pocetniku pruziti solidnu osnovu sa koje se kasnije moze otisnuti u osvajanje visih nivoa. Na pocetku cu vam vrlo kratko govoriti o nacinu funkcionisanja Interneta. To ce, zapravo, biti samo skica koja ce vam pomoci da razumete glavni deo treninga koji je pred vama, jer bi detaljno objasnjavanje globalne mreze odnelo puno vremena i odvelo bi nas u detalje koji vam za sada nisu potrebni. Odmah iza ove price upoznacu vas sa softverom koji cete koristiti tokom treninga, ali i kasnije kada budete profesionalni programeri. Glavni deo kursa podelio sam u tri celine: HTML, SQL i PHP. HTML (HyperText Markup Language) koristite za prikaz sadrzaja na Internetu, SQL (Structured Query Language) sluzi za manipulisanje podacima koji se cuvaju u bazama podataka, a PHP je programski jezik koji od gomile podataka stvara ziv sadrzaj na Internetu. Prethodna recenica daje prilicno jasan opis podele posla izmedju tehnologija sa kojima cete se upoznati u narednih nekoliko nedelja. Kako je ovo pocetni nivo izucavanja Internet programiranja, necemo preterano zalaziti u detalje, ali uveravam vas da cete uskoro imati dovoljno znanja za pocetak, a onda cete sami prepoznavati koje oblasti zahtevaju dublje proucavanje.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

1.2

Uopsteno o nacinu funkcionisanja Interneta

Internet je globalna mreza racunara koji medjusobno komuniciraju koristeci razne protokole i pruzaju mnostvo servisa (email, www). Postoji izvesna analogija izmedju Interneta i klasicne telefonske mreze pomocu koje se lakse moze razumeti pojam Interneta. Kada je jedan stariji gospodin pitao mladog hakera da mu objasni sustinu elektronske poste, odgovor je glasio: To je isto kao telefonski sistem, osim sto zoves onda kada ti najvise odgovara, a druga strana se javlja onda kada njoj najvise odgovara. Starom gospodinu se veoma svideo odgovor, jer uvek je mrzeo kada ga neko zove usred vaznog posla ili aktivnosti koja mu pricinjava posebno zadovoljstvo. Zatim je gospodin zatrazio objasnjenje World Wide Web-a, evo sta mu je mladi haker odgovorio: Zamislite da imate telefonsku sekretaricu na kojoj osim glasa (zvuka) mozete snimiti slike i razne dinamicke sadrzaje, pa kada vas neko pozove on moze i da vidi i da cuje poruku koju ste ostavili. i ovaj odgovor se dopao starom gospodinu jer je video mogucnost da bez dosadjivanja svima pokaze svoje najnovije slike iz teniskog kluba. Konacno, pitao je za cenu svega toga, i kada je cuo da je skoro besplatno, stari gospodin je odlucio da je krajnje vreme da postane stari haker. Istovremeno, mladi haker je shvatio da je vreme da postane gospodin. Ova kratka prica ilustruje tri osnovne prednosti Interneta: udobnost, ogromna kolicina informacija i niska cena. i sve to u globalnim razmerama. Dakle, Internet predstavlja sjajan alat za globalizaciju poslovanja: zivite i radite tamo gde vam je najuzbudljivije ili najlepse, a prodaju svojih proizvoda ili usluga realizujete tamo gde se najvise placa. Internet je mnogo stariji, veci i efikasniji nego sto se obicno misli. On ima oko trideset godina, podrzava vise od 10TB (Tera Bytes) dnevnog protoka podataka, a ta se kolicina udvostrucuje skoro svake godine. Internet tehnologija se postepeno razvijala. Pocelo je sa prenosenjem fajlova, elektronskom postom, TCP/IP (Transmission Control Protocol/Internet Protocol), mreznim vestima, WWW (World Wide Web) i raznim servisima (Archie, Gopher). Evolucija se nastavlja sistemima za bezbednu naplatu preko mreze, multimedijom i servisima kao sto su chat, forumi i mnoge Online zajednice. Vazno je podvuci cinjenicu da servisi dolaze i odlaze jer ih tehnologija prevazilazi. Na primer, ranih 90-ih servisi kao sto su Archie i Gopher bili su izuzetno popularni. Archie je program koji posecuje anonymous FTP sajtove i pravi bazu dostupnih podataka, a Gopher je interfejs za ove pretrage. Oni su mogli da vam kazu sta se sve nalazi na nekom FTP serveru vezano za informacije koje su vama potrebne. Sa pojavom WWW-a ovi su servisi postali nepotrebni. Jednog dana, mnogo mocniji servis zauzece mesto WWW-a iako tako

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

nesto sada zvuci apsurdno. Zapravo u sferi Interneta ili jos bolje receno u eri Interneta, verovati u apsurd znaci biti realan. WWWeb je postao deo svakodnevnog zivota. Ljudi koriste Internet da bi dobili vrmensku prognozu, da kupuju knjige, citaju novine, kontaktiraju sa prijateljima i poslovnim saradnicima. Web browseri omogucavaju lako dobijanje informacija, istovremeno prikrivajuci slozene protokole koji leze u pozadini. Web serveri su programi koji obezbedjuju informacije Web browserima. Sada cu opisati neke protokole koje koriste browseri i serveri da bi komunicirali, sto ce vam olaksati razumevanje funkcionisanja Interneta. TCP/IP (Transmission Control Protocol/Internet Protocol) je iz porodice osnovnih Internet protokola. Drugi protokoli, kao sto su oni za prenos posteili Web stranica, rade na osnovu TCP/IP-a. Internet je radjen kao vojna mreza, pre nego sto je postao akademska, pa komercijalna. Nastao je u vreme hladnog rata, pa su protokoli projektovani tako da mogu da nastave rad cak i ako su delovi mreze unisteni nuklearnim napadom. TCP/IP je koriscen za prenos paketa izmedju masina u distribucionoj mrezi. Svaka masina je dobila jedinstven broj IP adresu, i poruke su putovale od jedne do druge masine sve dok ne stignu na odrediste. Jedna IP adresa predstavlja se sa cetiri broja izmedju 0 i 255, medjusobno razdvojena tackama. Na primer 207.69.188.186 Internet je hijerarhijska mreza. Pocetni deo adrese identifikuje mrezu, a ostatak domacina: 192.168.0.1 Mreza | Uredjaj

IP adrese dodeljuje ICANN (Internet Corporation for Assigned Names and Numbers www.icann.org) preko IANA (Internet Assigned Number Authority www.iana.org). Postoji odredjeni opseg adresa koje su oznacene kao privatne i nisu povezane sa Internetom. Kao sto IP adresa jedinstveno odredjuje masinu u mrezi, brojevi portova jedinstveno identifikuju usluzne servise unutar datog racunara. Svaki od standardnih protokola ima svoj broj porta, koji takodje dodeljuje ICANN. HTTP (HyperText Transfer Protocol) koristi standardno port 80. HTTP je protokol koji koriste browseri i serveri, a o njemu cu govoriti nesto kasnije. Ako bismo Internet zamislili kao svetsku telefonsku mrezu koja povezuje racunare a ne ljude, tada bi IP adrese mogli predstaviti kao brojeve odredjenih kancelarija, a portovi bi tada bili lokali unutar kancelarija. Jedan paket IP protokola je osnovna prenosna jedinica koja sadrzi odredisnu IP adresu, polaznu IP adresu i neke podatke. IP paket se moze izgubiti zbog zagusenja u mrezi ili zbog greske. TCP radi iznad IP-a i vodi racuna o odbacivanju duplikata i ponovnom slanju izgubljenih paketa, pruzajuci pouzdan prenosni protokol posiljaocu.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Pretpostavimo da zelite da posaljete neki fajl iz Kragujevca nekom saradniku na Bahamima. Sta ce se desavati sa vasim fajlom? On ce biti izdeljen u pakete mnostvo malih paketa od kojih ce svaki nositi informaciju odakle je posao, gde treba da stigne, i gde mu je mesto unutar onog fajla koji treba da stigne do Bahama. U zavisnosti od raznih trenutnih uslova na mrezi (protok, zagusenost, kvarovi) neki paketi ce putovati preko Nemacke, Francuske i Engleske, neki preko Rusije i Kine, a moguce je da neki paketi predju i preko Australije na putu ka Bahamima. Vi o tome ne morate uopste nista da znate jer TCP/IP vremenu stignu na odrediste, budu protokol brine da svi paketi u razumno kratkom ostrva. DNS (Domain Name System): IP adresu je tesko zapamtiti. Pored toga, bilo bi lepo pristupiti odredjenoj usluzi ili masini, ne brinuci o promenama u semi IP adresa u pozadini. Ovo se moze ostvariti dodeljivanjem imena svakoj masini. se slao sistem administratorima. Kako je Internet rastao sistem je postajao nepraktican i stvoren je DNS protokol. U ovom sistemu imena se sastoje od imena masine i naziva domena: www.alefbrain.com www ime masine alefbrain.com ime domena Serveri imena odgovaraju na trazeno ime i vracaju dodeljenu IP adresu. Sistem imena domena je hijerarhijski. Serveri imena komuniciraju medjusobno i cuvaju odgovore. Na primer, ukoliko trazite IP adresu za www.alefbrain.com, treba da pitate vas lokalni server imena. Ukoliko nema to ime u svojoj memoriji, on pita jedan visi DNS server. Visi DNS server ponavlja proces dok jedan od DNS servera u hijerarhiji ne bude znao adresu DNS servera za alefbrain.com domen. Server imena za alefbrain.com ce verovatno biti pronadjen i on ce odgovoriti sa IP adresom ili adresama koje su u vezi sa tim odredjenim domenom. Zahvaljujuci DNS-u, Web server koji je premesten sa jednog susednog uredjaja na drugi, moze izmeniti svoju IP adresu, dok ce ime koje korisnik upisuje u browseru ostati isto. ICANN propisuje top level domene preko InterNIC-a (Internet Network Information Center www.internic.net), koje bira u opsegu komercijalnih regstara. HTTP (HyperText Transfer Protocol) koriste serveri i browseri da bi medjusobno komunicirali. To je protokol o zahtevanom odgovoru koji se zasniva na TCP-u. Browser salje zahtev serveru za odredjeni resurs, zajedno sa nekim informacijama (headers) o verziji browsera i Prvobitni broj masina na Internetu bio je veoma ogranicen i veza izmedju IP adrese i imena je cuvana u fajlu koji

spakovani po ispravnom redosledu i isporuceni do racunara vaseg saradnika sa egzoticnih

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

slicno. Server odgovara dajuci statusni kod, nekoliko zaglavlja i zahtevane podatke. Statusni kod naznacava da li je zahtev prosledjen korektno, da li je resurs premesten na novu lokaciju, da li je pristup dozvoljen i slicno. Vodece oznake bezbedjuju informacije o zahtevanom resursu, kao sto su tip sadrzaja, datum poslednje modifikacije i drugo. Podatak za trazeni resurs je obicno web strana ili neka slika. URL (Uniform Resource Locator): Browser cita podatke vracene u odgovoru i prezentuje ih korisniku. Web stranice su napisane u HTML-u. Ukoliko pdatak koji je preuzet pomocu browsera sadrzi linkove, korisnik moze klikom na neki od njih da ucita novi dokument. Povezani dokumenti mogu postojati na istom ili na nekom drugom serveru udaljenom hiljadama kilometara. Proces usmeravanja sa jednog servera na drugi je jednostavan i jasan za korisnika. Linkovi prepoznaju jedinstvene resurse na webu preko URL-a. URL sledeci oblik: <protokol>://<korisnik>:<lozinka>@<host>:<port>/<url_putanja> Na primer, jedan ispravan URL je: http://www.alefbrain.com/index.php Prva komponenta URL-a je protokol (http, ftp) koji se koristi za pristup URL-u. Korisnicko ime i lozinka su opcione komponente koje mogu biti ukljucene prilikom pristupa zasticenim resursima. Komponenta host identifikuje masinu koja sadrzi resurse. Komponenta port identifikuje poseban port kojim se povezuje na server. Ukoliko se ne navede port, prema standardu se podrazumeva port 80 za http protokol. Krajnja komponenta oznacava resurse kojima se pristupa. SSL (Secure Socket Layer) je protokol za bezbednu komunikaciju izmedju klijenta i servera. Bezbedna verzija HTTP-a je HTTPS i ima podrsku za enkripciju i utvrdjivanje identiteta. Enkripcija se koristi radi sprecavanja napadaca da prisluskuje komunikaciju koja sadrzi osetljive informacije (broj kreditne kartice i slicno). Utvrdjivanje identiteta se koristi da bi se tacno znalo da li je na drugom kraju zaista onaj ko treba da primi podatke. Prema standardnom podesavanju port za HTTPS je 443. ima

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

1.3 Neophodan softver, instaliranje i upotreba - www.wampserver.com Posto pretpostavljam da vecina vas koristi Windows kao svoj osnovni operativni sistem, prikazacu kako se instalira softver koji je namenjen Windows-u, a ako zelite da se zabavite instalacijama na nekom od drugih operativnih sistema, predlazem da blize informacije potrazite na Internetu. Da bi ste poceli sa radom potrebno vam je da imate sledece stvari:
PHP (verzija 4 ili 5) MySQL Web Server (Apache ili neki drugi)

Najlaksi nacin za dobijanje svih ovih paketa je da instalirate WAMP server koji u sebi sadrzi sve i vrlo jednostavno se instalira. Potrebno je samo da odete na sajt www.wampserver.com, pronadjete download sekciju i skinete kompletan softver na svoj racunar. Napomenimo da je WAMP server besplatan i da je izuzetno stabilan u radu. Kada ste download-ovali WAMP, kliknite na njegovo ime i instalacija ce poceti. Posto odgovorite na nekoliko rutinskih pitanja posao ce biti vrlo brzo gotov. Da bi vam bilo lakse, evo okvira za dijalog koje cete sresti tokom instalacije:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Ako ste precizno sledili uputstva, u donjem desnom uglu ekrana mozete videti ikonicu WAMP servera kao na gornjoj slici. Sada ste spremni da predjete na pisanje svog prvog PHP programa koji cemo iskoristiti za testiranje instalacije. Otvorite neki jednostavan text editor. Ja volim da koristim TextPad, a ako ga nemate onda otvorite, za pocetak, Notepad koji sigurno svako ima, a za kasnije se potrudite da nadjete neki kvalitetniji. Napomenucu da WORD nije pogodan za pisanje programa, jer ima svoj specifican nacin formatiranja fajlova, tako da ono sto se dobija kao izlazni fajl nije samo obican tekst. Mozda je ovo prilika da kazem kako ce vam za sve sto budemo radili biti neophodan text editor u kojem cete pisati programe, pa je najbolje da na Internetu pronadjete neki dobar. Adresa na kojoj mozete naci TextPad je http://www.textpad.com. Vratimo se na posao. Prepisite sledecih nekoliko linija koda u svoj text editor: <?php echo Hello world; ?> Zatim ovaj tekst sacuvajte u direktorijumu C:\\wamp\www\ koji je kreiran od strane WAMP servera, ali vodite racuna da ga sacuvate pod imenom pozdrav.php i proverite da li je ispravno sacuvan, jer se moze dogoditi da mu text editor doda ekstenziju .txt. Ako se to dogodi primenite rename komandu, obrisite postojece ime i zamenite ga sa pozdrav.php i bicete spremni za pokretanje svog prvog PHP programa.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Sada otvorite Internet browser (Firefox, Internet Explorer ili koji vec koristite) i na liniji za adresu ukucajte sledece: http://localhost/pozdrav.php U sledecem trenutku u prozoru browsera ce vam pisati Hello World! i to ce biti jasan znak da je instalacija WAMP servera, a samim tim PHP-a i Apache web servera, uspela. Ako na ekranu ne vidite gornju poruku, onda instalacija nije prosla uspesno i u tom slucaju predlazem da detaljno proverite da li ste precizno sledili upuutstva za instaliranje. Ako i posle provere imate probleme, pisite mi na adresu mvranic@alefbrain.com i pomoci cu vam da pronadjete resenje. Jos nam samo ostaje da proverimo da li je sa MySQL serverom sve u najboljem redu? Za sada to cemo proveriti na sledeci nacin. Kliknite na ikonicu WAMP servera u donjem desnom uglu vaseg ekrana. Izaberite phpMyAdmin i otvorice vam se web browser, a u njemu ce se ucitati PHP aplikacija za rad sa MySQL bazama podataka - PHPMyAdmin. O tome kako se radi sa PHPMyAdmin-om govoricemo kasnije u toku kursa, a za sada nam je samo vazno da se aplikacija ucitala, jer je to znak da je MySQL server ispravno instaliran.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.1 Struktura HTML dokumenta Jezik za oznacavanje hiperteksta (Hypertext Markup Language), poznatiji kao HTML, racunarski je jezik i predstavlja sustinu World Wide Web-a. Pri pravljenju Web lokacija HTML se koristi za unos teksta, slika, animacija ili mozda zvuka i videa na pojedinacne Web stranice koje sacinjavaju lokaciju. HTML, pored toga, omogucava da umetnete hiprtekstualne veze - linkove, kojima svoje web stranice povezujete medjusobno, ali i sa web stranicama na drugim web sajtovima. Dizajniranje Web sajta je kreativan rad, a HTML je samo jedan od alata pomocu kojeg pravite Web prezentacije. HTML nije programski jezik, nego jezik za oznacavanje teksta. Citaci Web-a ili Web

browseri su programi koji prevode HTML u Web dokumentima i prikazuju sadrzaj na ekranu. Najpopularniji web browser je Micrsoft Internet Explorer, a ja vam mogu toplo preporuciti Firefox zbog mnogo vece bezbednosti i udobnosti u radu. Web browseri imaju sposobnost da citaju HTML komande koje se zovu tagovi i interpretiraju ih na odredjeni nacin stvarajuci sadrzaj koji vidimo dok krstarimo Internetom. Generalno, tagovi koriste sledeci format: <TAG>Tekst koji ce biti obuhvacen tagom.</TAG> Oznaka TAG je sifra (obicno skracenica od jednog ili dva slova, a ponekad i citava rec) koja odredjuje efekat kakav zelite. Tagove uvek ogradjujete uglastim zagradama < i > koje govore browseru da se radi o HTML-u, a ne o obicnom tekstu. Na primer, ako zelite da pozdravna poruka Dobro dosli na moj Home Page bude napisana masnim (bold) tekstom treba u HTML-u pisati sledece: <B> Dobro dosli na moj Home Page</B> Tag <B> govori browseru da tekst koji sledi ispisuje bold slovima sve dok ne naidje na zatvarajuci tag </B> koji se od pocetnog razlikuje samo u znaku /- kosa crta (slash). Kosa crta oznacava kraj zadatog formatiranja i svi tagovi za uredjivanje teksta imaju otvarajuci i zatvarajuci tag. Svaki HTML dokument ima tacno definisanu strukturu koja se mora postovati da bi prikaz u browseru bio ispravan. Pre nego sto predjem na opisivanje strukture HTML dokumenata, napominjem da za pisanje HTML-a mozete koristiti bilo koji tekst editor. Pretpostavljam da ste citajuci prvo poglavlje pronasli i instalirali neki ineteresantan editor koji ce HTML tagove bojiti posebnom bojom da bi se razlikovali od obicnog teksta, sto ce vam veoma pomoci u radu.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Sada u DocumentRoot direktorijumu vaseg web servera napravite direktorijum pod imenom html_primeri. Zatim u tekst editoru otvorite novi dokument i sacuvajte ga pod imenom prvi.html u direktorijumu html_primeri. Zatim otvorite web browser i u polju za adresu upisite http://localhost/html_primeri/prvi.html I ako ste sve ispravno uradili browser ce vam prikazati praznu belu stranu. Sada ste spremni da upoznate nekoliko osnovnih HTML elemenata koji predstavljaju kostur svake web stranice. Svaki HTML fajl pocinje tagom <HTML> a zavrsava sa </HTML>. Ovi tagovi govore browseru da se radi o HTML dokumentu. Zatim imamo tagove koji sluze za podelu dokumenta na dva dela: zaglavlje i telo. Zaglavlje je uvod u stranicu i browseri ga koriste da prikupe razne vrste informacija o strani. Tagovi koji ogradjuju zaglavlje su <HEAD> i </HEAD>. Telo dokumenta je oblast u kojoj unosite tekst, slike i ostale zanimljive stvari koje ce se pojaviti na vasoj web strani. Oznake tela dokumenta su <BODY> i </BODY>. Sada mozete u tekst editoru formirati osnovnu strukturu svog prvog html dokumenta tako sto cete prepisati sledecih nekoliko linija:

<HTML> <HEAD> </HEAD> <BODY> </BODY> </HTML>


Svaki HTML dokument mora postovati navedenu strukturu i vazno je uociti da ovi tagovi ne mogu medjusobno menjati mesta. Ako isprobate prikaz svog dokumenta u browseru i dalje cete videti samo praznu belu stranicu jer nikakav sadrzaj niste ni napravili. Prvi tag koji ce nesto prikazati u browseru i koji je, pored navedenih, obavezan u strukturi, jeste oznaka za naslov: <TITLE>Moj prvi naslov!</TITLE> Obogatite prethodni dokument naslovom tako sto cete tagove za naslov smestiti izmedju <HEAD> i </HEAD> tagova.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<HTML> <HEAD> <TITLE>Moj prvi naslov!</TITLE> </HEAD> <BODY> </BODY> </HTML>

Pozovite sada svoj HTML dokument i na vrhu prozora browsera ugledacete svoj prvi naslov. Kada budete davali naslove svojim stranicama, vodite racuna o tome da naslov opisuje ono sto stranica sadrzi, nemojte davati predugacke naslove, odlucite se za naslove koji imaju smisla kada se posmatraju van konteksta stranice, nemojte davati sifrovane i nejasne naslove. Za potpunu sliku osnovne strukture svakog HTML dokumenta ostaje da napisemo nekoliko recenica koje ce se prikazati u glavnoj oblasti web browsera. Pre nego sto pocnete sa kucanjem, postoji nekoliko stvari koje treba da znate. Mozete pomisliti da biste mogli da povezujete stvari i napravite neke interesantne efekte, vezujuci dva ili vise razmaka. Web browseri ce, na zalost, pojesti sve ekstra razmake. Filozofija web-a je da mozete koristiti iskljucivo HTML oznake da biste predstavili jedan dokument. Tako je niz visestrukih razmaka suvisan. Tabulatori takodje spadaju u grupu efekata koje browseri potpuno ignorisu. Jos nesto sto browseri ignorisu jeste pritiskanje tastera Enter za novi red. O HTML resenjima pomenutih problema govoricu nesto kasnije.

primer_01.html <HTML> <HEAD> <TITLE>Moj prvi naslov!</TITLE> </HEAD> <BODY> Ovaj tekst ce se pojaviti u telu Web stranice! </BODY> </HTML>

Pozovite iz browsera prethodni fajl i divite se postignutom progresu u ucenju HTML-a. Sada, kada vam je jasno da je HTML zasnovan na vrlo jednostavnom konceptu, predjimo na upoznavanje njegovih mogucnosti.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.2. Paragrafi i HTML Komentar Kao sto sam vec pomenuo, taster Enter nema nikakvu ulogu u HTML svetu. Ako kucate jedan red, pritisnete Enter, pa ukucate drugi, browser ce ih jednostavno spojiti, jedan pored drugog. Ukoliko vam treba novi paragraf, morate upotrebiti <P> tag. Kao primer pogledajte sledeci tekst:

primer_02.html <HTML> <HEAD> <TITLE>Moj prvi naslov!</TITLE> </HEAD> <BODY> Ovaj tekst ce se pojaviti u telu Web stranice! Ovo je druga linija teksta (Ne!). <P> Ovo je treca linija. </P> </BODY> </HTML>

Ako prikazete ovu stranicu u browseru, videcete da se prve dve linije pojavljuju jedna pored druge uprkos cinjenici da su na razlicitim linijama originalnog teksta. Ipak, treci red lepo stoji u svom paragrafu, zahvaljujuci <P> tagu koji ga okruzuje. Zapazite da pored otvarajuceg <P> taga imamo i zatvarajuci </P> tag koji oznacava kraj paragrafa. Prvi korak u pokretanju vase web stranice je istrazivanje nekih tagova koji zaista menjaju izgled vasih reci ili fraza. Vecina browsera podrzava samo cetiri vrste stila: masni(bold), kosi (italic), podvuceni(underline) i monospace. Sledeca tabela prikazuje tagove koji stvaraju svaki od navedenih formata: Stil teksta Masni (bold) Kosi (italic) Podvuceni (underline) Monospace Pocetni tag <B> ili <STRONG> <I> <U> <TT> Zavrsni tag </B> ili </STRONG> </I> </U> </TT>

Treba da zapazite, takodje, da vam vecina browsera dozvoljava kombinovanje pomenutih stilova. Tako, na primer, ako vam treba tekst sa masnim kosim slovima, mozete ga dobiti na sledeci nacin:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<B><I>Ovo je masni kosi tekst</I></B> Kao i poglavlja u knjizi, mnogi stvaraoci web strana dele svoj sadrzaj u nekoliko odeljaka. Da biste lakse odvojili te odeljke i tako pojednostavili trud citaoca, koristite zaglavlja (HEADINGS). Zapravo, zaglavlja sluze kao mini naslovi koji nose neku ideju o kojoj se govori u odredjenom odeljku. Da biste lepo istakli te naslove, HTML ima citavu seriju tagova za prikazivanje teksta sa vecim, masnim slovima. Postoji sest takvih tagova, od <H1> koji ima najveci font, do <H6> sa najmanjim fontom.

primer_03.html <HTML> <HEAD> <TITLE>Moj </HEAD> <BODY> <H1>Ovo je <H2>Ovo je <H3>Ovo je <H4>Ovo je <H5>Ovo je <H6>Ovo je </BODY> </HTML>

prvi naslov!</TITLE>

H1 H2 H3 H4 H5 H6

naslov!</H1> naslov!</H2> naslov!</H3> naslov!</H4> naslov!</H5> naslov!</H6>

Da ne bih svaki put navodio, napomenucu da je pozeljno da svaki uokvireni listing ukucate u svoj tekst editor i isprobate kako izgleda u web browseru. Ova napomena se odnosi kako na prethodne listinge, tako i na sve koje budete kasnije sreli. Ranije sam pomenuo da ce visestruki razmaci biti ignorisani od strane browsera, a da biste ipak naterali browser da prikaze visestruke razmake koristite specijalnu instrukciju &nbsp; To je specijalna vrsta razmaka i za lakse pamcenje navodim engleski naziv: non breaking space. Dobra strana ovih karaktera je ta sto ih mozete nizati koliko god zelite i browser ce ih verno prikazati. Sledeci tag sluzi za prekid tekuce linije i prelazak u novu i pripada grupi tagova koji nemaju tzv. zatvarajuci ili zavrsni tag. Koristite <P> tag kada treba da odvojite tekst u paragrafe. Kada browser naidje na <P> tag, on otpocinje novi paragraf u odvojenom redu i ubacuje dodatni prazan red posle prethodnog paragrafa. Medjutim, sta ako ne zelite taj dodatni prazan red? Resenje je da razdvojite redove pomocu <BR> taga za prelamanje reda (od engleskog BREAK). Browser ce zapoceti novi red kada mu zadate <BR> komandu, a nece ubaciti dodatnu praznu liniju. Sada ste dovoljno iskusni da sami isprobate navedeni tag.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Jos jedan interesantan tag za ulepsavanje vasih stranica je onaj koji moze da nacrta horizontalnu liniju koja se prostire celom sirinom ekrana. Ako vam kazem engleski izraz za ovu mogucnost moci cete i sami da pogodite kako je definisan taj tag Horizontal Row. Sigurno ste pogodili da se radi o <HR> tagu. On takodje pripada grupi tagova bez zavrsne oznake i dovoljno je da na mestu gde zelite horizontalnu liniju navedete <HR> i browser ce razumeti sta treba da uradi za vas. Cesto cete imati potrebu da unutar HTML dokumenta navedete neke svoje komentare koje ne treba prikazati u browseru, jer se odnose na samu strukturu web stranice i predstavljaju vas licni podsetnik za snalazenje u sumi HTML tagova. Stavise, ovakav pristup u pisanju HTML-a je pozeljan jer ce vam biti od velike pomoci ako se posle nekoliko meseci ili godina vratite nekom HTML dokumentu u zelji da ga prepravite. U tom slucaju ce vam komentari biti zlata vredni. HTML se postarao da vam obezbedi komande komentara: <!--Ovde pisete sta god zelite jer to nece biti prikazano na web strani --> Ipak, budite oprezni u prihvatanju moje izjave kako mozete pisati sta god hocete jer to niko nece videti. Komentar se zaista nece videti u prozoru browsera, ali ako u Firefox-u odete na View Page Source, a slicna opcija postoji u svim browserima, vasa izvorna HTML stranica ce biti prikazana u text editoru. To isto moze uciniti bilo koji posetilac vaseg web sajta, pa ako ste u komentar zapisali svoju username/password kombinaciju za pristup web sajtu preko FTP-a, napravili ste kobni bezbednosni propust.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.3. Liste Ponekad cete pozeleti da nabrajanje nekih elemenata predstavite lepo uredjenom

listom.HTML nudi tri razlicita stila za liste: redne (numericke), simbolicke i definicione. Ukoliko zelite da postavite jednu numericku listu tema - bilo da se radi o top ten listi, tabeli u ligi kuglanja ili bilo kojoj vrsti rangiranja - ne zamarajte se kucanjem brojeva. Umesto toga, upotrebite HTML redne liste da bi vas browser proizveo brojeve za vas. koriste dva tipa tagova: Citava lista je okruzena <OL> (Ordered List - redna lista) i </OL> tagovima. Svaka tema na listi pocinje sa <LI> (List Item) tagom. Redne liste

Generalna postavka izgleda ovako:

primer_04.html <OL> <LI>Prvi element <LI>Drugi element <LI>Treci element <LI>Imate ideju o cemu govorim. </OL>
Uocite da ni jedan broj nisam ubacio ispred tema u listi, ali kada listu prikazete u browseru brojevi ce se automatski prikazati. Teme koje unosite u numericke liste ne moraju da budu kratke reci ili fraze. Na primer, ako objasnjavate kako da se izvrsi odredjeni zadatak, numericka lista je savrsen nacin da vase citaoce sprovedete, korak po korak kroz temu. Numericke liste, naravno, nisu i jedina vrsta listi. Ako zelite samo da nabrojite nekoliko stvari, oznacavanje simbolima vam moze izgledati prikladnije. Te liste se zovu simbolicke jer web browser prikazuje tackice ili kvadratice ispred svakog elementa u listi. HTML tagovi za ove liste su veoma slicni onima koje ste videli kod numerickih listi. Kao i kod njih svaku temu pocinjete sa <LI> tagom, samo sto kompletnu listu pocinjete i zavrsavate sa <UL> i </UL> tagovima. Oznaka je od naziva Unordered List - ne bas logicno, ali sta da se radi. Evo kako to zapravo izgleda:

primer_05.html <UL> <LI>Prvi element <LI>Drugi element <LI>Treci element <LI>Jednostavno, zar ne? </UL>

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Treci tip liste se zove definiciona lista. U svom osnovnom obliku koristi se kao recnik-lista, gde svaki izraz ima dva dela: pojam i definiciju pojma. Da biste oznacili dva razlicita dela svakog izraza, potrebna su vam dva razlicita taga. Ispred pojma se stavlja <DT> (Definition Term), a ispred definicije <DD> tag. Celu listu okruzujete tagovima <DL> i </DL> (Definition List).

primer_06.html <DL> <DT>Teorema<DD>Jednacina x<sup>n</sup> + y<sup>n</sup> = z<sup>n</sup> nema resenja za n>2 <DT>Autor<DD>Pjer De Ferma, XVII vek <DT>Dokazao<DD>Endrju Vajls, XX vek </DL>
Ova tri tipa HTML lista bi trebalo da vam fino posluze za vecinu Web produkcija. Ipak, dozvoljeno vam je da mesate i uparujete razlicite tipove po potrebi. Odredjenije receno, potpuno je legalno ubaciti jedan tip liste u drugi. Isprobajte sami kako se liste ponasaju kada ih kombinujete.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.4. Povezivanje dokumenata - linkovi (primer_07.html) U ovom odeljku saznacete kako da pomocu HTML-a dodate linkove na vasu web stranu. Tagovi koji obavljaju ovaj posao su <A> i </A>. <A> tag se pomalo razlikuje od ostalih koje ste do sada upoznali. Naime, ne koristite ga kao takvog, vec mu dodajete i URL odnosno adresu stranice na koju ce link pokazivati. Evo pravilne upotrebe link taga: <A HREF=http://www.alefbrain.com>Tekst koji ce postati link!</A> Ako ovaj deo HTML-a prikazete u browseru videcete da je Tekst koji ce postati link obojen drugacije od ostalog obicnog teksta, a ako preko njega predjete misem uocicete da se strelica pretvara u ruku kada se predje preko linka. Linkovi se generalno mogu svrstati u dve kategorije: spoljasnji i unutrasni linkovi. Spoljasnji link salje osobu koja na njega klikne na sledeci dokument, a unutrasnji link vodi do posebnog dela istog dokumenta. Najcesci tip linka je onaj koji upucuje citaoca na neku drugu stranu neke druge web prezentacije. Takodje su veoma cesti linkovi koji medjusobno povezuju razlicite stranice iste web prezentacije. Unutrasnji linkovi se koriste samo kada na nekoj stranici imate mnogo ispisanog teksta i posto bi posetiocu bilo tesko da skrolovanjem pronadje zeljeni sadrzaj, vi na vrhu stranice postavite kratak sadrzaj sa unutrasnjim linkovima do mesta na stranici na kojima se nalaze pojedina poglavlja. Ovakav nacin organizovanja sadrzaja je veoma los i treba ga izbegavati. Primer linka koji ste videli je spoljasnji link, a unutrasnji linkovi se razlikuju od spoljasnjih jer se ne vezuju za druge dokumente. Oni se, zapravo, povezuju na specijalnu verziju <A> taga, nazvanu sidro, koju ste prethodno ubacili u isti dokument. Da biste razumeli princip rada sidra, razmislite kako biste oznacili mesto u knjizi koju citate. Mogli biste da podvijete stranicu, ili postavite nesto izmedju strana, nesto kao bookmark ili neki drugi predmet koji vam je pri ruci. Sidro ima potpuno istu funkciju. Ono oznacava narocito mesto na web strani, a vi pomocu obicnog <A> taga mozete lako doci do njega. Evo primera jednog sidra: <A NAME=ime>Tekst sidra dolazi ovde</A> Kao sto vidite, tag koji povezuje izgleda kao i svaki regularan link, samo sto umesto HREFa, stoji NAME. To je ime koje dajete sidru i moze biti bilo koja rec. Sada mozemo kreirati link do napravljenog sidra, koji je vrlo slican obicnom linku, osim sto unutar HREF dela dodajemo znak # (sharp) koji govori browseru da se radi o unutrasnjem, a ne o spoljasnjem linku:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<A HREF=#ime>Link do sidra</A> Mada uglavnom koristite sidra da biste se povezali na odeljke iste web stranice, nije zabranjeno ni da se pomocu njih povezujete i na odredjene odeljke drugih strana. Ali, hajde da ne komplikujemo stvari za sada. Jos jedna vazna stvar koju treba pomenuti u prici o linkovima jesu e-mail linkovi. Evo na koji nacin se pravi email link: <A HREF=mailto:mvranic@alefbrain.com>Posaljite e-mail</A> Kada se klikne na ovu vrstu linka, automatski ce biti otvoren program za slanje e-maila sa novoformiranim pismom adresiranim na email naveden unutar HREF sekcije, iza reci mailto:. Uocite da u okviru spoljasnjih linkova mozete navoditi punu URL adresu dokumenta na koji se povezujete, ali mozete navesti i tzv. relativnu adresu. Evo primera linka sa punom adresom: <A HREF=http://www.alefbrain.com/strana1.html>Tekst koji ce postati link!</A> A ovo je link sa relativnom adresom: <A HREF=strana1.html>Tekst koji ce postati link!</A> Kao dva sto uocavate, Dok razlika prvi izmedju uvek poslednja do dva stranice linka je u tome na sto prvi ima sajtu

http://www.alefbrain.com/ deo, a drugi to nema. Sustinska razlika je u ponasanju poslednja linka. vodi strana1.html web http://www.alefbrain.com/, drugi link vodi do stranice strana1.html na tekucem sajtu. Ako se nekim slucajem nalazite na sajtu http://www.alefbrain.com/ onda ce poslednja dva linka voditi do istog dokumenta, ali ako se nalazite na sajtu http://www.google.com, tada ce vas drugi link odvesti do dokumenta na adresi http://www.google.com/strana1.html. Dakle, zakljucujemo da je mesto do koga ce vas odvesti drugi link relativno u odnosu na web sajt ne kojem je takav link naveden - zato ga i zovemo linkom sa relativnom adresom. Ako na svom web sajtu koristite relativne linkove za povezivanje svih dokumenata koji ga sacinjavaju, sto je veoma cest slucaj, morate znati kako se dolazi do drugih dokumenata koji nisu u istom direktorijumu u kojem je dokument na kojem navodite link. Ako se povezujete relativnom putanjom na dokument koji je u istom direktorijumu kao i tekuci dokument, onda navodite samo ime dokumenta na koji se povezujete unutar HREF sekcije:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<A HREF=strana1.html>Tekst koji ce postati link!</A> Ako je dokument na koji se povezujete u nekom direktorijumu koji se nalazi ispod tekuceg direktorijuma u hijerarhiji, onda samo navedete imena direktorijuma koji vode od tekuceg do fajla na koji se povezujete i na kraju ime samog fajla. Recimo da se dokument na koji se povezujete nalazi u direktorijumu cija je putanja /web/html/root/primeri/dir1/dir2/, a da je tekuci direktorijum /web/html/root/primeri/. Tada cete se na fajl strana1.html koji se nalazi u /web/html/root/primeri/dir1/dir2/ povezati linkom: <A HREF=dir1/dir2/strana1.html>Tekst koji ce postati link!</A> Poslednji slucaj sa kojim se mozete sresti jeste kada se dokument na koji se povezujete nalazi u direktorijumu koji je iznad tekuceg direktorijuma u hijerarhiji. Recimo da je tekuci direktorijum /web/html/root/primeri/dir1/ a da se dokument strana1.html nalazi u direktorijumu / web/html/root/, tada ce relativni link imati oblik: <A HREF=../../strana1.html>Tekst koji ce postati link!</A> Uocite oznaku ../ unutar HREF sekcije. On sluzi da objasni browseru koliko direktorijuma iznad se nalazi trazeni dokument. U nasem primeru taj broj je dva, pa zato dva puta navodimo ../. Shvatite ../ kao naredbu povratka za jedan direktorijum unazad. Testirajte ovo objasnjenje tako sto cete unutar svog root direktorijuma napraviti nekoliko umetnutih jedan u drugi, pa u svaki stavite po jedan html dokument i onda pokusajte da ih medjusobno povezete relativnim putanjama.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.5. Slike - (primer_08.html) Na samom pocetku price o slikama odgovoricu na jedno pitanje koje se logicki namece: Ako su unutrasnji clanovi jedne HTML stranice zaista samo tekst i HTML tagovi, kako ubaciti neku sliku u tu strukturu? Lepo! Kao sto cete kasnije videti, sve sto cete zapravo raditi je da, za svaku zeljenu sliku, ubacite tag koji govori Ubaci sliku ovde. Taj tag odredjuje ime grafickog fajla, tako da browser samo otvara fajl i prikazuje sliku. ih dobro upari na vasoj lepoj web stranici. Jedan racunarski genije je jednom izjavio kako je dobra stvar sa standardima ta sto ih ima mnogo. A graficki fajlovi u tome nisu nikakv izuzetak. O cemu, dakle govorim? Postoje slike u GIF, JPEG, BMP, PCX, TIFF, DIB, EPS, TGA i mnogim drugim formatima, medjutim, na svu srecu, samo su dva formata standardizovana za koriscenje na web-u: GIF i JPEG. Ovi formati omogucavaju prikaz slike veoma dobrog kvaliteta sa velikom ustedom na velicini fajla, sto je veoma vazno za web jer ne zaboravite da se slika najpre treba preneti od servera do posetiocevog racunara pa ce se tek zatim prikazati. Zbog sporih Internet veza, velike slike se veoma sporo prenose i nestrpljivi surferi ce napustiti vasu web lokaciju pre nego se slika ucita. Hajde da sada pokazemo kako se slicica ubacuje na web stranu. Ovaj posao obavlja <IMG> tag na sledeci nacin: <IMG SRC=putanja_do_fajla/ime_fajla> SRC je skracenica za SOURCE sto znaci izvor, a unutar njega senavodi putanja do grafickog fajla koji zelite da prikazete na stranici. Na primer pretpostavimo da imate sliku pod imenom logo.gif. Da biste je smestili na vasu stranicu, napisacete sledece: <IMG SRC=logo.gif> Da bi ovo funkcionisalo potrebno je da vas HTML i graficki fajl budu u istom direktorijumu, a posto je obicaj da se sve slicice cuvaju u posebnom direktorijumu, onda vodite racuna da navedete putanju do direktorijuma. i u ovom slucaju vazi prica s kraja poglavlja o linkovima, gde sam objasnio apsolutne i relativne putanje. Slike se mogu pojavljivati unutar nekog teksta na stranici i tada treba obratiti paznju na poravnanje slike i teksta. HTML za ovu priliku nudi nekoliko dodataka <IMG> tagu. Ako zelite da se vas tekst pojavi na vrhu, ili u sredini stranice, ili mozda da bude oko slike, evo kako to navodite: Drugim recima, imacete dva fajla: vas HTML fajl i jedan odvojeni graficki fajl. Posao browsera je da

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<IMG SRC=logo.gif ALIGN=TOP|MIDDLE|BOTTOM|LEFT|RIGHT> Znak | predstavlja logicko ekskluzivno ILI, sto znaci da mozete koristiti samo jednu od gore navedenih opcija. Evo sta svaka od opcija predstavlja: TOP tekst je poravnat sa vrhom slike MIDDLE tekst poravnat sa sredinom slike BOTTOM tekst je poravnat sa podnozjem slike LEFT slika se pojavljuje na levoj strani browser prozora, a tekst oko slike na desnoj strani RIGHT slika se pojavljuje na desnoj strani browser prozora, a tekst oko slike na levoj strani Napomenucu da i slika moze biti link. Ovaj efekat se postize kombinovanjem <A> i <IMG> tagova na sledeci nacin: <A HREF=www.alefbrain.com><IMG SRC=logo.gif></A> Ako proverite u browseru, videcete da je slika ujedno i link i da je oko nje prikazan ruzan granicnik plave boje. Da biste ga eliminisali ubacite BORDER=0 unutar <IMG> taga: <A HREF=www.alefbrain.com><IMG SRC=logo.gif BORDER=0></A> I granicnik je nestao.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.6. Elementi tekst tipa (primer_09.html i paleta_boja.html) Sada cu vas upoznati sa nekim tagovima za dodatno uredjivanje i ulepsavanje vasih stranica. <FONT> tag podesava, izmedju ostalog, velicinu bilo kog teksta, smestenog izmedju <FONT> i njegovog odgovarajuceg zavrsnog taga </FONT>. Evo kako to funkcionise: <FONT SIZE=velicina>Tekst obuhvacen tagom</FONT> SIZE je broj koji ukazuje na velicinu zeljenog teksta. Mozete koristiti bilo koji broj izmedju 1 (najmanji) i 7(dzinovski), 3 je velicina standardnog teksta. Unutar <FONT> taga mozete definisati tip fonta kojim ce se ispisivati tekst, dodavanjem FACE atributa na sledeci nacin: <FONT FACE=tipslova>Tekst obuhvacen tagom</FONT> gde je tipslova ime za tip slova koji zelite da koristite. Neki od poznatijih tipova koje mozete upotrebiti za tekst su Arial, Courier, Verdana, Comic Sans itd. Za vise detalja o fontovima predlazem da konsultujete neku knjigu koja se bavi web dizajnom. Promena boje teksta: Browseri prikazuju vas tekst u osnovnoj crnoj boji, sto je vrlo citljivo, ali ne bas mnogo zanimljivo. Da biste promenili boju vaseg teksta imate nekoliko opcija na raspolaganju. Za pocetak mozete isprobati TEXT ekstenziju BODY taga: <BODY TEXT=#rrggbb> Ovo rrggbb je broj za odredjivanje boje koju zelite da upotrebite, drugim recima ta sifra predstavlja kombinaciju tri osnovne boje crvenu-red, zelenu-green i plavu-blue. Cifre za ovu sifru uzimaju se iz heksadecimalnog sistema pa svaka cifra moze imati vrednosti od 0 do 9 i od A do F. Sledeca tabela prikazuje RGB vrednosti nekih osnovnih boja: RGB vrednost #000000 #FFFFFF #FF0000 #00FF00 #0000FF #FF00FF #00FFFF #FFFF00 Daje ovu boju Crna Bela Crvena Zelena Plava Magenta Cijan Zuta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Postoji mnogo boja koje mozete koristiti i predlazem da detaljniji spisak web boja potrazite na Internetu. Postoje takodje i ekstenzije koje vam omogucavaju da promenite boje vasih linkova. Evo kako one funkcionisu: <BODY LINK=#rrggbb VLINK=#rrggbb ALINK=#rrggbb> Koristite LINK da biste obojili nove linkove (one na koje posetilac do sada nije kliknuo), VLINK za boju posecenih linkova (visited links), ALINK za aktivne linkove (aktivni link je onaj na koji ste kliknuli i cekate da se stranica otvori). Problem sa ovom BODY tag ekstenzijom je taj sto utice na celu stranicu. Sta uciniti ako ste zeleli samo da promenite boju zaglavlja, reci ili samo jednog slova? Za tu svrhu FONT tag ima svoj COLOR atribut: <FONT COLOR=#rrggbb>Tekst obuhvacen tagom</FONT> Nekoliko grafickih ekstenzija: Surfujuci web sajtovima sa grafickim sadrzajima da li ste se ikada upitali zasto je ponekad tim grafikama potrebno izvesno vreme da se pojave na ekranu? Jedan od najznacajnijih razloga kasnjenja je taj sto vecina browsera nece da prikaze citavu stranicu dok ne izracuna visinu i sirinu svih slika koje se na njoj nalaze. Za izbegavanje ovog dodatnog posla za browser preporucuje se upotreba atributa IMG taga za sirinu i visinu slike: <IMG SRC=imefajla WIDTH=x HEIGHT=y> Atribut WIDTH predstavlja sirinu, a HEIGHT visinu slike, pri cemu se ove vrednosti izrazavaju u pixelima. Pixel predstavlja osnovni element slike i svaka slika je sastavljena iz odredjenog broja pixela. Ako vasu sliku okruzite tekstom, videcete da ce on cesto prelaziti njenu granicu. Da biste napravili tu granicnu liniju izmedju slike i okruznog teksta, dodajte HSPACE i VSPACE atribute IMG tagu na sledeci nacin: <IMG SRC=imefajla HSPACE=x VSPACE=y> gde je HSPACE velicina margine iznad i ispod slike, a VSPACE velicina margine sa leve i desne strane.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Podesavanje pozadine: Veoma interesantna ekstenzija HTML-a je mogucnost promene boje pozadine vasih web dokumenata. Posto se te promene pojavljuju u telu dokumenta, potpuno je logicno da se ova ekstenzija nadje u unutar BODY taga: <BODY BGCOLOR=#rrggbb> Pored boje, mozete odrediti i sliku koja ce se pojaviti u pozadini. To moze biti velika ili mala grafika, a browser ce se pobrinuti da pozadina citavog ekrana bude poplocana slikom koju ste naveli. Preporucujem da za pozadinu odaberete neku malu grafiku koja ce pozadini dati izgled lepe podloge. Ne zaboravite da se velike grafike sporo ucitavaju! Ekstenzija koja vam ovo omogucava je BACKGROUND i evo kako se pravilno navodi: <BODY BACKGROUND=imefajla> Ravnanje paragrafa: Centriranje teksta i grafika je savrsen nacin da se jedna brosura ili katalog prikazu na vrlo profesionalan nacin. Da biste isti efekat postigli i sa vasim web stranicama <CENTER> tag vam omogucava centriranje zaglavlja, paragrafa, listi, pa cak i grafika. Da vidimo kako funkcionise taj tag: <CENTER>Tekstovi, paragrafi, grafike za centriranje idu ovde.</CENTER> CENTER tag je fin i jednostavan nacin za centriranje, ali mozete koristiti i ALIGN atribut koji se moze umetati unutar <P> taga ili <H> tagova: <P ALIGN=center> <H1 ALIGN=center> Prednost ovog pristupa je u tome sto imate na raspolaganju i LEFT ili RIGHT pored CENTER zajedno sa ALIGN atributom, da biste podesavali paragrafe.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.7. Tabele (primer_10.html) Tabela je pravougaono uredjenje redova i kolona na vasem ekranu i predstavlja jedan od najvaznijih alata za pozicioniranje elemenata web stranice. Najpre cu uvesti nekoliko osnovnih pojmova vezanih za tabele: Red je jedna linija podataka koja se prostire tabelom Kolona je jedan vertikalan odeljak podataka Celija je presek reda i kolone i predstavlja mesto gde se unose podaci Granice su linije koje okruzuju tabelu i svaku celiju u njoj Cellspacing je pojam koji oznacava razmak izmedju susednih celija Cellpadding oznacava razmak izmedju granice celije i sadrzaja celije

Sada cemo nauciti kako se prave tabele. Kao i svaki element o kojem ste do sada culi, i tabele imaju specificne tagove koji je grade. Posto je tabela nesto slozenija struktura pridruzeno joj je nekoliko tagova. Svaka tabela pocinje tagom <TABLE> a zavrsava tagom </TABLE>. Svi ostali tagovi tabele smestaju se izmedju ovih tagova. Ako zelite da unesete vrednosti za granice, cellspacing i cellpadding koristite sledece atribute TABLE taga: <TABLE BORDER=x CELLSPACING=y CELLPADDING=z> pri cemu su x, y i z vrednosti u pixelima koje odredjuju atribute kojima su pridruzeni. Sada vam predstoje cetiri koraka u pravljenju tabele: 1. Dodajte red 2. Podelite ga u zeljeni broj kolona 3. Ubacite podatke u svaku celiju 4. Ponavljajte korake od 1 do 3 dok ne zavrsite. Da biste dodali red ubacite <TR> (Table Row) i njegov odgovarajuci zavrsni </TR> tag izmedju <TABLE> i </TABLE> tagova. Sada podelite taj red u kolone smestajuci onoliko parova <TD> (Table Data) i </TD> tagova izmedju <TR> i </TR> koliko zelite kolona. Ako zelite da napravite tabelu sa top listom od tri najbolja kosarkasa svih vremena, evo kako ce ona izgledati u HTML-u:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<TABLE BORDER=1 CELLSPACING=1 CELLPADDING=2> <TR> <TD>1.</TD> <TD>Earvin Magic Johnson</TD> </TR> <TR> <TD>2.</TD> <TD>Michael Jordan</TD> </TR> <TR> <TD>3.</TD> <TD>Larry Bird</TD> </TR> </TABLE>
Kao sto mozete videti, sadrzaj se pise unutar TD tagova i zapamtite da za formatiranje teksta unutar TD tagova mozete koristiti sve tagove koje smo naveli u prethodnim poglavljima, kao i da unutar njih mozete postavljati slike, linkove i liste. Sadrzaj u tabelama mozete ravnati horizontalno i vertikalno. Horiznotalna poravnanja su LEFT, RIGHT i CENTER, a ako ne navedete koje poravnanje zelite standardno browseri koriste levo poravnanje. Evo kako se definise horizontalno poravnanje: <TD ALIGN=LEFT|CENTER|RIGHT> Za vertikalno poravnanje koristite atribut VALIGN taga TD i on moze uzimati jednu od sledecih vrednosti: TOP sadrzaj poravnat sa gornjom ivicom celije MIDDLE sadrzaj poravnat sa sredinom celije BOTTOM sadrzaj poravnat sa donjom ivicom celije

Kod rada sa tabelama cesto je potrebno prostiranje sadrzaja jedne celije kroz vise redova i/ili kolona. Kada nam je ovako nesto potrebno primenicemo COLSPAN i ROWSPAN atribute: <TD COLSPAN=3 ROWSPAN=2> Navedena celija zauzece horizontalni prostor od tri celije i vertikalni od 2 reda. Kada isprobate bice vam jasnije kako funkcionisu navedeni atributi. Naravno, mozete celiju

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

prostirati samo po horizontali ili samo po vertikali ili kombinovano, sve zavisi od trenutnih potreba. Vazno je napomenuti da se tabelama mogu postavljati boje pozadine ili slike u pozadini primenom BGCOLOR i BACKGROUND atributa unutar <TABLE> taga, a mogu se podesavati sirina i visina tabele pomocu WIDTH i HEIGHT atributa <TABLE> taga. Isti atributi mogu se primeniti i na svaku celiju ponaosob. Dakle, ovi atributi vam daju veliku kontrolu nad tabelama i njihovim izgledom. Tabele mozete neograniceno ugnjezdavati i veoma cesto cete koristiti ovu mogucnost da biste sto jasnije rasporedili sadrzaj stranice. Zbog svih navedenih atributa tabelama se jako dobro moze manipulisati, ali se pritom stvara puno HTML tagova koji vas u pocetku mogu zbunjivati. Uz malo vezbe brzo cete savladati probleme necitljivog HTMLa i postacete gospodari elemenata svojih web stranica.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.8. Forme (primer_11.html) Vecina modernih programa koristi dijalog box-eve kada zeli od vas da prikupi odredjene informacije. Na primer, izbor Print opcije uglavnom ce rezultirati u pojavljivanju neke vrste print dijalog box-a koji od vas trazi informacije o broju zeljenih primeraka za stampanje i slicno. Forma je jednostavno ekvivalent dijalog box-u na webu. To je stranica koja sadrzi upitnike, liste i komandne opcije, sve u cilju prikupljanja informacija od posetilaca sjta. Forme se kreiraju pomocu specijalnih HTML tagova, tako da ih je veoma lako postaviti. Problem uzimanja podataka koje korisnik unosi u formu nije resiv pomocu HTML-a i to ce biti predmet nasih proucavanja kada stignemo do dela koji govori o PHP-u. Do tada, hajde da naucimo kako da zatrazite informacije od posetilaca sajta, a PHP ce nam dati resenje za preuzimanje tih podataka. Za pocetak unesite <FORM> i </FORM> tagove koji se mogu postaviti bilo gde u telu stranice. Sve ostale tagove vezane za forme postavljacete izmedju <FORM> i </FORM> tagova. FORM tag uvek sadrzi par ekstra podataka koji govore web browseru kako da napravi formu. Ovo je generalni oblik: <FORM ACTION=url METHOD=metod> </FORM> pri cemu ACTION atribut govori browseru na koju adresu da posalje podatke prikupljene u formi, a METHOD atribut govori browseru kako da posalje podatke. ACTION uvek pokazuje na neki program na serveru koji prihvata i obradjuje podatke, a METHOD moze imati vrednost POST ili GET od kojih oba uglavnom dobro funkcionisu, ali posto GET moze imati problema sa prenosom vece kolicine podataka, preporucuje se da kao METHOD uvek koristite POST. Vecina dijalog boxeva, kao sto ste primetili ima opciju koja se moze odabrati. Biranje opcije govori programu sta da uradi. Forme takodje imaju komande opcije i to dve vrste: SUBMIT i RESET. Submit opcija je ekvivalent OK opciji dijalog box-a. Kada posetilac klikne na ovu opciju, podaci iz forme se posalju programu navedenom u ACTION atributu, metodom koja je navedena u METHOD atributu. Evo najprostijeg oblika SUBMIT komande: <INPUT TYPE=submit> Kao sto cete videti, vecina elemenata forme koristi neku varijaciju na <INPUT> tag, a ovi tagovi se smestaju unutar <FORM> i </FORM> tagova. Ako zelite da na dugmetu koje se kreira SUBMIT komandom bude prikazan neki drugi tekst, a ne standardni Submit, onda primenite sledecu konstrukciju:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<INPUT TYPE=submit value=Posalji> Na ovom dugmetu pisace Posalji. Ukoliko planirate da pravite prilicno velike forme razmislite o ubacivanju RESET komande koja ce omoguciti posetiocima da jednim klikom na RESET dugme izbrisu sve podatke unete u formu. Evo kako se navodi RESET komanda: <INPUT TYPE=reset value=Obrisi> Sada predjimo na pregled mogucih opcija koje mozete ponuditi posetiocima za unos podataka. Za proste tekst unose, kao sto su ime drage osobe, ili omiljeni clan grupe, koristite text boxeve. To su pravougaonici u koje citalac moze da unese sta god zeli. Evo osnovnog oblika jednog text boxa: <INPUT TYPE=text NAME=ime_text_boxa> gde je NAME ime text boxa po kojem ce ga prepoznati program koji prihvata podatke, kasnije cemo u prici o PHP-u imati detaljnije objasnjenje u vezi imena i njegove namene, za sada samo zapamtite da svako polje forme mora imati jedinstveno ime. Ukoliko zelite da unapred stavite neki text u text box, unesite unutar INPUT taga za text box atribut VALUE=nekitext, a ako zelite da kontrolisete velicinu text box-a, upotrebite atribut SIZE=x. Takodje, mozete ograniciti i duzinu teksta koji se moze uneti u text box navodjenjem atributa MAXLENGTH=y. Text box sa svim atributima izgleda ovako: <INPUT TYPE=text NAME=ime VALUE=nekitext SIZE=x MAXLENGTH=y> Ukoliko zelite da pruzite posetiocima vise prostora za pisanje, ili su vam potrebni visestruki redovi, savetujem vam da koristite text povrsinu. Text povrsina je takodje jedan pravougaonik koji prihvata unos texta, s tim sto moze da prikaze dva ili vise redova istovremeno. Evo kako funkcionise: <TEXTAREA NAME=ime ROWS=x COLS=y WRAP></TEXTAREA> GDE JE name IME text povrsine, ROWS odredjuje ukupan broj prikazanih redova, a COLS ukupan broj prikazanih kolona na ekranu. WRAP atribut govori browseru da zapocne novi red kada god korisnik pri kucanju udari u desnu ivicu text povrsine. Zapazite, takodje, da <TEXTAREA> zahteva </TEXTAREA> zavrsni tag. Ukoliko zelite da dobijete da/ne ili tacno/netacno odgovore od posetilaca sajta, check boxevi su stvoreni za tako nesto. Evo osnovnog oblika jednog check boxa:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

<INPUT TYPE=checkbox NAME=ime VALUE=vrednost> gde je, kao i obicno, NAME jedinstveno ime datog polja. Takodje, mozete dodati i CHECKED atribut <INPUT> tagu koji govori browseruda prikaze check box kao stikliran. <INPUT TYPE=checkbox NAME=ime VALUE=vrednost CHECKED>Kragujevac Zapazite da sam u prethodnom primeru pored <INPUT> stavio natpis Kragujevac. On sluzi kao oznaka koja citaocu govori sta check box zapravo predstavlja. Umesto da/ne opcija, mozete pozeleti da vasi posetioci imaju na rapolaganju vise opcija od kojih ce odabrati jednu. U tom slucaju radio dugmad su najbolja solucija: <INPUT TYPE=radio NAME=ime VALUE=vrednost> Ime je uobicajeno ime polja, s tim sto u ovom slucaju dajete isto ime svim radio dugmicima koji nude ponudjene opcije, da bi browser znao koje se opcije nalaze u istoj grupi. VALUE odredjuje vrednost odredjene opcije. Takodje mozete dodati CHECKED jednoj od opcija i ona ce biti unapred aktivirana. Radio dugmad su sjajan nacin da se posetiocima omoguci visestruki izbor, ali verovatno cete nekada imati da ponudite vise od 20 opcija ili cete pak zeleti da omogucite izbor vise opcija istovremeno. U tom slucaju bolje ce biti da koristite selekcione liste. One su nesto slozenije od ostalih tagova koji idu unutar formi, ali ne previse. Osnovni oblik je: <SELECT NAME=ime> <OPTION VALUE=vrednost>Prva opcija</OPTION> <OPTION VALUE=vrednost>Druga opcija</OPTION> <OPTION VALUE=vrednost>Treca opcija</OPTION> <OPTION VALUE=vrednost>I tako dalje</OPTION> </SELECT> svakako pogadjate da je NAME jedinstveno ime selekcione liste, a da VALUE atributi predstavljaju vrednost svake od ponudjenih opcija. Ovako formirana selekciona lista ili kako se jos cesto naziva - padajuci meni (dropdown menu) dozvoljava izbor samo jedne od ponudjenih opcija, medjutim ako zelite da omogucite vise od jedne opcije, dodajte atribut MULTIPLE unutar SELECT taga: <SELECT NAME=ime MULTIPLE> <OPTION VALUE=vrednost>Prva opcija</OPTION> <OPTION VALUE=vrednost>Treca opcija</OPTION> <OPTION VALUE=vrednost>I tako dalje</OPTION> </SELECT>

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Sva ova prica o formama je potpuno nepotrebna ako ne umete da preuzmete podatke iz njih. Tu vestinu savladacete kada stignemo do PHP-a jer to je njegov zadatak, a do tada nemojte zaboraviti forme jer ce vas one pratiti na svakom koraku vase karijere Internet programera.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2.9. Stilovi - Cascading Style Sheets HTML je u pocetku napravljen tako da bude jezik za oznacavanje strukture dokumenta, a ne nacin da se opise dizajn web stranice. Na srecu, web dizajneri su pronasli nacine da zaobidju ogranicenja HTML-a, koristeci tabele i druge mogucnosti. Ali, zar ne bi trebalo da postoji jezik koji precizno opisuje polozaj svih elemenata Web stranice? Zar ne bi bilo sjajno kada biste mogli da promenite font na citavom web sajtu, tako sto cete napraviti samo jednu izmenu? To je smisao stilova. On cini da web stranice izgledaju bas onako kako ste zeleli. Pored toga, CSS znatno olaksava odrzavanje web sajta. Samo jednim dokumentom mozete kontrolisati format teksta u citavom sajtu, a promene stila je izuzetno lako obaviti. Cascading Style Sheets je standard koji se odnosi na nekoliko metoda primenjivanja elemenata stila na HTML stranice. U ovom slucaju, stil posmatrajte kao element dizajna bilo koje vrste, kao sto je font, pozadina, tekst, boje linkova, kontrola margina i polozaj objekata na stranici. Postoji nekoliko metoda kojima se CSS moze primeniti na HTML dokument. Sintaksa se odnosi na strukturu informacija koje se nalaze u okviru definicije stila. Upoznajmo tri metode za primenu CSS-a na HTML dokument: 1. Inline - ovaj metod vam omogucava da uzmete bilo koji HTML tag i da mu dodate stil. Koriscenje inline metode pruza vam maksimalnu kontrolu nad bilo kojim aspektom Web stranice. 2. Interni - on vam omogucava da kontrolisete citavu stranicu HTML-a. Upotreba taga <style>, koji se postavlja u <head> odeljak HTML stranice, ubacuje detaljno razradjene atribute stila koji ce biti primenjeni na citavu stranicu. 3. Eksterni - ovaj metod je mocan alat koji vam omogucava da kreirate glavne stilove koje mozete primeniti na citav sajt. Dizajner kreira glavni CSS dokument koristeci .css ekstenziju. Ovaj dokument sadrzi stilove koje zelite da primenite na celom Web sajtu. Recenice zahtevaju odredjene elemente, a isto je i sa matematickim jednacinama. CSS je slican recenicama i jednacinama jer, ako ne sledi odredjeni red ili sintaksu, nece funkcionisati kako treba. Koji god metod da odaberete za primenu stila, sintaksa ce biti slicna. CSS je sacinjen od specificnih delova: Selektor (selector) je element koji ce primiti atribute koje dodeljujete. To moze biti tag, kao sto je H1 ili paragraf P. Stilovi omogucavaju naprednije selekcije, ukljucujucu klase, ali o tome neki drugi put.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Parametar (property) definise selektor. Na primer, ako imate paragraf koji ce biti selektor, mozete ukljuciti parametar koji ce definisati taj selektor. Parametri podrazumevaju stvari kao sto su margine, fontovi, pozadineU CSS-u postoji mnogo parametara koje mozete koristiti da biste definisali selektor.

Vrednost (value) definise parametar. Recimo da imam naslov prvog reda, H1, kao selektor i ubacio sam familiju fontova, font-family, kao parametar. Vrednost tog parametra je zapravo font koji definisem (Arial, Helvetica i sl).

Deklaracija deklaraciju.

(declaration)

parametri

vrednosti

se

kombinuju

cineci

Pravilo (rule) - selektor i deklaracija zajedno cine pravilo

Termin kaskadni se koristi zbog mnogo stilova koji se mogu koristiti u jednoj HTML stranici. Browser ce pratiti redosled - kaskadu - dok interpretira informacije o stilu. To znaci da mozete koristiti tri tipa stila i browser ce prikazivati eksterni, interni i inline stil bas tim redom. Cak i ako primenite glavni stil na citav sajt, mozete kontrolisati aspekte pojedinih stranica pomocu internog stila i pojedina podrucja na tim stranicama pomocu inline stila. Drugi aspekt kaskade je nasledjivanje.Ono komanduje da se, osim ako drugacije ne naredite, odredjeni stil nasledi u drugim aspektima HTML stranice na koje moze uticati. Na primer, ako definisete odredjenu boju teksta u tagu <p>, svi tagovi u okviru tog paragrafa ce naslediti tu boju, osim ako se drugacije ne naglasi. Inline stil se primenjuje na bilo koji logican HTML tag koji koristi atribute stila. Evo primera primene inline stila: primer_12.html

<P style="font-family: Helvetica,Arial,sans-serif; font-size: 14pt; font-weight: bold; color: #FF0000;"> Ovo je bold tekst prikazan velicinom slova od 14 pointa u Helvetica fontu </P> <P style="font-family: Verdana,Helvetica,Arial,sans-serif; font-size: 12pt; color: #00FF00;"> Ovaj tekst bice prikazan sa velicinom slova od 12 pointa u Verdana fontu. </P>
Interni stilovi koriste tag <STYLE> postavljen ispod </HEAD> taga i pre <BODY> taga u standardnom HTML dokumentu:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

primer_13.html

<HTML> <HEAD><TITLE>Primer internog stila</TITLE></HEAD> <STYLE> BODY {background: #ff0000; color: #000000;} H1 {font: 14pt verdana; color: #cccccc;} P {font: 12 pt times;} A {color: #00ff00; text-decoration: none;} </STYLE> <BODY> </BODY> </HTML>
Kao sto mozete videti iz gornjeg primera, style sheet kod izgleda pomalo drugacije od standardnog HTMLa. Ipak, nije tesko pratiti logiku. Eksterni stil prosiruje koncept internog stila. Koristicete isti kod kao za interni stil, samo sto cete ove informacije postaviti u odvojeni dokument. Taj dokument se potom snima sa ekstenzijom .css. Zatim pravite link ka ovom fajlu sa svih stranica na kojima zelite da primenite tako definisan stil. Evo sintakse za eksterni stil: primer_14.css

<STYLE> BODY {background: #ff0000; color: #000000;} H1 {font: 14pt verdana; color: #cccccc;} P {font: 12 pt times;} A {color: #00ff00; text-decoration: none;} </STYLE>

Sada snimite ovaj dokument kao poseban fajl. Nazovite ga style1.css i smestite ga negde unutar svog direktorijuma koji je vidljiv iz web servera. Nastavite tako sto cete sa ovim dokumentom povezati svaku HTML stranicu na kojoj zelite da primenite stil, koristeci sledecu sintaksu, postavljenu ispod </TITLE> taga i iznad </HEAD> taga: <LINK REL=stylesheet href=style1.css type=text/css>

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

U ovom trenutku, bitno je upamtiti koncept kaskade. Ako hocete globalno da uticete na deset stranica HTML-a jednim style sheet dokumentom, mozete. Potom, ako zelite manja podesavanja u pojedinim stranicama, mozete ugnjezditi interni stil u tu stranicu, ili koristiti inline stil za odredjeni tag. Postoji mnogo parametara za stilove, a posto je ovo kurs za programere, necemo se upustati u detalje rada sa stilovima. Sada, kada imate ideju kako se koriste stilovi, mozete potraziti vise informacija u nekim knjigama koje se bave tom problematikom. Za pocetak, dovoljno je da znate sta su stilovi, jer cete ih sigurno sretati na webu, a postepeno cete uciti i sami da ih kreirate.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.1. Sta je relaciona baza podataka Relaciona baza podataka sadrzi tabele koje su sastavljene od kolona i vrsta, a medjusobno su povezane vrednstima odredjenih kolona. Covek voli da koristi precice i asocijacije, a to podrzava relaciona baza podataka. Da biste razumeli nesto sto je slozeno i tesko, obicno ga delite na male, logicke celine i pokusavate da usredsredite svu paznju na pojedinacne delove. Ako razumete pojedinacne delove i zamislite medjusobne veze, shvatanje celine bi trebalo da bude olaksano. Relaciona baza podataka je, prosto receno, kontejener za te male delove i njihove medjusobne veze. Razmotrimo jedan prakticni primer relacione baze podataka. U realnom svetu razvoja aplikacija jedan od uobicajenih poslova koji se izvrsavaju je izrada kataloga za online prodavnicu. Recimo da je potrebno kreirati katalog za prodavnicu patika. Razmislite sta cini jedan katalog kvalitetnim? Mozda cete doci na ideju da sastavite listu slicnu sledecoj: ID proizvoda (identifikacioni broj) Naziv Boja Velicina Cena Opis

Sve ove podatke mozete uneti u jednu veliku tabelu. ID 1 2 Naziv Nike Patike Adidas Patike Boja Crna Bela Velicina 45 43 Cena 2000 3000 Opis Neki opis Neki opis

Ako ste se odlucili za takav pristup, ubrzo cete se suociti sa problemima. Pretpostavimo da su u magacin stigle Nike Patike bele boje i Adidas Patike crvene boje. Evo kako ce izgledati nasa tabela posto dodamo nove proizvode: ID 1 2 3 4 Naziv Nike Patike Adidas Patike Nike Patike Adidas Patike Boja Crna Bela Bela Crvena Velicina 45 43 45 44 Cena 2000 3000 2000 3000 Opis Neki opis Neki opis Neki opis Neki Opis

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

A zatim dobijamo Nke patike crne boje u velicinama 42, 43 i 44. Moramo ih dodati u tabelu i ogledajte kako ce tabela posle toga izgledati: ID 1 2 3 4 5 6 7 Naziv Nike Patike Adidas Patike Nike Patike Adidas Patike Nike patike Nike Patike Nike Patike Boja Crna Bela Bela Crvena Crna Crna Crna Velicina 45 43 45 44 42 43 44 Cena 2000 3000 2000 3000 2000 2000 2000 Opis Neki opis Neki opis Neki opis Neki Opis Neki Opis Neki opis Neki Opis

Uocite koliko puta u tabeli imamo naziv Nike Patike - pet puta, Crna boja Nike Patika se pojavljuje cetiri puta... Zamislite sada veliku prodavnicu koja ima stotine artikala, pa ako po svakom artiklu imamo slican broj ponavljanja istih podataka, ubrzo cemo imati tabelu sa nekoliko hiljada slogova. Sta ce se desiti kada se odredjene patike prodaju i treba ih izbrisati iz tabele, ili ako treba promeniti cenu crnim Nike patikama? Pretpostavljate vec, da nam predstoji posao u kome moramo proci kroz svaki slog i proveriti da li treba nesto menjati ili ne. To je uzasno naporan posao i gotovo je nemoguca njegova automatizacija. Ova pitanja su samo vrh ledenog brega. Bez relacionog dizajna, provescete vise vremena trazeci odgovore na pitanja sta ako, nego na razvoj aplikacije i zaradjivanje novca od svojih proizvoda. Umesto velike nocne more u vidu jedinstvene liste podataka, mozete kreirati nekoliko malih, povezanih tabela: Master - svaka vrsta proizvoda ima jedinstveni ID, naziv proizvoda, cenu i generalni opis proizvoda Boje - Kreirajte po jednu vrstu za svaku boju i pridruzite joj ID proizvoda. Ako se neka majica pojavljuje u pet boja, imace pet vrsta (slogova) u tabeli Colors. Velicine - kreirajte po jednu vrstu (slog) za svaku velicinu dostupnu za odredjeni proizvod i pridruzite joj ID proizvoda da biste znali o kojem se artiklu radi. Ove tabele su medjusobno povezane upotrebom kljuca - ID proizvoda. Sledeca slika ilustruje te veze:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

master -id -naziv -cena -opis

boje -id -boja

velicine -id -velicina

Prodjimo sada kroz proces dodavanja podataka u tabele koji smo imali u prethodnom primeru. master id 1 2 boje id 1 2 velicine id 1 2 Sada pretpostavimo da izgledati nase tabele: master id 1 naziv Nike Patike cena 2000 opis Neki opis velicina 45 43 su u magacin stigle Nike Patike bele boje i Adidas Patike crvene boja Crna Bela naziv Nike Patike Adidas Patike cena 2000 3000 opis Neki opis Neki Opis

boje. Sve sto treba da uradimo je da dodamo nove boje u tabelu boje. Kako ce posle toga

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

id 2 boje id 1 2 1 2 velicine id 1 2

naziv Adidas Patike

cena 3000

opis Neki Opis

boja Crna Bela Bela Crvena

velicina 45 43

Kao sto vidite, samo smo u tabelu boje dodali dva sloga, a sve drugo je ostalo isto. Uporedite to sada sa poslom koji smo imali kod prethodnog primera. A zatim dobijamo Nke patike crne boje u velicinama 42, 43 i 44. Posto unesemo potrebne podatke, pogledajte kako ce izgledati tabele: master id 1 2 boje id 1 2 1 2 boja Crna Bela Bela Crvena naziv Nike Patike Adidas Patike cena 2000 3000 opis Neki opis Neki Opis

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

velicine id 1 2 1 1 1 velicina 45 43 42 43 44

Samo smo dodali tri sloga u tabelu velicine i time zavrsili posao. Lako se uocava da nam je manipulacija podacima znatno olaksana i vrlo se lako moze automatski obavljati. Takodje uocite koliko je lak zadatak promena imena nekih patika. Samo treba otici u master tabelu i promeniti ime na jednom jedinom mestu. A sada pogledajte koliko izmena bi trebalo uraditi u prethodnom primeru, da bi se promenilo ime nekim patikama. Razbijanjem duge liste podataka na nekoliko manjih logickih struktura, postigli ste nesto sto se u teoriji zove normalizacija. Ovaj primer nije toliko slozen koliko ce biti u stvarnom razvoju softvera, ali vremenom cete uociti razne stepene normalizacije u zavisnosti od slozenosti. Ovaj primer moguce je zakomplikovati raznim pitanjima: Sta ako imamo razlicite cene za Bele i Crne Nike Patike, ili ako imamo vise podvrsta Nike Patika? U tom slucaju neophodna je dalja normalizacija postojecih tabela, tj. njihovo razbijanje na nove tabele. Ovde cemo se zaustaviti, jer smo ipak na pocetnom kursu SQL-a i za sada imamo dovoljno znanja. Kada pocnete sa ozbiljnijim radom, srescete se sa konkretnim situacijama u kojima cete postepeno detaljnije razradjivati prikazani princip. Praksa je najbolja skola! Sta je MySQL? MySQL je najpopularnija Open Source baza podataka, sa nekoliko miliona korisnika, od pojedinacnih, koji opsluzuju svoje licne web strane, do velikih korporacija, koje opsluzuju web stranice sa izuzetno velikim saobracajem. Jedan od primera je Yahoo! Finance koji koristi MySQL za obradu stotina upita u sekundi, ili miliona upita u toku dana. Znate sta je relaciona baza podataka, a da biste tacno razumeli sta je MySQL, samo treba dodati jos par reci: MySQL je sistem za upravljanje relacionim bazama podataka (Relational DataBase Management System - RDBMS). Pored toga sto cuva sve baze, tabele i njihove elemente i podatke, MySQL upravlja njima kao jednim entitetom. Korisnicima su pridruzeni

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

nivoi pristupa i dozvole, a svim tim upravlja MySQL. Osim toga, MySQL belezi akcije ovih korisnika i upravlja odgovorima na upite.

Sta su upiti? Upiti su komande napisane u SQL-u (Structured Query Language), koje saljete svom sistemu za upravljanje bazama podataka, (u ovom slucaju to je MySQL), da biste kreirali baze i tabele, dodali podatke u njih, izmenili pojedine slogove, obrisali ili preuzeli informacije koje cete koristiti u aplikaciji. Detaljnije cete se upoznati sa SQL-om kasnije u ovom poglavlju. Ljudi koji se bave razvojem aplikacija za Web koriste MySQL jer je vrlo brz i nije ni priblizno slozen i konfuzan kao mnogo robusniji sistemi poput Oracle-a, MSSQL servera i drugih. Osim toga, MySQL je jeftiniji od Oracle-a za nekoliko desetina hiljada dolara, jer je MySQL open source proizvod - sto znaci da ga mozete besplatno koristiti!

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.2. Objasnjenje terminologije baze podataka Vazno je razumeti osnovne strukturalne elemente baze podataka; inace imacete problema vec na pocetku rada. Savladavanje detalja ce vas postedeti muka u razumevanju price o bazama. Osnovni gradivni elementi su tabele, polja, slogovi, kljucevi i indeksi. Tabela je najveci element u bazi podataka. Po redosledu kreiranja, ona je druga po redu, odmah iza same baze podataka. Dakle, tabela je deo baze. Vecina ljudi razmislja o tabelama kao o velikim ravnim objektima u kojima su sortirani clanovi. Ova predstava moze biti posebno tacna ako cuvate svoje podatke u Microsoft Excelu, ili u drugim programima za tabelarno prikazivanje. Medjutim, tabela nije pojedinacan fajl koji postoji u vasem sistemu fajlova. Kada radite sa bazom podataka, ne otvarate fajl i ne unosite podatak, zatvarajuci ga dok vam ne bude ponovo potreban. Umesto toga, koristite interfejs za bazu podataka i izdajete upite koji upravljaju vasim tabelama i informacijama koje su u njoj smestene. Kada su tabele napravljene, mozete ih obrisati (sto je poznato kao dropping) i menjati njihove strukture upotrebom upita. Posto je tabela kontejner podataka, kada je obrisete obrisali ste i sve podatke koji se u njoj nalaze. Polja pruzaju strukturu tabeli i obezbedjuju mesto za smestanje podataka. Koristeci analogiju tabelarnog prikaza, moze se reci da su polja nesto poput kolona. U svakoj MySQL tabeli mozete imati najvise 3398 polja; ako ih zaista nekada budete imali toliko bice to jasan pokazatelj da ste zaboravili na normalizaciju. Slog je unos u tabelu. Ponovo koristeci analogiju tabelarnog prikaza, slogovi su vrste, a u preseku sloga i kolone dobijamo celiju u koju unosimo podatak koji zelimo sacuvati u bazi. Slogovi mogu biti potpuni - sva polja su popunjena podacima, ili nepotpuni - neka polja su popunjena podacima a neka prazna. Sledeca slika prikazuje tabelu sa oznacenim poljima i slogovima: Slog Celija Polje

Polje

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Kljucevi mogu biti veoma mocni elementi vasih MySQL tabela i slogova. Dok budete stvarali dobro dizajnirane baze podataka za upotrebu u aplikacijama, koristicete kljuceve da biste povezivali svoje tabele. Neko polje mozete definisati kao kljuc prilikom kreiranja tabele. MySQL podrzava dva tipa kljuceva: jedinstvene i primarne. Kada definisete polje kao jedinstveno, saopstavate MySQL-u da, bez obzira sta pokusavali, nikada necete imati mogucnost da unesete duplikat u to polje. Na primer, ako kreirate katalog online prodavnice, imacete nekoliko proizvoda za prodaju. Svaki jedinstveni proizvod iz kataloga ima svoj broj proizvoda i taj broj mora biti jedinstven, dakle to ce biti jedinstven kljuc. Primarni kljuc je slican jedinstvenom - oba moraju sadrzati jedinstvene vrednosti, ali primarni predstavlja glavnu vezu izmedju dve ili vise tabela. Moze postojati samo jedan primarni kljuc po tabeli, ali mozete imati nekoliko jedinstvenih kljuceva. Indeksi baze podataka su funkcionalno slicni indeksu na kraju knjige - pomazu da brze pronadjete zeljeni pojam. Kada definisete polje u tabeli kao primarni kljuc, MySQL automatski dodaje tu informaciju indeksu. Indekse mozete i rucno dodati u tabelu da biste indeksirali polja necim drugim, osim poljem primarnog kljuca. Kada selektujete slogove koje je indeksirala vasa baza podataka upit ce se brze izvrsavati nego da tabela nema indekse. Medjutim kada dodajete slog tabeli koja mora izvrsiti pritom indeksiranje, upit ce se nesto sporije izvrsiti nego da indeksiranja nema. Zato treba pronaci balans kada koristiti, a kada ne, indekse. Opste pravilo za kreiranje dodatnih indeksa je kreirati indeks koji podrzava upite zajednicke selekcije. Na primer, ako vasa aplikacija poziva upit koji selektuje sve proizvode odredjene boje i specificne velicine, dodacete indeks koji je kombinacija dva polja - boje i velicine. Ovakav pristup znacajno ce ubrzati izvrsavanje visekolonskih upita.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.3. Osnovna uputstva za rad sa MySQL serverom pomocu PHPMyAdmin aplikacije Jedna od najpoznatijih PHP aplikacija za rad sa MySQL serverom je PHPMyAdmin (http://www.phpmyadmin.net/), koji je ukljucen u WAMP instalaciju. Osnovni izgled PHPMyAdmin radnog prostora prikazuje sledeca slika:

Leva margina sadrzi drop-down meni sa spiskom baza podataka koje imate na svom serveru. Sa desne strane nalazi se glavni prozor programa u kojem na pocetku imate linkove ka osnovnim funkcijama koje mozete izvoditi globalno nad MySQL serverom. Kada odaberete neku bazu iz drop-down menija, dobijate izgled PHPMyAdmina kao na sledecoj slici. U levoj margini pojavljuje se spisak svih tabela u bazi, a sa desne strane, pored spiska svih tabela sa nesto detaljnijim informacijama, imate na vrhu pristup raznim komandama koje cete koristiti u radu. Neke od njih koje ce vam biti neophodne su:

Structure - prikazuje strukturu cele baze (spisak svih tabela sa osnovnim informacijama o

njima)
SQL - klikom na ovu opciju dobijate prostor za postavljanje SQL upita (veoma vazna

funkcija i najcesce cete sa njom raditi)

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Export - ako zelite da izvezete podatke i/ili strukturu cele ili dela baze, koristite ovu

komandu
Drop - selektujete jednu ili vise tabela i klikom na Drop ih obrisete

Ako sada u levoj margini kliknete na ime neke tabele, PHPMyAdmin dobija izgled kao na sledecoj slici:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Obratite paznju kako izgleda glavni prozor PHPMyAdmina kada radite na jednoj tabeli. Na vrhu su se pojavile neke nove funkcije, a objasnimo sledece:
Browse - sluzi za pregledanje sadrzaja tabele Insert - funkcija za unosenje novih podataka u tabelu Empty - funkcija koja brise sve podatke iz tabele

Ovim nije ni izbliza pokriven opis svih funkcionalnosti koje pruza PHPMyAdmin, a namerno ne zelim da ih detaljnije objasnjavam iz sledeceg razloga: pomocu SQL-a, koji cemo izuciti, mozete uraditi sve sto zelite nad jednom bazom podataka, pa vam nikakva pomagala, osim prostora za postavljanje SQL upita, nisu potrebna. PHPMyAdmin je intuitivno dizajnirana aplikacija i siguran sam da cete je sami lako otkrivati tokom rada. Poslednja slika PHPMyAdmina prikazuje kako izgleda prostor za postavljanje upita sa kojim cemo se puno druziti u narednom periodu (klikom na SQL dobijate sledece):

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.4. Tipovi podataka u tabelama Pravilno definisanje polja u tabelama je vazno za optimizaciju baze podataka. Koristite samo tip i velicinu polja koje zaista treba da upotrebite. Ovi tipovi polja se takodje odnose i na tipove podataka koje cete cuvati u poljima. MySQL koristi mnogo razlicitih tipova podataka, koji su podeljeni na tri kategorije: numericki, datum/vreme i stringovi. Upoznacete se sa uobicajenim tipovima koji se koriste pri radu sa MySQL-om. Obratite posebnu paznju na ovaj deo, jer je definisanje tipa podataka vaznije od drugih delova u procesu kreiranja tabela. Numericki tipovi podataka: TINYINT je veoma mali ceo broj koji moze biti oznacen ili neoznacen. Ako je oznacen, dopusteni opseg je od -128 do +127. Ako je neoznacen (deklarise se sa UNSIGNED) dopusteni opseg je od 0 do 255. SMALLINT je mali ceo broj koji moze biti oznacen ili neoznacen. Ako je oznacen, dopusteni opseg je od -32768 do 32767. Ako je neoznacen, dopusteni opseg je od 0 do 65535. MEDIUMINT je ceo broj srednje velicine, koji moze biti oznacen ili neoznacen. Ako je oznacen, dopusteni opseg je od -8.388.608 do 8.388.607. Ako je neoznacen, dopusteni opseg je od 0 do 16.777.215. INT je ceo broj normalne velicine koji takodje moze biti oznacen ili neoznacen. Ako je oznacen, dopusteni opseg je od -2.147.483.648 do 2.147.483.647. Ako je neoznacen, dopusteni opseg je od 0 do 4.294.967.295. BIGINT je veliki ceo broj koji moze biti oznacen ili neoznacen. Necu navoditi dopustene opsege jer se radi o brojevima sa po 19 cifara. FLOAT(M, D) je broj u pokretnom zarezu koji ne moze biti neoznacen. Mozete definisati duzinu prikaza M i broj decimala D. Nije obavezno navoditi M i D. DOUBLE(M, D) je broj u pokretnom zarezu dvostruke tacnosti koji ne moze biti neoznacen. Od svih MySQL numerickih tipova najvise cete koristiti INT, a strogo vodite racuna o tome koji INT koristite zbog raspolozivog opsega. Tipovi podataka koji predstavljaju Datum i Tacno Vreme MySQL ima nekoliko dostupnih tipova podataka za cuvanje datuma i tacnog vremena. Fleksibilnost MySQL tipova datuma i vremena prebacuje odgovornost za ispravnost podataka na osobu koja razvija aplikacije. My SQL proverava samo dva elementa: da li je mesec izmedju 0 i 12 i da li je dan izmedju 0 i 31. Dakle, MySQL se nece buniti ako unesete 31. februar kao dan vaznog sastanka, o tome aplikacija mora voditi racuna.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

MySQL tipovi datuma i vremena su sledeci: DATE datum je u YYYY-MM-DD formatu (YYYY-godina sa sve cetiri cifre, MMmesec sa dve cifre, DD-dan sa dve cifre) izmedju 1000-01-01 i 9999-12-31. Na primer, 30. decembar 1973. godine ce biti sacuvan kao 1973-12-30. DATETIME je kombinacija datuma i tacnog vremena u formatu YYYY-MM-DD HH:MM:SS izmedju 1000-01-01 00:00:00 i 9999-12-31 23:59:59. Na primer, 15:30 casova 30. decembra 1973. godine ce biti sacuvano kao 1973-12-30 15:30:00. TIMESTAMP moze da oznaci bilo koji trenutak pocev od 1. Januara 1970. godine pa do 2037. godine u razmacima od jedne sekunde. Podrazumevani format timestamp-a je YYYYMMDDHHMMSS (duzina 14), a mozete sami skracivati ovu duzinu na 12 YYMMDDHHMMSS, 10 YYMMDDHHMM, 8 YYYYMMDD, 6 YYMMDD, 4 YYMM i 2 YY. U formatu duzine 14, ce biti sacuvano kao 19731230153000. TIME smesta tacno vreme u HH:MM:SS formatu. YEAR cuva godinu u formatu od 2 ili 4 cifre. Ako je duzina naznacena kao 2, YEAR moze biti od 70 do 69 sto oznacava godine od 1970 do 2069. Ako je duzina naznacena kao 4, YEAR moze biti od 1901 do 2155. Najcesce cete koristiti DATETIME i DATE tipove za vreme i datum. Tipovi stringova Iako su numericki i tipovi za datum i vreme interesantni, vecina podataka koje cete smestati u bazu ce biti u string formatu. U sledecoj listi objasnjeni su uobicajeni tipovi string podataka u MySQLu: CHAR je string fiksne duzine izmedju 1 i 255 karaktera. Sa desne strane je dopunjen prazninama da bi se obezbedila naznacena duzina. VARCHAR je string promenljive duzine izmedju 1 i 255 karaktera. Morate definisati duzinu kada kreirate VARCHAR polje. BLOB ili TEXT polje je maksimalne duzine od 65535 karaktera. Jedina razlika izmedju BLOB i TEXT tipova je sto je sortiranje i poredjenje sacuvanih podataka u BLOB formatu case-sensitive, a u TEXT formatu je case-insensitive. (Case-sensitive izraz oznacava da se razlikuju mala i velika slova, dakle M nije isto sto i m, dok kod case-insensitive tipa nema razlikovanja malih i velikih slova pa je M isto sto i m). Moze se slobodno reci da je TEXT zapravo case-insensitive BLOB. U slucaju BLOB ili TEXT ne mozete navesti duzinu polja. TINYBLOB ili TINYTEXT je BLOB ili TEXT polje sa maksimalnom duzinom od 255 karaktera. Takodje se ne naznacava duzina. MEDIUMBLOB ili MEDIUMTEXT je BLOB ili TEXT sa maksimalnom duzinom od 16 777 215 karaktera. 15:30 casova 30. decembra1973. godine

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

LONGBLOB ili LONGTEXT je BLOB ili TEXT sa maksimalnom duzinom od 232 karaktera. ENUM prestavlja unapred definisan niz mogucih vrednosti za dato polje.

Verovatno cete koristiti VARCHAR i TEXT polja cesce od drugih, pri cemu je i ENUM tip vrlo koristan.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.5. Kreiranje tabela Kreiranje tabela zahteva tri bitne klase informacije: nazive tabela, nazive polja i definicije za svako polje. Pretpostavimo da je potrebno napraviti bazu koja ce sadrzati kontakt podatke koje zelite da prikupite od posetilaca nekog sajta. Upoznajmo se sa osnovnom sintaksom SQL-a za kreiranje tabela: CREATE TABLE ime_tabele (ime_polja tip_polja); Ovo je pojednostavljena sintaksa, ali polako cemo razmatrati deo po deo da biste razumeli sve delove slagalice. Ako napravite gresku prilikom kreiranja tabele, bilo kod imena polja ili definicije tipa, postoji komanda ALTER koja vam daje mogucnost predefinisanja polja. Nazivi polja su bitni za administraciju podataka. Stoga imena treba da budu sto

jednostavnija i relevantna za podatke koje cuvaju. Ako je vasa baza normalizovana imacete mnostvo malih tabela i bice vam od velike pomoci ako nazivi polja imaju nekog smisla. U sledecoj tabeli navedena su imena tabela i polja koja ce nam biti potrebna za kreiranje baze za cuvanje kontakata:

Naziv tabele master_name job_function company address telephone fax email personal_notes

Nazivi polja name_id, date_added, date_modified, first_name, last_name job_id, name_id, job_function company_id, name_id, company_name add_id, name_id, street, city, state, post_code, type tel_id, name_id, country_code, number, type fax_id, name_id, country_code, number, type email_id, name_id, email, type notes_id, name_id, note

Sada je potrebno definisati tipove za navedena polja sto ce biti uradjeno u okviru preliminarnog kreiranja tabela. Naredbe koje slede su preliminarne, jer ce biti kompletirane definicijama kljuceva i indeksa nesto malo kasnije. Sve CREATE TABLE naredbe mogu se napisati u jednoj liniji, ali se obicno pisu u vise linija radi bolje preglednosti. MySQL uopste ne vidi visestruke linije, njemu je samo vazan pravilan redosled zagrada i zareza. Vazno je napomenuti da se svaka SQL komanda zavrsava znakom ;. Definisimo sada tipove polja u tabelama i napisimo SQL komande za njihovo kreiranje. U tabeli master_name za name_id polje cemo koristiti UNSIGNED SMALLINT jer pretpostavljamo da nam je 65535 vrsta u toj tabeli dovoljno da primi sve kontakte koje

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

cemo ikada prikupiti. Ako se ipak dogodi da se priblizimo tom broju, onda kasnije mozemo zameniti tip tog polja u INT. Isto razmisljanje primenicemo na sva ostala id polja u tabelama. Tabela master_name ima polja date_added i date_modified i ako pretpostavimo da nam je vazan samo datum a ne i tacno vreme upisa ili modifikacije odredjenog kontakta, onda nam je dovoljno da koristimo DATE tip za ova polja. Posto postoji velika mogucnost da nikada necete upoznati osobu sa imenom ili prezimenom duzim od 75 karaktera, za polja first_name i last_name koristicemo VARCHAR(75) tip. Ovaj tip znaci da ce u memoriji MySQL zauzimati onoliko mesta koliko je potrebno da bi se zapisalo ime uz napomenu da ta duzina nece preci 75 karaktera. Napokon, evo i komande za kreiranje tabele master_name: CREATE TABLE master_name ( name_id SMALLINT UNSIGNED, date_added DATE, date_modified DATE, first_name VARCHAR(75), last_name VARCHAR(75) ); Velika slova prilikom pisanja SQL naredbe sam koristio samo zbog bolje preglednosti i napominjem da komande nisu case-sensitivne. Medjutim, posto se podaci unutar MySQLa cuvaju u direktorijumima i fajlovima, imena baza podataka i tabela u njima su case-sensitivni na UNIX/Linux operativnim sistemima, a nisu na Windows-u. Imena polja su caseinsensitivna na bilo kojem operativnom sistemu. Slede komande za kreiranje ostalih tabela: CREATE TABLE job_function ( job_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, job_function VARCHAR(100) ); CREATE TABLE company ( company_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, company_name VARCHAR(100) ); Tabela address ima neke interesantne clanove, pored standardnih id-ova. Znate da postanski brojevi imaju najmanje 5 a najvise 10 karaktera pa polje za post_code mozemo definisati

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

kao VARCHAR(10). Ime drzave mozemo cuvati kao skracenicu da bismo smanjili neophodan prostor. Osim toga, polje za tip adrese cemo predefinisati za jednu od tri moguce vrednosti: home, work, other. CREATE TABLE address ( add_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, street VARCHAR(255), city VARCHAR(50), state CHAR(2), post_code VARCHAR(10), type ENUM('home', 'work', 'other') ); Tabele telephone, fax i email su varijacije iste teme: CREATE TABLE telephone ( tel_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, country_code CHAR(3), number VARCHAR(25), type ENUM('home', 'work', 'other') ); CREATE TABLE fax ( fax_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, country_code CHAR(3), number VARCHAR(25), type ENUM('home', 'work', 'other') ); CREATE TABLE email( email_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, email VARCHAR(150), type ENUM('home', 'work', 'other') ); Tabela personal_notes sadrzi polje note koje mozete definisati kao TEXT, posto ne znate koliko duge ce biti napomene.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

CREATE TABLE personal_notes ( notes_id SMALLINT UNSIGNED, name_id SMALLINT UNSIGNED, note TEXT ); Pre nego isprobate kako komande funkcionisu u PHPMyAdminu, upoznajte se sa sintaksom definisanja indeksa i kljuceva. Kao sto smo ranije naglasili postoje dva tipa kljuceva koje koristi MySQL: primarni i jedinstveni. Podrazumeva se da je primarni kljuc takodje jedinstven, sto znaci da se svaka vrednost u koloni primarnog kljuca pojavljuje samo jednom. Sa poljima koja su deklarisana kao kljucevi mozete raditi razne stvari; izmedju ostalog mozete uciniti da se automatski uvecavaju ako je rec o celobrojnom polju. Primarni kljucevi treba da postoje u svim tabelama, ako ni zbog cega drugog, bar da bi bile olaksane medjusobne veze. Primarne kljuceve mozete dodati u okviru CREATE TABLE naredbe dodavanjem PRIMARY KEY atributa: CREATE TABLE ime_tabele (ime_polja tip_polja PRIMARY KEY); Drugi nacin za definisanje primarnog kljuca je navodjenje atributa PRIMARY KEY posle definicije polja, ali tada onom polju koje deklarisete kao PRIMARY KEY morate dodati klauzulu NOT NULL koja oznacava da polje ne moze sadrzati NULL vrednost (Ako radite u PHPMyAdminu, ovu razliku necete primetiti jer on sam vodi racuna o tome): CREATE TABLE ime_tabele ( ime_kolone tip_kolone NOT NULL, ime_kolone2 tip_kolone, PRIMARY KEY (ime_kolone) ); Konacno, dolazimo do meni omiljenog koriscenja AUTO_INCREMENT-a na poljima celih brojeva. Funkcionise bas kako i zvuci - ako je polje koje koristi AUTO_INCREMENT prazno ili 0 prilikom unosa podataka, MySQL ce popuniti polje sledecim celim brojem za to polje u odnosu na poslednji sacuvan broj. Sintaksa upotrebe AUTO_INCREMENT-a je sledeca: CREATE TABLE ime_tabele ( ime_polja tip_polja PRIMARY KEY NOT NULL AUTO_INCREMENT );

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

AUTO_INCREMENT je veoma veoma jednostavna konstrukcija i od velike je pomoci u razvoju aplikacija. Bez njega, potrebno je izvrsiti dodatni upit pre dodavanja sloga da biste rucno pribavili tekucu najvecu vrednost u polju. Dodavanje jedinstvenih kljuceva je slicno dodavanju primarnih kljuceva. Razlika je u tome sto polja definisana kao jedinstveni kljucevi mogu sadrzati NULL vrednost. Termin primarni govori da mozete imati samo jedan takav kljuc u jednoj tabeli, ali mozete definisati mnoge druge jedinstvene kljuceve u svojoj tabeli ako je to opravdano.

CREATE TABLE ime_tabele ( ime_polja tip_polja PRIMARY KEY NOT NULL AUTO_INCREMENT, ime_polja2 tip_polja UNIQUE ); Mozete odluciti da nikada ne definisete jedinstveni kljuc u svojim tabelama ako one vec sadrze primarni kljuc. Kao sto cete uskoro nauciti, kljucevi su odlicni, ali njihova preterana upotreba ima vise losih nego dobrih efekata. Ranije ste naucili da je indeks baze podataka slican indeksu na kraju knjige - pomaze da brze pronadjete termine. Ako imate polje sa primarnim kljucem, ta je kolona automatski indeksirana. Ostali indeksi mogu biti definisani u toku naredbe kreiranja tabele: CREATE TABLE ime_tabele ( ime_polja tip_polja PRIMARY KEY NOT NULL AUTO_INCREMENT, ime_polja2 tip_polja UNIQUE, ime_polja3 tip_polja, INDEX idx_col3(ime_polja3) ); U ovom primeru ime indeksa je idx_col3 i sadrzi informaciju iz polja ime_polja3. Osim toga mozete indeksirati visestruke kolone njihovim dodavanjem u listu polja: INDEX idx_col3(ime_polja2, ime_polja3) Jos jedan metod za dodavanje indeksa je CREATE INDEX naredba. Ako ste vec kreirali svoju tabelu mozete izdati naredbu za dodavanje indeksa postojecoj tabeli: CREATE INDEX idx_cols ON ime_tabele(ime_polja2, ime_polja3);

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Poput kljuceva, indeksi mogu biti korisni, ali mogu i narusavati performanse. Kada koristiti, ili ne koristiti kljuceve i indekse? Svaki put kada dodajete novu informaciju polju koje je indeksirano (ukljucujuci polja primarnog kljuca), index mora biti azuriran. MySQL to cini automatski umesto vas, ali indeksiranje zauzima sistemske resurse. Ako je vasa aplikacija centralni deo velike korporacije i prima veliku kolicinu saobracaja, bice potrebno da obratite posebnu paznju i upotrebite indekse samo kada je to neophodno - na primer, kada se vase tabele upotrebljavaju pretezno za citanje velike kolicine podataka. Neka osnovna pravila za upotrebu kljuceva i indeksa podrazumevaju sledece: Ako dodajete, ili azurirate informacije cesce nego sto selektujete odnosno citate iz konkretne tabele, nemojte koristiti indekse na toj tabeli. Na primer, ako cuvate informacije o porudzbinama kupaca koje se koriste samo za arhiviranje, indeks nije neophodan. Ali, ako smestate informacije licnog profila za personalizovane web aplikacije, indeks predstavlja veliku pomoc. Cak i u tabelama koje se tesko citaju nemojte indeksirati polja koja vracaju veliki broj slicnih rezultata prilikom pretrazivanja. Na primer, u tabeli koja sadrzi informacije licnih profila, nemojte indeksirati polje state (drzava). Ako imate 3000 sacuvanih profila, od kojih je jedna trecina iz iste drzave, indeks vam nece biti od velike pomoci. Takvo indeksiranje mozete uporediti sa indeksiranjem reci medjutim u nekoj knjizi - zasto bi neko to uopste radio? Nemojte indeksirati male tabele. Ako mozete za sekundu ili dve da selektujete sve slogove iz tabele, onda je tabela dovoljno mala da indeks nije potreban. Ako primetite da je neka tabela vremenom porasla, uvek mozete naknadno dodati indeks. Ako zelite da vrsite pretrazivanja, indeksirajte tabelu. Drugim recima, ako ce vasa aplikacija sadrzati odredjene upite za vracanje nekih specificnih rezultata - na primer prikazi sve ljude koje znam po imenu X, indeksirajte polje po kojem vrsite pretrazivanje. U ovom primeru to bi bilo polje koje sadrzi imena. Nemojte preterati u dodavanju jedinstvenih kljuceva. Postoji ogranicenje o broju kljuceva u MySQL tabeli (16), ali normalizovana baza podataka u svakom slucaju ne treba da ima puno poziva za veliki broj kljuceva. Ovo je samo nekoliko saveta o upotrebi kljuceva i indeksa. Vise cete nauciti samim kreiranjem razlicitih tipova aplikacija u razlicitim okruzenjima. Napokon mozete dovrsiti proces kreiranja tabela dodavanjem kljuceva i indeksa prethodno formiranim naredbama. Slobodno mozete pokrenuti PHPMyAdmin i izdavati naredbe koje slede prateci kako se nove tabele dodaju u vasu bazu. Naravno, pre pocetka rada sa tabelama, kreirajte novu bazu koju cete koristiti za rad dok ucite i zatim je selektujte:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

CREATE DATABASE learning; USE learning; Prva komanda kreira bazu pod imenom learning, a druga komanda predstavlja vas ulazak u bazu learning. Sada mozete nastaviti sa radom. Slede komplatne komande za kreiranje tabela: CREATE TABLE master_name ( name_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, date_added DATE DEFAULT '0000-00-00', date_modified DATE DEFAULT '0000-00-00', first_name VARCHAR(75), last_name VARCHAR(75), INDEX idx_fn(first_name), INDEX idx_ln(last_name) ); CREATE TABLE job_function ( job_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', job_function VARCHAR(100), INDEX idx_job(job_function) ); CREATE TABLE company ( company_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', company_name VARCHAR(100) , INDEX idx_co (company_name) ); CREATE TABLE address ( add_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', street VARCHAR(255), city VARCHAR(50), state CHAR(2), post_code VARCHAR(10), type ENUM('home', 'work', 'other') );

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

CREATE TABLE telephone ( tel_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', country_code CHAR(3), number VARCHAR(25), type ENUM('home', 'work', 'other') ); CREATE TABLE fax ( fax_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', country_code CHAR(3), number VARCHAR(25), type ENUM('home', 'work', 'other') ); CREATE TABLE email( email_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0', email VARCHAR(150), type ENUM('home', 'work', 'other') ); CREATE TABLE personal_notes ( notes_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT, name_id SMALLINT UNSIGNED NOT NULL DEFAULT 0, note TEXT );

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.6. Popunjavanje tabela podacima (INSERT) SQL komanda za dodavanje novih slogova u tabelu se naziva INSERT. Sintaksa za dodavanje slogova upotrebom te komande prilicno je jednostavna: INSERT INTO ime_tabele (lista polja) VALUES (lista vrednosti); U okviru liste vrednosti morate ograditi stringove u okviru znaka navoda. SQL standard je obican jednostruki navodnik, ali MySQL dozvoljava i upotrebu dvostrukih navodnika. Upamtite da treba voditi racuna da se ne koristi tip navodnika koji se nalaze unutar samog stringa. Pored naziva tabele, postoje dva osnovna dela INSERT naredbe: lista polja i lista vrednosti. Obavezna je samo lista vrednosti, ali, ako izostavite listu polja, morate u listi vrednosti navesti vrednost za svaku kolonu po tacnom redosledu. Upotrebimo ranije kreiranu tabelu master_name kao primer. Imate sledeca polja: name_id, date_added, date_modified, first_name i last_name. Da biste uneli ceo slog, mozete koristiti jednu od naredne dve naredbe: 1. naredba sa imenovanim svim poljima: INSERT INTO master_name (name_id, date_added, date_modified, first_name, last_name) VALUES ('1', '2003-11-03', '2003-11-11', 'Petar', 'Petrovic'); 2. naredba koja koristi sve kolone, ali ih ne imenuje eksplicitno: INSERT INTO master_name VALUES ('2', '2003-11-03', '2003-11-11', 'Petar', 'Petrovic'); Evo sada interesantne verzije INSERT komande. Posto je name_id AUTO_INCREMENT, ne morate ga navoditi u listi vrednosti. Ali, u tom slucaju morate navesti listu sa imenima polja kojima dodeljujete vrednosti, jer ce u suprotnom doci do greske. Sledeci upit ce izazvati gresku: INSERT INTO master_name VALUES ('2003-11-03', '2003-11-11', 'Petar', 'Petrovic'); ERROR: Column count doesnt match value count at row 1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Posto niste naveli ni jednu kolonu, MySQL ocekuje da sve kolone budu u listi vrednosti, uzrokujuci gresku naprethodnoj naredbi. Ako je cilj bio da dopustite MySQLu da obavi posao unosa name_id polja umesto vas, mogli ste koristiti sledecu naredbu: INSERT INTO master_name (date_added, date_modified, first_name, last_name) VALUES ('2003-11-03', '2003-11-11', 'Petar', 'Petrovic'); Preporucuje se prepustanje posla oko inkrementiranja AUTO_INCREMENT polja samom MySQLu, pa cete stoga najcesce koristiti poslednji oblik INSERT komande.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.7. Selektovanje podataka (SELECT) Konacno ste popunili svoje tabele podacima. Sada je vreme da naucite kako da podatke procitate iz tabele. SQL komanda za prikupljanje sacuvanih podataka je SELECT i sada cete nauciti kako da je upotrebite. Sintaksa SELECT komande moze biti krajnje jednostavna, ali i vrlo komplikovana.

Najosnovnija sintaksa SELECT komande izgleda ovako: SELECT izrazi_i_polja FROM ime_tabele [WHERE neki_uslov] [ORDER BY neko_polje [ASC|DESC]] [LIMIT pocetak, koliko_slogova] Protumacimo navedenu sintaksu pocev od prve linije: SELECT izrazi_i_polja FROM ime_tabele Jedan od prirucnih izraza je simbol *, koji zamenjuje sve elemente. Dakle, da biste selektovali sve elemente (sve vrste i kolone) iz tabele master_name, vasa SQL naredba ce biti: SELECT * FROM master_name; Ako izvrsite ovaj upit u PHPMyAdminu dobicete tabelu sa svim podacima koje imate u tabeli master_name. Ako zelite da selektijete samo odredjene kolone, zamenite znak * nazivima kolona, razdvojenim zarezima. Naredna naredba selektuje samo name_id, first_name i last_name iz tabele master_name: SELECT name_id, first_name, last_name FROM master_name; Koristan izraz koji se moze upotrebiti sa SELECT komandom je DISTINCT, koji ce vratiti samo razlicite pojave u rezultujucem skupu. Posto prethodna recenica nije bas jasna, objasnicu je primerom. Pretpostavimo da u tabeli master_name ima vise osoba sa prezimenom Petrovic. Ako zelite da selektujete sva prezimena bez ponavljanja onih koja se pojavljuju vise puta u tabeli, primenicete sledeci upit: SELECT DISTINCT last_name FROM master_name; Rezultat ovog upita bice lista prezimena sa samo jednim pojavljivanjem prezimena Petrovic, sto je uzrokovano primenom DISTINCT izraza.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Podrazumeva se da su rezultati SELECT upita poredjani onako kako se pojavljuju u tabeli. Ako zelite da ih sortirate po nekom specificnom redosledu, po datumima, ID-u, nazivu i slicno, naznacite svoje zahteve upotrebom ORDER BY klauzule. U narednoj naredbi rezultati su sortirani po prezimenu: SELECT name_id, first_name, Last_name FROM master_name ORDER BY last_name; Podrazumevano sortiranje ORDER BY rezultata je po rastucem redosledu (ASC); stringovi se sortiraju od A do Z, celi brojevi od 0, a datumi od najstarijih ka novijim. Ovo ponasanje mozete promeniti u sortiranje po opadajucem redosledu upotrebom klauzule DESC: SELECT name_id, first_name, Last_name FROM master_name ORDER BY last_name DESC; Niste ograniceni samo na sortiranje po jednom polju - mozete naznaciti koliko god hocete polja, razdvojenih zarezima. Prioritet sortiranja je po redosledu imena polja u listi. Ako koristite ORDER BY last_name, first_name, rezultati ce biti sortirani po polju last_name, pa zatim po polju first_name: SELECT name_id, first_name, Last_name FROM master_name ORDER BY last_name, first_name; LIMIT klauzulu mozete koristiti da biste vratili samo odredjeni broj slogova vasim SELECT upitom. Postoje dva zahteva kada koristite ovu klauzulu: pocetak i broj_slogova. Pocetak je pocetna pozicija u rezultatima od koje ce poceti prikaz rezultata, a broj slogova jasno govori koliko zelite selektovanih vrsta. Kao primer, navedimo kako se selektuje prvih pet slogova master_name tabele, sortiranih po polju last_name: SELECT * FROM master_name ORDER BY last_name LIMIT 0, 5; MySQL ima mnoge ugradjene funkcije koje dopustaju da izvrsavate sve vrste operacija nad celim brojevima, stringovima i datumima. Opise ovih funkcija, kao i sintaksu za njihovu upotrebu mozete upoznati u detaljnom Manual-u koji dobijate uz instalaciju MySQL-a. Cesto cete imati potrebu za konsultovanjem MySQL manual-a kada se budete nalazili u situacijama za cije resavanje ce vam biti potrebne specificne funkcije ugradjene u MySQL, pa vam preporucujem da niposto ne izbegavate upoznavanje MySQL manual-a. Sada cu vam predstaviti samo nekoliko funkcija koje mogu biti korisne u primeni sa SELECT naedbom. Ako zelite da znate koliko slogova ima vasa tabela, mozete selektovati sve slogove i potraziti odgovor koji kaze, na primer 5 rows in set. Ali, ako imate milion slogova, selekcija svih milion vrsta samo da biste videli koliko ih ima, nije najbrzi nacin da

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

pronadjete odgovor. Umesto toga, mozete primeniti COUNT() funkciju, koja broji sve vrednosti u odredjenoj koloni koje nisu NULL. Kada to znate, ako koristite COUNT na primarnom kljucu, mozete vrlo brzo doci do broja slogova u tabeli. Evo kako upotrebiti COUNT() funkciju: SELECT COUNT(name_id) FROM master_name; COUNT() mozete koristiti zajedno sa DISTINCT izrazom, koji ste ranije savladali, da biste saznali broj jedinstvenih vrednosti u nekom polju: SELECT COUNT(DISTINCT last_name) FROM master_name; Izmedju ostalog, treba pomenuti jos neke osnovne funkcije MIN() i MAX(), koje se koriste za selekciju minimalnih ili maksimalnih vrednosti u polju. Na primer, selektujete minimalne i maksimalne vrednosti za name_id iz master_name tabele: SELECT MIN(name_id) FROM master_name; Ili: SELECT MAX(name_id) FROM master_name; Ako je polje definisano kao datum, onda ce MIN() vratiti najraniji datum, a MAX() najnoviji datum u polju. Ovo je bilo samo nekoliko primera ugradjenih MySQL funkcija, a ima ih jako mnogo koje se krecu od neopazenih, do onih bez kojih se ne moze, zato vam srdacno preporucujem da ih upoznate citajuci MySQL manual. Sada cete nauciti kako da upotrebom WHERE klauzule selektujete posebne slogove iz tabele. Iz osnovne sintakse SELECT naredbe vidite da je WHERE klauzula upotrebljena za naznacavanje odredjenih uslova: SELECT izrazi_i_polja FROM ime_tabele [WHERE neki_uslov] Recimo da zelite selektovati sve slogove sa prezimenom Petrovic: SELECT * FROM master_name WHERE last_name = 'Petrovic'; Ako koristite stringove ili datume u WHERE klauzuli, morate ih ograditi znacima navoda.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

U ovom primeru ste koristili operator = unutar WHERE klauzule. Postoji mnogo tipova operatora koje mozete koristiti, medju kojima su operatori poredjenja i logicki operatori najpopularniji. Sledi tabela sa vaznijim operatorima i njihovim imenima: Operator = != <= < >= > AND OR Znacenje Jednako Razlicito Manje ili jednako Manje Vece ili jednako Vece Logicko I Logicko ILI

Kada koristite operatore poredjenja pri radu sa stringovima, poredjenje ne razlikuje velicinu slova. Upotrebom operatora poredjenja i logickih operatora, mozete dobiti vrlo selektivne upite koji ce vam cesto biti potrebni radi efikanog resavanja problema sa kojima se budete susretali. Evo jednog SELECT upita koji pronalazi sve slogove u tabeli master_name kojima je ime Petar, a prezime Petrovic: SELECT * FROM master_name WHERE first_name = 'Petar' AND last_name = 'Petrovic'; Ako zelite da pronadjete slogove sa prezimenom Petrovic ili Tesla evo upita koji cete koristiti: SELECT * FROM master_name WHERE last_name = 'Petrovic' OR last_name = 'Tesla'; U koriscenju SELECT naredbe niste ograniceni na selekciju podataka iz samo jedne tabele u jednom upitu, vec mozete istovremeno citati podatke iz vise tabela - taj se proces zove spajanje tabela. Pretpostavimo da imate dve tabele: fruit i color. Upotrebom dve zasebne SELECT naredbe mozete selektovati sve vrste iz svake tabele:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

mysql> select * from fruit; +----+--------------------------+ | id | | 1 2 | fruit_name | apple | banana | | | +----+--------------------------+

+----+--------------------------+ 2 rows in set (0.05 sec) mysql> select * from color; +----+-------------------------+ | id | | 1 2 | color_name | red | yellow | | | +----+--------------------------+

+----+--------------------------+ 2 rows in set (0.11 sec) Kada zelite da selektujete odjednom iz obe tabele, postoji nekoliko razlika u sintaksi SELECT naredbe. Prvo, morate se uveriti da se sve tabele koje koristite u svom upitu pojavljuju u FROM klauzuli. Upotrebom fruit i color primera, ako jednostavno zelite da selektujete sve kolone i vrste iz obe tabele, primenicete sledecu naredbu: mysql> select * from fruit, color; +----+----------------+----+------------------+ | id | fruit_name |id | color_name | +----+----------------+----+------------------+ | | | | 1| 2| 1| 2| apple apple banana | | | 1 | red 1 | red 2 | yellow 2 | yellow | | | | banana |

+----+----------------+----+------------------+ 4 rows in set (0.11 sec) Medjutim, ono sto ce uraditi ovaj upit jeste udruzivanje dveju tabela tako sto ce svakom elementu tabele fruit pridruziti svaki element tabele color. Ovakav upit je u svakom slucaju neupotrebljiv, pa cete zato skoro uvek prilikom selektovanja iz vise tabela koristiti WHERE klauzulu kojom cete udruzivati one podatke iz vise tabela koji vam daju rezultat koji ima smisla.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Recimo da zelite da selektujete sve podatke iz fruit i color tabela koji imaju isti ID: mysql> select fruit_name, color_name from fruit, color where fruit.id=color.id; +----------------+------------------+ | fruit_name | color_name | +----------------+------------------+ | apple | banana | red | yellow | |

+----------------+------------------+ 2 rows in set (0.06 sec)

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.8. Izmena i brisanje podataka (UPDATE, DELETE) Za izmenu tabela i njihovog sadrzaja postoji nekoliko nacina pomocu MySQL-a. Mozete zameniti cele slogove ili mozete samo azurirati pojedina polja. Takodje, mozete imati potrebu za brisanjem pojedinih slogova iz tabela. UPDATE je SQL komanda koja se koristi za izmenu sadrzaja jednog ili vise polja u postojecem slogu. Najosnovnija UPDATE sintaksa izgleda ovako: UPDATE table_name SET ime_polja=nova vrednost, Ime_polja2 = nova vrednost2 [WHERE neki_uslov_je_ispunjen] Linije vodilje za azuriranje sloga su slicne onima koje su upotrebljene prilikom umetanja sloga - podatak koji unosite mora odgovarati tipu podataka polja, a stringove morate ograditi navodnicima. Pretpostavimo da imate tabelu pod nazivom fruit, koja sadrzi ID, naziv voca i status voca (zrelo ili trulo): mysql> select * from fruit; +----+-----------------+--------+ | id | fruit_name | status | +----+-----------------+--------+ | | 1| apple 2| banana | zrelo| | trulo|

+----+-----------------+--------+ 2 rows in set (0.05 sec)

Da biste azurirali status voca u zrelo u svim slogovima tabele, upotrebite sledeci upit: mysql> update fruit set status='zrelo'; Query OK, 1 row affected (0.00 sec) Rows matched: 2 Changed: 1 Warnings: 0

Pogledajte rezultat upita. Bio je uspesan, sto se moze videti iz Query OK poruke. Obratite paznju i da je samo jedan slog promenjen, jer je drugi slog vec imao status=zrelo.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Morate biti veoma pazljivi pri upotrebi UPDATE komande i koristiti WHERE klauzulu ako zaista ne nameravate da promenite vrednost svih slogova u tabeli. Da biste bolje razumeli, recimo da je rec banana pogresno napisano u tabeli i da zelite upotrebom UPDATE komande ispraviti gresku. Sledeci upit ce imati veoma lose rezultate: mysql> update fruit set fruit_name = 'banane'; Query OK, 2 rows affected (0.05 sec) Rows matched: 2 Changed: 2 Warnings: 0

Kada pogledate rezultat ovog upita bicete zaprepasceni, jer se vidi da su dva od dva sloga promenjena, dakle svi slogovi su promenjeni. Sada tabela fruit izgleda ovako: mysql> select * from fruit; +----+-------------+-----------+ | id |fruit_name| status | +----+-------------+-----------+ | | 1| banane 2| banane | zrelo | | zrelo |

+----+-------------+-----------+ 2 rows in set (0.11 sec) Svi slogovi voca su sada banane. Zbog pokusaja da se promeni naziv jednog polja, sva polja su promenjena, jer nije bio naveden uslov! Zamislite sada tabelu u kojoj imate nekoliko miliona slogova sa stotinama vrsta razlicitih proizvoda; zatim zamislite jedan ovakav nepromisljen upit koji menja sve slogove; a onda zamislite da se iz back-up kopije zbog nekog cudesnog razloga ne moze izvuci kopija podataka - moguci scenario je da administrator baze nije brinuo o cuvanju rezervne kopije; sledece sto treba da zamislite je kako vas automatski otpustaju s posla cim su otkrili ko je postavio upit koji je odneo toliko dragocenih podataka u nepovrat. Ako vam je za utehu, verovatno ce i administrator leteti s posla zajedno sa vama. Uslovno azuriranje znaci da koristite WHERE klauzule da biste upit usmerili ka tacno odredjenim slogovima. Upotreba WHERE klauzule u UPDATE naredbi je slicno nacinu na koji se to radi u SELECT upitu. Sva poredjenja i logicki operatori mogu biti upotrebljeni. Pretposatvimo da vasa tabela fruit nije popunjena samo bananama, tj. Neka sadrzi sledece podatke:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

mysql> select * from fruit; +----+----------------+--------------+ | id | fruit_name| status | | | 1| apple 2| pear | zrelo | zrelo | | | | +----+----------------+--------------+

3| orannge | trulo

+----+----------------+--------------+ 3 rows in set (0.05 sec) Mozete videti da rec orannge nije napisana ispravno. Naredba UPDATE kojom cemo ispraviti rec orannge i napisati orange glasi: mysql> update fruit set fruit_name='orange' where fruit_name='orannge'; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0

U ovom slucaju, samo je jedna vrsta promenjena i ako selektujemo sve slogove tabele fruit evo sta dobijamo: mysql> select * from fruit; +----+----------------+--------------+ | id | fruit_name | status | | | 1| apple 2| pear 3| orange | zrelo | zrelo | trulo | | | | +----+----------------+--------------+

+----+----------------+--------------+ 3 rows in set (0.05 sec) Postoji jos nekoliko nacina upotrebe UPDATE komande, ali za sada imate dovoljno znanja za dalje proucavanje ove komande kada se budete susreli sa nekim realnim problemom koji ce od vas zahtevati nesto drugaciji update upit. Pre nego sto savladate jednostavnu DELETE komandu, evo podsetnika - uvek cuvajte rezervnu kopiju svojih podataka. Kada jednom obrisete podatke iz tabele, oni su otisli zauvek. Osnovna sintaksa komande DELETE je: DELETE FROM ime_tabele [WHERE neki_uslov_je_ispunjen][LIMIT broj_slogova]

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Obratite paznju da u naredbi brisanja nema navodjenja kolone - kada koristite DELETE uklanja se ceo slog, pa nema smisla navoditi imena polja. Morate biti vrlo oprezni prilikom upotrebe DELETE naredbe jer stete koje mozete uzrokovati njenom pogresnom primenom mogu biti veoma velike! Pretpostavimo da zelite izbrisati sve slogove u tabeli fruit koji sadrze trulo voce. Evo upita koji ce jednim potezom to uraditi: mysql> delete from fruit where status='trulo'; Query OK, 1 row affected (0.00 sec) Kao sto vidite iz rezultata upita, jedan slog je izbrisan i sada tabela fruit izgleda ovako: mysql> select * from fruit; +----+----------------+--------------+ | id | fruit_name| status | | 1| apple 2| pear | zrelo | zrelo | | | +----+----------------+--------------+

+----+----------------+--------------+ 2 rows in set (0.05 sec) Ako zelite da izbrisete samo jedan slog iz tabele primenite klauzulu LIMIT na sledeci nacin: mysql> delete from fruit -> limit 1; Query OK, 1 row affected (0.06 sec) Ako sada selektujete sve podatke iz fruit tabele videcete da je prvi slog po redu nestao: mysql> select * from fruit; +----+----------------+--------------+ | id | fruit_name | status | 2| pear | zrelo | | +----+----------------+--------------+ +----+----------------+--------------+ 1 row in set (0.05 sec)

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Mozda nekad pozelite da jednostavno obrisete sve slogove iz tabele. Evo komande koja ce to ostvariti: mysql> delete from fruit; Query OK, 0 rows affected (0.00 sec) Nemojte biti zabrinuti sto rezultat upita glasi 0 rows affected (0.00 sec) - ovo je standardan rezultat u MySQL-u kada brisete sve slogove iz tabele. Proverite da li ste zaista obrisali sve slogove iz tabele i uvericete se da je prethodni upit zaista bio uspesan: mysql> select * from fruit; Empty set (0.05 sec)

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3.9. Jos neke korisne naredbe (SHOW, DROP, DESCRIBE, ALTER) Ostaje da se upoznate sa jos nekoliko SQL komandi koje vam mogu biti potrebne u radu sa web aplikacijama. SHOW TABLES komanda izlistava sve tabele koje se nalaze u vasoj bazi. Pretpostavimo da imate bazu koja nosi ime dev_tiid. Ako zelite da pregledate listu tabela baze dev_tiid imate na raspolaganju vrlo jednostavnu naredbu: mysql>show tables; +-------------------------------+ | Tables_in_dev_tiid | account_info | billing_info | cancel_account | codes | codes_info | company_info | contact_info | delete_account | email_accounts | email_info | module_info | new_email_user | send_email | subdomain_date | theme_categories | theme_info | transactions_info | used_modules | | | | | | | | | | | | | | | | | | | +-------------------------------+

+-------------------------------+ 18 rows in set (0.22 sec) A ako zelite da vidite nazive svih baza koje imate na svom MySQL serveru, primenite sledecu komandu:

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

mysql>show databases; +-------------------------------+ | Database | ab_online_support | alefbrain | coregs | dev_tiid | fjbeauty | helpAppDB | hospital | leadgreed | mysql | totalinternetid | | | | | | | | | | | +-------------------------------+

+--------------------------------+ 10 rows in set (0.22 sec) Ako zelite da uklonite celu tabelu ili mozda cak celu bazu podataka, imate na raspolaganju komandu DROP cija je sintaksa vrlo jednostavna: DROP TABLE [IF EXISTS] ime_tabele A za brisanje cele baze: DROP DATABASE [IF EXISTS] ime_baze IF EXISTS klauzula proverava da li navedena tabela ili baza postoji pre brisanja i potrebna vam je u slucaju da niste sigurni da li neka tabela ili baza postoji, jer ako pokusate da izbrisete nepostojecu tabelu ili bazu, MySQL ce generisati poruku greske. DESCRIBE komanda prikazuje informacije o postojecoj tabeli: Nazive polja Tipove polja Da li kolona moze sadrzati null vrednost Da li je kolona kljuc i kojeg je tipa Bilo koju default vrednost Dodatnu informaciju, poput AUTO_INCREMENT

Sintaksa za describe je: DESCRIBE ime_tabele [ime_polja]

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Na primer, da biste prikazali strukturu tabele master_name u vasoj bazi, treba da primenite sledeci upit: mysql> describe master_name; Ako zelite da promenite ime tabeli ili tabelama, RENAME komanda to radi na brz nacin. Sintaksa je sledeca: RENAME TABLE staro_ime TO novo_ime [, staro_ime2 TO novo_ime2, ] Dakle, da biste preimenovali tabelu pod imenom fruit u tabelu sa imenom fruit_products, upit ce biti: RENAME TABLE fruit TO fruit_products; Ako preimenujete vise tabela jednim upitom, akcija se desava sleva nadesno. To znaci da ce naredni upit preimenovati tabelu, pa joj vratiti stari naziv: RENAME TABLE address TO old_address, old_address TO address; Poslednja komanda koju cete upoznati u prici o SQL-u jeste ALTER komanda koja ima vise varijacija od bilo koje SQL komande koje ste do sada videli, jer mozete izvrsiti nekoliko razlicitih tipova akcija njenom upotrebom. Kada izdajete ALTER komandu, MySQL kreira privremenu kopiju originalne tabele. Akcija u ALTER komandi je izvrsena nad kopijom tabele, a zatim je obrisana originalna tabela i privremenoj tabeli je dato ime originalne tabele. Dok se sve to desava, originalna tabela moze jos uvek biti procitana(SELECT), ali bilo kakvi dodaci ili izmene (INSERT ili UPDATE) stopirani su sve dok nova tabela ne bude spemna za akciju. Upamtite da promene pomocu ALTER komande cesto traju manje od sekunde, ali je vazno razumeti proces. Kada budete radili sa tabelama koje imaju vise miliona slogova i sa velikim saobracajem, svaki sekund je bitan i moze znaciti gubljenje dragocenih podataka, ako se tacno ne poznaje nacin rada. Osnovna ALTER sintaksa je: ALTER TABLE ime_tabele alter_specifikacija Alter specifikacije mogu se podeliti u tri grupe: dodavanje, izmena i brisanje elemenata u okviru tabele, poput polja, kljuceva, indeksa i slicno.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Kako ALTER komanda moze imati prilicno komplikovanu strukturu, necemo u okviru ovog osnovnog kursa zalaziti dublje u proucavanje ove SQL komande. Zainteresovanima predlazem da pogledaju MySQL uputstvo za upotrebu, koje sam vec pominjao i tamo ce pronaci detaljnu definiciju primene ALTER komande. Ovim se zavrsava poglavlje o osnovama SQL-a i sada imate sva predznanja neophodna za pocetak ucenja PHP-a. Uskoro cete u svojim prvim web aplikacijama moci da upotrebite nesto od onoga sto ste naucili o HTML-u i SQL-u.

AlefBrainPHPTrening2006.Skripta2

1. PrimerPHPovogkoda,istorijatibuducnost
PrimerPHPovogkoda
PocnimonajjednostavnijimprimeromsajednimredomciljnamjedaprikazemodasuPHP ovestranemesavinatristvari:teksta,HTMLovogkodaiPHPovogskripta.Stranekojesadrze PHPovskriptrazlicitesuodstranakojesadrzesamoHTML,idabibileprepoznatljive,cuvaju sesaoznakomtipa.php(ilinestoslicno)naserveruiizvrsavaihPHPovookruzenjekojeradi naserveru.RezultatizvrsenogskriptaprikazujeseuwebbrowserukaoHTMLkod. Isprobajteprviprimerprograma: 1.Otvoriteteksteditoriunesitesledece:

<HTML> <HEAD> <TITLE>Moj prvi PHP skript!</TITLE> </HEAD> <BODY> Danasnji datum je: <?php echo date("d M Y");?> </BODY> </HTML>
2. Sacuvajteovokaofajlexample1.phpurootdirektorijumuWebservera. 3. ZatimotvoriteWebbrowseriunesiteceluadresuvasegWebServeraiimeupravo napravljenogskripta:http://localhost/example1.php 4. Uwebbrowserupojavicesenestoslicnosledecem:

AlefBrainPHPTrening2006.Skripta2

Kaostosmoreklipreovogprimera,ciljamodaprvoprikazemotrirazlicitatipakodakojise koristinaovojstrani.Dakle,pogledajmokodkojismouneliidodelimosvakuodtrikategorije:

<HTML> <HEAD> <TITLE>Moj prvi PHP skript!</TITLE> </HEAD> <BODY> Danasnji datum je: <?php echo date("d M Y");?> </BODY> </HTML>
Kodsacistompozadinomustvariinijekod,tojeobicantekst.Kodsasvetlom(zutom pozadinom)jesteHTML.Kodsatamnompozadinom(plavom)jePHPskript. PHPskriptjeoznacenuglastimzagradamaiznakovimapitanja.Dakle,svakiputkadavidite deokodakojijeokruzenoznakama<?php?>,znatedasveunutarnjihmoradabudePHP kod.KaostomozetevidetiizrezultatauWebbrowseru,tritipasadrzajasasvimlepozive zajednonaWebstrani. Znam,pitatesesadakakoje<?phpechogmdate(Mdy)?>iznasegskriptapostalo28Feb 2006?OdgovornaovopitanjeuvodivasucudesnisvetPHPa.Dobrodosli! Evostasedogodilo:Kadasteuadresnulinijuwebbrowserauneli http://localhost/example1.phpipritisnuliENTER,poslalistezahtevWebserverudavam prikazestranicuexample1.phpiposlenekolikotrenutakadobilisterezultat.Utihnekoliko trenutakaWebServerjeimaopunerukeposla.Najprejeizoznaketipa(.php)shvatiodasene radioobicnomfajlu,vecoPHPskriptu,stogajepodstaklodaposebnoobratipaznjunanjegov sadrzajipotrazioznakezaPHPkod<?phpi?>,ausputjeprocitaosvestojeizvantih oznakajerWebserverrazumeHTMLiobicantekst.Kadajenaisaona<?php,pozvaojePHP masinuiproslediojojsvestojepronasaodozatvarajucePHPoznake?>,jeronsamne razumePHP.PHPmasinajepreuzeladobijenikod echodate("dMY"); pisannajezikukojionasavrsenorazume,iprevelaserverunjegovoznacenje:Izrazkojisimi daogovoridatrebaodstampatinaekranu28Feb2006.WebserversezahvalioPHPmasini napomociisadajeimaokompletanodgovorzavaskojijeprikazaouwebbrowseru. OstajesamodasedemistifikujenacinnakojijePHPmasinaprevelaizrazechodate("dMY"); uOdstampajnaekranu28Feb2006.Najpre,kakojePHPznaodatrebastampatinestona ekranu?TojesaznaoizreciechokojapredstavljaPHPovufunkcijuzastampanjesvegasto izanjesledidoznaka;ilidozatvarajucePHPoznake.Zatimjepresaonadate("dMY"), pozvaojesvojuugradjenufunkcijudateirekaojoj:Trebamidanasnjidatumsadanomu mesecuuoblikudvecifre(d),triprvaslovaodimenameseca(M)icetvorocifrenomgodinom (Y)inekabuduporedjanitakodaprvobudedan,zatimmesecinakrajugodinaaizmedjunjih ostavipojednuprazninu(dMY).Takojenastaodatum28Feb2006. PostosteupoznaliosnovniprincipfunkcionisanjaPHPanawebu,mozemoseotisnutiu detaljnijeupoznavanjeovebriljantnetehnologije.Pocnimosanekolikoistorijskihpodatakai 2

AlefBrainPHPTrening2006.Skripta2 kratkimpogledomusadasnjostibuducnost.

Istorijatibuducnost
Svejepocelo1995.godine,kadajeRasmusLerdorfzapoceoradnaPHP/FIPersonal HomepageTools/FormInterpreter.Verovatnonijenisanjaodacenjegovradprouzrokovati nastajanjePHPakojidanaskoristemilioniljudi.PrvaverzijaPHP/FIsastojalaseizkolekcije PERLskripticijajeosnovnaulogabilaprikupljanjepodatakaizwebformiinedostajalesujoj nekeosnovneneophodnefunkcije,kaostojenaprimerforpetlja. UnapredjenjedolaziuverzijiPHP/FI2,alijeskorokompletanrazvojidaljeradiojedino Rasmus.PoizlaskunoveverzijeuNovembru1997.godine,AndiGutmansiZeevSuraskiotkrili suPHP/FIdoksutragalizajezikomkojiceimolaksatiizgradnjuecommerceaplikacijeu okvirustudentskogprojektanakojemsuradili.KakojePHP/FIbioOpenSourceprojekat, moglisudaanalizirajunjegovustrukturu.ZakljucilisudaPHP/FInijetolikomocankolikojeto izgledalonaprvipogled,jersumunedostajalemnogeuobicajenefunkcije.Interesantnoje spomenutinakojinacinjePHP/FIradiosawhilepetljom.Posebnoprilagodjenleksickiskener isaojekrozskriptikadabinaisaonakljucnurecwhilepamtiobinjenupoziciju,zatimbi nastaviosaizvrsavanjemkodasvedoknenaidjenaoznakuzazavrsetakwhilepetljeiutom trenutkubisevracaonaupamcenupozicijuiponovoizvrsavaoistikod. ZeeviAndisuodlucilidakompletnopreradeovajskriptujucijezikiutomciljuudruzilisu svojesnagesaRasmusom.TakonastajePHP3HypertextPreprocessor.Novoimenaglasava PHPkaonovproizvodnamenjensirojpublici,abroj3odajepriznanjeprethodnimverzijama. ZeeviAndisudizajniralisasvimnoviAPI(ApplicationProgramInterface)zaprosirenjakojije omoguciojednostavnododavanjefunkcionalnostiPHPukaostosukomunikacijasabazama podataka,spellcheckeriimnogedrugekorisneekstenzije.Tojeprivuklomnogeprogramere kojinisubilideocoretimadaseprikljucePHPprojektu.UvremekadajenastaoPHP3uJunu 1998.,procenjujesedajepostojalooko50,000domenasainstaliranimPHPom.PHP3 oznacavapocetakvelikogprobojaPHPanatrzistu,jertojeprvaverzijakojajedostiglabazu odprekomiliondomenanakojimajeinstalirana. Krajem1998.ZeeviAndisu,posmatrajucisvojradnaPHPu3,osetilikakosusposobnida napravemnogoboljiskriptujucijezikitakosuzapocelijosjedanciklusponovneizgradnje jezikaizkogajerodjenPHP4.DokjePHP3parsirao(tumacio,prevodio)skriptoveutoku izvrsavanja,PHP4doneojesasvimnovuparadigmuprvokompajliraj(prevedi),paonda izvrsavaj.ProceskompajliranjanijeprevodioPHPumasinskikod;umestotogaongaje prevodioubajtkodkojijezatimizvrsavanpomocuZendEnginea(nazivjenastaoodimena Zeev&Andi).ZendEnginesemozesmatratinovimsrcemPHPa.Zbognovognacina izvrsavanjaskripti,PHP4jedobiomnogoboljeperformanseuodnosunaPHP3,uzvrlomale nekompatibilnosti.Poredmnogihpoboljsanja,napomenimosamounapredjenAPIzaprosirenja saboljimperformansamautokuizvrsavanja,WebServerAbstractionLayerkojijeomogucio radPHPunasvimpopularnimWebserverima...PHP4zvanicnojerealizovan22.Maja2002.i dodanasjeinstalirannapreko15milionadomena! NijeproslodugovremenadabisepojavionoviizazovpredtvorcimaPHPa.Svevecaupotreba PHPauslozenimaplikacijama,zahtevalajeunapredjenjejezikauodnosunaObjektno Orijentisanoprogramiranje.AndijedosaonaidejudakompletnozameniObjektnoOrijentisani deoPHPa.ZeeviAndisunapravilidokumentpodimenomZendEngineII:Opstipregled funkcionalnostiiDizajniubrzokrecevreladiskusijaobuducnostiPHPa.Iakojeosnovnijezik ostaoisti,mnogefunkcionalnostisudodate,promenjeneiliodbaceneutokunastajanjasledece verzijePHPakojanosiimePHP5. 3

AlefBrainPHPTrening2006.Skripta2 PHP5jedoneomnogenovineiodnjegaseocekujedaodrzivodecupozicijuPHPa,aliida povecaucescePHPanatrzistusoftvera.OnnesamodadonosirevolucijuuObjektnoj orijentacijiPHPa,vecsadrziimnogenovefunkcionalnostizbogkojihPHPpostaje nezaobilaznaplatformazarazvojwebaplikacija.PotpunonovinacinradasaXMLompostavlja PHPrameuzramesadrugimwebtehnologijamaupojedinimsegmentima,aunekimihcaki prevazilazi.TusuiSOAP(SimpleObjectAccessProtocol),MySQLiimnogedrugeekstenzije kojepredstavljajuveomavazneosnovezapodrskudrugimtehnologijama.PHP5imapred sobomblistavubuducnostizatoneoklevajtedaseupustiteuupoznavanjejezikakojimgovore aplikacijenaGoogleu,Yahoou,Amazonu...

AlefBrainPHPTrening2006.Skripta2

2.Promenljive
VremejedapocnemoupoznavanjerazlicitihdelovaPHPa,kojemorateznatidabistepisali programenaovomjeziku.Mozdajenajosnovnijajedinicauprogramiranjupromenljiva. Promenljivaje,najjednostavnijeobjasnjeno,mestoumemorijiostavljenodacuvainformaciju,i dodeljenjojjeidentifikatorodstraneprogramera.SvePHPpromenljivepocinjuznakomza dolar'$'.Dabistedodelilivrednostpromenljivoj,mozetekoristitiznakjednakostiilioperator dodele'='.DabistenapravilipromenljivuuPHPuidodelilijojvrednostmozetedauradite sledece:

$author = William Shakespeare;


Identifikatorpromenljiveje$authoridodeljenajojjetekstualnavrednoostWilliam Shakespeare.Mozetetakodjeidadodeljujetebrojevepromenljivama:

$number_of_digits_on_one_hand = 5;
Ovdesmozakomplikovaliimepromenljive$number_of_digits_on_one_hand,aliiporedtoga, dodelasenerazlikujemnogoodonogastosmoprethodnouradili.Razlikajeutomedasada brojnavrednostnemaznakenavoda.OvogovoriPHPudatrebadajetretirakaobrojnu vrednost;daljaintervencijaodstraneprogrameranijepotrebnadakazePHPudajevrednost broj. Jednomkadastenapravilipromenljivu,slobodnistedajekoristiteuprogramukakogodzelite. Dabistejeprikazalinaekranukoristecifunkcijuecho(),raditesledece:

echo $author; Ogranicenjauimenimapromenljivih


Postojenekaogranicenjakakomozeteikakonemozetedazovetepromenljive.Umnogim jezicimapostojiogranicenjevelicineimena,obicno255ili1000znakova;PHPmedjutimnema takvoogranicenje.Verovatnoceteprimetitidanijepotrebnodaidetepreko50znakova,idaje 2030sasvimdovoljno. Prvoogranicenjejestedaimenapromenljivihmorajupocetislovomilidonjomcrtom(ne racunajuciznakzadolar,kojiinijestriktnoimepromenljive).Drugoogranicenjejedaime promenljivemoradasesastojiodbrojeva,slovaidonjihcrta.Drugiznakovi,kaostosu+,,*, i&nisudozvoljeniiizazvacegreskunavasojwebstrani.Poredtogamanjevisesteslobodnida dajeteimenapromenljivamakakozeelite.

AlefBrainPHPTrening2006.Skripta2

Osetljivostnamalaivelikaslova
Promenljivenisutakojednostavnekaostoizgledajunaprvipogled.Jedanproblemkojiobicno mucipocetnikeuPHPujesteosetljivostnamalaivelikaslovauimenimapromenljivih. Najjednostavnijinacindasetoobjasnijestemalideokoda:

$author = Jovan Jovanovic Zmaj; $Author = Ivo Andric;


Gornjadvaredapravedveodvojenepromenljive,jednukojasezove$authoridrugu$Author. Ovedvepromenljiveimajudverazlicitevrednostiistvarnosurazliciteistokaodastekoristili sledecikod:

$famous_serbian_poet = Jovan Jovanovic Zmaj; $famous_serbian_writer = Ivo Andric;


VeomacestotouticenaizgledrezultatanaWebstraniakoslucajnostavitevelikoslovotamo gdeganistekoristiliranije.Akostenameravalidakoristitejednupromenljivu,ondatrebada sekoristisledecikod:

$author = Jovan Jovanovic Zmaj; $author = Ivo Andric;


Prviredpostavljavrednostpromenljive$authornaJovanJovanovicZmaj,dokcedrugired potpunopromenitisadrzajpromenljive$authorutekstIvoAndric.Ovimkodombicestvorena samojednapromenljiva.

Tipovipodataka
Usredsredicemosenadvatipapromenljivih,onekojesadrzebrojevnevrednosti,ionekoje sadrzetekstualnevrednosti.Ustvari,postojijosnekolikotipovapromenljivih,poznatijihkao tipovipodataka,kojePHPkoristi,kaostosunizoviiobjekti,alionjimacemokasnijegovoriti. Tipovepodatakanedefiniseprogramer,vecPHPodlucujezavaskadainterpretiraWebstranu, kogtipapodatakapromenljivatrebadabudeidodeljujeihshodnotome.Ovirazlicititipovi podatakakoristeseuPHPudabioznacilirazlicitetipoveinformacijakojemogudasecuvaju,i razliciteoperacijekojemogudaseizvrsenakonoveinformacije.

Podacitipastring
Podacitipastringsadrzetekstualneinformacijeilireci,imogudasadrzecelerecenice.Svesto senalaziizmedjuznakovanavoda,automatskipostajetekst.Sledecadvaprimerasustringovi:

$car_type = Cadillac; $engine_size = 2.6;


Nemavezestojedrugavrednostuprimerubroj,jerjednomkadajeizmedjuznakovanavoda, automatskipostajestring.Akododeliteodredjenuvrednoststringu,ondadabisteizvrsili

AlefBrainPHPTrening2006.Skripta2 matematickeoperacijenadnjim,PHPcemoratidaprimeninekuvrstukonverzijedabiga pretvorioubroj.Rezultatovogajedasabiranjestringovakaodasubrojevimozdadovededo neocekivanihrezultata.Akoipakzelitejedanstringdadodatedrugom,anedaihsaberete, PHPimanacinnakojitomozeteuraditi.

Spajanjestringova
Spajanjestringovajeprocesdodavanjajednogstringadrugom,tj.dodavanjejednogstringana krajdrugog.Koristiteznak.(tacka)kaooperatorspajanja,dabisteizvrsilioperaciju.Ovajred:

$car=$car_type.$engine_size;
bidaorezultatCadillac2.6,akopritompretpostavimodasmokoristilipromenljiveiz prethodnogprimera. Govorecisastanovistaestetike,cinjenicadanemarazmakaizmedjudvastringamozedasene svididizajnerima.Dakle,pravimopromenljivukojasadrzijedanprazanznak:

$space=;
Trebadazapazitedaseovoveomarazlikujeodpraznogstringa.Prazanstringnesadrzibas nista,dokstringsarazmakomsadrziznak,iakonevidljiv.Razmacimogudasedodajukaoi svakidrugitekst:

$car=$car_type.$space.$engine_size;
Ovoceproizvestizeljeni,lepoodvojenitekstCadillac2.6.

Brojevnitipovi
Postojedvarazlicitabrojevnatipapodataka,integeridouble.Integersucelibrojevi,doksu doubleracionalnibrojevi.Evonekihprimeraobatipa:

$an_integer=33; $another_integer=5797; $a_double=4.567; $another_double=23.2;


Dakle,trebalobidazakljiciteizgornjihprimeradajeceobrojautomatskiinteger,dokbilosta sazarezomodmahpostajeracionalantippodataka.

AlefBrainPHPTrening2006.Skripta2

Prostematematickeoperacije
PostojiskupnumerickihoperatorakojemozetedakoristiteuPHPudabisteizvrsavali matematickeoperacije.Svionisuvrlopoznatioperatoriipoznajeihsvakokojeikadauskoli imaomatematiku.Oniizgledajuovako:

Operator + * / %

Operacija Operatorsabiranja Operatormnozenja Operatoroduzimanjaiunarnioperatorzanegativnebrojeve Operatordeljenja Operatormodula(ostatakprideljenju)naprimer8%5=3

Njihovaupotrebapotpunojeidenticnaonojkojuznamoizmatematike,pajeovdenecemo posebnoobjasnjavati.

JosmaloooperatorimakojisekoristeuPHPu
Poredoperatorakojisekoristeuprostimmatematickimizracunavanjimaioperatoraza dodavanjestringova,PHPposedujeiraznedrugeoperatorekojisuneophodniuprogramiranju. Upoznajmosesanajvaznijim. Operatordodele(=)omogucavadodeljivanjevrednostipromenljivama.Evoprimerakakose koristioperatordodele:

$counter=5;
Promenljivoj$counterdodelilismovrednost5.Poredtoga,postojenekevarijacijeupotrebe operatoradodelepricemusemozekobminovatisanekimdrugimoperatorom,kaonaprimer:

$counter+=2;//ovojeidenticnooperaciji$counter=$counter+2;na //vrednostpromenljive$counterdodalismovrednost$counter //ijos2 $offset*=$counter;//ovojeidenticnooperaciji$offset=$offset*$counter;

AlefBrainPHPTrening2006.Skripta2 OperatoriPoredjenjaomogucavajuutvrdjivanjeodnosaizmedjudvevrednosti.Sledecatabela prikazujeoperatoreporedjenja:

Operator == != > < >= <=


Logickioperatori

Operacija Jednakoje Nijejednako Veceod Manjeod Veceilijednakood Manjeilijednakood

Operator &&,and ||,or xor !

Operacija LogickoI LogickoILI LogickoekskluzivnoILI(XOR) Logickanegacija

Operatoriinkrementiranjaidekrementiranja

Operator $var++ $var


Konstante

Operacija Inkrementiranjeuvecavanjepromenljive$varzajedan Dekrementiranjeumanjivanjepromenljive$varzajedan

Dosadasmoupoznalivrednostikojebismomoglidapromenimonanekinacinnakonstosmo ihdodelilipromenljivama.Naprimer,promenljiva$authorkojusmonapraviliranijesa vrednoscuJovanJovanovicZmaj,mozebitipromenjnazatrenokauRadomanKanjevac. Naprimer:

$author = Jovan Jovanovic Zmaj; $author = Radoman Kanjevac;


Astaakonistezelelidasetodesi?Nekevrednostinikadanetrabadasemenjaju,kaona primer:

$freezing_point_centigrade = 0; $serbian_capitol = Beograd;


5

AlefBrainPHPTrening2006.Skripta2 Takodjemozdacetezeletidadefinisetenekevrednostiukodukojeociglednonisufiksne,alisu ipaknepromenljive.Naprimer:

$database_address = localhost;
PHPimaspecijalnufunkcijukojavamomogucavadanapraviteidentifikatorkojiimavrednost kojunikonemozepromeniti.Ovakviidentifikatorisezovukonstante.Nacinnakojiseprave konstantenestojedrugacijiodpostupkakreiranjapromenljivih.Konstantetrazespecijalnu kljucnurecdefinekojaceihkreirati.Ispredkonstantinetrebastavljatiznakzadolar.Evokako sepravikonstanta:

define(FREEZINGPOINTCENTIGRADE, 0);
Imenakonstantisepokonvencijipisuvelikimslovimadabisteihuprogramulakoprepoznali. Dabistenapravilikonstantukojasadrzitekst,samocetestavitivrednostkonstantepodznake navoda:

define(SERBIAN_CAPITOL, Beograd);
Konstantemozetedodeljivativrednostimapromenljivih,ispisivatinaekranuiraditisanjima svestoisapromenljivama,osimstoimnemozetemenjativrednostutokuizvrsavanja programa.Evoprimera:

echo Glavni grad Srbije je: .SERBIAN_CAPITOL;

AlefBrainPHPTrening2006.Skripta2

3. UzimanjepodatakaodklijentaizWebformulara
VerovatnojedandeoHTMLakojiizazivanajvisezbrkeiteskocajesuformulari.Ovojenajvise zbogsledececinjenice:Dabistemoglidamanipulisetepodacimaizformulara,morateda koristitenekudrugutehnologijuzauzimanjepodataka.Ovomozedaideodjednostavnih skriptjezika,kaostojeJavaScript,ilitehnologijekaostosuActiveServerPages,iliaplikacije kaoCGI,ilicelokupnogjezikakaostosuJavaServlets.Dabismopravilnoimplementirali obraduklijentserverkomunikacije,nijedovoljnodasesamouzmuinformacijeodkorisnikai kasnijeseodgovorinanjih.Ispravanklijentserverinterfejstrebadaobradiinformacijeivrati ihkorisnicimadokonicekaju. UovompoglavljuupoznacemosesanacinimakojekoristiPHPdabiobradiozahtevekoji pristizuizwebformi.AkoseprisetiteHTMLaseticetesedapostojedvanacinazaslanje podatakaodklijentakaserveru:GETiPOST.Nacinnakojiseinformacijesaljunaserver kontroliseatributMETHODuFORMtagu.

<FORM ACTION='test.php' METHOD='GET'>


ili

<FORM ACTION='test.php' METHOD='POST'> METHOD='GET'


PocecemosavrednoscuGETatributaMETHOD.OvogovoriWebbrowserudadodavrednosti, kojejekorisnikupisaouformu,naURLadresu.Dabitouradio,browserdodajeznakpitanja nakrajURLadresedabinaznaciogdesezavrsavaURLipocinjuinformacijeizforme. Informacijeizformesetadasaljuuoblikuparovaime=vrednost.Nekestvarijelakseuocitina primerunegoihobjasnjavati:

?animal=cat
Ovdejeanimalimepromenljivekojusaljemo,acatjenjenavrednost.Ovomozebitidodatona URLadresuovako:

http://www.nonexistentserver.com/test.php?animal=cat
WebbroserautomatskidodajeinformacijenaURLadresukadasaljezahtevstraninaweb serveru.DeokojijedodatnaURLadresuzoveseQueryStringilistringsaupitom.

METHOD='POST'
JedannedostatakkojistemozdauociliizQuerystringovajeprilicnojavnaprirodaprenosa. AkonezelitedaseinformacijekojeprenositepojavljujuuURLadresi,ondacetemoratidase oslonitenametodPOST.OnreadiskoroistokaoimetodGET;razlikajeutomestose informacijeizformesaljeuteluHTTPzahtevaanekaodeoURLadrese.Ovoznacida informacijenisudostupnesvakome,zatostonisudodatenaURLadresu.MetodPOSTmoze takodjedaprenesevecukolicinuinformacijapostojiogranicenjeukolicinipodatakakoje

AlefBrainPHPTrening2006.Skripta2 mozeteprenetikaodeoURLa.

DalidakoristimmetodGETiliPOST?
Postojeraznamisljenjaoovompitanju;nekikazudaskoronikadanetrebadakoristitemetod GET,zbognjegovenesigurnostiiogranicenjauvelicini;drugitvrdedapostojeslucajevikada trebakoristitiGET.NepostojecvrstapravilaipreporukajedaGETkoristitesamoondakada znatedacekolicinainformacijakojeseprenosebitiuvekmala,ausvimostalimslucajevima koristitePOSTmetod.Takodje,zabludajedajePOSTmetodsigurnijijersepodacipriprenosu nevidekaokodGETmetoda!POSTmetodjesamomalodiskretnijiuprenosuodGETa,ali podacikojiseprenosePOSTomvrlosulakodostupni.

KakoPHPprihvatapodatkeizFormi?
PostoznamokakoseuHTMLupraveformulariirazliciteopcijezapreuzimanjepodataka,sada cemoseupoznatisanacinomnakojiPHPprihvatapodatkeizFormi.Pogledacemoprimereza svakukontroluizforme.Sviprimeriuovomdeluzahtevacedvewebstrane.Prvastranauzima informacijekojejeuneokorisnik,adrugaprihvatainformacijenawebserveruiodgovara korisniku. Koriscenjetekstpolja: 1. OtvoriteeditortekstaiunesitesledeciHTMLkod:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="text.php"> Who is your favourite author? <INPUT NAME="Author" TYPE="TEXT"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajteovokaofajltext.html 3. Zatvoriteovudatotekuiotvoritenovuueditorutekstaiunesitesledecikod:

<HTML> <HEAD></HEAD> <BODY> Your favorite author is: <?php echo $_GET[Author]; ?> </BODY> </HTML>
2

AlefBrainPHPTrening2006.Skripta2

4. Sacuvajteovokaotext.php 5. Otvoritetext.htmluwebbrowseruiunesiteime:

6. PritisniteSubmitQueryitrebalobidaviditeimeautorakojesteuneliprikazanokaona sledecojslici:

Kakoradi? Prenegostopogledamokod,pogledajteURLadresunaprethodnomekranu(drugastranakoju smonapravili).Nakrajimenatext.phpdodatjeQueryString.Ovojenestostojedodaoweb browserzatostosmomukaometodprenosapodatakanaveliGETufajlutext.html.Hajdeda sadaispitamonasstringsaupitom.Uprimerunaekranujepisalo: text.php?Author=Ivo+Andric VecsmoreklidasuQuerystringovinapravljeniodparovaime=vrednost.NetrebabitiSerlok HolmsdabisezakljucilodajeuovomprimeruAuthorimea'IvoAndric'vrednost.Dakle, browseruzimaimeHTMLkontroleoznacenosaname='Author'zaimepromenljivekoju 3

AlefBrainPHPTrening2006.Skripta2 prosledjuje,avrednostkojusmouneliupoljekaovrednostpromenljive. Ovojesveuvezisaprvimprogramom,hajdedasadapogledamodrugiprogram,text.php.To jeustvarisamojedanredteksta,pracenjednimredomuPHPu:

... Your favorite author is: <?php echo $_GET[Author]; ?> ...
RedPHPkodaprikazujesadrzajpromenljiveAuthorkojajeprosledjenaGETmetodomitose raditakostosenavedeimemetodesaimenompromenljiveuuglastimzagradama: $_GET[Author] OnostosmouradiliuovomprimerujestedasmonapraviliHTMLtekstualnopoljeidalimu imeAuthor.KadasmoposlaliformuGETmetodomnawebserveriPHPserver,onjenapravio asocijativniniz$_GETcijisuelementiparoviime/vrednostpoljasaforme.Dasmokoristili metodPOST,umestoniza$_GET,biobiformiranniz$_POSTivrednostipromenljiveAuthor bipristupiliakonapisemo$_POST[Author]. Kakoradepodrucjazatekst(TEXTAREA): 1. otvoriteprogramzaeditovanjetekstaiunesitesledecikod:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="textarea.php"> What are your favourite web sites? <TEXTAREA NAME="WebSites" COLS="50" ROWS="5"> http:// http:// http:// http:// </TEXTAREA> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajteovokaofajltextarea.html 3. Zatvoriteprethodnifajl,zapocnitesasvimnoviiunesitesledece:

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD></HEAD> <BODY> Your favorite web sites are: <?php echo $_POST[WebSites]; ?> </BODY> </HTML>
4. Sacuvajteovokaotextarea.php 5. Otvoriteuwebbrowserutextarea.htmliunesiteimenanekolikoomiljenihWeblokacija:

6. PritisnitedugmeSubmitQuerykadauneseteimenavasihWeblokacija.Trebalobidavidite nestoslicnosledecem:

AlefBrainPHPTrening2006.Skripta2

Kakoradepoljazapotvrducheckbox? 1. Pokreniteeditortekstaiunesitesledecikod:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="checkbox.php"> Have you ever eaten eggs before? <INPUT NAME="Choice" TYPE="Checkbox"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajtetokaocheckbox.html 3. Otvoritenovifajlueditoruiunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php echo $_POST[Choice]; ?> </BODY> </HTML>


6

AlefBrainPHPTrening2006.Skripta2 4. Sacuvajteovokaocheckbox.php 5. Otvoritecheckbox.htmluwebbrowseru

6.Zavisnoodtogadalistepotvrdili(checkirali)poljeilineprenegostosteposlaliupit, dobicetejedanoddvamogucarezultata.Isprobajteobaslucajaitrebalobidadobijetesledece:

AlefBrainPHPTrening2006.Skripta2 Uovomslucajutrebaobratitipaznjunajednurazlikuodprethodnihprimera.Kaovrednost promenljive$_POST[Choice]pojavljujesenestostonismomidefinisali.Akojepoljeza potvrdupotvrdjeno(checkirano),ondapromenljivasadrzivrednost'on'.Akonijepotvrdjeno, ondanesadrzinista. Visestrukapoljazapotvrdu Stasedesavaakozelitedakoristiteviseodjednogpoljazapotvrdu?Akosuvampoznataradio dugmad,znatedacebiranjejednogradiodugmetaugrupi,automatskipomeritiizborsabilo kogdugmetakojejebiloizabranoranijenatrenutniizbor.Poljazapotvrduneradetako. Njihovaprednostjeutomestosesvakopoljeracunakaoposebnastavka,takodamozete potvrditivisepoljazapotvrduilinemoratepotvrditinijedno.Hajdedaproverimokakoto radi.Vratimosenaprethodniprimeriprepravimogadasadrzinekolikopoljazapotvrdu: 1.Otvoriteeditoriunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="checkboxes.php"> Have you ever eaten eggs (jaja) before? <INPUT NAME="Choice1" TYPE="Checkbox" VALUE="Eggs"> <BR> Have you ever eaten snails (puzeve) before? <INPUT NAME="Choice2" TYPE="Checkbox" VALUE="Snails"> <BR> Have you ever eaten locusts (skakavce) before? <INPUT NAME="Choice3" TYPE="Checkbox" VALUE="Locusts"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajteovokaofajlcheckboxes.html 3. Otvoritenovifajliunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php echo "$_POST[Choice1]<BR>"; echo "$_POST[Choice2]<BR>"; echo "$_POST[Choice3]<BR>"; ?> </BODY> </HTML>
8

AlefBrainPHPTrening2006.Skripta2

4. Sacuvajteovokaodatotekucheckboxes.php 5. Otvoritecheckboxes.htmliodaberitenekolikoopcija:

6. Posaljiteupitividecetesledecirezultat:

Uocitedasmosadadefinisalivrednostizacheckboxoveitesusevrednostistampalezaona poljakojasmopotvrdilianepotvrdjenopoljenemavrednost.

AlefBrainPHPTrening2006.Skripta2 KakoradeRadiodugmad? 1. Otvoriteeditortekstaiunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="radio.php"> What is the capital of Portugal? <BR> <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Porto"> Porto <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Lisbon"> Lisbon <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Madrid"> Madrid <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajtetokaodatotekuradio.html 3. Otvoritenovifajliunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php echo "You selected the answer: $_GET[Question1]"; ?> </BODY> </HTML>
4. Sacuvajteovokaoradio.php 5. Otvoriteradio.htmluwebbrowseruiodaberiteodgovor:

10

AlefBrainPHPTrening2006.Skripta2

6.PritisniteSubmitQueryipogledajterezultatkojistedobili:

Kakoradeokvirisalistomdropdownmeniji? KaostoznateizHTMLa,dropdownmenijimogubitinapravljenitakodasemozeodabrati samojednaopcijaizliste,ilitakodasemozeodabrativiseopcijaulisti.Sledecimprimerom pokricemoobaslucaja. 1. Otvoriteeditoriunesitesledece:

11

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="listbox.php"> What price of car are you looking to buy? <BR> <BR> <SELECT NAME="Price"> <OPTION>Under $5,000</OPTION> <OPTION>$5,000-$10,000</OPTION> <OPTION>$10,000-$25,000</OPTION> <OPTION>Over $25,000</OPTION> </SELECT> <BR> <BR> What size of engine would you consider? <BR> <BR> <SELECT NAME="EngineSize[]" MULTIPLE> <OPTION>1.0L</OPTION> <OPTION>1.4L</OPTION> <OPTION>1.6L</OPTION> <OPTION>2.0L</OPTION> </SELECT> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
2. Sacuvajtetokaolistbox.html 3. Otvoritenovifajliunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php $engine_size = $_GET[EngineSize]; echo "<br><br><br>Price Range: $_GET[Price]"; echo "<BR>Engine Size(s): $engine_size[0]"; echo "$engine_size[1]"; echo "$engine_size[2]"; echo "$engine_size[3]"; ?> </BODY> </HTML>
12

AlefBrainPHPTrening2006.Skripta2 4. Sacuvajteovokaolistbox.php 5. Otvoritelistbox.htmluwebbrowseruiodaberitejednuopcijuizgornjegmenijaijednuili viseizdonjegmenija:

6. PritisnitedugmeSubmitQueryiuzavisnostiodtogastasteodabrali,dobiceterezultatna sledecojstrani:

13

AlefBrainPHPTrening2006.Skripta2 Akopazljivopogledatedvamenijakojesmonapraviliuprethodnomprimeru,videcetedase razlikujupoimenuiatributuMULTIPLEkojigovoridaseudrugommenijumozeodabrativise odjednevrednosti. Uimenudrugogmenijaimamouglastezagrade[]kojeoznacavajudasevrednostiodabraneu menijusmestajuunizitakoprenosePHPu.Mismotajnizdodelilipromenljivojpodimenom $engine_sizekojajeautomatskipostalanizkojisadrzisveselektovaneopcijeizliste. Pojedinacnimelementimanizapristupamopomocuindeksa.Prvielementnizauvekimaindex nula,asledecijezajedanveciitakodokrajaniza.Unasemkonkretnomslucaju,odabranesu dveopcijeulistiiniz$engine_sizesadrzidvaelementa:$engine_size[0]=1.0Li $engine_size[1]=1.4L.Dasmoodabralisvecetirivrednosti,niz$engine_sizebisadrzaocetiri elementa.Isprobajterazneopcijeibrzoceteshvatitikakoovofunkcionise. Kakoradeskrivenapolja? Kadakoristiteskrivenapolja,onaseneprikazujunastranikorisnika,alisenjihovevrednosti prenosenaserveristokaoisvadrugapoljaizformulara.Usledecemprimeruprikazacemo dropdownlistuizkojecemoodabratijednuopciju,askrivenimpoljimaprenecemosveopcije dabismoizPHPaodstampalisvemoguceopcijeiodabranuopciju. 1. Otvoriteeditortekstaiunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php $Message1="Bugs Bunny"; $Message2="Homer Simpson"; $Message3="Ren & Stimpy"; echo "<FORM METHOD=GET ACTION='hidden2.php'>"; echo "Which of the following would win in a shootout?"; echo "<SELECT NAME='ListBox'>"; echo "<OPTION>$Message1</OPTION>"; echo "<OPTION>$Message2</OPTION>"; echo "<OPTION>$Message3</OPTION>"; echo "</SELECT><BR><BR>"; echo "<INPUT TYPE=HIDDEN NAME=Hidden1 VALUE='$Message1'>"; echo "<INPUT TYPE=HIDDEN NAME=Hidden2 VALUE='$Message2'>"; echo "<INPUT TYPE=HIDDEN NAME=Hidden3 VALUE='$Message3'>"; echo "<INPUT TYPE=SUBMIT>"; echo "</FORM>"; ?> </BODY> </HTML>
2. Sacuvajteovokaohidden.php 14

AlefBrainPHPTrening2006.Skripta2 3. Otvoritenovifajliunesitesledece:

<HTML> <HEAD></HEAD> <BODY> <?php echo "The three options were:<BR>"; echo "$_GET[Hidden1]<BR>"; echo "$_GET[Hidden2]<BR>"; echo "$_GET[Hidden3]<BR>"; echo "<BR>You selected:<BR>"; echo "$_GET[ListBox]"; ?> </BODY> </HTML>
4. Sacuvajtetokaodatotekuhidden2.php 5. Otvoritehidden.phpuwebbrowseruiodaberitejednuopcijuizliste:

6. PritisnitedugmeSubmitQuerydabistevidelirezultate:

15

AlefBrainPHPTrening2006.Skripta2 KoriscenjevrednostikojesuvraceneizformularauPHPskriptovima: Napravicemoformularzatrazenjezajmakojipitazasumunovcakojuosobazelidapozajmi, izracunavakolicinunovcakojuzamisljenabankapodimenomNAMLLUmozedaponudiosobi zavisnoodnjenihgodinaiplate.Dajemoimjednostavnedaineodgovorenakrajuproracuna. Sadacemoprocikrozkriterijumzaprihvatanjezajma.Iakonasaformulazaproracunza prihvatanjezajmamozdaizgledaslozena,ustvarijeprilicnojednostavna,inijezasnovanani najednojformulinekekompanije. Velicinazajmazaosobuunasemprogramuracunasekoristecitripodatka,premaredosledu kojimsunavedeni:
Prvipodatakjegodisnjaplatapodeljenasa5dabisedobilapromenljivapozajmljivanja Drugipodatakjeklijentovbrojgodinapodeljensa10,paoduzimamoostatakprideljenju Zatim,oduzmemojedanoddrugogpodatkadabismodobilikonacnidrugipodatak,stoje Formulauzimaprvipodatakimnozigadrugimpodatkomdabisedobiotreciikonacni

podeljensa10iumanjujemozajedan. nasapromenljivagodina.

podatak,stojepromenljivadavanjazajma.

Proracungodinaudrugompodatkuznacidajesvakoispod20godinaautomatskiiskljucen, zatostoceformulauvekvratitinuluilimanjeodnule.Dabismoproslikrozdrugideoformule, daprikazemosledece: PrviPodatak*((19/10(19%10)/10)1)=PrviPodatak*((1.90.9)1) =PrviPodatak*0=0 PrviPodatak*((9/10(9%10)/10)1)=PrviPodatak*((0.90.9)1) =PrviPodatak*(1)=PrviPodatak Jednomkadapomnozimoprvipodataksadrugim,dobijamoukupnusumuiakojeonavisaod onogastoosobazelidapozajmi,mikazemoDA,udrugomslucajukazemoNE. Daponovimo,uovomprimerutrebacenamsamodvestrane.Prvauzimadetaljeozajmuiz kojihcemodobitiimeosobe,prezime,godine,adresu,platuikolicinunovcakojuzelida pozajmi.Drugastrana,nasaPHPstrana,uradiceizracunavanjeidonetipresudu. 1. Otvoriteeditortekstaiunesitesledece:

16

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD></HEAD> <BODY> <B>Namllu Credit Bank Loan Application Form</B> <FORM METHOD=POST ACTION="loan.php"> First Name: <INPUT NAME="FirstName" TYPE="Text"><BR> Last Name: <INPUT NAME="LastName" TYPE="Text"><BR> Age: <INPUT NAME="Age" TYPE="Text"SIZE="3"><BR> Address: <TEXTAREA NAME="Address" ROWS=4 COLS=40> </TEXTAREA> <BR> <BR> What is your current salary? <SELECT NAME="Salary"> <OPTION VALUE=0>Under $10000</OPTION> <OPTION VALUE=10000>$10,000 to $25,000</OPTION> <OPTION VALUE=25000>$25,000 to $50,000</OPTION> <OPTION VALUE=50000>Over $50,000</OPTION> </SELECT> <BR> <BR> How much do you want to borrow?<BR><BR> <INPUT NAME="Loan" TYPE="Radio" VALUE=1000>Our $1,000 package at 8.0% interest <BR> <INPUT NAME="Loan" TYPE="Radio" VALUE=5000>Our $5,000 package at 11.5% interest <BR> <INPUT NAME="Loan" TYPE="Radio" VALUE=10000>Our $10,000 package at 15.0% interest <BR> <BR> <INPUT TYPE=SUBMIT VALUE="Click here to Submit application"> <INPUT TYPE=RESET VALUE="Reset application form"> </FORM> </BODY> </HTML>
2. Sacuvajtetokaoloan.html 3. Otvoritenovifajliunesitesledece:

17

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD></HEAD> <BODY> <B>Namllu Credit Bank Loan Application Form</B> <BR> <BR> <?php $SalaryAllowance = $_POST[Salary]/5; $AgeAllowance = ($_POST[Age]/10 - ($_POST[Age]%10)/ 10)-1; $LoanAllowance = $SalaryAllowance * $AgeAllowance; echo "Loan wanted:$_POST[Loan]<BR>"; echo "Loan amount we will allow:$LoanAllowance<BR><BR>"; if ($_POST[Loan] <= $LoanAllowance) echo "Yes, $_POST[FirstName] $_POST[LastName], we are delighted to accept your application"; if ($_POST[Loan] > $LoanAllowance) echo "Sorry, $_POST[FirstName] $_POST[LastName], we cannot accept your application at this time"; ?> </BODY> </HTML>
4. Sacuvajteovokaoloan.php 5. Otvoriteloan.htmluwebbrowseruiunesitenekedetalje:

18

AlefBrainPHPTrening2006.Skripta2

6. PritisnitedugmeClickheretoSubmitapplicationitrebalobidaviditenestopoputekrana nasledecojslici:

19

AlefBrainPHPTrening2006.Skripta2

20

AlefBrainPHPTrening2006.Skripta2

4.Uslovnenaredbeilinaredbegrananja
NaredbaIF Vecsmopomenulinaredbuifuprethodnompoglavlju,asadacemopokazatikakoonazaista radi.Apstraktnogovoreci,naredbaiffunkcionisenasledecinacin: if(uslovjetacan)izvrsiredkoda Naredbaifceizvrsitikodsamoakojeuslovtacan.Akouslovnijeispunjen,ondakodkojidolazi poslenjeganecebitiizvrsen,aPHPceprecinasledeculinijukoda.Pogledajmoprimeriz svakodnevnogzivota: if(padakisa)uzmikisobran izadjinapolje Drugalinijakodaizadjinapolje,seizvrsavabezobziranauslov,aliuzimamokisobransamo akopadakisa. Akozelitedaizvrsiteceoblokkodauzavisnostiodnekoguslova,ondatajkodokruzite viticastimzagradama{}: if(uslovjetacan){ izvrsisvestosenalaziunutarovihzagradama } Dakle,daprosirimoprimersakisobranom,reklibismo: if(padakisa){ uzmikisobran obucikabanicu } izadjinapolje Iovogaputanaredbaizadjinapoljeseobaveznoizvrsava,auzimamokisobranioblacimo kabanicusamoakopadakisa. Hajdesadadapogledamokakomozetedanapraviteusloveuzagradamadabisteodlucilidali cesenekideokodaizvrsitiiline. Logickevrednosti Prenegostokrenemodalje,neophodnojedauvedemokonceptlogickevrednosti.Dosadasu nasepromenljivemogledasadrzebrojeveilitekst,alilogickevrednostisecuvajuu promenljivamatrecegtipa,kojemogudasadrzejednuoddvevrednosti:tacno(true)ili netacno(false).Mozetedefinisatibilokojupromenljivunanekuodovedvevrednosti: $variable=true; Medjutim,akoprikazetenjenuvrednostnaekranu,videcetebrojnuvrednost: 1 1

AlefBrainPHPTrening2006.Skripta2 Aliakodefinisetepromenljivukaonetacnu: $variable=false; akopokusatedajeodstampatenaekranuvidecetedasenistaneceodstampati.Dakle,kratko recenofalsejenista. Akonezelitedakoristitekljucnerecitrueilifalseusmislutacnoilinetacno,mozeteih zamenitibrojevima1ili0,pricemu1oznacavatacno(true),a0oznacavanetacno(false). Umestotrue.mozetetakodjekoristitibilokojibrojrazlicitodnule. Primenimonaucenonaprimerusakisom:

<HTML> <HEAD></HEAD> <BODY> <B>U zavisnosti od toga da li pada kisa, kada krenem na posao radim sledece:</B> <BR> <BR> <?php $pada_kisa = true; if ($pada_kisa) { echo "Uzimam kisobran<br>"; echo "Oblacim kabanicu<br>"; } echo "Izlazim napolje<br>"; ?> </BODY> </HTML>
Sacuvajteovokaokisa.phpipokrenitegauvasemwebbrowseru.Dobicetesledece:

AlefBrainPHPTrening2006.Skripta2 Postojeuslov$pada_kisanapocetkudobiovrednosttrue,kodunutarifblokajeizvrsen.Istobi sedogodilodaste,umestovrednostitrue,promenljivoj$pada_kisadodelilinekuodsledecih vrednosti: $pada_kisa=1;ili $pada_kisa=18;ili $padakisa=1923; BitnojeuocitidasevrednosttrueibilokojibrojrazlicitodnuleuPHPusmatrajutacnim iskazom.Uobicajenojedasekaotacno(true)koristetrueili1,alinecetepogresitiakokoristite bilokojibrojrazlicitodnule. Akovrednostpromenljive$pada_kisapostavitenafalseilina0,deokodaunutarviticastih zagradaseneceizvrsiti,pacevasPHPskriptispisatisledecenaekranu:

RanijesmonavelitabelulogickihoperatoraioperatoraporedjenjakojisekoristeuPHPu,a sadacemoihponovonavestijersesadasrecemosakonkretnimsituacijamaukojimaseti operatorikoriste. OperatoriPoredjenjaomogucavajuutvrdjivanjeodnosaizmedjudvevrednosti.Sledecatabela prikazujeoperatoreporedjenja:

Operator == != > < >= <=

Operacija Jednakoje Nijejednako Veceod Manjeod Veceilijednakood Manjeilijednakood

AlefBrainPHPTrening2006.Skripta2 Logickioperatoripruzajumogucnostizvodjenjalogickihoperacija

Operator &&,and ||,or xor !

Operacija LogickoI LogickoILI LogickoekskluzivnoILI(XOR) Logickanegacija

SadacemoprikazatiprimerkojiobuhvataprimenunavedenihoperatorauPHPu:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="operators_example.php"> Enter number: <INPUT NAME="number" TYPE="Text"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
Sacuvajteovajprimerkaooperators_example.html,azatimnapravitesledeciphpskript:

AlefBrainPHPTrening2006.Skripta2

<?php $number = $_POST[number]; //operator ">" if ($number > 0) { echo "Uneli ste pozitivan broj!<br>"; } //operator ">=" if ($number >= 0) { echo "Uneli ste broj koji je veci od nule ili jednak nuli!<br>"; } //operator "<" if ($number < 0) { echo "Uneli ste negativan broj!<br>"; } //operator "<=" if ($number <= 0) { echo "Uneli ste broj koji je manji od nule ili jednak nuli!<br>"; } //operator "==" if ($number == 0) { echo "Uneli ste NULU!<br>"; } //operator "!=" if ($number != 77) { echo "Uneli ste broj koji je sigurno razlicit od 77!<br>"; } //operator "AND" if ($number != 77 AND $number != 33) { echo "Uneli ste broj koji sigurno nije ni 77 ni 33!<br>"; } //operator "OR" if ($number == 77 OR $number == 33) { echo "Uneli ste 77 ili 33!<br>"; } //operator "!" if (!($number == 77)) { echo "Uneli ste broj koji sigurno nije 77!<br>"; } ?>

AlefBrainPHPTrening2006.Skripta2 Sacuvajtegakaooperators_example.php.Pokreniteoperators_example.htmluwebbrowserui eksperimentisiteunosenjemrazlicitihvrednostiiposmatranjemrezultata.Predlazemda unositesledecevrednostiidasvakiputuocitestajeodstampanonaekranuiotkrijetezastoje bastoodstampano:10,0,10,33,77. Ovajprimerjepokazaoosnovnenacineupotrebelogickihioperatoraporedjenja,aostajesamo dasenaglasidaseovioperatorimedjusobnomogukobminovatinanajrazlicitijenacine. Eksperimentisiteivideceteneogranicenemogucnostistvaranjauslovazaizvrsavanjepojedinih delovakodauvasimprogramima. VisestrukiuslovinaredbeELSEiELSEIF Naucilismokakosekoristinaredbaifzaizvrsavanjeodredjenogkodaakojenekiuslovtacan.a stasedesavaakozelimodanamsejedandeokodaizvrsiakojeuslovtacanadrugideokoda akouslovnijetacan?Uvekmozetedaokreneteuslovinapravitenovunaredbuif,alipostojii mnogolaksinacindasetouradi.NaredbaELSEradiovako: if(uslovjezadovoljen){ izvrsisadrzajovihzagrada }else{ izvrsisadrzajovihzagradama } Vratimoseopetprimerusakisom: if(padakisa){ uzimamkisobran oblacimkabanicu obuvamcipelezakisu }else{ obuvamcipelezasuvovreme } izlazimnapolje Dakle,akopadakisa,ulazimoublokkodakojinamgovoridauzmemokisobran,obucemo kabanicuiobujemocipelezakisu,preskacemodeokodakojijeuokviruelseblokaiizlazimo napolje.Akokisanepadaondaneulazimouifblokkodavecuelse,tamoobuvamocipeleza suvovremeiizlazimonapolje. Hajdedakrenemokorakdalje,stasedesavaakozelitedaproveriteviserazlicitihuslovai izvrsitetacnojedanodnjih.Tomozeteizvestipomocuviseifuslovakojiidujedanzadrugim, alimnogojeefikasnijeakoutusvrhukoristiteugradjenuPHPovukonstrukcijuELSEIFkoja radinasledecinacin: if(uslovjedanjezadovoljen){ izvrsisadrzajovihzagrada }elseif(uslovdvajezadovoljen){ izvrsisadrzajovihzagrada }elseif(uslovtrijezadovoljen){ izvrsisadrzajovihzagrada }else{ izvrsisadrzajovihzagradama } 6

AlefBrainPHPTrening2006.Skripta2 IzvrsicesedeokodakojiideizaprvogtacnoguslovanakojiPHPnaidje,asviostalicebiti ignorisani.Akonijedanuslovnijeispunjen,biceizvrsenblokkojidolaziposlekljucnerecielse. Primenimoovodabismoprosiriliprimersakisomnarazlicitevremenskeuslove:

<HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="weather.php"> Select weather condition: <select name="weather"> <option value="rain"> Rain <option value="snow"> Snow <option value="sunny"> Sunny <option value="hmmm"> Kisa, grmljavina, sneg, susnezica, grad </select> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
Sacuvajteovokaoweather.htmliotvoritesledecifajlodkogacetenapravitisledeciPHPskript:

<?php $weather = $_POST[weather]; if ($weather == 'rain') { echo "Uzimam kisobran<br>"; echo "Oblacim kabanicu<br>"; echo "Obuvam cipele za kisu<br>"; } elseif ($weather == 'snow') { echo "Stavljam kapu na glavu<br>"; echo "Oblacim zimsku jaknu<br>"; echo "Obuvam zimske cizme<br>"; } elseif ($weather == 'sunny') { echo "Stavljam kremu za zastitu od UV zracenja faktor 30<br>"; echo "Stavljam naocare za sunce sa UV zastitom<br>"; } else { echo "Bas me briga za vreme!<br>"; } echo "Izlazim napolje<br>"; ?>
7

AlefBrainPHPTrening2006.Skripta2 Sacuvajteovajfajlkaoweather.php.Otvoriteweather.htmluwebbrowseru,odaberiteneku opcijuipogledajtestacevamprogrampreporucitiuvezioblacenja.Ponoviteeksperimentvise puta,birajterazlicitevremenskeusloveianalizirajtestajeispisanonaekranuizastoseto dogodilo. UgnjezdavanjenaredbiIF Processtavljanjanaredbeifunutardrugeifnaredbezoveseugnjezdavanje.NaredbeIF mozeteneogranicenbrojputaugnjezditiicestosuovakvekonstrukcijeneophodnedabise nekiprogramskizahtevizadovoljili.Uopsteno,ugnjezdavanjeizgledaovako: if(uslovjeispunjen){ if(drugiuslovjeispunjen){ izvrsikodunutarovihzagrada } } Hajdedasadauradimoprimerkojikoristisvemogucnostikojesmoobjasniliuovompoglavlju, dabismonapraviliformularzarezervacijuputovanjazanekolikodestinacija.Onceizracunati cenuuzavisnostiodvrstehotelaidestinacije.Postojacetridestinacije:Prag,BarselonaiBecod kojihsvakaimarazlicitecene.Postojaceidvevrstehotelausvakomgradu,satriicetiri zvezdice,stimdajehotelsacetirizvezdiceskuplji. Otvoriteeditortekstaiunesitesledecikod:

<HTML> <HEAD></HEAD> <BODY> <B>Namllu Holiday Booking Form</B> <FORM METHOD=GET ACTION="holiday.php"> Where do you want to go on holiday? <BR> <BR> <INPUT NAME="Destination" TYPE="Radio" VALUE="Prague"> Prague <BR> <INPUT NAME="Destination" TYPE="Radio" VALUE="Barcelona"> Barcelona <BR> <INPUT NAME="Destination" TYPE="Radio" VALUE="Vienna"> Vienna <BR> <BR> What grade of hotel do you want to stay at?

AlefBrainPHPTrening2006.Skripta2

<BR> <BR> <INPUT NAME="Grade" TYPE="Radio" VALUE="Three"> Three Star <BR> <INPUT NAME="Grade" TYPE="Radio" VALUE="Four"> Four Star <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>
Sacuvajteovokaoholiday.html.Zatimotovritenovifajliunesitesledecikod:

<HTML> <HEAD></HEAD> <BODY> <B>Namllu Holiday Booking Form</B> <BR> <BR> <?php $Price=500; $StarModifier=1; $CityModifier=1; if ($_GET[Grade]=="Three") { if ($_GET[Destination]=="Barcelona") { $CityModifier=2; $Price = $Price * $CityModifier; echo "The cost for a week in $_GET [Destination] is $Price"; } elseif ($_GET[Destination]=="Vienna") { $CityModifier=3.5; $Price = $Price * $CityModifier; echo "The cost for a week in $_GET [Destination] is $Price"; } elseif ($_GET[Destination]=="Prague") { $Price = $Price * $CityModifier;

AlefBrainPHPTrening2006.Skripta2

echo "The cost for a week in $_GET [Destination] is $Price"; } else { echo ("You've not entered a value for destination, go back and do it again"); } } elseif ($_GET[Grade]=="Four") { $StarModifier=2; if ($_GET[Destination]=="Barcelona") { $CityModifier=2.5; $Price = $Price * $CityModifier * $StarModifier; echo "The cost for a week in $_GET [Destination] is $Price"; } elseif ($_GET[Destination]=="Vienna") { $CityModifier=4; $Price = $Price * $CityModifier * $StarModifier; echo "The cost for a week in $_GET [Destination] is $Price"; } elseif ($_GET[Destination]=="Prague") { $Price = $Price * $CityModifier * $StarModifier; echo "The cost for a week in $_GET [Destination] is $Price"; } else { echo ("You've not entered a value for destination, go back and do it again"); } } else { echo ("You've not entered a value for hotel grade, go back and do it again"); }
10

AlefBrainPHPTrening2006.Skripta2

?> </BODY> </HTML>


Sacuvajteovokaoholiday.php,otvoriteholiday.htmlubrowseruinapravitenekiizbor:

PritisnitedugmeSubmitQuerydabistevidelicenu:

11

AlefBrainPHPTrening2006.Skripta2

5.Proveraispravnostisadrzajaformulara
Ujednomodprethodnihpoglavljaimalismoprimeraplikacijezadavanjezajma.Akosemalo poigratesanjomlakocetezakljucitidajujemogucepokvaritiiliprevaritiunosenjem besmislenihpodataka.Naprimer,uokvirukojijepitaozagodine,stasedesavaakounesete statebriga?Savrsenojemogucedasetodogodi.KakocePHPprogramdaseizborisaovim? Mozdazelitedapretpostavitedavasikorisniciimajuzdravrazumdaneunosenestopoput toga,alikadagodstaviteprogramujavnuupotrebu,biceteiznenadjeniraznolikoscumogucih odgovora,odkomicnih999dogramatickineispravnihceteres'cetri.Vibistelakoshvatili stajekorisnikzeleodakaze,alivasemPHPprogramutakvestvarisubesmislene. Nacinnakojiovomozetedasavladatejestedaogranicitevrednostikojesudozvoljeneu odredjenomokviruzatekst.Unasemprimeru,akosugodinenekeosobepreneteu promenljivu$Age,pasmomogliunetiproveruopsegagodinakojeseunose: if($Age<10OR$Age>140) { echo"IncorrectAgeenteredPressbackbuttontotryagain"; break; } naredbabreakceprekinutiizvrsavanjeprograma.Usvrhuprekidaizvrsavanjaprogramamogli stedaupotrebiteikljucnurecexitnasledecinacin: if($Age<10OR$Age>140) { echo"IncorrectAgeenteredPressbackbuttontotryagain"; exit; } Akoproveravamoformulariznamodanekonijeuneokorektnuvrednostzanekopolje,nema potrebedaproveravamodalje,vecprimenimonaredbuexitilibreakzaprekidprograma. Ovojejedanodnacinazazastituodpogresnogunosa,alitakonismopokrilisvemogucnostiza izbegavanjelosegunosapodataka. ZlonamernikorisnicifunkcijaHTMLSpecialChars Akojenekikorisnikzlonameran,atakvihnazalostuvekima,oncepokusatidauneserazne specijalnekarakterepomocukojihmozenapravitimanjeilivisesteteakonasPHPprogramnije spremandatakvestvarispreci.Jednaodmogucnostijedakorisnikpokusasaunosomhtml tagovailispecijalnihkodova.Dabismoovosprecili,PHPnampruzasjajnufunkciju HTMLSpecialChars()kojakonvertujesveHTMLoznakeuobicnitekstkojizelimoda prikazemo,idoktoradi,sprecavaHTMLoznakedabuduinterpretiraneuWEBbrowserukao HTMLkod.Takodjezaustavljasveskriptovekojisuuneseniuokvirzatekstdabuduizvrseni. Ovafunkcijaseprimenjujenasledecinacin: $string=<b>Thiswon'tdisplaytheBoldtags</b>; $string=HTMLSpecialChars($string); echo$string; IsprobajteovajkodividecetekakoradiHTMLSpecialCharsfunkcija. 1

AlefBrainPHPTrening2006.Skripta2

6.Petljewhile,dowhile,for
Dosadasmoseupoznalisaosnovnimkonceptomprogramiranjaodlucivanjem.Umestoda idemokroznaskodsekvencijalno,otkrilismodamozemoizbeciizvrsavanjeredakoda,ilicak celihblokovakoda.Uovompoglavljuupoznacemonestostoracunarinajvisevoledaradeiu stvarionozastasuiizmisljeniizvrsavanjezadatakakojiseponavljaju.Akomorateda izvrsavateistizadatak,svakidan,svakisat,ponovoiponovo,preilikasnijecetedapogresite. Akodateslicanzadatakracunaruiongadobrouradiprviput,ondacegadobrouraditiistoti put,hiljaditiputilicakmilionitiput.Koncentracija,zamor,interesovanjezazdatakzaracunar supotpunonepoznateodrednice. Mehanizamkojimnogiprogramskijezici,ukljucujuciiPHP,koristezaizvrsavanjeponavljanja jesupetlje.PostojetritipapetljiuPHPuinjihcemoupoznatiuovompoglavlju.Svakitippetlji koristimourazlicitimsituacijama. Petljeimajuslicnostisagrananjemzatostoizvrsavanjedelakodazavisiodtogadalijeuslov tacanilinetacan.Medjutim,petljeserazlikujuoduslovnihizrazazatostosadrzajpetljemoze daseizvrsavamnogoputa.Uslovsetestiraikodupetljiseizvrsavaakojeuslovtacan.Zatim seuslovponovoispituje;akojeidaljetacan,kodupetljiseponovoizvrsava,imozdaponovo,i takoumnogoiteracija.Shvatiliste.Svakiprolazakkrozpetljuzoveseiteracija. PetljeWHILE Pocecemosapetljomwhilezatostojenajjednostavnijaodsvetripetljeiimanekeslicnostisa naredbomif.Kaoinaredbaifonaproveravarezultatuslova.Uzavisnostiodtogadalijeuslov tacaniline,deokoda(kojijesmestenizmedjuviticastihzagrada)nakonuslovnogizrazase izvrsava: while(uslovjetacan){ izvrsisadrzajovihzagrada } Nakonstosesadrzajpetljeizvrsi,uslovnavrhuseponovotestiraisveseponavlja:akojeuslov ispunjen,kodseizvrsava.Akoseispostavidajeuslovnetacan,koduzagradamacese zanemaritiiPHPcenastavitisaprvimredomposlekrajazagrada.Hajdedavidimoprimeru pseudokodu: while(mesecjepun){ kojoticezavijati } Dakle,akomesecnijepun,ondakojotinecezavijati,alizasvovremedokjemesecpun,onice zavijati. HajdedavidimojedanprimerkojiprikazujekakoPHPradisawhilepetljama.Napravicemo programkojisabiraprvih100prirodnihbrojeva:

AlefBrainPHPTrening2006.Skripta2

<?php $summary = 0; $number = 1; $how_many = 100; //Calculate sum of first $how_many natural numbers while ($number <= $how_many) { $summary = $summary + $number; $number ++; } echo "Sum of first $how_many natural numbers is: $summary"; ?>

Sacuvajteovajskriptkaowhile.phpipokrenitegauwebbrowseru.Evostacetedobiti:

Kaostomozetevideti,presvakeiteracijesmoproveravalidalije$number<=$how_manyda bividelidalismouzbiruvrstilisvebrojeveod1do100,aunutarsvakeiteracije,posle dodavanjatekucegbrojanaukupanzbir,povecavalismotekucibrojzajedan.Kadasmosabrali svih100brojeva,petljaseviseneizvrsava. Zamislitekakojeovorevolucionarnastvar!Pretpostavitedavamjenekodaozadatakda izracunateprvih10000000000prirodnihbrojeva,adanijeizmisljenobrazaczazbirprvihn clanovaaritmetickognizaidanepostojeracunarinidigitroni.Kakavbitosamoposaobio!A svestobitrebalidauraditekadaimatePHPnasvomracunaru,jestedauprethodnomprimeru promenljivoj$how_manydatevrednost1000000000.Isprobajteividecetekolikosupetlje vazneuprogramiranju. PetljeDOWHILE Petljadowhilejeslicnapetljiwhile,osimjednestvari:uslovseproveravanakrajupetlje,ane napocetku.Ovojesuptilna,alivaznarazlikasadrzajzagradabiceizvrsennajmanjejednom, cakikadajeuslovnetacan:

AlefBrainPHPTrening2006.Skripta2 do{ izvrsisadrzajovihzagrada }while(uslovjetacan);vratiseiuraditoponovo Zbogtogasepetljadowhilekoristiondakadazelitedaprodjetekrozpetljubarjednombez obziranatacnostuslova.Ovojevazno. PetljeFOR Petljaforsenajboljekoristikadazelitedaponavljatedelovekodaodredjenbrojputa.Drugim recima,dajevammogucnostdanavedetekolikoputazelitedaprodjetekrozpetlju.Deosa uslovomjemalokompleksnijinegokodpetljewhile,postosesastojiiztridela: for(definisibrojacpetlje;testirajbrojacpetlje;dodajilioduzmiodbrojaca;){ izvrsisadrzajovihzagrada } Petljaforuvodikonceptbrojaccapetlje.Ovapromenljivasekoristidabiseizbrojalokolikose putaproslokrozpetlju(brojiteracija),idabisepetljazavrsilakadajedefinisanibrojiteracija dostignut.Trecideouslovaobezbedjujepromenuvrednostibrojacausvakojiteraciji.Tridela uslovaomogucavajuvamdanapravitekompleksneusloveipetlje. Hajdedavidimokakobismosabraliprvihstoprirodnihbrojevapomocuforpetlje:

<?php $summary = 0; $how_many = 100; //Calculate sum of first $how_many natural numbers for ($number = 1; $number <= $how_many; $number++) { $summary = $summary + $number; } echo "Sum of first $how_many natural numbers is: $summary"; ?>
Sacuvajteovokaofor.phpipokreniteubrowserupacetedobitisledecirezultat:

AlefBrainPHPTrening2006.Skripta2

7. Nizovi
Nakratkosmosusretalinizoveidosada,alisadajetrenutakdaihiformalnoupoznamo. Mozetenapravitinizoveistokaostopravitepromenljive,svedokstavljateuglastezagradeoko njihdabisteuveliindekselementa: $states_of_europe[0]=France; $states_of_europe[1]=Germany; $states_of_europe[2]=Switzerland; Nemoratedaihdodeljujeteporedu: $states_of_europe[55]=Spain; $states_of_europe[18]=Italy; Ustvari,umestobrojevnihindeksamozetedaupotpunostikoristitestringove.Takvinizovi zovuseasocijativni: $state_capitals[france]=Paris; $state_capitals[switzerland]=Bern; Akozelitedapristupitesadrzajuasocijativnogniza,mozetedaizostaviteznakenavodau indeksu.DabisteprikazaliParisnaekranumozeteuradititisledece: echo$state_capitals[france]; ili echo$state_capitals[france]; Napomenimodaelementimanizovamozetedodeljivatibrojevneilitekstualnevrednosti. Inicijalizacijanizova Definisanjepocetnihvrednostipromenljivihunizujesteproceskojisezoveinicijalizacija.Kod inicijalizacijenizovauPHPunemoramobrinutiokoindeksiranja,vecmozemoprepustitida PHPtouradizanas: $Author[]=IvoAndric; $Author[]=MomoKapor; BezuglastihzagradaPHPnebiznaodaseradionizuizameniobiprvuvrednostdrugom. Uglastezagradenaglasavajudanavedenevrednostizelimodasmestimouniz.Akonestavimo indekse,PHPsamostalnoodlucujegdeceunizustavitinasevrednosti.Otkricetedaakoniz Authornijekoriscenranije,ondacegornjevrednostibitismesteneu$Author[0]i$Author[1]. PHPcenastavitidodeljivanjevrednostiusledecielementunizu. Takodje,postojiiinicijalizacijakodkojeeksplicitnomozemosamidodeljivativrednosti indeksa: $Author[0]=IvoAndric; $Author[1]=MomoKapor;

AlefBrainPHPTrening2006.Skripta2 Ovdenemoramodasepovinujemoogranicenjimaautomatskogdodeljivanjaindeksakojebi namPHPnametnuomozemodadodelimovrednostiindeksabezredosleda.PHPjerazlicitod mnogihprogramskihjezikakadasunizoviupitanjupodvestvari.Prvo,nemoramoda definisemotippodatakaunizu.OvojekonzistentnosapravilimazapromenljiveuPHPu:ne moratedaodredjujetetip,PHPtoradizavas.Drugo,nemoratedadefinisetekolikoelemenata cenizimati. Postojejosdvanacinainicijalizacijenizovaiobakoristenaredbuarray().Akozelimoda napravimonizsaautorima,evokakobitouradilikoristeciarray(): $Author=array(IvoAndric,MomoKapor); JosjednomtrazimodaPHPautomatskidefinisevrednostiindeksa.Takodjevazidaindeksi pocinjuodnuleinovevrednostisesmestajuuniztakostoimsedodelinajmanjislobodan indeks. Akozelitedainicijalizujeteasocijativninizpomocufunkcijearray(),toraditenasledecinacin: $state_capitals=array(france=>Paris, switzerland=>Bern, italy=>Rome); Iteracijekrozniz Jednomkadastenapraviliniz,nezelitedasevracateiuzimatesvakiclanpojedinacno,vec cetepreimatipotrebudananekinacinprolazitekrozsveelementenizainestoraditesa njima.Ovdenascenustupasaradnjanizovaipetlji.Pretpostavimodaimamosledeciniz: $states_of_europe=array(France,England,Germany,Switzerland,Spain,Serbia, Italy,SanMarino,Greece,Hungary,Austria,Poland,Russia,Belgium,Finland, Sweden); Akozelimodaispisemoimenasvihovihdrzavanawebstrani,trebasamodanapravimopetlju fordatouradizanas.Akoznamodanizima16elemenata,evoprimerakojiispisujesve elementenaekranu:

<?php $states_of_europe = array ("France", "England", "Germany", "Switzerland", "Spain", "Serbia", "Italy", "San Marino", "Greece", "Hungary", "Austria", "Poland", "Russia", "Belgium", "Finland", "Sweden"); for ($i=0; $i<16; $i++) { echo "<br>$states_of_europe[$i]"; } ?>

Sacuvajteovajprimerpodimenomiteration.phpipozovitegauwebbrowseru,pacetedobiti sledece: 2

AlefBrainPHPTrening2006.Skripta2

Naslicannacin,iteracijekroznizmozemovrsitikoristecipetljewhileilidowhile,atomozetei samiisprobati. Petljeforeach PostojitakodjeiprosirenjepetljeforuPHPu.Tojeposlednjitippetljikojicemopogledati petljaforeah.Koristitepetljuforeachkadaimatenizsanepoznatimbrojemelemenata.Petlja foreachceicidokrajaniza.Onaimadvaoblika.Prvijeovakav: foreach($array_nameas$value){ izvrsisadrzajovihzagrada } Ovoznacidacemozasvakiclannizaprocipojednomkrozpetljuiusvakomprolazu promenljivoj$valuebicedodeljenavrednosttekucegelementaniza,amisatomvrednosu mozemodaradimostanamjevolja. Evoprimerakojipokazujekakosekoristiforeachpetljazaprolazkrozniz:

AlefBrainPHPTrening2006.Skripta2

<?php $states_of_europe = array ("France", "England", "Germany", "Switzerland", "Spain", "Serbia", "Italy", "San Marino", "Greece", "Hungary", "Austria", "Poland", "Russia", "Belgium", "Finland", "Sweden"); foreach($states_of_europe As $value) { echo "<BR>$value"; } ?>

Sacuvajteovokaoforeach.phpipokrenitegauwebbrowserudabistedobilisledece:

Postojijosjedannacinupotrebeforeachpetljezaprolazakkrozsveelementenizaionje pogodnijizaupotrebukodasocijativnihnizova:

AlefBrainPHPTrening2006.Skripta2 foreach($array_nameas$index=>$value){ izvrsisadrzajovihzagrada } Ovojeistokaoprviobliksadodatkomkojinampruzapristupiindeksimaivrednostimaniza. Pogledajmoprimer:

<?php $states_of_europe = array ("France", "England", "Germany", "Switzerland", "Spain", "Serbia", "Italy", "San Marino", "Greece", "Hungary", "Austria", "Poland", "Russia", "Belgium", "Finland", "Sweden", "Romania", "Bulgaria", "Luxemburg", "Andora", "Netherland", "Slovakia"); foreach($states_of_europe As $index => $value) { echo "<BR>Index $index contains $value"; } ?>
Sacuvajtegakaoforeach2.phpipokreniteuwebbrowserupacetedobitisledece:

AlefBrainPHPTrening2006.Skripta2 Ovojebiloosnovnoupoznavanjesanizovimakojecetejakocestokoristitiusvojim programima.NapomenimodaPHPimajakomnogougradjenihfunkcijazaradsanizovimai predlazemvamdapogledatePHPmanualkakobisteseboljeupoznalisanjima.Recimosamo dapomocutihfunkcijamozetesortiratinizovenarazlicitenacine,pretrazivatiihupotraziza nekomvrednoscuimnogedrugekorisnestvari.

AlefBrainPHPTrening2006.Skripta2

8.Funkcije
Dabistedefinisalifunkcijumoratejojdatiime.Utusvrhukoristimokljucnurecfunction, pracenuimenomfunkcije.Akofunkcijaprihvataodredjeneparametre,onisestavljajuu zagradeizaimenafunkcije.Kodkojicinitelofunkcijesmestaseuviticastezagradenakon parametara.Apstraktnogovorecitoizgledaovako: functionime_funkcije(parametar1,parametar2,parametar3...) { ovdeidekodfunkcije... returnneka_vrednost; } HajdesadadavidimoprimerfunkcijezaizracunavanjeporezauPHPu:

<?php function tax ($price) { $tax = ($price/100) * 18; return $tax; } $price = 1000; $tax = tax($price); echo "For price $price tax is $tax"; ?>
Sacuvajteovokaotax.phpikadagapozoveteuwebbrowseruevostacetedobiti:

Funkcijamozedaimakolikogodzeliteredova,adabistevratilinekuvrednostizfunkcije koristitekljucnurecreturnnakrajufunkcijepracenuvrednoscukojuvracate.Mozesedogoditi davasafunkcijanemastadavratiuprogramkojijepozivaitadamozetestavitikljucnurec returnnakrajufunkcijebezikakvevrednostiizanje,dabisteoznacilikrajfunkcije.Akovasa funkcijaprihvataviseparametara,onisuodvojenizarezima.

AlefBrainPHPTrening2006.Skripta2 Prenosenjevrednostifunkcijama Prikazalismokakofunkcijekoristeparametrezapreuzimanjepojedinihulaznihvrednosti,a sadacemoupoznatinakojenacinesetiargumentimoguprenositi.Postojedvanacinaza prenosenjeparametara:povrednostiipoadresi.Kodprenosenjapovrednosti,mifunkciji prenosimosamovrednostodredjenepromenljiveisvestosesanjomdesavaunutarfunkcije, ostatkuprogramanijevidljivonitidostupno.Kodprenosenjaargumenatapoadresi,mifunkciji predajemoadresupromenljivekojuonamozekoristitidabipristupilatojpromenljivojiuradila nestosanjenomvrednoscu.Postouovomslucajufunkcijapristupafizickojadresipromenljivei tuvrsipromene,tepromenesuvidljiveuprogramuizvanfunkcije. Tojeosnovnarazlikauprenosenjupoadresiipovrednostikojujebitnozapamtiti.Pogledajmo kakoseprakticnovrsetaprenosenjanakonkretnomprimeru.

<?php function tax ($salary) { $salary = $salary - (($salary/100)*20); return $salary; } $salary = 2500; echo (tax($salary)); //ovo ce prikazati 2000 echo "<br>"; echo $salary; //ovo ce prikazati 2500 ?>
Sacuvajteovajprimerpodimenomvalue.phpikadagaizvrsiteevostaceseprikazatiuweb browseru:

AlefBrainPHPTrening2006.Skripta2

<?php function tax (&$salary) { $salary = $salary - (($salary/100)*20); return $salary; } $salary = 2500; echo (tax($salary)); //ovo ce prikazati 2000 echo "<br>"; echo $salary; //ovo ce prikazati 2000 ?>
Sacuvajteovokaoaddress.phpipokreniteuwebbrowseru:

AlefBrainPHPTrening2006.Skripta2

9. OpsegPromenljivih
Uovompoglavljuupoznajemonovikonceptkojisezovezivotnivekpromenljive.Zivotnivek promenljivejeperiododtrenutkakadajepromenljivanapravljenadotrenutkakadaprestaje dapostoji.Promenljivamozedatrajekolikoiprogramkojijeizvrsava,alimozedatrajei manjeonolikokolikotrajefunkcijaunutarkojejekreirana. Globalneilokalnepromenljive Promenljivenapravljenevanfunkcijepostojezavremetrajanjaprogramakojempripadaju. Promenljivenapravljeneunutarfunkcijetrajusamoonolikokolikotrajeizvrsavanjetefunkcije. Ovajkonceptsezoveopseg.Zapromenljiveunutarfunkcijekazesedaimajulokalniopseg,a promenljiveizvanfunkcijaimajuglobalniopseg. Hajdedavidimoprimerovogauakciji.Sledecidelickodaprikazujeporukuilinafrancuskom ilinaengleskomjeziku:

<?php $welcome_message = Hello World; //Globalna pr. function translate_greeting ($welcome_message) { //lokalna promenljiva $welcome_message = Bonjour Tout Le Monde; return $welcome_message; } translate_greeting(); echo $welcome_message; ?>
Prvopojavljivanjepromenljive$welcome_messagedefinisenjenuvrednostnaHelloWorld. Ovojeglobalnapromenljivaudatomprogramu.Unutarfunkcijedefinisemopromenljivu $welcome_messagenaBonjourToutLeMondeitojelokalnapromenljivapostojedefinisana unutarfunkcije.AkobistepokrenuliovajkodvidelibistedacesenaekranuispisatiHello World.Tojezbogtogastojepromenljiva$welcome_messageunutarfunkcijepotpunodruga promelnjivauodnosuna$welcome_messagenapocetkuprograma. Akopromenimoimepromenljiveunutarfunkcijena$french_messageipokusamodaje odstampamoizvanfunkcije,onanecebitividljivazbogsvoglokalnogkaraktera:

AlefBrainPHPTrening2006.Skripta2

<?php $welcome_message = Hello World; //Globalna pr. function translate_greeting ($french_message) { //lokalna promenljiva $french_message = Bonjour Tout Le Monde; return $french _message; } translate_greeting(); echo $welcome_message; echo $french_message; ?>
Promenljiva$french_messagenecebitiodstampanajersenjenzivotnivekzavrsavazajednosa funkcijomukojojjedefinisana. Akozelimodaprikazemovrednostpromenljive$welcome_messageunutarfunkcije,nistase neceprikazati,zatostopromenljiva$welcome_messagenepostojiunutarfunkcije:

<?php $welcome_message = Hello World; //Globalna pr. function translate_greeting ($french_message) { echo $welcome_message; //lokalna promenljiva $french_message = Bonjour Tout Le Monde; return $french _message; } translate_greeting(); echo $welcome_message; echo $french_message; ?>
Ovojesasvimlogicansleddesavanjakojisprecavadadodjedomesanjapromenljivihkojezive unutarfunkcijasapromenljivamakojeziveizvanfunkcija.Akoipakzelimounutarneke funkcijedapristupimopromenljivojkojasenalaziizvannje,tomozemoucinitiupotrebom kljucnereciglobalnasledecinacin:

AlefBrainPHPTrening2006.Skripta2

<?php $welcome_message = Hello World; //Globalna pr. function translate_greeting ($french_message) { global $welcome_message; echo $welcome_message; //lokalna promenljiva $french_message = Bonjour Tout Le Monde; return $french _message; } translate_greeting(); echo $welcome_message; echo $french_message; ?>
Igrajtesemalosadefinisanjempromenljivihunutariizvanfunkcijainjihovimpozivanjemna raznimmestima,uzupotrebukljucnereciglobalibrzocetezapamtitipravila. Vaznojenapomenutidasukonstanteglobalnovidljiveusvimfunkcijamainadnjimanije potrebnoupotrebitikljucnurecglobal.Sledeciprimertoilustruje:

<?php $greeting = "Hello World"; define("IME_BAZE", "localhost"); function tax ($salary) { echo "<br>"; global $greeting; echo IME_BAZE; $salary = $salary - (($salary/100)*20); return $salary; } $salary = 2500; echo (tax($salary)); echo IME_BAZE; ?>

AlefBrainPHPTrening2006.Skripta2

10.UkljuceneDatoteke
Ukljucenedatotekesumogucnostkojajezajednickamnogimserverskimjezicimai tehnologijama.Ukljucenadatotekaradiupravoonostonjenoimeikaze:ukljucujejednu datoteku(fajl)unekudrugudatoteku.Ovomozetekoristitidabisteukljucivalitekst,HTML kodiliPHPskript.Ukljucivanjesevrsipomocunaredbeinclude: include(ime_datoteke); Pretpostavimodaimamosledecefajlove: first_file.php

<?php echo "Prvi fajl ukljucen!<br><br>"; ?>


second_file.php

<?php echo "Drugi fajl ukljucen!<br><br>"; ?>


third_file.txt

Treci fajl ukljucen!!!


PogledajmokakoPHPmozeukljucitisvatriprethodnafajlaunutarjednogiprimetitedaceoni bitiizvrsenikaojedinstvenprogram:

include.php

<?php include("first_file.php"); echo "Sada ja stampam<br>"; include("second_file.php"); include("third_file.txt"); ?>


Akouwebbrowserupozoveteprograminclude.php,evostaceseispisatinaekranu:

AlefBrainPHPTrening2006.Skripta2

Kaostomozetedavidite,kadaPHPnaidjenakomanduincludeutokuizvrsavanja,onodlaziu ukljucenifajl,izvrsavanjegovsadrzajakojetoPHPfajl,iliprepisujesadrzajfajlaakoseradio tekstualnomilihtmlfajluizatimsevracaupolaznifajlinastavljaizvrsavanje.Kadakoristite include,imajtenaumudapolaznifajlisviukljucenifajloviformirajujedanjedinstveni program.Svepromenljiveizukljucenogphpfajlaodtrenutkaukljucivanjasuvidljiveufajlu kojivrsiukljucivanje,aukljucenifajlvidisvepromenljivekojesudotogtrenutkadefinisaneu fajlukojivrsiukljucivanje. Predlazemvamdasezadrzitenaincludefunkcijiitestiraterazneopcije,jerjeovoveoma vazankonceptkojisekoristiupisanjuPHPprograma.

AlefBrainPHPTrening2006.Skripta2

11.Obradaiizbegavanjegresaka
Imamnogorazlogazbogkojihjedobraobradagresakajakobitna.Dapodjemoodprvogi najvaznijeg,atojesigurnost.Zapamtiteakosteprogramer,sigurnostvasegsistemamozebiti veomapovezanasasigurnoscuvasegposla,takodajeovodvostrukovazno. Tipovigresaka Postojinekolikotipovagresakakojesemogupojaviti,anekeodnjihuopstenecegenerisati nikakvuporukugreskekodPHPa.Trazenjegresakajemnogolakseakoznategdedagledate. Imamnogotipova(ipodtipova)gresaka,aliuPHPuihmozeteklasifikovatiujedanodsledeca dvatipasintaksnegreskeilogickegreske.

Sintaksnegreske
Sintaksnegreskese,uopstenogovoreci,lakseuocavajupostooneizazivajuporukugreskeu PHPu.Racunarisuveomapreciznemasine,iaplikacijekojeradenanjimasuistotako izbrirljive.Viijamozemodaizmesamoreciurecenici,padaidaljeocekujemodanasneko razume.Naprimer,jamogudakazemDobroJutroujedansatposlepodne,ivibisteidalje znalistajamislim.Medjutim,vasiprogramiceprijavitigreskuizanajmanjipropustpriunosu: echoHelloWorld; Ovobiizazvalogreskuuparsiranju,jerPHPnijeuspeodashvatikakostezelelidanapisete echoumestoeco.Josjedanklasicannacinzapravljenjegresakauparsiranjujeizostavljanje znakatackazareznakrajuizraza: echoHello echoWorld; PHPcevamjavitidastenapraviligreskuudrugomredu,alitojeidaljekorisnodavamukaze dajeproblemunezavrsavanjuprethodnogizrazatackomizarezom. Josjednacestagreskajedaneuspemodanapravimouspesnustrukturupetlje.Naprimer, mozemozaboravitidazatvorimozagradunakonstrukturepetlje:

<?php for ($loop = 0; $loop < 5; $loop++) { echo Hello world ?>
Ovdesejavljagreskajernismozatvoriliviticastuzagradu. Petstvarikojemogudaizazovusintaksnugresku 1. 2. 3. 4. 5. Greskeuunosu Konstrukcijanijedobrozatvorena Nedostajeznaktackaizareznakrajuizraza Unospogresnogimenafunkcije Neispravnozatvaranjestringa:echoHelloWorld; 1

AlefBrainPHPTrening2006.Skripta2

Logickegreske
Ovojedrugitipgreskeinjihjetezeuociti.Kadapokreneteprogram,nemagresakau parsiranjuilisintaksi.Proverilistekodijednomidrugiput,ocistiligreskeuunosuiocigledne greskeukodu.Ipak,kadapokreneteprogram,onpocnedavracapodatkekojinikakonemogu bititacni,iliuopstenevracapodatke.Ponekadsedesavadaprogramkodvasradidobro,ali kadagadatekorisnikuonodjednomprestanedaradi.Sveovojenajcesceprouzrokovano greskamaulogiciprograma. Postojiidaljarazlikaizmedjutipovalogickihgresaka.Nekelogickegreskesedesavajuuvreme izvrsavanjaprogramasamopodnekimodredjenimuslovima.Naprimer,PHPovkodmoze izgledatidobro,icakcegaPHPserverprihvatitiiizvrsiti,alicesegreskepojavitikada pokreneteprogram,stocezaustavitiprogramutokuizvrsavanjaovosugreskeutoku izvrsavanjaprograma.Greskeuvremeizvrsavanjakojezaustavljajuprogrami onemogucavajudaseonzavrsinazivajusefatalnimgreskama.Sintaksnegreskesutakodje fatalne,aligreskeuvremeizvrsavanjaprogramanisuuvekfatalne,vecsemogujavitisamo pododredjenimuslovima. Drugitiplogickihgresakaneprekidaizvrsavanjeprograma,negosanjimaprogramiradedo kraja,alivracajupogresnevrednosti.Ovosu,akozeliteboljiprikaz,neocekivaneizlazne greske.Pocecemoprvosagreskamauvremeizvrsavanja.

Greskeuvremeizvrsavanja
DvanajcescatipagresakauvremeizvrsavanjasuGreskedeljenjanulomiBeskonacnepetlje. Greskedeljenjanulom Prvo,kratakpodsetnikracunarinemogudadelesanulom.Ustvari,nikonemozenije mogucepredstavitirezultat.Deljenjesanulomobicnojeslucajnagreskavipravitedeljenje promenljivomkojaimavrednostrazlicituodnule,alisenekadanepredvidjenodogodidajeta promenljivapraznailijednakanuliiondadolazidogreskedeljenjanulom.Racunarceprijaviti greskukadgodseovajproblempojavi. Medjutim,problemnijeuvekocigledan.Zamisliteformularukomepitatekorisnikadaunese brojstavkizakupovinu.Takodjezelitedanjemuilinjojdatepopustizaracunateporez. Korisnikslucajnozaboravidauneseovajpodatak,programpomnozibrojstavkisacnomi dobijenulu.Rezultatondamozedasekoristikaoosnovazadeljenjeudaljemproracunui mozemozavrsitisagreskomdeljenjanulom.Medjutim,akokorisnikunesebrojrazlicitodnule, kodceispravnoraditi. Zatouvekusvomkodupredviditeproveravanjeunosakorisnika,iizbegnitedeljenjekadaje vrednostpromenljivekojomtrebadelitijednaknuliilikadajetapromenljivaprazna. Beskonacnepetlje Jedanodglavnihproblemaukoriscenjuwhileidowhilepetljijetajdaakoseuslovkojiste definisalizaizlazakizpetljenikadanedostigne,PHPcenastavitidaizvrsavapetlju potencijalnobeskonacanbrojputa,naravno,uokvirupodesenogmaksimalnogvremenaza izvrsavanjeprogramamax_execution_time.Akosemax_execution_timeprekoraci,ondace PHPprikazatigresku.Pogledajtesledeciprimer,alinemojtepokusavatiovodapokrenete:

AlefBrainPHPTrening2006.Skripta2

<?php $counter = 1; $test_variable = true; while ($test_variable) { $counter ++; } ?>


Ovdedefinisemodvepromenljive,alijeproblemtajdasepromenljiva$test_variablenikadane menjaupetlji,tj.zauvekostajetrue,pacesepetljabeskonacnomnogoputaizvrsavati. Nemojteovopokusavatidaisprobate,zatostoceovonaWindowsuzagusitisveresursedok PHPbudepokusavaodaidekrozpetljjuimozedovestidoblokiranjaracunara. Kadabibeskonacnepetljebilelakouocljivenebisteimaliproblema;medjutim,onesucesto mnogoneprimetnije,posebnoimajuciuviducinjenicudamogudasedesesamopod odredjenimokolnostima.Zatomoratestrogovoditiracunaotomedanenapravitebeskonacne petlje,jertomozeizazvatinesaglediveposledicepovasprogram.

Neocekivaneizlaznegreske
Postojemnogirazlozizastoprogrammozedanevratiocekivaniizlaz.Probacemodauopstimo nekolikonajcescihslucajevakadaseovajproblemjavlja,alisvesnismodanemozemo obuhvatitisveslucajeve. Greskeuprogramskimpretpostavkama Kladiobihsedasejedanodnajcescihtipovalogickihgresakadesavakadaprogramerinaprave greskeupretpostavkamauinterpretacijikodaiisprogramirajugreskuuskriptu.Jedanskoriji primerjedajesondazaMarsamerickogsvemirskogprogramaizgubljenazbogtakvegreske. OnajenavodnounistenauatmosferiMarsazatostojejedandeokodazanavigacijupisan koristecimetrickejedinice(metar),adrugiimperijalne(stopa). Poentajeutomedajeovakvegreskecestonemoguceotkritiprenegosetakvasituacijadogodi. Trebapazljivorazmislitistaprogramtrebadaradiiproveritiosnovneprincipeprenego pocnetepisanjekoda. Funkcijekojenevracajuvrednost Akonapisetefunkcijukojaispravnoradisvojposao,alizaboravitedastavitenaredbureturn, kadajebudetekoristilishvaticetedanistanevraca.Tojeisvrhakljucnerecireturnimorate bitiveomaobazrividanezaboravitenanju. Argumentiupogresnomredosledu Akofunkcijipredateargumenteupogresnomredosledu,onaceseizvrsitiivraticevrednost,ali neispravnosracunatuzboggreskeuunosupodataka.

AlefBrainPHPTrening2006.Skripta2 Zamenaoperatoradodeleijednakosti KadasepravistrukturaIF,veomajevaznodasevodiracunadaseumestoznakajednakosti ==nestavioperatordodele=.Dabisteizbeglinenamernopravljenjeovakvegreske primenitesledecitrik.Umestodaifnapiseteovako: if($variable==10){ ... } Vipisiteovako: if(10==$variable){ ... } iakosadanapravitegreskuiumesto==napisete=: if(10=$variable){ ... } PHPcevamdatiporukudajedoslodogreskejerbrojunijemogucedodelitivrednost. Medjutim,dastegreskunapravilinasledecinacin: if($variable=10){ ... } PHPnebinistajavio,vecbipromenljivoj$variabledodeliovrednost10inasttaviosa izvrsavanjem,stosvakakonijeonostostezelelinaovommestudapostignete.

Dobreprakseupisanjukoda
Dakle,uocilistegresku,stacetesadadaraditepovodomnje?Prvisavetkojicemovamdatije veomaocigledan.Nemojtedapisetekodsagreskama!Ovomozdaizgledalaksenegostojeste, aliakosedrzitedobrihobicaja,kojesuprogrameriodRimskogdobadodanaskoristili,onda mozeteuvelikojmerismanjitisansezapojavljivanjegresakauvasimprogramima. Ovetehnikesu,bezizuzetka,jednostavnezarazumevanje,laganezaizvrsavanjeidosta programeraihnekoristi!Zastone?mozetesepitati.Pa,zatostojeprosecanprogramer zauzetaosoba,kojanevolinistastogadekoncentriseodprogramiranja.Glavneprimedbesu obicnodasuovetehnikevremenskizahtevneidazahtevajuodredjenistepenplaniranja unaprediorganizaciju,anegarantujudacekodbitibezgresaka.Programerimozdanece izlozitisvojeprimedbeovimrecima,alisvesesvodinato.Zapamtite,nistanemozeda garantujedakodneceimatigresaka,ikaostodoktorikazu,boljejesprecitinegoleciti. Koristitestandardzapisanjekoda Uvlacitekodiakotonijeneophodnozapravilnofunkcionisanjeprograma.Timemozetesebii drugimaolaksatizivotkadajepotrebnocitatikodkojijepravilnouvucen.Poredtoga,dobroje odlucitisezanekistandardzapisanjekodaizatimgasestriktnopridrzavati.Preporucujem vamstandardzapisanjePHPprogramakojimozetenacinasledecojadresi: 4

AlefBrainPHPTrening2006.Skripta2 http://pear.php.net/manual/en/standards.php Komentarisitekod Ovojevrlojednostavno.Nemozetedaocekujetedabilokodrugi(caknivisaminakon nekolikonedelja)mozedarazumekodakoganistedobrokomentarisali.Komentarjezapis kojidajeprogramerdabipomogaoiobjasniostakojideokodaradi.Netrebadasluzisamo programerukojigajenapisao;kodcemozdadaseodrzavadugonakonstojeprogramer napustiokompaniju,ilivisenijeuprilicidapomogne. UPHPukomentaremozetepisatinavisenacina.Zajednolinijskekomentarekoristitedvekose crte: //JednolinijskikomentaruPHPu azaviselinijskikomentarpotrebnojekoristitiznake/*zapocetakkomentarai*/zakraj komentara: /*Viselinijskikomenatrpocinje drugalinijakomentara trecalinijakomentara zavrsetakviselinijskogkomentara*/ KadaPHPnaidjenaznakzakomentarignorisacesvestoseunutarnjihnalazizavielinijske komentareisvestojenapisanodokrajalinijezajednolinijskikomentar. Koristitefunkcije Kadaimateistikodkojisejavljanavisemestauvasimprogramima,tojeznakdagatreba smestitiufunkcijuiondasamonaraznimmestimapozivatetufunkciju.Takoizbegavate pisanjeistogkodanavisemesta,asamimtimmogucnostpojavljivanjaistegreskenavise mesta.Ovakavpristupmnogopojednostavljujeorganizacijukodaipronalazenjegresaka, posebnoakoseradinavecimprojektima. Koristiteukljucivanjedatoteka(include()) Upotrebaukljucenihdatotekajesamojedankorakviseodfunkcija,postovamomogucavada jednafunkcijabudedostupnauviserazlicitihprograma. Imenujtepromenljiveuskladusanjihovimulogamauprogramu Iskustvonamgovoridajeboljepromenljivamadavatiimenakojaopisujupodatkekoje promenljivasadrzi.Uovomenetrebapreterivatiikoristitiviseoddveilitrireciuimenu promenljive. Pokusavajtedapokvariteprogram Kadatestiratekod,unositeuprogramraznevrednosti(velikebrojeve,slovaumestobrojevai slicno)dabistevidelikakoseprogramponasa.Mozdanisteocekivalidaprogrambude zloupotrebljennatajnacin,alikadajeurealnomsvetu,ovosustvarnevrednostikojemogu dociuprogram.Akoseprogrampokvaripodovakvimokolnostima,ondaceteimatimnogo zbunjenihinezadovoljnihkorisnika.

AlefBrainPHPTrening2006.Skripta2 Ustvari,laksejepretpostavitidaceseprogramnacinaovakvimiskusenjimaizatim programiratitakodabisespreciokvarkadasetodogovdi.Zamislitestabisvekorisnikmogao dadauradidabipokvarioprogramilimudozvoliodaprihvatipogresneinformacijeilida uopsteneprihvatiinformacije.Naprimergodinetrebadaimajurealnevrednosti,adresetreba dasadrzepostanskibroj,dokadresaelektronskepostetrebadasadrziznak@.Kodbitrebalo sveovodaproverava. Testiranjevasegkodavrednostimakojeocekujetedaceihkorisnikunetiapsolutnoje neophodno.Takodjejeneophodnotestiranjesavrednostimakojesuneispravneilinagranici ispravnosti.Kadasubrojeviupitanju,testirajtesavelikim,malim,pozitivnim,negativnim brojevimaislicno. Prilikomtestiranja,truditesedarazmisljatekaovasikorisnici.Pokusajtedasestaviteu situacijucovekakojisenerazumepunouracunareikojikoristivasprogram.Odstepena uspesnostipreuzimanjaulogevaseihkorisnikapritestiranju,zavisiiuspehupisanjudobrog programa.Vezbajteivremenomcetepostajatisveboljiibolji.

AlefBrainPHPTrening2006.Skripta2

12.Prenosenjepodatakaodstranicedostranice metoduradisam
Dolazimodotackegdeinterakcijasakorisnikompostajenasaglavnatema.Kadapricamoo uvodjenjuinteraktivnosti,ustvaripokusavamodapostignemoboljeiskustvouupravljanju podacima.Dabismoovouradili,trebadarazmotrimodvestvari:
KakodadinamickipromenimoWebstranezavisnoodtogakojajeprethodnastrana

odabrana,ilizavisnooddrugihfaktora,naprimervremenadana,trenutnoulogovanog korisnika,njegovelokacijeislicno... Kakodapratimostajebilopre,takodakorisnicimogunestodakazuweblokacijiidaonda onanjimapojedninacnoodgovori.Ovomozedazapocneserijuinterakcijanapravcu korisnikWebLokacija,ukojimasepodacistalnoprosledjujunapredinazadizmedju korisnikaiweblokacije,drugimrecimapotrebnanamjetrajnostnekihpodatakautoku posetekorisnikanasojweblokaciji. Napocetkucemorazmotritinekolikonacinanakojemozetedaucinitedavasipodacitrajuod jednogdodrugogzahtevakorisnikazastranicamanavasemwebserveru.Poredtoga,istose mozeposticikoriscenjemPHPsesijastocemopokazatiusledecempoglavlju,alidobrojevideti kakosetomozeostvaritipesackimputemdabismonauciliosnovneprincipekojidelujuu pozadiniinterakcije.Takodje,necevamuvekbitineophodnesesijedabiostvarili interaktivnost,pajedobroznatiidrugacijimetoddasetouradi. Skrivenapoljaformulara Recimodaimamosekvencuodtriformulara,odkojihsvakiuzimapodatkeodkorisnika.Kada korisnikpopuniformular1,posaljega,podaciseprosledjujunasledeciformularusekvenci. Formular2prihvataodredjenepodatkeiprosledjujeihformularu3.Alikakodaformularu3, poredpodatakasaformulara2,prosledimoipodatkesaformulara1? Tojejednostavno:samodefinisemoskrivenapoljauformularu2kojacesadrzatipodatke prosledjenesaformulara1.Sledeciprimerradiupravoto. Ovojejednostavanprimerkojikoristitriskriptadabiprimioporudzbinuurestoranuidabina krajuprikazaoracunposvimnarucenimstavkama. 1.Napravitesledeciskriptisacuvajtegakaomenu1.php

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD><TITLE>Welcome to Charlie's</TITLE></HEAD> <BODY> <?php $Entrees=array("Steak ($9)", "Pizza ($7)", "Pasta ($6)"); echo "<FORM METHOD=POST ACTION='menu2.php'>"; echo "Which of the following would you like as an entree?"; echo "<SELECT NAME='ListBox1'>"; echo "<OPTION SELECTED VALUE=''>Select...</OPTION>"; echo "<OPTION>$Entrees[0]</OPTION>"; echo "<OPTION>$Entrees[1]</OPTION>"; echo "<OPTION>$Entrees[2]</OPTION>"; echo "</SELECT><BR><BR>"; echo "<INPUT TYPE=SUBMIT>"; echo "</FORM>"; ?> </BODY> </HTML>
2. Sledeciskriptsacuvajtekaomenu2.php

<HTML> <HEAD><TITLE>Welcome to Charlie's dessert selection</TITLE></HEAD> <BODY> <?php $Desserts=array("Apple Pie ($3)","Pancakes ($3)","Ice Cream ($2)"); echo "<FORM METHOD=POST ACTION='bill.php'>"; echo "Which of the following would you like as a dessert?"; echo "<SELECT NAME='ListBox2'>"; echo "<OPTION SELECTED VALUE=''>Select...</OPTION>"; echo "<OPTION>$Desserts[0]</OPTION>"; echo "<OPTION>$Desserts[1]</OPTION>"; echo "<OPTION>$Desserts[2]</OPTION>"; echo "</SELECT><BR><BR>"; echo "<INPUT TYPE=HIDDEN NAME=Course1 VALUE='$_POST[ListBox1]'>";

AlefBrainPHPTrening2006.Skripta2

echo "<INPUT TYPE=SUBMIT>"; echo "</FORM>"; ?> </BODY> </HTML>


3. Narednikodsacuvajtekaobill.php

<HTML> <HEAD><TITLE>Thank you for dining at Charlie's</TITLE></HEAD> <BODY> <?php $total = 0; echo "Your order was for the following:<BR><BR>"; echo "Entree: $_POST[Course1]<BR>"; echo "Dessert: $_POST[ListBox2]<BR><BR>"; foreach (array($_POST[Course1], $_POST[ListBox2]) as $val) { if (ereg("[0-9]+", $val, $regs)) $total += $regs[0]; } echo "TOTAL BILL = $" . $total . "<BR>"; ?> </BODY> </HTML>
4. Sadauwebbrowseruotvoriteskriptmenu1.php

5.OdaberitejeloizpadajucegmenijaipritisniteSubmitQuerydabistedobilisledecustranu: 3

AlefBrainPHPTrening2006.Skripta2

6.Kadaodaberetedezertiposaljeteizborevostacetedobiti:

Objasnimosadakakoprethodnikodradi.Nasprviskriptmenu1.phpteskomozeprocikaoPHP skriptsamocinjenicadasmodefinisalinasizborjelaunizusprecavanasdatonapisemokao cistHTMLkod.Ipak,tojePHP,ikoristimoniz$Entreesdabismodefinisalidozvoljeneopcije upadajucemmeniju: $Entrees=array("Steak($9)","Pizza($7)","Pasta($6)"); KadapritisnemodugmeSubmitQuery,pozivasesledeciskriptmenu2.php,anasizborjela prosledjujesekaopromenljiva$_POST[ListBox1].Evosadajosmaloslicnogposla.Definisemo nizdostupnihdezeerta,ipredstavljamosvakuvrednostkaoopcijuupadajucemmeniju: $Desserts=array("ApplePie($3)","Pancakes($3)","IceCream($2)");

AlefBrainPHPTrening2006.Skripta2 Sada,ovojenajvaznijatacka.PrenegostodefinisemodugmeSubmitQueryzaformular, dodajemoskrivenopolje(hidden)kojesezoveCourse1,cijavrednostsepreuzimaiz promenljive$_POST[ListBox1]idaljesadrziizborjelaizskriptamenu1.php,takose osiguravamodaceovavrednosttrajatidosledecegskriptaukojigaprosledjujemometodom POST: echo"<INPUTTYPE=HIDDENNAME=Course1VALUE='$_POST[ListBox1]'>"; JosjednomdugmeSubmitQuerynassaljenasledeciskript,uovomslucajubill.php.Once izlistatinarucenojelo,narucenidezertidatinamukupnucenu.Postojeskriptmenu2.php smestioizborjelauskrivenopoljeCourse1,sadamozemodagadobijemokrozpromenljivu $_POST[Course1].Odabranidezeertsenalaziupromenljivoj$_POST[ListBox2]: echo"Yourorderwasforthefollowing:<BR><BR>"; echo"Entree:$_POST[Course1]<BR>"; echo"Dessert:$_POST[ListBox2]<BR><BR>"; Poslednjideonasegprimerakoristicinjenicudasmocenedodalinakrajopisajela.Mozemoda prodjemokrozlistuidaizvadimoceneporedjenjemsablonapomocufunkcijeereg(),iako postojedodamoihpromenljivoj$total.Zavrsavamosaispisomukupnogracuna: foreach(array($_POST[Course1],$_POST[ListBox2])as$val){ if(ereg("[09]+",$val,$regs))$total+=$regs[0]; } echo"TOTALBILL=$".$total."<BR>"; QueryStringstringsaupitom Prenosenjepodatakaodstranicedostranicemozeseposticiiupotrebomquerystringova. Cestojetoresenjejednostavnijeielegantnijeodskrivenihpoljaformulara.Pogledajmoprimer kojikorististringovesaupitomzacuvanjevrednostiodstranicedostraniceukontekstuu kojembiformularibiliprilicnoneprakticni.Dameigospodozauzmitemestaigrapocinje. Ovaigrabitrebalodavambudepoznatatojeigrapogadjanjaukojojigracbiraslova,jedno pojedno,ipokusavadaotkrijezagonetnurec.Svakiputkadaigracodabereslovokojese pojavljujeureci,svamestanakojimaseslovonalazibivajuotkrivena.Kadagododabereslovo kojegnemaureci,naslicizavesanjesecrtanovalinija.Dvanaestlinijacinekompletnusliku nakoncegaigracgubiigru.Akouspedapogodirecpretoga,igracpobedjuje.Kakvazabava! Mozdaceteseiznenaditikadaotkrijetedacemosveovodauradimoujednomskriptuovde nasetrajnepromenljiveulazeuigru.Imamojednustranukojuucitavamosvakiputkadaigrac odabereslovo.ociglednojedacemoratidaizgledamalodrugacijesvakiputkadaseucita,ali cetoskorouvekzavisitiodslovakojasubilaodabrana.Pozivajuciskriptsaquerystringomu URLadresi,kojisadrzisvaodabranaslova,mozemodaregenerisemostranuizpocetkasvaki put.Dostapricehajdedapogledamokod. Napisitesledeciskriptisacuvajtegapodimenomhangman.php:

AlefBrainPHPTrening2006.Skripta2

<HTML> <HEAD><TITLE>Hangman</TITLE></HEAD> <BODY><DIV ALIGN = 'center'> <?php $letters = $_GET[letters]; $word_number = $_GET[word_number]; $alphabet = array ("A","B","C","D","E","F","G","H","I","J","K","L","M" ,"N","O","P","Q","R","S","T","U","V","W","X","Y","Z" ); $words = array("AARDVARK", "INDIGESTION", "CALCULATOR","PERISTALSIS", "VERMILLION", "MNEMONIC"); $wrong = 0; if (!isset($word_number)) { $word_number = rand (1,count($words)) - 1; } echo"<H1>"; $word = $words[$word_number]; $finished = 1; for ($i=0; $i < strlen($word); $i++) { if (ereg($word[$i], $letters)) { echo $word[$i]; } else { echo "_"; $finished = 0; } } echo"</H1>"; if ($finished) { echo "<BR><BR>Congratulations! You win!<BR><BR>"; echo "<A HREF=$PHP_SELF>Play again</A>"; } else { foreach ($alphabet as $var) { if (ereg($var, $letters)) { if (ereg($var, $words[$word_number])) { $links .= "<B>$var</B> "; } else { $links .= "$var "; $wrong++; } }

AlefBrainPHPTrening2006.Skripta2

else { $links .= "<A HREF=\"$PHP_SELF?letters=$letters$var&word_number=$w ord_number\">$var</A> "; //echo "$letters$var"; } } echo "<BR><IMG SRC=\"./hangman$wrong.gif\"><BR>"; if ($wrong == 12) { echo "<BR>HANGMAN!!<BR><BR>"; echo "The word you were looking for was \"$word\"<BR><BR>"; echo "<A HREF=$PHP_SELF>Play again</A>"; } else { echo "Tries remaining = ".(12-$wrong)."<BR>"; echo "<BR>Please pick a letter.<BR><BR>"; echo $links; } } ?> </DIV></BODY> </HTML>
Pokreniteskript,odaberitenekolikoreciitrebalobidadobijetenestoslicnosledecem:

AlefBrainPHPTrening2006.Skripta2 Vaszadatakjedaproucitekakoradiovajskriptishvatitekakosmocuvalipodatkeobroju pokusajaivecodabranimrecimasamokoristeciquerystring.Videcetedajekonceptvrlo jednostavan.Napomenucusamodasmouprogramukoristilitrinaestrazlicitihslicicazasvako stanjevesala:

AlefBrainPHPTrening2006.Skripta2

13.Sesije
Postosmoupoznalirazlicitetehnikekojemozemodakoristimodabismoucinilidapodaci traju,visemozemodacenimoonostosedesavakadapricamoosesijama.Sesijudefinisemo kaoserijuvezanihinterakcijaizmedjujednogklijentaiwebservera.Ovobimogledabudu serijetransakcijakojekorisnikpravidokazurirasvojportfoliosaakcijama,iliskupzahtevakoji sunapravljenidabiseproverionalogelektronskepostekrozwebemailservis.Sesijamozeda sesastojiodvisestrukihzahtevaistomskriptuiliodzahtevarazlicitimizvorimanaistojweb lokaciji. Umestostalnogslanjapodatakaizmedjuserveraiklijenta,mnogojeprakticnijedrzatipodatke naserveru,alidatiklijentukljucpomocukogacemogajedinstvenoidentifikovatiipruzitimu pristupnjegovimpodacima.Ovajkljuczovemoidentifikatoromsesije;onjedinstvenovezuje klijentasasesijom,isamimtimsanjegovimpodacima. NecemozalazitiuteoretskupozadinuPHPovogsistemazaradsasesijama.Najednostavnom primerupokazacemokakoseradisasesijamaitocebitisasvimdovoljnoznanjadaihkoristite usvojimprogramima.Kasnije,kobudeimaozeljudaupoznasvedetaljeosesijama,mozeo tomepotrazitiizvorenawebu. HajdedaispitamojednostavnokoriscenjePHPsesijabrojanjekolikojeputakorisnikpristupio stranamanaweblokacijiodpocetkatekucesesije.Sledeciskriptsacuvajtepodimenom page_count.php:

<?php session_start(); session_register("view1count"); session_register("view2count"); session_register("view3count"); session_register("view4count"); if if if if (!$view1count) (!$view2count) (!$view3count) (!$view4count) $view1count $view2count $view3count $view4count = = = = 0; 0; 0; 0;

echo "<HTML><HEAD><TITLE>Web Page Hit Counter</TITLE></HEAD><BODY>"; if ($_GET[whichpage]) { echo "<B>You are currently on page $_GET[whichpage].</B><BR><BR>\n"; $_SESSION["view${whichpage}count"]++; }

AlefBrainPHPTrening2006.Skripta2

for ($i = 1; $i <= 4; $i++) { if ($_GET[whichpage] == $i) { echo "<B><A HREF=\"$PHP_SELF?whichpage=$i\">Page $i</A></B>"; } else { echo "<A HREF=\"$PHP_SELF?&whichpage=$i\">Page $i</A>"; } echo ", which you have chosen ". $_SESSION["view${i}count"]." times.<BR>\n"; } echo "\n\n<BR><BR>\n\n"; echo "</BODY></HTML>"; ?>
Akopokreneteskriptiklikneteponekolikoputanasvakiodlinkova,evostabitrebaloda dobijete:

Objasnimokakoradiovajjednostavanprimer.Sesijuzapocinjemofunkcijomsession_start(). Svestranicekojezeeliteukljucitiusesijuzapocnitesasession_start().Tafunkcijazapocinje novusesiju,aakojevecprethodnozapocetaodnekogprograma,samocejenastaviti.Zatim slediregistracijasesijskihpromenljivihkojezelimodakoristimo.Utusvrhusekoristifunkcija session_register()kojakaoargumentprihvatastringsaimenompromenljivebezznakaza dolar.Itojesvestonamjepotrebnodabipromenljiveregistrovanesasession_register()bile vidljiveusvimprogramimakojizapocinjusasession_start()! 2

AlefBrainPHPTrening2006.Skripta2 Mozdasteiznenadjenijednostavnoscu,aliakomaloboljepogledateprimerkojismonaveli, videcetedapromenljive$view1count,$view2count,$view3counti$view4countzadrzavaju svojevrednostiodzahtevadozahtevapostiglismotrajnostpodataka! Navodimosamojosjednumalunapomenu,veomavaznuzaradsasesijama.Funkcija session_start()semorapozvatinastraniciprenegostojebilostaodstampano.ovojeveoma vaznozapamtiti,jerusuprotnomsesijeneceraditi.

AlefBrainPHPTrening2006.Skripta2

14.PovezivanjePHPaiMySQLa
PrenegopocnemopricuofunkcijamakojekoristimozapovezivanjePHPaiMySQLservera, pripremimobazuijednutabelunakojojcemoprikazatitestprimer.OtvoritePHPMyAdmini napravitenovubazupodimenomcrossroads.Zatimiskoristitesledecekomandedanapravite tabelucs_personal_infoipopunitejesanekolikoslogovapodataka. CREATETABLE`cs_personal_info`( `person_id`int(11)NOTNULLauto_increment, `title`varchar(30)NOTNULLdefault'', `first_name`varchar(30)NOTNULLdefault'', `last_name`varchar(30)NOTNULLdefault'', `middle_name`varchar(30)NOTNULLdefault'', `appended_title`varchar(30)NOTNULLdefault'', `spouse_name`varchar(30)NOTNULLdefault'', `category_id`int(11)NOTNULLdefault'0', `relationship_status`varchar(30)NOTNULLdefault'', `company_name`varchar(100)NOTNULLdefault'', `job_title`varchar(100)NOTNULLdefault'', `salutation`varchar(100)NOTNULLdefault'', `status`enum('shared','private')NOTNULLdefault'shared', `birthday`dateNOTNULLdefault'00000000', `wedding`dateNOTNULLdefault'00000000', `photo`varchar(255)NOTNULLdefault'', `notes`textNOTNULL, `note_sharing`enum('Shared','Private')NOTNULLdefault'Shared', `referred_by`varchar(100)NOTNULLdefault'', `referrer_name`varchar(100)NOTNULLdefault'', `assistant_name`varchar(255)defaultNULL, `children`varchar(255)defaultNULL, `new`varchar(255)defaultNULL, `nickname`varchar(255)defaultNULL, `owner`varchar(255)defaultNULL, `secondary_id`varchar(255)defaultNULL, `owner_id`int(11)NOTNULLdefault'11921', `date`dateNOTNULLdefault'00000000', `email_preferences`enum('html','text')NOTNULLdefault'html', PRIMARYKEY(`person_id`), KEY`category_id`(`category_id`), KEY`owner_id`(`owner_id`) )TYPE=MyISAMAUTO_INCREMENT=19254;

Dumpingdatafortable`cs_personal_info` INSERTINTO`cs_personal_info`VALUES(1,'','Lester','Smith','','','',3,'','','','','shared', '00000000','00000000','','','Shared','','','','','','','','',11652,'00000000','html');

AlefBrainPHPTrening2006.Skripta2 INSERTINTO`cs_personal_info`VALUES(2,'','Russell','Bettis','','','',0,'','','','','shared', '00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(3,'','Barbara','Bruckhorst','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(4,'','Harry','Vernon','','','',0,'','','','','shared', '00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(6,'','Radovan','Duric','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','Nicole','','','','','Duric',11921,'000000 00','html'); INSERTINTO`cs_personal_info`VALUES(7,'','Christie','Winner','','','',3,'','','','', 'shared','00000000','00000000','','','Shared','','','Dale','','','','','Winner',11921,'000000 00','html'); INSERTINTO`cs_personal_info`VALUES(11788,'','Lynn','Summerhill','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','',NULL,11921,'00000000', 'html'); INSERTINTO`cs_personal_info`VALUES(9,'','Mario','Williams','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(11,'','Roger','Edwards','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(12,'','','Whitmore','','','',0,'','','','','shared', '00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(13,'','Spencer','Dean','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(15,'','Jay','Geis','','','',0,'','','','','shared', '00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(16,'','Gerald','Rainer','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); INSERTINTO`cs_personal_info`VALUES(17,'','Mike','Bateman','','','',0,'','','','', 'shared','00000000','00000000','','','Shared','','','','','','','','',11921,'00000000','html'); Sadakadaimamobazu,tabeluipodatke,mozemopokazatikakopomocuPHPdase konektujemonaMySQLserveriodaberemobazusakojomcemoraditi. Ovdesubitnedvefunkcije.PrvajeonakojanasPHPprogrampovezujesaMySQLserverom: mysql_connect(adresa_servera,korisnicko_ime,lozinka); Funkcijamysql_connect()kaoargumenteprihvataadresuserveranakojisekonektujemo, korisnickoimeilozinku.Akosutipodaciispravni,uspostavilismovezusaserverom. DrugafunkcijanamsluzidaodaberemobazusakojomcemoraditiiznasegPHPskripta: 2

AlefBrainPHPTrening2006.Skripta2

mysql_select_db(ime_baze); Funkcijamysql_select_db()kaoargumentprihvataimebazesakojmzelimodaradimo.Posle ovadvakoraka,spremnismodapostavljamoupitebazipodataka. DabismosepovezalinaMySQLserveriodabralibazukojusmonapocetkukreirali,trebada izvrsimosledecikod:

<?php define("DB_DATABASE_NAME", "crossroads"); define("DB_USERNAME", "root"); define("DB_PASSWORD", "root"); define("DB_HOSTNAME", "localhost"); //Connect to database mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) or die(mysql_error()); mysql_select_db (DB_DATABASE_NAME) or die(mysql_error()); ?>
Najpresmodefinisalikonstantesaneophodnimpodacimazapovezivanjenabazuionda primeniliobjasnjenefunkcije.

AlefBrainPHPTrening2006.Skripta2

15.UzimanjepodatakaizMySQLa,manipulacijaiUPDATE
SadacemopokazatikakodaiskoristitevezuuspostavljenusaMySQLserveromzapostavljanje SQLupita.Procedurajevrlojednostavnaipostizeseupotrebomnekolikofunkcija.Najpre pokazimokakodapostavimoupitbazipodataka,bilodajetoSELECT,INSERTiliUPDATE upit.Toradimoudvakoraka.Prvijedadefinisemoupit: $select_query="selectperson_id,first_name,last_name fromcs_personal_info ORDERBYperson_idDESCLIMIT10"; Promenljivoj$select_querydodelilismostringkojisaddrzinasSQLupit.Zatimpozivamo ugradjenufunkcijuPHPazaprosledjivanjeovogupitabazipodataka: $select_result=mysql_query($select_query); Kljucnafunkcijajemysql_query()kojakaoargumentuzimastringsaSQLupitom,aposle izvrsenjauprogramvracauprogramodredjenuinformacijukojazavisiodvrsteupitakojismo postavili. AkosmopostaviliSELECT,SHOW,DESCRIBEiliEXPLAINupit,funkcijamysql_queryvraca pokazivacnaresurskojisadrzirezultatupita,poduslovomdajeupituspesnoizvrsen,au suprotnomvracaFALSE.Pokazivacnaresurssmestamoupromenljivudabismogamogli kasnijeuprogramukoristitinanacinkojicetekasnijeupoznati. AkopostavimoUPDATE,DELETE,DROPilinekidrugitipupita,funkcijamysql_queryvraca TRUEuslucajuuspesnogizvrsenjailiFALSEuslucajuneuspeha. PotpunoidenticnuprocedurukoristiteakozelitedapostaviteUPDATEiliDELETEupit definisetepromenljivukojasadrziupitiiskoristitejekaoargumentupozivufunkcije mysql_query(). SadacemosepozabavitiprocedurompreuzimanjapodatakavracenihuSELECTupitu.Kako PHPpristupaovimpodacimaikakoihmozemoiskoristitiunasimprogramima? Pogledajtesledecideokoda,pacemoobjasnitistaonradi:

$select_query="select person_id,first_name, last_name from cs_personal_info ORDER BY person_id DESC LIMIT 100"; $select_result = mysql_query($select_query); while($select_row=mysql_fetch_array($select_result)) { $person_id = $select_row[person_id]; $user_first_name = $select_row[first_name]; $user_last_name = $select_row[last_name]; echo "$person_id. $user_first_name $user_last_name<br>"; }

AlefBrainPHPTrening2006.Skripta2 Napocetkudefinisemoupitkojiselektujeperson_id,first_nameilast_nameiztabele cs_personal_info.ZatimtajupitpostavljamoMySQLufunkcijommysql_query()ionavraca pokazivacnarezultatekojejevrationasupit,atajpokazivacsmestamoupromenljivu $select_result.Dabismopristupilirezultatuupita,mikoristimofunkcijumysql_fetch_array() kojojkaoargumentpredajemopokazivacnavracenirezultatupita$select_result. Staradifunkcijamysql_fetch_array()?Onapristupavracenimrezultatima,uzimajedanslogiz svihvracenihslogovaiformiraasocijativninizcijisuindeksiimenapoljakojasmonaveliu SELECTupitu,avrednostisujednakevrednostimautekucempreuzetomslogu.Tajasocijativni nizsedodeljujepromenljivoj$select_row,kojusmonavelipripozivufunkcije mysql_fetch_array(): while($select_row=mysql_fetch_array($select_result)) Dabismopreuzelisvakivracenislog,moramoformiratiwhilepetljukojaseizvrsavadokgod funkcijamysql_fetch_array()nepreuzmesvakislogizvracenihrezultata.Kadaseiposlednji slogpruzme,prestajeizvrsavanjewhilepetlje. Usvakojiteracijikrozwhilepetljuimamopristuptekucempreuzetomslogu.Unasemprimeru, koristimotajpristupdabismopromenljivama$person_id,$user_first_namei$user_last_name dodelilivrednostiiztekucegdobijenogsloga: $person_id=$select_row[person_id]; $user_first_name=$select_row[first_name]; $user_last_name=$select_row[last_name]; Zatimsmotevrednostikoristilidabiodstampalinaekranuidosobe,imeiprezime: echo"$person_id.$user_first_name$user_last_name<br>"; Napotpunoistinacinceteuvekuzimatirezultateupita,samostoceteurazlicitimsituacijama nadrugacijenacinekoristiteslogovekojeupitvrati.Dobroupamtiteovukombinacijuupitai whilepetljejercevamjakocestobitipotrebnauvasimprogramima. SadacunavestijosparfunkcijaPHPazaradsaMySQLomkojecevambitivrlokorisne.U primerukojizatimsledividecetesvetefunkcijenadelu. AkozelitedasaznatekolikoslogovajevratioSELECTupit,upotrebitefunkciju mysql_num_rows()nasledecinacin: $select_query="selectperson_id,first_name,last_name fromcs_personal_info ORDERBYperson_idDESCLIMIT100"; $select_result=mysql_query($select_query); echo"NumRows:".mysql_num_rows($select_result)."<br>"; AkohocetedasaznatenakolikoslogovajeuticaovasINSERT,DELETEiliUPDATEupit, koristitefunkcijumysql_affected_rows():

AlefBrainPHPTrening2006.Skripta2 $query="UPDATEcs_personal_info SETfirst_name='Tralala' WHEREfirst_name='Miljan'"; $result=mysql_query($query); echo"<br><br>AffectedRows:".mysql_affected_rows($result); AdabistesaznalikojijeposlednjiautoincrementidpostavljenuINSERTupitukojije obuhvataopoljedefinisanokaoAUTOINCREMENT,koristitefunkcijumysql_insert_id() neposrednoposleINSERTupita: $query="INSERTINTOcs_personal_info( owner_id, date, title, first_name, last_name, middle_name, appended_title, spouse_name, category_id, relationship_status, company_name, job_title, salutation, status, birthday, wedding, photo, notes, referred_by, referrer_name) VALUES( '1010', '".date("Ymd")."', 'Mr', 'Miljan', 'Vranic', 'S', 'Jr.', '', '12', '2', 'AlefBrain', 'CEO', 'Salutation', '', '19750509', '', '', 'Notes', '12', 3

AlefBrainPHPTrening2006.Skripta2 'MarkoMarkovic')"; $result=mysql_query($query); $walkthru_data[person_id]=mysql_insert_id(); echo"<br><br>Poslednjiunetiperson_id:".$walkthru_data[person_id]."<br><br>"; Porednavedenihfunkcija,postojemnogedrugePHPfunkcijepredvidjenezaradsaMySQlomi zavisedetaljapreporucujemdapogledatePHPManual.Slediprimerkojiobjedinjujesvesto smonauciliuposlednjedvelekcije:

<?php define("DB_DATABASE_NAME", "crossroads"); define("DB_USERNAME", "root"); define("DB_PASSWORD", "root"); define("DB_HOSTNAME", "localhost"); // Connect to database mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) or die(mysql_error()); mysql_select_db (DB_DATABASE_NAME) or die(mysql_error()); //selektovanje podataka $select_query = "select person_id, first_name, last_name from cs_personal_info ORDER BY person_id DESC LIMIT 10"; $select_result = mysql_query($select_query); echo "Num Rows: ".mysql_num_rows($select_result). "<br>"; while($select_row=mysql_fetch_array($select_result)) { $person_id = $select_row[person_id]; $user_first_name = $select_row[first_name]; $user_last_name = $select_row[last_name]; echo "$person_id. $user_first_name $user_last_name<br>"; } //dodavanje podataka u bazu $query = "INSERT INTO cs_personal_info( owner_id, date, title, first_name, last_name, middle_name, appended_title, spouse_name, category_id,

AlefBrainPHPTrening2006.Skripta2

relationship_status, company_name, job_title, salutation, status, birthday, wedding, photo, notes, referred_by, referrer_name) VALUES( '1010', '".date("Y-m-d")."', 'Mr', 'Miljan', 'Vranic', 'S', 'Jr.', ' ', '12', '2', 'AlefBrain', 'CEO', 'Salutation', '', '1975-05-09', ' ', '', 'Notes', '12', 'Marko Markovic')"; $result = mysql_query($query); echo "<br><br>Affected Rows:". mysql_affected_rows(); $walkthru_data[person_id] = mysql_insert_id(); echo "<br><br>Poslednji uneti person_id:".$walkthru_data[person_id]."<br><br>"; //UPDATE podataka $query = "UPDATE cs_personal_info SET first_name = 'Tralala' WHERE first_name ='Miljan' "; $result = mysql_query($query);

AlefBrainPHPTrening2006.Skripta2

//DELETE podataka $query = "DELETE FROM cs_personal_info WHERE first_name ='Tralala' "; $result = mysql_query($query); ?>

Sacuvajteovokaomysql_php_functions.phpikadagapokreneteuwebbrowseru,onceizvrsiti svenavedenefunkcijeiprikazatinaekranuspisakodnajvisedesetljudiiztabele cs_personal_info.PokusajtedaeksperimentisetetakostocetestavljatikomenatarenaINSERT, DELETEiliUPDATEupiteiposmatrajtestasedesava.

AlefBrainPHPTrening2006.Skripta2

16.SlanjeporukaelektronskeposteuPHPu
Evodobrihvesti:jedinafunkcijakojavamjepotrebnadabisteslalielektronskupostupomocu PHPajemail().Zartonijetakojednostavno?!Funkcijamail()uzimatribitnaargumenta: 1. Emailadresuprimaocaporuke 2. Naslovporuke 3. Teloporuke Takodjemozetenavestiiopcionicetvrtiargument;stringkojisadrzibilokojadodatnazaglavlja kojavamsluzedanavedetekosaljeporuku(FROM),komedaidekopijaporuke(CC),kome daidekopijaadaostaliprimaocinevidenjegovuadresu(BCC),kometrebaodgovoritina primljenuporuku... Sledecijednostavanprimerdajevamsvestojepotrebnodabiseposlaoemail.Otvoritetext editorinapisitesledeciskript:

<?php //first_mail.php $mail_to ="nobody@whatyoumaycallit.com"; $mail_subject = "Hi there!"; $mail_body = "We'll have a meeting next Wednesday.\n"; $mail_body .= "7 P.M. in Judy's Office.\n"; $mail_body .= "Oh, BYOB!\n"; mail($mail_to, $mail_subject, $mail_body); ?>
Sacuvajtefajlpodimenomfirst_mail.phpikadaseizvrsionceposlatieamilnaadresu nobody@whatyoumaycallit.comcijicenasloovbitiHiThere!,auteluporukepisaceWe'll haveameeting....Obratitepaznjudaovajskriptmozdaneceraditinavasemlokalnom racunaruakonijepovezannaInternetiakonemateinstaliranSMTPserver. Hajdesadadaprosirimoprimerupotrebomcetvrtogargumentafunkcijemail:

AlefBrainPHPTrening2006.Skripta2

<?php //first_mail.php $mail_to ="nobody@whatyoumaycallit.com"; $mail_subject = "Hi there!"; $mail_body = "We'll have a meeting next Wednesday.\n"; $mail_body .= "7 P.M. in Judy's Office.\n"; $mail_body .= "Oh, BYOB!\n"; mail($mail_to, $mail_subject, $mail_body, "From: ja@gmail.com\r\nReply-to: mile@gmail.com\r\nCC: pera@gmail.com\r\nBCC: mika@gmail.com"); ?>
Sacuvajtefajlkaosecond_mail.php.Onseodprethodnogprogramarazlikujeutomestosmou cetvrtomargumentufunkcijemail()nekedodatnestandardneatributeemailporukakaostosu Fromkosaljemail,ReplyTokomeideporukakadaprimaockliknenaReplydugmesvog emailklijenta,CCkocedobitiCarbonCopyporuke,BCCkocedobitiBlindCarbonCopy poruke.Obratitepaznjudaposlesvakognavedenogatributaucetvrtomargumentuiduznaci \r\nkojisuobaveznipremastandardimazaslanjeemailporuka.

AlefBrainPHPTrening2006.Skripta2

17.FunkcijeugradjeneuPHP
PostojemnogebibliotekefunkcijaugradjenihuPHP.Krozovajkursprikazalismosamoneke odnjih.OdpresudnevaznostizavasedaljenapredovanjeuPHPujestedakadagodimateneki problem,pogledatenekuodbibliotekafunkcijakojevammozdamogupomocidana jednostavnijiibrzinacinpronadjeteresenje.PostojePHPveomazivjezik,stalnosejavljaju novefunkcijekojesedodajuosnoviPHPainazvanicnomsajtuPHPauvekcetebitiuprilicida seupoznatesanajsvezijimizvorimainformacijaputemPHPManualavodicakrozPHP. Adresanavedenogsajtajewww.php.net AdresaPHPManualajehttp://www.php.net/manual/en/ PoslednjanavedenaadresajeveomavaznakaoreferencazavasedaljenapredovanjeuPHP programiranju.

AlefBrainPHPTrening2006.Skripta2

18.RazdvajanjelogickogPHPkodaodprikaza
Ciljovogpoglavljajedavamkratkoukazenajosjedannacinpisanjastorazumljivijih programa.VeomavaznaosobinaPHPajedasenaistojstranimogunaciiPHPiHTML komande.Medjutim,cestotostvaramnogoproblemajerprogramerinevoderacunai preterujuukombinovanjuPHPaiHTMLasvedokneproizveduvrlonecitljivestranice.Kako ovoizbeci,jerjenajcesceneophodnodasenaistojstraninadjePHPkod(logikaprograma)sa HTMLom(prikaz)?Pozvacemoupomocfunkcijuinclude()iprikazatikakotrebapravilno razdvajatilogikuodprikazaitakoomogucitilakosnalazenjeuprogramu. Napravicemodvafajla.Jedancemonazvatilogika.phpjerceonsadrzaticistPHPkodkojiradi onostojeglavnizadatakprograma.Drugicemonazvatiprikaz.phpkojicenamsluzitida korisnikuprikazemorezultateradaprogramalogika.phpionceuglavnomsadrzatiHTMLkod savrlomaloPHPakojisluzisamozastampanjerezultata.Akosepitatikakocemoizvestida prikaz.phpprikazeonostologika.phpuradi,odgovorjevrlojednostavan:nakrajufajla logika.phpsamocemoukljucitifajlprikaz.phppomocufunkcijeinclude.Pogledajmokako izgledajuoviprogrami:

<?php define("DB_DATABASE_NAME", "crossroads"); define("DB_USERNAME", "root"); define("DB_PASSWORD", "root"); define("DB_HOSTNAME", "localhost"); // | Connect to database mysql_connect (DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) or die(mysql_error()); mysql_select_db (DB_DATABASE_NAME) or die (mysql_error()); //selektovanje podataka $select_query = "select person_id, first_name, last_name from cs_personal_info ORDER BY person_id DESC LIMIT 100"; $select_result = mysql_query($select_query); while($select_row = mysql_fetch_array ($select_result)) { $person_id = $select_row[person_id]; $user_first_name = $select_row[first_name]; $user_last_name = $select_row[last_name]; $array_of_names[] = "$person_id. $user_first_name $user_last_name<br>"; } include("prikaz.php"); ?>
Sacuvajteovajfajlpodimenomlogika.php.Zatimutexteditoruukucajtesledeciprogram: 1

AlefBrainPHPTrening2006.Skripta2

<html> <head> <title>Prikaz podataka iz mysql_php_functions.php</title> </head> <body bgcolor="Gray"> <?php foreach ($array_of_names as $value) { echo $value; } ?> </body> </html>
Isacuvajtegakaoprikaz.php.Kadapozovetelogika.phpuvasembrowseru,oncesezakaciti nabazu,izvrsitiupitirezultateuoitasmestitiuniz$array_of_names.Nakrajufajlase ukljucujeprikaz.php.Primetitedaulogika.phpnemanijednogHTMLtaga.Zatojekompletan HTMLsmestenuprikaz.phpisamojenapotrebnommestuodstampansadrzajnizakojismo popunilipodacimaulogika.php. Ovojeveomajednostavankonceptrazdvajanjalogikeodprikaza,alijeistovremenoveoma koristan.Mozdacevamovoizgledatinepotrebnoumanjimprimerima,alikadapocneteda raditenanekimozbiljnijimprojektima,vrlobrzocetevidetikolikokoristidonosiovakav pristup.Vaskodcebiticistiji,razumljivijiisamnogomanjegresaka.