seminarski rad - tfzr.uns.ac.rs

91
Tehnički fakultet „Mihajlo Pupin“, Zrenjanin RAZVOJ SOFTVERA OTVORENOG KODA Školska 2020/2021. godina SEMINARSKI RAD 1. Uvod Izabrana tema, opis problema, sistema, firme, institucije, organizacije ili dela sistema za koji se razvija softver. 2. Specifikacija zahteva korisnika Spisak zahteva korisnika, tj. funkcijama softvera. 3. Faze razvoja softvera Spisak faza, aktivnosti, izvođača. Projektne ideje, koncept rešenja, arhitektura softvera: troslojna ili višeslojna arhitektura softvera, specifikacija ili modeli svakog sloja, konceptualni dizajn. Arhitektura softvera: troslojna ili višeslojna arhitektura softvera. Specifikacija ili modeli svakog sloja, konceptualni dizajn. 4. Prikaz softvera Opis stranica, pokretanje softvera, formi, izveštaja, delova sa ekranskim prikazima. 5. Prikaz realizacija i implementacije Prikaz karakterističnih elemenata realizacije i objašnjenja realizacije i programskog koda, oznaka, biblioteka klasa i ostalih elemenata softvera. Rad sa Git/Github sistemom. Opis testiranja softvera ili njegovih delova (klasa, metoda). 6. Korišteni alati i softveri Navesti spisak korištenih alata, softvera, programskih jezika, razvojnih okruženja i njihovih verzija. 7. Literatura Spisak knjiga (štampanih i e-izdanja), praktikuma, zbirki, biblioteka, radnih prostora, izvora sa Internet-a (sajtovi, linkovi, materijali, url adrese)

Upload: others

Post on 17-Oct-2021

4 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: SEMINARSKI RAD - tfzr.uns.ac.rs

Tehnički fakultet „Mihajlo Pupin“, Zrenjanin

RAZVOJ SOFTVERA OTVORENOG KODA

Školska 2020/2021. godina

SEMINARSKI RAD

1. Uvod

Izabrana tema, opis problema, sistema, firme, institucije, organizacije ili dela sistema za koji se razvija

softver.

2. Specifikacija zahteva korisnika

Spisak zahteva korisnika, tj. funkcijama softvera.

3. Faze razvoja softvera

Spisak faza, aktivnosti, izvođača. Projektne ideje, koncept rešenja, arhitektura softvera: troslojna ili

višeslojna arhitektura softvera, specifikacija ili modeli svakog sloja, konceptualni dizajn. Arhitektura

softvera: troslojna ili višeslojna arhitektura softvera. Specifikacija ili modeli svakog sloja, konceptualni

dizajn.

4. Prikaz softvera

Opis stranica, pokretanje softvera, formi, izveštaja, delova sa ekranskim prikazima.

5. Prikaz realizacija i implementacije

Prikaz karakterističnih elemenata realizacije i objašnjenja realizacije i programskog koda, oznaka,

biblioteka klasa i ostalih elemenata softvera.

Rad sa Git/Github sistemom.

Opis testiranja softvera ili njegovih delova (klasa, metoda).

6. Korišteni alati i softveri

Navesti spisak korištenih alata, softvera, programskih jezika, razvojnih okruženja i njihovih verzija.

7. Literatura

Spisak knjiga (štampanih i e-izdanja), praktikuma, zbirki, biblioteka, radnih prostora, izvora sa Internet-a

(sajtovi, linkovi, materijali, url adrese)

Page 2: SEMINARSKI RAD - tfzr.uns.ac.rs

1. UVOD

Seminarski rad iz predmeta Razvoj softvera otvorenog koda obuhvata izradu web aplikacije za igru na sreću LOTO

7/39 koju organizuje Državna lutrija Srbije počev od 1985. godine. Na sajtu državne lutrije

(https://www.lutrija.rs/LottoGame) se dva puta sedmično objavljuju kombinacije koje su izvučene, a na sajtu se

nalaze i dodatne informacije, druge igre i arhiva ranije itvučenih brojeva, grafički prikazi i sl.

Softver obuhvata: unos novih kombinacija, pretraga i pregled kombinacija, izmenu i brisanje kombinacija,

elementarnu statistiku, kao i generisanje slučajne kombinacije.

2. SPECIFIKACIJA ZAHTEVA KORISNIKA

Lista zahteva za funkcijama softvera

Title Code Priority Status

Evidentiranje izvučenih kombinacija ZAH_01 2 Defined

Snimanje statistike ZAH_02 2 Defined

Pregled i pretraga izvučenih kombinacija ZAH_03 3 Defined

Izmena kombinacije i njene statistike ZAH_04 3 Defined

Brisanje kombinacije i njene statistike ZAH_05 3 Defined

Prikaz statistike ZAH_06 3.5 Defined

Generisanje slučajne kombinacije ZAH_07 4 Defined

Provera da li je slučajna kombinacija već

bila ranije izvučena?

ZAH_08 4.5 Defined

Izveštaj za štampanje izvučenih brojeva i

statistike

ZAH_09 4 Defined

Registracija korisnika ZAH_10 1 Defined

Prijava korisnika ZAH_11 1.5 Defined

Grafički prikaz kombinacije? ZAH_12 5 To be

reviewed

Page 3: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 1. Evidentiranje izvučenih kombinacija

Title Evidentiranje izvučenih kombinacija

Code ZAH_01

Description Text Unos izvučene kombinacije (www.lutrija.rs/lottogame) i njeno snimanje u bazu podataka.

Unos 7 brojeva, koji treba da su sortirani od najmanjeg do najvećeg izvučenog broja.

Prilikom unosa kombinacije proveriti redosled, ne smeju se uneti dva ista broja u jednoj

kombinaciji, dozvoliti unos samo svih 7 sedam celih brojeva u rasponu od 1 do 39.

Zabraniti unos slova i specijalnih karaktera. Potrebno je uneti i datum izvlačenja, dobitak i

kolo. Automatski, na osnovu datuma izvlačenja, upisati i godinu u kojoj je izvučena.

Comment

Title ID Text 1.

Type Undefined

Priority 2

Status Defined

Verification Method Undefined

Zahtev 2. Snimanje statistike

Title Snimanje statistike

Code ZAH_02

Description Text Automatsko snimanje statističkih pokazatelja kombinacije prilikom unosa. Izračunati i

evidentirati koliko je od 7 brojeva bilo parnih i neparnih brojeva. Evidentirati broj

izvučenih brojeva po vertikalnim kolonama sa uplatnog tiketa (V1, V2, V3), kao i sledećim

grupama brojeva: 1-10 (H1), 11-20 (H2), 21-30 (H3) i 31-39 (H4).

Comment

Title ID Text 2.

Type Undefined

Priority 2

Status Defined

Verification Method Undefined

Page 4: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 3. Pregled i pretraga izvučenih kombinacija

Title Pregled i pretraga izvučenih kombinacija

Code ZAH_03

Description Text Tabelarni prikaz izvučenih brojeva.

Mora biti definisan kriterijum pretrage: podaci u tabeli sortiranu po datumu izvlačenja u

rastućem poretku (prvo po doni, pa po kolu unutar jedne godine)!

Složen kriterijum pretrage: Kolo (od - do), Godina (od - do).

Comment

Title ID Text 3.

Type Undefined

Priority 3

Status Defined

Verification Method Undefined

Zahtev 4. Izmena kombinacije i njene statistike

Title Izmena kombinacije i njene statistike

Code ZAH_04

Description Text Aktivira se nakon izvršene pretrage.

Prilikom izmene se prikazuju podaci koji se žele promeniti na stranici.

Omogućiti izmenu izmenu svih sedam brojeva, datuma izvlačenja (godine), broja kola,

kao i automatska izmena statistike za tu kombinaciju u bazi podataka.

Uključiti sve provere i validacije koje se vrše prilikom unosa nove kombinacije. Prikaz

poruke o uspešnom/neuspešnom brisanju podataka.

Comment

Title ID Text 4.

Type Undefined

Priority 3

Status Defined

Verification Method Undefined

Page 5: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 5. Brisanje kombinacije i njene statistike

Title Brisanje kombinacije i njene statistike

Code ZAH_05

Description Text Aktivira se nakon izvršene pretrage (tabelarni prikaz podataka).

Prilikom realizacije brisanja kombinacije obavezno uključiti potvrddu brisanja.

Automatski obrisati statistiku za tu kombinaciju u bazi podataka.

Prikaz poruke o uspešnom/neuspešnom brisanju podataka.

Comment

Title ID Text 5.

Type Undefined

Priority 3

Status Defined

Verification Method Undefined

Zahtev 6. Prikaz statistike

itle Prikaz statistike

Code ZAH_06

Description Text 1. Tabelarni prikaz svih 39 brojeva i izračunavanje/prebrojavanje koliko su puta bili

izvučeni (ukupno za sve godine ili u toku jedne godine). Sortirati po ukupnom broju

izlazaka u opadajućem redosledu! (povezati sa pretragom podataka)

2. Prikazati statistiku: par-nepar, H1-H4, V1-V3 (povezati sa pretragom podataka)

3. Prikazati sva kola odigrana u tekućoj godini.

Comment

Title ID Text 6.

Type Undefined

Priority 3.5

Status Defined

Verification Method Undefined

Page 6: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 7. Generisanje slučajne kombinacije

Title Generisanje slučajne kombinacije

Code ZAH_07

Description Text Metodom slučajnog izbora generisanje kombinacije od 7 brojeva, poređanih od

najmanjeg do najvećeg. Raspon brojeva: 1-39. Ne sme biti ponavljanja brojeva (ne mogu

se naći dva ista u kombinaciji).

Comment

Title ID Text 7.

Type Undefined

Priority 4

Status Defined

Verification Method Undefined

Zahtev 8. Provera da li je slučajna kombinacija već bila ranije izvučena

Title Provera da li je slučajna kombinacija već bila ranije izvučena?

Code ZAH_08

Description Text Nakon generisanja slučajne kombinacije 7 brojeva proveriti, u bazi podataka, da li je ta

kombinacija (cela, svih 7 brojeva) već bili ranije izvuičena.

Prikazati odgovarajuću poruku o rezultatu pretrage.

Comment

Title ID Text 8.

Type Undefined

Priority 4.5

Status Defined

Verification Method Undefined

Page 7: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 9. Izveštaj za štampanje izvučenih brojeva i statistike

Title Izveštaj za štampanje izvučenih brojeva i statistike

Code ZAH_09

Description Text Aktivira se nakon izvršene pretrage kombinacija po kolima i godinama.

Printer-friendly stranica (može se odštampati ili snimiti u nekom file formatu) koja

tabelarno prikazuje podatke na isti način kako je to prikazano u pretrazi i prikazu

statistike.

Comment

Title ID Text 9.

Type Undefined

Priority 4

Status Defined

Verification Method Undefined

Zahtev 10. Registracija korisnika

Title Registracija korisnika

Code ZAH_10

Description Text Unose se sledeći podaci:

Ime i prezime osobe koja se registruje, E-mail adresa,

Lozinka, Korisničko ime,

Sigurnosno pitanje i odgovor.

Comment

Title ID Text 10.

Type Undefined

Priority 1

Status Defined

Verification Method Undefined

Page 8: SEMINARSKI RAD - tfzr.uns.ac.rs

Zahtev 11. Prijava korisnika

Title Prijava korisnika

Code ZAH_11

Description Text Prijava korisnika se vrši preko unosa korisničkog imena i šifre.

Ukoliko su šifra i ime dobro uneti (postoje u bazi podataka) sledi prikaz osnovne stranice

aplikacije sa menijem.

Ukoliko ime/šifra nisu dobro uneti sledi prikaz poruke korisniku.

Comment

Title ID Text 11.

Type Undefined

Priority 1.5

Status Defined

Verification Method Undefined

Zahtev 12. Grafički prikaz kombinacije?

Title Grafički prikaz kombinacije?

Code ZAH_12

Description Text Prikaz (nakon pretrage brojeva) u formi sa uplatnog listića sa označenih 7 izvučenih

brojeva.

Napomena: Implementacija samo ukoliko ostane vremena.

Comment

Title ID Text 12.

Type Undefined

Priority 5

Status To be reviewed

Verification Method Undefined

Page 9: SEMINARSKI RAD - tfzr.uns.ac.rs

3. Faze razvoja softvera

a. Projektne ideje

• Osnovna funkcija softvera: Asistencija igračima Loto igre na sreću sa statistikom

• Funkcije softvera: Unos izvučenih kombinacija od 7 brojeva, izmena i brisanje kombinacija, automatsko

upisivanje statistike, pregled i pretraga kombinacija, generisanje slučajne kombinacija, prikaz statistike,

generisanje izveštaja, provera izlaznosti unete ili slučajne kombinacije, grafički prikaz

kombinacija(da/ne?), prijava i registracija korisnika.

• Korisnici softvera:

1. Administrator - pristup svim funkcijama softvera.

2. Registrovani korisnik (loto igrac) - izmena podataka korisnika, pregled i pretragu izvučenih

kombinacija, unos nove kombinacije, generisanje slučajne kombinacije.

3. Registrovani korisnik (loto igrac koji je pretplaćen na statistiku) - sve isto kao i običan loto igrač, plus

pregled statistike, proveru da li je kombinacija izvučena, generisanje izveštaja, grafički prikaz

kombinacije.

4. Neregistrovani korisnik - pristup samo registraciji korisnika

• Vrsta (tip) softvera: web aplikacija.

• Softverska arhitektura: troslojna arhitektura softvera

o Sloj podatka: Relaciona baza podataka, MySQL (dizajn: CASE alat).

o Srednji aplikacioni sloj (backend): logika aplikacije, klase za povezivanje sa slojem podataka i KI

(UI) PHP programski jezik, alat: Visual Studio Code.

o Prezentacioni sloj (KI, UI, frontend): HTML, CSS, JS, PHP, Bootstrap radni okvir (framework), alat:

Visual Studio Code, softver za obradu slika (Gimp, Paint).

• Server: Apache web server, MySQL server baze podataka (XAMP paket servera).

• OS: MS Windows 10.

• Dokumentovanje: MS Word.

• Testiranje: Metoda crne kutije, funkcionalno testiranje, studija slučaja, unit testing i sl.

• CVS sistem: GitHub.

Page 10: SEMINARSKI RAD - tfzr.uns.ac.rs

b. Dizajn softvera i arhitekture

Faze razvoja softvera:

Sloj baze podataka: Konceptualni model baze podataka (BP, DB)

EER dijagram - Konceptualni model baze podataka (Conceptual data model, EER/PMOV):

Ima

(D)

Evidentirao

Kombinacija

ID kombinacije

Broj1

Broj2

Broj3

Broj4

Broj5

Broj6

Broj7

Datum izvlacenja

Kolo

Godina

Dobitak

<pi> Serial

BROJEVI

BROJEVI

BROJEVI

BROJEVI

BROJEVI

BROJEVI

BROJEVI

Date

Byte

Integer

Money

<M>

<M>

<M>

<M>

<M>

<M>

<M>

<M>

<M>

<M>

IDKombinacija <pi>

Statistika

Par

Nepar

V1

V2

V3

H1

H2

H3

H4

Byte

Byte

Byte

Byte

Byte

Byte

Byte

Byte

Byte

<M>

<M>

<M>

<M>

<M>

<M>

<M>

<M>

<M>

Korisnik

ID korisnika

Ime

Prezime

Email

Korisnicko ime

Lozinka

Sigurnosno pitanje

Odgovor

Profil korisnika

<pi> Serial

Variable characters (30)

Variable characters (30)

Variable characters (40)

Variable characters (20)

Variable characters (20)

Variable characters (50)

Variable characters (25)

Characters (5)

<M>

<M>

<M>

<M>

<M>

<M>

<M>

IDkorisnika <pi>

Page 11: SEMINARSKI RAD - tfzr.uns.ac.rs

Fizički model baze podataka (Physical data model, RDM/RM):

Ima

Evidentirao

Kombinacija

ID kombinacije

ID korisnika

Broj1

Broj2

Broj3

Broj4

Broj5

Broj6

Broj7

Datum izvlacenja

Kolo

Godina

Dobitak

int

int

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

date

tinyint

int

float(8,2)

<pk>

<fk>

Statistika

ID kombinacije

Par

Nepar

V1

V2

V3

H1

H2

H3

H4

int

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

tinyint

<pk,fk>

Korisnik

ID korisnika

Ime

Prezime

Email

Korisnicko ime

Lozinka

Sigurnosno pitanje

Odgovor

Profil korisnika

int

varchar(30)

varchar(30)

varchar(40)

varchar(20)

varchar(20)

varchar(50)

varchar(25)

char(5)

<pk>

Srednji aplikacioni sloj – objektno orjentisani model (Class diagram):

1..1

0..1

1..1

0..*

0..1

0..*

0..1

0..*

0..1

0..*

Kombinacija

+

+

+

+

+

+

+

+

+

+

+

+

ID kombinacije

Broj1

Broj2

Broj3

Broj4

Broj5

Broj6

Broj7

Datum izvlacenja

Kolo

Godina

Dobitak

: long

: byte

: byte

: byte

: byte

: byte

: byte

: byte

: DateTime

: byte

: int

: float(8,2)

+

+

+

+

+

+

+

+

+

+

<<Constructor>>

<<Destructor>>

PrikazSvih ()

Unos ()

Pretraga (byte pKoloOd, byte pKoloDo, int pGodOd, int pGodDo)

Izmena (long pIDKomb)

GenerisanjeSlucajne ()

ProveraDaliJeIzvucena (byte pKolo, int pGodina)

ProveraDaLiSuBrUnetiOk (byte pBr1, byte pBr2, byte pBr3, byte pBr4, byte pBr5, byte pBr6, byte pBr7)

Obrisi (long pIDKomb)

Kombinacija ()

~Kombinacija ()

: object

: bool

: object

: bool

: object

: bool

: bool

: bool

Statistika

+

+

+

+

+

+

+

+

+

Par

Nepar

V1

V2

V3

H1

H2

H3

H4

: byte

: byte

: byte

: byte

: byte

: byte

: byte

: byte

: byte

+

+

+

+

+

<<Constructor>>

<<Destructor>>

SnimiStatistiku (byte pBr1, byte pBr2, byte pBr3, byte pBr4, byte pBr5, byte pBr6, byte pBr7, long pIDKomb)

Statistika ()

~Statistika ()

PrikazStatistike ()

IzmenaStatistike (long pIDKomb)

: bool

: object

: bool

Korisnik

+

+

+

+

+

+

+

+

+

ID korisnika

Ime

Prezime

Email

Korisnicko ime

Lozinka

Sigurnosno pitanje

Odgovor

Profil korisnika

: long

: string

: string

: string

: string

: string

: string

: string

: string

+

+

+

+

+

+

+

+

<<Constructor>>

<<Destructor>>

Registracija ()

Prijava ()

Odjava ()

Izmena (long pIDKorisnika)

ZaboravljenaLozinka ()

UcitajSvePodatkeKorisnika (long pIDKorisnika)

Korisnik ()

~Korisnik ()

: bool

: bool

: bool

: bool

: bool

: object

KonekcijaDB

-

-

-

-

+

Server

UserName

UserPassword

DBName

Konekcija

: string

: string

: string

: string

: object

+

+

OtvoriKonekciju ()

ZatvoriKonekciju (object pKonekcija)

: bool

: bool

Page 12: SEMINARSKI RAD - tfzr.uns.ac.rs

Dizajn sloja korisničkog interfejsa (frontend-a)

Dijagram slučajeva korišćenja – Prijava i registracija korisnika

<<include>>

<<include>>

<<include>>

<<use>>

<<extend>>

Registracija korisnika

Prijava

Zaboravljena lozinka?

Igrac

Igrac pretplatnik

Admin

Neregistrovani

Provera naloga

Unos podataka Snimanje korisnika u BP

Registrovani korisnik

Page 13: SEMINARSKI RAD - tfzr.uns.ac.rs

Dijagram slučajeva korišćenja – Softverske funkcije

<<include>>

<<extend>><<extend>>

<<extend>>

<<extend>>

<<extend>>

<<use>><<extend>>

<<extend>>

<<extend>>

<<extend>>

Admin : 1

Igrac : 1

Igrac pretplatnik : 1

Evidentiranje nove kombinacije

Izmena kombinacije

Generisanje slučajne kombinacije

Brisanje kombinacije

Pregled kombinacija : 1

Prikaz statistike

Izveštaj sa statistikom

Provera da li je uneta komb. izvučena

Grafički prikaz komb.?

Izračunavanje i snimanje statistike u BP

Prikaz kombinacija

KorisniciOdjava

Izmena

Brisanje

Info/autoriIgrac : 2

Igrac pretplatnik : 2

Pregled kombinacija : 2

Admin : 2

Pretraga kombinacija

Page 14: SEMINARSKI RAD - tfzr.uns.ac.rs

Koncept izgleda osnovnog ekrana softvera:

Page 15: SEMINARSKI RAD - tfzr.uns.ac.rs

4. Prikaz softvera

Pokretanje aplikacije:

Nakon instaliranja XAMP softverskog paketa, aplikacija se kopira u folder C:\Xamp\htdocs\Loto2021

U PHPMyAdmin softveru se kreira baza podataka sa nazivom: loto2021 Zatim se izvrši SQL DDL skript za kreiranje objekata baze podataka. Pokretanje iz web browser-a, u URL polje potrebno je upisati: http://localhost/loto2021 ili http://localhost/loto2021/index.php ili http://localhost:88/loto2021/index.php ili http://localhost:96/loto2021/index.php

Početna stranica aplikacije sadrži samo taster za pokretanje prijave i osnovne informacije o programu:

Page 16: SEMINARSKI RAD - tfzr.uns.ac.rs

Stranica za registraciju novog korisnika – potrebno je uneti podatke o korisniku: prezime, ime korisnika, šifru i korisničko ime, kao i email adresu:

Stranica za prijavu korisnika - unos šifre i korisničkog imena, sa opcijom za slanje zaboravljene šifre na email adresu koja se upisuje od strane korisnika uz sigurnosno pitanje i odgovor:

Page 17: SEMINARSKI RAD - tfzr.uns.ac.rs

Osnovni meni aplikacije – kreiran je na osnovu dijagrama slučajeva korišćenja i specifikacije funkcionalnosti softvera sa tri profila korisnika: registrovani igrač, pretplaćeni igrač i administrator:

Stranica za unos novih kombinacija i brojeva - vrši se preko stranice sa formom za unos sedam brojeva u rasponu od 1 do 39, kola i datuma izvlačenja, sa eventualnom nagradom. Dostupna je svim profilima korisnika. Na kraju unosa se dobija informacija o uspešnom ili neuspešnom unosu/snimanju kombinacije u bazu podataka. Jedna kombinacija sa istim brojem kola I godinom se ne može dva puta upisati u bazu.

Page 18: SEMINARSKI RAD - tfzr.uns.ac.rs

Stranica za pretragu izlaznosti kombinacija - poseduje polja za unos godine i kola za kriterijum pretrage, a

nakon izbora tastera “Pronađi”, u tabelarnu formu prikaza se učitavaju podaci za sve pronađene kombinacije iz

baze podataka po datom kriterijumu sortirani po godini, pa po kolu u rastućem poretku. Na ovoj stranici se nalazi

i opcija za novu pretragu I kreiranje izveštaja za pronađene kombinacije.

Izmena podataka – pokreće se iz tabelarnog prikaza, pritiskom na taster “Izmena”, aktivira se stranica sa

prikazanim podacima na formi, gde se mogu raditi izmene. Završetak je pomoću tastera “Promeni”. Sledi potvrda

uspešnosti izmene kombincije u bazi podataka.

Page 19: SEMINARSKI RAD - tfzr.uns.ac.rs

Brisanje podataka – pokreće se iz tabelarnog prikaza nakon izvršene pretrage, pritiskom na taster “Brisanje”.

Nakon uspešnog brisanja kombinacije i statistike u bazi se prikazuje i odgovarajuća poruka:

Grafički prikaz loto tiketa – pokreće se iz tabelarnog prikaza nakon izvršene pretrage, pritiskom na taster

“Grafika”. Učitava se nova stranica, na kojoj se prikazuje listić sa brojevima. Moguće je upisati novu kombinaciju I

proveriti kako ista izgleda na tiketu.

Page 20: SEMINARSKI RAD - tfzr.uns.ac.rs

Stranica za generisanje slučajne kombinacije – prikazuje formu sa sedam brojeva koji su generisani metodom

slučajnog izbora od 1 do 39, sortirani od najmanjeg do najvećeg:

Provera izlaznosti slučajne kombinacije – aktivira se sa prethodne stranice za generisanje slučajne kombinacije.

Vrši se pretraga baze podataka i prikazuje se poruka o tome da li je tražena kombinacija pronađena u bazi (bila

već izvučena neke godine u nekom kolu) ili nije.

Page 21: SEMINARSKI RAD - tfzr.uns.ac.rs

Provera izlaznosti kombinacije – unosi se sedam brojeva od 1 do 39 preko forme za unos u rubrike. Vrši se

pretraga baze podataka i prikazuje se poruka o tome da li je tražena kombinacija pronađena u bazi (bila već

izvučena neke godine u nekom kolu) ili nije.

Stranica za statistiku – prebrojava za svih 39 brojeva koliko puta su bili izvučeni u svim kolima koja su

upisana u bazu i u tabelarnom prikazu se može videti rezultat. Nije dostupno igračima koji nisu

pretplaćeni.

Page 22: SEMINARSKI RAD - tfzr.uns.ac.rs

Izveštaj – na prinetr-friendly stranici se, u tabelarnoj formi, prikazuju sledeći podaci: godina, kolo,

sedam brojeva, broj parnih i neparnih brojeva, kao i statistički pokazatelji kombinacija: vertikale i

horizontale. Izveštaji nisu dostupni igračima koji nisu pretplaćeni.

Prikaz izeštaja u pregledu pre štampe koji se dobija sa prethodne stranice kada se izabere opcija Print:

Page 23: SEMINARSKI RAD - tfzr.uns.ac.rs

Izmena podataka prijavljenog korisnika – dostupna je svakom profilu korisnika nakon uspešne prijave. Izmena se vrši na stranici sa formom koja prikazuje podatke tekućeg korisnika. Završetak izmene je pomoću tastera “Snimi”. Sledi potvrda uspešnosti izmene.

Administracija korisnika – dostupna je samo administratoru. Izlistavaju se svi korisnici. Moguće je obrisati korisnika ili promeniti status igračima i pretplaćenim igračima.

Page 24: SEMINARSKI RAD - tfzr.uns.ac.rs

5. Prikaz realizacija i implementacije

Kreiranje baze podataka, izvršavanjem SQL DDL skripta, u okviru PHPMyAdmin web aplikacije. Naziv baze

podataka je: loto2021.

SQL DDL skript za kreiranje baze podataka:

/*==============================================================*/ /* DBMS name: MySQL 5.0 */ /* Created on: 11/03/2021 11:08:24 */ /*==============================================================*/ drop index KOMBINACIJA_IX on Kombinacija; drop index KOMBINACIJA_AK on Kombinacija; drop table if exists Kombinacija; drop index KORISNIK_IX on Korisnik; drop index KORISNIKEMAIL_AK on Korisnik; drop index KORISNIKIME_AK on Korisnik; drop table if exists Korisnik; drop table if exists Statistika; /*==============================================================*/ /* Table: Kombinacija */ /*==============================================================*/ create table Kombinacija ( ID_KOMBINACIJE int not null auto_increment, ID_KORISNIKA int not null, BROJ1 tinyint not null, BROJ2 tinyint not null, BROJ3 tinyint not null, BROJ4 tinyint not null, BROJ5 tinyint not null, BROJ6 tinyint not null, BROJ7 tinyint not null, DATUM_IZVLACENJA date, KOLO tinyint not null, GODINA int not null, DOBITAK float(8,2), primary key (ID_KOMBINACIJE) );

Page 25: SEMINARSKI RAD - tfzr.uns.ac.rs

/*==============================================================*/ /* Index: KOMBINACIJA_AK */ /*==============================================================*/ create unique index KOMBINACIJA_AK on Kombinacija ( KOLO, GODINA ); /*==============================================================*/ /* Index: KOMBINACIJA_IX */ /*==============================================================*/ create index KOMBINACIJA_IX on Kombinacija ( KOLO, GODINA ); /*==============================================================*/ /* Table: Korisnik */ /*==============================================================*/ create table Korisnik ( ID_KORISNIKA int not null auto_increment, IME varchar(30) not null, PREZIME varchar(30) not null, EMAIL varchar(40) not null, KORISNICKO_IME varchar(20) not null, LOZINKA varchar(20) not null, SIGURNOSNO_PITANJE varchar(50), ODGOVOR varchar(25), PROFIL_KORISNIKA char(5) not null default 'igrac', primary key (ID_KORISNIKA) ); /*==============================================================*/ /* Index: KORISNIKIME_AK */ /*==============================================================*/ create unique index KORISNIKIME_AK on Korisnik ( KORISNICKO_IME ); /*==============================================================*/ /* Index: KORISNIKEMAIL_AK */ /*==============================================================*/ create unique index KORISNIKEMAIL_AK on Korisnik ( EMAIL );

Page 26: SEMINARSKI RAD - tfzr.uns.ac.rs

/*==============================================================*/ /* Index: KORISNIK_IX */ /*==============================================================*/ create index KORISNIK_IX on Korisnik ( PREZIME ); /*==============================================================*/ /* Table: Statistika */ /*==============================================================*/ create table Statistika ( ID_KOMBINACIJE int not null, PAR tinyint not null, NEPAR tinyint not null, V1 tinyint not null, V2 tinyint not null, V3 tinyint not null, H1 tinyint not null, H2 tinyint not null, H3 tinyint not null, H4 tinyint not null, primary key (ID_KOMBINACIJE) ); alter table Kombinacija add constraint FK_EVIDENTIRAO foreign key (ID_KORISNIKA) references Korisnik (ID_KORISNIKA) on delete restrict on update cascade; alter table Statistika add constraint FK_IMA foreign key (ID_KOMBINACIJE) references Kombinacija (ID_KOMBINACIJE) on delete restrict on update cascade; Prikaz kreirane relacione baze podataka u PHPMyAdmin softveru za administraciju MySQL baze podataka:

Page 27: SEMINARSKI RAD - tfzr.uns.ac.rs

Grafički prikaz šeme baza podataka:

PRIKAZ IMPLEMENTACIJE I REALIZACIJE SOFTVERA, IZVORNOG KODA

Početna stranica index.php se sastoji od html oznaka u koje je umetnuta php naredba za uključivanje datoteka sa

sadržajem zaglavlja strane (header), menija u gornjem i donjem delu stranice, kao i html oznaka za donji deo

stranice (footer). Ova stranica poseduje odeljke, korsiti stil iz css datoteke. Sadržaj je formiran Bootstrap radnim

okvirom, korišćenjem klasa za odeljke u centralnom delu stranice.

<!DOCTYPE HTML>

<html>

<!-- Head -->

<?php include "head.html";?>

<!-- Body - sredina stranice -->

<body>

<div class="fh5co-loader"></div>

<!-- Meni -->

<?php include "meniprijava.html";?>

<!-- Centralni sredine stranice -->

<div id="fh5co-course-categories">

<div class="container">

<div class="row animate-box">

<div class="col-md-6 col-md-offset-3 text-center fh5co-heading">

<h2>Loto 2021</h2>

<p>Web aplikacija za loto igrače sa statistikom</p>

</div>

</div>

</div>

</div>

<!-- Footer stranice -->

Page 28: SEMINARSKI RAD - tfzr.uns.ac.rs

<footer id="fh5co-footer" role="contentinfo" style="background-

image: url(images/img_bg_4.jpg);">

<div class="overlay"></div>

<!-- Meni dole -->

<?php include "menidoleprijava.html";?>

</div>

<!-- Footer kraj-->

<?php include "footer.html";?>

</body>

</html>

Registracija novog korisnika – na stranici se nalazi HTML forma za unos podataka o korisniku: prezime, ime korisnika, šifra i korisničko ime, email adresa. Polja za unos su Bootstrap Input box/field tipa Text sa ograničenjima u pogledu obaveznih rubrika i dužine unosa. POST metodom forma prosleđuje unete podatke stranici za snimanje podataka o korisnicima u bazu.

<!-- Forma sa poljima za prijavu -->

<h3 align="center">Registracija korisnika</h3>

<form action="registracijasnimi.php" method="POST">

<table align="center">

<tr style="float:left; clear:left; margin-

top:10px;"><td>Prezime*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="prezime" onKeyPress="if(this.value.length==30) ret

urn false;" size=30 required tabindex=1></td>

</tr>

<tr style="float:left; clear:left; margin-

top:10px;"><td>Ime*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="ime" onKeyPress="if(this.value.length==30) return

false;" size=30 required tabindex=2></td>

</tr>

<tr style="float:left; clear:left; margin-

top:10px;"><td>Korisničko ime*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="korisnik" onKeyPress="if(this.value.length==20) re

turn false;" size=30 required tabindex=3></td>

</tr>

<tr style="float:left; clear:left; margin-

top:10px;"><td>Šifra*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="password" name="password1" onKeyPress="if(this.value.length==2

0) return false;" size=30 required tabindex=4></td>

</tr>

Page 29: SEMINARSKI RAD - tfzr.uns.ac.rs

<tr style="float:left; clear:left; margin-

top:10px;"><td>Šifra ponovo*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="password" name="password2" onKeyPress="if(this.value.length==2

0) return false;" size=30 required tabindex=5></td>

</tr>

<tr style="float:left; clear:left; margin-top:10px;"><td>E-

mail*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="email" name="email" onKeyPress="if(this.value.length==40) retur

n false;" size=30 required tabindex=6></td>

</tr>

<tr style="float:left; clear:left; margin-top:10px;">

<td></td>

<td><div style="margin-left: 5pt;">

<input type="submit" align="center" class="btn btn-

default" name="snimi" value="Registruj novog korisnika" tabindex=8>

</div></td>

</tr>

</table>

</form>

Snimanje podataka prilikom registracije novog korisnika – preuzimaju se vrednosti promenljivih iz POST objekta koji su uneti preko forme za unos podataka o korisniku. Vrši se provera da li je identična šifra upisana dva puta i ako jeste kreira se objekat tipa klase Korisnik, dodeljuju se vrednosti atributima objekta, poziva se metoda za registraciju korisnika, pri čemu se proverava da li korisnik sa tim imenom ili email adresom već postoji u bazi podataka. Ova metoda, u slučaju da korisnik ne postoji, SQL DML upitom snima podatke u bazu. Na kraju se, u zavisnosti od vrednosti result-seta koji je rezultat izvršavanje funkcije za registraciju, prikazuje odgovarajuća poruka korisniku.

<h3 align="center">Registracija korisnika</h3>

<!--

Preuzimanje vrednosti promenljivih preko POST metode iz forme za registraciju korisnik

a -->

<?php

$Prezime=$_POST['prezime'];

$Ime=$_POST['ime'];

$Korisnik=$_POST['korisnik'];

$Password1=$_POST['password1'];

$Password2=$_POST['password2'];

$Email=$_POST['email'];

/*provera unete šifre 2x ista*/

if ($Password1!=$Password2)

{

echo '<b><br/>';

Page 30: SEMINARSKI RAD - tfzr.uns.ac.rs

echo "Upozorenje: Niste dobro uneli šifru korisnika!";

echo '</b><br/><br/>';

echo "Korigujte unos šifre na prethodnoj stranici ili odustanite od

registracije! ";

echo '<br/>';

}

else //šifra je dobro uneta

{

/*kreiranje objekta korisnik*/

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$objKorisnik->Ime=$Ime;

$objKorisnik->Prezime=$Prezime;

$objKorisnik->Email=$Email;

$objKorisnik->KorisnickoIme=$Korisnik;

$objKorisnik->Lozinka=$Password1;

$objKorisnik->ProfilKorisnika="igrac";

$objKorisnik->SigurnosnoPitanje="";

$objKorisnik->Odgovor="";

/*registracija sa proverom da li korisnik vec postoji u bazi*/

$postoji=false;

$postoji = $objKorisnik->Registracija();

if (!$postoji) //takav korisnik postoji i ne moze se registrovati

{

echo '<b><br/><br/>';

echo "Upozorenje: Korisnik sa tim korisničkim imenom i/ili

e-mail adresom već postoji u bazi podataka!";

echo '</b><br/><br/>';

echo "Ispravite podatke unete na prethodnoj stranici ili od

ustanite od registracije! ";

echo '<br/>';

}

else /*korisnik ne postoji i uspešno je registrovan*/

{

echo '<br/><br/><b>';

echo "Korisnik je uspešno registrovan u bazi podataka! Može

te se prijaviti...";

echo '</b><br/>';

}

} //provera šifre

?>

Page 31: SEMINARSKI RAD - tfzr.uns.ac.rs

Prijava korisnika – stranica sadrži, pored već pomenutih odeljaka na početnoj stranici i formu za unos korisničkog

imena i šifre, preko polja za unos podataka (Input type tipa Text i Password). POST metodom se uneti podaci

prosleđuju stranici za proveru imena i šifre. Sa ove stranice je moguće otvoriti i stranicu za slanje zaboravljene

lozinke.

<!-- Forma sa poljima za prijavu -->

<form action="provera.php" method="POST">

<table align="center">

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center">Korisničko ime:</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="username" onKeyPress="if(this.value.length==20) ret

urn false;" size=20 required autofocus tabindex=1></td>

</tr>

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center">Šifra korisnika:</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="password" name="password" onKeyPress="if(this.value.length==20)

return false;" size=20 required tabindex=2></td>

</tr>

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center"><a href="zaboravljenalozinka.php" tabindex=3>Zaboravljena

šifra korisnika?</a></td>

</tr>

<tr style="float:left; clear:left; margin-top:10px;">

<td></td>

<td><div style="margin-left: 25pt;">

<input type="submit" align="center" class="btn btn-

default" name="prijava" value="Prijavi se" tabindex=8>

</div></td>

</tr>

</table>

</form>

Provera šifre i korisničkog imena – Stranica bez korisničkog interefejsa. Preuzimaju se vrednosti za šifru i ime iz POST objekta/niza, kreira se objekat tipa klase Korisnik, dodeljuju se vrednosti atributima objekta, poziva se metoda za prijavu korisnika, pri čemu se proverava da li korisnik sa tim imenom i šifrom postoje u bazi podataka (SQL Select upitom). U slučaju da korisnik postoji kreira se sesija za korisnika sa nekoliko promenljivih. Na kraju se, u zavisnosti od vrednosti result-seta koji je rezultat izvršavanje funkcije za prijavu, prikazuje odgovarajuća poruka korisniku i vrši preusmeravanje na stranicu za prijavu index.php, ukoliko šiffra i/ili ime nisu pronađeni. U slučaju uspešne prijave učitava se početna stranica sa menijem pocetna.php.

<?php

//otvaranje, tj. kreiranje sesije

session_start();

//preuzimanje kor. imena i sifre sa prethodne stranicd

Page 32: SEMINARSKI RAD - tfzr.uns.ac.rs

$loginusername=$_POST["username"];

$loginpassword=$_POST["password"];

/*pocetne vrednosti promenljivih*/

$logsucc=0; //korisnik nije prijavljen

$prijavljen = ""; //result-set

/*kreiranje objekta korisnik*/

include_once 'class/Korisnik.php'; //refernca na klasu

$objKorisnik = new Korisnik(); //instanciranje objekta

/*dodela vrednosti atributima objekta korisnik*/

$objKorisnik->KorisnickoIme=$loginusername;

$objKorisnik->Lozinka=$loginpassword;

/*provera da li su sifra i korisnik dobro uneti metodom prijava*/

$prijavljen = $objKorisnik->Prijava(); //ucitani podaci korisnika u result-set

if ($prijavljen)

{

$brojredova = 0;

$brojredova = mysqli_num_rows($prijavljen);

if ($brojredova>0) //pronadjen korisnik sa tim imenom i sifrom

{

$red=0;

$logsucc=1;

while($red = mysqli_fetch_array($prijavljen)) //odsecanje prvog reda 2d

im. niza sa vrednostima iz baze

{

$username=$loginusername;

$userid=$red['ID_KORISNIKA'];

$name=$red['IME'];

$surname=$red['PREZIME'];

$profile=$red['PROFIL_KORISNIKA'];

$_SESSION["username"] = $username; //dodela vrednosti promenlji

vama u sesiji

$_SESSION["userid"] = $userid;

$_SESSION["name"] = $name;

$_SESSION["surname"] = $surname;

$_SESSION["profile"] = $profile;

}

}

if ($logsucc==1) //uspesna prijava korisnika

{

header('Location:pocetna.php'); //preusmeravanje aplikacija na neku st

ranicu

}

else //neuspesna prijave

{

session_destroy(); //unistavanje sesije

session_unset(); //brisanje dela memorije - vrednosti promenljivih

header('Location:index.php');

}

Page 33: SEMINARSKI RAD - tfzr.uns.ac.rs

}

?>

Početna stranica nakon prijave – proverava se status otvorene sesije za korisnika preko niza promenljivih. Ukoliko je status/profil korisnika bez vrednosti, pokušan je pristup stranici bez prijave, pa se tok aplikacije preusmerava na početnu stranu index.php. U slučaju da promenljive sesije imaju vrednosti, učitava se početna strana za korisnika sa odgovarajućim menijem (glavnim i pomoćnim u dnu svake stranice).

<?php

session_start();

$username=$_SESSION["username"];

$userid=$_SESSION["userid"];

$name=$_SESSION["name"];

$surname=$_SESSION["surname"];

$profile=$_SESSION["profile"];

if ($profile=="") //provera vrednosti promenlčjive profil igraca iz otvorene sesije

{

session_destroy();

session_unset();

header('Location:index.php'); //sprecavanje direktnog pristupa stranici neregistrov

anom korisniku ili neprijavljenom korisniku

}

?>

<!DOCTYPE HTML>

<html>

<!-- Head -->

<?php include "head.html";?>

<!-- Body - sredina stranice -->

<body>

<div class="fh5co-loader"></div>

<!-- Prikaz i ukljucivanje menija prema profilima korisnika -->

<?php

if ($profile=="igrac")

{

include "menigoreigrac.php";

}

if ($profile=="admin")

{

include "menigoreadmin.php";

}

if ($profile=="pretp")

{

include "menigorepretplatnik.php";

}

?>

<!-- Centralni sredine stranice -->

<div id="fh5co-course-categories">

Page 34: SEMINARSKI RAD - tfzr.uns.ac.rs

<div class="container">

<div class="row animate-box">

<div class="col-md-6 col-md-offset-3 text-center fh5co-heading">

<h2>Loto 2021</h2>

<p>Web aplikacija za loto igrače sa statistikom</p>

</div>

</div>

</div>

</div>

<!-- Footer stranice -->

<footer id="fh5co-footer" role="contentinfo" style="background-

image: url(images/img_bg_4.jpg);">

<div class="overlay"></div>

<!-- Meni dole -->

<?php

if ($profile=="igrac")

{

include "menidoleigrac.php";

}

if ($profile=="admin")

{

include "menidoleadmin.php";

}

if ($profile=="pretp")

{

include "menidolepretplatnik.php";

}

?>

</div>

<!-- Footer kraj-->

<?php include "footer.html";?>

</body>

</html>

Meni aplikacije je urađen pomoću HTML oznaka i Bootstrap klasa kao neuređena lista preko: <ul> i </ul>, kao i elementima liste koji predstavljaju stavke menija pomoću oznaka <li> i </li>. Svaka stavka meniaj je preko hiperlinka, tj. oznake <a href="imestrane.php"> povezana sa odgovarajućom web stranicom koja se učitava kada korisnik izabere stavku menija.

<div id="page">

<nav class="fh5co-nav" role="navigation">

<div class="top">

<div class="container">

<div class="row">

<div class="col-xs-12 text-right">

<p class="site">www.tfzr.uns.ac.rs/rsok/loto</p>

Page 35: SEMINARSKI RAD - tfzr.uns.ac.rs

<p class="num">Korisnik: <?php echo $name.' '.$surname.' Status

: '.$profile;?></p>

<ul class="fh5co-social">

<li><a href="#"><i class="icon-facebook2"></i></a></li>

<li><a href="#"><i class="icon-twitter2"></i></a></li>

<li><a href="#"><i class="icon-dribbble2"></i></a></li>

<li><a href="#"><i class="icon-github"></i></a></li>

</ul>

</div>

</div>

</div>

</div>

<div class="top-menu">

<div class="container">

<div class="row">

<div class="col-xs-2">

<div id="fh5co-logo"><a class="navbar-

brand" href="pocetna.php"><img src="./images/loto.png" alt="LOTO"></a></div>

</div>

<div class="col-xs-10 text-right menu-1">

<ul>

<li class="active"><a href="pocetna.php">Početna</a></li>

<li><a href="unos.php">Unos kombinacije</a></li>

<li><a href="pretraga.php">Pretraga</a></li>

<li><a href="slucajna.php">Slučajna kombinacija</a></li>

<li><a href="statistika.php">Statistika</a></li>

<li><a href="izlaznost.php">Izlaznost</a></li>

<li><a href="korisnici.php">Korisnik</a></li>

<li><a href="administracija.php">Administracija</a></li>

<li class="btn-

cta"><a href="odjava.php"><span>Odjava</span></a></li>

</ul>

</div>

</div>

</div>

</div>

</nav>

Dodatni stil stranice stil.css za definisanje karakteritika pozadine svih web stranica osim izveštaja:

body {

/* Slika */

background-image: url("lotopozadina.png");

/* Minimalna širina pozadinske slike */

min-height: 500px;

/* Skrolovanje(scroll,fixed) */

Page 36: SEMINARSKI RAD - tfzr.uns.ac.rs

background-attachment: fixed;

/* Centriranje pozadinske slike */

background-position: center;

/* Neponavljanje pozadinske slike */

background-repeat: no-repeat;

/* Skaliranje na najveću moguću veličinu */

background-size: cover;

}

Forma za unos brojeva unos.php – realizovana je preko FORM HTML odeljka u okviru kojeg se nalaze polja za unos podataka pomoću <input type> oznaka za brojeve (Number tipa), kolo (Number tipa), dobitak(Text tipa), datum izvlačenja (Date tipa). U Action atributu forme je navedeno ime PHP stranice na kojoj će se izvršiti snimanje podataka u bazu. Metod prenosa podataka je POST.

<h2>Unos nove kombinacije</h2>

<!-- Forma sa dve kolone za unos brojeva, kola, datuma i dobitka -->

<form class="form-

horizontal" role="form" method='POST' action='snimi.php'>

<div class="form-group row">

<div class="col-sm-6">

<label for="datumizvlacenja">Datum izvlačenja*</label>

<input type="date" class="form-

control" id="datumizvlacenja" name="datumizvlacenja" autofocus required tabindex=1>

</div>

<div class="col-sm-6">

<label for="Kolo">Kolo*</label>

<input type="number" class="form-

control" id="Kolo" name="Kolo" required placeholder="Upišite broj kola" min=1 max=106 o

nKeyPress="if(this.value.length==3) return false;" oninput="this.value = this.value.rep

lace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=2>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj1">Prvi broj*</label>

<input type="number" class="form-

control" id="Broj1" name="Broj1" required placeholder="Unesite 1. broj" min=1 max=39 on

KeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.repl

ace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=3>

</div>

<div class="col-sm-6">

<label for="Broj2">Drugi broj*</label>

<input type="number" class="form-

control" id="Broj2" name="Broj2" required placeholder="Unesite 2. broj" min="1" max="39

Page 37: SEMINARSKI RAD - tfzr.uns.ac.rs

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=4>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj3">Treći broj*</label>

<input type="number" class="form-

control" id="Broj3" name="Broj3" required placeholder="Unesite 3. broj" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=5>

</div>

<div class="col-sm-6">

<label for="Broj4">Četvrti broj*</label>

<input type="number" class="form-

control" id="Broj4" name="Broj4" required placeholder="Unesite 4. broj" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=6>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj5">Peti broj*</label>

<input type="number" class="form-

control" id="Broj5" name="Broj5" required placeholder="Unesite 5. broj" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=7>

</div>

<div class="col-sm-6">

<label for="Broj6">Šesti broj*</label>

<input type="number" class="form-

control" id="Broj6" name="Broj6" required placeholder="Unesite 6. broj" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=8>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj7">Sedmi broj*</label>

<input type="number" class="form-

control" id="Broj7" name="Broj7" required placeholder="Unesite 7. broj" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=9>

</div>

<div class="col-sm-6">

<label for="Dobitak">Dobitak</label>

Page 38: SEMINARSKI RAD - tfzr.uns.ac.rs

<input type="text" class="form-

control" id="Dobitak" name="Dobitak" placeholder="Unesite vrednost dobitka" tabindex=10

>

</div>

</div>

<div class="form-group row">

<div class="col-sm-offset-2 col-sm-8">

<input type="submit" class="btn btn-

default" name="snimi" value="Snimi" tabindex=11>

<button type="reset" class="btn btn-

default" name="ponisti" tabindex=12>Poništi</button></div>

</div>

</form>

Snimanje podataka u bazu – realizovano je na stranici snimi.php na kojoj se prvo preuzimaju vrednosti promenljivih iz POST niza, na osnovu datuma izvlačenja se funkcijama strtotime i date dolazi do vrednosti godine. Zatim se kreira se objekat tipa klase Kombinacija, poziva se metoda za proveru da li je kombinacija dobro uneta. U slučaju da jeste dobro uneta sledi poziv metode za proveru da li je kombinacija već bila izvučena. U slučaju da nije dodeljuju se vrednosti atributima objekta, poziva se metoda za unos kombinacije u bazu (SLQ DML Insert komandom). U zavisnosti od uspešnosti izvršavanja metoda, prikazuju se različite poruka korisniku pomoću PHP echo naredbe.

<h2>Unos nove kombinacije</h2>

<!-- Preuzimanje vrednosti promenljivih preko POST metode -->

<?php

$dobrouneta=false;

$datum=$_POST['datumizvlacenja'];

//izdvajanje godine iz datuma izvlacenja

//koji je upisan na prethodnoj stranici za unos

$ddatum=strtotime($datum);

$godina=date("Y", $ddatum);

$kolo=$_POST['Kolo'];

$broj1=$_POST['Broj1'];

$broj2=$_POST['Broj2'];

$broj3=$_POST['Broj3'];

$broj4=$_POST['Broj4'];

$broj5=$_POST['Broj5'];

$broj6=$_POST['Broj6'];

$broj7=$_POST['Broj7'];

$dobitak=$_POST['Dobitak'];

$korisnik="1"; //id korisnika uzeti iz promenljive koja je definisana u

sesiji

/*kreiranje objekta kombinacija*/

include_once 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

/*provera da li su brojevi dobro uneti*/

Page 39: SEMINARSKI RAD - tfzr.uns.ac.rs

$dobrouneta=false;

$dobrouneta = $objKombinacija-

>ProveraDaLiSuBrUnetiOk($broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

if ($dobrouneta)

{

echo "Kombinacija je dobro uneta.";

/*provera da li vec postoji to kolo i godina*/

$provera = "";

$provera = $objKombinacija->ProveraDaliJeIzvucena($kolo, $godina);

if (!$provera)

{

echo '<b><br/><br/>';

echo "Greška: Kombinacija sa unetom godinom i brojem kola već p

ostoji u bazi podataka. ";

echo '</b><br/><br/>';

echo "Proverite unete podatke na prethodnoj stranici ili odusta

nite od unosa! ";

echo '<br/>';

}

if ($provera)

{

/*dodela vrednosti atributima objekta kombinacija*/

$objKombinacija->Godina = $godina;

$objKombinacija->korisnik = $korisnik;

$objKombinacija->Kolo = $kolo;

$objKombinacija->Broj1 = $broj1;

$objKombinacija->Broj2 = $broj2;

$objKombinacija->Broj3 = $broj3;

$objKombinacija->Broj4 = $broj4;

$objKombinacija->Broj5 = $broj5;

$objKombinacija->Broj6 = $broj6;

$objKombinacija->Broj7 = $broj7;

$objKombinacija->Dobitak = $dobitak;

$objKombinacija->DatumIzvlacenja = $datum;

$result="";

$snimljenastatistika="";

/*snimanje podataka u bazu metodom snimiKombinaciju u okviru objekt

a kombinacija*/

$result = $objKombinacija->Unos();

//unset($objKombinacija);

/*snimanje statistickih parametara bez kreiranja objekta statistika

*/

//kreiranje objekta tipa klase statistika

include_once "class/Statistika.php";

$objStatistika = new Statistika();

$snimljenastatistika = $objStatistika-

>SnimiStatistiku($broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

//$snimljenastatistika=true;

Page 40: SEMINARSKI RAD - tfzr.uns.ac.rs

if ($result && $snimljenastatistika)

{

echo '<br/><br/><b>';

echo "Kombinacija sa statističkim parametrima je uspešno sačuva

na u bazi podataka!";

echo '</b><br/>';

}

else

{

echo '<br/><br/><b>';

echo "Kombinacija nije snimljena u bazu podataka!";

}

}

}

else /*$dobrouneta*/

{

echo '<b>';

echo "Greška: Kombinacija nije dobro uneta. ";

echo '</b><br/><br/>';

echo "Svaki naredni broj mora biti veći od prethodnog! ";

echo '<br/>';

echo "Svi brojevi moraju biti u opsegu od 1 do 39! ";

echo '<br/><br/>';

echo "Proverite unete podatke na prethodnoj strani...";

echo '<br/>';

} /*$dobrouneta*/

$objStatistika=null;?>

Stranica za proveru izlaznosti kombinacija - na ovoj stranici se prvo preuzimaju vrednosti promenljivih iz POST niza za sedam upisanih brojeva na stranicama za unos kombinacije ili generisanje slučajne. Zatim se kreira se objekat tipa klase Kombinacija, poziva se metoda za proveru da li je kombinacija dobro uneta. U slučaju da jeste dobro uneta sledi poziv metode za proveru da li je kombinacija već bila izvučena. U zavisnosti od uspešnosti izvršavanja metoda, prikazuju se različite poruke korisniku.

<h3>PROVERA: DA LI JE KOMBINACIJA VEĆ IZLAZILA (IZVUČENI BROJEVI)?</h5>

<?php

//ucitavanje vrednosti iz promenljivih

//u POST nizu/objektu u promenljive deklarisane na web stranici

$broj1=$_POST['Broj1'];

$broj2=$_POST['Broj2'];

$broj3=$_POST['Broj3'];

$broj4=$_POST['Broj4'];

$broj5=$_POST['Broj5'];

$broj6=$_POST['Broj6'];

$broj7=$_POST['Broj7'];

/*kreiranje objekta tipa klase clskombinacija*/

require 'class/Kombinacija.php';

Page 41: SEMINARSKI RAD - tfzr.uns.ac.rs

$objKombinacija = new Kombinacija();

/*provera da li su brojevi dobro uneti*/

$dobrouneta=false;

$dobrouneta = $objKombinacija-

>ProveraDaLiSuBrUnetiOk($broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

if ($dobrouneta)

{

echo "Kombinacija je dobro uneta.";

/*provera da li vec postoji to kolo i godina*/

$postojivec = "";

$postojivec = $objKombinacija-

>ProveraDaliSuBrIzvuceni($broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

if ($postojivec)

{

/*prikaz poruke da kombinacija (7 brojeva) već postoji u bazi podatak

a*/

echo '<b><br/><br/>';

echo "Rezultat pretrage baze podataka: Kombinacija (";

echo $broj1.", ".$broj2.", ".$broj3.", ".$broj4.", ".$broj5.", ".$bro

j6.", ".$broj7;

echo ") je pronađena u bazi podataka. JESTE IZVUČENA!";

echo '</b><br/>';

}

else /*od postoji vec*/

{

/*prikaz poruke da kombinacija (7 brojeva) ne postoji u bazi podataka

*/

echo '<b><br/><br/>';

echo "Rezultat pretrage baze podataka: Kombinacija (";

echo $broj1.", ".$broj2.", ".$broj3.", ".$broj4.", ".$broj5.", ".$bro

j6.", ".$broj7;

echo ") nije pronađena u bazi podataka. NIJE IZVUČENA!";

echo '</b><br/>';

} /*od postoji vec*/

}

else /*dobrouneta*/

{

echo '<b>';

echo "Greška: Kombinacija nije dobro uneta. ";

echo '</b><br/><br/>';

echo "Svaki naredni broj mora biti veći od prethodnog! ";

echo '<br/>';

echo "Svi brojevi moraju biti u opsegu od 1 do 39! ";

echo '<br/><br/>';

echo "Proverite unete podatke na prethodnoj strani...";

echo '<br/>';

} /*dobrouneta*/

// $objKombinacija=null;

Page 42: SEMINARSKI RAD - tfzr.uns.ac.rs

?>

Forma za generisanje slučajne kombinacije - realizovana je preko forme u okviru kojeg se nalaze polja za unos podataka pomoću <input type> oznaka. Na stranici se prvo kreira se objekat tipa klase Kombinacija, poziva se metoda za generisanje slučajne kombinacija. Metoda vraća niz brojeva koj ije dobijen PHP funkcijama rand i sort. Svakom polju za unos broja se dodeljuje vrednost preko Value atributa I tako se prikazuje generisani broj. U Action atributu forme je navedeno ime PHP stranice na kojoj će se izvršitiprovera izlaznosti kombinacije, tj. tih sedam brojeva. Metod prenosa podataka je POST.

<h2>Generisanje slučajne kombinacije</h2>

<!-- Forma sa dve kolone -->

<?php

/*kreiranje objekta tipa klase clskombinacija*/

require 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

/*generisanje slučajne kombinacije kao niza od 7 brojeva i

sortiranje elemenata u rastućem poretku*/

$slucajnakomb = $objKombinacija->GenerisanjeSlucajne();

?>

<form class="form-

horizontal" role="form" method='POST' action='izlaznostprovera.php'>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj1">Prvi broj*</label>

<input type="text" class="form-

control" id="Broj1" name="Broj1" value="<?php echo $slucajnakomb[0];?>" tabindex=3>

</div>

<div class="col-sm-6">

<label for="Broj2">Drugi broj*</label>

<input type="text" class="form-

control" id="Broj2" name="Broj2" value="<?php echo $slucajnakomb[1];?>" tabindex=4>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj3">Treći broj*</label>

<input type="text" class="form-

control" id="Broj3" name="Broj3" value="<?php echo $slucajnakomb[2];?>" tabindex=5>

</div>

<div class="col-sm-6">

<label for="Broj4">Četvrti broj*</label>

<input type="text" class="form-

control" id="Broj4" name="Broj4" value="<?php echo $slucajnakomb[3];?>" tabindex=6>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj5">Peti broj*</label>

Page 43: SEMINARSKI RAD - tfzr.uns.ac.rs

<input type="text" class="form-

control" id="Broj5" name="Broj5" value="<?php echo $slucajnakomb[4];?>" tabindex=7>

</div>

<div class="col-sm-6">

<label for="Broj6">Šesti broj*</label>

<input type="text" class="form-

control" id="Broj6" name="Broj6" value="<?php echo $slucajnakomb[5];?>" tabindex=8>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj7">Sedmi broj*</label>

<input type="text" class="form-

control" id="Broj7" name="Broj7" value="<?php echo $slucajnakomb[6];?>" tabindex=9>

</div>

<div class="col-sm-6">

</div>

</div>

<div class="form-group row">

<div class="col-sm-offset-2 col-sm-8">

<input type="submit" class="btn btn-

default" name="izlaznost" value="Proveri izlaznost" tabindex=10>

</div>

</form>

Forma za pregled i pretragu kombinacija - Za pretragu kombinacija se koristi html forma sa poljima tipa input type text za kriterijum pretrage (Kolo od i do, Godina od i do izlaska kombinacije memorisane u bazi podataka). Korišten je POST metod sa akcijom tipa self post, što znači da stranica ne predaje podatke iz forme drugoj, već istoj stranici, te se ista PHP stranica se ponovo učitava i kreira. Promenljive u tom slučaju prihvataju vrednosti iz POST objekta, kreira se objekat tipa klase Kombinacija i poziva metoda za pretragu izvučenih kombinacija koja kao ulazne parametre sadrži vrednosti promenljivih. Metoda vraća result-set, koji ukoliko nije prazan prikazuje se u formi html tabele odgovarajuće Bootstrap klase. Formira se tabela koja prikazuje učitane podatke o kombinacijama iz baze podataka. U tabeli se nalaze i forme, sa promenljivama i tasterima za pokretanje brisanja, izmene i grafičkog prikaza kombinacije.

<h2>Pregled i pretraga kombinacija</h2>

<?php

//prvobitno ucitavanje i kreiranje stranice

$Godinaod="";

$Godinado="";

$Kolood="";

$Kolodo="";

?>

<?php

if(isset($_POST['pronadji']))

{

//ako je pritisnuta pretraga, tj. taster Pronađi

$Godinaod=$_POST['Godinaod'];

Page 44: SEMINARSKI RAD - tfzr.uns.ac.rs

$Godinado=$_POST['Godinado'];

$Kolood=$_POST['Kolood'];

$Kolodo=$_POST['Kolodo'];

}

?>

<!-- Forma sa unos kriterijuma za pretragu -->

<form class="form-horizontal" role="form" method='POST' action=''>

<div class="form-group row">

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Godinaod">Godina: OD</label>

<input type="number" class="form-

control" id="Godinaod" name="Godinaod" value="<?php echo $Godinaod; ?>" onKeyPress="if(

this.value.length==4) return false;" autofocus tabindex=1>

</div>

<div class="col-sm-6">

<label for="Godinado">DO</label>

<input type="number" class="form-

control" id="Godinado" name="Godinado" value="<?php echo $Godinado; ?>" onKeyPress="if(

this.value.length==4) return false;" tabindex=2>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Kolood">Redni broj kola: OD</label>

<input type="number" class="form-

control" id="Kolood" name="Kolood" value="<?php echo $Kolood; ?>" onKeyPress="if(this.v

alue.length==3) return false;" tabindex=3>

</div>

<div class="col-sm-6">

<label for="Kolodo">DO</label>

<input type="number" class="form-

control" id="Kolodo" name="Kolodo" value="<?php echo $Kolodo; ?>"onKeyPress="if(this.va

lue.length==3) return false;" tabindex=4>

</div>

</div>

<div class="form-group row">

<div class="col-sm-offset-2 col-sm-8">

<button type="submit" class="btn btn-

default" name="pronadji" tabindex=5>Pronađi</button>

<button type="reset" class="btn btn-

default" name="ponisti" tabindex=6>Nova pretraga</button>

</div>

</div>

</form>

<!-- Pronalaženje kombinacija za kriterijum pretrage -->

Page 45: SEMINARSKI RAD - tfzr.uns.ac.rs

<?php

if(isset($_POST['pronadji']))

{

//ako je pritisnuta pretraga, tj. taster Pronađi

$Godinaod=$_POST['Godinaod'];

$Godinado=$_POST['Godinado'];

$Kolood=$_POST['Kolood'];

$Kolodo=$_POST['Kolodo'];

/*kreiranje objekta tipa klase clskombinacija*/

require 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

/*pretraga kombinacija*/

$pronadjena="";

$brojredova=0;

$pronadjena=$objKombinacija-

>pretraga($Kolood,$Kolodo,$Godinaod,$Godinado);

if ($pronadjena)

{

$brojredova=mysqli_num_rows($pronadjena);

}

if ($brojredova>0)

{

echo "Pronađeno kombinacija: ".$brojredova;

echo "<table class='table table-striped'>

<thead>

<tr>

<th scope='col'>Godina</th>

<th scope='col'>Kolo</th>

<th scope='col'>1.</th>

<th scope='col'>2.</th>

<th scope='col'>3.</th>

<th scope='col'>4.</th>

<th scope='col'>5.</th>

<th scope='col'>6.</th>

<th scope='col'>7.</th>

<th scope='col'>Akcija</th>

<th scope='col'>Akcija</th>

<th scope='col'>Akcija</th>

</tr>

</thead>";

while($red = mysqli_fetch_array($pronadjena))

{

echo "

<tr>

Page 46: SEMINARSKI RAD - tfzr.uns.ac.rs

<td>".$red['GODINA']."</td>

<td>".$red['KOLO']."</td>

<td>".$red['BROJ1']."</td>

<td>".$red['BROJ2']."</td>

<td>".$red['BROJ3']."</td>

<td>".$red['BROJ4']."</td>

<td>".$red['BROJ5']."</td>

<td>".$red['BROJ6']."</td>

<td>".$red['BROJ7']."</td>";

$id=$red['ID_KOMBINACIJE']; //primarni ključ

$broj1=$red['BROJ1'];

$broj2=$red['BROJ2'];

$broj3=$red['BROJ3'];

$broj4=$red['BROJ4'];

$broj5=$red['BROJ5'];

$broj6=$red['BROJ6'];

$broj7=$red['BROJ7'];

echo "<td> <form action='izmena.php' method='POST'>";

echo "<input type='hidden' name='id' value='$id'>";

echo "<input type='submit' name='izmena' value='Izmena'>";

echo "</form> </td>";

echo "<td> <form action='brisanje.php' method='POST'>";

echo "<input type='hidden' name='id' value='$id'>";

echo "<input type='submit' name='brisanje' value='Brisanje'

>";

echo "</form> </td>";

echo "<td> <form action='grafika.php' method='GET'>";

//echo "<input type='hidden' name='id' value='$id'>";

echo "<input type='hidden' name='br1' value='$broj1'>";

echo "<input type='hidden' name='br2' value='$broj2'>";

echo "<input type='hidden' name='br3' value='$broj3'>";

echo "<input type='hidden' name='br4' value='$broj4'>";

echo "<input type='hidden' name='br5' value='$broj5'>";

echo "<input type='hidden' name='br6' value='$broj6'>";

echo "<input type='hidden' name='br7' value='$broj7'>";

//proslediti ne rb/id komb, već svih sedam brojeva

echo "<input type='submit' name='grafika' value='Grafika'>"

;

echo "</form> </td> </tr>";

}

echo "</tbody>

</table>";

if(isset($_POST['pronadji']))

{

//ako je pritisnuta pretraga, tj. taster za stampanje

echo "<form action='izvestajpretraga.php' method='POST'>

<div class='form-group row'>

Page 47: SEMINARSKI RAD - tfzr.uns.ac.rs

<div class='col-sm-offset-2 col-sm-8'>

<input type='hidden' name='Godinaod' value='";

echo $Godinaod;

echo "'>

<input type='hidden' name='Godinado' value='";

echo $Godinado;

echo "'>

<input type='hidden' name='Kolood' value='";

echo $Kolood;

echo "'>

<input type='hidden' name='Kolodo' value='";

echo $Kolodo;

echo "'>

<button type='submit' class='btn btn-

default'>Generiši izveštaj za štampanje</button>

</div>

</div>

</form></br>";

}

}

}

?>

Stranica sa formom za izmenu kombinacija je povezana sa stranicom za pretragu podataka, na kojoj se pritiska taster za izmenu u redu tabele gde se želi izvršiti izmena. Pored tastera je forma sa tasterom i promenljivama koje se prenose sledećoj stranici sa formom za izmenu. Iz POST niza se uzima vrednost ID kombinacije, kreira se objekat tipa klase Kombinacija, poziva se metoda za učitavanje kombinacije za izmenu, PHP funkcijom masqli_fetch_array se formira niz iz kog se dodeljuju vrednosti promenljivama, koje se upisuju u Value atribut polja za unos vrednosti. Ova stranica, Post metodom predaje podatke sledećoj stranici na kojoj se realizuje snimanje promena u bazi podataka.

<h2>Izmena kombinacije</h2>

<!-- kreirati objekat tipa klase kombinacija -->

<!-- izvršiti metodu za učitavanje kombinacije -->

<!-- preuzeti vrednosti iz promenljivih - result set-a -->

<?php

$id=$_POST['id'];

include_once 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

$ucitana="";

$ucitana = $objKombinacija->UcitajKombinaciju($id);

$red="";

while($red = mysqli_fetch_array($ucitana))

{

$godina=$red['GODINA'];

Page 48: SEMINARSKI RAD - tfzr.uns.ac.rs

$kolo=$red['KOLO'];

$broj1=$red['BROJ1'];

$broj2=$red['BROJ2'];

$broj3=$red['BROJ3'];

$broj4=$red['BROJ4'];

$broj5=$red['BROJ5'];

$broj6=$red['BROJ6'];

$broj7=$red['BROJ7'];

$datum=$red['DATUM_IZVLACENJA'];

$dobitak=$red['DOBITAK'];

$korisnik=1;

}

?>

<!--

Forma sa dve kolone za prikaz i izmenu brojeva, kola, datuma i dobitka -->

<form class="form-

horizontal" role="form" method='POST' action='snimiizmene.php'>

<div class="form-group row">

<div class="col-sm-6">

<label for="datumizvlacenja">Datum izvlačenja*</label>

<input type="date" class="form-

control" id="datumizvlacenja" name="datumizvlacenja" autofocus value="<?php echo $datum

; ?>"required tabindex=1>

</div>

<div class="col-sm-6">

<label for="Kolo">Kolo*</label>

<input type="number" class="form-

control" id="Kolo" name="Kolo" required value="<?php echo $kolo; ?>" min=1 max=106 onKe

yPress="if(this.value.length==3) return false;" oninput="this.value = this.value.replac

e(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=2>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj1">Prvi broj*</label>

<input type="number" class="form-

control" id="Broj1" name="Broj1" required value="<?php echo $broj1; ?>" min=1 max=39 on

KeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.repl

ace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=3>

</div>

<div class="col-sm-6">

<label for="Broj2">Drugi broj*</label>

<input type="number" class="form-

control" id="Broj2" name="Broj2" required value="<?php echo $broj2; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=4>

</div>

</div>

Page 49: SEMINARSKI RAD - tfzr.uns.ac.rs

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj3">Treći broj*</label>

<input type="number" class="form-

control" id="Broj3" name="Broj3" required value="<?php echo $broj3; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=5>

</div>

<div class="col-sm-6">

<label for="Broj4">Četvrti broj*</label>

<input type="number" class="form-

control" id="Broj4" name="Broj4" required value="<?php echo $broj4; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=6>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj5">Peti broj*</label>

<input type="number" class="form-

control" id="Broj5" name="Broj5" required value="<?php echo $broj5; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=7>

</div>

<div class="col-sm-6">

<label for="Broj6">Šesti broj*</label>

<input type="number" class="form-

control" id="Broj6" name="Broj6" required value="<?php echo $broj6; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=8>

</div>

</div>

<div class="form-group row">

<div class="col-sm-6">

<label for="Broj7">Sedmi broj*</label>

<input type="number" class="form-

control" id="Broj7" name="Broj7" required value="<?php echo $broj7; ?>" min="1" max="39

" onKeyPress="if(this.value.length==2) return false;" oninput="this.value = this.value.

replace(/[^0-9.]/g, '').replace(/(\..*)\./g, '$1');" tabindex=9>

</div>

<div class="col-sm-6">

<label for="Dobitak">Dobitak</label>

<input type="text" class="form-

control" id="Dobitak" name="Dobitak" value="<?php echo $dobitak; ?>" tabindex=10>

<input type="hidden" name="id" value="<?php echo $id; ?>">

</div>

</div>

<div class="form-group row">

Page 50: SEMINARSKI RAD - tfzr.uns.ac.rs

<div class="col-sm-offset-2 col-sm-8">

<input type="submit" class="btn btn-

default" name="snimi" value="Promeni" tabindex=11>

<button type="reset" class="btn btn-

default" name="ponisti" tabindex=12>Poništi</button></div>

</div>

</form>

Snimanje izmena – preuzimaju vrednosti promenljivih iz POST niza sa prethodno opisane stranice za izmenu kombinacije, na osnovu datuma izvlačenja se funkcijama strtotime i date dolazi do vrednosti godine. Zatim se kreira se objekat tipa klase Kombinacija, poziva se metoda za proveru da li je kombinacija dobro uneta. U slučaju da jeste dobro uneta sledi poziv metode za proveru da li je kombinacija već bila izvučena. U slučaju da nije dodeljuju se vrednosti atributima objekta, poziva se metoda za izmenu kombinacije u bazi (SLQ DML Update komandom koja se izvršava mysqli_query funkcijom). U zavisnosti od uspešnosti izvršavanja metoda, prikazuju se različite poruka korisniku pomoću PHP echo naredbe.

<?php

session_start();

$username=$_SESSION["username"];

$userid=$_SESSION["userid"];

$name=$_SESSION["name"];

$surname=$_SESSION["surname"];

$profile=$_SESSION["profile"];

if ($profile==""){session_destroy();

session_unset();

header('Location:index.php');}

?>

<!DOCTYPE HTML>

<html>

<!-- Head -->

<?php include "head.html";?>

<body>

<div class="fh5co-loader"></div>

<!-- Meni -->

<?php include "meni.html";?>

<!-- Sredina stranice -->

<div id="fh5co-course-categories">

<div class="container">

<div class="row animate-box">

<div class="col-md-6 col-md-offset-3 text-center fh5co-heading">

<h2>Izmena kombinacije</h2>

<!-- Preuzimanje vrednosti promenljivih preko POST metode -->

<?php

$dobrouneta=false;

$datum=$_POST['datumizvlacenja'];

$ddatum=strtotime($datum);

Page 51: SEMINARSKI RAD - tfzr.uns.ac.rs

$godina=date("Y", $ddatum);

$kolo=$_POST['Kolo'];

$broj1=$_POST['Broj1'];

$broj2=$_POST['Broj2'];

$broj3=$_POST['Broj3'];

$broj4=$_POST['Broj4'];

$broj5=$_POST['Broj5'];

$broj6=$_POST['Broj6'];

$broj7=$_POST['Broj7'];

$dobitak=$_POST['Dobitak'];

$idkombinacije=$_POST['id'];

$korisnik="1";

/*kreiranje objekta kombinacija*/

include_once 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

/*provera da li su brojevi dobro uneti*/

$dobrouneta=false;

$dobrouneta = $objKombinacija-

>ProveraDaLiSuBrUnetiOk($broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

if ($dobrouneta)

{

echo "Kombinacija je dobro uneta.";

/*provera da li vec postoji to kolo i godina*/

$provera = "";

$provera = $objKombinacija->ProveraDaliJeIzvucena($kolo, $godina);

if (!$provera)

{

echo '<b><br/><br/>';

echo "Greška: Kombinacija sa unetom godinom i brojem kola već p

ostoji u bazi podataka. ";

echo '</b><br/><br/>';

echo "Proverite unete podatke na prethodnoj stranici ili odusta

nite od unosa! ";

echo '<br/>';

}

if ($provera)

{

/*dodela vrednosti atributima objekta kombinacija*/

$objKombinacija->Godina = $godina;

$objKombinacija->korisnik = $korisnik;

$objKombinacija->Kolo = $kolo;

$objKombinacija->Broj1 = $broj1;

$objKombinacija->Broj2 = $broj2;

$objKombinacija->Broj3 = $broj3;

$objKombinacija->Broj4 = $broj4;

$objKombinacija->Broj5 = $broj5;

$objKombinacija->Broj6 = $broj6;

Page 52: SEMINARSKI RAD - tfzr.uns.ac.rs

$objKombinacija->Broj7 = $broj7;

$objKombinacija->Dobitak = $dobitak;

$objKombinacija->DatumIzvlacenja = $datum;

$result="";

//echo $idkombinacije;

/*snimanje izmenjenih podataka metodom Izmena u objektu kombina

cija*/

$result = $objKombinacija->Izmena($idkombinacije);

//kreiranje objekta tipa klase statistika

include_once "class/Statistika.php";

$objStatistika = new Statistika();

//izvrsavanje metode za izmenu statistike

$snimljenastatistika="";

//$snimljenastatistika=true;

$snimljenastatistika = $objStatistika-

>IzmenaStatistike($idkombinacije,$broj1,$broj2,$broj3,$broj4,$broj5,$broj6,$broj7);

if ($result && $snimljenastatistika)

{

echo '<br/><br/><b>';

echo "Kombinacija sa statističkim parametrima je uspešn

o promenjena i sačuvana u bazi podataka!";

echo '</b><br/>';

}

else

{

echo '<br/><br/><b>';

echo "Kombinacija nije snimljena! Izmene nisu sačuvane.

Proverite podatke unete na prethodnoj stranici...";

}

}

}

else /*$dobrouneta*/

{

echo '<b>';

echo "Greška: Kombinacija nije dobro uneta. ";

echo '</b><br/><br/>';

echo "Svaki naredni broj mora biti veći od prethodnog! ";

echo '<br/>';

echo "Svi brojevi moraju biti u opsegu od 1 do 39! ";

echo '<br/><br/>';

echo "Proverite podatke unete na prethodnoj strani...";

echo '<br/>';

} /*$dobrouneta*/

//unset($objKombinacija);

//$objStatistika=null;?>

</br><br/>

<a href="pretraga.php"><button type="button">Povratak na pretragu</butt

on></a>

Page 53: SEMINARSKI RAD - tfzr.uns.ac.rs

</div>

</br>

</div>

</div>

</div>

</div>

Stranica za brisanje kombinacije iz baze podataka je povezana sa stranicom za pretragu kombinacija, na kojoj se pritiska taster za brisanje u redu tabele gde se želi obrisati podatak. Pored tastera je forma sa promenljivama koje se prenose sledećoj stranici za brisanje POST metodom. Iz POST niza se uzimaju vrednosti za brisanje, dodeljuju se odgovarajućim promenljivama. Kreira se objekat tipa klase Kombinacija, poziva se metoda za brisanje kombinacije preko ID kombinacije (SLQ DML Delete komandom koja se izvršava mysqli_query funkcijom). U zavisnosti od toga da li je rezult-set izvršenog upita prazan ili ne, prikazuje se odgovarajuća poruka korisniku.

<h2>Brisanje kombinacije</h2>

<!-- Preuzimanje vrednosti promenljivih preko POST metode -->

<?php

$idkomb=$_POST['id'];

/*kreiranje objekta kombinacija*/

include_once 'class/Kombinacija.php';

$objKombinacija = new Kombinacija();

$obrisana="";

/*poziv metode za brisanje kombinacije*/

$obrisana = $objKombinacija->Obrisi($idkomb);

if ($obrisana)

{

echo '<br/><b>';

echo "Kombinacija je uspešno obrisana iz baze podataka!";

echo '</b><br/>';

}

else

{

echo '<br/><b>';

echo "Kombinacija nije obrisana iz baze podataka!";

echo '</b><br/>';

}

?>

Izveštaj je realizovan “printer-frindly” stranicom sa belom pozadinom koja se referencira na poseban css za izveštaj. Prvo se prihvataju vrednosti promenljivih dobijenih POST metodom sa stranice za pretragu, kreira se objekat tipa klase Kombinacija i poziva metoda za prikaz kombinacije sa statistikom. Metoda vraća result-set, koji ukoliko nije prazan, prikazuje se u formi html tabele odgovarajuće bootstrap klase. NA kraju stranice se prikazuje I broj prikazanih kombinacija.

<?php

session_start();

$username=$_SESSION["username"];

Page 54: SEMINARSKI RAD - tfzr.uns.ac.rs

$userid=$_SESSION["userid"];

$name=$_SESSION["name"];

$surname=$_SESSION["surname"];

$profile=$_SESSION["profile"];

if ($profile==""){session_destroy();

session_unset();

header('Location:index.php');}

?>

<html>

<head>

<meta charset='utf-8'>

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1">

<link rel="stylesheet" href="reportstyles.css">

<script src="script.js"></script>

<title>Loto 2021</title>

</head>

<body>

<div style="font-family:arial; color:black; padding-left: 20px;">

<h3>LOTO v2021</h3>

<h4>Izvučene kombinacije - <?php echo date('d.m.Y').".";?></h4><hr>

<?php

/*kreiranje objekta tipa klase kombinacija*/

include_once 'class/Statistika.php';

$objKombinacija = new Statistika();

/*ucitavanje kombinacija*/

$pronadjena="";

$brojredova=0;

$pronadjena=$objKombinacija->PrikazStatistikeUkupno();

$brojredova=mysqli_num_rows($pronadjena);

if ($brojredova>0)

{

echo "<table class='table table-striped'>

<thead>

<tr>

<th scope='col'>Godina</th>

<th scope='col'>Kolo</th>

<th scope='col'>1.</th>

<th scope='col'>2.</th>

<th scope='col'>3.</th>

<th scope='col'>4.</th>

<th scope='col'>5.</th>

<th scope='col'>6.</th>

<th scope='col'>7.</th>

<th scope='col'>Parnih</th>

<th scope='col'>Neparnih</th>

<th scope='col'>V1</th>

<th scope='col'>V2</th>

Page 55: SEMINARSKI RAD - tfzr.uns.ac.rs

<th scope='col'>V3</th>

<th scope='col'>H1</th>

<th scope='col'>H2</th>

<th scope='col'>H3</th>

<th scope='col'>H4</th>

</tr>

</thead><tbody>";

$red=0;

while($red = mysqli_fetch_array($pronadjena))

{

echo "

<tr>

<th scope='row'>".$red['GODINA']."</th>

<td>".$red['KOLO']."</td>

<td>".$red['BROJ1']."</td>

<td>".$red['BROJ2']."</td>

<td>".$red['BROJ3']."</td>

<td>".$red['BROJ4']."</td>

<td>".$red['BROJ5']."</td>

<td>".$red['BROJ6']."</td>

<td>".$red['BROJ7']."</td>

<td align='center'>".$red['PAR']."</td>

<td align='center'>".$red['NEPAR']."</td>

<td>".$red['V1']."</td>

<td>".$red['V2']."</td>

<td>".$red['V3']."</td>

<td>".$red['H1']."</td>

<td>".$red['H2']."</td>

<td>".$red['H3']."</td>

<td>".$red['H4']."</td>

</tr>";

}

echo "</tbody></table></br>";

}

else

{

echo "U bazi podataka nije pronađena nijedna memorisana kombinacija!";

echo "</br></br>";

}

echo "<hr>";

echo "Ukupno prikazano kombinacija: ".$brojredova;

$objStatistika=null;?>

</div>

</body>

</html>

Page 56: SEMINARSKI RAD - tfzr.uns.ac.rs

Statistika – prikaz stranice koja prikazuje koliko puta je svaki broj bio puta izvučen. Prvo se kreira objekat tipa klase Statistika, kroz ciklus (for naredba) se 39 puta poziva metoda za prebrojavanje izlaznosti svakog broja posebno, a rezultat se memoriše u nizu koji ima 39 elemenata. Elementi niza se prikazuju unutar Bootstrap tabele.

<h2>STATISTIKA</h2>

<!-- Prebrojavanje izlaznosti svih 39 brojeva -->

<?php

/*kreiranje objekta statistika*/

require 'class/Statistika.php';

$objStatistika = new Statistika();

/*kreiranje tabele sa dve kolone, prva prikazuje brojeve 1-39,

a druga rezultat izvršavanja metode za prebrojavanje izlaznosti*/

echo "<table class='table table-striped'>

<thead>

<tr>

<th scope='col'>Loto broj</th>

<th scope='col'>Ukupan broj izlazaka (koliko puta je broj bio v

eć izvučen)</th>

</tr>

</thead><tbody>";

//poziv metode za prebrojavanje

for ($i = 1; $i <= 39; $i++)

{

$rezultat="";

$rezultat=$objStatistika->prebrojIzlaznostBroja($i);

$red=0;

//odsecanje prvog reda dvodimenzionalnog niza koji sadrzi

//parove vrednosti: naziv kolone (iz bp) -

vrednost (Vraceno SELECT SQL upitom)

$red = mysqli_fetch_array($rezultat);

//ocitavanje vrednosti jednog elementa niuza red kojem se pristupa preko na

ziva

echo "<tr>

<td>".$i."</td>

<td>".$red['IzasaoPuta']."</td>

</tr>";

}

echo "</tbody>

</table>";

//uništavanje objekta

$objStatistika=null;

?>

Page 57: SEMINARSKI RAD - tfzr.uns.ac.rs

Snimanje podataka korisnika - na stranici se preuzimaju vrednosti o korisniku sa prethodne strane za unos, dodeljuju se promenljivama vrednosti na osnovu vrednosti promenljivih iz POST niza, proverava se da li je identična šifra upisana dva puta, te ako jeste kreira se objekat tipa klase Korisnik, dodeljuju se vrednosti atributima objekta, poziva se metoda za izmenu. U zavisnosti od uspešnosti izvršavanja metode, prikazuju se odgovarajuće poruke korisniku.

<h3 align="center">PODACI KORISNIKA</h3>

<!-- Preuzimanje vrednosti promenljivih preko POST metode -->

<?php

$prezime=$_POST['prezime'];

$ime=$_POST['ime'];

$korime=$_POST['username'];

$password1=$_POST['password1'];

$password2=$_POST['password2'];

$emailadr=$_POST['email'];

$pitanje=$_POST['pitanje'];

$odgovor=$_POST['odgovor'];

/*provera unete šifre 2x ista*/

if ($password1!=$password2)

{

echo '<b><br/>';

echo "Upozorenje: Niste dobro uneli šifru korisnika!";

echo '</b><br/><br/>';

echo "Korigujte unos šifre na prethodnoj stranici ili odustanite od

registracije! ";

echo '<br/>';

}

else //šifra je dobro uneta

{

/*kreiranje objekta korisnik*/

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$objKorisnik->Ime=$ime;

$objKorisnik->Prezime=$prezime;

$objKorisnik->Email=$emailadr;

$objKorisnik->Lozinka=$password1;

$objKorisnik->ProfilKorisnika=$profile;

$objKorisnik->SigurnosnoPitanje=$pitanje;

$objKorisnik->Odgovor=$odgovor;

$izmena=false;

$izmena = $objKorisnik->Izmena($userid);

if (!$izmena) /*neuspesna*/

{

echo '<b><br/><br/>';

echo "Izmena podataka korisnika nije izvršena. Proverite podatk

e unete na prethodnoj stranici ili odustanite od promene podataka korisnika! ";

echo '<br/>';

Page 58: SEMINARSKI RAD - tfzr.uns.ac.rs

}

else /*uspesna*/

{

echo '<br/><br/><b>';

echo "Podaci korisnika su uspešno promenjeni!";

echo '</b><br/>';

}

}

?>

Brisanje korisnika iz baze podataka je povezano sa stranicom za administraciju, na kojoj se pritiska taster za brisanje u redu tabele gde se želi obrisati korisnik. Pored tastera je forma sa promenljivama koje se prenose sledećoj stranici za brisanje POST metodom. Iz POST niza se uzima vrednost za brisanje (ID korisnika) i dodeljuje se odgovarajućoj promenljivoj. Kreira se objekat tipa klase Korisnik, poziva se metoda za brisanje korisnika preko ID korisnika (SLQ DML Delete komandom). U zavisnosti od toga da li je rezult-set izvršenog upita prazan ili ne, prikazuje se odgovarajuća poruka korisniku o uspešnosti brisanja korisnika iz baze podataka.

<h3 align="center">BRISANJE KORISNIKA</h3>

<!-- Preuzimanje vrednosti promenljive id preko POST metode -->

<?php

$idkorisnika=$_POST['id'];

/*kreiranje objekta korisnik*/

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$brisanje=false;

$brisanje = $objKorisnik->Brisanje($idkorisnika);

if (!$brisanje) /*neuspesno*/

{

echo '<b><br/>';

echo "Brisanje korisnika nije izvršeno. Ponovite brisanje, prom

enite korisnika ili odustanite od brisanja podataka korisnika! Napomena: korisnik koji

je unosio kombinacije ne može biti obrisan iz baze!";

echo '<br/>';

}

else /*uspesno*/

{

echo '<br/><b>';

echo "Korisnik je uspešno obrisan iz LOTO baze!";

echo '</b><br/>';

}

?>

Administracija korisnika: na kojoj se pritiska taster za brisanje u redu tabele gde se želi obrisati korisnik. Pored tastera je forma sa promenljivama koje se prenose sledećoj stranici za brisanje POST metodom. Iz POST niza se uzima vrednost za brisanje (ID korisnika) i dodeljuje se odgovarajućoj promenljivoj. Kreira se objekat tipa klase Korisnik, poziva se metoda za brisanje korisnika preko ID korisnika (SLQ DML Delete komandom). U zavisnosti od toga da li je rezult-set izvršenog upita prazan ili ne, prikazuje se odgovarajuća poruka korisniku o uspešnosti brisanja korisnika iz baze podataka.

Page 59: SEMINARSKI RAD - tfzr.uns.ac.rs

<h2>Administracija korisnika</h2>

<?php

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$korisnici="";

$brojredova=0;

$korisnici=$objKorisnik->UcitajSveKorisnike();

if ($korisnici)

{

$brojredova=mysqli_num_rows($korisnici);

}

if ($brojredova>0)

{

echo "Pronađeno korisnika: ".$brojredova;

echo "<table class='table table-striped'>

<thead>

<tr>

<th scope='col'>ID</th>

<th scope='col'>Prezime</th>

<th scope='col'>Ime</th>

<th scope='col'>Email</th>

<th scope='col'>Profil</th>

<th scope='col'>Akcija</th>

<th scope='col'>Akcija</th>

</tr>

</thead>";

while($red = mysqli_fetch_array($korisnici))

{

echo "<tr>

<td>".$red['ID_KORISNIKA']."</td>

<td>".$red['PREZIME']."</td>

<td>".$red['IME']."</td>

<td>".$red['EMAIL']."</td>

<td>".$red['PROFIL_KORISNIKA']."</td>";

//echo $red['PROFIL_KORISNIKA'];

$id=$red['ID_KORISNIKA'];

$profilkorisnika=$red['PROFIL_KORISNIKA'];

echo "<td> <form action='korisnikprofil.php' method='POST'>

";

echo "<input type='hidden' name='id' value='$id'>";

echo "<input type='hidden' name='profilkorisnika' value='$p

rofilkorisnika'>";

//echo $profil;

echo "<input type='submit' name='izmena' value='Promeni pro

fil'>";

echo "</form> </td>";

Page 60: SEMINARSKI RAD - tfzr.uns.ac.rs

echo "<td> <form action='korisnikbrisanje.php' method='POST

'>";

echo "<input type='hidden' name='id' value='$id'>";

echo "<input type='submit' name='brisanje' value='Brisanje'

>";

echo "</form> </td>";

echo "</tr>";

}

echo "</tbody>

</table>";

}

?>

Zaboravljena lozinka - Kreira se objekat tipa klase Korisnik, poziva se metoda za učitavanje podataka korisnika preko email adrese koja je upisana na prethodnoj stranici i prosleđena Post metodom. Provera se, mysqli_numrows PHP funkcijom, da li postoji korisnik čiji su podaci vraćeni ili ne metodom. U slučaju da takav korisnik postoji u bazi, kreira se mala forma za upis odgovora na sigurnosno pitanje koje se učitava iz baze.

<h4>Zaboravljena lozinka?</h4>

<?php

$emailadresa=$_POST['emailadresa'];

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$korisnici="";

$brojredova=0;

$korisnici=$objKorisnik->UcitajPodatkeKorisnika($emailadresa);

if ($korisnici)

{

$brojredova=mysqli_num_rows($korisnici);

}

if ($brojredova>0)

{

while($red = mysqli_fetch_array($korisnici))

{

$lozinka=$red['LOZINKA'];

$korime=$red['KORISNICKO_IME'];

$email=$emailadresa;

$pitanje=$red['SIGURNOSNO_PITANJE'];

$tacanodgovor=$red['ODGOVOR'];

}

}

?>

<form action="zaboravljenalozinkaslanje.php" method="POST">

<table align="center">

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center">E-mail adresa za slanje:</td>

<td align="center" style="float:left; clear:right; marg

in-

Page 61: SEMINARSKI RAD - tfzr.uns.ac.rs

top:10px;"><input type="text" name="email" disabled value="<?php echo $emailadresa; ?>"

onKeyPress="if(this.value.length==50) return false;" size=40></td>

</tr>

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center">Sigurnosno pitanje:</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="pitanje" disabled value="<?php echo $pitanje; ?>" o

nKeyPress="if(this.value.length==50) return false;" size=40></td>

</tr>

<tr align="center" style="float:left; clear:left; margin-

top:10px;"><td align="center">Odgovor*</td>

<td align="center" style="float:left; clear:right; marg

in-

top:10px;"><input type="text" name="odgovor" onKeyPress="if(this.value.length==50) retu

rn false;" size=40 required tabindex=1></td>

</tr>

<tr align="center" style="float:left; clear:left; margin-

top:10px;">

<td></td>

<td><div style="margin-left: 30pt;">

<input type='hidden' name='korime' value='<?php echo $k

orime; ?>'>

<input type='hidden' name='lozinka' value='<?php echo $

lozinka; ?>'>

<input type='hidden' name='sigpitanje' value='<?php ech

o $pitanje; ?>'>

<input type='hidden' name='odgovortacan' value='<?php e

cho $tacanodgovor; ?>'>

<input type='hidden' name='email' value='<?php echo $em

ail; ?>'>

<input type="submit" class="btn btn-

default" name="posalji" value="Pošalji šifru na e-mail adresu" tabindex=2>

</div>

</td>

</tr>

</table>

</form>

Slanje lozinke - Kreira se objekat tipa klase Korisnik, poziva se metoda za učitavanje podataka korisnika preko email adrese koja je upisana na prethodnoj stranici i prosleđena Post metodom. Vrši se provera odgovora na sigurnosno pitanje. Ukoliko je odgovor tačan, poziva se metoda za slanje šifre preko email adrese (PHP funkcija mail).

<h4>Zaboravljena lozinka?</h4>

<?php

$emailadresa=$_POST['email'];

$lozinka=$_POST['lozinka'];

Page 62: SEMINARSKI RAD - tfzr.uns.ac.rs

$korime=$_POST['korime'];

$pitanje=$_POST['sigpitanje'];

$odgovor=$_POST['odgovor']; //odgovor upisan na prethodnoj stranici

$odgovortacan=$_POST['odgovortacan']; //odgovor iz baze

if ($odgovor!=$odgovortacan)

{

echo "Odgovor na sigurnosno pitanje nije tačan! Ponovite unos o

dgovora...";

echo "<br/>";

}

else

{

include_once 'class/Korisnik.php';

$objKorisnik = new Korisnik();

$rezultat="";

$rezultat = $objKorisnik-

>ZaboravljenaLozinka($emailadresa, $lozinka, $korime);

//Nakon slanja email poruke korsiniku prikazati poruku

$rezultat=true;

if ($rezultat)

{

echo "Poruka sa šifrom je poslata na e-

mail adresu: ".$emailadresa;

echo "<br/>";

}

else

{

echo "Poruka sa šifrom nije poslata na e-

mail adresu: ".$emailadresa;

echo "<br/>";

}

$objKorisnik=null;

}

?>

Prikaz klasa srednjeg aplikacionog sloja

Klasa KonekcijaDB – Sadrži atribute: ime servera, korisničko ime, šifra, naziv baze podataka, kao i metode za otvaranje i zatvaranje konekcije do baze podataka.

<?php

class KonekcijaDB

{

private $Server="localhost";

private $UserName="root";

private $UserPassword="";

private $DBName="loto2021";

Page 63: SEMINARSKI RAD - tfzr.uns.ac.rs

public $Konekcija;

public function OtvoriKonekciju()

{

//Otvaranje konekcije do BP

$this->Konekcija='';

$this->Konekcija=mysqli_connect($this->Server,$this->UserName,$this-

>UserPassword,$this->DBName);

if (!$this->Konekcija)

{

echo('Nije uspostavljena konekcija do LOTO baze podataka!');

}

return $this->Konekcija;

}

public function ZatvoriKonekciju($pKonekcija)

{

//Zatvaranje konekcije do BP

mysqli_close($pKonekcija);

return true;

}

}

?>

Klasa Korisnik – Sadrži atribute prikazane na listingu i metode za: registraciju korisnika, prijavu korisnika, izmenu korisnika, promenu profila korisnika, odjavu korisnika, slanje zaboravljene lozinke, učitavanje podataka korisnika, brisanje korisniak iz baze podataka:

<?php

class Korisnik

{

public $IdKorisnika;

public $Ime;

public $Prezime;

public $Email;

public $KorisnickoIme;

public $Lozinka;

public $SigurnosnoPitanje;

public $Odgovor;

public $ProfilKorisnika;

private $konekcijabp;

private $objkonekcijabp;

function __construct()

{

//referenca na klasu konekcija

include_once "KonekcijaDB.php";

//instanciranje objekta tipa konekcije do baze podataka

Page 64: SEMINARSKI RAD - tfzr.uns.ac.rs

$objkonekcijabp = new KonekcijaDB();

//poziv metode za otvaranje konekcije do baze

$this->konekcijabp = $objkonekcijabp->OtvoriKonekciju();

}

public function Registracija()

{

//Registracija korisnika.

//Snimanje podataka o novom korisniku u BP.

//Proveriti da li korisnik sa tim emailom i korisničkim imenom

//već postoji u bazi podataka, te je potrebno otkazati unos.

$registrovan="";

$rezultatupitaprovera="";

$rezultatupita="";

$sqlupitprovera="SELECT * FROM korisnik WHERE `EMAIL`='$this-

>Email' OR `KORISNICKO_IME`='$this->KorisnickoIme';";

$rezultatupitaprovera=mysqli_query($this->konekcijabp,$sqlupitprovera);

if (!$rezultatupitaprovera)

{

$registrovan="";

}

else

{

$sqlupit="INSERT INTO `korisnik` (`ID_KORISNIKA`, `IME`, `PREZIME`, `EMAIL`

, `KORISNICKO_IME`, `LOZINKA`, `SIGURNOSNO_PITANJE`, `ODGOVOR`, `PROFIL_KORISNIKA`) VAL

UES ('','$this->Ime','$this->Prezime','$this->Email','$this->KorisnickoIme','$this-

>Lozinka','$this->SigurnosnoPitanje','$this->Odgovor','$this->ProfilKorisnika')";

$rezultatupita=mysqli_query($this->konekcijabp,$sqlupit);

if ($rezultatupita)

{

$registrovan=true;

}

}

return $registrovan;

}

public function Prijava()

{

//Provera unetog korisničkog imena i šifre u bazi podataka.

$prijavljen='';

$sqlupit="SELECT * FROM korisnik WHERE `LOZINKA`='$this-

>Lozinka' AND `KORISNICKO_IME`='$this->KorisnickoIme';";

$prijavljen=mysqli_query($this->konekcijabp,$sqlupit);

return $prijavljen;

}

Page 65: SEMINARSKI RAD - tfzr.uns.ac.rs

public function Odjava()

{

//Odjava korisnika.

$odjavljen=true;

return $odjavljen;

}

public function Izmena($pIDKorisnika)

{

//Izmena podataka korisnika prema ID korisnika

//koji se ne može menjati.

$izmenjen="";

$rezultatupita="";

$sqlupit="UPDATE `korisnik` SET `IME`='$this->Ime', `PREZIME`='$this-

>Prezime', `EMAIL`='$this->Email', `LOZINKA`='$this-

>Lozinka', `SIGURNOSNO_PITANJE`='$this->SigurnosnoPitanje', `ODGOVOR`='$this-

>Odgovor', `PROFIL_KORISNIKA`='$this-

>ProfilKorisnika' WHERE `ID_KORISNIKA`='$pIDKorisnika';";

$rezultatupita=mysqli_query($this->konekcijabp,$sqlupit);

if ($rezultatupita)

{

$izmenjen=true;

}

return $izmenjen;

}

public function Promeniprofil($pIDKorisnika, $pProfil)

{

//Izmena podataka korisnika prema ID korisnika

//koji se ne može menjati.

$izmenjen="";

$rezultatupita="";

if ($pProfil=="igrac")

{

$ProfilNovi="pretp";

}

elseif ($pProfil=="pretp")

{

$ProfilNovi="igrac";

}

if ($pProfil=="admin")

{

$ProfilNovi="admin";

}

$sqlupit="UPDATE `korisnik` SET `PROFIL_KORISNIKA`='$ProfilNovi' WHERE `ID_KORISN

IKA`='$pIDKorisnika';";

Page 66: SEMINARSKI RAD - tfzr.uns.ac.rs

$rezultatupita=mysqli_query($this->konekcijabp,$sqlupit);

if ($rezultatupita)

{

$izmenjen=true;

}

return $izmenjen;

}

public function ZaboravljenaLozinka($email, $lozinka, $korime)

{

//Slanje email poruke sa korisničkim imenom i šifrom.

$zaboravljena="";

//slanje poruke

$poslata="";

$poruka = "Poštovani,\n vaša zaboravljena lozinka je: ".$lozinka.", \n a korisnič

ko ime: ".$korime."\n Pozdrav,\n Loto web aplikacija.";

$poruka = wordwrap($poruka,200);

//$poslata=mail($email,"Loto web aplikacija - zaboravljena lozinka",$poruka);

$poslata=true;

if (!$poslata)

{

$zaboravljena="";

}

return $zaboravljena;

}

public function UcitajSvePodatkeKorisnika($pIDKorisnika)

{

//Učitavanje svih podataka korisnika iz baze podataka

//na osnovu ID korisnika.

$korisnik="";

$sqlupit="SELECT * FROM korisnik WHERE `ID_KORISNIKA`='$pIDKorisnika';";

$korisnik=mysqli_query($this->konekcijabp,$sqlupit);

return $korisnik;

}

public function UcitajPodatkeKorisnika($pEmail)

{

//Učitavanje svih podataka korisnika iz baze podataka

//na osnovu ID korisnika.

$korisnik="";

$sqlupit="SELECT * FROM korisnik WHERE `EMAIL`='$pEmail';";

$korisnik=mysqli_query($this->konekcijabp,$sqlupit);

return $korisnik;

}

Page 67: SEMINARSKI RAD - tfzr.uns.ac.rs

public function UcitajSveKorisnike()

{

//Učitavanje svih korisnika iz baze podataka

$korisnik="";

$sqlupit="SELECT * FROM korisnik ORDER BY Prezime, Ime ASC;";

$korisnik=mysqli_query($this->konekcijabp,$sqlupit);

return $korisnik;

}

public function Brisanje($pIDKorisnika)

{

//Učitavanje svih podataka korisnika iz baze podataka

//na osnovu ID korisnika.

$korisnik="";

$sqlupit="DELETE FROM korisnik WHERE `ID_KORISNIKA`='$pIDKorisnika';";

$korisnik=mysqli_query($this->konekcijabp,$sqlupit);

return $korisnik;

}

function __destruct()

{

if (!mysqli_close($this->konekcijabp))

{

$this->konekcijabp = null;

}

}

}

?>

Klasa Kombinacija – Sadrži atribute prikazane na listingu i metode za: unos kombinacije, izmenu kombinacije, brisanje kombinacije, učitavanje kombinacije, učitavanje svih kombinacija, provere da li je kombinacija izvučena, provere da li su brojevi izvučeni, generisanje slučajne kombinacije:

<?php

class Kombinacija

{

public $IdKombinacije;

public $Broj1;

public $Broj2;

public $Broj3;

public $Broj4;

public $Broj5;

public $Broj6;

public $Broj7;

public $DatumIzvlacenja;

public $Kolo;

Page 68: SEMINARSKI RAD - tfzr.uns.ac.rs

public $Godina;

public $Dobitak;

public $statistika;

public $korisnik;

private $konekcijabp;

private $objkonekcijabp;

private $objstatistika;

function __construct()

{

//referenca na klasu konekcija

include_once "KonekcijaDB.php";

//instanciranje objekta tipa konekcije do baze podataka

$objkonekcija = new KonekcijaDB();

//poziv metode za otvaranje konekcije do baze

$this->konekcijabp = $objkonekcija->OtvoriKonekciju();

}

public function Unos()

{

//Unos izvučene kombinacije (moguće preuzeti sa www.lutrija.rs/lottogame)

//i njeno snimanje u bazu podataka. Unos 7 brojeva,

//datuma izvlačenja, dobitka, kola, određivanje godine iz datuma (KI).

$uspeh=false;

$snimljenastatistika=false;

$rezultatupita="";

$IdKombinacije="";

$sqlupit="INSERT INTO `kombinacija`(`ID_KOMBINACIJE`, `ID_KORISNIKA`, `BROJ1`, `B

ROJ2`, `BROJ3`, `BROJ4`, `BROJ5`, `BROJ6`, `BROJ7`, `DATUM_IZVLACENJA`, `KOLO`, `GODINA

`, `DOBITAK`) VALUES ('','$this->korisnik','$this->Broj1','$this->Broj2','$this-

>Broj3','$this->Broj4','$this->Broj5','$this->Broj6','$this->Broj7','$this-

>DatumIzvlacenja','$this->Kolo','$this->Godina','$this->Dobitak')";

$rezultatupita=mysqli_query($this->konekcijabp,$sqlupit);

if ($rezultatupita)

{

//potrebno je odrediti id kombinacije

//nacin 1 - preko SQL SELECT upita

/*$rezultatupitazaID='';

$sqlupitID="SELECT MAX(ID_KOMBINACIJE) AS NajveciID FROM kombinacija";

$rezultatupitazaID=mysqli_query($this->konekcijabp,$sqlupitID);

$brredova=0;

$brredova = mysqli_num_rows($rezultatupitazaID);

if ($brredova==1)

{

$red = mysqli_fetch_array($rezultatupitazaID);

//$IdKombinacije=$red[0];

Page 69: SEMINARSKI RAD - tfzr.uns.ac.rs

$IdKombinacije=$red['NajveciID'];

}*/

//nacin 2 -

preko php funkcije, ucitavanje poslednje upisanog ID sa osobinom autoinkrement u tabel

u bp

//$IdKombinacije = mysqli_insert_id($this->konekcijabp);

//snimanje statistike u bazu podataka

//$snimljenastatistika=true;

//if ($snimljenastatistika)

//{

$uspeh=true;

//}

}

return $uspeh;

}

public function Izmena($IdKombinacije)

{

//Izmena svih sedam brojeva, datuma izvlačenja (godine),

//broja kola, kao i automatska izmena statistike za

//tu kombinaciju u bazi podataka.

$uspeh='';

$snimljenastatistikas="";

$sqlupits="UPDATE `kombinacija` SET `ID_KORISNIKA`=$this->korisnik,`BROJ1`=$this-

>Broj1,`BROJ2`=$this->Broj2,`BROJ3`=$this->Broj3,`BROJ4`=$this->Broj4,`BROJ5`=$this-

>Broj5,`BROJ6`=$this->Broj6,`BROJ7`=$this->Broj7,`DATUM_IZVLACENJA`='$this-

>DatumIzvlacenja',`KOLO`=$this->Kolo,`GODINA`=$this->Godina,`DOBITAK`=$this-

>Dobitak WHERE `ID_KOMBINACIJE`=$IdKombinacije;";

$rezultatupitas=mysqli_query($this->konekcijabp,$sqlupits);

if ($rezultatupitas)

{

$uspeh=true;

}

return $uspeh;

}

public function Obrisi($pIDKomb)

{

//Brisanje svih podataka kombincije po ID kombinacije,

//kao i statistike za tu kombinaciju u BP.

$uspeh='';

$rezultatupita1='';

$rezultatupita2='';

$sqlupit1="DELETE FROM statistika WHERE `ID_KOMBINACIJE`=$pIDKomb";

Page 70: SEMINARSKI RAD - tfzr.uns.ac.rs

$rezultatupita1=mysqli_query($this->konekcijabp,$sqlupit1);

if ($rezultatupita1)

{

$sqlupit2="DELETE FROM kombinacija WHERE `ID_KOMBINACIJE`=$pIDKomb";

$rezultatupita2=mysqli_query($this->konekcijabp,$sqlupit2);

if ($rezultatupita2)

{

$uspeh=true;

}

}

return $uspeh;

}

public function PrikazSvih()

{

//Učitavanje svih kombinacija, bez statistike, iz baze podataka.

$rezultatupita='';

$sqlupit="SELECT * FROM kombinacija ORDER BY Godina DESC, Kolo DESC";

$rezultatupita=mysqli_query($this->konekcijabp,$sqlupit);

return $rezultatupita;

}

public function ProveraDaLiSuBrUnetiOk($broj1, $broj2, $broj3, $broj4, $broj5, $broj

6, $broj7)

{

//Za unetih 7 brojeva proveriti da li su sortirani od najmanjeg

//do najvećeg. Proveriti da li su uneta dva ista broja u kombinaciji.

//Dozvoliti unos samo celih brojeva u rasponu od 1 do 39.

$uspeh=false;

if ($broj1>=1 && $broj1<=39 && $broj2>=1 && $broj2<=39 && $broj3>=1 && $broj3<=39

&& $broj4>=1 && $broj4<=39 && $broj5>=1 && $broj5<=39 && $broj6>=1 && $broj6<=39 && $b

roj7>=1 && $broj7<=39)

{

if ($broj1<$broj2 && $broj2<$broj3 && $broj3<$broj4 && $broj4<$broj5 && $broj5

<$broj6 && $broj6<$broj7)

{

$uspeh=true;

}

}

return $uspeh;

}

public function Pretraga($pKoloOd, $pKoloDo, $pGodOd, $pGodDo)

{

//Pretraga izvučenih kombinacija po kolu od-do, godini od-do.

//Pronađene podatke vratiti sortirane po datumu izvlačenja u

Page 71: SEMINARSKI RAD - tfzr.uns.ac.rs

//rastućem poretku (prvo po godini, pa po kolu unutar jedne godine)!

$result = "";

if ($pKoloOd!="" && $pKoloDo!="" && $pGodOd!="" && $pGodDo!="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Kolo>=$pKoloOd AND Kolo<=$pKoloDo AND Godin

a>=$pGodOd AND Godina<=$pGodDo ORDER BY Godina, Kolo;";

}

if ($pKoloOd=="" && $pKoloDo=="" && $pGodOd!="" && $pGodDo!="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Godina>=$pGodOd AND Godina<=$pGodDo ORDER B

Y Godina, Kolo;";

}

if ($pKoloOd=="" && $pKoloDo=="" && $pGodOd!="" && $pGodDo=="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Godina>=$pGodOd ORDER BY Godina, Kolo;";

}

if ($pKoloOd=="" && $pKoloDo=="" && $pGodOd=="" && $pGodDo!="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Godina<=$pGodDo ORDER BY Godina, Kolo;";

}

if ($pKoloOd!="" && $pKoloDo=="" && $pGodOd=="" && $pGodDo=="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Kolo>=$pKoloOd ORDER BY Godina, Kolo;";

}

if ($pKoloOd=="" && $pKoloDo!="" && $pGodOd=="" && $pGodDo=="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Kolo>=$pKoloDo ORDER BY Godina, Kolo;";

}

if ($pKoloOd!="" && $pKoloDo!="" && $pGodOd=="" && $pGodDo=="")

{

$sqlupit = "SELECT * FROM kombinacija INNER JOIN statistika ON kombinacija.ID_

KOMBINACIJE=Statistika.ID_KOMBINACIJE WHERE Kolo>=$pKoloOd AND Kolo<=$pKoloDo ORDER BY

Godina, Kolo;";

}

if ($pKoloOd=="" && $pKoloDo=="" && $pGodOd=="" && $pGodDo=="")

{

$result ="";

}

else

{

$result = mysqli_query($this->konekcijabp, $sqlupit);

Page 72: SEMINARSKI RAD - tfzr.uns.ac.rs

}

return $result;

}

public function GenerisanjeSlucajne()

{

//Metodom slučajnog izbora generisanje kombinacije od 7 brojeva,

//poređanih od najmanjeg do najvećeg. Raspon brojeva: 1-39.

//Ne sme biti ponavljanja brojeva (ne mogu se naći dva ista u kombinaciji).

//Formira se niz od 7 clanova, elemenata (celi brojevi)

for ($i=0;$i<=6;$i++)

{

$niz[$i]=rand(1,39);

while (count(array_unique($niz))!=$i+1)

{

$niz[$i]=rand(1,39);

}

}

sort($niz);

return $niz;

}

public function UcitajKombinaciju($idkomb)

{

//ucitavanja tacno odredjene kombinacije preko id kombinacije

$result = "";

$sqlupit = "SELECT * FROM `kombinacija` WHERE ID_KOMBINACIJE='$idkomb';";

$result = mysqli_query($this->konekcijabp, $sqlupit);

return $result;

}

public function ProveraDaliJeIzvucena($pKolo, $pGodina)

{

//Provera da li je kombinacija sa tim kolom i godinom

//već bila izvučena i upisana u bazu podataka.

$upisana='';

$result='';

//$brredova=0;

$upit = "SELECT * FROM `kombinacija` WHERE godina=$pGodina and kolo=$pKolo;";

//echo $upit;

//izvršavanje SQL upita sa otvorenom konekcijom do RBP.

$result = mysqli_query($this->konekcijabp, $upit);

//određivanje broja redova result-seta

//$brredova = mysqli_num_rows($result);

//u slučaju da je broj redova u result-setu 1 ili više

Page 73: SEMINARSKI RAD - tfzr.uns.ac.rs

//postaviti vrednost promenljive upisana/izvučena na true

if ($result)

{

$upisana=true;

}

return $upisana;

}

public function ProveraDaliSuBrIzvuceni($pBr1, $pBr2, $pBr3, $pBr4, $pBr5, $pBr6, $p

Br7)

{

//Provera da li je 7 brojeva kombinacije već bilo izvučeno

//i upisano u bazu podataka.

$izvucena='';

$rezultatupita='';

$redova=0;

$upit = "SELECT * FROM `kombinacija` WHERE broj1=$pBr1 and broj2=$pBr2 and broj3=

$pBr3 and broj4=$pBr4 and broj5=$pBr5 and broj6=$pBr6 and broj7=$pBr7;";

$rezultatupita=mysqli_query($this->konekcijabp,$upit);

$redova=mysqli_num_rows($rezultatupita);

if ($redova>0)

{

$izvucena=true;

}

return $izvucena;

}

function __destruct()

{

//uništavanje objekta/promenljive iz memorije, prvi način:

//unset($this->konekcijabp);

//drugi način:

//$this->konekcijabp=null;

//treći način, preko poziva metode za zatvaranje konekcije

//pozivanje metode za otvaranje konekcije do baze

if (!mysqli_close($this->objkonekcijabp))

{

$zatvorena = false;

$zatvorena = $this->objkonekcijabp->ZatvoriKonekciju($this->konekcijabp);

}

}

}

?>

Page 74: SEMINARSKI RAD - tfzr.uns.ac.rs

Klasa Statistika – Sadrži atribute prikazane na listingu i metode za: snimanje statistike, izmenu statistike, prikaz statistike, prebrojavanje izlaznosti, izračunavanje statistike za period:

<?php

class Statistika

{

public $Par;

public $Nepar;

public $V1;

public $V2;

public $V3;

public $H1;

public $H2;

public $H3;

public $H4;

private $konekcijabps;

function __construct()

{

//referenca na klasu konekcija

include_once "KonekcijaDB.php";

//instanciranje objekta tipa konekcije do baze podataka

$objkonekcijas = new KonekcijaDB();

//poziv metode za otvaranje konekcije do baze

$this->konekcijabps = $objkonekcijas->OtvoriKonekciju();

}

public function SnimiStatistiku($pBr1, $pBr2, $pBr3, $pBr4, $pBr5, $pBr6, $pBr7)

{

//Snimanje statističkih pokazatelja kombinacije prilikom unosa.

//Izračunati i evidentirati koliko je od 7 brojeva bilo parnih i neparnih pBreva.

//Evidentirati broj izvučenih brojeva po vertikalama tiketa (V1, V2, V3),

//kao i sledećim grupama pBreva: 1-10 (H1), 11-20 (H2), 21-30 (H3) i 31-39 (H4).

$snimljena="";

$v1=0;

$v2=0;

$v3=0;

$p=0;

$n=0;

$h1=0; //1-10

$h2=0; //11-20

$h3=0; //21-30

$h4=0; //31-39

$y=2;

//odredjivanje koliko imamo brojeva (od 7) u 1. grupi - H1

if ($pBr1>=1 && $pBr1<=10)

Page 75: SEMINARSKI RAD - tfzr.uns.ac.rs

{

$h1++;

}

if ($pBr2>=1 && $pBr2<=10)

{

$h1++;

}

if ($pBr3>=1 && $pBr3<=10)

{

$h1++;

}

if ($pBr4>=1 && $pBr4<=10)

{

$h1++;

}

if ($pBr5>=1 && $pBr5<=10)

{

$h1++;

}

if ($pBr6>=1 && $pBr6<=10)

{

$h1++;

}

if ($pBr7>=1 && $pBr7<=10)

{

$h1++;

}

//odredjivanje koliko imamo brojeva (od 7) u 2. grupi - H2

if ($pBr1>=11 && $pBr1<=20)

{

$h2++;

}

if ($pBr2>=11 && $pBr2<=20)

{

$h2++;

}

if ($pBr3>=11 && $pBr3<=20)

{

$h2++;

}

if ($pBr4>=11 && $pBr4<=20)

{

$h2++;

}

if ($pBr5>=11 && $pBr5<=20)

{

$h2++;

}

Page 76: SEMINARSKI RAD - tfzr.uns.ac.rs

if ($pBr6>=11 && $pBr6<=20)

{

$h2++;

}

if ($pBr7>=11 && $pBr7<=20)

{

$h2++;

}

//odredjivanje koliko imamo brojeva (od 7) u 3. grupi - H3

if ($pBr1>=21 && $pBr1<=30)

{

$h3++;

}

if ($pBr2>=21 && $pBr2<=30)

{

$h3++;

}

if ($pBr3>=21 && $pBr3<=30)

{

$h3++;

}

if ($pBr4>=21 && $pBr4<=30)

{

$h3++;

}

if ($pBr5>=21 && $pBr5<=30)

{

$h3++;

}

if ($pBr6>=21 && $pBr6<=30)

{

$h3++;

}

if ($pBr7>=21 && $pBr7<=30)

{

$h3++;

}

//odredjivanje koliko imamo brojeva (od 7) u 4. grupi - H4

$h4=7-$h1-$h2-$h3;

//prebrojavanje parnih i neparnih brojeva,

//rezultat ostatka pri deljenju brojem 2 ako je 1,

//znači da je broj neparan!

$rdbr1 = fmod($pBr1,$y);

$rdbr2 = fmod($pBr2,$y);

$rdbr3 = fmod($pBr3,$y);

$rdbr4 = fmod($pBr4,$y);

Page 77: SEMINARSKI RAD - tfzr.uns.ac.rs

$rdbr5 = fmod($pBr5,$y);

$rdbr6 = fmod($pBr6,$y);

$rdbr7 = fmod($pBr7,$y);

//određiavanje koliko ima ukupno neparnih:

$n=$rdbr1+$rdbr2+$rdbr3+$rdbr4+$rdbr5+$rdbr6+$rdbr7;

//broj parnih = 7 - broj neparnih:

$p=7-$n;

//prebrojavanje vertikala v1

if ($pBr1==1 || $pBr1==4 || $pBr1==7 || $pBr1==10 || $pBr1==13 || $pBr1==16 || $p

Br1==19 || $pBr1==22 || $pBr1==25 || $pBr1==28 || $pBr1==31 || $pBr1==34 || $pBr1==37)

{

$v1++;

}

if ($pBr2==1 || $pBr2==4 || $pBr2==7 || $pBr2==10 || $pBr2==13 || $pBr2==16 || $p

Br2==19 || $pBr2==22 || $pBr2==25 || $pBr2==28 || $pBr2==31 || $pBr2==34 || $pBr2==37)

{

$v1++;

}

if ($pBr3==1 || $pBr3==4 || $pBr3==7 || $pBr3==10 || $pBr3==13 || $pBr3==16 || $p

Br3==19 || $pBr3==22 || $pBr3==25 || $pBr3==28 || $pBr3==31 || $pBr3==34 || $pBr3==37)

{

$v1++;

}

if ($pBr4==1 || $pBr4==4 || $pBr4==7 || $pBr4==10 || $pBr4==13 || $pBr4==16 || $p

Br4==19 || $pBr4==22 || $pBr4==25 || $pBr4==28 || $pBr4==31 || $pBr4==34 || $pBr4==37)

{

$v1++;

}

if ($pBr5==1 || $pBr5==4 || $pBr5==7 || $pBr5==10 || $pBr5==13 || $pBr5==16 || $p

Br5==19 || $pBr5==22 || $pBr5==25 || $pBr5==28 || $pBr5==31 || $pBr5==34 || $pBr5==37)

{

$v1++;

}

if ($pBr6==1 || $pBr6==4 || $pBr6==7 || $pBr6==10 || $pBr6==13 || $pBr6==16 || $p

Br6==19 || $pBr6==22 || $pBr6==25 || $pBr6==28 || $pBr6==31 || $pBr6==34 || $pBr6==37)

{

$v1++;

}

if ($pBr7==1 || $pBr7==4 || $pBr7==7 || $pBr7==10 || $pBr7==13 || $pBr7==16 || $p

Br7==19 || $pBr7==22 || $pBr7==25 || $pBr7==28 || $pBr7==31 || $pBr7==34 || $pBr7==37)

{

$v1++;

}

//prebrojavanje vertikale V3

Page 78: SEMINARSKI RAD - tfzr.uns.ac.rs

//preko ostatka pri deljenju sa 3 (mora biti 0)!

$y = 3;

$v1br1 = fmod($pBr1,$y);

$v1br2 = fmod($pBr2,$y);

$v1br3 = fmod($pBr3,$y);

$v1br4 = fmod($pBr4,$y);

$v1br5 = fmod($pBr5,$y);

$v1br6 = fmod($pBr6,$y);

$v1br7 = fmod($pBr7,$y);

if ($v1br1==0)

{

$v3++;

}

if ($v1br2==0)

{

$v3++;

}

if ($v1br3==0)

{

$v3++;

}

if ($v1br4==0)

{

$v3++;

}

if ($v1br5==0)

{

$v3++;

}

if ($v1br6==0)

{

$v3++;

}

if ($v1br7==0)

{

$v3++;

}

//određivanje vertikale V2=7-v1-v3:

$v2=7-$v1-$v3;

$rezultatupitazaID='';

$sqlupitID="SELECT MAX(ID_KOMBINACIJE) AS NajveciID FROM kombinacija";

$rezultatupitazaID=mysqli_query($this->konekcijabps,$sqlupitID);

$brredova=0;

$brredova = mysqli_num_rows($rezultatupitazaID);

if ($brredova==1)

{

$red = mysqli_fetch_array($rezultatupitazaID);

Page 79: SEMINARSKI RAD - tfzr.uns.ac.rs

$IdKombinacije=$red['NajveciID'];

}

//snimanje statistickih parametara kombinacije

//u bazu podataka preko INSERT DML SQL upita

$uspeh=false;

$sqlupit = "INSERT INTO `Statistika` VALUES ($IdKombinacije,'$p','$n','$v1','$v2'

,'$v3','$h1','$h2','$h3','$h4');";

//echo $sqlupit;

$snimljena = mysqli_query($this->konekcijabps, $sqlupit);

if ($snimljena)

{

$uspeh=true;

}

return $uspeh;

}

public function IzmenaStatistike($IdKombinacije, $pBr1, $pBr2, $pBr3, $pBr4, $pBr5,

$pBr6, $pBr7)

{

//Izmena statistike prema id kombinacije.

//Izračunati i evidentirati koliko je od 7 pBreva bilo parnih i neparnih pBreva.

//Evidentirati pBr izvučenih pBreva po vertikalama tiketa (V1, V2, V3),

//kao i sledećim grupama pBreva: 1-10 (H1), 11-20 (H2), 21-30 (H3) i 31-39 (H4).

$izmenjena="";

$v1=0;

$v2=0;

$v3=0;

$p=0;

$n=0;

$h1=0; //1-10

$h2=0; //11-20

$h3=0; //21-30

$h4=0; //31-39

$y=2;

//rezultat ostatka pri deljenju brojem 2 ako je 1 znači da je broj neparan:

$rdbr1 = fmod($pBr1,$y);

$rdbr2 = fmod($pBr2,$y);

$rdbr3 = fmod($pBr3,$y);

$rdbr4 = fmod($pBr4,$y);

$rdbr5 = fmod($pBr5,$y);

$rdbr6 = fmod($pBr6,$y);

$rdbr7 = fmod($pBr7,$y);

//koliko ima neparnih:

$n=$rdbr1+$rdbr2+$rdbr3+$rdbr4+$rdbr5+$rdbr6+$rdbr7;

Page 80: SEMINARSKI RAD - tfzr.uns.ac.rs

//parnih=7-neparnih:

$p=7-$n;

//prebrojavanje vertikala v1

if ($pBr1==1 || $pBr1==4 || $pBr1==7 || $pBr1==10 || $pBr1==13 || $pBr1==16 || $

pBr1==19 || $pBr1==22 || $pBr1==25 || $pBr1==28 || $pBr1==31 || $pBr1==34 || $pBr1==37)

{

$v1++;

}

if ($pBr2==1 || $pBr2==4 || $pBr2==7 || $pBr2==10 || $pBr2==13 || $pBr2==16 || $

pBr2==19 || $pBr2==22 || $pBr2==25 || $pBr2==28 || $pBr2==31 || $pBr2==34 || $pBr2==37)

{

$v1++;

}

if ($pBr3==1 || $pBr3==4 || $pBr3==7 || $pBr3==10 || $pBr3==13 || $pBr3==16 || $

pBr3==19 || $pBr3==22 || $pBr3==25 || $pBr3==28 || $pBr3==31 || $pBr3==34 || $pBr3==37)

{

$v1++;

}

if ($pBr4==1 || $pBr4==4 || $pBr4==7 || $pBr4==10 || $pBr4==13 || $pBr4==16 || $

pBr4==19 || $pBr4==22 || $pBr4==25 || $pBr4==28 || $pBr4==31 || $pBr4==34 || $pBr4==37)

{

$v1++;

}

if ($pBr5==1 || $pBr5==4 || $pBr5==7 || $pBr5==10 || $pBr5==13 || $pBr5==16 || $

pBr5==19 || $pBr5==22 || $pBr5==25 || $pBr5==28 || $pBr5==31 || $pBr5==34 || $pBr5==37)

{

$v1++;

}

if ($pBr6==1 || $pBr6==4 || $pBr6==7 || $pBr6==10 || $pBr6==13 || $pBr6==16 || $

pBr6==19 || $pBr6==22 || $pBr6==25 || $pBr6==28 || $pBr6==31 || $pBr6==34 || $pBr6==37)

{

$v1++;

}

if ($pBr7==1 || $pBr7==4 || $pBr7==7 || $pBr7==10 || $pBr7==13 || $pBr7==16 || $

pBr7==19 || $pBr7==22 || $pBr7==25 || $pBr7==28 || $pBr7==31 || $pBr7==34 || $pBr7==37)

{

$v1++;

}

//koliko ima u v3, ostatak pri deljenju sa 3 je 0:

$y = 3;

$v1br1 = fmod($pBr1,$y);

$v1br2 = fmod($pBr2,$y);

$v1br3 = fmod($pBr3,$y);

$v1br4 = fmod($pBr4,$y);

$v1br5 = fmod($pBr5,$y);

$v1br6 = fmod($pBr6,$y);

Page 81: SEMINARSKI RAD - tfzr.uns.ac.rs

$v1br7 = fmod($pBr7,$y);

if ($v1br1==0)

{

$v3++;

}

if ($v1br2==0)

{

$v3++;

}

if ($v1br3==0)

{

$v3++;

}

if ($v1br4==0)

{

$v3++;

}

if ($v1br5==0)

{

$v3++;

}

if ($v1br6==0)

{

$v3++;

}

if ($v1br7==0)

{

$v3++;

}

$v2=7-$v1-$v3;

//naredbe od kolege Gatarica za odredjivanje H1, H2, H3, H4

$array = array($pBr1, $pBr2, $pBr3, $pBr4, $pBr5, $pBr6, $pBr7);

$h1= array_reduce($array, function($ret, $val) {

return $ret += $val >= 1 && $val <= 10;

});

$h2= array_reduce($array, function($ret, $val) {

return $ret += $val >=11 && $val <= 20;

});

$h3= array_reduce($array, function($ret, $val) {

return $ret += $val >=21 && $val <= 30;

});

$h4= array_reduce($array, function($ret, $val) {

return $ret += $val >= 31 && $val <= 39;

});

//izmena podataka u tabeli statistika pomocu SQL UPDATE upita

Page 82: SEMINARSKI RAD - tfzr.uns.ac.rs

$sqlupit = "UPDATE `statistika` SET `PAR`='$p',`NEPAR`='$n',`V1`='$v1',`V2`='$v2'

,`V3`='$v3',`H1`='$h1',`H2`='$h2',`H3`='$h3',`H4`='$h4' WHERE `ID_KOMBINACIJE`=$IdKombi

nacije";

$izmenjena = mysqli_query($this->konekcijabps, $sqlupit);

return $izmenjena;

}

public function PrikazStatistike($pGodOd, $pGodDo)

{

//Metoda za prikaz statistike:

//par-nepar, H1-H4, V1-V3

//Prikazati sva kola odigrana u nekoj godini.

$rezultatupita='';

$sqlupit="SELECT * FROM Kombinacija, Statistika WHERE Kombinacija.ID_KOMBINACIJE=

Statistika.ID_KOMBINACIJE AND Kombinacija.Godina>=$pGodOd AND Kombinacija.Godina<=$pGod

Do ORDER BY Godina DESC, Kolo DESC";

$rezultatupita=mysqli_query($this->konekcijabps,$sqlupit);

return $rezultatupita;

}

public function PrikazStatistikeUkupno()

{

//Metoda za prikaz statistike:

//par-nepar, H1-H4, V1-V3

//Prikazati sva kola odigrana u nekoj godini.

$rezultatupita='';

$sqlupit="SELECT * FROM Kombinacija, Statistika WHERE Kombinacija.ID_KOMBINACIJE=

Statistika.ID_KOMBINACIJE ORDER BY Godina DESC, Kolo DESC";

$rezultatupita=mysqli_query($this->konekcijabps,$sqlupit);

return $rezultatupita;

}

public function IzracunavanjeStatistikeZaSveGodine() //Izbaciti??

{

//Prikaz svih 39 brojeva i izračunavanje/prebrojavanje koliko su puta bili

//izvučeni (ukupno za sve godine).

for ($i=1;$i<=39;$i++)

{

$nizstat[$i]=0;

}

for ($i=1;$i<=39;$i++)

{

$rezultatupita = "";

$sqlupit = "";

$broj=$i;

Page 83: SEMINARSKI RAD - tfzr.uns.ac.rs

$sqlupit = "SELECT Count(ID_KOMBINACIJE) as IzasaoPuta FROM `kombinacija` WHER

E Broj1=$broj oR Broj2=$broj Or Broj3=$broj OR Broj4=$broj or Broj5=$broj or Broj6=$bro

j or Broj7=$broj;";

$rezultatupita = mysqli_query($this->konekcijabps, $sqlupit);

$brredova=0;

$putaizvucen=0;

$brredova = mysqli_num_rows($rezultatupita);

if ($brredova>0)

{

$red = mysqli_fetch_array($rezultatupita);

$putaizvucen=$red['IzasaoPuta'];

$nizstat[$i]=$putaizvucen;

}

}

return $nizstat;

}

public function prebrojIzlaznostBroja($broj)

{

$result = "";

$sqlupit = "SELECT Count(*) as IzasaoPuta FROM `kombinacija` WHERE Broj1=$broj

Or Broj2=$broj Or Broj3=$broj Or Broj4=$broj Or Broj5=$broj Or Broj6=$broj Or Broj7=$br

oj;";

$result = mysqli_query($this->konekcijabps, $sqlupit);

return $result;

}

public function IzracunavanjeStatistikeZaPeriod($pGodOd, $pGodDo)

{

//Prikaz svih 39 brojeva i izračunavanje/prebrojavanje koliko su puta bili

//izvučeni (za period> od do neke godine).

for ($i=1;$i<=39;$i++)

{

$nizstat[$i]=0;

}

for ($i=1;$i<=39;$i++)

{

$rezultatupita = "";

$sqlupit = "";

$broj=$i;

$sqlupit = "SELECT Count(*) as IzasaoPuta FROM `kombinacija` WHERE (Broj1=$bro

j Or Broj2=$broj Or Broj3=$broj Or Broj4=$broj Or Broj5=$broj Or Broj6=$broj Or Broj7=$

broj) AND (Godina>=$pGodOd AND Godina<=$pGodDo);";

$rezultatupita = mysqli_query($this->konekcijabps, $sqlupit);

$brredova=0;

$putaizvucen=0;

$brredova = mysqli_num_rows($rezultatupita);

Page 84: SEMINARSKI RAD - tfzr.uns.ac.rs

if ($brredova>0)

{

$red = mysqli_fetch_array($rezultatupita);

$putaizvucen=$red['IzasaoPuta'];

$nizstat[$i]=$putaizvucen;

}

}

return $nizstat;

}

function __destruct()

{

//uništavanje objekta/promenljive iz memorije, prvi način:

//unset($this->konekcijabp);

//unset($this->objkonekcijas);

//drugi način:

//$this->konekcijabp=null;

//treći način, preko poziva metode za zatvaranje konekcije

//pozivanje metode za otvaranje konekcije do baze

if (!mysqli_close($this->konekcijabps))

{

$this->konekcijabps = null;

}

}

}

?>

Page 85: SEMINARSKI RAD - tfzr.uns.ac.rs

Opis testiranja softvera

Testiranje softvera je izvršeno na dva načina: funkcionalno prilikom povezivanja korisničkog interfejsa i srednjeg aplikacionog sloja i pojedinih funkcija klasa srednjeg sloja kreiranjem studije slučajeva testiranja.

Testiranje izvršavanja metode klase Kombinacija:

ProveraDaLiSuBrUnetiOk($broj1, $broj2, $broj3, $broj4, $broj5, $broj6, $broj7) Slučajevi testiranja:

Broj slučaja

Opis slučaja Test podaci Očekivani rezultat

Trenutni rezultat

Status

(uspeh/neuspeh)

#1.1 Provera da li je kombinacija ispravno uneta? Potrebno je zadovoljitiuslove:

a)broj1<broj2<broj3<broj4<broj5<broj6<broj7

b)svi uneti brojevi treba da su u rasponu od 1 do 39

Sedmi broj je veći od 39.

39, 17, 20, 22,

29, 30, 44

Kombinacija

nije dobro

uneta.

Kombinacija

nije dobro

uneta.

uspeh

#1.2 Provera da li je kombinacija ispravno uneta? Potrebno je zadovoljitiuslove:

a)broj1<broj2<broj3<broj4<broj5<broj6<broj7

b)svi uneti brojevi treba da su u rasponu od 1 do 39

Prvi broj je najveći, dok je sedmi broj najmanji.

39, 17, 20, 22,

29, 30, 14

Kombinacija

nije dobro

uneta.

Kombinacija

nije dobro

uneta.

uspeh

#1.3 Provera da li je kombinacija ispravno uneta? Potrebno je zadovoljitiuslove:

a)broj1<broj2<broj3<broj4<broj5<broj6<broj7

b)svi uneti brojevi treba da su u rasponu od 1 do 39

Ispravno unetih sedam brojeva.

14, 17, 20, 22,

29, 30, 39

Kombinacija je

dobro uneta.

Kombinacija

je dobro

uneta.

uspeh

Page 86: SEMINARSKI RAD - tfzr.uns.ac.rs

Testiranje izvršavanja metode klase Kombinacija:

ProveraDaliSuBrIzvuceni($pBr1, $pBr2, $pBr3, $pBr4, $pBr5, $pBr6, $pBr7)

Slučajevi testiranja:

Broj slučaja

Opis slučaja Test podaci Očekivani rezultat

Trenutni rezultat

Status

(uspeh/neuspeh)

#2.1 Provera da li je kombinacija

već među izvučenim i

memorisanim

kombinacijama?

Kombinacija je već

memorisana u bazi.

14, 17, 20, 22, 29,

30, 39

Kombinacija je

već izlazila

Kombinacija

jeste

pronađena u

bazi

podataka.

uspeh

#2.2 Provera da li je kombinacija

već među izvučenim i

memorisanim

kombinacijama?

Kombinacija nije

memorisana u bazi.

14, 17, 20, 22, 29,

30, 38

Kombinacija

nije izlazila

Kombinacija

nije

pronađena u

bazi

podataka.

uspeh

Page 87: SEMINARSKI RAD - tfzr.uns.ac.rs

Rad sa Git/Github sistemom

Kreiran je repozitorijum – Github.com/ TFZRMP-RSOK-2021

Učesnici projekta: 1. Kazi Zoltan (creator repozitorijuma) 2. Aleksandra Simić, 3. Vuk Kovačević, 4. Gatarić Saša

Kreriane grane: 1. Korisnički interfejs, 2. Srednji aplikacioni sloj, 3. Baza podataka

Prikaz projekta u repozitorijumu metodom Kanban kartica:

Prikaz broja Commit-a po granama, srednji aplikacioni sloj, ukupno 7 Commit-a:

Page 88: SEMINARSKI RAD - tfzr.uns.ac.rs

Prikaz broja Commit-a po granama, sloj podataka, ukupno 3 Commit-a:

Prikaz broja Commit-a po granama, sloj korisničkog interfejsa, ukupno 3 Commit-a:

Page 89: SEMINARSKI RAD - tfzr.uns.ac.rs

Prikaz osnovne, Main grane, nakon spajanja svih grana:

Page 90: SEMINARSKI RAD - tfzr.uns.ac.rs

Spajanje grana je izvršeno nakon završetka postavljanja (Push) svih datoteka na granama opcijom Pull.

Postavljena GPL licenca na osnovu šablona koji se već nalaze na Github.com, kreirana je datoteka:

LICENCE.TXT

Page 91: SEMINARSKI RAD - tfzr.uns.ac.rs

6. KORIŠTENI ALATI I SOFTVERI

• MySQL sistem za rukovanje bazama podataka,

• PHPMyAdmin web aplikaciju za administraciju baze podataka,

• Appache web server,

• PHP programski jezik za srednji aplikacioni sloj,

• Editor programskog koda: Visual Studio Code,

• PHP/HTML/CSS/JS za korisnički interfejs (KI), uz korišćenje Bootstrap radnog okvira.

7. LITERATURA

Državna lutrija Srbije, 2019., https://www.lutrija.rs/LottoGame

Github repozitorijum, 2020., https://github.com/

W. Jason Gilmore Beginning PHP and MySQL: From Novice to Professional, Fourth Edition Copyright © 2010 by

W. Jason Gilmore Apress, USA.

Fabio Cimo, Bootstrap Programming Cookbook, Web Code Geeks.