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

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

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

Da bi vam bilo lakse. predlazem da blize informacije potrazite na Internetu. Kada ste download-ovali WAMP.wampserver.com. instaliranje i upotreba . prikazacu kako se instalira softver koji je namenjen Windows-u. Skripta 1 1.com Posto pretpostavljam da vecina vas koristi Windows kao svoj osnovni operativni sistem. a ako zelite da se zabavite instalacijama na nekom od drugih operativnih sistema. Potrebno je samo da odete na sajt www.www.wampserver. Posto odgovorite na nekoliko rutinskih pitanja posao ce biti vrlo brzo gotov. evo okvira za dijalog koje cete sresti tokom instalacije: 1 . Napomenimo da je WAMP server besplatan i da je izuzetno stabilan u radu. kliknite na njegovo ime i instalacija ce poceti. 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.3 Neophodan softver.AlefBrain PHP Trening. Kragujevac 2006. pronadjete download sekciju i skinete kompletan softver na svoj racunar.

Skripta 1 2 . Kragujevac 2006.AlefBrain PHP Trening.

Kragujevac 2006.AlefBrain PHP Trening. Skripta 1 3 .

AlefBrain PHP Trening. Kragujevac 2006. Skripta 1 4 .

Kragujevac 2006.AlefBrain PHP Trening. Skripta 1 5 .

Skripta 1 6 .AlefBrain PHP Trening. Kragujevac 2006.

7 . Ja volim da koristim TextPad. a za kasnije se potrudite da nadjete neki kvalitetniji. za pocetak.txt. a ako ga nemate onda otvorite. 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.com. Otvorite neki jednostavan text editor. Napomenucu da WORD nije pogodan za pisanje programa. Adresa na kojoj mozete naci TextPad je http://www. pa je najbolje da na Internetu pronadjete neki dobar. Ako se to dogodi primenite “rename” komandu. tako da ono sto se dobija kao izlazni fajl nije samo obican tekst. ali vodite racuna da ga sacuvate pod imenom pozdrav. jer se moze dogoditi da mu text editor doda ekstenziju .textpad. jer ima svoj specifican nacin formatiranja fajlova. Mozda je ovo prilika da kazem kako ce vam za sve sto budemo radili biti neophodan text editor u kojem cete pisati programe.php i bicete spremni za pokretanje svog prvog PHP programa.AlefBrain PHP Trening. Notepad koji sigurno svako ima. u donjem desnom uglu ekrana mozete videti ikonicu WAMP servera kao na gornjoj slici. Skripta 1 Ako ste precizno sledili uputstva. obrisite postojece ime i zamenite ga sa pozdrav.php i proverite da li je ispravno sacuvan. Kragujevac 2006. Sada ste spremni da predjete na pisanje svog prvog PHP programa koji cemo iskoristiti za testiranje instalacije.

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

AlefBrain PHP Trening. kojima svoje web stranice povezujete medjusobno. Najpopularniji web browser je Micrsoft Internet Explorer. racunarski je jezik i predstavlja sustinu World Wide Web-a. sto ce vam veoma pomoci u radu. Pri pravljenju Web lokacija HTML se koristi za unos teksta.kosa crta (slash). 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. Pre nego sto predjem na opisivanje strukture HTML dokumenata. a ja vam mogu toplo preporuciti Firefox zbog mnogo vece bezbednosti i udobnosti u radu. HTML nije programski jezik. Dizajniranje Web sajta je kreativan rad. animacija ili mozda zvuka i videa na pojedinacne Web stranice koje sacinjavaju lokaciju. Skripta 1 2. Tagove uvek ogradjujete uglastim zagradama < i > koje govore browseru da se radi o HTML-u. 1 . Generalno. pored toga. HTML. Kragujevac 2006. Citaci Web-a ili Web browseri su programi koji prevode HTML u Web dokumentima i prikazuju sadrzaj na ekranu.linkove. a HTML je samo jedan od alata pomocu kojeg pravite Web prezentacije. Na primer. tagovi koriste sledeci format: <TAG>Tekst koji ce biti obuhvacen tagom. 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. Svaki HTML dokument ima tacno definisanu strukturu koja se mora postovati da bi prikaz u browseru bio ispravan.</TAG> Oznaka TAG je sifra (obicno skracenica od jednog ili dva slova. a ne o obicnom tekstu. Kosa crta oznacava kraj zadatog formatiranja i svi tagovi za uredjivanje teksta imaju otvarajuci i zatvarajuci tag. a ponekad i citava rec) koja odredjuje efekat kakav zelite. poznatiji kao HTML. nego jezik za oznacavanje teksta. ali i sa web stranicama na drugim web sajtovima. 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 “/”.1 Struktura HTML dokumenta Jezik za oznacavanje hiperteksta (Hypertext Markup Language). omogucava da umetnete hiprtekstualne veze . slika.

Ovi tagovi govore browseru da se radi o HTML dokumentu. Ako isprobate prikaz svog dokumenta u browseru i dalje cete videti samo praznu belu stranicu jer nikakav sadrzaj niste ni napravili. Tagovi koji ogradjuju zaglavlje su <HEAD> i </HEAD>. Zatim imamo tagove koji sluze za podelu dokumenta na dva dela: zaglavlje i telo. 2 . Kragujevac 2006. obavezan u strukturi. Sada mozete u tekst editoru formirati osnovnu strukturu svog prvog html dokumenta tako sto cete prepisati sledecih nekoliko linija: <HTML> <HEAD> </HEAD> <BODY> </BODY> </HTML> Svaki HTML dokument mora postovati navedenu strukturu i vazno je uociti da ovi tagovi ne mogu medjusobno menjati mesta.html I ako ste sve ispravno uradili browser ce vam prikazati praznu belu stranu. 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.html u direktorijumu “html_primeri”. pored navedenih. Svaki HTML fajl pocinje tagom <HTML> a zavrsava sa </HTML>. Oznake tela dokumenta su <BODY> i </BODY>. Zaglavlje je uvod u stranicu i browseri ga koriste da prikupe razne vrste informacija o strani. Sada ste spremni da upoznate nekoliko osnovnih HTML elemenata koji predstavljaju kostur svake web stranice. Telo dokumenta je oblast u kojoj unosite tekst. Skripta 1 Sada u DocumentRoot direktorijumu vaseg web servera napravite direktorijum pod imenom “html_primeri”.AlefBrain PHP Trening. Zatim u tekst editoru otvorite novi dokument i sacuvajte ga pod imenom prvi. slike i ostale zanimljive stvari koje ce se pojaviti na vasoj web strani. Zatim otvorite web browser i u polju za adresu upisite http://localhost/html_primeri/prvi. Prvi tag koji ce nesto prikazati u browseru i koji je.

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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

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

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

3

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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

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

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

1

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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

prvi naslov!</TITLE>

H1 H2 H3 H4 H5 H6

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

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

2

Ako vam kazem engleski izraz za ovu mogucnost moci cete i sami da pogodite kako je definisan taj tag – Horizontal Row. ali ako u Firefox-u odete na View Page Source. HTML se postarao da vam obezbedi komande komentara: <!--Ovde pisete sta god zelite jer to nece biti prikazano na web strani --> Ipak.AlefBrain PHP Trening. 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. a slicna opcija postoji u svim browserima. budite oprezni u prihvatanju moje izjave kako mozete pisati sta god hocete jer to niko nece videti. Sigurno ste pogodili da se radi o <HR> tagu. 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. Skripta 1 Jos jedan interesantan tag za ulepsavanje vasih stranica je onaj koji moze da nacrta horizontalnu liniju koja se prostire celom sirinom ekrana. 3 . To isto moze uciniti bilo koji posetilac vaseg web sajta. vasa izvorna HTML stranica ce biti prikazana u text editoru. U tom slucaju ce vam komentari biti zlata vredni. pa ako ste u komentar zapisali svoju username/password kombinaciju za pristup web sajtu preko FTP-a. Cesto cete imati potrebu da unutar HTML dokumenta navedete neke svoje komentare koje ne treba prikazati u browseru. Kragujevac 2006. Stavise. Komentar se zaista nece videti u prozoru browsera. jer se odnose na samu strukturu web stranice i predstavljaju vas licni podsetnik za snalazenje u sumi HTML tagova. napravili ste kobni bezbednosni propust.

Ukoliko zelite da postavite jednu numericku listu tema . ako objasnjavate kako da se izvrsi odredjeni zadatak. Svaka tema na listi pocinje sa <LI> (List Item) tagom.html <OL> <LI>Prvi element <LI>Drugi element <LI>Treci element <LI>Imate ideju o cemu govorim.AlefBrain PHP Trening. Teme koje unosite u numericke liste ne moraju da budu kratke reci ili fraze. Te liste se zovu simbolicke jer web browser prikazuje tackice ili kvadratice ispred svakog elementa u listi. numericka lista je savrsen nacin da vase citaoce sprovedete.html <UL> <LI>Prvi element <LI>Drugi element <LI>Treci element <LI>Jednostavno. Na primer. simbolicke i definicione. nisu i jedina vrsta listi. Redne liste Generalna postavka izgleda ovako: primer_04.redna lista) i </OL> tagovima. HTML tagovi za ove liste su veoma slicni onima koje ste videli kod numerickih listi. tabeli u ligi kuglanja ili bilo kojoj vrsti rangiranja . naravno. Skripta 1 2. Ako zelite samo da nabrojite nekoliko stvari. zar ne? </UL> 1 . Numericke liste. korak po korak kroz temu. Oznaka je od naziva Unordered List . Umesto toga. Kao i kod njih svaku temu pocinjete sa <LI> tagom.bilo da se radi o top ten listi. Evo kako to zapravo izgleda: primer_05. upotrebite HTML redne liste da bi vas browser proizveo brojeve za vas. samo sto kompletnu listu pocinjete i zavrsavate sa <UL> i </UL> tagovima. koriste dva tipa tagova: • • Citava lista je okruzena <OL> (Ordered List . ali kada listu prikazete u browseru brojevi ce se automatski prikazati.3. oznacavanje simbolima vam moze izgledati prikladnije.ne zamarajte se kucanjem brojeva. Kragujevac 2006. ali sta da se radi. Liste Ponekad cete pozeleti da nabrajanje nekih elemenata predstavite lepo uredjenom listom.ne bas logicno.HTML nudi tri razlicita stila za liste: redne (numericke). </OL> Uocite da ni jedan broj nisam ubacio ispred tema u listi.

Kragujevac 2006. potrebna su vam dva razlicita taga. Ipak. XVII vek <DT>Dokazao<DD>Endrju Vajls. 2 . Da biste oznacili dva razlicita dela svakog izraza. Odredjenije receno.html <DL> <DT>Teorema<DD>Jednacina x<sup>n</sup> + y<sup>n</sup> = z<sup>n</sup> nema resenja za n>2 <DT>Autor<DD>Pjer De Ferma. Skripta 1 Treci tip liste se zove definiciona lista. Ispred pojma se stavlja <DT> (Definition Term). gde svaki izraz ima dva dela: pojam i definiciju pojma. potpuno je legalno ubaciti jedan tip liste u drugi. primer_06. a ispred definicije <DD> tag.AlefBrain PHP Trening. U svom osnovnom obliku koristi se kao recnik-lista. Celu listu okruzujete tagovima <DL> i </DL> (Definition List). XX vek </DL> Ova tri tipa HTML lista bi trebalo da vam fino posluze za vecinu Web produkcija. dozvoljeno vam je da mesate i uparujete razlicite tipove po potrebi. Isprobajte sami kako se liste ponasaju kada ih kombinujete.

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

ali ako se nalazite na sajtu http://www.html”>Tekst koji ce postati link!</A> A ovo je link sa relativnom adresom: <A HREF=”strana1. Dakle. Kragujevac 2006. hajde da ne komplikujemo stvari za sada.com/.alefbrain. onda navodite samo ime dokumenta na koji se povezujete unutar HREF sekcije: 2 .html. nije zabranjeno ni da se pomocu njih povezujete i na odredjene odeljke drugih strana. relativnu adresu.com/ deo. Jos jedna vazna stvar koju treba pomenuti u prici o linkovima jesu e-mail linkovi. Ako se nekim slucajem nalazite na sajtu http://www. a drugi to nema. morate znati kako se dolazi do drugih dokumenata koji nisu u istom direktorijumu u kojem je dokument na kojem navodite link.com”>Posaljite e-mail</A> Kada se klikne na ovu vrstu linka.com/strana1.alefbrain. Skripta 1 <A HREF=”#ime”>Link do sidra</A> Mada uglavnom koristite sidra da biste se povezali na odeljke iste web stranice.alefbrain.html web http://www.AlefBrain PHP Trening. iza reci “mailto:”. zakljucujemo da je mesto do koga ce vas odvesti drugi link relativno u odnosu na web sajt ne kojem je takav link naveden . Uocite da u okviru spoljasnjih linkova mozete navoditi punu URL adresu dokumenta na koji se povezujete.html”>Tekst koji ce postati link!</A> Kao dva sto uocavate. automatski ce biti otvoren program za slanje e-maila sa novoformiranim pismom adresiranim na email naveden unutar HREF sekcije.com/ onda ce poslednja dva linka voditi do istog dokumenta. Evo primera linka sa punom adresom: <A HREF=”http://www. tada ce vas drugi link odvesti do dokumenta na adresi http://www. Ako na svom web sajtu koristite relativne linkove za povezivanje svih dokumenata koji ga sacinjavaju.com. Ali.google.zato ga i zovemo linkom sa relativnom adresom.com/strana1. vodi strana1. Evo na koji nacin se pravi email link: <A HREF=”mailto:mvranic@alefbrain. sto je veoma cest slucaj. Dok razlika prvi izmedju uvek poslednja do dva stranice linka je u tome na sto prvi ima sajtu http://www.alefbrain.html na tekucem sajtu. Sustinska razlika je u ponasanju poslednja linka. drugi link vodi do stranice strana1. ali mozete navesti i tzv.google. Ako se povezujete relativnom putanjom na dokument koji je u istom direktorijumu kao i tekuci dokument.

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... Testirajte ovo objasnjenje tako sto cete unutar svog root direktorijuma napraviti nekoliko umetnutih jedan u drugi. Tada cete se na fajl 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 je tekuci direktorijum /web/html/root/primeri/dir1/ a da se dokument strana1.AlefBrain PHP Trening. pa zato dva puta navodimo “.. a da je tekuci direktorijum /web/html/root/primeri/. Recimo da se dokument na koji se povezujete nalazi u direktorijumu cija je putanja /web/html/root/primeri/dir1/dir2/. 3 .html”>Tekst koji ce postati link!</A> Uocite oznaku “. pa u svaki stavite po jedan html dokument i onda pokusajte da ih medjusobno povezete relativnim putanjama.. Skripta 1 <A HREF=”strana1./strana1.html koji se nalazi u /web/html/root/primeri/dir1/dir2/ povezati linkom: <A HREF=”dir1/dir2/strana1./” kao naredbu povratka za jedan direktorijum unazad. tada ce relativni link imati oblik: <A HREF=”./”. On sluzi da objasni browseru koliko direktorijuma iznad se nalazi trazeni dokument.. Shvatite “. U nasem primeru taj broj je dva./.html nalazi u direktorijumu / web/html/root/. Kragujevac 2006./” unutar HREF sekcije.

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

AlefBrain PHP Trening.alefbrain.alefbrain. a tekst oko slike na desnoj strani RIGHT slika se pojavljuje na desnoj strani browser prozora. Ovaj efekat se postize kombinovanjem <A> i <IMG> tagova na sledeci nacin: <A HREF=”www. sto znaci da mozete koristiti samo jednu od gore navedenih opcija.com”><IMG SRC=”logo. 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. Kragujevac 2006. a tekst oko slike na levoj strani Napomenucu da i slika moze biti link.gif” ALIGN=”TOP|MIDDLE|BOTTOM|LEFT|RIGHT”> Znak “|” predstavlja logicko ekskluzivno ILI. 2 .gif”></A> Ako proverite u browseru.gif” BORDER=”0”></A> I granicnik je nestao.com”><IMG SRC=”logo. Skripta 1 <IMG SRC=”logo. 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.

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

Da biste napravili tu granicnu liniju izmedju slike i okruznog teksta. 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. Sta uciniti ako ste zeleli samo da promenite boju zaglavlja. a HEIGHT visinu slike. Postoje takodje i ekstenzije koje vam omogucavaju da promenite boje vasih linkova. Pixel predstavlja osnovni element slike i svaka slika je sastavljena iz odredjenog broja pixela.AlefBrain PHP Trening. 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. 2 . a VSPACE velicina margine sa leve i desne strane. 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). videcete da ce on cesto prelaziti njenu granicu. Ako vasu sliku okruzite tekstom. Problem sa ovom BODY tag ekstenzijom je taj sto utice na celu stranicu. Skripta 1 Postoji mnogo boja koje mozete koristiti i predlazem da detaljniji spisak web boja potrazite na Internetu. VLINK za boju posecenih linkova (visited links). 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. ALINK za aktivne linkove (aktivni link je onaj na koji ste kliknuli i cekate da se stranica otvori). Kragujevac 2006. pri cemu se ove vrednosti izrazavaju u pixelima.

Preporucujem da za pozadinu odaberete neku malu grafiku koja ce pozadini dati izgled lepe podloge. Kragujevac 2006. Skripta 1 Podesavanje pozadine: Veoma interesantna ekstenzija HTML-a je mogucnost promene boje pozadine vasih web dokumenata. potpuno je logicno da se ova ekstenzija nadje u unutar BODY taga: <BODY BGCOLOR=”#rrggbb”> Pored boje. paragrafa.</CENTER> CENTER tag je fin i jednostavan nacin za centriranje. paragrafi.AlefBrain PHP Trening. a browser ce se pobrinuti da pozadina citavog ekrana bude poplocana slikom koju ste naveli. To moze biti velika ili mala grafika. da biste podesavali paragrafe. 3 . 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. grafike za centriranje idu ovde. Da biste isti efekat postigli i sa vasim web stranicama <CENTER> tag vam omogucava centriranje zaglavlja. listi. pa cak i grafika. 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 vidimo kako funkcionise taj tag: <CENTER>Tekstovi. mozete odrediti i sliku koja ce se pojaviti u pozadini. Posto se te promene pojavljuju u telu dokumenta.

Dodajte red 2. Da biste dodali red ubacite <TR> (Table Row) i njegov odgovarajuci zavrsni </TR> tag izmedju <TABLE> i </TABLE> tagova. Svaka tabela pocinje tagom <TABLE> a zavrsava tagom </TABLE>. 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.html) Tabela je pravougaono uredjenje redova i kolona na vasem ekranu i predstavlja jedan od najvaznijih alata za pozicioniranje elemenata web stranice. Sada vam predstoje cetiri koraka u pravljenju tabele: 1. evo kako ce ona izgledati u HTML-u: 1 .AlefBrain PHP Trening. Kragujevac 2006. Podelite ga u zeljeni broj kolona 3. Posto je tabela nesto slozenija struktura pridruzeno joj je nekoliko tagova. Ponavljajte korake od 1 do 3 dok ne zavrsite. Kao i svaki element o kojem ste do sada culi. Ako zelite da unesete vrednosti za granice. Tabele (primer_10.7. Ako zelite da napravite tabelu sa top listom od tri najbolja kosarkasa svih vremena. i tabele imaju specificne tagove koji je grade. Sada podelite taj red u kolone smestajuci onoliko parova <TD> (Table Data) i </TD> tagova izmedju <TR> i </TR> koliko zelite kolona. 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. Svi ostali tagovi tabele smestaju se izmedju ovih tagova. Ubacite podatke u svaku celiju 4. Skripta 1 2.

mozete celiju 2 . Kragujevac 2006. linkove i liste. 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. a ako ne navedete koje poravnanje zelite standardno browseri koriste levo poravnanje. Skripta 1 <TABLE BORDER=”1” CELLSPACING=”1” CELLPADDING=”2”> <TR> <TD>1.</TD> <TD>Earvin Magic Johnson</TD> </TR> <TR> <TD>2. RIGHT i CENTER. Horiznotalna poravnanja su LEFT.</TD> <TD>Larry Bird</TD> </TR> </TABLE> Kao sto mozete videti. kao i da unutar njih mozete postavljati slike. Naravno. 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. 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. Sadrzaj u tabelama mozete ravnati horizontalno i vertikalno.AlefBrain PHP Trening.</TD> <TD>Michael Jordan</TD> </TR> <TR> <TD>3.

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

vecina elemenata forme koristi neku varijaciju na <INPUT> tag. kao sto ste primetili ima opciju koja se moze odabrati. a METHOD atribut govori browseru kako da posalje podatke.8. Kragujevac 2006. Na primer. tako da ih je veoma lako postaviti.html) Vecina modernih programa koristi dijalog box-eve kada zeli od vas da prikupi odredjene informacije.AlefBrain PHP Trening. 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. a ne standardni “Submit”. Biranje opcije govori programu sta da uradi. podaci iz forme se posalju programu navedenom u ACTION atributu. Evo najprostijeg oblika SUBMIT komande: <INPUT TYPE=”submit”> Kao sto cete videti. liste i komandne opcije. Kada posetilac klikne na ovu opciju. sve u cilju prikupljanja informacija od posetilaca sjta. To je stranica koja sadrzi upitnike. FORM tag uvek sadrzi par ekstra podataka koji govore web browseru kako da napravi formu. Sve ostale tagove vezane za forme postavljacete izmedju <FORM> i </FORM> tagova. a ovi tagovi se smestaju unutar <FORM> i </FORM> tagova. ACTION uvek pokazuje na neki program na serveru koji prihvata i obradjuje podatke. Do tada. Forme (primer_11. a METHOD moze imati vrednost POST ili GET od kojih oba uglavnom dobro funkcionisu. Forme se kreiraju pomocu specijalnih HTML tagova. a PHP ce nam dati resenje za preuzimanje tih podataka. 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. metodom koja je navedena u METHOD atributu. Forme takodje imaju komande opcije i to dve vrste: SUBMIT i RESET. Za pocetak unesite <FORM> i </FORM> tagove koji se mogu postaviti bilo gde u telu stranice. hajde da naucimo kako da zatrazite informacije od posetilaca sajta. Ako zelite da na dugmetu koje se kreira SUBMIT komandom bude prikazan neki drugi tekst. preporucuje se da kao METHOD uvek koristite POST. Vecina dijalog boxeva. Skripta 1 2. Submit opcija je ekvivalent OK opciji dijalog box-a. 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. Forma je jednostavno ekvivalent dijalog box-u na webu. onda primenite sledecu konstrukciju: 1 . ali posto GET moze imati problema sa prenosom vece kolicine podataka.

s tim sto moze da prikaze dva ili vise redova istovremeno. a COLS ukupan broj prikazanih kolona na ekranu. unesite unutar INPUT taga za text box atribut VALUE=”nekitext”. ROWS odredjuje ukupan broj prikazanih redova. Takodje. Skripta 1 <INPUT TYPE=”submit” value=”Posalji”> Na ovom dugmetu pisace “Posalji”.AlefBrain PHP Trening. mozete ograniciti i duzinu teksta koji se moze uneti u text box navodjenjem atributa MAXLENGTH=”y”. takodje. a ako zelite da kontrolisete velicinu text box-a. Text povrsina je takodje jedan pravougaonik koji prihvata unos texta. savetujem vam da koristite text povrsinu. Za proste tekst unose. ili su vam potrebni visestruki redovi. 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. WRAP atribut govori browseru da zapocne novi red kada god korisnik pri kucanju udari u desnu ivicu text povrsine. kao sto su ime drage osobe. Evo osnovnog oblika jednog check boxa: 2 . da <TEXTAREA> zahteva </TEXTAREA> zavrsni tag. To su pravougaonici u koje citalac moze da unese sta god zeli. ili omiljeni clan grupe. Ukoliko zelite da dobijete da/ne ili tacno/netacno odgovore od posetilaca sajta. Kragujevac 2006. Evo kako funkcionise: <TEXTAREA NAME=”ime” ROWS=”x” COLS=”y” WRAP></TEXTAREA> GDE JE name IME text povrsine. kasnije cemo u prici o PHP-u imati detaljnije objasnjenje u vezi imena i njegove namene. 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. Ukoliko zelite da unapred stavite neki text u text box. upotrebite atribut SIZE=”x”. check boxevi su stvoreni za tako nesto. koristite text boxeve. Zapazite. 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. 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 sada samo zapamtite da svako polje forme mora imati jedinstveno ime.

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

AlefBrain PHP Trening. 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. 4 . Kragujevac 2006. a do tada nemojte zaboraviti forme jer ce vas one pratiti na svakom koraku vase karijere Internet programera.

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

osim ako se drugacije ne naglasi.AlefBrain PHP Trening.Helvetica. svi tagovi u okviru tog paragrafa ce naslediti tu boju."> Ovo je bold tekst prikazan velicinom slova od 14 pointa u Helvetica fontu </P> <P style="font-family: Verdana. H1. Vrednost tog parametra je zapravo font koji definisem (Arial. • • Deklaracija deklaraciju. (declaration) - parametri i vrednosti se kombinuju cineci Pravilo (rule) . font-weight: bold. interni i inline stil bas tim redom. To znaci da mozete koristiti tri tipa stila i browser ce prikazivati eksterni. pozadine…U CSS-u postoji mnogo parametara koje mozete koristiti da biste definisali selektor. Kragujevac 2006. </P> Interni stilovi koriste tag <STYLE> postavljen ispod </HEAD> taga i pre <BODY> taga u standardnom HTML dokumentu: 2 .Arial. color: #FF0000. • Vrednost (value) definise parametar.sans-serif. font-size: 12pt.Ono komanduje da se. font-family. Drugi aspekt kaskade je nasledjivanje. Evo primera primene inline stila: primer_12. Inline stil se primenjuje na bilo koji logican HTML tag koji koristi atribute stila. Na primer. Helvetica i sl). osim ako drugacije ne naredite. Parametri podrazumevaju stvari kao sto su margine. mozete kontrolisati aspekte pojedinih stranica pomocu internog stila i pojedina podrucja na tim stranicama pomocu inline stila.sans-serif.html <P style="font-family: Helvetica. kao parametar. Na primer. ako imate paragraf koji ce biti selektor. color: #00FF00. kao selektor i ubacio sam familiju fontova."> Ovaj tekst bice prikazan sa velicinom slova od 12 pointa u Verdana fontu.dok interpretira informacije o stilu. Cak i ako primenite glavni stil na citav sajt.kaskadu .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 . odredjeni stil nasledi u drugim aspektima HTML stranice na koje moze uticati. fontovi. Recimo da imam naslov prvog reda. font-size: 14pt. mozete ukljuciti parametar koji ce definisati taj selektor. Skripta 1 • Parametar (property) definise selektor.Arial. ako definisete odredjenu boju teksta u tagu <p>.

nije tesko pratiti logiku. Skripta 1 primer_13.css i smestite ga negde unutar svog direktorijuma koji je vidljiv iz web servera.} P {font: 12 pt times.} P {font: 12 pt times. samo sto cete ove informacije postaviti u odvojeni dokument. color: #000000. Evo sintakse za eksterni stil: primer_14.html <HTML> <HEAD><TITLE>Primer internog stila</TITLE></HEAD> <STYLE> BODY {background: #ff0000. text-decoration: none. style sheet kod izgleda pomalo drugacije od standardnog HTMLa.} </STYLE> Sada snimite ovaj dokument kao poseban fajl.css. Koristicete isti kod kao za interni stil. color: #cccccc. color: #000000.} H1 {font: 14pt verdana. Zatim pravite link ka ovom fajlu sa svih stranica na kojima zelite da primenite tako definisan stil.css” type=”text/css”> 3 . Nastavite tako sto cete sa ovim dokumentom povezati svaku HTML stranicu na kojoj zelite da primenite stil. koristeci sledecu sintaksu. Ipak.AlefBrain PHP Trening.} A {color: #00ff00. Nazovite ga style1.css <STYLE> BODY {background: #ff0000. color: #cccccc.} A {color: #00ff00.} </STYLE> <BODY> </BODY> </HTML> Kao sto mozete videti iz gornjeg primera. Kragujevac 2006. postavljenu ispod </TITLE> taga i iznad </HEAD> taga: <LINK REL=”stylesheet” href=”style1. Eksterni stil prosiruje koncept internog stila.} H1 {font: 14pt verdana. Taj dokument se potom snima sa ekstenzijom . text-decoration: none.

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 1 2 Naziv Nike Patike Adidas Patike Boja Crna Bela Velicina 45 43 Cena 2000 3000 Opis Neki opis Neki opis

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

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 1 2 3 4 5 6 7 Naziv Nike Patike Adidas Patike Nike Patike Adidas Patike Nike patike Nike Patike Nike Patike Boja Crna Bela Bela Crvena Crna Crna Crna Velicina 45 43 45 44 42 43 44 Cena 2000 3000 2000 3000 2000 2000 2000 Opis Neki opis Neki opis Neki opis Neki Opis Neki Opis Neki opis Neki Opis

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

2

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

master -id -naziv -cena -opis

boje -id -boja

velicine -id -velicina

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

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

3

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

naziv Adidas Patike

cena 3000

opis Neki Opis

boja Crna Bela Bela Crvena

velicina 45 43

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

4

AlefBrain PHP Trening, Kragujevac 2006. Skripta 1

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

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

5

da biste kreirali baze i tabele. dodali podatke u njih. Sta su upiti? Upiti su komande napisane u SQL-u (Structured Query Language). a svim tim upravlja MySQL. Detaljnije cete se upoznati sa SQL-om kasnije u ovom poglavlju. obrisali ili preuzeli informacije koje cete koristiti u aplikaciji.sto znaci da ga mozete besplatno koristiti! 6 . MySQL je jeftiniji od Oracle-a za nekoliko desetina hiljada dolara. koje saljete svom sistemu za upravljanje bazama podataka. 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. izmenili pojedine slogove. MSSQL servera i drugih.AlefBrain PHP Trening. Kragujevac 2006. MySQL belezi akcije ovih korisnika i upravlja odgovorima na upite. Osim toga. Osim toga. Skripta 1 nivoi pristupa i dozvole. (u ovom slucaju to je MySQL). jer je MySQL open source proizvod .

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

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

koji je ukljucen u WAMP instalaciju.klikom na ovu opciju dobijate prostor za postavljanje SQL upita (veoma vazna funkcija i najcesce cete sa njom raditi) 1 . Osnovni izgled PHPMyAdmin radnog prostora prikazuje sledeca slika: Leva margina sadrzi drop-down meni sa spiskom baza podataka koje imate na svom serveru. Skripta 1 3. Neke od njih koje ce vam biti neophodne su: ● Structure .prikazuje strukturu cele baze (spisak svih tabela sa osnovnim informacijama o njima) ● SQL . a sa desne strane. Kragujevac 2006. dobijate izgled PHPMyAdmina kao na sledecoj slici.phpmyadmin. Sa desne strane nalazi se glavni prozor programa u kojem na pocetku imate linkove ka osnovnim funkcijama koje mozete izvoditi globalno nad MySQL serverom. pored spiska svih tabela sa nesto detaljnijim informacijama.3.AlefBrain PHP Trening.net/). Osnovna uputstva za rad sa MySQL serverom pomocu PHPMyAdmin aplikacije Jedna od najpoznatijih PHP aplikacija za rad sa MySQL serverom je PHPMyAdmin (http://www. U levoj margini pojavljuje se spisak svih tabela u bazi. imate na vrhu pristup raznim komandama koje cete koristiti u radu. Kada odaberete neku bazu iz drop-down menija.

AlefBrain PHP Trening.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 . Skripta 1 ● Export . Kragujevac 2006. koristite ovu komandu ● Drop .ako zelite da izvezete podatke i/ili strukturu cele ili dela baze.

mozete uraditi sve sto zelite nad jednom bazom podataka. a namerno ne zelim da ih detaljnije objasnjavam iz sledeceg razloga: pomocu SQL-a. pa vam nikakva pomagala. nisu potrebna.funkcija za unosenje novih podataka u tabelu ● Empty . Kragujevac 2006.sluzi za pregledanje sadrzaja tabele ● Insert . 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 . Na vrhu su se pojavile neke nove funkcije. osim prostora za postavljanje SQL upita. Skripta 1 Obratite paznju kako izgleda glavni prozor PHPMyAdmina kada radite na jednoj tabeli.funkcija koja brise sve podatke iz tabele Ovim nije ni izbliza pokriven opis svih funkcionalnosti koje pruza PHPMyAdmin. koji cemo izuciti.AlefBrain PHP Trening. PHPMyAdmin je intuitivno dizajnirana aplikacija i siguran sam da cete je sami lako otkrivati tokom rada. a objasnimo sledece: ● Browse .

Skripta 1 4 .AlefBrain PHP Trening. Kragujevac 2006.

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

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

3 .AlefBrain PHP Trening. ENUM prestavlja unapred definisan niz mogucih vrednosti za dato polje. pri cemu je i ENUM tip vrlo koristan. Kragujevac 2006. Skripta 1 • • LONGBLOB ili LONGTEXT je BLOB ili TEXT sa maksimalnom duzinom od 232 karaktera. Verovatno cete koristiti VARCHAR i TEXT polja cesce od drugih.

name_id. Sve CREATE TABLE naredbe mogu se napisati u jednoj liniji. name_id. company_name add_id. post_code. Naredbe koje slede su preliminarne. Nazivi polja su bitni za administraciju podataka. Vazno je napomenuti da se svaka SQL komanda zavrsava znakom “. Skripta 1 3. Upoznajmo se sa osnovnom sintaksom SQL-a za kreiranje tabela: CREATE TABLE ime_tabele (ime_polja tip_polja). country_code. type email_id. 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 . Ako napravite gresku prilikom kreiranja tabele. MySQL uopste ne vidi visestruke linije. job_function company_id. number. Stoga imena treba da budu sto jednostavnija i relevantna za podatke koje cuvaju. Definisimo sada tipove polja u tabelama i napisimo SQL komande za njihovo kreiranje. Ako je vasa baza normalizovana imacete mnostvo malih tabela i bice vam od velike pomoci ako nazivi polja imaju nekog smisla. country_code. type notes_id. name_id.5. street.”. last_name job_id. bilo kod imena polja ili definicije tipa. name_id. type fax_id. nazive polja i definicije za svako polje. email. Ovo je pojednostavljena sintaksa. Pretpostavimo da je potrebno napraviti bazu koja ce sadrzati kontakt podatke koje zelite da prikupite od posetilaca nekog sajta. city. date_modified. Kragujevac 2006. U sledecoj tabeli navedena su imena tabela i polja koja ce nam biti potrebna za kreiranje baze za cuvanje kontakata: Naziv tabele master_name job_function company address telephone fax email personal_notes Nazivi polja name_id. jer ce biti kompletirane definicijama kljuceva i indeksa nesto malo kasnije. postoji komanda ALTER koja vam daje mogucnost predefinisanja polja. ali polako cemo razmatrati deo po deo da biste razumeli sve delove slagalice. name_id. state. first_name. type tel_id. Kreiranje tabela Kreiranje tabela zahteva tri bitne klase informacije: nazive tabela. note Sada je potrebno definisati tipove za navedena polja sto ce biti uradjeno u okviru preliminarnog kreiranja tabela. name_id. njemu je samo vazan pravilan redosled zagrada i zareza. date_added. name_id. ali se obicno pisu u vise linija radi bolje preglednosti. number.AlefBrain PHP Trening.

CREATE TABLE company ( company_id SMALLINT UNSIGNED. 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. evo i komande za kreiranje tabele master_name: CREATE TABLE master_name ( name_id SMALLINT UNSIGNED. date_added DATE. name_id SMALLINT UNSIGNED. a nisu na Windows-u. Tabela address ima neke interesantne clanove. onda nam je dovoljno da koristimo DATE tip za ova polja. Kragujevac 2006. job_function VARCHAR(100) ). date_modified DATE. Ako se ipak dogodi da se priblizimo tom broju. imena baza podataka i tabela u njima su case-sensitivni na UNIX/Linux operativnim sistemima. last_name VARCHAR(75) ). Posto postoji velika mogucnost da nikada necete upoznati osobu sa imenom ili prezimenom duzim od 75 karaktera. name_id SMALLINT UNSIGNED.AlefBrain PHP Trening. company_name VARCHAR(100) ). Imena polja su caseinsensitivna na bilo kojem operativnom sistemu. Napokon. Isto razmisljanje primenicemo na sva ostala id polja u tabelama. Medjutim. onda kasnije mozemo zameniti tip tog polja u INT. first_name VARCHAR(75). Znate da postanski brojevi imaju najmanje 5 a najvise 10 karaktera pa polje za post_code mozemo definisati 2 . za polja first_name i last_name koristicemo VARCHAR(75) tip. Velika slova prilikom pisanja SQL naredbe sam koristio samo zbog bolje preglednosti i napominjem da komande nisu case-sensitivne. 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. pored standardnih id-ova. posto se podaci unutar MySQLa cuvaju u direktorijumima i fajlovima. Skripta 1 cemo ikada prikupiti. Slede komande za kreiranje ostalih tabela: CREATE TABLE job_function ( job_id SMALLINT UNSIGNED.

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

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

ime_polja2 tip_polja UNIQUE. CREATE TABLE ime_tabele ( ime_polja tip_polja PRIMARY KEY NOT NULL AUTO_INCREMENT. ali njihova preterana upotreba ima vise losih nego dobrih efekata. ime_polja2 tip_polja UNIQUE ). Osim toga mozete indeksirati visestruke kolone njihovim dodavanjem u listu polja: … INDEX idx_col3(ime_polja2. ta je kolona automatski indeksirana. ime_polja3 tip_polja.pomaze da brze pronadjete termine. ime_polja3). Ako ste vec kreirali svoju tabelu mozete izdati naredbu za dodavanje indeksa postojecoj tabeli: CREATE INDEX idx_cols ON ime_tabele(ime_polja2. Bez njega. Ostali indeksi mogu biti definisani u toku naredbe kreiranja tabele: CREATE TABLE ime_tabele ( ime_polja tip_polja PRIMARY KEY NOT NULL AUTO_INCREMENT. Kragujevac 2006.AlefBrain PHP Trening. Kao sto cete uskoro nauciti. Dodavanje jedinstvenih kljuceva je slicno dodavanju primarnih kljuceva. ali mozete definisati mnoge druge jedinstvene kljuceve u svojoj tabeli ako je to opravdano. Mozete odluciti da nikada ne definisete jedinstveni kljuc u svojim tabelama ako one vec sadrze primarni kljuc. Ranije ste naucili da je indeks baze podataka slican indeksu na kraju knjige . Skripta 1 AUTO_INCREMENT je veoma veoma jednostavna konstrukcija i od velike je pomoci u razvoju aplikacija. Ako imate polje sa primarnim kljucem. 5 . Razlika je u tome sto polja definisana kao jedinstveni kljucevi mogu sadrzati NULL vrednost. kljucevi su odlicni. U ovom primeru ime indeksa je idx_col3 i sadrzi informaciju iz polja ime_polja3. potrebno je izvrsiti dodatni upit pre dodavanja sloga da biste rucno pribavili tekucu najvecu vrednost u polju. Termin “primarni” govori da mozete imati samo jedan takav kljuc u jednoj tabeli. INDEX idx_col3(ime_polja3) ). ime_polja3) … Jos jedan metod za dodavanje indeksa je CREATE INDEX naredba.

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

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

'work'. 'work'. name_id SMALLINT UNSIGNED NOT NULL DEFAULT ‘0’. note TEXT ). 'work'. name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0'. name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0'. type ENUM('home'. country_code CHAR(3). name_id SMALLINT UNSIGNED NOT NULL DEFAULT '0'. CREATE TABLE personal_notes ( notes_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT. email VARCHAR(150). Kragujevac 2006. type ENUM('home'. CREATE TABLE fax ( fax_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT. 8 . 'other') ). 'other') ). country_code CHAR(3). number VARCHAR(25). type ENUM('home'. Skripta 1 CREATE TABLE telephone ( tel_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT. 'other') ). CREATE TABLE email( email_id SMALLINT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT.AlefBrain PHP Trening. number VARCHAR(25).

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

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

Najosnovnija sintaksa SELECT komande izgleda ovako: SELECT izrazi_i_polja FROM ime_tabele [WHERE neki_uslov] [ORDER BY neko_polje [ASC|DESC]] [LIMIT pocetak. zamenite znak * nazivima kolona. Pretpostavimo da u tabeli master_name ima vise osoba sa prezimenom Petrovic. koji ce vratiti samo razlicite pojave u rezultujucem skupu. SQL komanda za prikupljanje sacuvanih podataka je SELECT i sada cete nauciti kako da je upotrebite. 1 . primenicete sledeci upit: SELECT DISTINCT last_name FROM master_name. first_name i last_name iz tabele master_name: SELECT name_id. Ako izvrsite ovaj upit u PHPMyAdminu dobicete tabelu sa svim podacima koje imate u tabeli master_name.AlefBrain PHP Trening. sto je uzrokovano primenom DISTINCT izraza. Posto prethodna recenica nije bas jasna. first_name. Dakle. objasnicu je primerom. Koristan izraz koji se moze upotrebiti sa SELECT komandom je DISTINCT.7. Naredna naredba selektuje samo name_id. Ako zelite da selektujete sva prezimena bez ponavljanja onih koja se pojavljuju vise puta u tabeli. 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. Selektovanje podataka (SELECT) Konacno ste popunili svoje tabele podacima. Ako zelite da selektijete samo odredjene kolone. Sintaksa SELECT komande moze biti krajnje jednostavna. last_name FROM master_name. ali i vrlo komplikovana. Kragujevac 2006. razdvojenim zarezima. Sada je vreme da naucite kako da podatke procitate iz tabele. da biste selektovali sve elemente (sve vrste i kolone) iz tabele master_name. vasa SQL naredba ce biti: SELECT * FROM master_name. Rezultat ovog upita bice lista prezimena sa samo jednim pojavljivanjem prezimena Petrovic. Skripta 1 3.

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

Na primer.AlefBrain PHP Trening. Sada cete nauciti kako da upotrebom WHERE klauzule selektujete posebne slogove iz tabele. Ako koristite stringove ili datume u WHERE klauzuli. Umesto toga. mozete primeniti COUNT() funkciju. Kragujevac 2006. a MAX() najnoviji datum u polju. koja broji sve vrednosti u odredjenoj koloni koje nisu NULL. da biste saznali broj jedinstvenih vrednosti u nekom polju: SELECT COUNT(DISTINCT last_name) FROM master_name. a ima ih jako mnogo koje se krecu od neopazenih. COUNT() mozete koristiti zajedno sa DISTINCT izrazom. selektujete minimalne i maksimalne vrednosti za name_id iz master_name tabele: SELECT MIN(name_id) FROM master_name. koji ste ranije savladali. Ako je polje definisano kao datum. treba pomenuti jos neke osnovne funkcije MIN() i MAX(). 3 . Kada to znate. 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'. Izmedju ostalog. onda ce MIN() vratiti najraniji datum. ako koristite COUNT na primarnom kljucu. Ili: SELECT MAX(name_id) FROM master_name. koje se koriste za selekciju minimalnih ili maksimalnih vrednosti u polju. morate ih ograditi znacima navoda. zato vam srdacno preporucujem da ih upoznate citajuci MySQL manual. mozete vrlo brzo doci do broja slogova u tabeli. Ovo je bilo samo nekoliko primera ugradjenih MySQL funkcija. Evo kako upotrebiti COUNT() funkciju: SELECT COUNT(name_id) FROM master_name. do onih bez kojih se ne moze. Skripta 1 pronadjete odgovor.

vec mozete istovremeno citati podatke iz vise tabela . Evo jednog SELECT upita koji pronalazi sve slogove u tabeli master_name kojima je ime Petar. Upotrebom operatora poredjenja i logickih operatora.taj se proces zove spajanje tabela. 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'. Skripta 1 U ovom primeru ste koristili operator ‘=’ unutar WHERE klauzule. Upotrebom dve zasebne SELECT naredbe mozete selektovati sve vrste iz svake tabele: 4 . Postoji mnogo tipova operatora koje mozete koristiti. Pretpostavimo da imate dve tabele: fruit i color.AlefBrain PHP Trening. Sledi tabela sa vaznijim operatorima i njihovim imenima: Operator = != <= < >= > AND OR Znacenje Jednako Razlicito Manje ili jednako Manje Vece ili jednako Vece Logicko I Logicko ILI Kada koristite operatore poredjenja pri radu sa stringovima. poredjenje ne razlikuje velicinu slova. medju kojima su operatori poredjenja i logicki operatori najpopularniji. U koriscenju SELECT naredbe niste ograniceni na selekciju podataka iz samo jedne tabele u jednom upitu. mozete dobiti vrlo selektivne upite koji ce vam cesto biti potrebni radi efikanog resavanja problema sa kojima se budete susretali. Kragujevac 2006.

Ovakav upit je u svakom slucaju neupotrebljiv.11 sec) Kada zelite da selektujete odjednom iz obe tabele. Prvo. postoji nekoliko razlika u sintaksi SELECT naredbe. +----+----------------+----+------------------+ | id | fruit_name |id | color_name | +----+----------------+----+------------------+ | | | | 1| 2| 1| 2| apple apple banana | | | 1 | red 1 | red 2 | yellow 2 | yellow | | | | banana | +----+----------------+----+------------------+ 4 rows in set (0. ono sto ce uraditi ovaj upit jeste udruzivanje dveju tabela tako sto ce svakom elementu tabele fruit pridruziti svaki element tabele color. 5 . Kragujevac 2006. 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. +----+-------------------------+ | id | | 1 2 | color_name | red | yellow | | | +----+--------------------------+ +----+--------------------------+ 2 rows in set (0. primenicete sledecu naredbu: mysql> select * from fruit. +----+--------------------------+ | id | | 1 2 | fruit_name | apple | banana | | | +----+--------------------------+ +----+--------------------------+ 2 rows in set (0. color. morate se uveriti da se sve tabele koje koristite u svom upitu pojavljuju u FROM klauzuli.AlefBrain PHP Trening. Upotrebom fruit i color primera. ako jednostavno zelite da selektujete sve kolone i vrste iz obe tabele.11 sec) Medjutim.05 sec) mysql> select * from color. Skripta 1 mysql> select * from fruit.

color_name from fruit.06 sec) 6 . +----------------+------------------+ | fruit_name | color_name | +----------------+------------------+ | apple | banana | red | yellow | | +----------------+------------------+ 2 rows in set (0. Skripta 1 Recimo da zelite da selektujete sve podatke iz fruit i color tabela koji imaju isti ID: mysql> select fruit_name. Kragujevac 2006.id. color where fruit.id=color.AlefBrain PHP Trening.

Pretpostavimo da imate tabelu pod nazivom fruit. upotrebite sledeci upit: mysql> update fruit set status='zrelo'. Izmena i brisanje podataka (UPDATE. a stringove morate ograditi navodnicima. Kragujevac 2006. Takodje. Bio je uspesan. naziv voca i status voca (zrelo ili trulo): mysql> select * from fruit.8. Obratite paznju i da je samo jedan slog promenjen. UPDATE je SQL komanda koja se koristi za izmenu sadrzaja jednog ili vise polja u postojecem slogu. jer je drugi slog vec imao status=’zrelo’. mozete imati potrebu za brisanjem pojedinih slogova iz tabela.00 sec) Rows matched: 2 Changed: 1 Warnings: 0 Pogledajte rezultat upita. Najosnovnija UPDATE sintaksa izgleda ovako: UPDATE table_name SET ime_polja=’nova vrednost’. Mozete zameniti cele slogove ili mozete samo azurirati pojedina polja.05 sec) Da biste azurirali status voca u zrelo u svim slogovima tabele. Ime_polja2 = ‘nova vrednost2’ [WHERE neki_uslov_je_ispunjen] Linije vodilje za azuriranje sloga su slicne onima koje su upotrebljene prilikom umetanja sloga . sto se moze videti iz Query OK poruke. DELETE) Za izmenu tabela i njihovog sadrzaja postoji nekoliko nacina pomocu MySQL-a. Skripta 1 3. +----+-----------------+--------+ | id | fruit_name | status | +----+-----------------+--------+ | | 1| apple 2| banana | zrelo| | trulo| +----+-----------------+--------+ 2 rows in set (0.AlefBrain PHP Trening. 1 . koja sadrzi ID. 1 row affected (0. Query OK.podatak koji unosite mora odgovarati tipu podataka polja.

Sada tabela fruit izgleda ovako: mysql> select * from fruit. Zbog pokusaja da se promeni naziv jednog polja. jer nije bio naveden uslov! Zamislite sada tabelu u kojoj imate nekoliko miliona slogova sa stotinama vrsta razlicitih proizvoda. Sledeci upit ce imati veoma lose rezultate: mysql> update fruit set fruit_name = 'banane'. 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.moguci scenario je da administrator baze nije brinuo o cuvanju rezervne kopije. sva polja su promenjena. Ako vam je za utehu. verovatno ce i administrator leteti s posla zajedno sa vama. 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. Query OK. Upotreba WHERE klauzule u UPDATE naredbi je slicno nacinu na koji se to radi u SELECT upitu. Neka sadrzi sledece podatke: 2 . zatim zamislite jedan ovakav nepromisljen upit koji menja sve slogove. Uslovno azuriranje znaci da koristite WHERE klauzule da biste upit usmerili ka tacno odredjenim slogovima. 2 rows affected (0. Pretposatvimo da vasa tabela fruit nije popunjena samo bananama. Kragujevac 2006. Da biste bolje razumeli.AlefBrain PHP Trening. dakle svi slogovi su promenjeni. Sva poredjenja i logicki operatori mogu biti upotrebljeni.11 sec) Svi slogovi voca su sada banane. jer se vidi da su dva od dva sloga promenjena.05 sec) Rows matched: 2 Changed: 2 Warnings: 0 Kada pogledate rezultat ovog upita bicete zaprepasceni. a onda zamislite da se iz back-up kopije zbog nekog cudesnog razloga ne moze izvuci kopija podataka . +----+-------------+-----------+ | id |fruit_name| status | +----+-------------+-----------+ | | 1| banane 2| banane | zrelo | | zrelo | +----+-------------+-----------+ 2 rows in set (0. tj. recimo da je rec banana pogresno napisano u tabeli i da zelite upotrebom UPDATE komande ispraviti gresku.

Pre nego sto savladate jednostavnu DELETE komandu.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 U ovom slucaju. Kragujevac 2006.05 sec) Postoji jos nekoliko nacina upotrebe UPDATE komande. Naredba UPDATE kojom cemo ispraviti rec ‘orannge’ i napisati ‘orange’ glasi: mysql> update fruit set fruit_name='orange' where fruit_name='orannge'. +----+----------------+--------------+ | id | fruit_name | status | | | 1| apple 2| pear 3| orange | zrelo | zrelo | trulo | | | | +----+----------------+--------------+ +----+----------------+--------------+ 3 rows in set (0. Osnovna sintaksa komande DELETE je: DELETE FROM ime_tabele [WHERE neki_uslov_je_ispunjen][LIMIT broj_slogova] 3 .05 sec) Mozete videti da rec ‘orannge’ nije napisana ispravno.uvek cuvajte rezervnu kopiju svojih podataka. Skripta 1 mysql> select * from fruit.AlefBrain PHP Trening. samo je jedna vrsta promenjena i ako selektujemo sve slogove tabele fruit evo sta dobijamo: mysql> select * from fruit. 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. oni su otisli zauvek. +----+----------------+--------------+ | id | fruit_name| status | | | 1| apple 2| pear | zrelo | zrelo | | | | +----+----------------+--------------+ 3| orannge | trulo +----+----------------+--------------+ 3 rows in set (0. Query OK. 1 row affected (0. evo podsetnika . Kada jednom obrisete podatke iz tabele.

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 | | 1| apple 2| pear | zrelo | zrelo | | | +----+----------------+--------------+ +----+----------------+--------------+ 2 rows in set (0. Skripta 1 Obratite paznju da u naredbi brisanja nema navodjenja kolone . Query OK. 1 row affected (0.00 sec) Kao sto vidite iz rezultata upita.05 sec) 4 . 1 row affected (0. Evo upita koji ce jednim potezom to uraditi: mysql> delete from fruit where status='trulo'.AlefBrain PHP Trening.05 sec) Ako zelite da izbrisete samo jedan slog iz tabele primenite klauzulu LIMIT na sledeci nacin: mysql> delete from fruit -> limit 1. jedan slog je izbrisan i sada tabela fruit izgleda ovako: mysql> select * from fruit. 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. +----+----------------+--------------+ | id | fruit_name | status | 2| pear | zrelo | | +----+----------------+--------------+ +----+----------------+--------------+ 1 row in set (0. Query OK.kada koristite DELETE uklanja se ceo slog. Kragujevac 2006.

Skripta 1 Mozda nekad pozelite da jednostavno obrisete sve slogove iz tabele. Kragujevac 2006. Empty set (0.05 sec) 5 . 0 rows affected (0.00 sec)” .AlefBrain PHP Trening. Query OK.00 sec) Nemojte biti zabrinuti sto rezultat upita glasi “0 rows affected (0.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. Evo komande koja ce to ostvariti: mysql> delete from fruit.

Skripta 1 3. Ako zelite da pregledate listu tabela baze dev_tiid imate na raspolaganju vrlo jednostavnu naredbu: mysql>show tables. Kragujevac 2006. +-------------------------------+ | 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. 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. Jos neke korisne naredbe (SHOW. primenite sledecu komandu: 1 . Pretpostavimo da imate bazu koja nosi ime dev_tiid.AlefBrain PHP Trening. DROP.9. DESCRIBE.

Skripta 1 mysql>show databases. jer ako pokusate da izbrisete nepostojecu tabelu ili bazu. Kragujevac 2006. +-------------------------------+ | Database | ab_online_support | alefbrain | coregs | dev_tiid | fjbeauty | helpAppDB | hospital | leadgreed | mysql | totalinternetid | | | | | | | | | | | +-------------------------------+ +--------------------------------+ 10 rows in set (0. 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.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. poput AUTO_INCREMENT Sintaksa za describe je: DESCRIBE ime_tabele [ime_polja] 2 .AlefBrain PHP Trening. MySQL ce generisati poruku greske.

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

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

 ­ Skripta 2 1. Strane koje sadrze PHP­ov skript razlicite su od strana koje sadrze samo HTML. Primer PHP­ovog koda. 3.php  4.?> </BODY> </HTML> 2. cuvaju se sa oznakom tipa . Zatim otvorite Web browser i unesite celu adresu vaseg Web Servera i ime upravo napravljenog skripta: http://localhost/example1. Isprobajte prvi primer programa: 1. i da bi bile prepoznatljive.AlefBrain PHP Trening 2006. U web browseru pojavice se nesto slicno sledecem: 1 .php u root direktorijumu Web servera. Sacuvajte ovo kao fajl example1. Rezultat izvrsenog skripta prikazuje se u web browseru kao HTML kod. Otvorite tekst editor i unesite sledece: <HTML> <HEAD> <TITLE>Moj prvi PHP skript!</TITLE> </HEAD> <BODY> Danasnji datum je: <?php echo date("d M Y").php (ili nesto slicno) na serveru i izvrsava ih PHP­ovo okruzenje koje radi na serveru. HTML­ovog koda i PHP­ovog skripta. istorijat i buducnost Primer PHP­ovog koda Pocnimo najjednostavnijim primerom sa jednim redom  ­ cilj nam je da prikazemo da su PHP­ ove strane mesavina tri stvari: teksta.

 znate da sve unutar njih mora da bude PHP kod. zatim mesec i na kraju godina a izmedju njih ostavi po jednu prazninu (“d M Y”). pozvao je PHP masinu i prosledio joj sve sto je pronasao do zatvarajuce PHP oznake “?>”. PHP masina je preuzela dobijeni kod  echo date("d M Y"). jer on sam ne razume PHP. Web server se zahvalio PHP masini na pomoci i sada je imao kompletan odgovor za vas koji je prikazao u web browseru.” ili do zatvarajuce PHP oznake. svaki put kada vidite deo koda koji je okruzen oznakama <?php ?>. pozvao je svoju ugradjenu funkciju “date” i rekao joj: ­ Treba mi danasnji datum sa danom u mesecu u obliku dve cifre (d). Kod sa svetlom (zutom pozadinom) jeste HTML. Tako je nastao datum “28 Feb 2006”. vec o PHP skriptu.  Posto ste upoznali osnovni princip funkcionisanja PHP­a na webu. i prevela serveru njegovo znacenje: ­ Izraz koji si mi dao govori da treba odstampati na ekranu “28 Feb 2006”. mozemo se otisnuti u detaljnije upoznavanje ove briljantne tehnologije. pogledajmo kod koji smo uneli i dodelimo svaku od tri kategorije: <HTML> <HEAD> <TITLE>Moj prvi PHP skript!</TITLE> </HEAD> <BODY> Danasnji datum je: <?php echo date("d M Y"). u “Odstampaj na ekranu 28 Feb 2006”. ­ Skripta 2 Kao sto smo rekli pre ovog primera. Najpre. Znam. tri prva slova od imena meseca (M) i cetvorocifrenom godinom (Y) i neka budu poredjani tako da prvo bude dan. tri tipa sadrzaja sasvim lepo zive zajedno na Web strani. kako je PHP znao da treba stampati nesto na ekranu? To je saznao iz reci “echo” koja predstavlja PHP­ovu funkciju za stampanje svega sto iza nje sledi do znaka “. Dakle. a usput je procitao sve sto je izvan tih oznaka jer Web server razume HTML i obican tekst. Dobro dosli!  Evo sta se dogodilo: Kada ste u adresnu liniju web browsera uneli http://localhost/example1. Kada je naisao na “<?php”. ciljamo da prvo prikazemo tri razlicita tipa koda koji se koristi na ovoj strani.php i pritisnuli ENTER. Najpre je iz oznake tipa (. PHP skript je oznacen uglastim zagradama i znakovima pitanja. poslali ste zahtev Web serveru da vam prikaze stranicu example1. to je obican tekst. pitate se sada kako je <?php echo gmdate(“M d y”)?> iz naseg skripta postalo 28 Feb 2006? Odgovor na ovo pitanje uvodi vas u cudesni svet PHP­a.?> </BODY> </HTML>                                                                                                              Kod sa cistom pozadinom u stvari i nije kod. Pocnimo sa nekoliko istorijskih podataka i 2 . U tih nekoliko trenutaka Web Server je imao pune ruke posla.AlefBrain PHP Trening 2006. Dakle. Kao sto mozete videti iz rezultata u Web browseru.  pisan na jeziku koji ona savrseno razume.php i posle nekoliko trenutaka dobili ste rezultat.  Ostaje samo da se demistifikuje nacin na koji je PHP masina prevela izraz echo date("d M Y"). Zatim je presao na date("d M Y"). sto ga je podstaklo da posebno obrati paznju na njegov sadrzaj i potrazi oznake za PHP kod “<?php” i “?>”. Kod sa tamnom pozadinom (plavom) je PHP skript.php) shvatio da se ne radi o obicnom fajlu.

 Posebno prilagodjen leksicki skener isao je kroz skript i kada bi naisao na kljucnu rec while pamtio bi njenu poziciju. osetili kako su sposobni da naprave mnogo bolji skriptujuci jezik i tako su zapoceli jos jedan ciklus ponovne izgradnje jezika iz koga je rodjen PHP4. Zbog novog nacina izvrsavanja skripti. kada je Rasmus Lerdorf zapoceo rad na PHP/FI ­ Personal Homepage Tools/Form Interpreter. PHP4 zvanicno je realizovan 22. procenjuje se da je postojalo oko 50. Zeev i Andi su napravili dokument pod imenom “Zend Engine II: Opsti pregled funkcionalnosti i Dizajn” i ubrzo krece vrela diskusija o buducnosti PHP­a. kao sto je na primer for petlja. To je privuklo mnoge programere koji nisu bili deo core tima da se prikljuce PHP projektu. Novo ime naglasava PHP kao nov proizvod namenjen siroj publici. zahtevala je unapredjenje jezika u odnosu na Objektno Orijentisano programiranje. Sve veca upotreba PHPa u slozenim aplikacijama.AlefBrain PHP Trening 2006. pa onda izvrsavaj”. i do danas je instaliran na preko 15 miliona domena! Nije proslo dugo vremena da bi se pojavio novi izazov pred tvorcima PHP­a. Po izlasku nove verzije u Novembru 1997.000 domena sa instaliranim PHP­om. prevodio) skriptove u toku izvrsavanja.. U vreme kada je nastao PHP3 u Junu 1998. ­ Skripta 2 kratkim pogledom u sadasnjost i buducnost. Web Server Abstraction Layer  koji je omogucio rad PHP­u na svim popularnim Web serverima. a broj 3 odaje priznanje prethodnim verzijama. napomenimo samo unapredjen API za prosirenja sa boljim performansama u toku izvrsavanja.. posmatrajuci svoj rad na PHP­u 3. Andi je dosao na ideju da kompletno zameni Objektno­Orijentisani deo PHP­a. Istorijat i buducnost Sve je pocelo 1995. mnoge funkcionalnosti su dodate. PHP4 doneo je sasvim novu paradigmu ­ “prvo kompajliraj (prevedi).. Verovatno nije ni sanjao da ce njegov rad prouzrokovati nastajanje PHP­a koji danas koriste milioni ljudi. 3 . PHP3 oznacava pocetak velikog proboja PHP­a na trzistu. umesto toga on ga je prevodio u bajt kod koji je zatim izvrsavan pomocu Zend Engine­a (naziv je nastao od imena Zeev & Andi). Prva verzija PHP/FI sastojala se iz kolekcije PERL skripti cija je osnovna uloga bila prikupljanje podataka iz web formi i nedostajale su joj neke osnovne neophodne funkcije. Interesantno je spomenuti na koji nacin je PHP/FI radio sa while petljom. uz vrlo male nekompatibilnosti. PHP4 je dobio mnogo bolje performanse u odnosu na PHP3. “spell checker”­i i mnoge druge korisne ekstenzije. zatim bi nastavio sa izvrsavanjem koda sve dok ne naidje na oznaku za zavrsetak while petlje i u tom trenutku 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 su svoje snage sa Rasmusom.  jer su mu nedostajale mnoge uobicajene funkcije. Kako je PHP/FI bio Open Source projekat. jer to je prva verzija koja je dostigla bazu od preko milion domena na kojima je instalirana. Andi Gutmans i Zeev Suraski otkrili su PHP/FI dok su tragali za jezikom koji ce im olaksati izgradnju e­commerce aplikacije u okviru studentskog projekta na kojem su radili. mogli su da analiziraju njegovu strukturu. Zend Engine se moze smatrati novim srcem PHP­a. Zakljucili su da PHP/FI nije toliko mocan koliko je to izgledalo na prvi pogled. promenjene ili odbacene u toku nastajanja sledece verzije PHP­a koja nosi ime PHP5. Krajem 1998. Dok je PHP3 parsirao (tumacio. Zeev i Andi su dizajnirali sasvim novi API (Application Program Interface) za prosirenja koji je omogucio jednostavno dodavanje funkcionalnosti PHP­u kao sto su komunikacija sa bazama podataka. Proces kompajliranja nije prevodio PHP u masinski kod. Maja 2002. ali je skoro kompletan razvoj i dalje radio jedino Rasmus. godine. Tako nastaje PHP 3 – Hypertext Preprocessor. godine. Iako je osnovni jezik ostao isti.  Unapredjenje dolazi u verziji PHP/FI 2. Zeev i Andi su. Pored mnogih poboljsanja.

 ali i da poveca ucesce PHP­a na trzistu softvera. On ne samo da donosi revoluciju u Objektnoj­ orijentaciji PHP­a. a u nekim ih cak i prevazilazi. MySQLi i mnoge druge ekstenzije koje predstavljaju veoma vazne osnove za podrsku drugim tehnologijama. ­ Skripta 2 PHP5 je doneo mnoge novine i od njega se ocekuje da odrzi vodecu poziciju PHP­a. Potpuno novi nacin rada sa XML­om postavlja PHP rame uz rame sa drugim web tehnologijama u pojedinim  segmentima.. vec sadrzi i mnoge nove funkcionalnosti zbog kojih PHP postaje nezaobilazna platforma za razvoj web aplikacija.AlefBrain PHP Trening 2006. 4 . Amazon­u. PHP5 ima pred sobom blistavu buducnost i zato ne oklevajte da se upustite u upoznavanje jezika kojim govore aplikacije na Google­u.. Yahoo­u. Tu su i SOAP (Simple Object Access Protocol).

 ali i pored toga. Ogranicenja u imenima promenljivih  Postoje neka ogranicenja kako mozete i kako ne mozete da zovete promenljive. Ovo govori PHPu da treba da je tretira kao brojnu vrednost. mozete koristiti znak jednakosti ili operator dodele '='. Mozete takodje i da dodeljujete brojeve promenljivama: $number_of_digits_on_one_hand = 5. kao sto su +. i da je 20­30 sasvim dovoljno. Da biste dodelili vrednost promenljivoj. Promenljive Vreme je da pocnemo upoznavanje razlicitih delova PHP­a. dodela se ne razlikuje mnogo od onoga sto smo prethodno uradili. mesto u memoriji ostavljeno da cuva informaciju. Verovatno cete primetiti da nije potrebno da idete preko 50 znakova. i & nisu dozvoljeni i izazvace gresku na vasoj web strani. *. Jednom kada ste napravili promenljivu. Razlika je u tome da sada brojna vrednost nema znake navoda. Pored toga manje vise ste slobodni da dajete imena promenljivama kako zeelite. Promenljiva je. Da bi ste je prikazali na ekranu koristeci funkciju echo(). PHP medjutim nema takvo ogranicenje. radite sledece: echo $author. Mozda je najosnovnija jedinica u programiranju promenljiva. i dodeljen joj je identifikator od strane programera. U mnogim jezicima postoji ogranicenje velicine imena. Ovde smo zakomplikovali ime promenljive $number_of_digits_on_one_hand. najjednostavnije objasnjeno. slova i donjih crta. Da biste napravili promenljivu u PHPu i dodelili joj vrednost mozete da uradite sledece:  $author = “William Shakespeare”. koje morate znati da biste pisali programe na ovom jeziku. koji i nije striktno ime promenljive). Prvo ogranicenje jeste da imena promenljivih moraju poceti slovom ili donjom crtom (ne racunajuci znak za dolar. ­ Skripta 2 2. dalja intervencija od strane programera nije potrebna da kaze PHPu da je vrednost broj. ­.  1 . Identifikator promenljive je $author i dodeljena joj je tekstualna vrednoost William Shakespeare. obicno 255 ili 1000 znakova. Sve PHP promenljive pocinju znakom za dolar '$'. Drugo ogranicenje je da ime promenljive mora da se sastoji od brojeva. Drugi znakovi.AlefBrain PHP Trening 2006. slobodni ste da je koristite u programu kako god zelite.

 jer jednom kada je izmedju znakova navoda. koje PHP koristi. i razlicite operacije koje mogu da se izvrse nakon ove informacije. ­ Skripta 2 Osetljivost na mala i velika slova Promenljive nisu tako jednostavne kao sto izgledaju na prvi pogled. $author = “Ivo Andric”. postoji jos nekoliko tipova promenljivih. Podaci tipa string Podaci tipa string sadrze tekstualne informacije ili reci. i one koje sadrze tekstualne vrednosti. Najjednostavniji nacin da se to objasni jeste mali deo koda: $author = “Jovan Jovanovic Zmaj”. onda da biste izvrsili 2 . Ako ste nameravali da koristite jednu promenljivu. Tipove podataka ne definise programer. Ovim kodom bice stvorena samo jedna promenljiva. i mogu da sadrze cele recenice. Tipovi podataka Usredsredicemo se na dva tipa promenljivih. onda treba da se koristi sledeci kod: $author = “Jovan Jovanovic Zmaj”. Ove dve promenljive imaju dve razlicite vrednosti i stvarno su razlicite isto kao da ste koristili sledeci kod: $famous_serbian_poet = “Jovan Jovanovic Zmaj”. $engine_size = “2. $Author = “Ivo Andric”. Ako dodelite odredjenu vrednost stringu. Nema veze sto je druga vrednost u primeru broj. Prvi red postavlja vrednost promenljive $author na Jovan Jovanovic Zmaj.AlefBrain PHP Trening 2006. U stvari. Sve sto se nalazi izmedju znakova navoda. kog tipa podataka promenljiva treba da bude i dodeljuje ih shodno tome. poznatijih kao tipovi podataka. Sledeca dva primera su stringovi: $car_type = “Cadillac”. Veoma cesto to utice na izgled rezultata na Web strani ako slucajno stavite veliko slovo tamo gde ga niste koristili ranije.6”. Ovi razliciti tipovi podataka koriste se u PHPu da bi oznacili razlicite tipove informacija koje mogu da se cuvaju. Gornja dva reda prave dve odvojene promenljive. $famous_serbian_writer = “Ivo Andric”. kao sto su nizovi i objekti. dok ce drugi red potpuno promeniti sadrzaj promenljive $author u tekst Ivo Andric. automatski postaje tekst. one koje sadrze brojevne vrednosti. ali o njima cemo kasnije govoriti. automatski postaje string. Jedan problem koji obicno muci pocetnike u PHPu jeste osetljivost na mala i velika slova u imenima promenljivih. jednu koja se zove $author i drugu $Author. vec PHP odlucuje za vas kada interpretira Web stranu.

 Ako ipak zelite jedan string da dodate drugom. bi dao rezultat Cadillac2. $a_double = 4. Govoreci sa stanovista estetike. tj. lepo odvojeni tekst Cadillac 2.AlefBrain PHP Trening 2006. $engine_size. Koristite znak . Rezultat ovoga je da sabiranje stringova kao da su brojevi moz da dovede do neocekivanih rezultata. $space . (tacka) kao operator spajanja. Integer su celi brojevi. dodavanje jednog stringa na kraj drugog. PHP ce morati da primeni neku vrstu konverzije da bi ga pretvorio u broj. integer i double. $another_integer = ­5797. dok string sa razmakom sadrzi znak.567. Dakle. iako nevidljiv. dok bilo sta sa zarezom odmah postaje racionalan tip podataka. Ovaj red: $car = $car_type . dok su double racionalni brojevi. $another_double = ­23. Razmaci mogu da se dodaju kao i svaki drugi tekst: $car = $car_type . Treba da zapazite da se ovo veoma razlikuje od praznog stringa. 3 .6. Prazan string ne sadrzi bas nista.2. ako pritom pretpostavimo da smo koristili promenljive iz prethodnog primera. ­ Skripta 2 matematicke operacije nad njim. Spajanje stringova Spajanje stringova je proces dodavanja jednog stringa drugom. da biste izvrsili operaciju. pravimo promenljivu koja sadrzi jedan prazan znak: $space = “ “.6. Dakle. PHP ima nacin na koji to mozete uraditi. $engine_size. Brojevni tipovi Postoje dva razlicita brojevna tipa podataka. cinjenica da nema razmaka izmedju dva stringa moze da se ne svidi dizajnerima. trebalo bi da zakljicite iz gornjih primera da je ceo broj automatski integer. Ovo ce proizvesti zeljeni. a ne da ih saberete. Evo nekih primera oba tipa: $an_integer = 33.

 // ovo je identicno operaciji $counter = $counter + 2. Evo primera kako se koristi operator dodele: $counter = 5. Jos malo o operatorima koji se koriste u PHPu Pored operatora koji se koriste u prostim matematickim izracunavanjima i operatora za dodavanje stringova. 4 .AlefBrain PHP Trening 2006. 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 necemo posebno objasnjavati. Operator dodele (=) omogucava dodeljivanje vrednosti promenljivama. postoje neke varijacije upotrebe operatora dodele pri cemu se moze kobminovati sa nekim drugim operatorom. Pored toga. Svi oni su vrlo poznati operatori i poznaje ih svako ko je ikada u skoli imao matematiku. Upoznajmo se sa najvaznijim. ­ Skripta 2 Proste matematicke operacije Postoji skup numerickih operatora koje mozete da koristite u PHPu da biste izvrsavali matematicke operacije. kao na primer:   $counter += 2. //ovo je identicno operaciji $offset = $offset * $counter. PHP poseduje i razne druge operatore koji su neophodni u programiranju.  na                               //  vrednost promenljive $counter dodali smo vrednost $counter                         //  i jos 2 $offset *= $counter. Promenljivoj $counter dodelili smo vrednost 5.

 kao na primer: $freezing_point_centigrade = 0. $serbian_capitol = “Beograd”. or xor ! Operacija Logicko I  Logicko ILI Logicko ekskluzivno ILI (XOR) Logicka negacija Operatori inkrementiranja i dekrementiranja Operator $var++ $var ­­ Konstante Operacija Inkrementiranje – uvecavanje promenljive $var za jedan Dekrementiranje – umanjivanje promenljive $var za jedan Do sada smo upoznali vrednosti koje bismo mogli da promenimo na neki nacin nakon sto smo ih dodelili promenljivama.AlefBrain PHP Trening 2006. Na primer. Na primer: $author = “Jovan Jovanovic Zmaj”. 5 . A sta ako niste zeleli da se to desi? Neke vrednosti nikada ne traba da se menjaju. moze biti promenjna za tren oka u “Radoman Kanjevac”. ­ Skripta 2 Operatori Poredjenja omogucavaju utvrdjivanje odnosa izmedju dve vrednosti. $author = “Radoman Kanjevac”. and ||. Sledeca tabela prikazuje operatore poredjenja: Operator == != > < >= <= Logicki operatori  Operacija Jednako je Nije jednako Vece od Manje od Vece ili jednako od Manje ili jednako od Operator &&. promenljiva $author koju smo napravili ranije sa vrednoscu “Jovan Jovanovic Zmaj”.

 ali su ipak nepromenljive. Ovakvi identifikatori se zovu konstante. Na primer: $database_address = “localhost”. Evo kako se pravi konstanta: define(“FREEZINGPOINTCENTIGRADE”. Imena konstanti se po konvenciji pisu velikim slovima da biste ih u programu lako prepoznali.AlefBrain PHP Trening 2006. Evo primera: echo “Glavni grad Srbije je: ”. ispisivati na ekranu i raditi sa njima sve sto i sa promenljivama. Da biste napravili konstantu koja sadrzi tekst. Nacin na koji se prave konstante nesto je drugaciji od postupka kreiranja promenljivih. 0). PHP ima specijalnu funkciju koja vam omogucava da napravite identifikator koji ima vrednost koju niko ne moze promeniti. ­ Skripta 2 Takodje mozda cete zeleti da definisete neke vrednosti u kodu koje ocigledno nisu fiksne. 6 . “Beograd”). Konstante mozete dodeljivati vrednostima promenljivih.SERBIAN_CAPITOL. osim sto im ne mozete menjati vrednost u toku izvrsavanja programa. Konstante traze specijalnu kljucnu rec define koja ce ih kreirati. samo cete staviti vrednost konstante pod znake navoda: define(“SERBIAN_CAPITOL”. Ispred konstanti ne treba stavljati znak za dolar.

 morate da koristite neku drugu tehnologiju za uzimanje podataka. ili tehnologije kao sto su Active Server Pages. Nacin na koji se informacije salju na server kontrolise atribut METHOD u FORM tagu. METHOD='POST' Jedan nedostatak koji ste mozda uocili iz Query stringova je prilicno javna priroda prenosa. Uzimanje podataka od klijenta iz Web formulara Verovatno jedan deo HTMLa koji izaziva najvise zbrke i teskoca jesu formulari. ili aplikacije kao CGI. Neke stvari je lakse uocitina primeru nego ih objasnjavati: ?animal=cat Ovde je animal ime promenljive koju saljemo. Ovo znaci da informacije nisu dostupne svakome.AlefBrain PHP Trening 2006. Informacije iz forme se tada salju u obliku parova ime=vrednost. Ovo govori Web browseru da doda vrednosti. Ovo je najvise zbog sledece cinjenice: Da biste mogli da manipulisete podacima iz formulara. Ovo moze da ide od jednostavnih skript jezika.php' METHOD='GET'> ili <FORM ACTION='test. Ispravan klijent­server interfejs treba da obradi informacije i vrati ih korisnicima dok oni cekaju. Ako se prisetite HTMLa seticete se da postoje dva nacina za slanje podataka od klijenta ka serveru: GET i POST. na URL adresu. a cat je njena vrednost. On readi skoro isto kao i metod GET. onda cete morati da se oslonite na metod POST. ili celokupnog jezika kao sto su Java Servlets. Ako ne zelite da se informacije koje prenosite pojavljuju u URL adresi.php?animal=cat Web broser automatski dodaje informacije na URL adresu kada salje zahtev strani na web serveru. zato sto nisu dodate na URL adresu. Deo koji je dodat na URL adresu zove se Query String ili string sa upitom. koje je korisnik upisao u formu. Da bismo pravilno implementirali obradu klijent­server komunikacije.nonexistentserver. ­ Skripta 2 3. Da bi to uradio. U ovom poglavlju upoznacemo se sa nacinima koje koristi PHP da bi obradio zahteve koji pristizu iz web formi.php' METHOD='POST'> METHOD = 'GET' Pocecemo sa vrednoscu GET atributa METHOD. Metod POST moze takodje da prenese vecu kolicinu informacija – postoji ogranicenje u kolicini podataka koje 1 . Ovo moze biti dodato na URL adresu ovako: http://www. nije dovoljno da se samo uzmu informacije od korisnika i kasnije se odgovori na njih. <FORM ACTION='test. kao sto je JavaScript. browser dodaje znak pitanja na kraj URL adrese da bi naznacio gde se zavrsava URL i pocinju informacije iz forme.com/test. razlika je u tome sto se informacije iz forme salje u telu HTTP zahteva a ne kao deo URL adrese.

 drugi tvrde da postoje slucajevi kada treba koristiti GET.html 3. Prva strana uzima informacije koje je uneo korisnik. Sacuvajte ovo kao fajl text. ­ Skripta 2 mozete preneti kao deo URL­a. neki kazu da skoro nikada ne treba da koristite metod GET. ?> </BODY> </HTML> 2 . a u svim ostalim slucajevima koristite POST metod.php"> Who is your favourite author? <INPUT NAME="Author" TYPE="TEXT"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2. sada cemo se upoznati sa nacinom na koji PHP prihvata podatke iz Formi. zbog njegove nesigurnosti i ogranicenja u velicini. a druga prihvata informacije na web serveru i odgovara korisniku.  Kako PHP prihvata podatke iz Formi? Posto znamo kako se u HTMLu prave formulari i razlicite opcije za preuzimanje podataka. Da li da koristim metod GET ili POST? Postoje razna misljenja o ovom pitanju. Svi primeri u ovom delu zahtevace dve web strane. Pogledacemo primere za svaku kontrolu iz forme. Zatvorite ovu datoteku i otvorite novu u editoru teksta i unesite sledeci kod: <HTML> <HEAD></HEAD> <BODY> Your favorite author is: <?php echo $_GET[Author]. zabluda je da je POST metod sigurniji jer se podaci pri prenosu ne vide kao kod GET metoda! POST metod je samo malo diskretniji u prenosu od GETa.AlefBrain PHP Trening 2006. Ne postoje cvrsta pravila i preporuka je da GET koristite samo onda kada znate da ce kolicina informacija koje se prenose biti uvek mala. Takodje. Koriscenje tekst polja: 1. Otvorite editor teksta i unesite sledeci HTML kod: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="text. ali podaci koji se prenose POSTom vrlo su lako dostupni.

 pogledajte URL adresu na prethodnom ekranu (druga strana koju smo napravili).php 5. browser uzima ime HTML kontrole oznaceno sa name='Author' za ime promenljive koju 3 .php dodat je Query String.html u web browseru i unesite ime: 6. Otvorite text.AlefBrain PHP Trening 2006. Na kraj imena text. Dakle. Ne treba biti Serlok Holms da bi se zakljucilo da je u ovom primeru Author ime a 'Ivo Andric' vrednost. Pritisnite Submit Query i trebalo bi da vidite ime autora koje ste uneli prikazano kao na sledecoj slici: Kako radi? Pre nego sto pogledamo kod. U primeru na ekranu je pisalo: text. Hajde da sada ispitamo nas string sa upitom. Sacuvajte ovo kao text.html.php?Author=Ivo+Andric Vec smo rekli da su Query stringovi napravljeni od parova ime=vrednost. Ovo je nesto sto je dodao web browser zato sto smo mu kao metod prenosa podataka naveli GET u fajlu text. ­ Skripta 2 4.

Your favorite author is: <?php echo $_GET[Author]..php.  Kako rade podrucja za tekst (TEXTAREA): 1. hajde da sada pogledamo drugi program. umesto niza $_GET.html 3. pracen jednim redom u PHPu: .. Da smo koristili metod POST. bio bi formiran niz $_POST i vrednosti promenljive Author bi pristupili ako napisemo $_POST[Author].php"> What are your favourite web sites? <TEXTAREA NAME="WebSites" COLS="50" ROWS="5"> http:// http:// http:// http:// </TEXTAREA> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2.AlefBrain PHP Trening 2006. on je napravio asocijativni niz $_GET ciji su elementi parovi ime/vrednost polja sa forme. ­ Skripta 2 prosledjuje. zapocnite sasvim novi i unesite sledece: 4 . Kada smo poslali formu GET metodom na web server i PHP server. ?> . To je u stvari samo jedan red teksta... Ovo je sve u vezi sa prvim programom. otvorite program za editovanje teksta i unesite sledeci kod: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="textarea. Sacuvajte ovo kao fajl textarea. text. Zatvorite prethodni fajl. Red PHP koda prikazuje sadrzaj promenljive Author koja je prosledjena GET metodom i to se radi 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 mu ime Author. a vrednost koju smo uneli u polje kao vrednost promenljive.

 ­ Skripta 2 <HTML> <HEAD></HEAD> <BODY> Your favorite web sites are: <?php echo $_POST[WebSites]. Trebalo bi da vidite nesto slicno sledecem: 5 .AlefBrain PHP Trening 2006.php 5. Otvorite u web browseru textarea. ?> </BODY> </HTML> 4.html i unesite imena nekoliko omiljenih Web lokacija: 6. Sacuvajte ovo kao textarea. Pritisnite dugme Submit Query kada unesete imena vasih Web lokacija.

?> </BODY> </HTML> 6 .AlefBrain PHP Trening 2006. Pokrenite editor teksta i unesite sledeci kod: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="checkbox. Otvorite novi fajl u editoru i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <?php echo $_POST[Choice]. Sacuvajte to kao checkbox.php"> Have you ever eaten eggs before? <INPUT NAME="Choice" TYPE="Checkbox"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2. ­ Skripta 2 Kako rade polja za potvrdu – checkbox? 1.html 3.

 ­ Skripta 2 4. Otvorite checkbox. dobicete jedan od dva moguca rezultata. Isprobajte oba slucaja i trebalo bi da dobijete sledece: 7 .AlefBrain PHP Trening 2006.html u web browseru 6. Sacuvajte ovo kao checkbox.php 5. Zavisno od toga da li ste potvrdili (check­irali) polje ili ne pre nego sto ste poslali upit.

Visestruka polja za potvrdu Sta se desava ako zelite da koristite vise od jednog polja za potvrdu? Ako su vam poznata radio dugmad. Otvorite novi fajl i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <?php echo "$_POST[Choice1]<BR>".html 3. onda ne sadrzi nista. echo "$_POST[Choice2]<BR>". Ako nije potvrdjeno. echo "$_POST[Choice3]<BR>". tako da mozete potvrditi vise polja za potvrdu ili ne morate potvrditi ni jedno. Otvorite editor i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="checkboxes. Kao vrednost promenljive $_POST[Choice] pojavljuje se nesto sto nismo mi definisali. Polja za potvrdu ne rade tako. Ako je polje za potvrdu potvrdjeno (checkirano). automatski pomeriti izbor sa bilo kog dugmeta koje je bilo izabrano ranije na trenutni izbor. ?> </BODY> </HTML> 8 . Njihova prednost je u tome sto se svako polje racuna kao posebna stavka. Sacuvajte ovo kao fajl checkboxes. Hajde da proverimo kako to radi.AlefBrain PHP Trening 2006. onda promenljiva sadrzi vrednost 'on'. ­ Skripta 2 U ovom slucaju treba obratiti paznju na jednu razliku od prethodnih primera. Vratimo se na prethodni primer i prepravimo ga da sadrzi nekoliko polja za potvrdu: 1. znate da ce biranje jednog radio dugmeta u grupi.php"> Have you ever eaten eggs (jaja) before? <INPUT NAME="Choice1" TYPE="Checkbox" VALUE="Eggs"> <BR> Have you ever eaten snails (puzeve) before? <INPUT NAME="Choice2" TYPE="Checkbox" VALUE="Snails"> <BR> Have you ever eaten locusts (skakavce) before? <INPUT NAME="Choice3" TYPE="Checkbox" VALUE="Locusts"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2.

Otvorite checkboxes. 9 .php 5. ­ Skripta 2 4. Sacuvajte ovo kao datoteku checkboxes. Posaljite upit i videcete sledeci rezultat: Uocite da smo sada definisali vrednosti za checkboxove i te su se vrednosti stampale za ona polja koja smo potvrdili a nepotvrdjeno polje nema vrednost.AlefBrain PHP Trening 2006.html i odaberite nekoliko opcija: 6.

Otvorite radio.AlefBrain PHP Trening 2006. Sacuvajte to kao datoteku radio.php 5.html u web browseru i odaberite odgovor: 10 . ?> </BODY> </HTML> 4.html 3. Otvorite editor teksta i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="radio. ­ Skripta 2 Kako rade Radio dugmad? 1. Otvorite novi fajl i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <?php echo "You selected the answer: $_GET[Question1]".php"> What is the capital of Portugal? <BR> <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Porto"> Porto <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Lisbon"> Lisbon <BR> <INPUT NAME="Question1" TYPE="Radio" VALUE="Madrid"> Madrid <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2. Sacuvajte ovo kao radio.

AlefBrain PHP Trening 2006. Otvorite editor i unesite sledece: 11 . Pritisnite Submit Query i pogledajte rezultat koji ste dobili: Kako rade okviri sa listom – dropdown meniji? Kao sto znate iz HTMLa. Sledecim primerom pokricemo oba slucaja. ili tako da se moze odabrati vise opcija u listi. ­ Skripta 2 6. 1. drop­down meniji mogu biti napravljeni tako da se moze odabrati samo jedna opcija iz liste.

echo "$engine_size[3]".6L</OPTION> <OPTION>2.000-$10.0L</OPTION> <OPTION>1.000-$25. echo "<br><br><br>Price Range: $_GET[Price]". Otvorite novi fajl i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <?php $engine_size = $_GET[EngineSize].0L</OPTION> </SELECT> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> 2.html 3. echo "$engine_size[2]". ?> </BODY> </HTML> 12 .000</OPTION> </SELECT> <BR> <BR> What size of engine would you consider? <BR> <BR> <SELECT NAME="EngineSize[]" MULTIPLE> <OPTION>1. echo "$engine_size[1]".000</OPTION> <OPTION>$10. Sacuvajte to kao listbox.php"> What price of car are you looking to buy? <BR> <BR> <SELECT NAME="Price"> <OPTION>Under $5. echo "<BR>Engine Size(s): $engine_size[0]".000</OPTION> <OPTION>Over $25. ­ Skripta 2 <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=GET ACTION="listbox.AlefBrain PHP Trening 2006.000</OPTION> <OPTION>$5.4L</OPTION> <OPTION>1.

AlefBrain PHP Trening 2006. Otvorite listbox. Pritisnite dugme Submit Query i u zavisnosti od toga sta ste odabrali.php 5. ­ Skripta 2 4. Sacuvajte ovo kao listbox.html u web browseru i odaberite jednu opciju iz gornjeg menija i jednu ili vise iz donjeg menija: 6. dobicete rezultat na sledecoj strani: 13 .

 a sledeci je za jedan veci i tako do kraja niza. ­ Skripta 2 Ako pazljivo pogledate dva menija koje smo napravili u prethodnom primeru. Mi smo taj niz dodelili promenljivoj pod imenom $engine_size koja je automatski postala niz koji sadrzi sve selektovane opcije iz liste. echo "<OPTION>$Message1</OPTION>". U nasem konkretnom slucaju.AlefBrain PHP Trening 2006. Sacuvajte ovo kao hidden. Isprobajte razne opcije i brzo cete shvatiti kako ovo funkcionise. $Message2="Homer Simpson". echo "</SELECT><BR><BR>". a skrivenim poljima prenecemo sve opcije da bismo iz PHPa odstampali sve moguce opcije i odabranu opciju. Pojedinacnim elementima niza pristupamo pomocu indeksa.4L. ali se njihove vrednosti prenose na server isto kao i sva druga polja iz formulara. ona se ne prikazuju na strani korisnika. echo "Which of the following would win in a shootout?". Kako rade skrivena polja? Kada koristite skrivena polja. $Message3="Ren & Stimpy". echo "<INPUT TYPE=HIDDEN NAME=Hidden1 VALUE='$Message1'>". echo "<INPUT TYPE=HIDDEN NAME=Hidden3 VALUE='$Message3'>". ?> </BODY> </HTML> 2.0L i  $engine_size[1] = 1. echo "<SELECT NAME='ListBox'>". echo "<OPTION>$Message3</OPTION>". Prvi element niza uvek ima index nula. echo "<INPUT TYPE=HIDDEN NAME=Hidden2 VALUE='$Message2'>". echo "</FORM>".  U imenu drugog menija imamo uglaste zagrade [] koje oznacavaju da se vrednosti odabrane u meniju smestaju u niz i tako prenose PHP­u.php'>".php 14 . odabrane su dve opcije u listi i niz $engine_size sadrzi dva elementa: $engine_size[0] = 1. niz $engine_size bi sadrzao cetiri elementa. U sledecem primeru prikazacemo drop­down listu iz koje cemo odabrati jednu opciju. videcete da se razlikuju po imenu i atributu MULTIPLE koji govori da se u drugom meniju moze odabrati vise od jedne vrednosti. Otvorite editor teksta i unesite sledece: <HTML> <HEAD></HEAD> <BODY> <?php $Message1="Bugs Bunny". 1. echo "<OPTION>$Message2</OPTION>". Da smo odabrali sve cetiri vrednosti. echo "<INPUT TYPE=SUBMIT>". echo "<FORM METHOD=GET ACTION='hidden2.

Pritisnite dugme Submit Query da biste videli rezultate: 15 . Otvorite hidden.php u web browseru i odaberite jednu opciju iz liste: 6. echo "$_GET[Hidden2]<BR>". ­ Skripta 2 3. Sacuvajte to kao datoteku hidden2. echo "$_GET[ListBox]". Otvorite novi fajl i unesite sledece:   <HTML> <HEAD></HEAD> <BODY> <?php echo "The three options were:<BR>".php 5. ?> </BODY> </HTML> 4. echo "$_GET[Hidden1]<BR>". echo "<BR>You selected:<BR>".AlefBrain PHP Trening 2006. echo "$_GET[Hidden3]<BR>".

 Druga strana. podatak.9 – 0. u stvari je prilicno jednostavna. Da ponovimo. i nije zasnovana ni na jednoj formuli neke kompanije. mi kazemo  DA. u ovom primeru trebace nam samo dve strane. da prikazemo sledece: Prvi Podatak * ((19/10 – (19%10)/10)­1) = Prvi Podatak * ((1. prezime. Velicina zajma za osobu u nasem programu racuna se koristeci tri podatka. 1. Otvorite editor teksta i unesite sledece: 16 . sto je promenljiva davanja zajma. izracunava kolicinu novca koju zamisljena banka pod imenom NAMLLU moze da ponudi osobi zavisno od njenih godina i plate.9) – 1)     = Prvi Podatak * 0 = 0 Prvi Podatak * ((9/10 – (9%10)/10)­1) = Prvi Podatak * ((0. oduzmemo jedan od drugog podatka da bismo dobili konacni drugi podatak. sto je ● Formula uzima prvi podatak i mnozi ga drugim podatkom da bi se dobio treci i konacni podeljen sa 10  i umanjujemo za jedan. nasa promenljiva godina. uradice izracunavanje i doneti presudu.AlefBrain PHP Trening 2006. dobijamo ukupnu sumu  i ako je ona visa od onoga sto osoba zeli da pozajmi. Prva uzima detalje o zajmu iz kojih cemo dobiti ime osobe. godine.9 – 0. adresu. platu i kolicinu novca koju zeli da pozajmi. Iako nasa formula za proracun za prihvatanje zajma mozda izgleda slozena. Proracun godina u drugom podatku znaci da je svako ispod 20 godina automatski iskljucen.9) – 1)     = Prvi Podatak * (­1) = ­ Prvi Podatak Jednom kada pomnozimo prvi podatak sa drugim. pa oduzimamo ostatak pri deljenju ● Zatim. nasa PHP strana. Dajemo im jednostavne da i ne odgovore na kraju proracuna. Sada cemo proci kroz kriterijum za prihvatanje zajma. Da bismo prosli kroz drugi deo formule. prema redosledu kojim 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. zato sto ce formula uvek vratiti nulu ili manje od nule. u drugom slucaju kazemo NE. ­ 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.

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.000</OPTION> <OPTION VALUE=25000>$25.0% interest <BR> <INPUT NAME="Loan" TYPE="Radio" VALUE=5000>Our $5.000 package at 11. ­ Skripta 2 <HTML> <HEAD></HEAD> <BODY> <B>Namllu Credit Bank Loan Application Form</B> <FORM METHOD=POST ACTION="loan.000 to $50.5% interest <BR> <INPUT NAME="Loan" TYPE="Radio" VALUE=10000>Our $10.000</OPTION> <OPTION VALUE=50000>Over $50.html 3.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 package at 15.000 to $25.0% interest <BR> <BR> <INPUT TYPE=SUBMIT VALUE="Click here to Submit application"> <INPUT TYPE=RESET VALUE="Reset application form"> </FORM> </BODY> </HTML> 2. Sacuvajte to kao loan. Otvorite novi fajl i unesite sledece: 17 .AlefBrain PHP Trening 2006.

$_POST[FirstName] $_POST[LastName]. Otvorite loan.html u web browseru i unesite neke detalje: 18 . if ($_POST[Loan] <= $LoanAllowance) echo "Yes. echo "Loan amount we will allow:$LoanAllowance<BR><BR>". ?> </BODY> </HTML> 4. $AgeAllowance = ($_POST[Age]/10 . we are delighted to accept your application". Sacuvajte ovo kao loan. ­ Skripta 2 <HTML> <HEAD></HEAD> <BODY> <B>Namllu Credit Bank Loan Application Form</B> <BR> <BR> <?php $SalaryAllowance = $_POST[Salary]/5. $LoanAllowance = $SalaryAllowance * $AgeAllowance. $_POST[FirstName] $_POST[LastName].php 5.AlefBrain PHP Trening 2006.($_POST[Age]%10)/ 10)-1. if ($_POST[Loan] > $LoanAllowance) echo "Sorry. we cannot accept your application at this time". echo "Loan wanted:$_POST[Loan]<BR>".

AlefBrain PHP Trening 2006. ­ Skripta 2 6. Pritisnite dugme Click here to Submit application i trebalo bi da vidite nesto poput ekrana na sledecoj slici: 19 .

 ­ Skripta 2 20 .AlefBrain PHP Trening 2006.

 a sada cemo pokazati kako ona zaista radi. neophodno je da uvedemo koncept logicke vrednosti. Medjutim. a uzimamo kisobran i oblacimo kabanicu samo ako pada kisa. videcete brojnu vrednost: 1 1 . koje mogu da sadrze jednu od dve vrednosti: tacno(true) ili netacno(false). onda taj kod okruzite viticastim zagradama {}: if (uslov je tacan) { izvrsi sve sto se nalazi unutar ovih zagradama } Dakle. rekli bismo: if (pada kisa) { uzmi kisobran obuci kabanicu } izadji napolje I ovoga puta naredba ”izadji napolje” se obavezno izvrsava. Apstraktno govoreci. Pogledajmo primer iz svakodnevnog zivota: if (pada kisa) uzmi kisobran izadji napolje Druga linija koda ­ “izadji napolje”. ali logicke vrednosti se cuvaju u promenljivama treceg tipa. Do sada su nase promenljive mogle da sadrze brojeve ili tekst. Hajde sada da pogledamo kako mozete da napravite uslove u zagradama da biste odlucili da li ce se neki deo koda izvrsiti ili ne. Ako uslov nije ispunjen. Mozete definisati bilo koju promenljivu na neku od ove dve vrednosti: $variable = true. naredba if funkcionise na sledeci nacin: if (uslov je tacan) izvrsi red koda Naredba if ce izvrsiti kod samo ako je uslov tacan. da prosirimo primer sa kisobranom. onda kod koji dolazi posle njega  nece biti izvrsen.AlefBrain PHP Trening 2006. ako prikazete njenu vrednost na ekranu. ­ Skripta 2 4. a PHP ce preci na sledecu liniju koda. Uslovne naredbe ili naredbe grananja Naredba IF Vec smo pomenuli naredbu if u prethodnom poglavlju. Logicke vrednosti Pre nego sto krenemo dalje. Ako zelite da izvrsite ceo blok koda u zavisnosti od nekog uslova. ali uzimamo kisobran samo ako pada kisa. se izvrsava bez obzira na uslov.

ako pokusate da je odstampate na ekranu videcete da se nista nece odstampati. echo "Oblacim kabanicu<br>". a 0 oznacava netacno (false). ?> </BODY> </HTML> Sacuvajte ovo kao kisa. kratko receno – false je nista.AlefBrain PHP Trening 2006. pri cemu 1 oznacava tacno (true). Umesto true. Ako ne zelite da koristite kljucne reci true ili false u smislu tacno ili netacno.php i pokrenite ga u vasem web browseru. if ($pada_kisa) { echo "Uzimam kisobran<br>". mozete ih zameniti brojevima 1 ili 0. kada krenem na posao radim sledece:</B> <BR> <BR> <?php $pada_kisa = true. ­ Skripta 2 Ali ako definisete promenljivu kao netacnu: $variable = false. Primenimo nauceno na primeru sa kisom: <HTML> <HEAD></HEAD> <BODY> <B>U zavisnosti od toga da li pada kisa. } echo "Izlazim napolje<br>". mozete takodje koristiti bilo koji broj razlicit od nule. Dobicete sledece: 2 . Dakle.

 ­ Skripta 2 Posto je uslov $pada_kisa na pocetku dobio vrednost true. ili $pada kisa = 1923. a sada cemo ih ponovo navesti jer se sada srecemo sa konkretnim situacijama u kojima se ti operatori koriste. deo koda unutar viticastih zagrada 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. Bitno je uociti da se vrednost true i bilo koji broj razlicit od nule u PHPu smatraju tacnim iskazom. ali necete pogresiti ako koristite bilo koji broj razlicit od nule. Ako vrednost promenljive $pada_kisa postavite na false ili na 0. ili $pada_kisa = 18. promenljivoj $pada_kisa dodelili neku od sledecih vrednosti: $pada_kisa = 1. Uobicajeno je da se kao tacno (true) koriste true ili 1.AlefBrain PHP Trening 2006. Operatori Poredjenja omogucavaju utvrdjivanje odnosa izmedju dve vrednosti. Sledeca tabela prikazuje operatore poredjenja: Operator == != > < >= <= Operacija Jednako je Nije jednako Vece od Manje od Vece ili jednako od Manje ili jednako od 3 . kod unutar if bloka je izvrsen. umesto vrednosti true. Isto bi se dogodilo da ste.

 or xor ! Operacija Logicko I  Logicko ILI Logicko ekskluzivno ILI (XOR) Logicka negacija Sada cemo prikazati primer koji obuhvata primenu navedenih operatora u PHPu: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="operators_example. a zatim napravite sledeci php skript: 4 . and ||.AlefBrain PHP Trening 2006.php"> Enter number: <INPUT NAME="number" TYPE="Text"> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> Sacuvajte ovaj primer kao operators_example.html. ­ Skripta 2 Logicki operatori pruzaju mogucnost izvodjenja logickih operacija Operator &&.

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

 obucemo kabanicu i obujemo cipele za kisu.AlefBrain PHP Trening 2006. 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 kisobran oblacim kabanicu obuvam cipele za kisu } else { obuvam cipele za suvo vreme }  izlazim napolje Dakle. To mozete izvesti pomocu vise if uslova koji idu jedan za drugim. ­ Skripta 2 Sacuvajte ga kao operators_example. Ako kisa ne pada onda ne ulazimo u if blok koda vec u else. Eksperimentisite i videcete neogranicene mogucnosti stvaranja uslova za izvrsavanje pojedinih delova koda u vasim programima. a sta se desava ako zelimo da nam se jedan deo koda izvrsi ako je uslov tacan a drugi deo koda ako uslov nije tacan? Uvek mozete da okrenete uslov i napravite novu naredbu if.php. a ostaje samo da se naglasi da se ovi operatori medjusobno mogu kobminovati na najrazlicitije nacine. tamo obuvamo cipele za suvo vreme i izlazimo napolje.  Ovaj primer je pokazao osnovne nacine upotrebe logickih i operatora poredjenja. preskacemo deo koda koji je u okviru else bloka i izlazimo napolje. Visestruki uslovi – naredbe ELSE i ELSEIF Naucili smo kako se koristi naredba if za izvrsavanje odredjenog koda ako je neki uslov tacan. ali postoji i mnogo laksi nacin da se to uradi. ulazimo u blok koda koji nam govori da uzmemo kisobran. 77. sta se desava ako zelite da proverite vise razlicitih uslova i izvrsite tacno jedan od njih. 33. ako pada kisa. 10. Hajde da krenemo korak dalje.html u web browseru i eksperimentisite unosenjem razlicitih vrednosti i posmatranjem rezultata. 0. ali mnogo je efikasnije ako u tu svrhu koristite ugradjenu PHPovu konstrukciju ELSEIF koja radi 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 . Pokrenite operators_example. Predlazem da unosite sledece vrednosti i da svaki put uocite sta je odstampano na ekranu i otkrijete zasto je bas to odstampano: ­10.

 a svi ostali ce biti ignorisani.php"> Select weather condition: <select name="weather"> <option value="rain"> Rain <option value="snow"> Snow <option value="sunny"> Sunny <option value="hmmm"> Kisa.html i otvorite sledeci fajl od koga cete napraviti sledeci PHP skript: <?php $weather = $_POST[weather]. echo "Obuvam zimske cizme<br>". ?> 7 . } else { echo "Bas me briga za vreme!<br>". } elseif ($weather == 'sunny') { echo "Stavljam kremu za zastitu od UV zracenja faktor 30<br>". bice izvrsen blok koji dolazi posle kljucne reci else. echo "Obuvam cipele za kisu<br>".AlefBrain PHP Trening 2006. } elseif ($weather == 'snow') { echo "Stavljam kapu na glavu<br>". Ako ni jedan uslov nije ispunjen. grad </select> <BR> <BR> <INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML> Sacuvajte ovo kao weather. sneg. echo "Stavljam naocare za sunce sa UV zastitom<br>". ­ Skripta 2 Izvrsice se deo koda koji ide iza prvog tacnog uslova na koji PHP naidje. } echo "Izlazim napolje<br>". if ($weather == 'rain') { echo "Uzimam kisobran<br>". grmljavina. echo "Oblacim kabanicu<br>". Primenimo ovo da bismo prosirili primer sa kisom na razlicite vremenske uslove: <HTML> <HEAD></HEAD> <BODY> <FORM METHOD=POST ACTION="weather. susnezica. echo "Oblacim zimsku jaknu<br>".

 ­ Skripta 2 Sacuvajte ovaj fajl kao weather.AlefBrain PHP Trening 2006. s tim da je hotel sa cetiri zvezdice skuplji.  Ugnjezdavanje naredbi IF Proces stavljanja naredbe if unutar druge if naredbe zove se ugnjezdavanje.php. 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.  Otvorite editor teksta i unesite sledeci kod: <HTML> <HEAD></HEAD> <BODY> <B>Namllu Holiday Booking Form</B> <FORM METHOD=GET ACTION="holiday. Postojace tri destinacije: Prag. Barselona i Bec od kojih svaka ima razlicite cene. Naredbe IF mozete neogranicen broj puta ugnjezditi i cesto su ovakve konstrukcije neophodne da bi se neki programski zahtevi zadovoljili.html u web browseru. Postojace i dve vrste hotela u svakom gradu. sa tri i cetiri zvezdice. On ce izracunati cenu u zavisnosti od vrste hotela i destinacije.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? 8 . da bismo napravili formular za rezervaciju putovanja za nekoliko destinacija. Ponovite eksperiment vise puta. odaberite neku opciju i pogledajte sta ce vam program preporuciti u vezi oblacenja. Otvorite weather. birajte razlicite vremenske uslove i analizirajte sta je ispisano na ekranu i zasto se to dogodilo. Uopsteno.

 Zatim otovrite novi fajl i unesite sledeci kod: <HTML> <HEAD></HEAD> <BODY> <B>Namllu Holiday Booking Form</B> <BR> <BR> <?php $Price=500.html. $CityModifier=1. if ($_GET[Grade]=="Three") { if ($_GET[Destination]=="Barcelona") { $CityModifier=2. echo "The cost for a week in $_GET [Destination] is $Price". $Price = $Price * $CityModifier.5. 9 . $StarModifier=1.AlefBrain PHP Trening 2006. } elseif ($_GET[Destination]=="Vienna") { $CityModifier=3. ­ Skripta 2 <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> Sacuvajte ovo kao holiday. $Price = $Price * $CityModifier. echo "The cost for a week in $_GET [Destination] is $Price". } elseif ($_GET[Destination]=="Prague") { $Price = $Price * $CityModifier.

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

 ­ Skripta 2 ?> </BODY> </HTML> Sacuvajte ovo kao holiday.php.AlefBrain PHP Trening 2006. otvorite holiday.html u browseru i napravite neki izbor: Pritisnite dugme Submit Query da biste videli cenu: 11 .

 on ce pokusati da unese razne specijalne karaktere pomocu kojih moze napraviti manje ili vise stete ako nas PHP program nije spreman da takve stvari spreci. Provera ispravnosti sadrzaja formulara U jednom od prethodnih poglavlja imali smo primer aplikacije za davanje zajma. od komicnih “999” do gramaticki neispravnih “ceteres' cetri”. ali vasem PHP programu takve stvari su besmislene. a takvih na zalost uvek ima. Jedna od mogucnosti je da korisnik pokusa sa unosom html tagova ili specijalnih kodova. ako su godine neke osobe prenete u promenljivu $Age. } naredba break ce prekinuti izvrsavanje programa. sprecava HTML oznake da budu interpretirane u WEB browseru kao HTML kod. echo $string. i dok to radi. bicete iznenadjeni raznolikoscu mogucih odgovora. sta se desava ako unesete “sta te briga”? Savrseno je moguce da se to dogodi. Ova funkcija se primenjuje na sledeci nacin: $string = “<b>This won't display the Bold tags</b>”. Isprobajte ovaj kod i videcete kako radi HTMLSpecialChars funkcija. } Ako proveravamo formular i znamo da neko nije uneo korektnu vrednost za neko polje. Na primer. nema potrebe da proveravamo dalje. break. U svrhu prekida izvrsavanja programa mogli ste 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". $string = HTMLSpecialChars ($string).  Zlonamerni korisnici – funkcija HTMLSpecialChars Ako je neki korisnik zlonameran. vec primenimo naredbu exit ili break za prekid programa.  Nacin na koji ovo mozete da savladate jeste da ogranicite vrednosti koje su dozvoljene u odredjenom okviru za tekst. Vi biste lako shvatili sta je korisnik zeleo da kaze. 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". ali kada god stavite program u javnu upotrebu. Takodje zaustavlja sve skriptove koji su uneseni u okvir za tekst da budu izvrseni. ­ Skripta 2 5. exit. 1 . Da bi smo ovo sprecili. u okviru koji je pitao za godine.AlefBrain PHP Trening 2006. Ako se malo poigrate sa njom lako cete zakljuciti da ju je moguce pokvariti ili prevariti unosenjem besmislenih podataka. ali tako nismo pokrili sve mogucnosti za izbegavanje loseg unosa podataka. U nasem primeru. PHP nam pruza sjajnu funkciju HTMLSpecialChars() koja konvertuje sve HTML oznake u obicni tekst koji zelimo da prikazemo. Kako ce PHP program da se izbori sa ovim? Mozda zelite da pretpostavite da vasi korisnici imaju zdrav razum da ne unose nesto poput toga. Ovo je jedan od nacina za zastitu od pogresnog unosa.

 onda kojoti nece zavijati. Ako morate da izvrsavate isti zadatak. Napravicemo program koji sabira prvih 100 prirodnih brojeva: 1 . pre ili kasnije cete da pogresite. Petlje imaju slicnosti sa grananjem zato sto izvrsavanje dela koda zavisi od toga da li je uslov tacan ili netacan. Svaki tip petlji koristimo u razlicitim situacijama. ako mesec nije pun. Koncentracija. uslov na vrhu se ponovo testira i sve se ponavlja: ako je uslov ispunjen. kod u petlji se ponovo izvrsava. i tako u mnogo iteracija. Shvatili ste. do while. otkrili smo da mozemo izbeci izvrsavanje reda koda.  Petlje WHILE Pocecemo sa petljom while zato sto je najjednostavnija od sve tri petlje i ima neke slicnosti sa naredbom if. hiljaditi put ili cak milioniti put. deo koda (koji je smesten izmedju viticastih zagrada) nakon uslovnog izraza se izvrsava: while (uslov je tacan) { izvrsi sadrzaj ovih zagrada } Nakon sto se sadrzaj petlje izvrsi. for Do sada smo se upoznali sa osnovnim konceptom programiranja – odlucivanjem. oni ce zavijati. U zavisnosti od toga da li je uslov tacan ili ne. interesovanje za zdatak za racunar su potpuno nepoznate odrednice. Svaki prolazak kroz petlju zove se iteracija. kod u zagradama ce se zanemariti i PHP ce nastaviti sa prvim redom posle kraja zagrada. ili cak celih blokova koda. Ako date slican zadatak racunaru i on ga dobro uradi prvi put. ali za svo vreme dok je mesec pun. ­ Skripta 2 6. koriste za izvrsavanje ponavljanja jesu petlje. Ako se ispostavi da je uslov netacan. ukljucujuci i PHP. kod se izvrsava. ponovo i ponovo. Mehanizam koji mnogi programski jezici. Medjutim. Kao i naredba if ona proverava rezultat uslova. svaki sat. Hajde da vidimo primer u pseudokodu: while (mesec je pun) { kojoti ce zavijati } Dakle. i mozda ponovo. U ovom poglavlju upoznacemo nesto sto racunari najvise vole da rade – i u stvari ono za sta su i izmisljeni – izvrsavanje zadataka koji se ponavljaju. onda ce ga dobro uraditi i stoti put. svaki dan.  Hajde da vidimo jedan primer koji prikazuje kako PHP radi sa while petljama. zamor. Zatim se uslov ponovo ispituje.AlefBrain PHP Trening 2006. petlje se razlikuju od uslovnih izraza zato sto sadrzaj petlje moze da se izvrsava mnogo puta. Umesto da idemo kroz nas kod sekvencijalno. Petlje – while. Postoje tri tipa petlji u PHPu i njih cemo upoznati u ovom poglavlju. ako je i dalje tacan. Uslov se testira i kod u petlji se izvrsava ako je uslov tacan.

//Calculate sum of first $how_many natural numbers while ($number <= $how_many) { $summary = $summary + $number.php i pokrenite ga u web browseru. jeste da u prethodnom primeru promenljivoj $how_many date vrednost 1 000 000 000. povecavali smo tekuci broj za jedan. ali vazna razlika – sadrzaj zagrada bice izvrsen najmanje jednom. Kada smo sabrali svih 100 brojeva. a unutar svake iteracije. } echo "Sum of first $how_many natural numbers is: $summary". ­ Skripta 2 <?php $summary = 0. $how_many = 100. Kakav bi to samo posao bio! A sve sto bi trebali da uradite kada imate PHP na svom racunaru. pre svake iteracije smo proveravali da li je $number<=$how_many da bi videli da li smo u zbir uvrstili sve brojeve od 1 do 100. petlja se vise ne izvrsava. ?> Sacuvajte ovaj skript kao while. a ne na pocetku. Zamislite kako je ovo revolucionarna stvar! Pretpostavite da vam je neko dao zadatak da izracunate prvih 1 000 000 0000 prirodnih brojeva. $number = 1. Ovo je suptilna. a da nije izmisljen obrazac za zbir prvih n clanova aritmetickog niza i da ne postoje racunari ni digitroni. Isprobajte i videcete koliko su petlje vazne u programiranju. cak i kada je uslov netacan: 2 . osim jedne stvari: uslov se proverava na kraju petlje. Petlje DO WHILE  Petlja do while je slicna petlji while. Evo sta cete dobiti: Kao sto mozete videti.AlefBrain PHP Trening 2006. posle dodavanja tekuceg broja na ukupan zbir. $number ++.

 ­ 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 bez obzira na tacnost uslova. $how_many = 100. $number++) { $summary = $summary + $number. ?> Sacuvajte ovo kao for. Petlje FOR  Petlja for se najbolje koristi kada zelite da ponavljate delove koda odredjen broj puta. //Calculate sum of first $how_many natural numbers for ($number = 1. posto se sastoji iz tri dela: for (definisi brojac petlje. Ovo je vazno.php i pokrenite u browseru pa cete dobiti sledeci rezultat: 3 . testiraj brojac petlje.  Hajde da vidimo kako bismo sabrali prvih sto prirodnih brojeva pomocu for petlje: <?php $summary = 0. Deo sa uslovom je malo kompleksniji nego kod petlje while. Treci deo uslova obezbedjuje promenu vrednosti brojaca u svakoj iteraciji.AlefBrain PHP Trening 2006. dodaj ili oduzmi od brojaca. Drugim recima. Tri dela uslova omogucavaju vam da napravite kompleksne uslove i petlje. daje vam mogucnost da navedete koliko puta zelite da prodjete kroz petlju. $number <= $how_many.) { izvrsi sadrzaj ovih zagrada  } Petlja for uvodi koncept brojacca petlje. Ova promenljiva se koristi da bi se izbrojalo koliko se puta proslo kroz petlju (broj iteracija). } echo "Sum of first $how_many natural numbers is: $summary". i da bi se petlja zavrsila kada je definisani broj iteracija dostignut.

 sve dok stavljate uglaste zagrade oko njih da biste uveli indeks elementa: $states_of_europe[0] = “France”. Takvi nizovi zovu se asocijativni: $state_capitals[“france”] = “Paris”. $states_of_europe[18] = “Italy”. 1 . Napomenimo da elementima nizova mozete dodeljivati brojevne ili tekstualne vrednosti. Da bi ste prikazali Paris na ekranu mozete uradititi sledece: echo $state_capitals[“france”]. Ako ne stavimo indekse. vec mozemo prepustiti da PHP to uradi za nas: $Author[] = “Ivo Andric”. Uglaste zagrade naglasavaju da navedene vrednosti zelimo da smestimo u niz. $state_capitals[“switzerland”] = “Bern”. PHP ce nastaviti dodeljivanje vrednosti u sledeci element u nizu. Mozete napraviti nizove isto kao sto pravite promenljive. Ustvari.  Takodje. ali sada je trenutak da ih i formalno upoznamo. umesto brojevnih indeksa mozete da u potpunosti koristite stringove. ­ Skripta 2 7. $Author[1] = “Momo Kapor”.AlefBrain PHP Trening 2006. mozete da izostavite znake navoda u indeksu. Nizovi Na kratko smo susretali nizove i do sada. Bez uglastih zagrada PHP ne bi znao da se radi o nizu i zamenio bi prvu vrednost drugom. $states_of_europe[2] = “Switzerland”. Inicijalizacija nizova Definisanje pocetnih vrednosti promenljivih u nizu jeste proces koji se zove inicijalizacija. onda ce gornje vrednosti biti smestene u $Author[0] i $Author[1]. $Author[] = “Momo Kapor”. PHP samostalno odlucuje gde ce u nizu staviti nase vrednosti. Ne morate da ih dodeljujete po redu: $states_of_europe[55] = “Spain”. $states_of_europe[1] = “Germany”. Ako zelite da pristupite sadrzaju asocijativnog niza. postoji i inicijalizacija kod koje eksplicitno mozemo sami dodeljivati vrednosti indeksa: $Author[0] = “Ivo Andric”. Kod inicijalizacije nizova u PHPu ne moramo brinuti oko indeksiranja. Otkricete da ako niz Author nije koriscen ranije. ili echo $state_capitals[france].

 treba samo da napravimo petlju for da to uradi za nas. Ovde na scenu stupa saradnja nizova i petlji. evo primera koji ispisuje sve elemente na ekranu: <?php $states_of_europe = array ("France". evo kako bi to uradili koristeci array(): $Author = array(“Ivo Andric”.  Ako zelite da inicijalizujete asocijativni niz pomocu funkcije array(). PHP je razlicit od mnogih programskih jezika kada su nizovi u pitanju po dve stvari. Ako znamo da niz ima 16 elemenata. "Italy".php i pozovite ga u web browseru. Ako zelimo da napravimo niz sa autorima. } ?> Sacuvajte ovaj primer pod imenom iteration. “Russia”. "Serbia". Ovo je konzistentno sa pravilima za promenljive u PHPu: ne morate da odredjujete tip. "Germany". "San Marino". Prvo. "Sweden"). “Austria”. "Spain". “Hungary”. "Belgium". PHP to radi za vas. to radite na sledeci nacin: $state_capitals = array( “france” => “Paris”. "Russia". “italy” => “Rome” ). "Finland". "Switzerland". “Belgium”. “Momo Kapor”). for ($i=0. Takodje vazi da indeksi pocinju od nule i nove vrednosti se smestaju u niz tako sto im se dodeli najmanji slobodan indeks. “Serbia”. “Finland”. Ako zelimo da ispisemo imena svih ovih drzava na web strani. Iteracije kroz niz Jednom kada ste napravili niz. “Spain”. "Austria". ne moramo da definisemo tip podataka u nizu. “England”. “Sweden”). ­ Skripta 2 Ovde ne moramo da se povinujemo ogranicenjima automatskog dodeljivanja indeksa koje bi nam PHP nametnuo – mozemo da dodelimo vrednosti indeksa bez redosleda. “Switzerland”. Jos jednom trazimo da PHP automatski definise vrednosti indeksa. ne morate da definisete koliko elemenata ce niz imati. “Greece”. "Greece". vec cete pre imati potrebu da na neki nacin prolazite kroz sve elemente niza i nesto radite sa njima. $i<16. “Italy”. $i++) { echo "<br>$states_of_europe[$i]". Drugo. “Germany”. "Hungary". "England". ne zelite da se vracate i uzimate svaki clan pojedinacno. “Poland”. Pretpostavimo da imamo sledeci niz: $states_of_europe = array (“France”. "Poland".AlefBrain PHP Trening 2006. pa cete dobiti sledece: 2 .  Postoje jos dva nacina inicijalizacije nizova i oba koriste naredbu array(). “switzerland” => “Bern”. “San Marino”.

 a to mozete i sami isprobati. Ona ima dva oblika. To je poslednji tip petlji koji cemo pogledati – petlja  foreah.AlefBrain PHP Trening 2006. Petlja foreach ce ici do kraja niza. iteracije kroz niz mozemo vrsiti koristeci petlje while ili do while. Koristite petlju foreach kada imate niz sa nepoznatim brojem elemenata.  Evo primera koji pokazuje kako se koristi foreach petlja za prolaz kroz niz: 3 . a mi sa tom vrednosu mozemo da radimo sta nam je volja. 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 prolazu promenljivoj $value bice dodeljena vrednost tekuceg elementa niza. Petlje foreach Postoji takodje i prosirenje petlje for u PHPu. ­ Skripta 2 Na slican nacin.

 ­ Skripta 2   <?php $states_of_europe = array ("France". "Russia". "Finland". "Italy". "Sweden"). "Poland". "Switzerland".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 je pogodniji za upotrebu kod asocijativnih nizova: 4 . "Spain". "San Marino". "Austria". "Serbia". "Greece". "England". } ?> Sacuvajte ovo kao foreach. "Hungary". "Germany". "Belgium".AlefBrain PHP Trening 2006. foreach($states_of_europe As $value) { echo "<BR>$value".

"Germany".AlefBrain PHP Trening 2006. "Serbia". "Belgium".php i pokrenite u web browseru pa cete dobiti sledece: 5 . "Spain". "Netherland". ­ 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. "Hungary". "Greece". "Switzerland". foreach($states_of_europe As $index => $value) { echo "<BR>Index $index contains $value". "Sweden". Pogledajmo primer: <?php $states_of_europe = array ("France". "Russia". "Poland". "Luxemburg". "San Marino". "Austria". "Bulgaria". "Finland". "Italy". "Romania". "England". "Andora". } ?> Sacuvajte ga kao foreach2. "Slovakia").

AlefBrain PHP Trening 2006.  6 . ­ Skripta 2 Ovo je bilo osnovno upoznavanje sa nizovima koje cete jako cesto koristiti u svojim programima. Recimo samo da pomocu tih funkcija mozete sortirati nizove na razlicite nacine. Napomenimo da PHP ima jako mnogo ugradjenih funkcija za rad sa nizovima i predlazem vam da pogledate PHP manual kako bi ste se bolje upoznali sa njima. pretrazivati ih u potrazi za nekom vrednoscu i mnoge druge korisne stvari.

 oni se stavljaju u zagrade iza imena funkcije. da biste oznacili kraj funkcije.)  { ovde ide kod funkcije. pracenu imenom funkcije. ­ Skripta 2 8. 1 . oni su odvojeni zarezima. return $tax. parametar2. parametar3. Ako vasa funkcija prihvata vise parametara.php i kada ga pozovete u web browseru evo sta cete dobiti: Funkcija moze da ima koliko god zelite redova. } Hajde sada da vidimo primer funkcije za izracunavanje poreza u PHP­u: <?php function tax ($price) { $tax = ($price/100) * 18. Funkcije Da biste definisali funkciju morate joj dati ime. } $price = 1000. Apstraktno govoreci to izgleda ovako: function ime_funkcije(parametar1.. ?> Sacuvajte ovo kao tax.. Ako funkcija prihvata odredjene parametre.. return neka_vrednost. Moze se dogoditi da vasa funkcija nema sta da vrati u program koji je poziva i tada mozete staviti kljucnu rec return na kraju funkcije bez ikakve vrednosti iza nje. Kod koji cini telo funkcije smesta se u viticaste zagrade nakon parametara. echo "For price $price tax is $tax". U tu svrhu koristimo kljucnu rec function. $tax = tax($price). a da biste vratili neku vrednost iz funkcije koristite kljucnu rec return na kraju funkcije pracenu vrednoscu koju vracate.AlefBrain PHP Trening 2006..

echo (tax($salary)). a sada cemo upoznati na koje nacine se ti argumenti mogu prenositi. ­ Skripta 2 Prenosenje vrednosti funkcijama Prikazali smo kako funkcije koriste parametre za preuzimanje pojedinih ulaznih vrednosti. //ovo ce prikazati 2000 echo "<br>". Postoje dva nacina za prenosenje parametara: po vrednosti i po adresi. Pogledajmo kako se prakticno vrse ta prenosenja na konkretnom primeru. return $salary.AlefBrain PHP Trening 2006. mi funkciji predajemo adresu promenljive koju ona moze koristiti da bi pristupila toj promenljivoj i uradila nesto sa njenom vrednoscu. <?php function tax ($salary) { $salary = $salary . Kod prenosenja po vrednosti.php i kada ga izvrsite evo sta ce se prikazati u web browseru: 2 .  To je osnovna razlika u prenosenju po adresi i po vrednosti koju je bitno zapamtiti. //ovo ce prikazati 2500 ?> Sacuvajte ovaj primer pod imenom value. te promene su vidljive u programu izvan funkcije. Posto u ovom slucaju funkcija pristupa fizickoj adresi promenljive i tu vrsi promene. Kod prenosenja argumenata po adresi.(($salary/100)*20). echo $salary. } $salary = 2500. ostatku programa nije vidljivo niti dostupno. mi funkciji prenosimo samo vrednost odredjene promenljive i sve sto se sa njom desava unutar funkcije.

 ­ Skripta 2 <?php function tax (&$salary) { $salary = $salary . echo (tax($salary)). } $salary = 2500. echo $salary.php i pokrenite u web browseru: 3 . return $salary.AlefBrain PHP Trening 2006. //ovo ce prikazati 2000 echo "<br>".(($salary/100)*20). //ovo ce prikazati 2000 ?> Sacuvajte ovo kao address.

echo $welcome_message. return $welcome_message. Zivotni vek promenljive je period od trenutka kada je promenljiva napravljena do trenutka kada prestaje da postoji. } translate_greeting(). Unutar funkcije definisemo promenljivu $welcome_message na “Bonjour Tout Le Monde” i to je lokalna promenljiva posto je definisana unutar funkcije. ali moze da traje i manje – onoliko koliko traje funkcija unutar koje je kreirana. Ako biste pokrenuli ovaj kod videli biste da ce se na ekranu ispisati “Hello World”. Opseg Promenljivih U ovom poglavlju upoznajemo novi koncept koji se zove zivotni vek promenljive.  Globalne i lokalne promenljive Promenljive napravljene van funkcije postoje za vreme trajanja programa kojem pripadaju. Ovaj koncept se zove opseg. Promenljiva moze da traje koliko i program koji je izvrsava. a promenljive izvan funkcija imaju globalni opseg. Ovo je globalna promenljiva u datom programu.  Hajde da vidimo primer ovoga u akciji. Za promenljive unutar funkcije kaze se da imaju lokalni opseg. ?> Prvo pojavljivanje promenljive $welcome_message definise njenu vrednost na “Hello World”. Promenljive napravljene unutar funkcije traju samo onoliko koliko traje izvrsavanje te funkcije. Sledeci delic koda prikazuje poruku ili na francuskom ili na engleskom jeziku: <?php $welcome_message = “Hello World”. ona nece biti vidljiva zbog svog lokalnog karaktera: 1 . Ako promenimo ime promenljive unutar funkcije na $french_message i pokusamo da je odstampamo izvan funkcije. ­ Skripta 2 9.AlefBrain PHP Trening 2006. //Globalna pr. function translate_greeting ($welcome_message) { //lokalna promenljiva $welcome_message = “Bonjour Tout Le Monde”. To je zbog toga sto je promenljiva $welcome_message unutar funkcije potpuno druga promelnjiva u odnosu na $welcome_message na pocetku programa.

} translate_greeting(). nista se nece prikazati. echo $french_message. ­ Skripta 2 <?php $welcome_message = “Hello World”. //Globalna pr. function translate_greeting ($french_message) { //lokalna promenljiva $french_message = “Bonjour Tout Le Monde”. ?> Promenljiva $french_message nece biti odstampana jer se njen zivotni vek zavrsava zajedno sa funkcijom u kojoj je definisana. to mozemo uciniti upotrebom kljucne reci global na sledeci nacin: 2 . ?> Ovo je sasvim logican sled desavanja  koji sprecava da dodje do mesanja promenljivih koje zive unutar funkcija sa promenljivama koje zive izvan funkcija. Ako ipak zelimo unutar neke funkcije da pristupimo promenljivoj koja se nalazi izvan nje. echo $welcome_message.AlefBrain PHP Trening 2006. echo $french_message. function translate_greeting ($french_message) { echo $welcome_message. } translate_greeting(). echo $welcome_message. return $french _message. //Globalna pr. zato sto promenljiva $welcome_message ne postoji unutar funkcije: <?php $welcome_message = “Hello World”. return $french _message. //lokalna promenljiva $french_message = “Bonjour Tout Le Monde”. Ako zelimo da prikazemo vrednost promenljive $welcome_message unutar funkcije.

echo $welcome_message. return $salary. Sledeci primer to ilustruje: <?php $greeting = "Hello World". ?> Igrajte se malo sa definisanjem promenljivih unutar i izvan funkcija i njihovim pozivanjem na raznim mestima. echo (tax($salary)). } $salary = 2500. return $french _message. ­ Skripta 2 <?php $welcome_message = “Hello World”. echo IME_BAZE. define("IME_BAZE". global $greeting. echo $welcome_message. echo $french_message. echo IME_BAZE.AlefBrain PHP Trening 2006.(($salary/100)*20). } translate_greeting(). function translate_greeting ($french_message) { global $welcome_message. "localhost"). function tax ($salary) { echo "<br>". $salary = $salary . uz upotrebu kljucne reci global i brzo cete zapamtiti pravila. Vazno je napomenuti da su konstante globalno vidljive u svim funkcijama i nad njima nije potrebno upotrebiti kljucnu rec global. //Globalna pr. //lokalna promenljiva $french_message = “Bonjour Tout Le Monde”. ?> 3 .

echo "Sada ja stampam<br>". Ukljucena datoteka radi upravo ono sto njeno ime i kaze: ukljucuje jednu datoteku (fajl) u neku drugu datoteku.php <?php echo "Prvi fajl ukljucen!<br><br>". ?> Ako u web browseru pozovete program include.AlefBrain PHP Trening 2006.php"). include("second_file.php. HTML kod ili PHP skript. ?>     second_file. ?>     third_file. Ovo mozete koristiti da biste ukljucivali tekst.Ukljucene Datoteke Ukljucene datoteke su mogucnost koja je zajednicka mnogim serverskim jezicima i tehnologijama.php").txt").php <?php echo "Drugi fajl ukljucen!<br><br>". ­ Skripta 2 10. include("third_file.php <?php include("first_file. Ukljucivanje se vrsi pomocu naredbe include: include (“ime_datoteke”).txt Treci fajl ukljucen!!! Pogledajmo kako PHP moze ukljuciti sva tri prethodna fajla unutar jednog i primetite da ce oni biti izvrseni kao jedinstven program:     include.  Pretpostavimo da imamo sledece fajlove:     first_file. evo sta ce se ispisati na ekranu: 1 .

  Predlazem vam da se zadrzite na include funkciji i testirate razne opcije. Sve promenljive iz ukljucenog php fajla od trenutka ukljucivanja su vidljive u fajlu koji vrsi ukljucivanje. jer je ovo veoma vazan koncept koji se koristi u pisanju PHP programa. ili prepisuje sadrzaj fajla ako se radi o tekstualnom ili html fajlu i zatim se vraca u polazni fajl i nastavlja izvrsavanje. imajte na umu da polazni fajl i svi ukljuceni fajlovi formiraju jedan jedinstveni program. a ukljuceni fajl vidi sve promenljive koje su do tog trenutka definisane u fajlu koji vrsi ukljucivanje. ­ Skripta 2 Kao sto mozete da vidite. 2 . kada PHP naidje na komandu include u toku izvrsavanja. Kada koristite include.AlefBrain PHP Trening 2006. izvrsava njegov sadrzaj ako je to PHP fajl. on odlazi u ukljuceni fajl.

 Na primer. Greske u unosu Konstrukcija nije dobro zatvorena Nedostaje znak tacka i zarez na kraju izraza Unos pogresnog imena funkcije Neispravno zatvaranje stringa: echo “Hello World. 3. pa da i dalje ocekujemo da nas neko razume. 5. Ima mnogo tipova (i podtipova) gresaka.  Sintaksne greske Sintaksne greske se. jer PHP nije uspeo da shvati kako ste zeleli da napisete echo umesto eco. Ovo bi izazvalo gresku u parsiranju. uopsteno govoreci. Pet stvari koje mogu da izazovu sintaksnu gresku 1. Na primer. i aplikacije koje rade na njima su isto tako izbrirljive. Obrada i izbegavanje gresaka Ima mnogo razloga zbog kojih je dobra obrada gresaka jako bitna. Da podjemo od prvog i najvaznijeg. 2. sigurnost vaseg sistema moze biti veoma povezana sa sigurnoscu vaseg posla. Zapamtite – ako ste programer. i vi biste i dalje znali sta ja mislim. $loop++) { echo “Hello world” ?> Ovde se javlja greska jer nismo zatvorili viticastu zagradu. Racunari su veoma precizne masine. ­ Skripta 2 11. lakse uocavaju posto one izazivaju poruku greske u PHPu. ja mogu da kazem “Dobro Jutro” u jedan sat posle podne.  Tipovi gresaka Postoji nekoliko tipova gresaka koje se mogu pojaviti. ali to je i dalje korisno da vam ukaze da je problem u nezavrsavanju prethodnog izraza tackom i zarezom. Trazenje gresaka je mnogo lakse ako znate gde da gledate. Vi i ja mozemo da izmesamo reci u recenici.AlefBrain PHP Trening 2006. 1 . PHP ce vam javiti da ste napravili gresku u drugom redu. Medjutim. a to je sigurnost. tako da je ovo dvostruko vazno. mozemo zaboraviti da zatvorimo zagradu nakon strukture petlje: <?php for ($loop = 0. a neke od njih uopste nece generisati nikakvu poruku greske kod PHPa. $loop < 5. vasi programi ce prijaviti gresku i za najmanji propust pri unosu: echo “Hello World”. Jos jedan klasican nacin za pravljenje gresaka u parsiranju je izostavljanje znaka tacka zarez na kraju izraza: echo “Hello” echo “World”. Jos jedna cesta greska je da ne uspemo da napravimo uspesnu strukturu petlje. ali u PHPu ih mozete klasifikovati u jedan od sledeca dva tipa – sintaksne greske i logicke greske. 4.

 Deljenje sa nulom obicno je slucajna greska – vi pravite deljenje promenljivom koja ima vrednost razlicitu od nule. Greske u vreme izvrsavanja Dva najcesca tipa gresaka u vreme izvrsavanja su Greske deljenja nulom i Beskonacne petlje. Greske deljenja nulom Prvo. ali se nekada nepredvidjeno dogodi da je ta promenljiva prazna ili jednaka nuli i onda dolazi do greske deljenja nulom.  Zato uvek u svom kodu predvidite proveravanje unosa korisnika. kada pokrenete program. Pogledajte sledeci primer. neocekivane izlazne greske. Ovo su. Beskonacne petlje Jedan od glavnih problema u koriscenju while i do while petlji je taj da ako se uslov koji ste definisali za izlazak iz petlje nikada ne dostigne. ali ce se greske pojaviti kada pokrenete program. ali nemojte pokusavati ovo da pokrenete: 2 . program pomnozi broj stavki sa cnom i dobije nulu. i izbegnite deljenje kada je vrednost promenljive kojom treba deliti jednak nuli ili kada je ta promenljiva prazna. ako korisnik unese broj razlicit od nule. PHP ce nastaviti da izvrsava petlju potencijalno beskonacan broj puta. Sintaksne greske su takodje fatalne. nego sa njima programi rade do kraja. Ako se max_execution_time prekoraci. Takodje zelite da njemu ili njoj date popust i zaracunate porez. i cak ce ga PHP server prihvatiti i izvrsiti.  Postoji i dalja razlika izmedju tipova logickih gresaka. ­ Skripta 2 Logicke greske  Ovo je drugi tip greske i njih je teze uociti. Sve ovo je najcesce prouzrokovano greskama u logici programa. on pocne da vraca podatke koji nikako ne mogu biti tacni. nema gresaka u parsiranju ili sintaksi.AlefBrain PHP Trening 2006. ako zelite bolji prikaz. ali greske u vreme izvrsavanja programa nisu uvek fatalne. kod ce ispravno raditi. ili uopste ne vraca podatke. naravno. ali vracaju pogresne vrednosti. ali kada ga date korisniku on odjednom prestane da radi. PHPov kod moze izgledati dobro. sto ce zaustaviti program u toku izvrsavanja – ovo su greske u toku izvrsavanja programa. Ponekad se desava da program kod vas radi dobro. ocistili greske u unosu i ocigledne greske u kodu. kratak podsetnik – racunari ne mogu da dele sa nulom. Na primer. Ustvari. Proverili ste kod i jednom i drugi put. Zamislite formular u kome pitate korisnika da unese broj stavki za kupovinu. Medjutim. problem nije uvek ocigledan. u okviru podesenog maksimalnog vremena za izvrsavanje programa – max_execution_time. niko ne moze – nije moguce predstaviti rezultat. vec se mogu javiti samo pod odredjenim uslovima. Ipak. Drugi tip logickih gresaka ne prekida izvrsavanje programa. onda ce PHP prikazati gresku. Rezultat onda moze da se koristi kao osnova za deljenje u daljem proracunu i mozemo zavrsiti sa greskom deljenja nulom. Neke logicke greske se desavaju u vreme izvrsavanja programa samo pod nekim odredjenim uslovima. Pocecemo prvo sa greskama u vreme izvrsavanja. Kada pokrenete program. Greske u vreme izvrsavanja koje zaustavljaju program i onemogucavaju da se on zavrsi nazivaju se fatalnim greskama. Medjutim. Korisnik slucajno zaboravi da unese ovaj podatak. Racunar ce prijaviti gresku kad god se ovaj problem pojavi.

Kada bi beskonacne petlje bile lako uocljive ne biste imali problema. ­ Skripta 2 <?php $counter = 1. Jedan skoriji primer je da je sonda za Mars americkog svemirskog programa izgubljen a zbog takve greske. kada je budete koristili shvaticete da nista ne vraca. Neocekivane izlazne greske Postoje mnogi razlozi zasto program moze da ne vrati ocekivani izlaz. one su cesto mnogo neprimetnije. zato sto ce ovo na Windowsu zagusiti sve resurse dok PHP bude pokusavao da ide kroz petljju i moze dovesti do blokiranja racunara. ona ce se izvrsiti i vratice vrednost. Probacemo da uopstimo nekoliko najcescih slucajeva kada se ovaj problem javlja.  Poenta je u tome da je ovakve greske cesto nemoguce otkriti pre nego se takva situacija dogodi. pa ce se petlja beskonacno mnogo puta izvrsavati. Nemojte ovo pokusavati da isprobate. ali je problem taj da se promenljiva $test_variable nikada ne menja u petlji. a drugi imperijalne (stopa). ali neispravno sracunatu zbog greske u unosu podataka. $test_variable = true. jer to moze izazvati nesagledive posledice po vas program. } ?> Ovde definisemo dve promenljive. Argumenti u pogresnom redosledu Ako funkciji predate argumente u pogresnom redosledu. posebno imajuci u vidu cinjenicu da mogu da se dese samo pod odredjenim okolnostima. Zato morate strogo voditi racuna o tome da ne napravite beskonacne petlje.AlefBrain PHP Trening 2006. Greske u programskim pretpostavkama Kladio bih se da se jedan od najcescih tipova logickih gresaka desava kada programeri naprave greske u pretpostavkama u interpretaciji koda i isprogramiraju gresku u skriptu. while ($test_variable) { $counter ++. Ona je navodno unistena u atmosferi Marsa zato sto je jedan deo koda za navigaciju pisan koristeci metricke jedinice (metar). zauvek ostaje true. Funkcije koje ne vracaju vrednost Ako napisete funkciju koja ispravno radi svoj posao. To je i svrha kljucne reci return i morate biti veoma obazrivi da ne zaboravite na nju. medjutim. Treba pazljivo razmisliti sta program treba da radi i proveriti osnovne principe pre nego pocnete pisanje koda.  3 . tj. ali zaboravite da stavite naredbu return. ali svesni smo da ne mozemo obuhvatiti sve slucajeve.

 nista ne moze da garantuje da kod nece imati gresaka. Pa. Nemojte da pisete kod sa greskama! Ovo mozda izgleda lakse nego sto jeste. } Vi pisite ovako: if (10 == $variable) { .. onda mozete u velikoj meri smanjiti sanse za pojavljivanje gresaka u vasim programima. jednostavne za razumevanje. sto svakako nije ono sto ste zeleli na ovom mestu da postignete.. lagane za izvrsavanje i dosta programera ih ne koristi! “Zasto ne?” mozete se pitati. Preporucujem vam standard za pisanje PHP programa koji mozete naci na sledecoj adresi: 4 . Pored toga. Medjutim. a ne garantuju da ce kod biti bez gresaka. da ste gresku napravili na sledeci nacin: if ($variable = 10) { . bez izuzetka. vec bi promenljivoj $variable dodelio vrednost 10 i nasttavio sa izvrsavanjem. sta cete sada da radite povodom nje? Prvi savet koji cemo vam dati je veoma ocigledan. uocili ste gresku. } i ako sada napravite gresku i umesto “==” napisete “=”: if (10 = $variable) { . Time mozete sebi i drugima olaksati zivot kada je potrebno citati kod koji je pravilno uvucen. dobro je odluciti se za neki standard za pisanje koda i zatim ga se striktno pridrzavati. Programeri mozda nece izloziti svoje primedbe ovim recima. ali sve se svodi na to. zato sto je prosecan programer zauzeta osoba. } PHP ne bi nista javio. Umesto da if napisete ovako: if ($variable == 10) { .. Dobre prakse u pisanju koda Dakle. i kao sto doktori kazu.. ­ Skripta 2 Zamena operatora dodele i jednakosti Kada se  pravi struktura IF. Ove tehnike su.. } PHP ce vam dati poruku da je doslo do greske jer broju nije moguce dodeliti vrednost. bolje je spreciti nego leciti.. veoma je vazno da se vodi racuna da se umesto znaka jednakosti “==” ne stavi operator dodele “=”. Koristite standard za pisanje koda Uvlacite kod iako to nije neophodno za pravilno funkcionisanje programa. Glavne primedbe su obicno da su ove tehnike vremenski zahtevne i da zahtevaju odredjeni stepen planiranja unapred i organizaciju. Zapamtite.AlefBrain PHP Trening 2006. Da biste izbegli nenamerno pravljenje ovakve greske primenite sledeci trik. ali ako se drzite dobrih obicaja. koje su programeri od Rimskog doba do danas koristili. koja ne voli nista sto ga dekoncentrise od programiranja...

 Ako se program pokvari pod ovakvim okolnostima. unosite u program razne vrednosti (velike brojeve. Koristite funkcije Kada imate isti kod koji se javlja na vise mesta u vasim programima. a samim tim mogucnost pojavljivanja iste greske na vise mesta. Koristite ukljucivanje datoteka (include()) Upotreba ukljucenih datoteka je samo jedan korak vise od funkcija. Komentar je zapis koji daje programer da bi pomogao i objasnio sta koji deo koda radi. onda cete imati mnogo zbunjenih i nezadovoljnih korisnika.  5 . posebno ako se radi na vecim projektima. U ovome ne treba preterivati i koristiti vise od dve ili tri reci u imenu promenljive. Imenujte promenljive u skladu sa njihovim ulogama u programu Iskustvo nam govori da je bolje promenljivama davati imena koja opisuju podatke koje promenljiva sadrzi. ­ Skripta 2 http://pear. ili vise nije u prilici da pomogne. Ne treba da sluzi samo programeru koji ga je napisao. kod ce mozda da se odrzava dugo nakon sto je programer napustio kompaniju. ali kada je u realnom svetu. Tako izbegavate pisanje istog koda na vise mesta. Mozda niste ocekivali da program bude zloupotrebljen na taj nacin.AlefBrain PHP Trening 2006.php. ovo su stvarne vrednosti koje mogu doci u program.net/manual/en/standards. posto vam omogucava da jedna funkcija bude dostupna u vise razlicitih programa. Ovakav pristup mnogo pojednostavljuje organizaciju koda i pronalazenje gresaka. Ne mozete da ocekujete da bilo ko drugi (cak ni vi sami nakon nekoliko nedelja) moze da razume kod ako ga niste dobro komentarisali. Pokusavajte da pokvarite program Kada testirate kod.php Komentarisite kod Ovo je vrlo jednostavno. U PHPu komentare mozete pisati na vise nacina. slova umesto brojeva i slicno) da biste videli kako se program ponasa. Za jednolinijske komentare koristite dve kose crte: //Jednolinijski komentar u PHP­u a za viselinijski komentar potrebno je koristiti znake “/*” za pocetak komentara i “*/” za kraj komentara: /*Viselinijski komenatr pocinje druga linija komentara treca linija komentara zavrsetak viselinijskog komentara */ Kada PHP naidje na znak za komentar ignorisace sve sto se unutar njih nalazi za vielinijske komentare i sve sto je na pisano do kraja linije za jednolinijski komentar. to je znak da ga treba smestiti u funkciju i onda samo na raznim mestima pozivate tu funkciju.

 trudite se da razmisljate kao vasi korisnici. malim. Pokusajte da se stavite u situaciju coveka koji se ne razume puno u racunare i koji koristi vas program. zavisi i uspeh u pisanju dobrog programa. Kada su brojevi u pitanju. Kod bi trebalo sve ovo da proverava. ­ Skripta 2 U stvari. testirajte sa velikim. pozitivnim. Vezbajte i vremenom cete postajati sve bolji i bolji.  Prilikom testiranja. Na primer godine treba da imaju realne vrednosti. Zamislite sta bi sve korisnik mogao da da uradi da bi pokvario program ili mu dozvolio da prihvati pogresne informacije ili da uopste ne prihvati informacije. negativnim brojevima i slicno. Takodje je neophodno testiranje sa vrednostima koje su neispravne ili na granici ispravnosti. lakse je pretpostaviti da ce se program naci na ovakvim iskusenjima i zatim programirati tako da bi se sprecio kvar kada se to dogovdi. 6 .  Testiranje vaseg koda vrednostima koje ocekujete da ce ih korisnik uneti apsolutno je neophodno. adrese treba da sadrze postanski broj. dok adresa elektronske poste treba da sadrzi znak @.AlefBrain PHP Trening 2006. Od stepena uspesnosti preuzimanja uloge vaseih korisnika pri testiranju.

 Pored toga.. Kada korisnik popuni formular 1. Takodje.AlefBrain PHP Trening 2006. njegove lokacije i slicno. od kojih svaki uzima podatke od korisnika.Prenosenje podataka od stranice do stranice – metod “uradi sam” Dolazimo do tacke gde interakcija sa korisnikom postaje nasa glavna tema. Formular 2 prihvata odredjene podatke i prosledjuje ih formularu 3. posalje ga.  1.. ● Kako da pratimo sta je bilo pre. na primer vremena dana. pa je dobro znati i drugaciji metod da se to uradi. Napravite sledeci skript i sacuvajte ga kao menu1. Sledeci primer radi upravo to. drugim recima potrebna nam je trajnost nekih podataka u toku posete korisnika nasoj web lokaciji. trenutno ulogovanog korisnika. ­ Skripta 2 12. Skrivena polja formulara Recimo da imamo sekvencu od tri formulara. pored podataka sa formulara 2. u kojima se podaci stalno prosledjuju napred i nazad izmedju korisnika i web lokacije. Na pocetku cemo razmotriti nekoliko nacina na koje mozete da ucinite da vasi podaci traju od jednog do drugog zahteva korisnika za stranicama na vasem web serveru. tako da korisnici mogu nesto da kazu web lokaciji i da onda ona njima pojedninacno odgovori. isto se moze postici koriscenjem PHP sesija sto cemo pokazati u sledecem poglavlju. ali dobro je videti kako se to moze ostvariti pesackim putem da bi smo naucili osnovne principe koji deluju u pozadini interakcije. prosledimo i podatke sa formulara 1? To je jednostavno: samo definisemo skrivena polja u formularu 2 koja ce sadrzati podatke prosledjene sa formulara 1. podaci se prosledjuju na sledeci formular u sekvenci. Da bi smo ovo uradili. nece vam uvek biti neophodne sesije da bi ostvarili interaktivnost. treba da razmotrimo dve stvari: ● Kako da dinamicki promenimo Web strane zavisno od toga koja je prethodna strana odabrana. ili zavisno od drugih faktora. Kada pricamo o uvodjenju interaktivnosti.php 1 .  Ovo je jednostavan primer koji koristi tri skripta da bi primio porudzbinu u restoranu i da bi na kraju prikazao racun po svim narucenim stavkama. u stvari pokusavamo da postignemo bolje iskustvo u upravljanju podacima. Ali kako da formularu 3. Ovo moze da zapocne seriju interakcija na pravcu korisnik­Web Lokacija.

. echo "<OPTION>$Entrees[0]</OPTION>". echo "<OPTION>$Desserts[1]</OPTION>". echo "</FORM>".</OPTION>". ­ Skripta 2 <HTML> <HEAD><TITLE>Welcome to Charlie's</TITLE></HEAD> <BODY> <?php $Entrees=array("Steak ($9)". echo "Which of the following would you like as a dessert?". ?> </BODY> </HTML> 2. echo "<SELECT NAME='ListBox2'>". 2 . echo "<FORM METHOD=POST ACTION='menu2.php <HTML> <HEAD><TITLE>Welcome to Charlie's dessert selection</TITLE></HEAD> <BODY> <?php $Desserts=array("Apple Pie ($3)". echo "<OPTION>$Entrees[1]</OPTION>".</OPTION>". echo "<FORM METHOD=POST ACTION='bill.. echo "Which of the following would you like as an entree?".php'>". echo "<INPUT TYPE=SUBMIT>". echo "<OPTION SELECTED VALUE=''>Select...AlefBrain PHP Trening 2006."Ice Cream ($2)")."Pancakes ($3)". echo "</SELECT><BR><BR>".php'>". echo "<OPTION>$Entrees[2]</OPTION>". echo "<INPUT TYPE=HIDDEN NAME=Course1 VALUE='$_POST[ListBox1]'>". "Pizza ($7)". Sledeci skript sacuvajte kao menu2. "Pasta ($6)"). echo "<OPTION SELECTED VALUE=''>Select. echo "<SELECT NAME='ListBox1'>". echo "</SELECT><BR><BR>". echo "<OPTION>$Desserts[2]</OPTION>". echo "<OPTION>$Desserts[0]</OPTION>".

Sada u web browseru otvorite skript menu1. echo "Your order was for the following:<BR><BR>". echo "</FORM>". Odaberite jelo iz padajuceg menija i pritisnite Submit Query da biste dobili sledecu stranu: 3 . echo "Dessert: $_POST[ListBox2]<BR><BR>".php <HTML> <HEAD><TITLE>Thank you for dining at Charlie's</TITLE></HEAD> <BODY> <?php $total = 0. } echo "TOTAL BILL = $" . ?> </BODY> </HTML> 4. echo "Entree: $_POST[Course1]<BR>". foreach (array($_POST[Course1]. $regs)) $total += $regs[0]. $_POST[ListBox2]) as $val) { if (ereg("[0-9]+". ­ Skripta 2 echo "<INPUT TYPE=SUBMIT>". $val. Naredni kod sacuvajte kao bill. $total . ?> </BODY> </HTML> 3.php 5.AlefBrain PHP Trening 2006. "<BR>".

 i predstavljamo svaku vrednost kao opciju u padajucem meniju: $Desserts=array("Apple Pie ($3)". Nas prvi skript menu1. 4 . Definisemo niz dostupnih dezeerta. Kada pritisnemo dugme Submit Query. i koristimo niz $Entrees da bi smo definisali dozvoljene opcije u padajucem meniju: $Entrees=array("Steak ($9)". ­ Skripta 2 6.php tesko moze proci kao PHP skript – samo cinjenica da smo definisali nas izbor jela u nizu sprecava nas da to napisemo kao cist HTML kod. poziva se sledeci skript menu2."Pancakes ($3)". Evo sada jos malo slicnog posla. "Pizza ($7)". Ipak. "Pasta ($6)"). Kada odaberete dezert i posaljete izbor evo sta cete dobiti: Objasnimo sada kako prethodni kod radi.php. a nas izbor jela prosledjuje se kao promenljiva $_POST[ListBox1]."Ice Cream ($2)"). to je PHP.AlefBrain PHP Trening 2006.

php. i pokusava da otkrije zagonetnu rec. $_POST[ListBox2]) as $val) {       if (ereg("[0­9]+". u ovom slucaju bill. tako se osiguravamo da ce ova vrednost trajati do sledeceg skripta u koji ga prosledjujemo metodom POST: echo "<INPUT TYPE=HIDDEN NAME=Course1  VALUE='$_POST[ListBox1]'>". Cesto je to resenje jednostavnije i elegantnije od skrivenih polja formulara. ali ce to skoro uvek zavisiti od slova koja su bila odabrana. Kakva zabava! Mozda cete se iznenaditi kada otkrijete da cemo sve ovo da uradimo u jednom skriptu – ovde nase trajne promenljive ulaze u igru. mozemo da regenerisemo stranu iz pocetka svaki put. Ova igra bi trebalo da vam bude poznata – to je igra pogadjanja u kojoj igrac bira slova. Mozemo da prodjemo kroz listu i da izvadimo cene poredjenjem sablona pomocu funkcije ereg(). Pogledajmo primer koji koristi stringove sa upitom za cuvanje vrednosti od stranice do stranice u kontekstu u kojem bi formulari bili prilicno neprakticni. Dvanaest linija cine kompletnu sliku nakon cega igrac gubi igru. ocigledno je da ce morati da izgleda malo drugacije svaki put kada se ucita. igrac pobedjuje.php smestio izbor jela u skriveno polje Course1. Jos jednom dugme Submit Query nas salje na sledeci skript. On ce izlistati naruceno jelo. "<BR>". naruceni dezert i dati nam ukupnu cenu. ­ Skripta 2 Sada. dodajemo skriveno polje (hidden) koje se zove Course1. echo "Entree: $_POST[Course1]<BR>". echo "Dessert: $_POST[ListBox2]<BR><BR>". Query String – string sa upitom Prenosenje podataka od stranice do stranice moze se postici i upotrebom query stringova.php. $regs)) $total += $regs[0]. Pozivajuci skript sa query stringom u URL adresi. Imamo jednu stranu koju ucitavamo svaki put kada igrac odabere slovo. Ako uspe da pogodi rec pre toga. Odabrani dezeert se nalazi u promenljivoj $_POST[ListBox2]: echo "Your order was for the following:<BR><BR>". Kada god odabere slovo kojeg nema u reci. $total . i ako postoje dodamo ih promenljivoj $total. $val. Dame i gospodo zauzmite mesta – igra pocinje. koji sadrzi sva odabrana slova. sva mesta na kojima se slovo nalazi bivaju otkrivena. sada mozemo da ga dobijemo kroz promenljivu $_POST[Course1]. Poslednji deo naseg primera koristi cinjenicu da smo cene dodali na kraj opisa jela. cija vrednost se preuzima iz promenljive $_POST[ListBox1] i dalje sadrzi izbor  jela iz skripta menu1.  Napisite sledeci skript i sacuvajte ga pod imenom hangman. Pre nego sto definisemo dugme Submit Query za formular. jedno po jedno. Svaki put kada igrac odabere slovo koje se pojavljuje u reci. ovo je najvaznija tacka. } echo "TOTAL BILL = $" .AlefBrain PHP Trening 2006. Posto je skript menu2. na slici za vesanje se crta nova linija. Dosta price – hajde da pogledamo kod.php:   5 . Zavrsavamo sa ispisom ukupnog racuna: foreach (array($_POST[Course1].

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

gif\"><BR>". if ($wrong == 12) { echo "<BR>HANGMAN!!<BR><BR>". echo "The word you were looking for was \"$word\"<BR><BR>". } else { echo "Tries remaining = ".<BR><BR>". //echo "$letters$var". } } echo "<BR><IMG SRC=\". echo "<BR>Please pick a letter./hangman$wrong. echo $links."<BR>". odaberite nekoliko reci i trebalo bi da dobijete nesto slicno sledecem: 7 .= "<A HREF=\"$PHP_SELF?letters=$letters$var&word_number=$w ord_number\">$var</A> ".AlefBrain PHP Trening 2006.(12-$wrong). ­ Skripta 2 else { $links . } } ?> </DIV></BODY> </HTML> Pokrenite skript. echo "<A HREF=$PHP_SELF>Play again</A>".

AlefBrain PHP Trening 2006. ­ Skripta 2 Vas zadatak je da proucite kako radi ovaj skript i shvatite kako smo cuvali podatke o broju pokusaja i vec odabranim recima samo koristeci query string. Videcete da je koncept vrlo jednostavan. Napomenucu samo da smo u programu koristili trinaest razlicitih slicica za svako stanje vesala: 8 .

} 1 . vise mozemo da cenimo ono sto se desava kada pricamo o sesijama. Sledeci skript sacuvajte pod imenom page_count. if if if if (!$view1count) (!$view2count) (!$view3count) (!$view4count) $view1count $view2count $view3count $view4count = = = = 0. 0. mnogo je prakticnije drzati podatke na serveru. ali dati klijentu kljuc pomocu koga cemo ga jedinstveno identifikovati i pruziti mu pristup njegovim podacima. ili skup zahteva koji su napravljeni da bi se proverio nalog elektronske poste kroz web email servis. Umesto stalnog slanja podataka izmedju servera i klijenta. Sesije Posto smo upoznali razlicite tehnike koje mozemo da koristimo da bismo ucinili da podaci traju. Necemo zalaziti u teoretsku pozadinu PHP­ovog sistema za rad sa sesijama. 0. Hajde da ispitamo jednostavno koriscenje PHP sesija – brojanje koliko je puta korisnik pristupio stranama na web lokaciji od pocetka tekuce sesije. ko bude imao zelju da upozna sve detalje o sesijama. Ovo bi mogle da budu serije transakcija koje korisnik pravi dok azurira svoj portfolio sa akcijama. session_register("view3count"). $_SESSION["view${whichpage}count"]++. ­ Skripta 2 13. Kasnije. i samim tim sa njegovim podacima. Sesija moze da se sastoji od visestrukih zahteva istom skriptu ili od zahteva razlicitim izvorima na istoj web lokaciji. echo "<HTML><HEAD><TITLE>Web Page Hit Counter</TITLE></HEAD><BODY>".AlefBrain PHP Trening 2006. if ($_GET[whichpage]) { echo "<B>You are currently on page $_GET[whichpage]. session_register("view2count"). 0. session_register("view1count"). on jedinstveno vezuje klijenta sa sesijom. moze o tome potraziti izvore na webu. session_register("view4count"). Sesiju definisemo kao seriju vezanih interakcija izmedju jednog klijenta i web servera. Ovaj kljuc zovemo identifikatorom sesije.</B><BR><BR>\n". Na jednostavnom primeru pokazacemo kako se radi sa sesijama i to ce biti sasvim dovoljno znanja da ih koristite u svojim programima.php: <?php session_start().

$i++) { if ($_GET[whichpage] == $i) { echo "<B><A HREF=\"$PHP_SELF?whichpage=$i\">Page $i</A></B>". ?> Ako pokrenete skript i kliknete po nekoliko puta na svaki od linkova. which you have chosen ". echo "</BODY></HTML>". evo sta bi trebalo da dobijete: Objasnimo kako radi ovaj jednostavan primer. $_SESSION["view${i}count"]. a ako je vec prethodno zapoceta od nekog programa. } echo "\n\n<BR><BR>\n\n". samo ce je nastaviti. } else { echo "<A HREF=\"$PHP_SELF?&whichpage=$i\">Page $i</A>". U tu svrhu se koristi funkcija session_register() koja kao argument prihvata string sa imenom promenljive bez znaka za dolar. } echo ". $i <= 4.AlefBrain PHP Trening 2006." times. I to je sve sto nam je potrebno da bi promenljive registrovane sa session_register() bile vidljive u svim programima koji zapocinju sa session_start()! 2 .<BR>\n". Ta funkcija zapocinje novu sesiju. Zatim sledi registracija sesijskih promenljivih koje zelimo da koristimo. Sve stranice koje zeelite ukljuciti u sesiju zapocnite sa session_start(). Sesiju zapocinjemo funkcijom session_start(). ­ Skripta 2 for ($i = 1.

 jer u suprotnom sesije nece raditi. $view2count. ali ako malo bolje pogledate primer koji smo naveli.AlefBrain PHP Trening 2006. videcete da promenljive $view1count. $view3count i $view4count zadrzavaju svoje vrednosti od zahteva do zahteva – postigli smo trajnost podataka!  Navodimo samo jos jednu malu napomenu. veoma vaznu za rad sa sesijama. Funkcija session_start() se mora pozvati na stranici pre nego sto je bilo sta odstampano. ­ Skripta 2 Mozda ste iznenadjeni jednostavnoscu. ovo je veoma vazno zapamtiti.  3 .

  `wedding` date NOT NULL default '0000­00­00'. ­­  ­­ Dumping data for table `cs_personal_info` ­­  INSERT INTO `cs_personal_info` VALUES (1. ''.'private') NOT NULL default 'shared'.   `last_name` varchar(30) NOT NULL default ''.   `job_title` varchar(100) NOT NULL default ''. Otvorite PHPMyAdmin i napravite novu bazu pod imenom “crossroads”.   `note_sharing` enum('Shared'.   `owner_id` int(11) NOT NULL default '11921'. ' ­'.   `owner` varchar(255) default NULL.   `children` varchar(255) default NULL. '0000­00­00'. '0000­00­00'. ''.   `birthday` date NOT NULL default '0000­00­00'. ''. ''. ''.   `new` varchar(255) default NULL.   `notes` text NOT NULL. ''.   `email_preferences` enum('html'.   `nickname` varchar(255) default NULL. 1 . 'Smith'.   `date` date NOT NULL default '0000­00­00'.   `relationship_status` varchar(30) NOT NULL default ''. 'html'). 11652. ''. ''. 'shared'.   `status` enum('shared'.   `spouse_name` varchar(30) NOT NULL default ''. ''. ''.   `salutation` varchar(100) NOT NULL default ''.   `assistant_name` varchar(255) default NULL. '0000­00­00'.   `secondary_id` varchar(255) default NULL.   `company_name` varchar(100) NOT NULL default ''.   `photo` varchar(255) NOT NULL default ''. Povezivanje PHPa i MySQLa Pre nego pocnemo pricu o funkcijama koje koristimo za povezivanje PHPa i MySQL servera.   `middle_name` varchar(30) NOT NULL default ''.'text') NOT NULL default 'html'. ' ­'. ''. 'Lester'. ''. ' ­'. ''. 3.AlefBrain PHP Trening 2006. ''.   KEY `category_id` (`category_id`). 'Shared'. ''.   `referrer_name` varchar(100) NOT NULL default ''.   `title` varchar(30) NOT NULL default ''. Zatim iskoristite sledece komande da napravite tabelu cs_personal_info i popunite je sa nekoliko slogova podataka.   `referred_by` varchar(100) NOT NULL default ''.   `first_name` varchar(30) NOT NULL default ''. CREATE TABLE `cs_personal_info` (   `person_id` int(11) NOT NULL auto_increment.   PRIMARY KEY  (`person_id`).'Private') NOT NULL default 'Shared'.   KEY `owner_id` (`owner_id`) ) TYPE=MyISAM AUTO_INCREMENT=19254 . ­ Skripta 2 14. pripremimo bazu i jednu tabelu na kojoj cemo prikazati test primer.   `appended_title` varchar(30) NOT NULL default ''.   `category_id` int(11) NOT NULL default '0'.

AlefBrain PHP Trening 2006. ­ Skripta 2 INSERT INTO `cs_personal_info` VALUES (2, ' ­', 'Russell', 'Bettis', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (3, ' ­', 'Barbara', 'Bruckhorst', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (4, ' ­', 'Harry', 'Vernon', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (6, ' ­', 'Radovan', 'Duric', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', 'Nicole', '', '', '', '', 'Duric', 11921, '0000­00­ 00', 'html'); INSERT INTO `cs_personal_info` VALUES (7, ' ­', 'Christie', 'Winner', '', ' ­', '', 3, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', 'Dale', '', '', '', '', 'Winner', 11921, '0000­00­ 00', 'html'); INSERT INTO `cs_personal_info` VALUES (11788, ' ­', 'Lynn', 'Summerhill', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', NULL, 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (9, ' ­', 'Mario', 'Williams', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (11, ' ­', 'Roger', 'Edwards', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (12, ' ­', '', 'Whitmore', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (13, ' ­', 'Spencer', 'Dean', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (15, ' ­', 'Jay', 'Geis', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (16, ' ­', 'Gerald', 'Rainer', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); INSERT INTO `cs_personal_info` VALUES (17, ' ­', 'Mike', 'Bateman', '', ' ­', '', 0, '', '', '', ' ­', 'shared', '0000­00­00', '0000­00­00', '', '', 'Shared', '', '', '', '', '', '', '', '', 11921, '0000­00­00', 'html'); Sada kada imamo bazu, tabelu i podatke, mozemo pokazati kako pomocu PHP da se konektujemo 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. Posle ova 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 da izvrsimo sledeci kod:

<?php define("DB_DATABASE_NAME", "crossroads"); define("DB_USERNAME", "root"); define("DB_PASSWORD", "root"); define("DB_HOSTNAME", "localhost"); //Connect to database mysql_connect(DB_HOSTNAME, DB_USERNAME, DB_PASSWORD) or die(mysql_error()); mysql_select_db (DB_DATABASE_NAME) or die(mysql_error()); ?>
Najpre smo definisali konstante sa neophodnim podacima za povezivanje na bazu i onda primenili objasnjene funkcije.

3

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 postavljanje SQL upita. Procedura je vrlo jednostavna i postize se upotrebom nekoliko funkcija. Najpre pokazimo kako da postavimo upit bazi podataka, bilo da je to SELECT, INSERT ili UPDATE upit. 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 pozivamo ugradjenu 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 posle izvrsenja u program vraca u program odredjenu informaciju koja zavisi od vrste upita koji smo postavili.  Ako smo postavili SELECT, SHOW, DESCRIBE ili EXPLAIN upit, funkcija mysql_query vraca pokazivac na resurs koji sadrzi rezultat upita, pod uslovom da je upit uspesno izvrsen, a u suprotnom vraca FALSE. Pokazivac na resurs smestamo u promenljivu da bi smo ga mogli kasnije u programu koristiti na nacin koji cete kasnije upoznati. Ako postavimo UPDATE, DELETE, DROP ili neki drugi tip upita, funkcija mysql_query vraca TRUE 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 funkcije mysql_query(). Sada cemo se pozabaviti procedurom preuzimanja podataka vracenih u SELECT upitu. Kako PHP pristupa ovim podacima i kako ih mozemo iskoristiti u nasim programima? Pogledajte sledeci deo koda, pa cemo objasniti sta on radi:

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

1

$user_last_name = $select_row[last_name]. Da bi smo pristupili rezultatu upita. Dobro upamtite ovu kombinaciju upita i while petlje jer ce vam jako cesto biti potrebna u vasim programima. $user_first_name $user_last_name<br>". upotrebite funkciju mysql_num_rows() na sledeci nacin: $select_query = "select person_id. koju smo naveli pri pozivu funkcije mysql_fetch_array(): while ($select_row = mysql_fetch_array($select_result))  Da bi smo preuzeli svaki vraceni slog.  Ako zelite da saznate koliko slogova je vratio SELECT upit.  U svakoj iteraciji kroz while petlju imamo pristup tekucem preuzetom slogu. koristimo taj pristup da bi smo promenljivama $person_id. Taj asocijativni niz se dodeljuje promenljivoj $select_row. $select_result = mysql_query($select_query). a taj pokazivac smestamo u promenljivu $select_result. Zatim taj upit postavljamo MySQLu funkcijom mysql_query() i ona vraca pokazivac na rezultate koje je vratio nas upit. moramo formirati while petlju koja se izvrsava dok god funkcija mysql_fetch_array() ne preuzme svaki slog iz vracenih rezultata. mi koristimo funkciju mysql_fetch_array() kojoj kao argument predajemo pokazivac na vraceni rezultat upita ­ $select_result. Sada cu navesti jos par funkcija PHPa za rad sa MySQLom koje ce vam biti vrlo korisne. DELETE ili UPDATE upit. ime i prezime: echo "$person_id. Na potpuno isti nacin cete uvek uzimati rezultate upita. Zatim smo te vrednosti koristili da bi odstampali na ekranu id osobe. Ako hocete da saznate na koliko slogova je uticao vas INSERT. Kada se i poslednji slog pruzme. U nasem primeru. echo "Num Rows: ". U primeru koji zatim sledi videcete sve te funkcije na delu. uzima jedan slog iz svih vracenih slogova i formira asocijativni niz ciji su indeksi imena polja koja smo naveli u SELECT upitu.mysql_num_rows($select_result). ­ Skripta 2 Na pocetku definisemo upit koji selektuje person_id. $user_first_name = $select_row[first_name]. koristite funkciju mysql_affected_rows(): 2 . last_name     from cs_personal_info     ORDER BY person_id DESC LIMIT 100".  Sta radi funkcija mysql_fetch_array()? Ona pristupa vracenim rezultatima. first_name. "<br>".AlefBrain PHP Trening 2006. prestaje izvrsavanje while petlje. first_name i last_name iz tabele cs_personal_info. samo sto cete u razlicitim situacijama na drugacije nacine koristite slogove koje upit vrati. a vrednosti su jednake vrednostima u tekucem preuzetom slogu. $user_first_name i $user_last_name dodelili vrednosti iz tekuceg dobijenog sloga: $person_id = $select_row[person_id].

  first_name. last_name.  title.mysql_affected_rows($result).  ''.  referred_by.  notes.'.  'Salutation'.  'S'.  '12'.  referrer_name)  VALUES( '1010'.  status. 'Mr'. ­ Skripta 2 $query = "UPDATE cs_personal_info SET first_name = 'Tralala'  WHERE first_name ='Miljan' ". $result = mysql_query($query).  middle_name. '". A da bi ste saznali koji je poslednji auto increment id postavljen u INSERT upitu koji je obuhvatao polje definisano kao AUTO INCREMENT.  ' '.AlefBrain PHP Trening 2006.  salutation.  category_id.  '1975­05­09'.  spouse_name.  'Miljan'.  'Jr.  appended_title.  ' '.  3 .  job_title.  '12'.  birthday.  ''. 'AlefBrain'.  'Notes'. echo "<br><br>Affected Rows:".date("Y­m­d").  date.  photo.  'Vranic'."'.  '2'.  relationship_status. company_name.  wedding.  'CEO'. koristite funkciju mysql_insert_id() neposredno posle INSERT upita: $query = "INSERT INTO cs_personal_info( owner_id.

define("DB_HOSTNAME". date. } //dodavanje podataka u bazu $query = "INSERT INTO cs_personal_info( owner_id. $walkthru_data[person_id] = mysql_insert_id(). $user_first_name $user_last_name<br>". $user_first_name = $select_row[first_name]. 4 .AlefBrain PHP Trening 2006. ­ Skripta 2 'Marko Markovic')". echo "$person_id.$walkthru_data[person_id]. echo "Num Rows: ". "crossroads"). first_name. //selektovanje podataka $select_query = "select person_id. define("DB_USERNAME". while($select_row=mysql_fetch_array($select_result)) { $person_id = $select_row[person_id]. last_name from cs_personal_info ORDER BY person_id DESC LIMIT 10". DB_PASSWORD) or die(mysql_error()). define("DB_PASSWORD". "root"). first_name. spouse_name. $user_last_name = $select_row[last_name]. DB_USERNAME. Pored navedenih funkcija. $result = mysql_query($query). appended_title. postoje mnoge druge PHP funkcije predvidjene za rad sa MySQlom i za vise detalja preporucujem da pogledate PHP Manual."<br><br>". category_id. Sledi primer koji objedinjuje sve sto smo naucili u poslednje dve lekcije: <?php define("DB_DATABASE_NAME".mysql_num_rows($select_result). mysql_select_db (DB_DATABASE_NAME) or die(mysql_error()). "root"). last_name. // Connect to database mysql_connect(DB_HOSTNAME. $select_result = mysql_query($select_query). title. "<br>". middle_name. echo "<br><br>Poslednji uneti person_id:". "localhost").

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

 Pokusajte da eksperimentisete tako sto cete stavljati komenatare na INSERT.AlefBrain PHP Trening 2006. on ce izvrsiti sve navedene funkcije i prikazati na ekranu spisak od najvise deset ljudi iz tabele cs_personal_info. 6 . DELETE ili UPDATE upite i posmatrajte sta se desava. ­ Skripta 2 //DELETE podataka $query = "DELETE FROM cs_personal_info WHERE first_name ='Tralala' ".php i kada ga pokrenete u web browseru. ?> Sacuvajte ovo kao mysql_php_functions. $result = mysql_query($query).

 kome da ide kopija a da ostali primaoci ne vide njegovu adresu (BCC). Zar to nije tako jednostavno?! Funkcija mail() uzima tri bitna argumenta: 1. Naslov poruke 3. string koji sadrzi bilo koja dodatna zaglavlja koja vam sluze da navedete ko salje poruku (FROM). $mail_subject = "Hi there!". Slanje poruka elektronske poste u PHP­u Evo dobrih vesti: jedina funkcija koja vam je potrebna da bi ste slali elektronsku postu pomocu PHP­a je mail(). ­ Skripta 2 16. Telo poruke Takodje mozete navesti i opcioni cetvrti argument. kome da ide kopija poruke (CC). kome treba odgovoriti na primljenu poruku. mail($mail_to. $mail_body = "We'll have a meeting next Wednesday. $mail_body . ?> Sacuvajte fajl pod imenom first_mail. in Judy's Office. a u telu poruke pisace “We'll have a meeting. Sledeci jednostavan primer daje vam sve sto je potrebno da bi se poslao email. Obratite paznju da ovaj skript mozda nece raditi na vasem lokalnom racunaru ako nije povezan na Internet i ako nemate instaliran SMTP server. Hajde sada da prosirimo primer upotrebom cetvrtog argumenta funkcije mail: 1 .\n".php i kada se izvrsi on ce poslati eamil na adresu nobody@whatyoumaycallit.com ciji ce nasloov biti “Hi There!”. $mail_subject. BYOB!\n"..”.= "Oh.php $mail_to ="nobody@whatyoumaycallit..= "7 P. Otvorite text editor i napisite sledeci skript: <?php //first_mail. $mail_body . Email adresu primaoca poruke 2. $mail_body).AlefBrain PHP Trening 2006.com"...M.\n".

\n".com\r\nCC: pera@gmail. Reply­To – kome ide poruka kada primaoc klikne na Reply dugme svog email klijenta.com\r\nBCC: mika@gmail.php.= "7 P.com\r\nReply-to: mile@gmail.M.= "Oh. mail($mail_to.com". BCC – ko ce dobiti Blind Carbon Copy poruke. $mail_body . in Judy's Office.php $mail_to ="nobody@whatyoumaycallit. $mail_body.com"). 2 . CC – ko ce dobiti Carbon Copy poruke. $mail_body . On se od prethodnog programa razlikuje u tome sto smo u cetvrtom argumentu funkcije mail() neke dodatne standardne atribute email poruka kao sto su From – ko salje mail.\n". ­ Skripta 2 <?php //first_mail. $mail_subject = "Hi there!". $mail_subject. BYOB!\n". $mail_body = "We'll have a meeting next Wednesday. "From: ja@gmail. Obratite paznju da posle svakog navedenog atributa u cetvrtom argumentu idu znaci “\r\n” koji su obavezni prema standardima za slanje email poruka.AlefBrain PHP Trening 2006. ?> Sacuvajte fajl kao second_mail.

 pogledate neku od biblioteka funkcija koje vam mozda mogu pomoci da na jednostavniji i brzi nacin pronadjete resenje.php.php.net  Adresa PHP Manual­a je http://www. ­ Skripta 2 17.  1 .AlefBrain PHP Trening 2006. Od presudne vaznosti za vase dalje napredovanje u PHP­u jeste da kada god imate neki problem.  Adresa navedenog sajta je www. stalno se javljaju nove funkcije koje se dodaju osnovi PHP­a i na zvanicnom sajtu PHP­a uvek cete biti u prilici da se upoznate sa najsvezijim izvorima informacija putem PHP Manual­a – vodica kroz PHP.net/manual/en/  Poslednja navedena adresa je veoma vazna kao referenca za vase dalje napredovanje u PHP programiranju. Kroz ovaj kurs prikazali smo samo neke od njih. Funkcije ugradjene u PHP Postoje mnoge biblioteke funkcija ugradjenih u PHP. Posto je PHP veoma ziv jezik.

define("DB_PASSWORD". define("DB_HOSTNAME". cesto to stvara mnogo problema jer programeri ne vode racuna i preteruju u kombinovanju PHP­a i HTML­a sve dok ne proizvedu vrlo necitljive stranice. ­ Skripta 2 18. Zatim u text editoru ukucajte sledeci program: 1 .AlefBrain PHP Trening 2006. // | Connect to database mysql_connect (DB_HOSTNAME. Kako ovo izbeci.php").php prikaze ono sto logika. first_name. //selektovanje podataka $select_query = "select person_id. DB_USERNAME. define("DB_USERNAME".php koji ce nam sluziti da korisniku prikazemo rezultate rada programa logika. odgovor je vrlo jednostavan: na kraju fajla logika.php jer ce on sadrzati cist PHP kod koji radi ono sto je glavni zadatak programa. $array_of_names[] = "$person_id. Jedan cemo nazvati logika. mysql_select_db (DB_DATABASE_NAME) or die (mysql_error()). $user_last_name = $select_row[last_name]. last_name from cs_personal_info ORDER BY person_id DESC LIMIT 100". Pogledajmo kako izgledaju ovi programi: <?php define("DB_DATABASE_NAME".php i on ce uglavnom sadrzati HTML kod sa vrlo malo PHP­a koji sluzi samo za stampanje rezultata. ?> Sacuvajte ovaj fajl pod imenom logika. "root"). } include("prikaz. Ako se pitati kako cemo izvesti da prikaz. DB_PASSWORD) or die(mysql_error()).php uradi. $select_result = mysql_query($select_query). "localhost").php. Napravicemo dva fajla. "root").Razdvajanje logickog PHP koda od prikaza Cilj ovog poglavlja je da vam kratko ukaze na jos jedan nacin pisanja sto razumljivijih programa. $user_first_name $user_last_name<br>". Medjutim. $user_first_name = $select_row[first_name]. Veoma vazna osobina PHP­a je da se na istoj strani mogu naci i PHP i HTML komande.php pomocu funkcije include. while($select_row = mysql_fetch_array ($select_result)) { $person_id = $select_row[person_id]. Drugi cemo nazvati prikaz. jer je najcesce neophodno da se na istoj strani nadje PHP kod (logika programa) sa HTML­om (prikaz)? Pozvacemo u pomoc funkciju include() i prikazati kako treba pravilno razdvajati logiku od prikaza i tako omoguciti lako snalazenje u programu.php samo cemo ukljuciti fajl prikaz. "crossroads").

Ovo je veoma jednostavan koncept razdvajanja logike od prikaza. Primetite da u logika. ­ Skripta 2 <html> <head> <title>Prikaz podataka iz mysql_php_functions.php u vasem browseru. 2 .php. Mozda ce vam ovo izgledati nepotrebno u manjim primerima. on ce se zakaciti na bazu. Kada pozovete logika. } ?> </body> </html> I sacuvajte ga kao prikaz.php.AlefBrain PHP Trening 2006. razumljiviji i sa mnogo manje gresaka.php nema ni jednog HTML taga.php. Vas kod ce biti cistiji.php i samo je na potrebnom mestu odstampan sadrzaj niza koji smo popunili podacima u logika. ali kada pocnete da radite na nekim ozbiljnijim projektima. izvrsiti upit i rezultate uoita smestiti u niz $array_of_names. Zato je kompletan HTML smesten u prikaz. ali je istovremeno veoma koristan. vrlo brzo cete videti koliko koristi donosi ovakav pristup.php</title> </head> <body bgcolor="Gray"> <?php foreach ($array_of_names as $value) { echo $value. Na kraju fajla se ukljucuje prikaz.

Sign up to vote on this title
UsefulNot useful