web dizajn skripta
DESCRIPTION
Pocetak i osnove web dizajniranjaTRANSCRIPT
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
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
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
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
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
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
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
2
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
3
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
4
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
5
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
6
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
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
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
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>
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>
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>
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
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>
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
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>
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>
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
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
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
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
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
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
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
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
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
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>
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
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
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
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
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
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
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>
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>
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
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
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
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
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
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
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
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
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
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
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
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
AlefBrain PHP Trening, Kragujevac 2006. Skripta 1
4
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
AlefBrain PHP Trening 2006. Skripta 2
1. Primer PHPovog koda, istorijat i buducnost
Primer PHPovog koda
Pocnimo najjednostavnijim primerom sa jednim redom cilj nam je da prikazemo da su PHPove strane mesavina tri stvari: teksta, HTMLovog koda i PHPovog skripta. Strane koje sadrzePHPov 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 PHPovo 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>
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 PHPa. 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 PHPovu 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 PHPa 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>
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 PHPa 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 ecommerce 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 PHPu 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 PHPom. PHP3oznacava pocetak velikog proboja PHPa 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 PHPu 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 Enginea (naziv je nastao od imenaZeev & Andi). Zend Engine se moze smatrati novim srcem PHPa. 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 PHPu 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 PHPa. Sve veca upotrebaPHPa u slozenim aplikacijama, zahtevala je unapredjenje jezika u odnosu na ObjektnoOrijentisano programiranje. Andi je dosao na ideju da kompletno zameni ObjektnoOrijentisanideo PHPa. Zeev i Andi su napravili dokument pod imenom “Zend Engine II: Opsti pregledfunkcionalnosti i Dizajn” i ubrzo krece vrela diskusija o buducnosti PHPa. Iako je osnovni jezikostao isti, mnoge funkcionalnosti su dodate, promenjene ili odbacene u toku nastajanja sledeceverzije PHPa koja nosi ime PHP5.
3
AlefBrain PHP Trening 2006. Skripta 2
PHP5 je doneo mnoge novine i od njega se ocekuje da odrzi vodecu poziciju PHPa, ali i dapoveca ucesce PHPa na trzistu softvera. On ne samo da donosi revoluciju u Objektnojorijentaciji PHPa, vec sadrzi i mnoge nove funkcionalnosti zbog kojih PHP postajenezaobilazna platforma za razvoj web aplikacija. Potpuno novi nacin rada sa XMLom 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 Googleu, Yahoou, Amazonu...
4
AlefBrain PHP Trening 2006. Skripta 2
2. Promenljive
Vreme je da pocnemo upoznavanje razlicitih delova PHPa, 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 je2030 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;
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”;
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;
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;
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”;
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;
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 klijentserver komunikacije, nije dovoljno da se samo uzmu informacije od korisnika ikasnije se odgovori na njih. Ispravan klijentserver 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
AlefBrain PHP Trening 2006. Skripta 2
mozete preneti kao deo URLa.
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>
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
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>
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>
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>
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 (checkirali) 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
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>
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
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>
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, dropdown 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
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>
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
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 PHPu. 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 prikazacemodropdown 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>
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>
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
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>
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>
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
AlefBrain PHP Trening 2006. Skripta 2
20
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
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>
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
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>
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>";}
?>
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
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>";?>
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?
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;
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");}
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>
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
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
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";?>
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";?>
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
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]";
}?>
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
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";}?>
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";}?>
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
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 PHPu:
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";?>
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
?>
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
?>
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;?>
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;?>
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;?>
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");?>
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
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”
?>
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
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 ++;}?>
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
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 PHPu
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
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
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 pravcukorisnikWeb 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
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]'>";
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>
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
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("[09]+", $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
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++; } }
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>
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
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 PHPovog 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"]++;}
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>";
?>
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
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 '00000000', `wedding` date NOT NULL default '00000000', `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 '00000000', `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','00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11652, '00000000', 'html');
1
AlefBrain PHP Trening 2006. Skripta 2
INSERT INTO `cs_personal_info` VALUES (2, ' ', 'Russell', 'Bettis', '', ' ', '', 0, '', '', '', ' ', 'shared','00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (3, ' ', 'Barbara', 'Bruckhorst', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (4, ' ', 'Harry', 'Vernon', '', ' ', '', 0, '', '', '', ' ', 'shared','00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (6, ' ', 'Radovan', 'Duric', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', 'Nicole', '', '', '', '', 'Duric', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (7, ' ', 'Christie', 'Winner', '', ' ', '', 3, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', 'Dale', '', '', '', '', 'Winner', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (11788, ' ', 'Lynn', 'Summerhill', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', NULL, 11921, '00000000','html');
INSERT INTO `cs_personal_info` VALUES (9, ' ', 'Mario', 'Williams', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (11, ' ', 'Roger', 'Edwards', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (12, ' ', '', 'Whitmore', '', ' ', '', 0, '', '', '', ' ', 'shared','00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (13, ' ', 'Spencer', 'Dean', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (15, ' ', 'Jay', 'Geis', '', ' ', '', 0, '', '', '', ' ', 'shared','00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (16, ' ', 'Gerald', 'Rainer', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', 'html');
INSERT INTO `cs_personal_info` VALUES (17, ' ', 'Mike', 'Bateman', '', ' ', '', 0, '', '', '', ' ','shared', '00000000', '00000000', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '00000000', '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
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());
?>
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>";}
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
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("Ymd")."','Mr', 'Miljan', 'Vranic', 'S', 'Jr.', ' ', '12', '2','AlefBrain', 'CEO', 'Salutation', '', '19750509', ' ', '', 'Notes', '12',
3
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,
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);
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);?>
AlefBrain PHP Trening 2006. Skripta 2
16. Slanje poruka elektronske poste u PHPu
Evo dobrih vesti: jedina funkcija koja vam je potrebna da bi ste slali elektronsku postu pomocuPHPa 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);?>
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, ReplyTo – 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]");
?>
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 PHPu 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 PHPa i na zvanicnom sajtu PHPa uvek cete biti u prilici dase upoznate sa najsvezijim izvorima informacija putem PHP Manuala – vodica kroz PHP.
Adresa navedenog sajta je www.php.net
Adresa PHP Manuala je http://www.php.net/manual/en/
Poslednja navedena adresa je veoma vazna kao referenca za vase dalje napredovanje u PHPprogramiranju.
1
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 PHPa 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 PHPa i HTMLa sve dok ne proizvedu vrlo necitljive stranice. Kakoovo izbeci, jer je najcesce neophodno da se na istoj strani nadje PHP kod (logika programa) saHTMLom (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 PHPa 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");?>
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>