seminarski rad - tfzr.uns.ac.rs
TRANSCRIPT
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)
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
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
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
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
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
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
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
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.
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
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>
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
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
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
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
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
Koncept izgleda osnovnog ekrana softvera:
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:
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:
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.
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.
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.
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.
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.
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:
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.
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) );
/*==============================================================*/ /* 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 );
/*==============================================================*/ /* 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:
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 -->
<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>
<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/>';
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
?>
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
$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');
}
}
?>
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">
<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>
<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) */
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
" 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>
<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*/
$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;
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';
$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;
?>
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>
<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'];
$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 -->
<?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>
<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'>
<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'];
$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>
<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">
<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);
$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;
$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>
</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"];
$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>
<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>
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;
?>
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/>';
}
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.
<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>";
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-
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'];
$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";
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
$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;
}
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';";
$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;
}
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;
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];
$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";
$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
//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);
}
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
//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);
}
}
}
?>
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)
{
$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++;
}
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);
$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
//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);
$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;
//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);
$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
$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;
$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);
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;
}
}
}
?>
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
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
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:
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:
Prikaz osnovne, Main grane, nakon spajanja svih grana:
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
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.