web dizajn skripta

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

Upload: mirko-maric

Post on 12-Aug-2015

329 views

Category:

Documents


19 download

DESCRIPTION

Pocetak i osnove web dizajniranja

TRANSCRIPT

Page 1: Web Dizajn Skripta

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.

1

Page 2: Web Dizajn Skripta

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

1

Page 3: Web Dizajn Skripta

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.

2

Page 4: Web Dizajn Skripta

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

protokol brine da svi paketi u razumno kratkom vremenu stignu na odrediste, budu

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

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. Prvobitni broj masina na

Internetu bio je veoma ogranicen i veza izmedju IP adrese i imena je cuvana u fajlu koji

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

3

Page 5: Web Dizajn Skripta

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 ima

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.

4

Page 6: Web Dizajn Skripta

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:

1

Page 7: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

2

Page 8: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

3

Page 9: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

4

Page 10: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

5

Page 11: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

6

Page 12: Web Dizajn Skripta

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.

7

Page 13: Web Dizajn Skripta

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 [email protected] 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.

8

Page 14: Web Dizajn Skripta

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.

1

Page 15: Web Dizajn Skripta

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:

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.

2

<HTML><HEAD>

</HEAD><BODY>

</BODY></HTML>

Page 16: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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.

3

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

</BODY></HTML>

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

Page 17: Web Dizajn Skripta

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

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 Pocetni tag Zavrsni tag

Masni (bold) <B> ili <STRONG> </B> ili </STRONG>

Kosi (italic) <I> </I>

Podvuceni (underline) <U> </U>

Monospace <TT> </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:

1

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

Page 18: Web Dizajn Skripta

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

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.

2

<HTML><HEAD><TITLE>Moj prvi naslov!</TITLE></HEAD><BODY><H1>Ovo je H1 naslov!</H1><H2>Ovo je H2 naslov!</H2><H3>Ovo je H3 naslov!</H3><H4>Ovo je H4 naslov!</H4><H5>Ovo je H5 naslov!</H5><H6>Ovo je H6 naslov!</H6></BODY></HTML>

Page 19: Web Dizajn Skripta

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.

3

Page 20: Web Dizajn Skripta

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. Redne liste

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.

Generalna postavka izgleda ovako: primer_04.html

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

1

<OL><LI>Prvi element<LI>Drugi element<LI>Treci element<LI>Imate ideju o cemu govorim.</OL>

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

Page 21: Web Dizajn Skripta

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

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.

2

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

Page 22: Web Dizajn Skripta

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:

1

Page 23: Web Dizajn Skripta

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:[email protected]”>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 sto uocavate, razlika izmedju poslednja dva linka je u tome sto prvi ima

http://www.alefbrain.com/ deo, a drugi to nema. Sustinska razlika je u ponasanju poslednja

dva linka. Dok prvi uvek vodi do stranice strana1.html na web sajtu

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:

2

Page 24: Web Dizajn Skripta

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.

3

Page 25: Web Dizajn Skripta

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

recima, imacete dva fajla: vas HTML fajl i jedan odvojeni graficki fajl. Posao browsera je da

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:

1

Page 26: Web Dizajn Skripta

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.

2

Page 27: Web Dizajn Skripta

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 Daje ovu boju

#000000 Crna

#FFFFFF Bela

#FF0000 Crvena

#00FF00 Zelena

#0000FF Plava

#FF00FF Magenta

#00FFFF Cijan

#FFFF00 Zuta

1

Page 28: Web Dizajn Skripta

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.

2

Page 29: Web Dizajn Skripta

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.

3

Page 30: Web Dizajn Skripta

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:

1

Page 31: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

2

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

Page 32: Web Dizajn Skripta

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.

3

Page 33: Web Dizajn Skripta

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:

1

Page 34: Web Dizajn Skripta

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:

2

Page 35: Web Dizajn Skripta

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>

3

Page 36: Web Dizajn Skripta

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.

4

Page 37: Web Dizajn Skripta

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.

1

Page 38: Web Dizajn Skripta

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, pozadine…U

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 (declaration) - parametri i vrednosti se kombinuju cineci

deklaraciju.

• 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

Interni stilovi koriste tag <STYLE> postavljen ispod </HEAD> taga i pre <BODY> taga u

standardnom HTML dokumentu:

2

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

Page 39: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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

3

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

<STYLE>

BODY {background: #ff0000; color: #000000;}

H1 {font: 14pt verdana; color: #cccccc;}

P {font: 12 pt times;}

A {color: #00ff00; text-decoration: none;}

</STYLE>

Page 40: Web Dizajn Skripta

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.

4

Page 41: Web Dizajn Skripta

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 Naziv Boja Velicina Cena Opis

1 Nike Patike Crna 45 2000 Neki opis

2 Adidas Patike Bela 43 3000 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 Naziv Boja Velicina Cena Opis

1 Nike Patike Crna 45 2000 Neki opis

2 Adidas Patike Bela 43 3000 Neki opis

3 Nike Patike Bela 45 2000 Neki opis

4 Adidas Patike Crvena 44 3000 Neki Opis

1

Page 42: Web Dizajn Skripta

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 Naziv Boja Velicina Cena Opis

1 Nike Patike Crna 45 2000 Neki opis

2 Adidas Patike Bela 43 3000 Neki opis

3 Nike Patike Bela 45 2000 Neki opis

4 Adidas Patike Crvena 44 3000 Neki Opis

5 Nike patike Crna 42 2000 Neki Opis

6 Nike Patike Crna 43 2000 Neki opis

7 Nike Patike Crna 44 2000 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:

2

Page 43: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

Prodjimo sada kroz proces dodavanja podataka u tabele koji smo imali u prethodnom

primeru.

master

id naziv cena opis

1 Nike Patike 2000 Neki opis

2 Adidas Patike 3000 Neki Opis

boje

id boja

1 Crna

2 Bela

velicine

id velicina

1 45

2 43

Sada pretpostavimo da su u magacin stigle Nike Patike bele boje i Adidas Patike crvene

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

izgledati nase tabele:

master

id naziv cena opis

1 Nike Patike 2000 Neki opis

3

master-id-naziv-cena-opis

boje-id-boja

velicine-id-velicina

Page 44: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

id naziv cena opis

2 Adidas Patike 3000 Neki Opis

boje

id boja

1 Crna

2 Bela

1 Bela

2 Crvena

velicine

id velicina

1 45

2 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 naziv cena opis

1 Nike Patike 2000 Neki opis

2 Adidas Patike 3000 Neki Opis

boje

id boja

1 Crna

2 Bela

1 Bela

2 Crvena

4

Page 45: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

velicine

id velicina

1 45

2 43

1 42

1 43

1 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

5

Page 46: Web Dizajn Skripta

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!

6

Page 47: Web Dizajn Skripta

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

1

Page 48: Web Dizajn Skripta

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.

2

Page 49: Web Dizajn Skripta

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)

1

Page 50: Web Dizajn Skripta

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:

2

Page 51: Web Dizajn Skripta

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

3

Page 52: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

4

Page 53: Web Dizajn Skripta

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.

1

Page 54: Web Dizajn Skripta

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

mesec 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, 15:30 casova 30. decembra1973. godine

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.

2

Page 55: Web Dizajn Skripta

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.

3

Page 56: Web Dizajn Skripta

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

master_name name_id, date_added, date_modified, first_name, last_name

job_function job_id, name_id, job_function

company company_id, name_id, company_name

address add_id, name_id, street, city, state, post_code, type

telephone tel_id, name_id, country_code, number, type

fax fax_id, name_id, country_code, number, type

email email_id, name_id, email, type

personal_notes 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

1

Page 57: Web Dizajn Skripta

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

insensitivna 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

2

Page 58: Web Dizajn Skripta

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.

3

Page 59: Web Dizajn Skripta

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

);

4

Page 60: Web Dizajn Skripta

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

5

Page 61: Web Dizajn Skripta

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:

6

Page 62: Web Dizajn Skripta

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

);

7

Page 63: Web Dizajn Skripta

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

);

8

Page 64: Web Dizajn Skripta

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 doesn’t match value count at row 1

1

Page 65: Web Dizajn Skripta

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.

2

Page 66: Web Dizajn Skripta

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.

1

Page 67: Web Dizajn Skripta

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

2

Page 68: Web Dizajn Skripta

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.

3

Page 69: Web Dizajn Skripta

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 Znacenje

= Jednako

!= Razlicito

<= Manje ili jednako

< Manje

>= Vece ili jednako

> Vece

AND Logicko I

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

4

Page 70: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

mysql> select * from fruit;

+----+--------------------------+

| id | fruit_name |

+----+--------------------------+

| 1 | apple |

| 2 | banana |

+----+--------------------------+

2 rows in set (0.05 sec)

mysql> select * from color;

+----+-------------------------+

| id | color_name |

+----+--------------------------+

| 1 | red |

| 2 | 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| apple | 1 | red |

| 2| banana | 1 | red |

| 1| apple | 2 | yellow |

| 2| banana | 2 | yellow |

+----+----------------+----+------------------+

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.

5

Page 71: Web Dizajn Skripta

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

| banana | yellow |

+----------------+------------------+

2 rows in set (0.06 sec)

6

Page 72: Web Dizajn Skripta

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

| 2| banana | 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’.

1

Page 73: Web Dizajn Skripta

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

| 2| banane | 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:

2

Page 74: Web Dizajn Skripta

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

mysql> select * from fruit;

+----+----------------+--------------+

| id | fruit_name| status |

+----+----------------+--------------+

| 1| apple | zrelo |

| 2| pear | 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 | zrelo |

| 2| pear | zrelo |

| 3| orange | 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]

3

Page 75: Web Dizajn Skripta

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

| 2| pear | 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)

4

Page 76: Web Dizajn Skripta

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)

5

Page 77: Web Dizajn Skripta

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:

1

Page 78: Web Dizajn Skripta

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]

2

Page 79: Web Dizajn Skripta

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.

3

Page 80: Web Dizajn Skripta

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.

4

Page 81: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

1. Primer PHP­ovog koda, istorijat i buducnost

Primer PHP­ovog koda

Pocnimo najjednostavnijim primerom sa jednim redom  ­ cilj nam je da prikazemo da su PHP­ove strane mesavina tri stvari: teksta, HTML­ovog koda i PHP­ovog skripta. Strane koje sadrzePHP­ov skript razlicite su od strana koje sadrze samo HTML, i da bi bile prepoznatljive, cuvajuse sa oznakom tipa .php (ili nesto slicno) na serveru i izvrsava ih PHP­ovo okruzenje koje radina serveru. Rezultat izvrsenog skripta prikazuje se u web browseru kao HTML kod.Isprobajte prvi primer programa:1. Otvorite tekst editor i unesite sledece:

2. Sacuvajte ovo kao fajl example1.php u root direktorijumu Web servera.3. Zatim otvorite Web browser i unesite celu adresu vaseg Web Servera i ime upravo

napravljenog skripta: http://localhost/example1.php 4. U web browseru pojavice se nesto slicno sledecem:

1

<HTML><HEAD><TITLE>Moj prvi PHP skript!</TITLE></HEAD><BODY>Danasnji datum je: <?php echo date("d M Y");?></BODY></HTML>

Page 82: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Kao sto smo rekli pre ovog primera, ciljamo da prvo prikazemo tri razlicita tipa koda koji sekoristi na ovoj strani. Dakle, pogledajmo kod koji smo uneli i dodelimo svaku od tri kategorije:

Kod sa cistom pozadinom u stvari i nije kod, to je obican tekst. Kod sa svetlom (zutompozadinom) jeste HTML. Kod sa tamnom pozadinom (plavom) je PHP skript.

PHP skript je oznacen uglastim zagradama i znakovima pitanja. Dakle, svaki put kada viditedeo koda koji je okruzen oznakama <?php ?>, znate da sve unutar njih mora da bude PHPkod. Kao sto mozete videti iz rezultata u Web browseru, tri tipa sadrzaja sasvim lepo zivezajedno na Web strani.

Znam, pitate se sada kako je <?php echo gmdate(“M d y”)?> iz naseg skripta postalo 28 Feb2006? Odgovor na ovo pitanje uvodi vas u cudesni svet PHP­a. Dobro dosli! 

Evo sta se dogodilo: Kada ste u adresnu liniju web browsera unelihttp://localhost/example1.php i pritisnuli ENTER, poslali ste zahtev Web serveru da vamprikaze stranicu example1.php i posle nekoliko trenutaka dobili ste rezultat. U tih nekolikotrenutaka Web Server je imao pune ruke posla. Najpre je iz oznake tipa (.php) shvatio da se neradi o obicnom fajlu, vec o PHP skriptu, sto ga je podstaklo da posebno obrati paznju na njegovsadrzaj i potrazi oznake za PHP kod “<?php” i “?>”, a usput je procitao sve sto je izvan tihoznaka jer Web server razume HTML i obican tekst. Kada je naisao na “<?php”, pozvao je PHPmasinu i prosledio joj sve sto je pronasao do zatvarajuce PHP oznake “?>”, jer on sam nerazume PHP. PHP masina je preuzela dobijeni kod 

echo date("d M Y"); 

pisan na jeziku koji ona savrseno razume, i prevela serveru njegovo znacenje: ­ Izraz koji si midao govori da treba odstampati na ekranu “28 Feb 2006”. Web server se zahvalio PHP masinina pomoci i sada je imao kompletan odgovor za vas koji je prikazao u web browseru. 

Ostaje samo da se demistifikuje nacin na koji je PHP masina prevela izraz echo date("d M Y");u “Odstampaj na ekranu 28 Feb 2006”. Najpre, kako je PHP znao da treba stampati nesto naekranu? To je saznao iz reci “echo” koja predstavlja PHP­ovu funkciju za stampanje svega stoiza nje sledi do znaka “;” ili do zatvarajuce PHP oznake. Zatim je presao na date("d M Y"),pozvao je svoju ugradjenu funkciju “date” i rekao joj: ­ Treba mi danasnji datum sa danom umesecu u obliku dve cifre (d), tri prva slova od imena meseca (M) i cetvorocifrenom godinom(Y) i neka budu poredjani tako da prvo bude dan, zatim mesec i na kraju godina a izmedju njihostavi po jednu prazninu (“d M Y”). Tako je nastao datum “28 Feb 2006”. 

Posto ste upoznali osnovni princip funkcionisanja PHP­a na webu, mozemo se otisnuti udetaljnije upoznavanje ove briljantne tehnologije. Pocnimo sa nekoliko istorijskih podataka i

2

<HTML><HEAD><TITLE>Moj prvi PHP skript!</TITLE></HEAD><BODY> Danasnji datum je: <?php echo date("d M Y");?> </BODY></HTML>                                                                                                             

Page 83: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

kratkim pogledom u sadasnjost i buducnost.

Istorijat i buducnost

Sve je pocelo 1995. godine, kada je Rasmus Lerdorf zapoceo rad na PHP/FI ­ PersonalHomepage Tools/Form Interpreter. Verovatno nije ni sanjao da ce njegov rad prouzrokovatinastajanje PHP­a koji danas koriste milioni ljudi. Prva verzija PHP/FI sastojala se iz kolekcijePERL skripti cija je osnovna uloga bila prikupljanje podataka iz web formi i nedostajale su jojneke osnovne neophodne funkcije, kao sto je na primer for petlja. 

Unapredjenje dolazi u verziji PHP/FI 2, ali je skoro kompletan razvoj i dalje radio jedinoRasmus. Po izlasku nove verzije u Novembru 1997. godine, Andi Gutmans i Zeev Suraski otkrilisu PHP/FI dok su tragali za jezikom koji ce im olaksati izgradnju e­commerce aplikacije uokviru studentskog projekta na kojem su radili. Kako je PHP/FI bio Open Source projekat,mogli su da analiziraju njegovu strukturu. Zakljucili su da PHP/FI nije toliko mocan koliko je toizgledalo na prvi pogled,  jer su mu nedostajale mnoge uobicajene funkcije. Interesantno jespomenuti na koji nacin je PHP/FI radio sa while petljom. Posebno prilagodjen leksicki skenerisao je kroz skript i kada bi naisao na kljucnu rec while pamtio bi njenu poziciju, zatim binastavio sa izvrsavanjem koda sve dok ne naidje na oznaku za zavrsetak while petlje i u tomtrenutku bi se vracao na upamcenu poziciju i ponovo izvrsavao isti kod.

Zeev i Andi su odlucili da kompletno prerade ovaj skriptujuci jezik i u tom cilju udruzili susvoje snage sa Rasmusom. Tako nastaje PHP 3 – Hypertext Preprocessor. Novo ime naglasavaPHP kao nov proizvod namenjen siroj publici, a broj 3 odaje priznanje prethodnim verzijama.Zeev i Andi su dizajnirali sasvim novi API (Application Program Interface) za prosirenja koji jeomogucio jednostavno dodavanje funkcionalnosti PHP­u kao sto su komunikacija sa bazamapodataka, “spell checker”­i i mnoge druge korisne ekstenzije. To je privuklo mnoge programerekoji nisu bili deo core tima da se prikljuce PHP projektu. U vreme kada je nastao PHP3 u Junu1998., procenjuje se da je postojalo oko 50,000 domena sa instaliranim PHP­om. PHP3oznacava pocetak velikog proboja PHP­a na trzistu, jer to je prva verzija koja je dostigla bazuod preko milion domena na kojima je instalirana.

Krajem 1998. Zeev i Andi su, posmatrajuci svoj rad na PHP­u 3, osetili kako su sposobni danaprave mnogo bolji skriptujuci jezik i tako su zapoceli jos jedan ciklus ponovne izgradnjejezika iz koga je rodjen PHP4. Dok je PHP3 parsirao (tumacio, prevodio) skriptove u tokuizvrsavanja, PHP4 doneo je sasvim novu paradigmu ­ “prvo kompajliraj (prevedi), pa ondaizvrsavaj”. Proces kompajliranja nije prevodio PHP u masinski kod; umesto toga on ga jeprevodio u bajt kod koji je zatim izvrsavan pomocu Zend Engine­a (naziv je nastao od imenaZeev & Andi). Zend Engine se moze smatrati novim srcem PHP­a. Zbog novog nacinaizvrsavanja skripti, PHP4 je dobio mnogo bolje performanse u odnosu na PHP3, uz vrlo malenekompatibilnosti. Pored mnogih poboljsanja, napomenimo samo unapredjen API za prosirenjasa boljim performansama u toku izvrsavanja, Web Server Abstraction Layer  koji je omoguciorad PHP­u na svim popularnim Web serverima... PHP4 zvanicno je realizovan 22. Maja 2002. ido danas je instaliran na preko 15 miliona domena!

Nije proslo dugo vremena da bi se pojavio novi izazov pred tvorcima PHP­a. Sve veca upotrebaPHPa u slozenim aplikacijama, zahtevala je unapredjenje jezika u odnosu na ObjektnoOrijentisano programiranje. Andi je dosao na ideju da kompletno zameni Objektno­Orijentisanideo PHP­a. Zeev i Andi su napravili dokument pod imenom “Zend Engine II: Opsti pregledfunkcionalnosti i Dizajn” i ubrzo krece vrela diskusija o buducnosti PHP­a. Iako je osnovni jezikostao isti, mnoge funkcionalnosti su dodate, promenjene ili odbacene u toku nastajanja sledeceverzije PHP­a koja nosi ime PHP5.

3

Page 84: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

PHP5 je doneo mnoge novine i od njega se ocekuje da odrzi vodecu poziciju PHP­a, ali i dapoveca ucesce PHP­a na trzistu softvera. On ne samo da donosi revoluciju u Objektnoj­orijentaciji PHP­a, vec sadrzi i mnoge nove funkcionalnosti zbog kojih PHP postajenezaobilazna platforma za razvoj web aplikacija. Potpuno novi nacin rada sa XML­om postavljaPHP rame uz rame sa drugim web tehnologijama u pojedinim  segmentima, a u nekim ih cak iprevazilazi. Tu su i SOAP (Simple Object Access Protocol), MySQLi i mnoge druge ekstenzijekoje predstavljaju veoma vazne osnove za podrsku drugim tehnologijama. PHP5 ima predsobom blistavu buducnost i zato ne oklevajte da se upustite u upoznavanje jezika kojim govoreaplikacije na Google­u, Yahoo­u, Amazon­u...

4

Page 85: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

2. Promenljive

Vreme je da pocnemo upoznavanje razlicitih delova PHP­a, koje morate znati da biste pisaliprograme na ovom jeziku. Mozda je najosnovnija jedinica u programiranju promenljiva.Promenljiva je, najjednostavnije objasnjeno, mesto u memoriji ostavljeno da cuva informaciju, idodeljen joj je identifikator od strane programera. Sve PHP promenljive pocinju znakom zadolar '$'. Da biste dodelili vrednost promenljivoj, mozete koristiti znak jednakosti ili operatordodele '='. Da biste napravili promenljivu u PHPu i dodelili joj vrednost mozete da uraditesledece: 

Identifikator promenljive je $author i dodeljena joj je tekstualna vrednoost WilliamShakespeare. Mozete takodje i da dodeljujete brojeve promenljivama:

Ovde smo zakomplikovali ime promenljive $number_of_digits_on_one_hand, ali i pored toga,dodela se ne razlikuje mnogo od onoga sto smo prethodno uradili. Razlika je u tome da sadabrojna vrednost nema znake navoda. Ovo govori PHPu da treba da je tretira kao brojnuvrednost; dalja intervencija od strane programera nije potrebna da kaze PHPu da je vrednostbroj.

Jednom kada ste napravili promenljivu, slobodni ste da je koristite u programu kako god zelite.Da bi ste je prikazali na ekranu koristeci funkciju echo(), radite sledece:

Ogranicenja u imenima promenljivih 

Postoje neka ogranicenja kako mozete i kako ne mozete da zovete promenljive. U mnogimjezicima postoji ogranicenje velicine imena, obicno 255 ili 1000 znakova; PHP medjutim nematakvo ogranicenje. Verovatno cete primetiti da nije potrebno da idete preko 50 znakova, i da je20­30 sasvim dovoljno.

Prvo ogranicenje jeste da imena promenljivih moraju poceti slovom ili donjom crtom (neracunajuci znak za dolar, koji i nije striktno ime promenljive). Drugo ogranicenje je da imepromenljive mora da se sastoji od brojeva, slova i donjih crta. Drugi znakovi, kao sto su +, ­, *,i & nisu dozvoljeni i izazvace gresku na vasoj web strani. Pored toga manje vise ste slobodni dadajete imena promenljivama kako zeelite. 

1

$author = “William Shakespeare”;

$number_of_digits_on_one_hand = 5;

echo $author;

Page 86: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Osetljivost na mala i velika slova

Promenljive nisu tako jednostavne kao sto izgledaju na prvi pogled. Jedan problem koji obicnomuci pocetnike u PHPu jeste osetljivost na mala i velika slova u imenima promenljivih.Najjednostavniji nacin da se to objasni jeste mali deo koda:

Gornja dva reda prave dve odvojene promenljive, jednu koja se zove $author i drugu $Author.Ove dve promenljive imaju dve razlicite vrednosti i stvarno su razlicite isto kao da ste koristilisledeci kod:

Veoma cesto to utice na izgled rezultata na Web strani ako slucajno stavite veliko slovo tamogde ga niste koristili ranije. Ako ste nameravali da koristite jednu promenljivu, onda treba dase koristi sledeci kod:

Prvi red postavlja vrednost promenljive $author na Jovan Jovanovic Zmaj, dok ce drugi redpotpuno promeniti sadrzaj promenljive $author u tekst Ivo Andric. Ovim kodom bice stvorenasamo jedna promenljiva.

Tipovi podataka

Usredsredicemo se na dva tipa promenljivih, one koje sadrze brojevne vrednosti, i one kojesadrze tekstualne vrednosti. U stvari, postoji jos nekoliko tipova promenljivih, poznatijih kaotipovi podataka, koje PHP koristi, kao sto su nizovi i objekti, ali o njima cemo kasnije govoriti.

Tipove podataka ne definise programer, vec PHP odlucuje za vas kada interpretira Web stranu,kog tipa podataka promenljiva treba da bude i dodeljuje ih shodno tome. Ovi razliciti tipovipodataka koriste se u PHPu da bi oznacili razlicite tipove informacija koje mogu da se cuvaju, irazlicite operacije koje mogu da se izvrse nakon ove informacije.

Podaci tipa string

Podaci tipa string sadrze tekstualne informacije ili reci, i mogu da sadrze cele recenice. Sve stose nalazi izmedju znakova navoda, automatski postaje tekst. Sledeca dva primera su stringovi:

Nema veze sto je druga vrednost u primeru broj, jer jednom kada je izmedju znakova navoda,automatski postaje string. Ako dodelite odredjenu vrednost stringu, onda da biste izvrsili

2

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

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

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

$car_type = “Cadillac”;$engine_size = “2.6”;

Page 87: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

matematicke operacije nad njim, PHP ce morati da primeni neku vrstu konverzije da bi gapretvorio u broj. Rezultat ovoga je da sabiranje stringova kao da su brojevi moz da dovede doneocekivanih rezultata. Ako ipak zelite jedan string da dodate drugom, a ne da ih saberete,PHP ima nacin na koji to mozete uraditi.

Spajanje stringova

Spajanje stringova je proces dodavanja jednog stringa drugom, tj. dodavanje jednog stringa nakraj drugog. Koristite znak . (tacka) kao operator spajanja, da biste izvrsili operaciju. Ovaj red:

bi dao rezultat Cadillac2.6, ako pritom pretpostavimo da smo koristili promenljive izprethodnog primera.

Govoreci sa stanovista estetike, cinjenica da nema razmaka izmedju dva stringa moze da se nesvidi dizajnerima. Dakle, pravimo promenljivu koja sadrzi jedan prazan znak:

Treba da zapazite da se ovo veoma razlikuje od praznog stringa. Prazan string ne sadrzi basnista, dok string sa razmakom sadrzi znak, iako nevidljiv. Razmaci mogu da se dodaju kao isvaki drugi tekst:

Ovo ce proizvesti zeljeni, lepo odvojeni tekst Cadillac 2.6.

Brojevni tipovi

Postoje dva razlicita brojevna tipa podataka, integer i double. Integer su celi brojevi, dok sudouble racionalni brojevi. Evo nekih primera oba tipa:

Dakle, trebalo bi da zakljicite iz gornjih primera da je ceo broj automatski integer, dok bilo stasa zarezom odmah postaje racionalan tip podataka.

3

$car = $car_type . $engine_size;

$space = “ “;

$car = $car_type . $space . $engine_size;

$an_integer = 33;$another_integer = ­5797;

$a_double = 4.567;$another_double = ­23.2;

Page 88: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Proste matematicke operacije

Postoji skup numerickih operatora koje mozete da koristite u PHPu da biste izvrsavalimatematicke operacije. Svi oni su vrlo poznati operatori i poznaje ih svako ko je ikada u skoliimao matematiku. Oni izgledaju ovako:

Operator Operacija

+ Operator sabiranja

* Operator mnozenja

­ Operator oduzimanja i unarni operator za negativne brojeve

/ Operator deljenja

% Operator modula (ostatak pri deljenju) na primer 8 % 5 = 3

Njihova upotreba potpuno je identicna onoj koju znamo iz matematike, pa je ovde necemoposebno objasnjavati.

Jos malo o operatorima koji se koriste u PHPu

Pored operatora koji se koriste u prostim matematickim izracunavanjima i operatora zadodavanje stringova, PHP poseduje i razne druge operatore koji su neophodni u programiranju.Upoznajmo se sa najvaznijim.

Operator dodele (=) omogucava dodeljivanje vrednosti promenljivama. Evo primera kako sekoristi operator dodele:

Promenljivoj $counter dodelili smo vrednost 5. Pored toga, postoje neke varijacije upotrebeoperatora dodele pri cemu se moze kobminovati sa nekim drugim operatorom, kao na primer:

 

4

$counter = 5;

$counter += 2; // ovo je identicno operaciji $counter = $counter + 2;  na                              //  vrednost promenljive $counter dodali smo vrednost $counter                        //  i jos 2$offset *= $counter; //ovo je identicno operaciji $offset = $offset * $counter;

Page 89: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Operatori Poredjenja omogucavaju utvrdjivanje odnosa izmedju dve vrednosti. Sledeca tabelaprikazuje operatore poredjenja:

Operator Operacija

== Jednako je

!= Nije jednako

> Vece od

< Manje od

>= Vece ili jednako od

<= Manje ili jednako od

Logicki operatori 

Operator Operacija

&&, and Logicko I 

||, or Logicko ILI

xor Logicko ekskluzivno ILI (XOR)

! Logicka negacija

Operatori inkrementiranja i dekrementiranja

Operator Operacija

$var++ Inkrementiranje – uvecavanje promenljive $var za jedan

$var ­­ Dekrementiranje – umanjivanje promenljive $var za jedan

Konstante

Do sada smo upoznali vrednosti koje bismo mogli da promenimo na neki nacin nakon sto smoih dodelili promenljivama. Na primer, promenljiva $author koju smo napravili ranije savrednoscu “Jovan Jovanovic Zmaj”, moze biti promenjna za tren oka u “Radoman Kanjevac”.Na primer:

A sta ako niste zeleli da se to desi? Neke vrednosti nikada ne traba da se menjaju, kao naprimer:

5

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

$freezing_point_centigrade = 0;$serbian_capitol = “Beograd”;

Page 90: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Takodje mozda cete zeleti da definisete neke vrednosti u kodu koje ocigledno nisu fiksne, ali suipak nepromenljive. Na primer:

PHP ima specijalnu funkciju koja vam omogucava da napravite identifikator koji ima vrednostkoju niko ne moze promeniti. Ovakvi identifikatori se zovu konstante. Nacin na koji se pravekonstante nesto je drugaciji od postupka kreiranja promenljivih. Konstante traze specijalnukljucnu rec define koja ce ih kreirati. Ispred konstanti ne treba stavljati znak za dolar. Evo kakose pravi konstanta:

Imena konstanti se po konvenciji pisu velikim slovima da biste ih u programu lako prepoznali.Da biste napravili konstantu koja sadrzi tekst, samo cete staviti vrednost konstante pod znakenavoda:

Konstante mozete dodeljivati vrednostima promenljivih, ispisivati na ekranu i raditi sa njimasve sto i sa promenljivama, osim sto im ne mozete menjati vrednost u toku izvrsavanjaprograma. Evo primera:

6

$database_address = “localhost”;

define(“FREEZINGPOINTCENTIGRADE”, 0);

define(“SERBIAN_CAPITOL”, “Beograd”);

echo “Glavni grad Srbije je: ”.SERBIAN_CAPITOL;

Page 91: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

3. Uzimanje podataka od klijenta iz Web formulara

Verovatno jedan deo HTMLa koji izaziva najvise zbrke i teskoca jesu formulari. Ovo je najvisezbog sledece cinjenice: Da biste mogli da manipulisete podacima iz formulara, morate dakoristite neku drugu tehnologiju za uzimanje podataka. Ovo moze da ide od jednostavnihskript jezika, kao sto je JavaScript, ili tehnologije kao sto su Active Server Pages, ili aplikacijekao CGI, ili celokupnog jezika kao sto su Java Servlets. Da bismo pravilno implementiraliobradu klijent­server komunikacije, nije dovoljno da se samo uzmu informacije od korisnika ikasnije se odgovori na njih. Ispravan klijent­server interfejs treba da obradi informacije i vratiih korisnicima dok oni cekaju.

U ovom poglavlju upoznacemo se sa nacinima koje koristi PHP da bi obradio zahteve kojipristizu iz web formi. Ako se prisetite HTMLa seticete se da postoje dva nacina za slanjepodataka od klijenta ka serveru: GET i POST. Nacin na koji se informacije salju na serverkontrolise atribut METHOD u FORM tagu.

ili

METHOD = 'GET'

Pocecemo sa vrednoscu GET atributa METHOD. Ovo govori Web browseru da doda vrednosti,koje je korisnik upisao u formu, na URL adresu. Da bi to uradio, browser dodaje znak pitanjana kraj URL adrese da bi naznacio gde se zavrsava URL i pocinju informacije iz forme.Informacije iz forme se tada salju u obliku parova ime=vrednost. Neke stvari je lakse uocitinaprimeru nego ih objasnjavati:

Ovde je animal ime promenljive koju saljemo, a cat je njena vrednost. Ovo moze biti dodato naURL adresu ovako:

Web broser automatski dodaje informacije na URL adresu kada salje zahtev strani na webserveru. Deo koji je dodat na URL adresu zove se Query String ili string sa upitom.

METHOD='POST'

Jedan nedostatak koji ste mozda uocili iz Query stringova je prilicno javna priroda prenosa.Ako ne zelite da se informacije koje prenosite pojavljuju u URL adresi, onda cete morati da seoslonite na metod POST. On readi skoro isto kao i metod GET; razlika je u tome sto seinformacije iz forme salje u telu HTTP zahteva a ne kao deo URL adrese. Ovo znaci dainformacije nisu dostupne svakome, zato sto nisu dodate na URL adresu. Metod POST mozetakodje da prenese vecu kolicinu informacija – postoji ogranicenje u kolicini podataka koje

1

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

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

?animal=cat

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

Page 92: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

mozete preneti kao deo URL­a.

Da li da koristim metod GET ili POST?

Postoje razna misljenja o ovom pitanju; neki kazu da skoro nikada ne treba da koristite metodGET, zbog njegove nesigurnosti i ogranicenja u velicini; drugi tvrde da postoje slucajevi kadatreba koristiti GET. Ne postoje cvrsta pravila i preporuka je da GET koristite samo onda kadaznate da ce kolicina informacija koje se prenose biti uvek mala, a u svim ostalim slucajevimakoristite POST metod. Takodje, zabluda je da je POST metod sigurniji jer se podaci pri prenosune vide kao kod GET metoda! POST metod je samo malo diskretniji u prenosu od GETa, alipodaci koji se prenose POSTom vrlo su lako dostupni. 

Kako PHP prihvata podatke iz Formi?

Posto znamo kako se u HTMLu prave formulari i razlicite opcije za preuzimanje podataka, sadacemo se upoznati sa nacinom na koji PHP prihvata podatke iz Formi. Pogledacemo primere zasvaku kontrolu iz forme. Svi primeri u ovom delu zahtevace dve web strane. Prva strana uzimainformacije koje je uneo korisnik, a druga prihvata informacije na web serveru i odgovarakorisniku.

Koriscenje tekst polja:

1. Otvorite editor teksta i unesite sledeci HTML kod:

2. Sacuvajte ovo kao fajl text.html3. Zatvorite ovu datoteku i otvorite novu u editoru teksta i unesite sledeci kod:

2

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

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

Page 93: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao text.php5. Otvorite text.html u web browseru i unesite ime:

6. Pritisnite Submit Query i trebalo bi da vidite ime autora koje ste uneli prikazano kao nasledecoj slici:

Kako radi?

Pre nego sto pogledamo kod, pogledajte URL adresu na prethodnom ekranu (druga strana kojusmo napravili). Na kraj imena text.php dodat je Query String. Ovo je nesto sto je dodao webbrowser zato sto smo mu kao metod prenosa podataka naveli GET u fajlu text.html. Hajde dasada ispitamo nas string sa upitom. U primeru na ekranu je pisalo:

text.php?Author=Ivo+Andric

Vec smo rekli da su Query stringovi napravljeni od parova ime=vrednost. Ne treba biti SerlokHolms da bi se zakljucilo da je u ovom primeru Author ime a 'Ivo Andric' vrednost. Dakle,browser uzima ime HTML kontrole oznaceno sa name='Author' za ime promenljive koju

3

Page 94: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

prosledjuje, a vrednost koju smo uneli u polje kao vrednost promenljive.

Ovo je sve u vezi sa prvim programom, hajde da sada pogledamo drugi program, text.php. Toje u stvari samo jedan red teksta, pracen jednim redom u PHPu:

Red PHP koda prikazuje sadrzaj promenljive Author koja je prosledjena GET metodom i to seradi tako sto se navede ime metode sa imenom promenljive u uglastim zagradama:

$_GET[Author]

Ono sto smo uradili u ovom primeru jeste da smo napravili HTML tekstualno polje i dali muime Author. Kada smo poslali formu GET metodom na web server i PHP server, on je napravioasocijativni niz $_GET ciji su elementi parovi ime/vrednost polja sa forme. Da smo koristilimetod POST, umesto niza $_GET, bio bi formiran niz $_POST i vrednosti promenljive Authorbi pristupili ako napisemo $_POST[Author]. 

Kako rade podrucja za tekst (TEXTAREA):

1. otvorite program za editovanje teksta i unesite sledeci kod:

2. Sacuvajte ovo kao fajl textarea.html3. Zatvorite prethodni fajl, zapocnite sasvim novi i unesite sledece:

4

...Your favorite author is:<?php echo $_GET[Author];?>...

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

Page 95: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao textarea.php5. Otvorite u web browseru textarea.html i unesite imena nekoliko omiljenih Web lokacija:

6. Pritisnite dugme Submit Query kada unesete imena vasih Web lokacija. Trebalo bi da viditenesto slicno sledecem:

5

<HTML><HEAD></HEAD><BODY>Your favorite web sites are:<?phpecho $_POST[WebSites];?></BODY></HTML>

Page 96: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Kako rade polja za potvrdu – checkbox?

1. Pokrenite editor teksta i unesite sledeci kod:

2. Sacuvajte to kao checkbox.html3. Otvorite novi fajl u editoru i unesite sledece:

6

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

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

Page 97: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao checkbox.php5. Otvorite checkbox.html u web browseru

6. Zavisno od toga da li ste potvrdili (check­irali) polje ili ne pre nego sto ste poslali upit,dobicete jedan od dva moguca rezultata. Isprobajte oba slucaja i trebalo bi da dobijete sledece:

7

Page 98: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

U ovom slucaju treba obratiti paznju na jednu razliku od prethodnih primera. Kao vrednostpromenljive $_POST[Choice] pojavljuje se nesto sto nismo mi definisali. Ako je polje zapotvrdu potvrdjeno (checkirano), onda promenljiva sadrzi vrednost 'on'. Ako nije potvrdjeno,onda ne sadrzi nista.

Visestruka polja za potvrdu

Sta se desava ako zelite da koristite vise od jednog polja za potvrdu? Ako su vam poznata radiodugmad, znate da ce biranje jednog radio dugmeta u grupi, automatski pomeriti izbor sa bilokog dugmeta koje je bilo izabrano ranije na trenutni izbor. Polja za potvrdu ne rade tako.Njihova prednost je u tome sto se svako polje racuna kao posebna stavka, tako da mozetepotvrditi vise polja za potvrdu ili ne morate potvrditi ni jedno. Hajde da proverimo kako toradi. Vratimo se na prethodni primer i prepravimo ga da sadrzi nekoliko polja za potvrdu:

1. Otvorite editor i unesite sledece:

2. Sacuvajte ovo kao fajl checkboxes.html3. Otvorite novi fajl i unesite sledece:

8

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

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

Page 99: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao datoteku checkboxes.php5. Otvorite checkboxes.html i odaberite nekoliko opcija:

6. Posaljite upit i videcete sledeci rezultat:

Uocite da smo sada definisali vrednosti za checkboxove i te su se vrednosti stampale za onapolja koja smo potvrdili a nepotvrdjeno polje nema vrednost.

9

Page 100: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Kako rade Radio dugmad?

1. Otvorite editor teksta i unesite sledece:

2. Sacuvajte to kao datoteku radio.html3. Otvorite novi fajl i unesite sledece:

4. Sacuvajte ovo kao radio.php5. Otvorite radio.html u web browseru i odaberite odgovor:

10

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

<HTML><HEAD></HEAD><BODY><?phpecho "You selected the answer: $_GET[Question1]";?></BODY></HTML>

Page 101: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

6. Pritisnite Submit Query i pogledajte rezultat koji ste dobili:

Kako rade okviri sa listom – dropdown meniji?

Kao sto znate iz HTMLa, drop­down meniji mogu biti napravljeni tako da se moze odabratisamo jedna opcija iz liste, ili tako da se moze odabrati vise opcija u listi. Sledecim primerompokricemo oba slucaja.

1. Otvorite editor i unesite sledece:

11

Page 102: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

2. Sacuvajte to kao listbox.html3. Otvorite novi fajl i unesite sledece:

12

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

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

Page 103: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao listbox.php5. Otvorite listbox.html u web browseru i odaberite jednu opciju iz gornjeg menija i jednu ili

vise iz donjeg menija:

6. Pritisnite dugme Submit Query i u zavisnosti od toga sta ste odabrali, dobicete rezultat nasledecoj strani:

13

Page 104: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ako pazljivo pogledate dva menija koje smo napravili u prethodnom primeru, videcete da serazlikuju po imenu i atributu MULTIPLE koji govori da se u drugom meniju moze odabrati viseod jedne vrednosti. 

U imenu drugog menija imamo uglaste zagrade [] koje oznacavaju da se vrednosti odabrane umeniju smestaju u niz i tako prenose PHP­u. Mi smo taj niz dodelili promenljivoj pod imenom$engine_size koja je automatski postala niz koji sadrzi sve selektovane opcije iz liste.Pojedinacnim elementima niza pristupamo pomocu indeksa. Prvi element niza uvek ima indexnula, a sledeci je za jedan veci i tako do kraja niza. U nasem konkretnom slucaju, odabrane sudve opcije u listi i niz $engine_size sadrzi dva elementa: $engine_size[0] = 1.0L i $engine_size[1] = 1.4L. Da smo odabrali sve cetiri vrednosti, niz $engine_size bi sadrzao cetirielementa. Isprobajte razne opcije i brzo cete shvatiti kako ovo funkcionise.

Kako rade skrivena polja?

Kada koristite skrivena polja, ona se ne prikazuju na strani korisnika, ali se njihove vrednostiprenose na server isto kao i sva druga polja iz formulara. U sledecem primeru prikazacemodrop­down listu iz koje cemo odabrati jednu opciju, a skrivenim poljima prenecemo sve opcijeda bismo iz PHPa odstampali sve moguce opcije i odabranu opciju.

1. Otvorite editor teksta i unesite sledece:

2. Sacuvajte ovo kao hidden.php

14

<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 ashootout?";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=Hidden1VALUE='$Message1'>";echo "<INPUT TYPE=HIDDEN NAME=Hidden2VALUE='$Message2'>";echo "<INPUT TYPE=HIDDEN NAME=Hidden3VALUE='$Message3'>";echo "<INPUT TYPE=SUBMIT>";echo "</FORM>";?></BODY></HTML>

Page 105: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

3. Otvorite novi fajl i unesite sledece: 

4. Sacuvajte to kao datoteku hidden2.php5. Otvorite hidden.php u web browseru i odaberite jednu opciju iz liste:

6. Pritisnite dugme Submit Query da biste videli rezultate:

15

<HTML><HEAD></HEAD><BODY><?phpecho "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>

Page 106: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Koriscenje vrednosti koje su vracene iz formulara u PHP skriptovima:

Napravicemo formular za trazenje zajma koji pita za sumu novca koju osoba zeli da pozajmi,izracunava kolicinu novca koju zamisljena banka pod imenom NAMLLU moze da ponudi osobizavisno od njenih godina i plate. Dajemo im jednostavne da i ne odgovore na kraju proracuna.Sada cemo proci kroz kriterijum za prihvatanje zajma. Iako nasa formula za proracun zaprihvatanje zajma mozda izgleda slozena, u stvari je prilicno jednostavna, i nije zasnovana nina jednoj formuli neke kompanije.

Velicina zajma za osobu u nasem programu racuna se koristeci tri podatka, prema redosledukojim su navedeni:

● Prvi podatak je godisnja plata podeljena sa 5 da bi se dobila promenljiva pozajmljivanja● Drugi podatak je klijentov broj godina podeljen sa 10, pa oduzimamo ostatak pri deljenju

podeljen sa 10  i umanjujemo za jedan.● Zatim, oduzmemo jedan od drugog podatka da bismo dobili konacni drugi podatak, sto je

nasa promenljiva godina.● Formula uzima prvi podatak i mnozi ga drugim podatkom da bi se dobio treci i konacni

podatak, sto je promenljiva davanja zajma.

Proracun godina u drugom podatku znaci da je svako ispod 20 godina automatski iskljucen,zato sto ce formula uvek vratiti nulu ili manje od nule. Da bismo prosli kroz drugi deo formule,da prikazemo sledece:

Prvi Podatak * ((19/10 – (19%10)/10)­1) = Prvi Podatak * ((1.9 – 0.9) – 1)    = Prvi Podatak * 0 = 0

Prvi Podatak * ((9/10 – (9%10)/10)­1) = Prvi Podatak * ((0.9 – 0.9) – 1)    = Prvi Podatak * (­1) = ­ Prvi Podatak

Jednom kada pomnozimo prvi podatak sa drugim, dobijamo ukupnu sumu  i ako je ona visa odonoga sto osoba zeli da pozajmi, mi kazemo  DA, u drugom slucaju kazemo NE.

Da ponovimo, u ovom primeru trebace nam samo dve strane. Prva uzima detalje o zajmu izkojih cemo dobiti ime osobe, prezime, godine, adresu, platu i kolicinu novca koju zeli dapozajmi. Druga strana, nasa PHP strana, uradice izracunavanje i doneti presudu.

1. Otvorite editor teksta i unesite sledece:

16

Page 107: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

2. Sacuvajte to kao loan.html3. Otvorite novi fajl i unesite sledece:

17

<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 Submitapplication"><INPUT TYPE=RESET VALUE="Reset application form"></FORM></BODY></HTML>

Page 108: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Sacuvajte ovo kao loan.php5. Otvorite loan.html u web browseru i unesite neke detalje:

18

<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 willallow:$LoanAllowance<BR><BR>";if ($_POST[Loan] <= $LoanAllowance) echo "Yes,$_POST[FirstName] $_POST[LastName], we are delightedto accept your application";if ($_POST[Loan] > $LoanAllowance) echo "Sorry,$_POST[FirstName] $_POST[LastName], we cannot acceptyour application at this time";?></BODY></HTML>

Page 109: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

6. Pritisnite dugme Click here to Submit application i trebalo bi da vidite nesto poput ekranana sledecoj slici:

19

Page 110: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

20

Page 111: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

4. Uslovne naredbe ili naredbe grananja

Naredba IF

Vec smo pomenuli naredbu if u prethodnom poglavlju, a sada cemo pokazati kako ona zaistaradi. Apstraktno govoreci, naredba if funkcionise na sledeci nacin:

if (uslov je tacan) izvrsi red koda

Naredba if ce izvrsiti kod samo ako je uslov tacan. Ako uslov nije ispunjen, onda kod koji dolaziposle njega  nece biti izvrsen, a PHP ce preci na sledecu liniju koda. Pogledajmo primer izsvakodnevnog zivota:

if (pada kisa) uzmi kisobranizadji napolje

Druga linija koda ­ “izadji napolje”, se izvrsava bez obzira na uslov, ali uzimamo kisobran samoako pada kisa.

Ako zelite da izvrsite ceo blok koda u zavisnosti od nekog uslova, onda taj kod okruziteviticastim zagradama {}:

if (uslov je tacan) {izvrsi sve sto se nalazi unutar ovih zagradama

}

Dakle, da prosirimo primer sa kisobranom, rekli bismo:

if (pada kisa) {uzmi kisobranobuci kabanicu

}izadji napolje

I ovoga puta naredba ”izadji napolje” se obavezno izvrsava, a uzimamo kisobran i oblacimokabanicu samo ako pada kisa.

Hajde sada da pogledamo kako mozete da napravite uslove u zagradama da biste odlucili da lice se neki deo koda izvrsiti ili ne.

Logicke vrednosti

Pre nego sto krenemo dalje, neophodno je da uvedemo koncept logicke vrednosti. Do sada sunase promenljive mogle da sadrze brojeve ili tekst, ali logicke vrednosti se cuvaju upromenljivama treceg tipa, koje mogu da sadrze jednu od dve vrednosti: tacno(true) ilinetacno(false). Mozete definisati bilo koju promenljivu na neku od ove dve vrednosti:

$variable = true;

Medjutim, ako prikazete njenu vrednost na ekranu, videcete brojnu vrednost:

1

1

Page 112: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ali ako definisete promenljivu kao netacnu:

$variable = false;

ako pokusate da je odstampate na ekranu videcete da se nista nece odstampati. Dakle, kratkoreceno – false je nista.

Ako ne zelite da koristite kljucne reci true ili false u smislu tacno ili netacno, mozete ihzameniti brojevima 1 ili 0, pri cemu 1 oznacava tacno (true), a 0 oznacava netacno (false).Umesto true. mozete takodje koristiti bilo koji broj razlicit od nule.

Primenimo nauceno na primeru sa kisom:

Sacuvajte ovo kao kisa.php i pokrenite ga u vasem web browseru. Dobicete sledece:

2

<HTML><HEAD></HEAD><BODY><B>U zavisnosti od toga da li pada kisa, kada krenemna 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>

Page 113: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Posto je uslov $pada_kisa na pocetku dobio vrednost true, kod unutar if bloka je izvrsen. Isto bise dogodilo da ste, umesto vrednosti true, promenljivoj $pada_kisa dodelili neku od sledecihvrednosti:

$pada_kisa = 1; ili$pada_kisa = 18; ili$pada kisa = 1923;

Bitno je uociti da se vrednost true i bilo koji broj razlicit od nule u PHPu smatraju tacnimiskazom. Uobicajeno je da se kao tacno (true) koriste true ili 1, ali necete pogresiti ako koristitebilo koji broj razlicit od nule.

Ako vrednost promenljive $pada_kisa postavite na false ili na 0, deo koda unutar viticastihzagrada se nece izvrsiti, pa ce vas PHP skript ispisati sledece na ekranu:

Ranije smo naveli tabelu logickih operatora i operatora poredjenja koji se koriste u PHPu, asada cemo ih ponovo navesti jer se sada srecemo sa konkretnim situacijama u kojima se tioperatori koriste.

Operatori Poredjenja omogucavaju utvrdjivanje odnosa izmedju dve vrednosti. Sledeca tabelaprikazuje operatore poredjenja:

Operator Operacija

== Jednako je

!= Nije jednako

> Vece od

< Manje od

>= Vece ili jednako od

<= Manje ili jednako od

3

Page 114: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Logicki operatori pruzaju mogucnost izvodjenja logickih operacija

Operator Operacija

&&, and Logicko I 

||, or Logicko ILI

xor Logicko ekskluzivno ILI (XOR)

! Logicka negacija

Sada cemo prikazati primer koji obuhvata primenu navedenih operatora u PHPu:

Sacuvajte ovaj primer kao operators_example.html, a zatim napravite sledeci php skript:

4

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

Page 115: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

 

5

<?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 ilijednak 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 ilijednak nuli!<br>";}//operator "=="if ($number == 0) {

echo "Uneli ste NULU!<br>";}//operator "!="if ($number != 77) {

echo "Uneli ste broj koji je sigurno razlicitod 77!<br>";}//operator "AND"if ($number != 77 AND $number != 33) {

echo "Uneli ste broj koji sigurno nije ni 77 ni33!<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 nije77!<br>";}

?>

Page 116: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ga kao operators_example.php. Pokrenite operators_example.html u web browseru ieksperimentisite unosenjem razlicitih vrednosti i posmatranjem rezultata. Predlazem daunosite sledece vrednosti i da svaki put uocite sta je odstampano na ekranu i otkrijete zasto jebas to odstampano: ­10, 0, 10, 33, 77. 

Ovaj primer je pokazao osnovne nacine upotrebe logickih i operatora poredjenja, a ostaje samoda se naglasi da se ovi operatori medjusobno mogu kobminovati na najrazlicitije nacine.Eksperimentisite i videcete neogranicene mogucnosti stvaranja uslova za izvrsavanje pojedinihdelova koda u vasim programima.

Visestruki uslovi – naredbe ELSE i ELSEIF

Naucili smo kako se koristi naredba if za izvrsavanje odredjenog koda ako je neki uslov tacan. asta se desava ako zelimo da nam se jedan deo koda izvrsi ako je uslov tacan a drugi deo kodaako uslov nije tacan? Uvek mozete da okrenete uslov i napravite novu naredbu if, ali postoji imnogo laksi nacin da se to uradi. Naredba ELSE radi ovako:

if (uslov je zadovoljen) {izvrsi sadrzaj ovih zagrada

} else {izvrsi sadrzaj ovih zagradama

}

Vratimo se opet primeru sa kisom:

if (pada kisa) {uzimam kisobranoblacim kabanicuobuvam cipele za kisu

} else {obuvam cipele za suvo vreme

} izlazim napolje

Dakle, ako pada kisa, ulazimo u blok koda koji nam govori da uzmemo kisobran, obucemokabanicu i obujemo cipele za kisu, preskacemo deo koda koji je u okviru else bloka i izlazimonapolje. Ako kisa ne pada onda ne ulazimo u if blok koda vec u else, tamo obuvamo cipele zasuvo vreme i izlazimo napolje.

Hajde da krenemo korak dalje, sta se desava ako zelite da proverite vise razlicitih uslova iizvrsite tacno jedan od njih. To mozete izvesti pomocu vise if uslova koji idu jedan za drugim,ali mnogo je efikasnije ako u tu svrhu koristite ugradjenu PHPovu konstrukciju ELSEIF kojaradi na sledeci nacin:

if (uslov jedan je zadovoljen) {izvrsi sadrzaj ovih zagrada

} elseif (uslov dva je zadovoljen) {izvrsi sadrzaj ovih zagrada

} elseif (uslov tri je zadovoljen) {izvrsi sadrzaj ovih zagrada

} else {izvrsi sadrzaj ovih zagradama

}

6

Page 117: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Izvrsice se deo koda koji ide iza prvog tacnog uslova na koji PHP naidje, a svi ostali ce bitiignorisani. Ako ni jedan uslov nije ispunjen, bice izvrsen blok koji dolazi posle kljucne reci else.

Primenimo ovo da bismo prosirili primer sa kisom na razlicite vremenske uslove:

Sacuvajte ovo kao weather.html i otvorite sledeci fajl od koga cete napraviti sledeci PHP skript:

7

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

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

Page 118: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovaj fajl kao weather.php. Otvorite weather.html u web browseru, odaberite nekuopciju i pogledajte sta ce vam program preporuciti u vezi oblacenja. Ponovite eksperiment viseputa, birajte razlicite vremenske uslove i analizirajte sta je ispisano na ekranu i zasto se todogodilo. 

Ugnjezdavanje naredbi IF

Proces stavljanja naredbe if unutar druge if naredbe zove se ugnjezdavanje. Naredbe IFmozete neogranicen broj puta ugnjezditi i cesto su ovakve konstrukcije neophodne da bi seneki programski zahtevi zadovoljili. Uopsteno, ugnjezdavanje izgleda ovako:

if (uslov je ispunjen) {if (drugi uslov je ispunjen) {

izvrsi kod unutar ovih zagrada}

}

Hajde da sada uradimo primer koji koristi sve mogucnosti koje smo objasnili u ovom poglavlju,da bismo napravili formular za rezervaciju putovanja za nekoliko destinacija. On ce izracunaticenu u zavisnosti od vrste hotela i destinacije. Postojace tri destinacije: Prag, Barselona i Bec odkojih svaka ima razlicite cene. Postojace i dve vrste hotela u svakom gradu, sa tri i cetirizvezdice, s tim da je hotel sa cetiri zvezdice skuplji. 

Otvorite editor teksta i unesite sledeci kod:

8

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

Page 119: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovo kao holiday.html. Zatim otovrite novi fajl i unesite sledeci kod:

9

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

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

Page 120: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

10

echo "The cost for a week in $_GET[Destination] is $Price";

}else{

echo ("You've not entered a value fordestination, 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 fordestination, go back and do it

again");}

}else{

echo ("You've not entered a value for hotelgrade, go back and do it again");}

Page 121: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovo kao holiday.php, otvorite holiday.html u browseru i napravite neki izbor:

Pritisnite dugme Submit Query da biste videli cenu:

11

?></BODY></HTML>

Page 122: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

5. Provera ispravnosti sadrzaja formulara

U jednom od prethodnih poglavlja imali smo primer aplikacije za davanje zajma. Ako se malopoigrate sa njom lako cete zakljuciti da ju je moguce pokvariti ili prevariti unosenjembesmislenih podataka. Na primer, u okviru koji je pitao za godine, sta se desava ako unesete“sta te briga”? Savrseno je moguce da se to dogodi. Kako ce PHP program da se izbori sa ovim?Mozda zelite da pretpostavite da vasi korisnici imaju zdrav razum da ne unose nesto poputtoga, ali kada god stavite program u javnu upotrebu, bicete iznenadjeni raznolikoscu mogucihodgovora, od komicnih “999” do gramaticki neispravnih “ceteres' cetri”. Vi biste lako shvatilista je korisnik zeleo da kaze, ali vasem PHP programu takve stvari su besmislene. 

Nacin na koji ovo mozete da savladate jeste da ogranicite vrednosti koje su dozvoljene uodredjenom okviru za tekst. U nasem primeru, ako su godine neke osobe prenete upromenljivu $Age, pa smo mogli uneti proveru opsega godina koje se unose:

if ($Age<10 OR $Age>140){

echo "Incorrect Age entered ­ Press back button to try again";break;

}

naredba break ce prekinuti izvrsavanje programa. U svrhu prekida izvrsavanja programa mogliste da upotrebite i kljucnu rec exit na sledeci nacin:

if ($Age<10 OR $Age>140){

echo "Incorrect Age entered ­ Press back button to try again";exit;

}

Ako proveravamo formular i znamo da neko nije uneo korektnu vrednost za neko polje, nemapotrebe da proveravamo dalje, vec primenimo naredbu exit ili break za prekid programa.

Ovo je jedan od nacina za zastitu od pogresnog unosa, ali tako nismo pokrili sve mogucnosti zaizbegavanje loseg unosa podataka. 

Zlonamerni korisnici – funkcija HTMLSpecialChars

Ako je neki korisnik zlonameran, a takvih na zalost uvek ima, on ce pokusati da unese raznespecijalne karaktere pomocu kojih moze napraviti manje ili vise stete ako nas PHP program nijespreman da takve stvari spreci. Jedna od mogucnosti je da korisnik pokusa sa unosom htmltagova ili specijalnih kodova. Da bi smo ovo sprecili, PHP nam pruza sjajnu funkcijuHTMLSpecialChars() koja konvertuje sve HTML oznake u obicni tekst koji zelimo daprikazemo, i dok to radi, sprecava HTML oznake da budu interpretirane u WEB browseru kaoHTML kod. Takodje zaustavlja sve skriptove koji su uneseni u okvir za tekst da budu izvrseni.Ova funkcija se primenjuje na sledeci nacin:

$string = “<b>This won't display the Bold tags</b>”;$string = HTMLSpecialChars ($string);echo $string;Isprobajte ovaj kod i videcete kako radi HTMLSpecialChars funkcija.

1

Page 123: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

6. Petlje – while, do while, for

Do sada smo se upoznali sa osnovnim konceptom programiranja – odlucivanjem. Umesto daidemo kroz nas kod sekvencijalno, otkrili smo da mozemo izbeci izvrsavanje reda koda, ili cakcelih blokova koda. U ovom poglavlju upoznacemo nesto sto racunari najvise vole da rade – i ustvari ono za sta su i izmisljeni – izvrsavanje zadataka koji se ponavljaju. Ako morate daizvrsavate isti zadatak, svaki dan, svaki sat, ponovo i ponovo, pre ili kasnije cete da pogresite.Ako date slican zadatak racunaru i on ga dobro uradi prvi put, onda ce ga dobro uraditi i stotiput, hiljaditi put ili cak milioniti put. Koncentracija, zamor, interesovanje za zdatak za racunarsu potpuno nepoznate odrednice.

Mehanizam koji mnogi programski jezici, ukljucujuci i PHP, koriste za izvrsavanje ponavljanjajesu petlje. Postoje tri tipa petlji u PHPu i njih cemo upoznati u ovom poglavlju. Svaki tip petljikoristimo u razlicitim situacijama.

Petlje imaju slicnosti sa grananjem zato sto izvrsavanje dela koda zavisi od toga da li je uslovtacan ili netacan. Medjutim, petlje se razlikuju od uslovnih izraza zato sto sadrzaj petlje mozeda se izvrsava mnogo puta. Uslov se testira i kod u petlji se izvrsava ako je uslov tacan. Zatimse uslov ponovo ispituje; ako je i dalje tacan, kod u petlji se ponovo izvrsava, i mozda ponovo, itako u mnogo iteracija. Shvatili ste. Svaki prolazak kroz petlju zove se iteracija. 

Petlje WHILE

Pocecemo sa petljom while zato sto je najjednostavnija od sve tri petlje i ima neke slicnosti sanaredbom if. Kao i naredba if ona proverava rezultat uslova. U zavisnosti od toga da li je uslovtacan ili ne, deo koda (koji je smesten izmedju viticastih zagrada) nakon uslovnog izraza seizvrsava:

while (uslov je tacan) {izvrsi sadrzaj ovih zagrada

}

Nakon sto se sadrzaj petlje izvrsi, uslov na vrhu se ponovo testira i sve se ponavlja: ako je uslovispunjen, kod se izvrsava. Ako se ispostavi da je uslov netacan, kod u zagradama ce sezanemariti i PHP ce nastaviti sa prvim redom posle kraja zagrada. Hajde da vidimo primer upseudokodu:

while (mesec je pun) {kojoti ce zavijati

}

Dakle, ako mesec nije pun, onda kojoti nece zavijati, ali za svo vreme dok je mesec pun, oni cezavijati. 

Hajde da vidimo jedan primer koji prikazuje kako PHP radi sa while petljama. Napravicemoprogram koji sabira prvih 100 prirodnih brojeva:

1

Page 124: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovaj skript kao while.php i pokrenite ga u web browseru. Evo sta cete dobiti:

Kao sto mozete videti, pre svake iteracije smo proveravali da li je $number<=$how_many dabi videli da li smo u zbir uvrstili sve brojeve od 1 do 100, a unutar svake iteracije, posledodavanja tekuceg broja na ukupan zbir, povecavali smo tekuci broj za jedan. Kada smo sabralisvih 100 brojeva, petlja se vise ne izvrsava.

Zamislite kako je ovo revolucionarna stvar! Pretpostavite da vam je neko dao zadatak daizracunate prvih 1 000 000 0000 prirodnih brojeva, a da nije izmisljen obrazac za zbir prvih nclanova aritmetickog niza i da ne postoje racunari ni digitroni. Kakav bi to samo posao bio! Asve sto bi trebali da uradite kada imate PHP na svom racunaru, jeste da u prethodnom primerupromenljivoj $how_many date vrednost 1 000 000 000. Isprobajte i videcete koliko su petljevazne u programiranju.

Petlje DO WHILE 

Petlja do while je slicna petlji while, osim jedne stvari: uslov se proverava na kraju petlje, a nena pocetku. Ovo je suptilna, ali vazna razlika – sadrzaj zagrada bice izvrsen najmanje jednom,cak i kada je uslov netacan:

2

<?php$summary = 0;$number = 1;$how_many = 100;//Calculate sum of first $how_many natural numberswhile ($number <= $how_many) {

$summary = $summary + $number;$number ++;

}echo "Sum of first $how_many natural numbers is:$summary";?>

Page 125: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

do {izvrsi sadrzaj ovih zagrada

} while (uslov je tacan); ­ vrati se i uradi to ponovo

Zbog toga se petlja do while koristi onda kada zelite da prodjete kroz petlju bar jednom bezobzira na tacnost uslova. Ovo je vazno.

Petlje FOR 

Petlja for se najbolje koristi kada zelite da ponavljate delove koda odredjen broj puta. Drugimrecima, daje vam mogucnost da navedete koliko puta zelite da prodjete kroz petlju. Deo sauslovom je malo kompleksniji nego kod petlje while, posto se sastoji iz tri dela:

for (definisi brojac petlje; testiraj brojac petlje; dodaj ili oduzmi od brojaca;) {izvrsi sadrzaj ovih zagrada 

}

Petlja for uvodi koncept brojacca petlje. Ova promenljiva se koristi da bi se izbrojalo koliko seputa proslo kroz petlju (broj iteracija), i da bi se petlja zavrsila kada je definisani broj iteracijadostignut. Treci deo uslova obezbedjuje promenu vrednosti brojaca u svakoj iteraciji. Tri delauslova omogucavaju vam da napravite kompleksne uslove i petlje. 

Hajde da vidimo kako bismo sabrali prvih sto prirodnih brojeva pomocu for petlje:

Sacuvajte ovo kao for.php i pokrenite u browseru pa cete dobiti sledeci rezultat:

3

<?php$summary = 0;$how_many = 100;//Calculate sum of first $how_many natural numbersfor ($number = 1; $number <= $how_many; $number++) {

$summary = $summary + $number;}echo "Sum of first $how_many natural numbers is:$summary";?>

Page 126: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

7. Nizovi

Na kratko smo susretali nizove i do sada, ali sada je trenutak da ih i formalno upoznamo.Mozete napraviti nizove isto kao sto pravite promenljive, sve dok stavljate uglaste zagrade okonjih da biste uveli indeks elementa:

$states_of_europe[0] = “France”;$states_of_europe[1] = “Germany”;$states_of_europe[2] = “Switzerland”;

Ne morate da ih dodeljujete po redu:

$states_of_europe[55] = “Spain”;$states_of_europe[18] = “Italy”;

Ustvari, umesto brojevnih indeksa mozete da u potpunosti koristite stringove. Takvi nizovizovu se asocijativni:

$state_capitals[“france”] = “Paris”;$state_capitals[“switzerland”] = “Bern”;

Ako zelite da pristupite sadrzaju asocijativnog niza, mozete da izostavite znake navoda uindeksu. Da bi ste prikazali Paris na ekranu mozete uradititi sledece:

echo $state_capitals[“france”];

ili

echo $state_capitals[france];

Napomenimo da elementima nizova mozete dodeljivati brojevne ili tekstualne vrednosti.

Inicijalizacija nizova

Definisanje pocetnih vrednosti promenljivih u nizu jeste proces koji se zove inicijalizacija. Kodinicijalizacije nizova u PHPu ne moramo brinuti oko indeksiranja, vec mozemo prepustiti daPHP to uradi za nas:

$Author[] = “Ivo Andric”;$Author[] = “Momo Kapor”;

Bez uglastih zagrada PHP ne bi znao da se radi o nizu i zamenio bi prvu vrednost drugom.Uglaste zagrade naglasavaju da navedene vrednosti zelimo da smestimo u niz. Ako ne stavimoindekse, PHP samostalno odlucuje gde ce u nizu staviti nase vrednosti. Otkricete da ako nizAuthor nije koriscen ranije, onda ce gornje vrednosti biti smestene u $Author[0] i $Author[1].PHP ce nastaviti dodeljivanje vrednosti u sledeci element u nizu. 

Takodje, postoji i inicijalizacija kod koje eksplicitno mozemo sami dodeljivati vrednostiindeksa:

$Author[0] = “Ivo Andric”;$Author[1] = “Momo Kapor”;

1

Page 127: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ovde ne moramo da se povinujemo ogranicenjima automatskog dodeljivanja indeksa koje binam PHP nametnuo – mozemo da dodelimo vrednosti indeksa bez redosleda. PHP je razlicit odmnogih programskih jezika kada su nizovi u pitanju po dve stvari. Prvo, ne moramo dadefinisemo tip podataka u nizu. Ovo je konzistentno sa pravilima za promenljive u PHPu: nemorate da odredjujete tip, PHP to radi za vas. Drugo, ne morate da definisete koliko elemenatace niz imati. 

Postoje jos dva nacina inicijalizacije nizova i oba koriste naredbu array(). Ako zelimo danapravimo niz sa autorima, evo kako bi to uradili koristeci array():

$Author = array(“Ivo Andric”, “Momo Kapor”);

Jos jednom trazimo da PHP automatski definise vrednosti indeksa. Takodje vazi da indeksipocinju od nule i nove vrednosti se smestaju u niz tako sto im se dodeli najmanji slobodanindeks. 

Ako zelite da inicijalizujete asocijativni niz pomocu funkcije array(), to radite na sledeci nacin:

$state_capitals = array( “france” => “Paris”,“switzerland” => “Bern”,“italy” => “Rome” );

Iteracije kroz niz

Jednom kada ste napravili niz, ne zelite da se vracate i uzimate svaki clan pojedinacno, veccete pre imati potrebu da na neki nacin prolazite kroz sve elemente niza i nesto radite sanjima. Ovde na scenu stupa saradnja nizova i petlji. Pretpostavimo da imamo sledeci niz:

$states_of_europe = array (“France”, “England”, “Germany”, “Switzerland”, “Spain”, “Serbia”,“Italy”, “San Marino”, “Greece”, “Hungary”, “Austria”, “Poland”, “Russia”, “Belgium”, “Finland”,“Sweden”);

Ako zelimo da ispisemo imena svih ovih drzava na web strani, treba samo da napravimo petljufor da to uradi za nas. Ako znamo da niz ima 16 elemenata, evo primera koji ispisuje sveelemente na ekranu:

Sacuvajte ovaj primer pod imenom iteration.php i pozovite ga u web browseru, pa cete dobitisledece:

2

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

}?>

Page 128: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Na slican nacin, iteracije kroz niz mozemo vrsiti koristeci petlje while ili do while, a to mozete isami isprobati.

Petlje foreach

Postoji takodje i prosirenje petlje for u PHPu. To je poslednji tip petlji koji cemo pogledati –petlja  foreah. Koristite petlju foreach kada imate niz sa nepoznatim brojem elemenata. Petljaforeach ce ici do kraja niza. Ona ima dva oblika. Prvi je ovakav:

foreach ($array_name as $value) {izvrsi sadrzaj ovih zagrada

}

Ovo znaci da cemo za svaki clan niza proci po jednom kroz petlju i u svakom prolazupromenljivoj $value bice dodeljena vrednost tekuceg elementa niza, a mi sa tom vrednosumozemo da radimo sta nam je volja. 

Evo primera koji pokazuje kako se koristi foreach petlja za prolaz kroz niz:

3

Page 129: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

 

Sacuvajte ovo kao foreach.php i pokrenite ga u web browseru da biste dobili sledece:

Postoji jos jedan nacin upotrebe foreach petlje za prolazak kroz sve elemente niza i on jepogodniji za upotrebu kod asocijativnih nizova:

4

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

Page 130: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

foreach ($array_name as $index => $value) {izvrsi sadrzaj ovih zagrada

}

Ovo je isto kao prvi oblik sa dodatkom koji nam pruza pristup i indeksima i vrednostima niza.Pogledajmo primer:

Sacuvajte ga kao foreach2.php i pokrenite u web browseru pa cete dobiti sledece:

5

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

Page 131: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ovo je bilo osnovno upoznavanje sa nizovima koje cete jako cesto koristiti u svojimprogramima. Napomenimo da PHP ima jako mnogo ugradjenih funkcija za rad sa nizovima ipredlazem vam da pogledate PHP manual kako bi ste se bolje upoznali sa njima. Recimo samoda pomocu tih funkcija mozete sortirati nizove na razlicite nacine, pretrazivati ih u potrazi zanekom vrednoscu i mnoge druge korisne stvari. 

6

Page 132: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

8. Funkcije

Da biste definisali funkciju morate joj dati ime. U tu svrhu koristimo kljucnu rec function,pracenu imenom funkcije. Ako funkcija prihvata odredjene parametre, oni se stavljaju uzagrade iza imena funkcije. Kod koji cini telo funkcije smesta se u viticaste zagrade nakonparametara. Apstraktno govoreci to izgleda ovako:

function ime_funkcije(parametar1, parametar2, parametar3...) {

ovde ide kod funkcije...return neka_vrednost;}

Hajde sada da vidimo primer funkcije za izracunavanje poreza u PHP­u:

Sacuvajte ovo kao tax.php i kada ga pozovete u web browseru evo sta cete dobiti:

Funkcija moze da ima koliko god zelite redova, a da biste vratili neku vrednost iz funkcijekoristite kljucnu rec return na kraju funkcije pracenu vrednoscu koju vracate. Moze se dogoditida vasa funkcija nema sta da vrati u program koji je poziva i tada mozete staviti kljucnu recreturn na kraju funkcije bez ikakve vrednosti iza nje, da biste oznacili kraj funkcije. Ako vasafunkcija prihvata vise parametara, oni su odvojeni zarezima.

1

<?phpfunction tax ($price) {

$tax = ($price/100) * 18;return $tax;

}$price = 1000;$tax = tax($price);echo "For price $price tax is $tax";?>

Page 133: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Prenosenje vrednosti funkcijama

Prikazali smo kako funkcije koriste parametre za preuzimanje pojedinih ulaznih vrednosti, asada cemo upoznati na koje nacine se ti argumenti mogu prenositi. Postoje dva nacina zaprenosenje parametara: po vrednosti i po adresi. Kod prenosenja po vrednosti, mi funkcijiprenosimo samo vrednost odredjene promenljive i sve sto se sa njom desava unutar funkcije,ostatku programa nije vidljivo niti dostupno. Kod prenosenja argumenata po adresi, mi funkcijipredajemo adresu promenljive koju ona moze koristiti da bi pristupila toj promenljivoj i uradilanesto sa njenom vrednoscu. Posto u ovom slucaju funkcija pristupa fizickoj adresi promenljive itu vrsi promene, te promene su vidljive u programu izvan funkcije. 

To je osnovna razlika u prenosenju po adresi i po vrednosti koju je bitno zapamtiti. Pogledajmokako se prakticno vrse ta prenosenja na konkretnom primeru.

Sacuvajte ovaj primer pod imenom value.php i kada ga izvrsite evo sta ce se prikazati u webbrowseru:

2

<?phpfunction tax ($salary) {

$salary = $salary - (($salary/100)*20);return $salary;

}$salary = 2500;echo (tax($salary)); //ovo ce prikazati 2000echo "<br>";echo $salary; //ovo ce prikazati 2500

?>

Page 134: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovo kao address.php i pokrenite u web browseru:

3

<?phpfunction tax (&$salary) {

$salary = $salary - (($salary/100)*20);return $salary;

}$salary = 2500;echo (tax($salary)); //ovo ce prikazati 2000echo "<br>";echo $salary; //ovo ce prikazati 2000

?>

Page 135: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

9. Opseg Promenljivih

U ovom poglavlju upoznajemo novi koncept koji se zove zivotni vek promenljive. Zivotni vekpromenljive je period od trenutka kada je promenljiva napravljena do trenutka kada prestajeda postoji. Promenljiva moze da traje koliko i program koji je izvrsava, ali moze da traje imanje – onoliko koliko traje funkcija unutar koje je kreirana. 

Globalne i lokalne promenljive

Promenljive napravljene van funkcije postoje za vreme trajanja programa kojem pripadaju.Promenljive napravljene unutar funkcije traju samo onoliko koliko traje izvrsavanje te funkcije.Ovaj koncept se zove opseg. Za promenljive unutar funkcije kaze se da imaju lokalni opseg, apromenljive izvan funkcija imaju globalni opseg. 

Hajde da vidimo primer ovoga u akciji. Sledeci delic koda prikazuje poruku ili na francuskomili na engleskom jeziku:

Prvo pojavljivanje promenljive $welcome_message definise njenu vrednost na “Hello World”.Ovo je globalna promenljiva u datom programu. Unutar funkcije definisemo promenljivu$welcome_message na “Bonjour Tout Le Monde” i to je lokalna promenljiva posto je definisanaunutar funkcije. Ako biste pokrenuli ovaj kod videli biste da ce se na ekranu ispisati “HelloWorld”. To je zbog toga sto je promenljiva $welcome_message unutar funkcije potpuno drugapromelnjiva u odnosu na $welcome_message na pocetku programa.

Ako promenimo ime promenljive unutar funkcije na $french_message i pokusamo da jeodstampamo izvan funkcije, ona nece biti vidljiva zbog svog lokalnog karaktera:

1

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

Page 136: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Promenljiva $french_message nece biti odstampana jer se njen zivotni vek zavrsava zajedno safunkcijom u kojoj je definisana.

Ako zelimo da prikazemo vrednost promenljive $welcome_message unutar funkcije, nista senece prikazati, zato sto promenljiva $welcome_message ne postoji unutar funkcije:

Ovo je sasvim logican sled desavanja  koji sprecava da dodje do mesanja promenljivih koje ziveunutar funkcija sa promenljivama koje zive izvan funkcija. Ako ipak zelimo unutar nekefunkcije da pristupimo promenljivoj koja se nalazi izvan nje, to mozemo uciniti upotrebomkljucne reci global na sledeci nacin:

2

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

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

Page 137: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Igrajte se malo sa definisanjem promenljivih unutar i izvan funkcija i njihovim pozivanjem naraznim mestima, uz upotrebu kljucne reci global i brzo cete zapamtiti pravila.

Vazno je napomenuti da su konstante globalno vidljive u svim funkcijama i nad njima nijepotrebno upotrebiti kljucnu rec global. Sledeci primer to ilustruje:

3

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

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

Page 138: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

10.Ukljucene Datoteke

Ukljucene datoteke su mogucnost koja je zajednicka mnogim serverskim jezicima itehnologijama. Ukljucena datoteka radi upravo ono sto njeno ime i kaze: ukljucuje jednudatoteku (fajl) u neku drugu datoteku. Ovo mozete koristiti da biste ukljucivali tekst, HTMLkod ili PHP skript. Ukljucivanje se vrsi pomocu naredbe include:

include (“ime_datoteke”); 

Pretpostavimo da imamo sledece fajlove:    first_file.php

    second_file.php

    third_file.txt

Pogledajmo kako PHP moze ukljuciti sva tri prethodna fajla unutar jednog i primetite da ce onibiti izvrseni kao jedinstven program:

    include.php

Ako u web browseru pozovete program include.php, evo sta ce se ispisati na ekranu:

1

<?phpecho "Prvi fajl ukljucen!<br><br>";?>

<?phpecho "Drugi fajl ukljucen!<br><br>";?>

Treci fajl ukljucen!!!

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

Page 139: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Kao sto mozete da vidite, kada PHP naidje na komandu include u toku izvrsavanja, on odlazi uukljuceni fajl, izvrsava njegov sadrzaj ako je to PHP fajl, ili prepisuje sadrzaj fajla ako se radi otekstualnom ili html fajlu i zatim se vraca u polazni fajl i nastavlja izvrsavanje. Kada koristiteinclude, imajte na umu da polazni fajl i svi ukljuceni fajlovi formiraju jedan jedinstveniprogram. Sve promenljive iz ukljucenog php fajla od trenutka ukljucivanja su vidljive u fajlukoji vrsi ukljucivanje, a ukljuceni fajl vidi sve promenljive koje su do tog trenutka definisane ufajlu koji vrsi ukljucivanje. 

Predlazem vam da se zadrzite na include funkciji i testirate razne opcije, jer je ovo veomavazan koncept koji se koristi u pisanju PHP programa.

2

Page 140: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

11. Obrada i izbegavanje gresaka

Ima mnogo razloga zbog kojih je dobra obrada gresaka jako bitna. Da podjemo od prvog inajvaznijeg, a to je sigurnost. Zapamtite – ako ste programer, sigurnost vaseg sistema moze bitiveoma povezana sa sigurnoscu vaseg posla, tako da je ovo dvostruko vazno. 

Tipovi gresaka

Postoji nekoliko tipova gresaka koje se mogu pojaviti, a neke od njih uopste nece generisatinikakvu poruku greske kod PHPa. Trazenje gresaka je mnogo lakse ako znate gde da gledate.Ima mnogo tipova (i podtipova) gresaka, ali u PHPu ih mozete klasifikovati u jedan od sledecadva tipa – sintaksne greske i logicke greske. 

Sintaksne greske

Sintaksne greske se, uopsteno govoreci, lakse uocavaju posto one izazivaju poruku greske uPHPu. Racunari su veoma precizne masine, i aplikacije koje rade na njima su isto takoizbrirljive. Vi i ja mozemo da izmesamo reci u recenici, pa da i dalje ocekujemo da nas nekorazume. Na primer, ja mogu da kazem “Dobro Jutro” u jedan sat posle podne, i vi biste i daljeznali sta ja mislim. Medjutim, vasi programi ce prijaviti gresku i za najmanji propust pri unosu:

echo “Hello World”;

Ovo bi izazvalo gresku u parsiranju, jer PHP nije uspeo da shvati kako ste zeleli da napiseteecho umesto eco. Jos jedan klasican nacin za pravljenje gresaka u parsiranju je izostavljanjeznaka tacka zarez na kraju izraza:

echo “Hello”echo “World”;

PHP ce vam javiti da ste napravili gresku u drugom redu, ali to je i dalje korisno da vam ukazeda je problem u nezavrsavanju prethodnog izraza tackom i zarezom.

Jos jedna cesta greska je da ne uspemo da napravimo uspesnu strukturu petlje. Na primer,mozemo zaboraviti da zatvorimo zagradu nakon strukture petlje:

Ovde se javlja greska jer nismo zatvorili viticastu zagradu.

Pet stvari koje mogu da izazovu sintaksnu gresku

1. Greske u unosu2. Konstrukcija nije dobro zatvorena3. Nedostaje znak tacka i zarez na kraju izraza4. Unos pogresnog imena funkcije5. Neispravno zatvaranje stringa: echo “Hello World;

1

<?phpfor ($loop = 0; $loop < 5; $loop++) {

echo “Hello world”

?>

Page 141: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Logicke greske 

Ovo je drugi tip greske i njih je teze uociti. Kada pokrenete program, nema gresaka uparsiranju ili sintaksi. Proverili ste kod i jednom i drugi put, ocistili greske u unosu i ociglednegreske u kodu. Ipak, kada pokrenete program, on pocne da vraca podatke koji nikako ne mogubiti tacni, ili uopste ne vraca podatke. Ponekad se desava da program kod vas radi dobro, alikada ga date korisniku on odjednom prestane da radi. Sve ovo je najcesce prouzrokovanogreskama u logici programa. 

Postoji i dalja razlika izmedju tipova logickih gresaka. Neke logicke greske se desavaju u vremeizvrsavanja programa samo pod nekim odredjenim uslovima. Na primer, PHPov kod mozeizgledati dobro, i cak ce ga PHP server prihvatiti i izvrsiti, ali ce se greske pojaviti kadapokrenete program, sto ce zaustaviti program u toku izvrsavanja – ovo su greske u tokuizvrsavanja programa. Greske u vreme izvrsavanja koje zaustavljaju program ionemogucavaju da se on zavrsi nazivaju se fatalnim greskama. Sintaksne greske su takodjefatalne, ali greske u vreme izvrsavanja programa nisu uvek fatalne, vec se mogu javiti samopod odredjenim uslovima.

Drugi tip logickih gresaka ne prekida izvrsavanje programa, nego sa njima programi rade dokraja, ali vracaju pogresne vrednosti. Ovo su, ako zelite bolji prikaz, neocekivane izlaznegreske. Pocecemo prvo sa greskama u vreme izvrsavanja.

Greske u vreme izvrsavanja

Dva najcesca tipa gresaka u vreme izvrsavanja su Greske deljenja nulom i Beskonacne petlje.

Greske deljenja nulom

Prvo, kratak podsetnik – racunari ne mogu da dele sa nulom. Ustvari, niko ne moze – nijemoguce predstaviti rezultat. Deljenje sa nulom obicno je slucajna greska – vi pravite deljenjepromenljivom koja ima vrednost razlicitu od nule, ali se nekada nepredvidjeno dogodi da je tapromenljiva prazna ili jednaka nuli i onda dolazi do greske deljenja nulom. Racunar ce prijavitigresku kad god se ovaj problem pojavi.

Medjutim, problem nije uvek ocigledan. Zamislite formular u kome pitate korisnika da unesebroj stavki za kupovinu. Takodje zelite da njemu ili njoj date popust i zaracunate porez.Korisnik slucajno zaboravi da unese ovaj podatak, program pomnozi broj stavki sa cnom idobije nulu. Rezultat onda moze da se koristi kao osnova za deljenje u daljem proracunu imozemo zavrsiti sa greskom deljenja nulom. Medjutim, ako korisnik unese broj razlicit od nule,kod ce ispravno raditi. 

Zato uvek u svom kodu predvidite proveravanje unosa korisnika, i izbegnite deljenje kada jevrednost promenljive kojom treba deliti jednak nuli ili kada je ta promenljiva prazna.

Beskonacne petlje

Jedan od glavnih problema u koriscenju while i do while petlji je taj da ako se uslov koji stedefinisali za izlazak iz petlje nikada ne dostigne, PHP ce nastaviti da izvrsava petljupotencijalno beskonacan broj puta, naravno, u okviru podesenog maksimalnog vremena zaizvrsavanje programa – max_execution_time. Ako se max_execution_time prekoraci, onda cePHP prikazati gresku. Pogledajte sledeci primer, ali nemojte pokusavati ovo da pokrenete:

2

Page 142: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ovde definisemo dve promenljive, ali je problem taj da se promenljiva $test_variable nikada nemenja u petlji, tj. zauvek ostaje true, pa ce se petlja beskonacno mnogo puta izvrsavati.Nemojte ovo pokusavati da isprobate, zato sto ce ovo na Windowsu zagusiti sve resurse dokPHP bude pokusavao da ide kroz petljju i moze dovesti do blokiranja racunara.

Kada bi beskonacne petlje bile lako uocljive ne biste imali problema; medjutim, one su cestomnogo neprimetnije, posebno imajuci u vidu cinjenicu da mogu da se dese samo pododredjenim okolnostima. Zato morate strogo voditi racuna o tome da ne napravite beskonacnepetlje, jer to moze izazvati nesagledive posledice po vas program.

Neocekivane izlazne greske

Postoje mnogi razlozi zasto program moze da ne vrati ocekivani izlaz. Probacemo da uopstimonekoliko najcescih slucajeva kada se ovaj problem javlja, ali svesni smo da ne mozemoobuhvatiti sve slucajeve.

Greske u programskim pretpostavkama

Kladio bih se da se jedan od najcescih tipova logickih gresaka desava kada programeri napravegreske u pretpostavkama u interpretaciji koda i isprogramiraju gresku u skriptu. Jedan skorijiprimer je da je sonda za Mars americkog svemirskog programa izgubljen a zbog takve greske.Ona je navodno unistena u atmosferi Marsa zato sto je jedan deo koda za navigaciju pisankoristeci metricke jedinice (metar), a drugi imperijalne (stopa). 

Poenta je u tome da je ovakve greske cesto nemoguce otkriti pre nego se takva situacija dogodi.Treba pazljivo razmisliti sta program treba da radi i proveriti osnovne principe pre negopocnete pisanje koda.

Funkcije koje ne vracaju vrednost

Ako napisete funkciju koja ispravno radi svoj posao, ali zaboravite da stavite naredbu return,kada je budete koristili shvaticete da nista ne vraca. To je i svrha kljucne reci return i moratebiti veoma obazrivi da ne zaboravite na nju.

Argumenti u pogresnom redosledu

Ako funkciji predate argumente u pogresnom redosledu, ona ce se izvrsiti i vratice vrednost, alineispravno sracunatu zbog greske u unosu podataka. 

3

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

$counter ++;}?>

Page 143: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Zamena operatora dodele i jednakosti

Kada se  pravi struktura IF, veoma je vazno da se vodi racuna da se umesto znaka jednakosti“==” ne stavi operator dodele “=”. Da biste izbegli nenamerno pravljenje ovakve greskeprimenite sledeci trik. Umesto da if napisete ovako:

if ($variable == 10) {...}

Vi pisite ovako:

if (10 == $variable) {...}

i ako sada napravite gresku i umesto “==” napisete “=”:

if (10 = $variable) {...}

PHP ce vam dati poruku da je doslo do greske jer broju nije moguce dodeliti vrednost.Medjutim, da ste gresku napravili na sledeci nacin:

if ($variable = 10) {...}

PHP ne bi nista javio, vec bi promenljivoj $variable dodelio vrednost 10 i nasttavio saizvrsavanjem, sto svakako nije ono sto ste zeleli na ovom mestu da postignete.

Dobre prakse u pisanju koda

Dakle, uocili ste gresku, sta cete sada da radite povodom nje? Prvi savet koji cemo vam dati jeveoma ocigledan. Nemojte da pisete kod sa greskama! Ovo mozda izgleda lakse nego sto jeste,ali ako se drzite dobrih obicaja, koje su programeri od Rimskog doba do danas koristili, ondamozete u velikoj meri smanjiti sanse za pojavljivanje gresaka u vasim programima.

Ove tehnike su, bez izuzetka, jednostavne za razumevanje, lagane za izvrsavanje i dostaprogramera ih ne koristi! “Zasto ne?” mozete se pitati. Pa, zato sto je prosecan programerzauzeta osoba, koja ne voli nista sto ga dekoncentrise od programiranja. Glavne primedbe suobicno da su ove tehnike vremenski zahtevne i da zahtevaju odredjeni stepen planiranjaunapred i organizaciju, a ne garantuju da ce kod biti bez gresaka. Programeri mozda neceizloziti svoje primedbe ovim recima, ali sve se svodi na to. Zapamtite, nista ne moze dagarantuje da kod nece imati gresaka, i kao sto doktori kazu, bolje je spreciti nego leciti.

Koristite standard za pisanje koda

Uvlacite kod iako to nije neophodno za pravilno funkcionisanje programa. Time mozete sebi idrugima olaksati zivot kada je potrebno citati kod koji je pravilno uvucen. Pored toga, dobro jeodluciti se za neki standard za pisanje koda i zatim ga se striktno pridrzavati. Preporucujemvam standard za pisanje PHP programa koji mozete naci na sledecoj adresi:

4

Page 144: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

http://pear.php.net/manual/en/standards.php

Komentarisite kod

Ovo je vrlo jednostavno. Ne mozete da ocekujete da bilo ko drugi (cak ni vi sami nakonnekoliko nedelja) moze da razume kod ako ga niste dobro komentarisali. Komentar je zapiskoji daje programer da bi pomogao i objasnio sta koji deo koda radi. Ne treba da sluzi samoprogrameru koji ga je napisao; kod ce mozda da se odrzava dugo nakon sto je programernapustio kompaniju, ili vise nije u prilici da pomogne.

U PHPu komentare mozete pisati na vise nacina. Za jednolinijske komentare koristite dve kosecrte:

//Jednolinijski komentar u PHP­u

a za viselinijski komentar potrebno je koristiti znake “/*” za pocetak komentara i “*/” za krajkomentara:

/*Viselinijski komenatr pocinjedruga linija komentaratreca linija komentarazavrsetak viselinijskog komentara */

Kada PHP naidje na znak za komentar ignorisace sve sto se unutar njih nalazi za vielinijskekomentare i sve sto je na pisano do kraja linije za jednolinijski komentar.

Koristite funkcije

Kada imate isti kod koji se javlja na vise mesta u vasim programima, to je znak da ga trebasmestiti u funkciju i onda samo na raznim mestima pozivate tu funkciju. Tako izbegavatepisanje istog koda na vise mesta, a samim tim mogucnost pojavljivanja iste greske na visemesta. Ovakav pristup mnogo pojednostavljuje organizaciju koda i pronalazenje gresaka,posebno ako se radi na vecim projektima.

Koristite ukljucivanje datoteka (include())

Upotreba ukljucenih datoteka je samo jedan korak vise od funkcija, posto vam omogucava dajedna funkcija bude dostupna u vise razlicitih programa.

Imenujte promenljive u skladu sa njihovim ulogama u programu

Iskustvo nam govori da je bolje promenljivama davati imena koja opisuju podatke kojepromenljiva sadrzi. U ovome ne treba preterivati i koristiti vise od dve ili tri reci u imenupromenljive.

Pokusavajte da pokvarite program

Kada testirate kod, unosite u program razne vrednosti (velike brojeve, slova umesto brojeva islicno) da biste videli kako se program ponasa. Mozda niste ocekivali da program budezloupotrebljen na taj nacin, ali kada je u realnom svetu, ovo su stvarne vrednosti koje mogudoci u program. Ako se program pokvari pod ovakvim okolnostima, onda cete imati mnogozbunjenih i nezadovoljnih korisnika. 

5

Page 145: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

U stvari, lakse je pretpostaviti da ce se program naci na ovakvim iskusenjima i zatimprogramirati tako da bi se sprecio kvar kada se to dogovdi. Zamislite sta bi sve korisnik mogaoda da uradi da bi pokvario program ili mu dozvolio da prihvati pogresne informacije ili dauopste ne prihvati informacije. Na primer godine treba da imaju realne vrednosti, adrese trebada sadrze postanski broj, dok adresa elektronske poste treba da sadrzi znak @. Kod bi trebalosve ovo da proverava. 

Testiranje vaseg koda vrednostima koje ocekujete da ce ih korisnik uneti apsolutno jeneophodno. Takodje je neophodno testiranje sa vrednostima koje su neispravne ili na graniciispravnosti. Kada su brojevi u pitanju, testirajte sa velikim, malim, pozitivnim, negativnimbrojevima i slicno. 

Prilikom testiranja, trudite se da razmisljate kao vasi korisnici. Pokusajte da se stavite usituaciju coveka koji se ne razume puno u racunare i koji koristi vas program. Od stepenauspesnosti preuzimanja uloge vaseih korisnika pri testiranju, zavisi i uspeh u pisanju dobrogprograma. Vezbajte i vremenom cete postajati sve bolji i bolji.

6

Page 146: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

12.Prenosenje podataka od stranice do stranice– metod “uradi sam”

Dolazimo do tacke gde interakcija sa korisnikom postaje nasa glavna tema. Kada pricamo ouvodjenju interaktivnosti, u stvari pokusavamo da postignemo bolje iskustvo u upravljanjupodacima. Da bi smo ovo uradili, treba da razmotrimo dve stvari:

● Kako da dinamicki promenimo Web strane zavisno od toga koja je prethodna stranaodabrana, ili zavisno od drugih faktora, na primer vremena dana, trenutno ulogovanogkorisnika, njegove lokacije i slicno...

● Kako da pratimo sta je bilo pre, tako da korisnici mogu nesto da kazu web lokaciji i da ondaona njima pojedninacno odgovori. Ovo moze da zapocne seriju interakcija na pravcukorisnik­Web Lokacija, u kojima se podaci stalno prosledjuju napred i nazad izmedjukorisnika i web lokacije, drugim recima potrebna nam je trajnost nekih podataka u tokuposete korisnika nasoj web lokaciji.

Na pocetku cemo razmotriti nekoliko nacina na koje mozete da ucinite da vasi podaci traju odjednog do drugog zahteva korisnika za stranicama na vasem web serveru. Pored toga, isto semoze postici koriscenjem PHP sesija sto cemo pokazati u sledecem poglavlju, ali dobro je videtikako se to moze ostvariti pesackim putem da bi smo naucili osnovne principe koji deluju upozadini interakcije. Takodje, nece vam uvek biti neophodne sesije da bi ostvariliinteraktivnost, pa je dobro znati i drugaciji metod da se to uradi.

Skrivena polja formulara

Recimo da imamo sekvencu od tri formulara, od kojih svaki uzima podatke od korisnika. Kadakorisnik popuni formular 1, posalje ga, podaci se prosledjuju na sledeci formular u sekvenci.Formular 2 prihvata odredjene podatke i prosledjuje ih formularu 3. Ali kako da formularu 3,pored podataka sa formulara 2, prosledimo i podatke sa formulara 1?

To je jednostavno: samo definisemo skrivena polja u formularu 2 koja ce sadrzati podatkeprosledjene sa formulara 1. Sledeci primer radi upravo to. 

Ovo je jednostavan primer koji koristi tri skripta da bi primio porudzbinu u restoranu i da bi nakraju prikazao racun po svim narucenim stavkama. 1. Napravite sledeci skript i sacuvajte ga kao menu1.php

1

Page 147: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

2. Sledeci skript sacuvajte kao menu2.php

2

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

<HTML><HEAD><TITLE>Welcome to Charlie's dessertselection</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 adessert?";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]'>";

Page 148: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

3. Naredni kod sacuvajte kao bill.php

4. Sada u web browseru otvorite skript menu1.php

5. Odaberite jelo iz padajuceg menija i pritisnite Submit Query da biste dobili sledecu stranu:

3

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

<HTML><HEAD><TITLE>Thank you for dining atCharlie'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>

Page 149: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

6. Kada odaberete dezert i posaljete izbor evo sta cete dobiti:

Objasnimo sada kako prethodni kod radi. Nas prvi skript menu1.php tesko moze proci kao PHPskript – samo cinjenica da smo definisali nas izbor jela u nizu sprecava nas da to napisemo kaocist HTML kod. Ipak, to je PHP, i koristimo niz $Entrees da bi smo definisali dozvoljene opcijeu padajucem meniju:

$Entrees=array("Steak ($9)", "Pizza ($7)", "Pasta ($6)");

Kada pritisnemo dugme Submit Query, poziva se sledeci skript menu2.php, a nas izbor jelaprosledjuje se kao promenljiva $_POST[ListBox1]. Evo sada jos malo slicnog posla. Definisemoniz dostupnih dezeerta, i predstavljamo svaku vrednost kao opciju u padajucem meniju:

$Desserts=array("Apple Pie ($3)","Pancakes ($3)","Ice Cream ($2)");

4

Page 150: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sada, ovo je najvaznija tacka. Pre nego sto definisemo dugme Submit Query za formular,dodajemo skriveno polje (hidden) koje se zove Course1, cija vrednost se preuzima izpromenljive $_POST[ListBox1] i dalje sadrzi izbor  jela iz skripta menu1.php, tako seosiguravamo da ce ova vrednost trajati do sledeceg skripta u koji ga prosledjujemo metodomPOST:

echo "<INPUT TYPE=HIDDEN NAME=Course1  VALUE='$_POST[ListBox1]'>";

Jos jednom dugme Submit Query nas salje na sledeci skript, u ovom slucaju bill.php. On ceizlistati naruceno jelo, naruceni dezert i dati nam ukupnu cenu. Posto je skript menu2.phpsmestio izbor jela u skriveno polje Course1, sada mozemo da ga dobijemo kroz promenljivu$_POST[Course1]. Odabrani dezeert se nalazi u promenljivoj $_POST[ListBox2]:

echo "Your order was for the following:<BR><BR>";echo "Entree: $_POST[Course1]<BR>";echo "Dessert: $_POST[ListBox2]<BR><BR>";

Poslednji deo naseg primera koristi cinjenicu da smo cene dodali na kraj opisa jela. Mozemo daprodjemo kroz listu i da izvadimo cene poredjenjem sablona pomocu funkcije ereg(), i akopostoje dodamo ih promenljivoj $total. Zavrsavamo sa ispisom ukupnog racuna:

foreach (array($_POST[Course1], $_POST[ListBox2]) as $val) {      if (ereg("[0­9]+", $val, $regs)) $total += $regs[0];}

echo "TOTAL BILL = $" . $total . "<BR>";

Query String – string sa upitom

Prenosenje podataka od stranice do stranice moze se postici i upotrebom query stringova.Cesto je to resenje jednostavnije i elegantnije od skrivenih polja formulara. Pogledajmo primerkoji koristi stringove sa upitom za cuvanje vrednosti od stranice do stranice u kontekstu ukojem bi formulari bili prilicno neprakticni. Dame i gospodo zauzmite mesta – igra pocinje.

Ova igra bi trebalo da vam bude poznata – to je igra pogadjanja u kojoj igrac bira slova, jednopo jedno, i pokusava da otkrije zagonetnu rec. Svaki put kada igrac odabere slovo koje sepojavljuje u reci, sva mesta na kojima se slovo nalazi bivaju otkrivena. Kada god odabere slovokojeg nema u reci, na slici za vesanje se crta nova linija. Dvanaest linija cine kompletnu slikunakon cega igrac gubi igru. Ako uspe da pogodi rec pre toga, igrac pobedjuje. Kakva zabava!

Mozda cete se iznenaditi kada otkrijete da cemo sve ovo da uradimo u jednom skriptu – ovdenase trajne promenljive ulaze u igru. Imamo jednu stranu koju ucitavamo svaki put kada igracodabere slovo. ocigledno je da ce morati da izgleda malo drugacije svaki put kada se ucita, alice to skoro uvek zavisiti od slova koja su bila odabrana. Pozivajuci skript sa query stringom uURL adresi, koji sadrzi sva odabrana slova, mozemo da regenerisemo stranu iz pocetka svakiput. Dosta price – hajde da pogledamo kod. 

Napisite sledeci skript i sacuvajte ga pod imenom hangman.php: 

5

Page 151: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

6

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

Page 152: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Pokrenite skript, odaberite nekoliko reci i trebalo bi da dobijete nesto slicno sledecem:

7

else { $links .= "<AHREF=\"$PHP_SELF?letters=$letters$var&word_number=$word_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>

Page 153: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Vas zadatak je da proucite kako radi ovaj skript i shvatite kako smo cuvali podatke o brojupokusaja i vec odabranim recima samo koristeci query string. Videcete da je koncept vrlojednostavan. Napomenucu samo da smo u programu koristili trinaest razlicitih slicica za svakostanje vesala:

8

Page 154: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

13. Sesije

Posto smo upoznali razlicite tehnike koje mozemo da koristimo da bismo ucinili da podacitraju, vise mozemo da cenimo ono sto se desava kada pricamo o sesijama. Sesiju definisemokao seriju vezanih interakcija izmedju jednog klijenta i web servera. Ovo bi mogle da buduserije transakcija koje korisnik pravi dok azurira svoj portfolio sa akcijama, ili skup zahteva kojisu napravljeni da bi se proverio nalog elektronske poste kroz web email servis. Sesija moze dase sastoji od visestrukih zahteva istom skriptu ili od zahteva razlicitim izvorima na istoj weblokaciji.

Umesto stalnog slanja podataka izmedju servera i klijenta, mnogo je prakticnije drzati podatkena serveru, ali dati klijentu kljuc pomocu koga cemo ga jedinstveno identifikovati i pruziti mupristup njegovim podacima. Ovaj kljuc zovemo identifikatorom sesije; on jedinstveno vezujeklijenta sa sesijom, i samim tim sa njegovim podacima.

Necemo zalaziti u teoretsku pozadinu PHP­ovog sistema za rad sa sesijama. Na jednostavnomprimeru pokazacemo kako se radi sa sesijama i to ce biti sasvim dovoljno znanja da ih koristiteu svojim programima. Kasnije, ko bude imao zelju da upozna sve detalje o sesijama, moze otome potraziti izvore na webu.

Hajde da ispitamo jednostavno koriscenje PHP sesija – brojanje koliko je puta korisnik pristupiostranama na web lokaciji od pocetka tekuce sesije. Sledeci skript sacuvajte pod imenompage_count.php:

1

<?phpsession_start();session_register("view1count");session_register("view2count");session_register("view3count");session_register("view4count");

if (!$view1count) $view1count = 0;if (!$view2count) $view2count = 0;if (!$view3count) $view3count = 0;if (!$view4count) $view4count = 0;

echo "<HTML><HEAD><TITLE>Web Page HitCounter</TITLE></HEAD><BODY>";

if ($_GET[whichpage]) { echo "<B>You are currently on page $_GET[whichpage].</B><BR><BR>\n"; $_SESSION["view${whichpage}count"]++;}

Page 155: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Ako pokrenete skript i kliknete po nekoliko puta na svaki od linkova, evo sta bi trebalo dadobijete:

Objasnimo kako radi ovaj jednostavan primer. Sesiju zapocinjemo funkcijom session_start().Sve stranice koje zeelite ukljuciti u sesiju zapocnite sa session_start(). Ta funkcija zapocinjenovu sesiju, a ako je vec prethodno zapoceta od nekog programa, samo ce je nastaviti. Zatimsledi registracija sesijskih promenljivih koje zelimo da koristimo. U tu svrhu se koristi funkcijasession_register() koja kao argument prihvata string sa imenom promenljive bez znaka zadolar. I to je sve sto nam je potrebno da bi promenljive registrovane sa session_register() bilevidljive u svim programima koji zapocinju sa session_start()!

2

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

?>

Page 156: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Mozda ste iznenadjeni jednostavnoscu, ali ako malo bolje pogledate primer koji smo naveli,videcete da promenljive $view1count, $view2count, $view3count i $view4count zadrzavajusvoje vrednosti od zahteva do zahteva – postigli smo trajnost podataka! 

Navodimo samo jos jednu malu napomenu, veoma vaznu za rad sa sesijama. Funkcijasession_start() se mora pozvati na stranici pre nego sto je bilo sta odstampano. ovo je veomavazno zapamtiti, jer u suprotnom sesije nece raditi. 

3

Page 157: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

14. Povezivanje PHPa i MySQLa

Pre nego pocnemo pricu o funkcijama koje koristimo za povezivanje PHPa i MySQL servera,pripremimo bazu i jednu tabelu na kojoj cemo prikazati test primer. Otvorite PHPMyAdmin inapravite novu bazu pod imenom “crossroads”. Zatim iskoristite sledece komande da napravitetabelu cs_personal_info i popunite je sa nekoliko slogova podataka.

CREATE TABLE `cs_personal_info` (  `person_id` int(11) NOT NULL auto_increment,  `title` varchar(30) NOT NULL default '',  `first_name` varchar(30) NOT NULL default '',  `last_name` varchar(30) NOT NULL default '',  `middle_name` varchar(30) NOT NULL default '',  `appended_title` varchar(30) NOT NULL default '',  `spouse_name` varchar(30) NOT NULL default '',  `category_id` int(11) NOT NULL default '0',  `relationship_status` varchar(30) NOT NULL default '',  `company_name` varchar(100) NOT NULL default '',  `job_title` varchar(100) NOT NULL default '',  `salutation` varchar(100) NOT NULL default '',  `status` enum('shared','private') NOT NULL default 'shared',  `birthday` date NOT NULL default '0000­00­00',  `wedding` date NOT NULL default '0000­00­00',  `photo` varchar(255) NOT NULL default '',  `notes` text NOT NULL,  `note_sharing` enum('Shared','Private') NOT NULL default 'Shared',  `referred_by` varchar(100) NOT NULL default '',  `referrer_name` varchar(100) NOT NULL default '',  `assistant_name` varchar(255) default NULL,  `children` varchar(255) default NULL,  `new` varchar(255) default NULL,  `nickname` varchar(255) default NULL,  `owner` varchar(255) default NULL,  `secondary_id` varchar(255) default NULL,  `owner_id` int(11) NOT NULL default '11921',  `date` date NOT NULL default '0000­00­00',  `email_preferences` enum('html','text') NOT NULL default 'html',  PRIMARY KEY  (`person_id`),  KEY `category_id` (`category_id`),  KEY `owner_id` (`owner_id`)) TYPE=MyISAM AUTO_INCREMENT=19254 ;

­­ ­­ Dumping data for table `cs_personal_info`­­ 

INSERT INTO `cs_personal_info` VALUES (1, ' ­', 'Lester', 'Smith', '', ' ­', '', 3, '', '', '', ' ­', 'shared','0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11652, '0000­00­00', 'html');

1

Page 158: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

INSERT INTO `cs_personal_info` VALUES (2, ' ­', 'Russell', 'Bettis', '', ' ­', '', 0, '', '', '', ' ­', 'shared','0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (3, ' ­', 'Barbara', 'Bruckhorst', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (4, ' ­', 'Harry', 'Vernon', '', ' ­', '', 0, '', '', '', ' ­', 'shared','0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (6, ' ­', 'Radovan', 'Duric', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', 'Nicole', '', '', '', '', 'Duric', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (7, ' ­', 'Christie', 'Winner', '', ' ­', '', 3, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', 'Dale', '', '', '', '', 'Winner', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (11788, ' ­', 'Lynn', 'Summerhill', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', NULL, 11921, '0000­00­00','html');

INSERT INTO `cs_personal_info` VALUES (9, ' ­', 'Mario', 'Williams', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (11, ' ­', 'Roger', 'Edwards', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (12, ' ­', '', 'Whitmore', '', ' ­', '', 0, '', '', '', ' ­', 'shared','0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (13, ' ­', 'Spencer', 'Dean', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (15, ' ­', 'Jay', 'Geis', '', ' ­', '', 0, '', '', '', ' ­', 'shared','0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (16, ' ­', 'Gerald', 'Rainer', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

INSERT INTO `cs_personal_info` VALUES (17, ' ­', 'Mike', 'Bateman', '', ' ­', '', 0, '', '', '', ' ­','shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html');

Sada kada imamo bazu, tabelu i podatke, mozemo pokazati kako pomocu PHP da sekonektujemo na MySQL server i odaberemo bazu sa kojom cemo raditi.

Ovde su bitne dve funkcije. Prva je ona koja nas PHP program povezuje sa MySQL serverom:

mysql_connect (“adresa_servera”, “korisnicko_ime”, “lozinka”);

Funkcija mysql_connect() kao argumente prihvata adresu servera na koji se konektujemo,korisnicko ime i lozinku. Ako su ti podaci ispravni, uspostavili smo vezu sa serverom.

Druga funkcija nam sluzi da odaberemo bazu sa kojom cemo raditi iz naseg PHP skripta:

2

Page 159: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

mysql_select_db (“ime_baze”);

Funkcija mysql_select_db() kao argument prihvata ime baze sa kojm zelimo da radimo. Posleova dva koraka, spremni smo da postavljamo upite bazi podataka.

Da bi smo se povezali na MySQL server i odabrali bazu koju smo na pocetku kreirali, treba daizvrsimo sledeci kod:

Najpre smo definisali konstante sa neophodnim podacima za povezivanje na bazu i ondaprimenili objasnjene funkcije.

3

<?phpdefine("DB_DATABASE_NAME", "crossroads");define("DB_USERNAME", "root");define("DB_PASSWORD", "root");define("DB_HOSTNAME", "localhost");

//Connect to databasemysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD)

or die(mysql_error());mysql_select_db (DB_DATABASE_NAME)

or die(mysql_error());

?>

Page 160: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

15. Uzimanje podataka iz MySQLa, manipulacija i UPDATE

Sada cemo pokazati kako da  iskoristite vezu uspostavljenu sa MySQL serverom za postavljanjeSQL upita. Procedura je vrlo jednostavna i postize se upotrebom nekoliko funkcija. Najprepokazimo kako da postavimo upit bazi podataka, bilo da je to SELECT, INSERT ili UPDATEupit. To radimo u dva koraka. Prvi je da definisemo upit:

$select_query = "select person_id, first_name, last_name    from cs_personal_info    ORDER BY person_id DESC LIMIT 10";

Promenljivoj $select_query dodelili smo string koji saddrzi nas SQL upit. Zatim pozivamougradjenu funkciju PHPa za prosledjivanje ovog upita bazi podataka:

$select_result = mysql_query($select_query);

Kljucna funkcija je mysql_query() koja kao argument uzima string sa SQL upitom, a posleizvrsenja u program vraca u program odredjenu informaciju koja zavisi od vrste upita koji smopostavili. 

Ako smo postavili SELECT, SHOW, DESCRIBE ili EXPLAIN upit, funkcija mysql_query vracapokazivac na resurs koji sadrzi rezultat upita, pod uslovom da je upit uspesno izvrsen, a usuprotnom vraca FALSE. Pokazivac na resurs smestamo u promenljivu da bi smo ga moglikasnije u programu koristiti na nacin koji cete kasnije upoznati.

Ako postavimo UPDATE, DELETE, DROP ili neki drugi tip upita, funkcija mysql_query vracaTRUE u slucaju uspesnog izvrsenja ili FALSE u slucaju neuspeha.

Potpuno identicnu proceduru koristite ako zelite da postavite UPDATE ili DELETE upit –definisete promenljivu koja sadrzi upit i iskoristite je kao argument u pozivu funkcijemysql_query().

Sada cemo se pozabaviti procedurom preuzimanja podataka vracenih u SELECT upitu. KakoPHP pristupa ovim podacima i kako ih mozemo iskoristiti u nasim programima?

Pogledajte sledeci deo koda, pa cemo objasniti sta on radi:

1

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

Page 161: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Na pocetku definisemo upit koji selektuje person_id, first_name i last_name iz tabelecs_personal_info. Zatim taj upit postavljamo MySQLu funkcijom mysql_query() i ona vracapokazivac na rezultate koje je vratio nas upit, a taj pokazivac smestamo u promenljivu$select_result. Da bi smo pristupili rezultatu upita, mi koristimo funkciju mysql_fetch_array()kojoj kao argument predajemo pokazivac na vraceni rezultat upita ­ $select_result. 

Sta radi funkcija mysql_fetch_array()? Ona pristupa vracenim rezultatima, uzima jedan slog izsvih vracenih slogova i formira asocijativni niz ciji su indeksi imena polja koja smo naveli uSELECT upitu, a vrednosti su jednake vrednostima u tekucem preuzetom slogu. Taj asocijativniniz se dodeljuje promenljivoj $select_row, koju smo naveli pri pozivu funkcijemysql_fetch_array():

while ($select_row = mysql_fetch_array($select_result)) 

Da bi smo preuzeli svaki vraceni slog, moramo formirati while petlju koja se izvrsava dok godfunkcija mysql_fetch_array() ne preuzme svaki slog iz vracenih rezultata. Kada se i poslednjislog pruzme, prestaje izvrsavanje while petlje. 

U svakoj iteraciji kroz while petlju imamo pristup tekucem preuzetom slogu. U nasem primeru,koristimo taj pristup da bi smo promenljivama $person_id, $user_first_name i $user_last_namedodelili vrednosti iz tekuceg dobijenog sloga:

$person_id = $select_row[person_id];$user_first_name = $select_row[first_name];$user_last_name = $select_row[last_name];

Zatim smo te vrednosti koristili da bi odstampali na ekranu id osobe, ime i prezime:

echo "$person_id. $user_first_name $user_last_name<br>";

Na potpuno isti nacin cete uvek uzimati rezultate upita, samo sto cete u razlicitim situacijamana drugacije nacine koristite slogove koje upit vrati. Dobro upamtite ovu kombinaciju upita iwhile petlje jer ce vam jako cesto biti potrebna u vasim programima.

Sada cu navesti jos par funkcija PHPa za rad sa MySQLom koje ce vam biti vrlo korisne. Uprimeru koji zatim sledi videcete sve te funkcije na delu. 

Ako zelite da saznate koliko slogova je vratio SELECT upit, upotrebite funkcijumysql_num_rows() na sledeci nacin:

$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);echo "Num Rows: ".mysql_num_rows($select_result). "<br>";

Ako hocete da saznate na koliko slogova je uticao vas INSERT, DELETE ili UPDATE upit,koristite funkciju mysql_affected_rows():

2

Page 162: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

$query = "UPDATE cs_personal_infoSET first_name = 'Tralala' WHERE first_name ='Miljan' ";

$result = mysql_query($query);echo "<br><br>Affected Rows:".mysql_affected_rows($result);

A da bi ste saznali koji je poslednji auto increment id postavljen u INSERT upitu koji jeobuhvatao polje definisano kao AUTO INCREMENT, koristite funkciju mysql_insert_id()neposredno posle INSERT upita:

$query = "INSERT INTO cs_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("Y­m­d")."','Mr', 'Miljan', 'Vranic', 'S', 'Jr.', ' ', '12', '2','AlefBrain', 'CEO', 'Salutation', '', '1975­05­09', ' ', '', 'Notes', '12', 

3

Page 163: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

'Marko Markovic')";$result = mysql_query($query);$walkthru_data[person_id] = mysql_insert_id();echo "<br><br>Poslednji uneti person_id:".$walkthru_data[person_id]."<br><br>";

Pored navedenih funkcija, postoje mnoge druge PHP funkcije predvidjene za rad sa MySQlom iza vise detalja preporucujem da pogledate PHP Manual. Sledi primer koji objedinjuje sve stosmo naucili u poslednje dve lekcije:

4

<?phpdefine("DB_DATABASE_NAME", "crossroads");define("DB_USERNAME", "root");define("DB_PASSWORD", "root");define("DB_HOSTNAME", "localhost");

// Connect to databasemysql_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,

Page 164: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

5

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

Page 165: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte ovo kao mysql_php_functions.php i kada ga pokrenete u web browseru, on ce izvrsitisve navedene funkcije i prikazati na ekranu spisak od najvise deset ljudi iz tabelecs_personal_info. Pokusajte da eksperimentisete tako sto cete stavljati komenatare na INSERT,DELETE ili UPDATE upite i posmatrajte sta se desava.

6

//DELETE podataka$query = "DELETE FROM cs_personal_info

WHERE first_name ='Tralala' ";$result = mysql_query($query);?>

Page 166: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

16. Slanje poruka elektronske poste u PHP­u

Evo dobrih vesti: jedina funkcija koja vam je potrebna da bi ste slali elektronsku postu pomocuPHP­a je mail(). Zar to nije tako jednostavno?! Funkcija mail() uzima tri bitna argumenta:

1. Email adresu primaoca poruke2. Naslov poruke3. Telo poruke

Takodje mozete navesti i opcioni cetvrti argument; string koji sadrzi bilo koja dodatna zaglavljakoja vam sluze da navedete ko salje poruku (FROM), kome da ide kopija poruke (CC), komeda ide kopija a da ostali primaoci ne vide njegovu adresu (BCC), kome treba odgovoriti naprimljenu poruku...

Sledeci jednostavan primer daje vam sve sto je potrebno da bi se poslao email. Otvorite texteditor i napisite sledeci skript:

Sacuvajte fajl pod imenom first_mail.php i kada se izvrsi on ce poslati eamil na [email protected] ciji ce nasloov biti “Hi There!”, a u telu poruke pisace “We'llhave a meeting...”. Obratite paznju da ovaj skript mozda nece raditi na vasem lokalnomracunaru ako nije povezan na Internet i ako nemate instaliran SMTP server.Hajde sada da prosirimo primer upotrebom cetvrtog argumenta funkcije mail:

1

<?php//first_mail.php$mail_to ="[email protected]";$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);?>

Page 167: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

Sacuvajte fajl kao second_mail.php. On se od prethodnog programa razlikuje u tome sto smo ucetvrtom argumentu funkcije mail() neke dodatne standardne atribute email poruka kao sto suFrom – ko salje mail, Reply­To – kome ide poruka kada primaoc klikne na Reply dugme svogemail klijenta, CC – ko ce dobiti Carbon Copy poruke, BCC – ko ce dobiti Blind Carbon Copyporuke. Obratite paznju da posle svakog navedenog atributa u cetvrtom argumentu idu znaci“\r\n” koji su obavezni prema standardima za slanje email poruka.

2

<?php//first_mail.php$mail_to ="[email protected]";$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: [email protected]\r\nReply-to: [email protected]\r\nCC:[email protected]\r\nBCC: [email protected]");

?>

Page 168: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

17. Funkcije ugradjene u PHP

Postoje mnoge biblioteke funkcija ugradjenih u PHP. Kroz ovaj kurs prikazali smo samo nekeod njih. Od presudne vaznosti za vase dalje napredovanje u PHP­u jeste da kada god imate nekiproblem, pogledate neku od biblioteka funkcija koje vam mozda mogu pomoci da najednostavniji i brzi nacin pronadjete resenje. Posto je PHP veoma ziv jezik, stalno se javljajunove funkcije koje se dodaju osnovi PHP­a i na zvanicnom sajtu PHP­a uvek cete biti u prilici dase upoznate sa najsvezijim izvorima informacija putem PHP Manual­a – vodica kroz PHP. 

Adresa navedenog sajta je www.php.net 

Adresa PHP Manual­a je http://www.php.net/manual/en/ 

Poslednja navedena adresa je veoma vazna kao referenca za vase dalje napredovanje u PHPprogramiranju. 

1

Page 169: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

18.Razdvajanje logickog PHP koda od prikaza

Cilj ovog poglavlja je da vam kratko ukaze na jos jedan nacin pisanja sto razumljivijihprograma. Veoma vazna osobina PHP­a je da se na istoj strani mogu naci i PHP i HTMLkomande. Medjutim, cesto to stvara mnogo problema jer programeri ne vode racuna ipreteruju u kombinovanju PHP­a i HTML­a sve dok ne proizvedu vrlo necitljive stranice. Kakoovo izbeci, jer je najcesce neophodno da se na istoj strani nadje PHP kod (logika programa) saHTML­om (prikaz)? Pozvacemo u pomoc funkciju include() i prikazati kako treba pravilnorazdvajati logiku od prikaza i tako omoguciti lako snalazenje u programu.

Napravicemo dva fajla. Jedan cemo nazvati logika.php jer ce on sadrzati cist PHP kod koji radiono sto je glavni zadatak programa. Drugi cemo nazvati prikaz.php koji ce nam sluziti dakorisniku prikazemo rezultate rada programa logika.php i on ce uglavnom sadrzati HTML kodsa vrlo malo PHP­a koji sluzi samo za stampanje rezultata. Ako se pitati kako cemo izvesti daprikaz.php prikaze ono sto logika.php uradi, odgovor je vrlo jednostavan: na kraju fajlalogika.php samo cemo ukljuciti fajl prikaz.php pomocu funkcije include. Pogledajmo kakoizgledaju ovi programi:

Sacuvajte ovaj fajl pod imenom logika.php. Zatim u text editoru ukucajte sledeci program:

1

<?phpdefine("DB_DATABASE_NAME", "crossroads");define("DB_USERNAME", "root");define("DB_PASSWORD", "root");define("DB_HOSTNAME", "localhost");

// | Connect to databasemysql_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");?>

Page 170: Web Dizajn Skripta

AlefBrain PHP Trening 2006. ­ Skripta 2

I sacuvajte ga kao prikaz.php. Kada pozovete logika.php u vasem browseru, on ce se zakacitina bazu, izvrsiti upit i rezultate uoita smestiti u niz $array_of_names. Na kraju fajla seukljucuje prikaz.php. Primetite da u logika.php nema ni jednog HTML taga. Zato je kompletanHTML smesten u prikaz.php i samo je na potrebnom mestu odstampan sadrzaj niza koji smopopunili podacima u logika.php.

Ovo je veoma jednostavan koncept razdvajanja logike od prikaza, ali je istovremeno veomakoristan. Mozda ce vam ovo izgledati nepotrebno u manjim primerima, ali kada pocnete daradite na nekim ozbiljnijim projektima, vrlo brzo cete videti koliko koristi donosi ovakavpristup. Vas kod ce biti cistiji, razumljiviji i sa mnogo manje gresaka.

2

<html><head><title>Prikaz podataka izmysql_php_functions.php</title></head><body bgcolor="Gray"><?phpforeach ($array_of_names as $value) {

echo $value;}?>

</body></html>