PRILAGODLJIVA WEB APLIKACIJA ZA POSREDOVANJE PRI ONLINE NARUDŽBAMA

Similar documents
Biznis scenario: sekcije pk * id_sekcije * naziv. projekti pk * id_projekta * naziv ꓳ profesor fk * id_sekcije

SAS On Demand. Video: Upute za registraciju:

CJENOVNIK KABLOVSKA TV DIGITALNA TV INTERNET USLUGE

1. Instalacija programske podrške

Podešavanje za eduroam ios

Eduroam O Eduroam servisu edu roam Uputstvo za podešavanje Eduroam konekcije NAPOMENA: Microsoft Windows XP Change advanced settings

AMRES eduroam update, CAT alat za kreiranje instalera za korisničke uređaje. Marko Eremija Sastanak administratora, Beograd,

Upute za korištenje makronaredbi gml2dwg i gml2dgn

KAPACITET USB GB. Laserska gravura. po jednoj strani. Digitalna štampa, pun kolor, po jednoj strani USB GB 8 GB 16 GB.

JEDINSTVENI PORTAL POREZNE UPRAVE. Priručnik za instalaciju Google Chrome dodatka. (Opera preglednik)

SIMPLE PAST TENSE (prosto prošlo vreme) Građenje prostog prošlog vremena zavisi od toga da li je glagol koji ga gradi pravilan ili nepravilan.

KONFIGURACIJA MODEMA. ZyXEL Prestige 660RU

Port Community System

IZDAVANJE SERTIFIKATA NA WINDOWS 10 PLATFORMI

Windows Easy Transfer

PROJEKTNI PRORAČUN 1

CJENIK APLIKACIJE CERAMIC PRO PROIZVODA STAKLO PLASTIKA AUTO LAK KOŽA I TEKSTIL ALU FELGE SVJETLA

Kako instalirati Apache/PHP/MySQL na lokalnom kompjuteru pod Windowsima

Slobodni softver za digitalne arhive: EPrints u Knjižnici Filozofskog fakulteta u Zagrebu

GUI Layout Manager-i. Bojan Tomić Branislav Vidojević

Tutorijal za Štefice za upload slika na forum.

BENCHMARKING HOSTELA

Trening: Obzor financijsko izvještavanje i osnovne ugovorne obveze

Office 365, upute za korištenje elektroničke pošte

Uvod u relacione baze podataka

Ulazne promenljive se nazivaju argumenti ili fiktivni parametri. Potprogram se poziva u okviru programa, kada se pri pozivu navode stvarni parametri.

Mindomo online aplikacija za izradu umnih mapa

Idejno rješenje: Dubrovnik Vizualni identitet kandidature Dubrovnika za Europsku prijestolnicu kulture 2020.

ONLINE APLIKACIJA ZA SLANJE OBAVIJESTI U PREDDEFINIRANO VRIJEME

Obrada podataka poslanih preko web formi

Nejednakosti s faktorijelima

Univerzitet u Novom Sadu. Fakultet tehničkih nauka. Odsek za računarsku tehniku i računarske komunikacije. Uvod u GIT

RANI BOOKING TURSKA LJETO 2017

ALEN BARAĆ RAZVOJ DINAMIČKIH WEB APLIKACIJA DIPLOMSKI RAD

Da bi se napravio izvještaj u Accessu potrebno je na izborniku Create odabrati karticu naredbi Reports.

NIS PETROL. Uputstvo za deaktiviranje/aktiviranje stranice Veleprodajnog cenovnika na sajtu NIS Petrol-a

ZAVOD ZA AUTOMATIKU I PROCESNO RAČUNARSTVO FAKULTET ELEKTROTEHNIKE I RAČUNARSTVA SVEUČILIŠTE U ZAGREBU HTTP PROTOKOL OTVORENO RAČUNARSTVO

Otpremanje video snimka na YouTube

Struktura indeksa: B-stablo. ls/swd/btree/btree.html

DOSTAVUANJE PONUDA ZA WIMAX MONTENEGRO DOO PODGORICA

STRUČNA PRAKSA B-PRO TEMA 13

VELEUĈILIŠTE NIKOLA TESLA U GOSPIĆU MYSQL SUSTAV ZA UPRAVLJANJE BAZAMA PODATAKA OTVORENOG KODA

Upute za VDSL modem Innbox F60 FTTH

DZM Aplikacija za servise

MINISTRY OF THE SEA, TRANSPORT AND INFRASTRUCTURE

RAZVOJ DINAMIČKIH WEB APLIKACIJA UPORABOM PHP-a I AJAX-a

MEĐIMURSKO VELEUČILIŠTE U ČAKOVCU RAČUNARSTVO ROBERT PRAŠNIČKI

MEĐIMURSKO VELEUČILIŠTE ČAKOVEC STRUČNI STUDIJ RAČUNARSTVA MARKO KNOK REDUNDATNOST I BALANSIRANJE OPTEREĆENJA WEB POSLUŽITELJA ZAVRŠNI RAD

MRS MRSLab09 Metodologija Razvoja Softvera Vežba 09

INSTALIRANJE SOFTVERSKOG SISTEMA SURVEY

Informacijski sustav primarne zdravstvene zaštite Republike Hrvatske

- Vežba 1 (dodatan materijal) - Kreiranje Web šablona (template) pomoću softvera Adobe Photoshop CS

Regshot. Mateo Šimonović,

Web aplikacija za evaluaciju sudionika na tržištu najma nekretnina

UPRAVLJANJE KORISNIČKIM RAČUNIMA U RAILS OKRUŽENJU

Priprema podataka. NIKOLA MILIKIĆ URL:

MRS MRSLab08 Metodologija Razvoja Softvera Vežba 08

2. Objektno orjentirana analiza i dizajn poslovnih aplikacija, MVC model

3. Obavljanje ulazno-izlaznih operacija, prekidni rad

CRNA GORA

TRAJANJE AKCIJE ILI PRETHODNOG ISTEKA ZALIHA ZELENI ALAT

Projektovanje softvera. Dijagrami slučajeva korišćenja

PORTAL ZA UDOMLJAVANJE KUĆNIH LJUBIMACA

RAČUNALNA APLIKACIJA ZA RFID EVIDENCIJU STUDENATA NA NASTAVI

Primjeri pitanja iz 1. ili 2. skupine (za 2 ili 4 boda po pitanju) -

APLIKACIJA ZA RAČUNANJE N-GRAMA

UPUTE ZA RAD S MODULOM "ČLANOVI" U SUSTAVU "VATRONET"

VEB APLIKACIJA ZA IZBOR RESTORANA

Sveučilište Jurja Dobrile u Puli Fakultet ekonomije i turizma «Dr. Mijo Mirković» Josip Bošnjak. Fizički dizajn baze podataka.

REALIZACIJA WEB APLIKACIJE ZA POSLOVANJE TURISTIČKE AGENCIJE

Use-case diagram 12/19/2017

Iskustva video konferencija u školskim projektima

UPUTE ZA INSTALACIJU PROGRAMA FINBOLT 2007 tvrtke BOLTANO d.o.o.

SVEUČILIŠTE U ZAGREBU FAKULTET PROMETNIH ZNANOSTI RAZVOJ SUSTAVA ZA UPRAVLJANJE REPOM STUDENTSKE SLUŽBE FAKULTETA PROMETNIH ZNANOSTI

PANEVROPSKI UNIVERZITET APEIRON FAKULTET ZA POSLOVNU INFORMATIKU BANJA LUKA. Specijalističke studije TEMA: WEB DNEVNIK

DIPLOMSKI RAD. Sučelje katastarske baze podataka

EKSPLORATIVNA ANALIZA PODATAKA IZ SUSTAVA ZA ISPORUKU OGLASA

Upravljanje kvalitetom usluga. doc.dr.sc. Ines Dužević

11 Analiza i dizajn informacionih sistema

Struktura i organizacija baza podataka

TRENING I RAZVOJ VEŽBE 4 JELENA ANĐELKOVIĆ LABROVIĆ

MEĐIMURSKO VELEUČILIŠTE U ČAKOVCU RAČUNARSTVO KRISTIAN LEINER

1. OSNOVNI POJMOVI O BAZAMA PODATAKA 2 2. UVOD U RAD S MS ACCESSOM TABLICE RELACIJE U BAZI UPITI OBRASCI (FORMS) 39

Ivan Milić

IZRADA WEB APLIKACIJE U PROGRAMSKOM JEZIKU C#

Aplikacija za podršku transferu tehnologija

C# DESKTOP APLIKACIJA ZA GENERIRANJE I POHRANU ZAHTJEVA ZA GODIŠNJI ODMOR

SVEUČILIŠTE U ZAGREBU FAKULTET STROJARSTVA I BRODOGRADNJE ZAVRŠNI RAD. Denis Petljak. Zagreb, 2015.

IZRADA SUSTAVA ZA UPRAVLJANJE SADRŽAJEM KORIŠTENJEM WEB TEHNOLOGIJA OTVORENOG KODA

UPITI (Queries) U MICROSOFT ACCESSU XP

USB Key Uputa za instaliranje programske potpore i registraciju korisnika

Analiza mogućnosti povezivanja alata OSSIM s alatima za strojno učenje i statističku analizu

IZRADA PORTALA O PROGRAMSKOM JEZIKU PYTHON U SUSTAVU ZA UREĐIVANJE WEB SADRŽAJA

Albert Farkaš SUVREMENI TRENDOVI RAZVOJA INFORMACIJSKIH SUSTAVA

MEĐIMURSKO VELEUČILIŠTE U ČAKOVCU

USPOREDBA ALATA ZA VIZUALIZACIJU PODATAKA

Bušilice nove generacije. ImpactDrill

Upotreba selektora. June 04

DALJINSKI NADZOR I UPRAVLJANJE BEŽIČNIM ČVOROVIMA

3D GRAFIKA I ANIMACIJA

Transcription:

SVEUČILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE V A R A Ţ D I N Hrvoje Bogeljić PRILAGODLJIVA WEB APLIKACIJA ZA POSREDOVANJE PRI ONLINE NARUDŽBAMA ZAVRŠNI RAD Varaţdin, 2012.

SVEUČILIŠTE U ZAGREBU FAKULTET ORGANIZACIJE I INFORMATIKE V A R A Ţ D I N Hrvoje Bogeljić Izvanredni student Broj indeksa: S-39853/10-III-Izv Smjer: Primjena informacijske tehnologije u poslovanju Stručni studij PRILAGODLJIVA WEB APLIKACIJA ZA POSREDOVANJE PRI ONLINE NARUDŽBAMA ZAVRŠNI RAD Mentor: Doc. dr. sc. Markus Schatten Varaţdin, rujan 2012.

Sadrţaj 1. UVOD... 1 2. RAZVOJNI POSLUŢITELJ... 2 2.1. XAMPP... 2 2.1.1. Instalacija na Windows... 3 2.1.2. Testiranje instalacije... 4 2.2. APACHE WEB POSLUŢITELJ... 6 2.3. PHP... 6 2.4. MYSQL... 8 2.4.1. Pristup MySQL-u... 10 2.4.2. Referencijalni integritet... 13 2.4.3. Transakcije... 14 2.4.4. Tipovi tablica... 15 3. REALIZACIJA APLIKACIJE... 18 3.1. OPIS ZADATKA... 18 3.2. DIZAJN BAZE PODATAKA... 19 3.2.1. ERA model baze podataka... 20 3.2.2. Relacijski model baze podataka... 23 3.2.3. Dizajn baze podataka u alatu MySQL Workbench... 25 3.3. DEKOMPOZICIJA SUSTAVA... 29 3.4. FUNKCIONALNOST WEB APLIKACIJE... 30 3.5. PROGRAMSKI KOD APLIKACIJE... 34 4. KORISNIČKE UPUTE... 43 4.1. POČETNA STRANICA... 43 4.2. REGISTRACIJA U SUSTAV... 43 4.3. PRIJAVA U SUSTAV... 44 4.4. NARUČIVANJE... 45 4.5. PROMJENA POSTAVKI APLIKACIJE... 46 4.6. UPRAVLJANJE JELOVNIKOM... 47 4.7. PREGLED IZVJEŠTAJA... 48 5. KORISNIČKA PERSPEKTIVA APLIACIJE... 49 6. KRITIČKI PRIKAZ... 51 7. LITERATURA... 52 I

1. Uvod Tema ovog rada je realizacija prilagodljive web aplikacije za posredovanje pri online narudţbama hrane i pića iz ugostiteljskih objekata. Motivacija za odabir ove teme proizašla je iz spoznaje kako je online naručivanje postalo globalni trend, pa je tako i online naručivanje hrane u svijetu postala uobičajena pojava. U trenutku stvaranja ove ideje u Republici Hrvatskoj postojao je samo jedan servis koji nudi usluge takve vrste, dok u ovom trenutku djeluje već nekolicina takvih servisa, što govori u prilog kvaliteti ideje. Zanimljivo je napomenuti kako primjerice u SAD-u čak 85% ugostiteljskih objekata nudi uslugu online naručivanja, a veliki dio od njih i online plaćanje. U nastavku ovog rada opisana je realizacija jedne takve aplikacije, te tehnologije na kojima se zasniva. Konkretno aplikacija je razvijena i testirana lokalno na razvojnom posluţitelju, pa je tako u prvom dijelu opisano postavljanje razvojnog posluţitelja. Zatim u istom dijelu opisane su i komponete korištenog paketa aplikacija razvojnog posluţitelja, koje su i sluţile kao osnova za razvoj ove aplikacije. U drugom dijelu opisana je sama aplikacija, njena koncepcija i osnovna svrha. Prikazana je primjena korištenih tehnologija u realizaciji konkretne aplikacije. U trećem dijelu rada date su korisničke upute, dok je u četvrtom dijelu opisana korisnička perspektiva aplikacije. Nakon toga rad je zaključen kritičkim osvrtom na realizaciju aplikacije i procjenom naznaka za budući rad. 1

2. Razvojni poslužitelj Internet aplikacije je moguće razvijati na lokalnom ili udaljenom posluţitelju. Ukoliko nemamo vlastiti razvojni (lokalni) posluţitelj, svaku promjenu u aplikaciji potrebno je učitati na javni (udaljeni) posluţitelj prije nego što je istu moguće testirati. Čak i uz brzu internet vezu, ovakav način razvoja predstavlja značajan gubitak vremena u fazi razvoja. Na lokalnom računalu meďutim testiranje je jednostavno i svodi se na klikanje ikone za pohranu promjena u ureďivaču programskog koda i zatim klikanje gumba za ponovno učitavanje u internet pregledniku. TakoĎer prednost razvojnog posluţitelja je da se ne moramo brinuti oko sigurnosnih pitanja prilikom razvoja i testiranja, kao ni oko pitanja što korisnici vide ili rade sa aplikacijom, što ne moţemo reći u u slučaju razvoja na javnom posluţitelju. Postoje razni paketi aplikacija koji se zasnivaju na Apache posluţitelju koji objedinjuju aplikacije potrebne za razvoj dinamičnih web stranica. MeĎu takvima je i Više platformski, Apache HTTP 1 posluţitelj, MySQL, PHP i Perl (XAMPP 2 ) paket aplikacija koji je korišten kao razvojni posluţitelj za potrebe ovog rada. 2.1. XAMPP XAMPP je besplatno web posluţitelj rješenje otvorenog koda, koje se uglavnom sastoji od Apache HTTP posluţitelja, MySQL baze podataka i interpretera za skripte pisane u PHP i Perl programskim jezicima. Alternative XAMPP-u ovisno o platformi su WAMPP, MAMPP i LAMPP, gdje skraćenice znače Windows, Apache, MySQL, PHP i Perl, Mac, Apache, MySQL, PHP i Perl i Linux, Apache, MySQL, PHP i Perl. XAMPP je više-platformski, što znači da postoji distribucija za svaku od navedenih platformi. XAMPP dolazi u obliku potpuno funkcionalne postavke paketa gore navedenih programa, tako da nije potrebno instalirati i postavljati svakog od njih. To znači da je potrebno instalirati samo jedan program kako bismo mogli razvijati web aplikacije na vlastitom razvojnom posluţitelju i to uz minimum uloţenog vremena. Tijekom instalacije paketa kreira se nekoliko defaultnih postavki. Sigurnosne postavke takve instalacije nisu striktne kao što su na javnom komercijalnom web posluţitelju, iz razloga što je 1 HTTP (engl. HyperText Transfer Protocol) je glavna i najčešća metoda prijenosa informacija na Webu. Osnovna namjena ovog protokola je omogućavanje objavljivanja i prezentacije HTML dokumenata, tj. web stranica. 2 XAMPP dokumentacija je dostupna na adresi: http://www.apachefriends.org/en/faq-xampp.html 2

paket odnosno njegova konfiguracija optimizirana za lokalnu uprabu. Iz tog razloga ne preporuča se instalacija takve konfiguracije u svrhu komercijanog web posluţitelja. U ovom radu koristit će se XAMPP distribucija za Windows platformu, čija je instalacija prikazana u nastavku. 2.1.1. Instalacija na Windows Instalacija XAMPP pakaeta je krajnje jednostavna. Kako bismo instalirali XAMPP potrebno je posjetiti adresu http://www.apachefriends.org/en/xampp.html, zatim u ovom slučaju odabrati Windows distribuciju i preuzeti paket. Paket se nudi u opcijama Installer, ZIP i 7zip ovisno o načinu na koji ţelimo pokrenuti XAMPP. Najlakši način za instalaciju XAMPP-a je korištenje Installer verzije prkazane na lici 2.1. Slika 2.1. Installer verzija XAMPP paketa Nakon dovršetka instalacije, XAMPP se nalazi pod Start Programs XAMPP. Za pokretanje, odnosno zaustavljanje svih posluţitelja kao i instalaciju, odnosno deinstalaciju usluga moţe se koristiti XAMPP Control Panel aplikacija prikazana na slici 2.2. 3

Slika 2.2. Control Panel aplikacija 2.1.2. Testiranje instalacije U ovoj fazi potrebno je provjeriti uspješnost instalacije. Kako bi smo to postigli u internet preglednik potrebno je unesti neku od sljedećih adresa: http://127.0.0.1/ http://localhost/ Prva adresa je IP adresa koju sva računala koriste kako bi referencirala sama sebe, a druga je alias za potpuno isto. Ukoliko je sve proteklo u redu nakon unosa adrese u internet preglednik trebali bismo vidjeti XAMPP pozdravnu stranicu prikazanu na slici 2.3. 4

Slika 2.3. XAMPP pozdravna stranica U XAMPP srukturi direktorija nalazi se direktorij pod imenom htdocs u koji se smještaju datoteke web aplikacija. U tom direktoriju web posluţitelj (Apache) traţi datoteke koje će posluţiti. Uobičajeno je za svaku aplikaciju koju stvaramo stvoriti direktorij unutar htdocs direktorija kako bi se izbjegli mogući konflikti. Za potrebe ovog rada unutar htdocs direktorija stvoren je direktorij pod imenom klopa u koji će se pohranjivati datoteke web aplikacije koja je tema ovog rada. Nakon toga aplikciji pristupamo unosom sljedeće adrese u preglednik: http://localhost/klopa/ Web posluţitelji su uobičajeno konfigurirani na način da traţe index datoteku unutar direktorija navedenog u zahtjevu. To moţe biti index.htm, index.html, index.php itd., čiji sadrţaj se zatim prikazuje kao početna stranica aplikacije. Na taj način u prethodnoj URL 3 adresi ustvari zatraţena je početna stranica aplikacije Klopa. Web posluţitelji su visoko kofigurabilni, pa je tako i pravilo smještanja datoteka u htdocs direktorij moguće promijeniti, no to nije tema ovog rada. 3 URL (akronim za engl. Uniform Resource Locator) je Web adresa odreďenog resursa na Internetu. Resurs na koji pokazuje URL adresa moţe biti HTML dokument (web stranica), slika, ili bilo koja datoteka koja nalazi na odreďenom web serveru. 5

2.2. Apache web poslužitelj Web posluţitelj je posluţitelj koji je odgovoran za prihvaćanje HTTP zahtjeva od web klijenata i posluţivanje HTTP odgovora istima, obično u obliku web stranica koje sadrţe statički sadrţaj kao što su tekst, slike i slično, te dinamički sadrţaj, odnosno skripte. Apache Web posluţitelj najpopularniji je i najčešće korišteni web posluţitelj tijekom zadnjeg desetljeća. Apache je više platformski, lagan, robustan, a koristi se u malim tvrtkama, kao i velikim korporacijama. Apache je takoďer besplatan i open-source. Apache web posluţitelj ima gotovo neograničene mogućnosti zbog svoje velike modularnosti, koja omogućuje da se integrira s brojnim drugim aplikacijama. Jedan od najpopularnijih paketa je LAMP posluţitelj paket web aplikacijia, koji uključuje Apache posluţitelj, MySQL, PHP, Perl i Python. Apache web posluţitelj je razvijen od strane Apache Software Foundation. Projekt Apache nastaje 1995. godine, inačica 1.0 izlazi 1. prosinca 1995. U razdoblju samo jedne godine njegova popularnost nadilazi onu NCSA (National Center for Supercomputing Application) odnosno posluţitelja iz kojeg proizlazi i sam Apache. Inačica 2.0 Apache izlazi tijekom konferencije ApacheCon, odrţane u oţujku 2000. u Orlandu, Florida. Velika popularnost ovog softwera je dokaz njegove kvalitete iako spada u open-source, prema istraţivanjima Netcrafta 2005., od 75 milijuna web stranica, oko 52 mulijuna koriste Apache web-posluţitelj, u listopadu 2006. godine brojke rastu na 60 milijuna odnosno (60,32%) ukupno postojećih web stranica. [Wikipedija "Apache (webposlužitelj) < http://hr.wikipedia.org/wiki/apache_%28webposluţitelj%29 > (03. kolovoz 2012.) ] Biti u stanju konfigurirati i osigurati Apache web posluţitelj je jedna od najvaţnijih zadaća za (Linux) administratore sustava. Web posluţitelji su središta informacija. Loša konfiguracija ili ugroţenost nekom prijetnjom posluţitelja moţe izloţiti velik broj ljudi neţeljenom sadrţaju i potencijalno izazvati goleme štete uključenim stranama. 2.3. PHP PHP 4 je nastao iz PHP/FI kojeg je 1995. godine napravio Rasmus Lerdorf, kombinirajući Perl skripte na svojim osobnim web vanjskicama. Taj software je nazvao 'Personal Home Page Tools / Forms Interpreter'. S vremenom je na to dodavao neke funkcije iz programskog jezika C za komunikaciju s bazama podataka i publiciranje dinamičkih web stranica. Rasmus je javno 4 PHP: Hypertext preprocessor 6

objavio kod svog PHP/FI da bi ga svi mogli koristiti, ali i ako ţele sudjelovati u budućem razvoju i poboljšanju. [Galić; 2010; str. 14] PHP je jezik koji se koristiti kako bi posluţitelj dinamički generirao sadrţaj web stranice, odnosno HTML 5 kod. Dinamički generirani HTML kod je kod koji je potencijalno svaki put drugačiji kada preglednik, odnosno web klijent zahtjeva web stranicu. Ovo znači da je sadrţaj rezultat obrade PHP koda. Kada se sadrţaj generira na ovakav način, klijent kojem je sadrţaj isporučen ne moţe vidjeti programski kod koji je generirao taj sadrţaj, ako bi primjerice pogledao izvorni kod stranice. Klijent u tom slučaju ima uvid u čisti generirani HTML kod stranice. Kada se govori o programskom jeziku PHP on je u pravilu dio troslojne arhitekture budući da se u većini slučajeva dio podataka pohranjuje u bazu podataka. Troslojnu arhitekturu čine, kao što joj i ime govori, tri osnovna sloja. Prvi sloj je klijentski koji uključuje preglednik i samu mreţu Internet. Srednji sloj je posluţitelj weba na kojem se izvršavaju skriptni jezici ili izvršne datoteke, dok je posljednji, treći sloj, onaj u kojem se nalazi sustav za upravljanje bazom podataka i sama baza podataka. [Paunović, Tomić; 2006; str. 8-9] PHP kod dolazi u obliku skripti, koje su obične tekstualne datoteke, a mogu se pisati i u najobičnijem ureďivaču teksta. PHP skripta započinje sa oznakom <?php, a završava sa oznakom?>. Sve unutar tih oznaka smatra se PHP programom i na taj način skripta se odvaja od ostalog sadrţaja u toj datoteci. Datoteka koja sadrţi PHP kod, odnosno skriptu, moţe imati ekstenziju: *.php, *.php3, *.phtml i dr., a moţe sadrţavati tekst, HTML tagove i skripte. Standardna ekstentija za PHP datoteku je *.php, iako je moguće istu datoteku snimiti i sa *.htm ili *.html ekstenzijom, pri čemu se tada web posluţitelj mora podesiti da i takve datoteke prije slanja u preglednik prosljedi PHP-u. Ovakvu metodu nerjetko koriste web programeri kako bi sakrili činjenicu da koriste PHP jezik za razvoj web aplikacija. PHP je programski jezik interpreterskog tipa. PHP interpreter je softver na web posluţitelju koji čita te datoteke i čini ih smislenima, dajući web posluţitelju HTML kod i upute o tome što treba raditi sljedeće. U praksi se ovo odvija na sljedeći način, korisnik putem preglednika zatraţi web stranicu na nekom posluţitelju, koji na osnovu ekstenzije prepoznaje da se radi o PHP datoteci i poziva instalirani PHP da interpretira i izvede operacije navedene u PHP skripti. Zatim se 5 Hypertext MarkupLanguage 7

rezultat vraća web posluţitelju, koji sve šalje pregledniku, čija je uloga da tu datoteku grafički oblikuje i prikaţe korisniku. Ovaj proces shematski je prikazan na slici 2.5. u troslojnoj arhitekturi koja uključuje i sustav za upravljanje bazom podataka. Slika 2.5. Proces zahtjeva za web vanjskicom koji uključuje PHP Tekstualna datoteka, odnosno skripta, interpretira se liniju po liniju koda, svaki put kada se datoteci pristupi. Ovaj koncept je različit od jezika kao što su Java ili C + +, koji se prevode (engl. Compile) u strojni jezik računala. Ti jezici pišu se takoďer u tekstualnim datotekama, ali nakon toga pokreće se naredba koja pretvara te tekstualne datoteke u nešto drugo: class datoteke, binarne datoteke, komade nečitljiva koda koji koristi računalo. Jedan od razloga vrlo dobre prihvaćenosti programskog jezika PHP je i vrlo slična sintaksa programskom jeziku C. Velik broj osnovnih funkcija ima istu sintaksu. Početnicima je takoďer vrlo dobar jer nije ograničavajući kao neki drugi programski jezici budući da nema deklaracija tipova varijabli, a moguće je i istu varijablu koristiti za pohranu različitih vrsti vrijednosti. Iako ove karakteristike programski kod čini manje osjetljivim na pogreške jednostavnije ih je i napraviti budući da prevodilac (eng. Compiler) na njih neće upozoriti. [Paunović, Tomić; 2006; str. 11] 2.4. MySQL MySQL je sustav za upravljanje relacijskim bazama podataka (RDBMS 6 ), i kao takav vjerojatno je najpopularnije rješenje otvorenog koda koje se koristi kao posluţitelj baze podataka. MySQL je najčešće korištena baza podataka za aplikacije pisane u PHP programskom jeziku. MySQL je 6 RBBMS (engl. relational database management system; hr. relacijski susstav za upravljanje bazom podataka) 8

nastao kao vlasništvo švedske tvrtke MySQL AB koja je danas u vlasništvu tvrtke Oracle Corporation i nazvan je prema kćeri osnivača My. Zanimljivo je da je MySQL prvobitno nastao kao interni projekt. Prva verzija ovoga software-a izdana je 23.05.1995., najnovija verzija 5.0.51a (Community posluţitelj) izdana je 06.12.2007. Treba reći da je source kod ove aplikacije napisan u C i C++ programskom jeziku. Iz tih razloga ova aplikacija radi na mnogo različitih OS platforma. [Galić; 2010; str. 23] Svoju popularnost stekao je iz nekoliko razloga kao što su: MySQL je brz, stabilan, lako se uči, moguće ga je pokretati na popularnim sistemima (Windows, Linux, Mac OS X, Unix-type), podrţava razne programske jezike (kao što su C, C++, C#, Java, Perl, PHP, Python, VB, i VB.NET), opširno je dokumentiran i dostupan je pod GPL 7 licencom. MySQL pripada Klijent/Posluţitelj arhitekturi SUBP-a. Takav sustav podjeljen je na dvije komponente (Posluţiteljska i Klijentska). Posluţiteljska komponenta zaduţena je za interakciju sa bazom podataka, a klijentska komponenta (aplikacijski porgram) komunicira sa posluţiteljom. Klijenti šalju zahtjeve prema posluţitelju koji za uzvrat obraďuje zahtjev i vraća razultat zahtjeva natrag prema klijentu. Ovakav sustav ima nekoliko prednosti. Naime klijent i posluţitelj ne moraju se izvršavati na istom fizičkom računalu. Na taj način odvajanjem klijenta od posluţitelja proširuje se raspon vrste klijenata koji mogu pristupiti bazi podataka. Klijenti mogu biti MySQL alati i aplikacije pisane u raznim programskim jezicima. Gotovo svi poznati sustavi za baze podataka (Oracle, Microsoft SQL Posluţitelj, itd.) su Klijent/Posluţitelj sustavi. Takvi sustavi različiti su od Datotečnih posluţitelja (File/Server), kakvi su primjerice Microsoft Access, dbase, and FoxPro, čija mana je neučinkovitost pri korištenju u mreţi, kako broj korisnika raste. MySQL podrţava kao što mu i ime sugerira SQL (Structured Query Language). SQL je prije svega jezik korišten za interakciju sa bazom podataka, te sluţi za definiranje strukture baze podataka, pohranu podataka, manipulaciju podacima, kontrolu pristupa podacima i osiguranje integriteta podataka. [Sheldon, Moes; 2005; str. 10] Na slici 2.4. prikazana je interakcija SQL jezika sa RDBMS. Slika prikazuje MySQL kao posluţitelj na nekoj platformi, zatim bazu podataka, pohranjenu interno ili eksterno, koja sadrţi datoteke baze podataka. Iako RDMS olakšava kreaciju i odrţavanje baze podataka pomoču C/C++ aplikacija, SQL ustvari kreira i odrţava bazu podataka. 7 GNU General Public License (kratice GNU GPL i samo GPL) je vjerojatno najpoznatija i najšire korištena licenca za slobodan softver, koju je originalno kreirao Richard Stallman za projekt GNU, a o kojoj se danas brine Free software foundation (FSF). GPL je napisan tako da sačuva slobode korisnika softvera: pravo na korištenje u bilo koju svrhu, pravo na izradu kopija i pravo na proučavanje, mijenjanje i redistribuciju modificiranog programa. 9

Slika 2.4. Interakcija SQL jezika sa RDBMS. [Sheldon, Moes; 2005; str. 10] 2.4.1. Pristup MySQL-u MySQL sustavu za upravljanje bazom podataka moguće je pristupiti na nekoliko načina, meďu kojima su: pristup putem naredbene linije, pristup putem sučelja (GUI 8 ), te pristup korištenjm programskog jezika poput PHP-a. Prije nego što se započne sa pristupom MySQL posluţitelju, isti je potrebno pokrenuti na razvojnom posluţitelju. Za pristup MySQL-u putem naredbene linije, Windows korisnici trebaju pokrenuti naredbeni redak (engl. command prompt), te unesti sljedeću naredbenu liniju: C:\>mysql u [korisničko_ime] p [lozinka] Budući da je MySQL instalacija u ovom slučaju prilagoďena za rad sa razvojnim posluţiteljom, inicijalni MySQL korisnik je root i nema postavljenu lozinku. Prema tome naredba koju treba unijeti u naredbeni redak je sljedeća: C:\>mysql u root Ukoliko putanja prema mysql bin direktoriju nije dodana u windows varijablu okruţenja (engl. environment variable), potrebno je unijeti potpunu putanju prema istome, odnosno sljedeću naredbu: 8 GUI (engl. graphical user interface; hr. sučelje) je metoda interakcije sa računalom kroz manipulaciju grafičkim elementima i dodacima uz pomoć tekstovnih poruka i obavještenja. 10

C:\>xampp\mysql\bin\mysql -u root Nakon unosa ove naredbe, pojavljuje se sljedeći prozor prikazan na slici 2.5., u kojem je unešena SQL naredba SHOW DATABASES; kojom se ispišu sve baze podataka dostupne na posluţitelju. Slika 2.5. Pristup MySQL-u putem naredbene linije Za pristup MySQL-u putem sučelja potrebno je pokrenuti Apache web posluţitelj na razvojnom posluţitelju i zatim pokrenuti phpmyadmin sučelje. Sučelje je moguće pokrenuti korištenjem ranije spomenute Xampp Control Panel aplikacije ili unosom sljedeće adrese u web preglednik: http://localhost/phpmyadmin/ Izgled phpmyadmin sučelja prikazan je na slici 2.6. 11

Slika 2.6. izgled phpmyadmin sučelja Za pristup MySQL-u putem PHP-a potrebno je stvoriti konekciju na bazu podataka. Konekcija koju stvaramo ima dvije komponente, spajanje na posluţitelj baze podataka i selekcija baze podataka. Za spajanje na posluţitelj moţe se koristiti PHP funkcija mysql_connect( ), koja prihvača tri parametra: ime računala, odnosno adresu na kojoj je smješten MySQl posluţitelj, naziv korisničkog računa koji je ovlašten za spajanje na MySQL posluţitelj, te lozinku za taj račun. Sintaksa mysql_connect( ) funkcije je sljedeća: <?php $BP_poslužitelj = 'host_name'; $BP_korisnik = 'user_name'; $BP_lozinka = 'password'; $dbc = mysql_connect($bp_poslužitelj, $BP_korisnik, $BP_lozinka) or die('could not connect: '. mysql_error());?> Nakon spajanja na posluţitelj slijedi druga komponenta konekcije, a to je selekcija baze podataka. Za selekciju baze podataka koristimo PHP funkciju mysql_select_db( ), u kojoj navodimo ime baze podataka na koju se spajamo kao prvi parametar i opcionalno moţemo navesti identifikator veze kao drugi parametar. 12

Sintaksa mysql_select_db( ) funkcije je sljedeća: <?php... $BP_bazaPodataka = 'db_name'; $db = mysql_select_db($bp_bazapodataka, $dbc);?> Nakon uspješne konekcije i selekcije baze podataka, podacima koji su sadrţani u istoj moţemo pristupati pomoču PHP aplikacije. Za pristup podacima koristi se PHP mysql_query( ) funkcija. Sintaksa mysql_query( ) funkcije je sljedeća: <?php... $sql = "SELECT * FROM Table"; $rs = mysql_query($sql);?> Kada koristimo ovu funkciju obično to radimo na način da prvo definiramo varijablu ($sql) čija je vrijednost SQL naredba ("SELECT * FROM Table"), a zatim definiramo varijablu ($rs) koja će sadrţavati vrijednost rezultata koji je vratila mysql_query( ) funkcija. Kao prvi parametar toj funkciji obavezno prosljeďujemo SQL upit. Nakon što mysql_query( ) funkcija obradi SQL naredbu i dodjeli rezultat obrade definiranoj varijabli ($rs), tu varijablu zatim koristimo u programskom kodu kako bismo prikazali rezultate u aplikaciji. 2.4.2. Referencijalni integritet Vanjski ključ u bazi podataka je stupac u tablici koji upućuje na primarni ključ druge tablice u cilju odrţavanja odnosa, odnosno veze izmeďu te dvije tablice. Primjerice u aplikaciji koja je tema ovog rada postoji tablica Restoran koja ima stupac nazvan FirmaID. Taj stupac upućuje (referencira) na tablicu Firma i on je vanjski ključ u tablici Restoran. Korištenjem vanjskih ključeva sustavu za upravljanje bazom podataka se daje do znanja da stupac koji je vanjski ključ neke tablice ima vezu na stupac koji je primarni ključ referencirane tablice. Ova sposobnost potencijalno je vrlo dobra, a naziva se foreign-key constraint. Kada je sustav za upravljanje bazom podataka svjestan ove veze, on moţe provjeriti da vrijednost koja se pohranjuje u polje vanjskog ključa postoji u stupcu primarnog ključa referencirane tablice. U slučaju da ta vrijednost ne postoji sustav će odbiti unos vrijednosti. Sposobnost posluţitelja baze podataka da 13

odbije zapis podataka zbog toga što oni ne zadovoljavaju uvjetima povezanih tablica naziva se referencijalni integritet. MySQL trenutno nudi samo jedan tip tablica koje podrţavaju potpunu funkcionalnost vanjskih ključeva, a to je InnoDB tip tablice. Zanimljivo je napomenuti da se isti efekti korištenja referencijalnog integriteta mogu postići i kroz interakciju aplikacije sa bazom podataka. U tom slučaju prije umetanja ili aţuriranja podataka u tablici, prvo je potrebno dohvatiti vrijednosti iz stupca primarnog ključa, zatim provjeriti dali vrijednost koju ćemo umetnuti u polje vanjskog ključa odgovara vrijednostima iz prvog koraka, te ako vrijednost odgovara umetnuti ju. U svakom slučaju imati mogućnost upotrebe referencijalnog integriteta zasigurno je dobra stvar. 2.4.3. Transakcije Prilikom izrade aplikacije koja pristupa podacima u MySQL bazi podataka, mora se uzeti u obzir hoće li više korisnika pokušati pregledavati i mijenjati podatke u isto vrijeme. Ako korisnici pokušaju obaviti te operacije istovremeno, rezultat mogu biti nedosljedni i netočni podaci. Kako bi se izbjegle takve vrste problema, mogu se koristiti transakcije i izolirati svaku operaciju kako bi se bi se osigurala točnost i konzistentnost podataka. U kontekstu SQL-a i relacijskih baza podataka, transakcija je skup jednog ili više SQL izraza koji obavljaju niz povezanih aktivnosti. Izjave su grupirane zajedno i tretirane kao jedinstvena jedinica čiji uspjeh ili neuspjeh ovisi o uspješnom izvršenju svake izjave u transakciji. [Sheldon, Moes; 2005; str. 455] Ovo znači da ako bilo koja od naredbi iz grupe u transakciji ne proďe, cijela grupa naredbi ne prolazi, a baza se vraća u stanje u kojem je bila prije nego što se pokušala izvesti prva naredba. Ovakav pristup naziva se commit / rollback pristup. Transakcije se koriste u bazama podataka kako bi se osigurala konzistentnost i točnost podataka, te kako bi se podaci zaštitili u slučaju havarije. Transakcijski sposobna baza podataka mora podrţavati četiri svojstva poznata po akronimu ACID 9, koja su definirana kako slijedi: Atomarnost - Operacije koje čine svaku transakciju tretiraju se kolektivno kao jedna, ili atomska, jedinica. Ili su sve operacije obavljene ili nijedna nije. Teka kada se sve operacije izvedu uspješno, rezultati te transakcije primjenjuju se u bazi podataka. 9 ACID (engl. atomicity, consistency, isolation, durability; hr. atomarnost, konzistentnost, izolacija, trajnost) 14

Konzistentnost - Svaka transakcija mora ostaviti bazu podataka u istom konzistentnom stanju u kojem je bila i na početku transakcije. Čak i ako se neke od izjava u transakciji izvedu i transakcija neuspije, baza podataka će završiti u konzistentnom stanju. Izolacija - Svaka transakcija je izolirana od svih drugih. Učinci Transakcije A nisu vidljivi Transakciji B dok Transakcija A nije završena. Ako je transakcija u tijeku, privremeno stanje podataka neće biti vidljivo drugim transakcijama. Trajnost - Kada je transakcija dovršena, promjene su trajne. Čak i ako se baza podataka sruši, informacije iz uspješne transakcije će biti dostupne i potpune. U starijim verzijama MySQL-a transakcije nisu bile podrţane, što je predstavljalo veliki problem za programere web aplikacija. Trenutno MySQL nudi nekoliko tipova tablica (InnoDB, BDB) koje podrţavaju transakcije. 2.4.4. Tipovi tablica MySQL podrţava nekoliko tipova tablica meďu kojima su BDB, MEMORY, ISAM, INNODB, MERGE i MyISAM. Zadani (engl. default) tip tablice do MySQL verzije 5.5. bio je MyISAM, a od te verzije zadani tip tablica postaje InnoDB. Sintaksa za definiciju tipa tablice je sljedeća: CREATE TABLE Table_name ( Column_name COLUMN_TYPE COLUMN_ATTRIBUTES, ) ENGINE = InnoDB; U ovoj definiciji, ENGINE klauzula dodana je nakon definicije posljednjeg stupca i završne zagrade. Primijećujemo da jednostavno navedemo ENGINE ključnu riječ, znak jednakosti, i jedan od tipova tablica. Svaka tablica u MySQL-u podrţava odreďeni skup funkcionalnosti i sluţi odreďenoj svrsi. Osim toga, svaka vrsta tablice povezana je sa srodnim pogonom za pohranu (rukovatelj) koji obraďuje podatke u toj tablici. Za Na primjer, MyISAM ENGINE obraďuje podatke u MyISAM tablicama. [Sheldon, Moes; 2005; str. 159] Slika 2.7.sadrţi opis vrsta tablica u MySQL-u. 15

Slika 2.7. Opis vrsta tablica u MySQL-u. [Sheldon, Moes; 2005; str. 159] MyISAM je zadani tip tablica na večini MySQL instalacija. Nekada je to bio i jedini tip tablica dostupan u MySQL-u. MyISAM tablice iznimno su brze i stabilne, no meďutim, ne podrţavaju transakcije. One nude samo zaključavanje podataka na razini tablice. MyISAM tablice su optimizirane za brzinu u dohvaćanje podataka sa SELECT izjavama. Zbog optimizacije i nedostatka podrške za transakcijama, MyISAM tablice najbolji su odabir za tablice na kojima će se obavljati SELECT operacije daleko češće nego UPDATE ili DELETE operacije. Primjerice ako stvaramo košaricu za kupovinu, odnosno popis za narudţbu kao što je to slučaj u ovome radu, tablice u kojima ćemo čuvati podatke o narudţbama biti će češće predmet INSERT, UPDATE ili DELETE operacija nego SELECT operacija. TakoĎer u ovom slučaju bitna je i podrška za transakcijama iz razloga što ne ţelimo imati narudţbe bez stavaka u svojoj bazi podataka. Iz tog razloga za takve tablice bolja je upotreba InnoDB vrste tablica, koje su korištene u ovom radu. 16

InnoDB tablice pruţaju potpunu (ACID) podršku za transakcije i zaključavanje na razini retka. Kao što je već ranije spomenuto InnoDB tablice zamjenile su MyISAM tablice kao zadani tip tablica od MySQL verzije 5.5. Prednosti korištenja InnoDB tablica su sljedeće: Ako se posluţitelj sruši zbog nekog hardverskog ili softverskog problema, bez obzira na to što se dogaďalo u bazi podataka za to vrijeme, nije potrebno učiniti ništa posebno nakon ponovnog pokretanja baze podataka. InnoDB automatski finalizira sve promjene koje su potvrďene prije trenutka pada posluţitelja, i poništava sve promjene koje su u tijeku, ali nisu potvrďene. InnoDB meďuspremnik (engl. buffer) sprema podatke iz tablica i indekse kako se podacima pristupa. Često korišteni podaci se obraďuju izravno iz memorije. To ubrzava obradu toliko, da namjenski posluţitelji baza podataka dodijeljuju i do 80% svoje fizičke memorije InnoDB meďuspremniku. Moguće je postavljanje vanjskih ključeva i nametanje referencijalnog integriteta. Prilikom aţuriranja ili brisanja podataka, ukoliko su ti podaci povezani sa podacima u drugim tablicama, takoďer automatski dolazi do promjena i u povezanim podacima. Ako se podaci oštete na disk ili u memoriju, checksum mehanizam upozorava na laţne podatake prije nego što ih uptrebimo. Prilikom dizajniranja baze podataka sa pripadajučim stupcima primarnih ključeva za tablice, operacije koje uključuju te stupce automatski su optimizirane. Na taj način vrlo se brzo referencira stupac primarnog ključa u klauzulama kao što su: WHERE, GROUP BY, ORDER BY, kao i u operacijama spoja. Sve ove značajke dovele su do činjenice da InnoDB tablice sada imaju i bolje performanse od MyISAM tablica. 17

3. Realizacija aplikacije Ideja je bila razviti aplikaciju koja će omogućiti izravnu vezu izmeďu korisnika i ugostiteljskog objekta, korištenjem internet tehnologije, u svrhu upućivanja, odnosno zaprimanja narudţbi. Aplikacija je zamišljena da korisnicima pruţi jednistveni pregled ugostiteljskih objekata koji dostavljaju u ţeljenom kvartu, pregled njihove ponude odnosno jelovnika, te besplatno naručivanje u svega nekoliko klikova. TakoĎer aplikacija je zamišljena da ugostiteljskim objektima pruţi prezentaciju svoje ponude na mediju koji je dostupan svima, tj. internetu. Kako je internet postao vaţno sredstvo komunikacije s potrošačima zbog svojih prednosti nad klasičnim medijima, ugostiteljskim objektima omogućava se predstavljanje velikom broju potencijalnih konzumenata njihovih usluga. Osnovna svrha aplikacije je da posreduje pri narudţbama na opisani način, te da pri tome pohranjuje podatke o ostvarenoj naknadi. Naknada se ostvaruje u obliku provizije na realiziranu narudţbu, koja se naplaćuje od ugostiteljskih objekata. Aplikacija je razvijena s namjerom da bude prilagodljiva u smislu da pruţa mogućnost promjene cijene pojedine stavke iz jelovnika, zatim promjene postotka provizije na narudţbe, te promjene stope PDV-a. U tu svrhu baza podataka razvijena je na način da novonastale promjene u postavkama rada aplikacije ne utječu na već prethodno obavljene narudţbe. 3.1. Opis zadatka Sustav treba omogućiti online naručivanje iz ugostiteljskih objekata. On treba sadrţavati ponudu ugostiteljskih objekata iz kojih je moguće naručivati, te ponudu njihovih jelovnika. Korisnici sustava su: Administarator, Korisnik registrirani i prijavljeni korisnik Gost neregistrirani, anonimni posjetitelj. Anonimni korisnik odnosno gost moţe pregledavati ponudu restorana kao i njihovih jelovnika. Prilikom pregleda ponude istu moţe filtrirati prema ţeljenoj lokaciji dostave. 18

Prijavljeni korisnik moţe naručivati iz ugostiteljskih objekata, te moţe vidjeti podatke o vlastitim narudţbama. Kod naručivanja potrebno je omogućiti dodavanje stavki na popis za narudţbu, zatim je potrebno omogućiti promjenu količine svake pojedine stavke na popisu za narudţbu, te uklanjanje svake pojedine stavke sa popisa za narudţbu. Prilikom naručivanja takoďer je potrebno onemogućiti višestruko dodavanje iste stavke na popis za narudţbu, već se isto treba realizirati kroz promjenu količine te stavke. Sličnu restrikciju potrebno je implementirati prilikom dodavanja stavki na popis za narudţbu na način da na jednom popisu mogu biti stavke sa jelovnika iz samo jednog ugostiteljskog objekta. Administrator sustava dodaje firme i ugostiteljske objekte u sustav i zatim kreira ponudu, odnosno jelovnik svakog ugostiteljskog objekta, te unosi cijenu svake pojedine stavke jelovnika. Administrator sustava moţe aţurirati podatke o restoranima i mijenjati cijenu i status svake stavke na jelovniku. Administrator moţe vidjeti sve preglede kao anonimni i prijavljeni korisnik. Uz navedene preglede administrator moţe vidjeti podatke o svim narudţbama, o njihovom ukupnom broju, ukupnoj sumi, prosječnoj vrijednosti narudţbe, iznosu ostvarene provizije, te iznosu pdv-a iz sume narudţbi. Prilikom pregleda administrator moţe filtrirati rezultate prema ugostiteljskim objektima i datumima narudţbi. MeĎu najvaţnijim ulogama administratora je konfiguracija sustava. Naime administrator odreďuje postavke aplikacije kao što su provizija na narudţbe i stopa pdv-a. 3.2. Dizajn baze podataka Za potrebe promjenjive aplikacije za posredovanje pri narudţama neophodna je baza podataka u koju će se pohranjivati podaci. Izgradnja baze podataka sloţen je postupak. Naime potrebno je prikupiti podatke, utvrditi koji su podaci dovoljno vaţni (relevantni) da bi ušli u bazu podataka i u koje tablice će ući koji podaci. Podaci i tablice se u fazi projektiranja dogovaraju s korisnicima jer ni projektant baze podataka ni programer ne mogu znati koji su podaci relevantni za neku obradu, kakvi su ti podaci i kako utječu jedni na druge. Nakon prikupljanja podataka, iste je potrebno smjestiti u odgovarajuče tablice. U koliko tablica treba te podatke spremiti? U jednu, dvije, tri ili više? Kako izbjeći redundanciju podataka, kako podatke organizirati na način da se podaci mogu čim lakše obraďivati i što je najvaţnije, da se mogu unositi kada god je to potrebno. Ova pitanja rješavamo prilikom modeliranja baze podataka. 19

Za modeliranje baze podataka koriste se razne tehnike poput ERA (engl. entity-relationship, atribute u prijevodu: entiteti-veze-atributi) dijagrama, koja je korištena u ovome radu. 3.2.1. ERA model baze podataka Entity-relationship (ER) pristup modeliranju gleda poslovnu domenu u smislu entiteta koji imaju atribute i sudjeluju u odnosima. [Halpin, Morgan; 2008; str. 306] Iz toga sljedi da ERA model sadrţi entitete koji se pojavljuju u bazi podataka zajedno sa njihovim meďusobnim odnosima. ERA model je grafička prezentacija znanja o objektima, vezama i svojstvima. [Brumec; 2008/2009; slide 58] Osnovni koncepti ERA modela su: Entitet - je konkretna ili apstraktna posebnost, koncept ili objekt od interesa. Entitet je stvarni ili apstraktni predmet ili dogaďaj o kojemu se u informacijskom sustavu pamte podaci. Postoje jaki entiteti, koji egzistiraju samostalno i slabi entiteti koji ne egzistiraju samostalno ili se ne identificiraju samostalno. Svakom entitetu pridruţen je odreďen broj atributa. Atribut - (obiljeţje, svojstvo) je podatak koji identificira, klasificira, kvantificira, izraţava kvalitetu ili stanje entiteta. To je jedinstveno obiljeţje entiteta Veza - je odnos (relacija) izmeďu dva entiteta. Veza se imenuje, a naziv veze opisuje ulogu entiteta u vezi. Prema broju tipova entiteta koji sudjeluju u vezi odreďuje se stupanj veze. Veze su dvosmjerne, odnosno označavaju meďusobne odnose entiteta u oba smjera. Ograničenja su donje i gornje granice sudjelovanja entiteta u vezi, odnosno kardinalnosti veza. Kardinalnost veza opisuje koliki broj entiteta jednog tipa moţe biti u vezi s entitetima drugog tipa. Postoji više različitih notacija za ERA modeliranje, meďu kojima su: Chenova, Barkerova, IE (engl. Information engineering) notacija, te IDEF1X notacija. U industriji, najpopularnije verzije su Barkerova IE notacija. U ovom radu korištena je IE notacija još poznata kao Martinova. U IE notaciji entiteti su prikazani imenovanim pravokutnicima, a atributi se mogu prikazati unutar pravokutnika, ispod njegovog imena. Veze izmeďu entiteta prikazane su kao imenovane linije koje povezuju entitete. Opcionalnost i kardinalnost veze izmeďu entiteta prikazani su simbolima na krajevima linija. Za označavanje da je uloga opcionalna, krug "O" stavlja se na drugom kraju linije, što znači 20

minimalna frekvencija sudjelovanja 0. Kako bi se naznačilo da je uloga obvezna, znak " I " stavlja se na drugom kraju linije, što znači minimalna frekvencija sudjelovanja 1. Kardinalitet od "mnogo" označava se simblom svračje noge "<". U kombinaciji s minimalnom frekvencijom od 0 ili 1, znak " I " koristi se za označavanje maksimalne frekvencija od 1. Pri čemu tada, kombinacija " O I " označava "najviše jedan", a kombinacija " I I " ukazuje "točno" 1. [Halpin, Morgan; 2008; str. 319] ERA model sustava moţe se jednostavno transformirati u relacijsku shemu baze podataka postupcima dekompozicije entiteta i veza u konkretne tablice i navoďenjem njihovih atributa, kao što će biti prikazano u ovom radu. Model ove baze podataka sadrţi trinaest entiteta sa njihovim atributtima i meďusobnim odnosima, koji su prikazani ERA modelom na slici 3.1. Slika 3.1. ERA model baze podataka Iz ERA modela baze podataka vidi se da se baza podataka sastoji od jedanaest jakih entiteta i dva slaba entiteta. Slabi entiteti su oni koji ne mogu biti jedinstveno identificirani vlastitim atributima, dakle, mora se koristiti vanjski ključ u kombinaciji sa svojim atributima ili u kombinaciji sa drugim vanjskim ključem da se stvoriti primarni ključ. Vanjski ključ nekog 21

entiteta je primarni ključ entiteta s kojim je povezan. Na modelu ih prepoznajemo po tome što nemaju identificirajući atribut. Jaki entiteti su: 1. Firma 2. Restoran 3. Grad 4. Kvart 5. Provizija 6. Pdv 7. Korisnik 8. Uloga 9. Narudzba 10. Jelo 11. Meni Slabi entiteti su: 1. Dostavlja 2. Stavke_narudzbe Kompleksnost odnosa izmeďu jakih entiteta razlog je uvoďenja slabih entiteta. Uloga slabog entiteta je da ostvari vezu izmeďu dva jaka entiteta. Primjerice veza izmeďu entiteta Kvartovi i Restorani je veza M:N (više na prema više), što bi začilo da jedan restoran moţe dostavljati u više kvartova i da u jedan kvart moţe dostavljati više restorana. Takva veza ne moţe se direktno ostvariti, te iz tog razloga uvodimo pomoćni tj. slabi entitet Dostavlja, koji je sa svakim od jakih entiteta u vezi 1:N (jedan na prema više). Ta se veza kreira tako da se primarni ključevi iz jakih entiteta prenose u slabi entitet kao vanjski ključevi te zajedno čine višekoponentni primarni ključ u slabom entitetu. Iz modela je zatim vidljiva opcionalnost i kardinalnost svake veze, pa tako vidimo da je veza izmeďu primjerice entiteta Provizija i Narudţba opcionalna s jedne strane, a obavezna s druge strane. Opcionalni dio veze provizija se odnosi na je entitet Narudzba. Opcionalnost u ovom slučaju znači da moţe postojati stopa provizije koja nije ni na jednoj narudţbi. Obavezni dio veze narudţba moţe imati je entitet Provizija, što zači da narudţba mora imati neku stopu provizije. 22

Kardinalnost veze provizija se odnosi na prikazuje da se jedna stopa provizije moţe odnositi na više narudţbi, dok kardinalnost veze narudţba moţe imati prikazuje da jedna narudţba moţe imati samo jednu stopu provizije. Promatranjem kompleksne veze izmeďu entiteta Narudzba i entiteta Meni gdje je uveden slabi (pomoćni) entitet Stavke_narudzbe, vidimo da narudţba mora imati jednu ili više stavaka i da se jedna stavka mora odnositi na jednu i samo jednu (točno jednu) narudţbu. Drugi dio te veze prikazuje kako se jedna stavka narudţbe takoďer mora odnositi na jednu i samo jednu (točno jednu) stavku iz menia, dok moţe postojati stavka u meniu koja moţe biti na nula ili više narudţbi, dakle ona ne mora biti ni na jednoj narudţbi. Na isti način moguće je analizirati i ostale odnose izmeďu entiteta na ERA modelu baze podataka. 3.2.2. Relacijski model baze podataka Relacijski model je linearni prikaz logičkog modela podataka, za razliku od prethodnog ERA modela koji je grafički. Relacija ima dva aspekta: značenje i sadrţaj. Značenje se iskazuje relacijskom shemom, a sadrţaj skupom vrijednosti tj. slogovima relacije. PrevoĎenje ERA modela u Relacijski model je jednoznačno, a provodi se u dva koraka: prevoďenje entiteta i prevoďenje veza. PrevoĎenje entiteta: Svaki entitet iz ERA modela baze podataka postaje relacija relacijskog modela baze podataka i to na način da ime entiteta postaje ime relacije. Atributi entiteta postaju atributi relacijske sheme. Identifikator postaje primarni ključ relacije. PrevoĎenje veza: Veza 1:1 iskazuje se vanjskim ključem u onoj relacijskoj shemi gdje će poprimiti manje nul-vrijednosti Veza 1:M prevodi se na način da odgovarajuća tablica dobiva atribut naziv veze koji je vanjski ključ na drugu tablicu u vezi i taj je atribut definiran kao not null. Vanjski ključ uvijek je u relaciji na vanjski više. 23

Veza M:N izmeďu dva entiteta iskazuje se otvaranjem treće relacijske sheme, čiji je ključ tada dvokomponentni, a sastoji se od primarnih ključeva entiteta koji su u vezi. U nastavku je prikazan relacijski model baze podataka, koji je napravljen na temelju ranije oblikovanog ERA modela baze podataka. Primarni ključevi relacije na relacijskom modelu podcrtani su punom linijom, a vanjski ključevi istaknuti su kurzivom Grad (ID, Naziv) Kvart (ID, Naziv, GradID) Firma (ID, Naziv, Oib, Email, Telefon, Kontakt_osoba, Napomena) Restoran (ID, Naziv, Email, Telefon, Fax, FirmaID) Dostavlja (KvartID, RestoranID) Provizija (ID, Naziv, Iznos, Koeficijent) Pdv (ID, Naziv, Iznos, Koeficijent) Uloga (ID, Naziv) Korisnik (ID, Korisnicko_ime, Lozinka, Email, Prezime, Ime, UlogaID) Narudzba (ID, Datum, RestoranID, KorisnikID, ProvizijaID, PdvID) Jelo (ID, Naziv) Meni (ID, Cijena, Aktivan, RestoranID, JeloID) Stavke_narudzbe (NarudzbaID, MeniID) 24

3.2.3. Dizajn baze podataka u alatu MySQL Workbench Na temelju znanja iz prethodnih modela, baza podataka je dizajnirana u alatu MySQL Workbench, kako bi se generirala SQL skripta koja će se implementirati u MySQL sustav za upravljanje bazom podataka. Dizajn baze podataka u alatu MySQL Workbench prikazan je na slici 3.2. Slika 3.2. Dizajn baze podataka u alatu MySQL Workbench SQL dizajn baze podataka, odnosno generirana skripta prikazana je u nastavku. CREATE TABLE `Grad` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; 25

CREATE TABLE `Kvart` ( `ID` int(11) unsigned NOT NULL AUTO_INCREMENT, `Naziv` varchar(50) NOT NULL, `GradID` int(11) unsigned NOT NULL, PRIMARY KEY (`ID`), INDEX `GradID` (`GradID` ASC), CONSTRAINT `Kvart_ibfk_1` FOREIGN KEY (`GradID` ) REFERENCES `Grad` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Firma` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, `OIB` TEXT NULL DEFAULT NULL, `Email` VARCHAR(50) NULL DEFAULT NULL, `Tel` VARCHAR(30) NULL DEFAULT NULL, `Kontakt osoba` VARCHAR(50) NULL DEFAULT NULL, `Napomena` VARCHAR(255) NULL DEFAULT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Restoran` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, `Email` VARCHAR(50) NULL DEFAULT NULL, `Telefon` VARCHAR(30) NULL DEFAULT NULL, `Fax` VARCHAR(30) NULL DEFAULT NULL, `FirmaID` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`ID`), INDEX `FirmaID` (`FirmaID` ASC), CONSTRAINT `Restoran_ibfk_1` FOREIGN KEY (`FirmaID` ) REFERENCES `Firma` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Dostavlja` ( `RestoranID` INT(11) UNSIGNED NOT NULL, `KvartID` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`RestoranID`, `KvartID`), INDEX `KvartID` (`KvartID` ASC), CONSTRAINT `Dostavlja_ibfk_2` FOREIGN KEY (`KvartID` ) REFERENCES `Kvart` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Dostavlja_ibfk_1` FOREIGN KEY (`RestoranID` ) REFERENCES `Restoran` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Jelo` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(255) NOT NULL, 26

PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Uloga` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Korisnik` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Korisnicko_ime` VARCHAR(50) NOT NULL, `Lozinka` VARCHAR(32) NOT NULL, `Prezime` VARCHAR(128) NULL DEFAULT NULL, `Ime` VARCHAR(128) NULL DEFAULT NULL, `Email` VARCHAR(50) NULL DEFAULT NULL, `UlogaID` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`ID`), INDEX `UlogaID` (`UlogaID` ASC), CONSTRAINT `Korisnik_ibfk_1` FOREIGN KEY (`UlogaID` ) REFERENCES `Uloga` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Meni` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `RestoranID` INT(11) UNSIGNED NOT NULL, `JeloID` INT(11) UNSIGNED NOT NULL, `Cijena` DECIMAL(10,2) NOT NULL, `Aktivan` TINYINT(1) NULL DEFAULT NULL, PRIMARY KEY (`ID`), INDEX `RestoranID` (`RestoranID` ASC), INDEX `JeloID` (`JeloID` ASC), CONSTRAINT `Meni_ibfk_3` FOREIGN KEY (`RestoranID` ) REFERENCES `Restoran` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Meni_ibfk_4` FOREIGN KEY (`JeloID` ) REFERENCES `Jelo` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Pdv` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, `Iznos` DECIMAL(4,2) NOT NULL, `Koeficijent` FLOAT NOT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Provizija` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Naziv` VARCHAR(50) NOT NULL, `Iznos` DECIMAL(4,2) NOT NULL, 27

`Koeficijent` FLOAT NOT NULL, PRIMARY KEY (`ID`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Narudzba` ( `ID` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, `Datum` DATETIME NOT NULL, `KorisnikID` INT(11) UNSIGNED NOT NULL, `RestoranID` INT(11) UNSIGNED NOT NULL, `PorezID` INT(11) UNSIGNED NOT NULL, `ProvizijaID` INT(11) UNSIGNED NOT NULL, PRIMARY KEY (`ID`), INDEX `KorisnikID` (`KorisnikID` ASC), INDEX `RestoranID` (`RestoranID` ASC), INDEX `PorezID` (`PorezID` ASC), INDEX `ProvizijaID` (`ProvizijaID` ASC), CONSTRAINT `Narudzba_ibfk_3` FOREIGN KEY (`KorisnikID` ) REFERENCES `Korisnik` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Narudzba_ibfk_4` FOREIGN KEY (`RestoranID` ) REFERENCES `Restoran` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Narudzba_ibfk_5` FOREIGN KEY (`PorezID` ) REFERENCES `Pdv` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Narudzba_ibfk_6` FOREIGN KEY (`ProvizijaID` ) REFERENCES `Provizija` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; CREATE TABLE `Stavke_narudzbe` ( `NarudzbaID` INT(11) UNSIGNED NOT NULL, `MeniID` INT(11) UNSIGNED NOT NULL, `Kolicina` TINYINT(2) NOT NULL, PRIMARY KEY (`NarudzbaID`, `MeniID`), INDEX `MeniID` (`MeniID` ASC), CONSTRAINT `Stavke_narudzbe_ibfk_1` FOREIGN KEY (`NarudzbaID` ) REFERENCES `Narudzba` (`ID` ) ON UPDATE CASCADE, CONSTRAINT `Stavke_narudzbe_ibfk_2` FOREIGN KEY (`MeniID` ) REFERENCES `Meni` (`ID` ) ON UPDATE CASCADE ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8; 28

3.3. Dekompozicija sustava Dekompozicija (raščlanjivanje) osnovna je metoda savladavanja sloţenosti sustava, kojom se problem rješava postupno, od općeg prema pojedinačnom. Raščlanjivanjem dobivamo hijerarhijski prikaz strukture objekta promatranja, a to znači da se strukture više razine sloţenosti raščlanjuju na strukture niţe razine sloţenosti. [http://arka.foi.hr/pzaweb/pzaweb2003_06/dokumentacija/dokumentacija.php#dd] Dekompozicijski dijagram sustava nam pokazuje aktivnosti koje mogu pojedine vrste korisnika izvoditi na sustavu. Kako su korisnici podjeljeni u tri grupe (administrator, korisnik i gost) tako su im dodjeljene aktivnosti koje mogu izvoditi na sustavu. Sam dekompozicijski dijagram je prikazan na slici 3.3. Klopa Gost Korisnik Administrator Filtrirati ponudu restorana Prijaviti se u sustav Kreirati novi restoran Pregledati ponudu restorana Kreirati popis za narudzbu Kreirati jelovnik restorana Pregledati ponudu jelovnika Predati narudzbu Azurirati stavke jelovnika Registrirati se u sustav Pregledati vlastite narudzbe Odrediti postavke aplikacije Pregledati izvjestaje Slika 3.3. Dekompozicijski dijagram sustava Iz dijagrama je vidiljivo kako se sustav sastoji od tri podustava, a to su procesi gosta, procesi korisnika i procesi administratora. TakoĎer vidimo da administrator sustava kreira i ureďuje ponudu restorana i jelovnika, te da odreďuje postavke aplikacije, pa prema tome on ima najšire ovlasti u sustavu. 29

3.4. Funkcionalnost web aplikacije Funkcionalnost web aplikacije prikazana je UML dijagramom slučajeva korištenja (engl. Usecase diagram). Dijagrami slučajeva korištenja koriste se da bi se prikazalo ponašanje sustava, dijelova sustava ili konkretnog razreda na način vidljiv korisniku sustava. Prema UML-specifikaciji dijagrami slučajeva korištenja sastoje se od učesnika, slučajeva korištenja te veza i odnosa meďu učesnicima i slučajevima korištenja. Dodatno se na dijagramu slučajeva korištenja moţe istaknuti granica sustava koji se izgraďuje. Učesnik predstavlja osobu ili drugi sustav koji je u interakciji sa promatranim sustavom. Učesnik je netko ili nešto što je u interakciji sa sustavom; tko ili što koristi sustav. Učesnik predstavlja ulogu, a ne individualnog korisnika sustava. [Eriksson, Penker, Lyons, Fado; 2004 ; str.63] Dakle učesnik predstavlja skup uloga koje korisnici slučajeva korištenja igraju tijekom njihove interakcije sa slučajevima korištenja. Slučaj korištenja predstavlja zadatak kojeg izvode učesnici, on predstavlja funkcionalnost koju učesniku pruţa modelirani sustav. U UML-u slučaj korištenja definiran je kao skup radnji izvršenih od strane sustava što daje vidljivi rezultat koji je, u pravilu, vrijednost za jednog ili više sudionika ili drugih aktera u sustavu. Na dijagramu slučajeva korištenja prikazanom na slici 3.4., vidljiva je osnovna funkcionalnost koju treba zadovoljiti web aplikacija razvijena za potrebe ovog rada. 30

Slika 3.4. Dijagram slučajeva korištenja Iz dijagrama slučajeva korisnika vidljivo je kako je prikazani sustav u meďudjelovanju sa tri učesnika. Učesnici su gost, korisnik i administrator. Učesnici su meďusobno povezani vezom generalizacije pri čemu je definicija apstraktnog učesnika dopunjena specifičnijim ulogama izvedenih aktora. Tipično semantičko značenje ove veze je da potomak moţe raditi sve što roditelj radi, tj. potomci nasljeďuju veze sa slučajevima korištenja od roditelja. Gost predstavlja neregivanjskog posjetitelja koji moţe pregledavati ponudu restorana i sastav njihovih jelovnika. TakoĎer gost moţe filtrirati ponudu prema lokaciji dostave kako bi pronašao samo one restorane koji dostavljaju na odabranoj lokaciji. Gost nema ovlasti za naručivanje sve dok ne postane korisnik. 31

Da bi gost postao korisnik on se mora registrirati u sustav. Nakon registracije i prijave u sustav korisniku se dodjeljuju ovlasti za naručivanje. Nakon što je dobio ovlasti korisnik sada moţe dodavati ţeljena jela na popis za narudţbu, moţe mijenjati količinu svakog pojedinog jela na popisu, moţe uklanjati stavke sa popisa i ponovno ih dodavati. Kada je završio sa sastavljanjem popisa za narudţbu korisnik moţe isti prosljediti u narudţbu pripadajućem restoranu. Korisnik takoďer moţe pregledavati sve vlastite narudţbe. Korisnik je potomak gosta, te on od njega nasljeďuje veze sa slučajevima korištenja, što znači da korisnik takoďer moţe pregledavati i filtrirati ponudu i sl. Treći učesnik je administrator. Administrator je potomak korisnika čime nasljeďuje sve njegove veze sa slučajevima korištenja, kao i one koje nasljeďuje korisnik. Iz ovoga se jasno moţe zaključti kako administrator ima najveće ovlasti u sustavu. Naime on ima ovlasti svih ostalih učesnika uz dodatne ovlasti kao što su: dodavnje restorana, dodavanje jela na jelovnik, promjena cijene i statusa pojedinog jela na jelovniku, promjena postotka provizije na narudţbe, promjena stope poreza na dodanu vrijednost, pregled i filtriranje izvješataja. Vezom uključivanja (engl. include), na dijagramu povezuju se dva slučaja korištenja kada jedan slučaj korištenja sadrţi ponašanje definirano u drugom slučaju korištenja. Ponašanje uključenog slučaja korištenja uključeno je u ponašanje osnovnog slučaja korištenja. Osnovni slučaj korištenja ovisi o ponašanju uključenog slučaja korištenja. Uključeni slučaj korištenja uvijek je potreban kako bi se osnovni slučaj mogao izvršiti. U slučaju da osnovni slučaj korištenja doďe u točku izvoďenja u kojoj je potrebno izvesti uključeni obrazac uporabe tada se uključeni obrazac uporabe izvodi u cijelosti. Moguće je da u toku izvoďenja nisu zadovoljeni uvjeti pozivanja uključenog obrasca uporabe. Primjerice u toku izvoďenja slučaja korištenja Pregled vlastitih narudţbi uključeni slučaj korištenja Prijava poziva se u slučaju da korisnik nije prijavljen u sustav, što je prikazano na sljedećem isječku koda. <?php //narudzbe.php session_start(); $_SESSION['back'] =htmlentities($_poslužitelj['request_uri']); if(!isset($_session['aktivni_korisnik'])) { header("location:login.php"); 32

?>... Nakon što uključeni slučaj korištenja Prijava bude izveden u cijelosti i korisnik se uspješno prijavi kontrola se vraća osnovnom slučaju korištenja, što je prikazano na sljedećem isječku koda. <?php?> //login.php... if (mysql_num_rows($rs) == 1) { session_start(); $page=$_session['back']; $row = mysql_fetch_array($rs); $_SESSION['aktivni_korisnik'] = $row['id']; $_SESSION['aktivni_korisnik_tip']= $row['ulogaid']; if (isset($page) &&!empty($page) ) { header ("Location:$page"); else { header ("Location:index.php"); else { $greska = "Neispravni podaci za prijavu!";... Vezom proširenja (engl. extend), na dijagramu se povezuju dva slučaja korištenja pri čemu jedan proširuje funkcionalnost drugog. U ovom primjeru funkcionalnost slučaja korištenja Prijava proširuje se slučajem korištenja Registracija. Normalna funkcionalnost slučaja korištenja Prijava podrazumijeva da korisnik ima odgovarajuće podatke za prijavu. Ako korisnik ne posjeduje podatke za prijavu, Registracija proširuje slučaj korištenja Prijava dopuštajući osobi registraciju u sustav kako bi dobila podatke za prijavu. Na sljedećem isjećku koda prikazana je realizacija proširenja.... <h3>prijava</h3> <p>prijava je dostupna samo registriranim korisnicima.<br/> Ako još niste registrirani, <a href="register.php" class="a">registrirajte se OVDJE besplatno.</a> </p> <form class="unos" action="login.php" method="post" > Korisničko ime: <input type="text" name="kor_ime"> Lozinka: <input type="password" name="lozinka"> 33

<input type="submit" class="submit" name="prijavi" value="prijavi se" /> </form>... Zanimljivo je istaknuti da je osnovni slučaj ( Prijava ), kompletan i bez proširenja, što je slučaj kada korisnik ima podatke za prijavu. 3.5. Programski kod aplikacije Aplikacija je razvijena korištenjem PHP programskog jezika, čije su značajke opisane u prvom dijelu ovog rada. TakoĎer korišten je JavaScript programski jezik u svrhu postazanja bolje interakcije s korisnikom i AJAX 10 tehnologija kako bi se aţurirali neki dijelovi stranice bez potrebe za ponovnim učitavanjem iste. Programski kod aplikacije sadrţan je u datotekama koje su smještene u direktoriju pod imenom klopa koji je glavni korijenski direktorij aplikacije. Struktura direktorija klopa prikazana je na slici 3.5. Slika 3.5. Struktura direktorija klopa 10 AJAX (Asynchronous JavaScript and XML) 34

Eliminiranje dupliciranog koda postignuto je na način da su kreirane datoteke header.php, footer.php, configbp.php i funkcije.php. Prve dvije datoteke odgovorne su za prikaz sadrţaja koji je uključen u sve web stranice aplikacije, a to je zaglavlje, podnoţje, navigacijski izbornik i dio za prikaz sadrţaja. Datoteka configbp.php sadrţi funkcije potrebne za rad sa bazom podataka. Pomoču tih funkcija stavra se konekcija na bazu podataka i obavljaju upiti nad bazom podataka. Datoteka configbp.php definirana je na sljedeći način: <?php $BP_poslužitelj = 'localhost'; $BP_bazaPodataka = 'klopa'; $BP_korisnik = 'klopa_2012'; $BP_lozinka = '123456'; $dbc = null; $db = null; function otvoribp() { global $dbc; global $db; global $BP_poslužitelj; global $BP_bazaPodataka; global $BP_korisnik; global $BP_lozinka; $dbc = mysql_connect($bp_poslužitelj, $BP_korisnik, $BP_lozinka); if(! $dbc) { pogreska('pogreška! '. mysql_error()); exit(); $db = mysql_select_db($bp_bazapodataka, $dbc); if(! $db) { pogreska('pogreška! '. mysql_error()); exit(); mysql_query("set names 'utf8'",$dbc); function izvrsibp($sql) { $rs = mysql_query($sql); if(!$rs) { echo('pogreška! '. mysql_error()); exit(); return $rs; function zatvoribp(){ global $dbc; mysql_close($dbc);?> 35

Sa stajališta funkcionalnosti, datoteka funkcije.php meďu najvaţnijim je datotekama ove aplikacije. Sadrţaj ove datoteke čine funkcije koje su odgovorne ponajviše za rad sa popisom za narudţbu. Naime pomoču tih funkcija se dodaju, uklanjaju i aţuriraju stavke popisa za narudţbu. Funkcije takoďer sluţe za dobivanje raznih podataka iz baze podataka, kao što su cijena jela, naziva jela, naziv restorana, izračun sume narudţbe, te za primjerice zaštitu baze podataka (funkcija fix_string). Sadrţaj ove datoteke uključuje se prema potrebi u web stranice aplikacije. Datoteka funkcije.php definirana je na sljedeći način: <?php function remove_product($iid){ $iid=intval($iid); $max=count($_session['list']); for($i=0;$i<$max;$i++){ if($iid==$_session['list'][$i]['itemid']){ unset($_session['list'][$i]); break; if ($max==1){ unset($_session['list']); else { $_SESSION['list']=array_values($_SESSION['list']); function update_product($iid, $q){ $iid=intval($iid); $q=intval($q); $max=count($_session['list']); for($i=0;$i<$max;$i++){ if($iid==$_session['list'][$i]['itemid']){ $_SESSION['list'][$i]['qty']=$q; break; function addtolist($rid,$iid,$q){ if($rid<1 or $iid<1 or $q<1) return; if(is_array($_session['list'])){ if(restoran_isti($rid)) return "Molimo Vas dovršite započetu narudžbu prema prvom restoranu"; if(item_exists($iid)) return "Traženo jelo već postoji na popisu. Ukoliko želite, promijenite količinu."; $max = count($_session['list']); $_SESSION['list'][$max]['restid']=$rid; $_SESSION['list'][$max]['itemid']=$iid; $_SESSION['list'][$max]['qty']=$q; else { $_SESSION['list']=array(); $_SESSION['list'][0]['restid']=$rid; $_SESSION['list'][0]['itemid']=$iid; 36

$_SESSION['list'][0]['qty']=$q; function item_exists($iid){ $iid=intval($iid); $max=count($_session['list']); $flag=0; for($i=0;$i<$max;$i++){ if($iid==$_session['list'][$i]['itemid']){ $flag=1; break; return $flag; function restoran_isti($rid){ $rid=intval($rid); $max=count($_session['list']); $flag=0; for($i=0;$i<$max;$i++){ if($rid!= $_SESSION['list'][$i]['restid']){ $flag=1; break; return $flag; function getcijena($iid){ $sql="select Cijena FROM Meni WHERE ID='$iid'"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['cijena']; function getnazivjela($iid){ $sql="select j.naziv FROM Meni m, Jela j WHERE m.id = $iid AND m.jeloid = j.id"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['naziv']; function getnarudzbatotal($nid){ $sql="select SUM(s.kolicina*m.cijena) AS Suma FROM stavke_narudzbe AS s, meni AS m WHERE s.narudzbaid=$nid AND s.meniid=m.id"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['suma']; function getpdvnaziv($pdv) { $sql="select Naziv FROM Pdv WHERE ID='$pdv'"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['naziv']; 37

function getprovizijanaziv($provizija) { $sql="select Naziv FROM Provizija WHERE ID='$provizija'"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['naziv']; function getrestnaziv($restid) { $sql="select Naziv FROM Restorani WHERE ID=$restID"; $rs=izvrsibp($sql); $row=mysql_fetch_array($rs); return $row['naziv']; function mysql_fix_string($string){ if (get_magic_quotes_gpc()){ $string = stripslashes($string); $string = mysql_real_escape_string($string); return $string;?> MeĎu vaţnim datotekama valja istaknuti i datoteku narudzba.php koja je odgovorna za unos podataka o narudţbama u bazu podataka. U toj datoteci primijenjena jedna od najvaţnijih zanačajki InnoDB tablica, a to su transakcije. Transakcija je korištena kako bi se osiguralo da u bazi podataka ne postoji narudţba koja ili nema stavaka ili nema sve potrebne stavke upisane u pripadajuču tablicu Stavke_narudzbe. Datoteka narudzba.php definirana je na sljedeći način: <?php session_start(); if(!isset($_session['aktivni_korisnik'])) { header("location:login.php"); include ("header.php"); include ("funkcije.php"); include ("configbp.php"); otvoribp(); if (isset($_post['naruceno']) && isset($_session['list'])) { $restoran=$_post['restoran']; $korisnik=$_post['korisnik']; //ARRAY POST VARIABLES $jelo = $_POST['jelo']; $kolicina = $_POST['kolicina']; $cnt = count($jelo); for($i=0;$i<$cnt;$i++){ update_product($jelo[$i],$kolicina[$i]); 38

//PARSING CONFIG FILE $configfile = 'postavke.ini'; $ini_array = parse_ini_file($configfile); $pdv = $ini_array ['pdv']; $provizija = $ini_array ['provizija']; //STARTING TRANSACTION $sql="set AUTOCOMMIT=0"; $rs = izvrsibp($sql); $sql= "START TRANSACTION"; $rs = izvrsibp($sql); //FIRST STATEMENT $sql= "INSERT INTO Narudzbe (Datum, KorisnikID, RestoranID, PorezID, ProvizijaID) VALUES (now(), '$korisnik', '$restoran','$pdv','$provizija')"; $rs = izvrsibp($sql); $narudzba = mysql_insert_id(); $max = count($_session['list']); if ($max > 0) { for($i=0;$i<$max;$i++){ $jelo=$_session['list'][$i]['itemid']; $kolicina=$_session['list'][$i]['qty']; $sql= "INSERT INTO Stavke_narudzbe VALUES ('$narudzba', '$jelo', '$kolicina')"; $rs = izvrsibp($sql); $sql="commit"; $rs = izvrsibp($sql); $poruka="vaša narudžba uspješno je obavljena."; else { $sql="rollback"; $rs = izvrsibp($sql); unset($_session['list']); echo "<div class='success'>$poruka</div>"; Include ("footer.php");?> Snaga ove aplikacije leţi u njenoj prilagodljivosti novonastalim promjenama stope provizije, stope PDV-a i promjenama cijene jela. Za ove karakteristike odgovorna je dijelom baza podataka koja omogućava promjenu cijene i statusa artikla i pohranu trenutnih vrijednosti postavki aplikacije, a drugim dijelom datoteka postavke.php koja pohranjuje trenutne postavke PDV-a i provizije u konfiguracijsku datoteku. Datoteka postavke.php definirana je na sljedeći način: <?php session_start(); $_SESSION['back'] =htmlentities($_poslužitelj['request_uri']); if(!isset($_session['aktivni_korisnik']) ($_SESSION['aktivni_korisnik_tip']!=1)) { 39

header("location:login.php"); include('funkcije.php'); include('configbp.php'); otvoribp(); $configfile = 'postavke.ini'; $potvrda = ""; if (!isset($_post['postavi'])) { $ini_array = parse_ini_file($configfile); $pdv = $ini_array ['pdv']; $provizija = $ini_array ['provizija']; $pdvnaziv = getpdvnaziv($pdv); $provizijanaziv = getprovizijanaziv($provizija); if (isset($_post['postavi'])) { $pdv = $_POST['pdv']; $provizija = $_POST['provizija']; $pdvnaziv = getpdvnaziv($pdv); $provizijanaziv = getprovizijanaziv($provizija); $ini_array = array( 'pdv' => $pdv, 'provizija' => $provizija, ); // open and lock configuration file for writing $fp = fopen($configfile, 'w+') or die('error: Cannot open configuration file for writing'); flock($fp, LOCK_EX) or die('error: Cannot lock configuration file for writing'); // write each configuration value to the file foreach ($ini_array as $key => $value) { if (trim($value)!= '') { fwrite($fp, "$key=$value\n") or die('error: Cannot write [$key] to configuration file'); // close and save file flock($fp, LOCK_UN) or die ('ERROR: Cannot unlock file'); fclose($fp); $potvrda = "Postavke aplikacije uspješno su zapisane."; include ("header.php");?> <h3>postavke</h3> <form class="unos" method="post" action="postavke.php" name="setupform"> <label for="pdv">odaberi stopu PDV-a :</label> <select name="pdv"> <option value="">-----------------------------</option> <?php $sql = "SELECT ID, Naziv FROM Pdv"; $rs = izvrsibp($sql); 40

?> while(list($id, $naziv) = mysql_fetch_array($rs)) { echo "<option value='$id'"; if($id == $pdv) { echo "selected='selected'"; echo">$naziv</option>"; </select> <label for="provizija">odaberi postotak provizije:</label> <?php <select name="provizija"> <option value="">-----------------------------</option> $sql = "SELECT ID, Naziv FROM Provizija"; $rs = izvrsibp($sql); while(list($id, $naziv) = mysql_fetch_array($rs)) { echo "<option value='$id'"; if($id == $provizija) { echo "selected='selected'"; echo">$naziv</option>";?> </select> <input type="submit" class="submit" name="postavi" value="postavi" /> </form> <?php if ($potvrda!= "") { echo "<br/><div class='success'>$potvrda</div>"; include ('footer.php');?> Kao snagu aplikacije valja istaknuti i izvještaje koji administrratoru aplikacije daju uvid u ostvarenu proviziju, broj narudţbi, prosječnu narudţbu i sl. Izvještaje je moguće filtrirati, a za njihovu realizaciju odgovorna je datoteka izvjestaji.php koja izmeďu ostalih sadrţi sljedeće upite: // OSNOVNI UPIT ZA STAVKE $sql_list = "SELECT n.id, n.datum AS datum, k.korisnicko_ime AS korisnik, r.naziv AS restoran FROM narudzbe AS n, korisnici AS k, restorani AS r WHERE n.restoranid=r.id AND n.korisnikid=k.id"; // OSNOVNI UPIT ZA SUME $sql_sum = "SELECT SUM(s.kolicina*m.cijena) AS Suma, SUM(s.kolicina*m.cijena*pdv.koeficijent) AS Porez, SUM(s.kolicina*m.cijena*p.koeficijent) AS Provizija, AVG(s.kolicina*m.cijena) AS Prosjek FROM narudzbe AS n, stavke_narudzbe AS s, meni AS m, provizija AS p, Pdv WHERE n.id=s.narudzbaid AND s.meniid=m.id AND n.provizijaid=p.id AND n.porezid=pdv.id"; 41

// FILTER PO RESTORANU if (isset($_post['restoran']) &&!empty($_post['restoran'])) { $restoran = $_POST['restoran']; $sql_sum.= " AND n.restoranid =$restoran"; $sql_list.=" AND n.restoranid =$restoran"; // FILTER NARUDŽBA OD if (isset($_post['narudzba_od']) && strlen($_post['narudzba_od'] > 0) &&!empty($_post['narudzba_od'])) { date_default_timezone_set("europe/zagreb"); $narudzba_od = date ('Y-m-d', strtotime($_post['narudzba_od'])); $sql_sum.= " AND DATE(n.datum) >= '$narudzba_od'"; $sql_list.=" AND DATE(n.datum) >= '$narudzba_od'"; // FILTER NARUDŽBA DO if (isset($_post['narudzba_do']) && strlen($_post['narudzba_do'] > 0)) { date_default_timezone_set("europe/zagreb"); $narudzba_do = date ('Y-m-d', strtotime($_post['narudzba_do'])); $sql_sum.= " AND DATE(n.datum) <= '$narudzba_do'"; $sql_list.= " AND DATE(n.datum) <= '$narudzba_do'"; 42

4. Korisničke upute U ovom dijelu rada dane su upute korisnicima kako koristiti sustav, odnosno aplikaciju za online naručivanj klopa. Sve što korisnik mora imati od programske potpore za rad sa aplikacijom je internet preglednik i vezu na internet. 4.1. Početna stranica Aplikaciji se pristupa putem adrese http://localhost/klopa/ nakon čega se otvara početna stranica aplikacije prikazana na slici 4.1. Slika 4.1. Početna stranica aplikacije Na ovoj stranici moguće je filtrirati ponudu prema ţeljenoj lokaciji dostave. 4.2. Registracija u sustav Za naručivanje putem aplikacije neophodna je registracija i prijava u sustav. Registracija u sustav obavlja se putem obrazca prikazanog na slici 4.1. 43

Slika 4.2. Registracija u sustav Nakon uspješne registracije korisnika se automatski prijavljuje u sustav i preusmjerava na početnu stranicu. 4.3. Prijava u sustav Registrirani korisnici prijavljuju se u sustav putem obrazca prikazanog na slici 4.2. Slika 4.3. Prijava u sustav Nkon uspješne prijave korisniku se dodjeljuju prava za naručivanje i preusmjerava ga se na početnu stranicu ili na stranicu na kojoj je bio prije prijave u sustav. 44

4.4. Naručivanje Nakon što je filtrirao ponudu prema lokaciji dostave korisniku se nudi popis restorana iz kojih moţe naručivati. Nakon što je odabrao neki od mogućih restorana, klikom na znak plus moţe dodavati jela sa jelovnika na popis za narudţbu. Jelovnik Restorana1 sa opcijom dodavanja jela na popis prikazan je na slici 4.4. Slika 4.4. Dodavanje jela na popis za narudţbu Nakon što je dodao pojedino jelo korisnika se prusmjerava na popis za narudţbu, gdje mu se nude opcije odustajanja od narudţbe, promjene količine jela, uklanjanje jela sa popisa i nastavka narudţbe, odnosno dodavanje drugih jela na popis za narudţbu. Na slici 4.5. prikazan je popis za narudţbu sa pripadajučim opcijama za upravljanje popisom. 45

Slika 4.5. Upravljanje popisom za narudţbu 4.5. Promjena postavki aplikacije Administrator je korisnik u sustavu koji ima ovlasti za promjenu postavki aplikacije. Izgled obrazca za promjenu postavki aplikacije prikazan je na slici 4.6. Slika 4.6. Upravljanje postavkama aplikacije 46

4.6. Upravljanje jelovnikom Upravljanje jelovnikom takoďer je uloga administratora sustava. Pod upravljanje jelovnikom spada dodavanje jela na jelovnik, zatim promjena cijene jela i promjena statusa jela. Opcije administratora za upravljanje jelovnikom prikazane su na slici 4.7. Slika 4.7. Opcije adminstratora za upravljenje jelovnikom Sve promjene na jelovniku obavljaju se putem obrazca prikazanog na slici 4.8. Slika 4.8. Obrazac za upravljanje jelovnikom 47

4.7. Pregled izvještaja Pregled izvještaja takoďer je uloga administratora sustava. Administrator generira izvještaj putem obrazca prikazanog na slici 4.9. Slika 4.9. Generiranje izvještaja 48

5. Korisnička perspektiva apliacije Za rad sa aplikacijom napravljeno je korisničko sučelje sa namjerom da bude jednostavno za uptrebu i da omogući navigaciju u aplikaciji. Sučelje aplikacije je konzistentno tijekom upotrebe i sastoji se od zaglavlja, podnoţja, navigacijskog izbornika i dijela za prikaz sadrţaja. Elementi sučelja prikazani su na slikama iz prethodnog poglavlja. Pri korištenju aplikacije korisnika se čitavo vrijeme usmjerava i izvještava o posljedicama njegovog djelovanja. Korisnika je bitno obavijestiti o tim posljedicama jer u protivnome on pogaďa šta se dešava, a korisnik ćesto pogodi krivo. Primjer obavještavanja korisnika prikazan je slikom 5.1. u slučaju kada korisnik pokuša dodati jelo koje se već nalazi na popisu za narudţbu. Slika 5.1. Obavještavanje korisnika1 Na slici 5.1. takoďer se vidi opcija pregleda popisa klikom na ikonu košarice. Ova opcija generira se čim korisnik doda neku stavku na popis, a sluţi tome da korisnik u svakom trenutku, neovisno o tome na kojoj se stranici aplikacije nalazio ima mogučnost pregleda popisa i eventualnog nastavka narudţbe. Opcija nastavi narudţbu uvijek vodi na jelovnik onog restorana na koji se odnose stavke sa popisa, iz razloga što jedna narudţba moţe biti upućena samo 49

jednom restoranau, odnosno na jednom popisu mogu se nalaziti stavke jelovnika samo jednog restorana. U slučaju da korisnik pokuša dodati stavku sa jelovnika nekog drugog restorana biti će obaviješten porukom prikazanom na slici 5.2. Slika 5.2. Obavještavanje korisnika2 50