| Server IP : 93.86.61.54 / Your IP : 216.73.216.60 Web Server : Apache/2.4.62 (Ubuntu) System : Linux rasin.ddns.net 6.8.0-124-generic #124~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Tue May 26 21:05:19 UTC x86_64 User : www-data ( 33) PHP Version : 8.4.22 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /var/www/html/projects/cslinfo/ |
Upload File : |
<?php
/**
* Globalne funkcije aplikacije.
*
* @package CSLInfo
* @subpackage Funkcije
* @category Include
* @author Marina Terzic <terzic.marina@gmail.com>
* @copyright Laboratorija za racunarsku tehniku, Tehnicki fakultet Cacak <csl@tfc.kg.ac.rs>
*/
/**
* Slanje SQL upita i vracanje dobijenog rezultata ili samo konekcije.
*
* @param string $sql String upita koji se salje.
* @param bool $samoKonekcija Da li se vraca samo konekcija ili rezultat upita.
* @return mixed Rezultat upita.
*/
function upit($sql, $samoKonekcija = false){
/**
* Konekcija na MySQL bazu za parametre date u 'config.php'
*/
$konekcija = mysqli_connect(DB_HOST, DB_KORISNICKO_IME, DB_LOZINKA, 'cslinfo') or die('Neuspesna konekcija: '.mysqli_error());
/*
* Selektovanje odgovarajuce baze
*/
// mysqli_select_db(DB_NAZIV_BAZE);
/*
* Postavljanje enkodinga i kolacije pred slanje svakog upita kako ne bi dolazilo do problema sa nasim slovima
*/
mysqli_query($konekcija, 'set names '.DB_ENKODING) or die('Neuspelo postavljanje enkodinga: '.mysqli_error());
mysqli_query($konekcija, 'set collation_connection='.DB_KOLACIJA) or die('Neuspelo postavljanje kolacije: '.mysqli_error());
/*
* Slanje upita. Ukoliko je prilikom pozivanja funkcije prosledjen i parametar '$samoKonekcija' koji ima podrazumevanu
* vrednost false onda se umesto rezultata upita pozivaocu vraca samo konekcija na bazu.
* U suprotnom vraca se kompletan set rezultata.
*/
if($samoKonekcija){
return $konekcija;
} else {
$rezultat = mysqli_query($konekcija, $sql) or die('Neuspeo upit: '.mysqli_error());
}
return $rezultat;
}
/**
* Provera ispravnosti unetih podataka u formu za dodavanje novog clana.
*
* @param array $forma Prosledjena POST forma iz forme za dodavanje clanova.
* @return array Niz sa rezultatima provere.
*/
//*****************************************************************************************/
function formaProveraDodavanje($forma) {
$greske = array(
'IME_NEDOSTAJE' => true,
'IME_NEISPRAVNO' => true,
'PREZIME_NEDOSTAJE' => true,
'PREZIME_NEISPRAVNO' => true,
'EMAIL_NEDOSTAJE' => true,
'EMAIL_NEISPRAVAN' => true,
'EMAIL_POSTOJI' => true
);
$ime = trim($forma['formaIme'] ?? '');
$prezime = trim($forma['formaPrezime'] ?? '');
$email = trim($forma['formaEmail'] ?? '');
// 1. Provera Imena (prihvata slova, razmake i crtice)
if (strlen($ime) > 0) {
$greske['IME_NEDOSTAJE'] = false;
}
if (preg_match('/^[ \pL\-]+$/u', $ime)) {
$greske['IME_NEISPRAVNO'] = false;
}
// 2. Provera Prezimena
if (strlen($prezime) > 0) {
$greske['PREZIME_NEDOSTAJE'] = false;
}
if (preg_match('/^[ \pL\-]+$/u', $prezime)) {
$greske['PREZIME_NEISPRAVNO'] = false;
}
// 3. Provera Emaila
if (strlen($email) > 0) {
$greske['EMAIL_NEDOSTAJE'] = false;
}
if (function_exists('proveraEmaila')) {
if (proveraEmaila($email)) {
$greske['EMAIL_NEISPRAVAN'] = false;
}
} else if (filter_var($email, FILTER_VALIDATE_EMAIL)) {
$greske['EMAIL_NEISPRAVAN'] = false;
}
// 4. Provera postojanja Email-a u bazi
$konekcija = upit('', true);
if (is_object($konekcija) || is_resource($konekcija)) {
$emailClean = mysqli_real_escape_string($konekcija, $email);
} else {
$emailClean = addslashes($email);
}
$sql = "SELECT idClana FROM clanovi WHERE email='" . $emailClean . "'";
$rezultat = upit($sql);
if ($rezultat && mysqli_num_rows($rezultat) === 0) {
$greske['EMAIL_POSTOJI'] = false;
}
// 5. Provera fotografije (ako je poslata)
if (isset($_FILES['formaFotografija']) && $_FILES['formaFotografija']['error'] === UPLOAD_ERR_OK) {
global $dozvoljeniFotoFormati;
if (is_array($dozvoljeniFotoFormati) && !in_array($_FILES['formaFotografija']['type'], $dozvoljeniFotoFormati, true)) {
$greske['NEDOZVOLJEN_FORMAT'] = true;
}
} else if (isset($_FILES['formaFotografija']['error']) && $_FILES['formaFotografija']['error'] !== UPLOAD_ERR_NO_FILE) {
$greske['GRESKA_PRI_UPLOADU_FAJLA'] = true;
}
return $greske;
}
/*******************************************************************************************************/
function proveraEmaila($email) {
/*
* Ukoliko prosledjena email adresa ne ispunjava uslov naveden regularnim izrazom funkcija indikuje neispravan mail (false)
*/
if(!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $email)){
return false;
}
return true; //... u suprotnom mail je sintaksicki ispravan (true)
}
/**
* Dodavanje novog clana u bazu clanova.
*
* @param array $forma Forma sa podacima o clanu koji se dodaje
* @param string $kodFotografije Ukoliko je prosledjen parametar sadrzi naziv koda fotografije pridruzene clanu.
*/
function dodavanjeClana($forma, $kodFotografije = ''){
// Generisanje jedinstvenog idKoda
$emailForma = $forma['formaEmail'] ?? '';
$duzinaKoda = defined('DUZINA_ID_KODA') ? DUZINA_ID_KODA : 15;
$idKod = substr(sha1($emailForma), 10, $duzinaKoda);
// Pribavljanje konekcije sa bazom
$konekcija = upit('', true);
// Priprema podataka za upit (escape-ovanje radi bezbednosti)
if (is_object($konekcija) || is_resource($konekcija)) {
$idKodClean = mysqli_real_escape_string($konekcija, $idKod);
$imeClean = mysqli_real_escape_string($konekcija, $forma['formaIme'] ?? '');
$prezimeClean = mysqli_real_escape_string($konekcija, $forma['formaPrezime'] ?? '');
$adresaClean = mysqli_real_escape_string($konekcija, $forma['formaAdresa'] ?? '');
$mestoClean = mysqli_real_escape_string($konekcija, $forma['formaMesto'] ?? '');
$postanskiBrojClean = mysqli_real_escape_string($konekcija, $forma['formaPostanskiBroj'] ?? '');
$telefonClean = mysqli_real_escape_string($konekcija, $forma['formaTelefon'] ?? '');
$emailClean = mysqli_real_escape_string($konekcija, $emailForma);
$kodFotoClean = mysqli_real_escape_string($konekcija, $kodFotografije);
} else {
$idKodClean = addslashes($idKod);
$imeClean = addslashes($forma['formaIme'] ?? '');
$prezimeClean = addslashes($forma['formaPrezime'] ?? '');
$adresaClean = addslashes($forma['formaAdresa'] ?? '');
$mestoClean = addslashes($forma['formaMesto'] ?? '');
$postanskiBrojClean = addslashes($forma['formaPostanskiBroj'] ?? '');
$telefonClean = addslashes($forma['formaTelefon'] ?? '');
$emailClean = addslashes($emailForma);
$kodFotoClean = addslashes($kodFotografije);
}
$sada = date('Y-m-d H:i:s');
// SQL upit za unos u bazu
$sql = "INSERT INTO clanovi
(idClana, idKod, ime, prezime, poslednjaPrijava, poslednjaOdjava, adresa, mesto, postanskiBroj, telefon, email, kodFotografije)
VALUES
(NULL, '{$idKodClean}', '{$imeClean}', '{$prezimeClean}', '{$sada}', '{$sada}', '{$adresaClean}', '{$mestoClean}', '{$postanskiBrojClean}', '{$telefonClean}', '{$emailClean}', '{$kodFotoClean}')";
// Izvršavanje upita
upit($sql);
}
function listaClanova(){
/**
* SQL upit kojim se ucitava lista clanova iz baze. Uz pomoc date_FORMAT datumi smesteni u bazi se automatski
* formatiraju da budu u obliku DD.MM.GGGG. U isto vreme (poslednjaOdjava - poslednjaPrijava) predstavlja razliku
* vremena u sekundama tj. ako se clan odjavio recimo 5 sekundi posle prijave razlika ce biti 5. Rezultat te razlike
* se smesta u promenjljivu 'prisutan'. Pozitivna vrednost za 'prisutan' znaci da je clan jos uvek prisutan, negativna
* da je odsutan a nula znaci da clan nije nikada ni odjavljivan ni prijavljivan.
*/
$sql = "SELECT idClana, ime, prezime, date_FORMAT(poslednjaPrijava, '%d.%m.%Y. %H:%i:%s') AS poslednjaPrijava, date_FORMAT(poslednjaOdjava, '%d.%m.%Y. %H:%i:%s') AS poslednjaOdjava, (poslednjaOdjava - poslednjaPrijava) as prisutan FROM clanovi";
/*
* Upit.
*/
$rezultat = upit($sql);
/*
* Ukoliko je lista clanova (rezultat upita) prazna...
*/
if(!mysqli_num_rows($rezultat)){
return false; //...vraca se false
} else {
/*
* Ukoliko lista nije prazna...
*/
$clanovi = array();
/*
* ...za svaki od redova zapisa rezultata dok se ne dodje do kraja rezultata...
*/
while($zapis = mysqli_fetch_assoc($rezultat)){
/*
* ...se proverava da kojim slucajem nije jednak nuli (novi clan koji nije nikad prijavljen/odjavljen)...
*/
if((int) $zapis['prisutan'] == 0){
/*
* ... ukoliko jeste onda se ne ispisuju datumi poslednje prijave/dojave (jer su za nove clanove isti)
* vec se odredjene vrednosti za tog clana menjaju sa '- / -' cisto estetski.
*/
$zapis['poslednjaPrijava'] = '- / -';
$zapis['poslednjaOdjava'] = '- / -';
}
/*
* Podaci za svakog clana se smestaju u jedan visdimenzioni niz.
*/
$clanovi[] = $zapis;
}
}
/*
* Pozivaoc funkcije dobija rezultate u obliku visedimenzionog niza.
*/
return $clanovi;
}
/**
* Ucitava iz baze podataka detalje za clana sa navedenim 'idClan' brojem.
*
* @param int $idClana identifikacioni broj clana ciji se detalji zahtevaju.
* @return array Niz sa detaljima o clanu
*/
function detaljiClana($idClana){
/**
* SQL upit kojim se ucitavaju detaljni podaci o clanu iz baze
*/
$sql = "SELECT idClana, idKod, ime, prezime, date_FORMAT(poslednjaPrijava, '%d.%m.%Y. %H:%i:%s') AS poslednjaPrijava, date_FORMAT(poslednjaOdjava, '%d.%m.%Y. %H:%i:%s') AS poslednjaOdjava, adresa, mesto, postanskiBroj, telefon, email, kodFotografije FROM clanovi WHERE idClana=".(int)$idClana;
/*
* Upit.
*/
$rezultat = upit($sql);
/*
* Ukoliko nema rezultata za navedeni 'idClan' broj...
*/
if(!mysqli_num_rows($rezultat)){
return false; //... pozivaoc funkcije dobija povratnu vrednost false...
} else {
/*
* ... u suprotnom se iz rezultata uzima prvi red...
*/
$zapis = mysqli_fetch_assoc($rezultat);
/*
* ... i vraca pozivaocu u obliku jednodimenzionog asocijativnog niza...
*/
return $zapis;
}
}
/**
* Promena statusa (odjava/prijava) clana.
*
* @param string $idClana Id clana kome se menaj status
* @param string $tipIzmene Indikuje ko je izvor izmene ('kod' ili 'manuelno')
* @return string $tipDogadjaja String sa oznakom tipa promene statusa koja je izvrsena ('prijava' ili 'odjava')
*/
function promenaStatusa($idClana, $tipIzmene){
/**
* SQL upit kojim se ucitavaju odredjeni podaci o clanu iz baze na osnovu kojih se proverava
* da li je clan kojem se menja status trenutno prisutan ili ne.
*/
$sql = "SELECT (poslednjaOdjava - poslednjaPrijava) AS prisutan FROM clanovi WHERE idClana=".(int)$idClana;
/*
* Upit.
*/
$rezultat = upit($sql);
/*
* Ukoliko kojim slucajem nema rezultata (nema clana sa prosledjenim 'idClana' parametrom)...
*/
if(!mysqli_num_rows($rezultat)){
/*
* ... pozivalac funkcije dobija kao rezultat funkcije false...
*/
return false;
} else {
/*
* ... u suprotnom ucitava se prvi (i jedini) red podataka iz rezultata upita.
*/
$zapis = mysqli_fetch_assoc($rezultat);
/*
* Odredjivanje dosadasnjeg statusa clana i regulisanje novog.
*/
if(((int)$zapis['prisutan'] == 0) || ((int)$zapis['prisutan'] > 0)){
/*
* Clan do sada nije ni prijavljivan ni odjavljivan (samo registrovan)
* ili je poslednja promena statusa bila odjava.
* Treba ga prijaviti.
*/
/**
* String upita kojim ce se promeniti status u tabeli clanovi
*/
$sql_clanovi = "UPDATE clanovi SET poslednjaPrijava = NOW() WHERE idClana=".(int)$idClana;
/**
* String upita kojim ce se novi dogadjaj (promena statusa) upisati u tabelu istorija.
*/
$sql_istorija = "INSERT INTO istorija (idDogadjaja, datumDogadjaja, tipDogadjaja, tipIzmene, clanovi_idClana) VALUES (NULL, NOW(), 'prijava', '{$tipIzmene}', {$idClana})";
/*
* Tip dogadjaja koji ce se dogoditi je 'prijava'
*/
$tipDogadjaja = 'prijava';
} else {
/*
* Clan je pri poslednjem menjanju statusa bio prijavljen.
* Treba ga odjaviti.
*/
/**
* String upita kojim ce se promeniti status u tabeli clanovi
*/
$sql_clanovi = "UPDATE clanovi SET poslednjaOdjava = NOW() WHERE idClana=".(int)$idClana;
/**
* String upita kojim ce se novi dogadjaj (promena statusa) upisati u tabelu istorija.
*/
$sql_istorija = "INSERT INTO istorija (idDogadjaja, datumDogadjaja, tipDogadjaja, tipIzmene, clanovi_idClana) VALUES (NULL, NOW(), 'odjava', '{$tipIzmene}', {$idClana})";
/*
* Tip dogadjaja koji ce se dogoditi je 'odjava'
*/
$tipDogadjaja = 'odjava';
}
/*
* Slanje upita.
*/
upit($sql_clanovi); //promena statusa u tabeli 'clanovi'
upit($sql_istorija); //evidentiranje promene statusa u tabeli 'istorija'
/*
* Pozivalac funkcije dobija podatak da li je izvrsena 'prijava' ili 'odjava'
*/
return $tipDogadjaja;
}
}
/**
* Provera ispravnosti podataka prosledjenih formom za identifikaciju.
*
* @param array $forma Podaci iz forme (u ovom slucaju samo jedan - identifikacioni kod)
* @return array $greske Niz sa statusom potencijalnih gresaka sa unetim podacima u formi.
*/
function formaProveraIdentifikacija($forma){
/*
* Asocijativni niz sa potencijalnim greskama koje mogu da jave u vezi prosledjenih podataka.
* Sistem bele liste, sve je neispravno dok se ne dokaze suprotno.
*/
$greske = array(
'ID_BROJ_NIJE_UNET' => true,
'NEPOSTOJECI_ID_BROJ' => true
);
/*
* Da li je duzina identifikacionog koda veca od nule?
*/
if(strlen(trim($forma['idKod']))){
$greske['ID_BROJ_NIJE_UNET'] = false;
}
$konekcija = upit('', true); //konekcija potrebna za 'mysql_real_escape_string' u sledecem redu.
/*
* Iz baze podataka se ucitava 'idClana' za koji je vezan prosledjeni identifikacioni kod.
*/
$sql = "SELECT idClana FROM clanovi WHERE idKod='".mysqli_real_escape_string($konekcija, $forma['idKod'])."'";
$rezultat = upit($sql);
/*
* Ukoliko ima rezultata (clan sa navedenim identifikacionim kodom postoji)...
*/
if(mysqli_num_rows($rezultat)){
/*
* ... evidentira se postojanje takvog clana.
*/
$greske['NEPOSTOJECI_ID_BROJ'] = false;
}
/*
* Pozivaocu funkcije se prosledjuju rezultati provere.
*/
return $greske;
}
/**
* Ucitavanje istorije promene statusa prijava/odjava.
*
* @param string $datum Ukoliko je prosledjen predstavlja datum za koji se trazi pregled istorije.
* @return array Visedimenzioni niz sa rezultatima upita istorije za zadati dan ili za poslednje izvrsene prijave/odjave.
*/
/*********************************************************************************************/
function ucitavanjeIstorije($datum = ''){
/*
* Obezbeđujemo limit prikazivanja, u slučaju da konstanta nije definisana
*/
$limit = defined('PRIKAZA_ZA_ISTORIJU') ? PRIKAZA_ZA_ISTORIJU : 50;
/*
* Ukoliko kao parametar nije prosledjeno nista funkciji...
*/
if($datum == ''){
/*
* ... vrsi se ucitavanje poslednjih izmena statusa (definisano limitom)
* Precizirali smo iz koje tabele se vuce koja kolona kako bi izbegli "ambiguous" gresku.
*/
$sql = "SELECT DATE_FORMAT(istorija.datumDogadjaja, '%d.%m.%Y. %H:%i:%s') AS datumDogadjaja,
istorija.tipDogadjaja,
istorija.tipIzmene,
clanovi.idClana,
clanovi.ime,
clanovi.prezime
FROM istorija
LEFT JOIN clanovi ON istorija.clanovi_idClana = clanovi.idClana
ORDER BY istorija.datumDogadjaja DESC
LIMIT {$limit}";
} else {
/*
* ...u suprotnom prikazuju se sve promene statusa za navedeni datum.
*/
$konekcija = upit('', true);
if (is_object($konekcija) || is_resource($konekcija)) {
$datumClean = mysqli_real_escape_string($konekcija, $datum);
} else {
$datumClean = addslashes($datum);
}
$sql = "SELECT DATE_FORMAT(istorija.datumDogadjaja, '%d.%m.%Y. %H:%i:%s') AS datumDogadjaja,
istorija.tipDogadjaja,
istorija.tipIzmene,
clanovi.idClana,
clanovi.ime,
clanovi.prezime
FROM istorija
LEFT JOIN clanovi ON istorija.clanovi_idClana = clanovi.idClana
WHERE istorija.datumDogadjaja LIKE '{$datumClean}%'
ORDER BY istorija.datumDogadjaja DESC";
}
/*
* Upit.
*/
$rezultat = upit($sql);
/*
* Ukoliko nema rezultata pozivaocu se vraca false...
*/
if(!$rezultat || mysqli_num_rows($rezultat) === 0){
return false;
} else {
/*
* ...a ukoliko ih ima onda se svi smestaju u novi asocijativni visedimenzioni niz.
*/
$istorija = array();
while($zapis = mysqli_fetch_assoc($rezultat)){
$istorija[] = $zapis;
}
return $istorija;
}
}
/*************************************************************************************************
* Vraca listu svih datuma za koje postoji makar i jedan jedini unos u tabelu istorije.
*/
function listaDatumaIstorije(){
/*
* Upit kojim se iz tabele 'istorija' uzimaju samo razlicite vrednosti datuma.
* Dodatno se za potrebe kreiranja asocijativnog niza formatiraju i dva podatka ('datumIndeks' i 'datumVrednost')
* kojima se formira asocijativni niz koji ce se kasnije koristiti za formiranje select boxa.
*/
$sql = "SELECT DISTINCT date_FORMAT(datumDogadjaja, '%d.%m.%Y.') AS datumIndeks, date_FORMAT(datumDogadjaja, '%Y-%m-%d') AS datumVrednost FROM istorija";
/*
* Upit.
*/
$rezultat = upit($sql);
/**
* Visedimenzioni asocijativni niz sa elementima u obliku ($datumi['2009-12-03'] = '03.12.2009.')
* koji ce se koristiti za select box
*/
$datumi = array();
while($zapis = mysqli_fetch_assoc($rezultat)){
$datumi[] = $zapis;
}
/*
* Vracanje liste sa datumima
*/
return $datumi;
}
/**
* Provera da li je trenutni posetilac ulogovan kao administrator.
*
* @return bool Da li je trenutni korisnik administrator ili ne?
*/
function administratorskaProvera(){
// Pokrećemo sesiju ako već nije pokrenuta
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
// 1. Prva brza provera preko $_SESSION promenljive
if (isset($_SESSION['admin']) && $_SESSION['admin'] === true) {
return true;
}
// 2. Provera preko baze podataka (registar tabele) i IP adrese
$loginPodaci = array(
'adminSesija' => '',
'adminIP' => ''
);
$sql = "SELECT naziv, vrednost FROM registar WHERE naziv = 'adminSesija' OR naziv = 'adminIP'";
$rezultat = upit($sql);
if ($rezultat) {
while ($zapis = mysqli_fetch_assoc($rezultat)) {
$loginPodaci[$zapis['naziv']] = $zapis['vrednost'];
}
}
$trenutnaSesija = session_id();
$ipAdresa = $_SERVER['REMOTE_ADDR'] ?? '';
// Proverava se da li sesija i IP adresa odgovaraju onima iz baze (koristimo == za poređenje)
if (!empty($loginPodaci['adminSesija']) &&
$loginPodaci['adminSesija'] === $trenutnaSesija &&
$loginPodaci['adminIP'] === $ipAdresa) {
// Zapamti u sesiji radi brže provere ubuduće
$_SESSION['admin'] = true;
return true;
}
return false;
}
function formaProveraLogin($forma){
/**
* Flag registar provere ispravnosti prosledjenie forme po sistemu bele liste. To znaci da se u pocetku
* pretpostavlja da nijedan uslov ispavnosti prosledjenih podataka nije ispunjen dok se ne dokaze suprotno.
*/
$greske = array(
'KORISNICKO_IME_NIJE_UNETO' => true,
'LOZINKA_NIJE_UNETA' =>true,
'POGRESNI_ADMIN_PARAMETRI' => true
);
/*
* Da li je korisnicko ime uneto?
*/
if(strlen(trim($forma['korisnickoIme']))){
$greske['KORISNICKO_IME_NIJE_UNETO'] = false;
}
/*
* Da li je lozinka uneta?
*/
if(strlen(trim($forma['lozinka']))){
$greske['LOZINKA_NIJE_UNETA'] = false;
}
/*
* Da li uneto korisnicko ime i lozinka odgovaraju parametrima unesenim u 'config.php' fajlu?
*/
if(($forma['korisnickoIme'] == ADMIN_KORISNICKO) && ($forma['lozinka'] == ADMIN_LOZINKA)){
$greske['POGRESNI_ADMIN_PARAMETRI'] = false;
}
/*
* Pozivaocu se vracaju podaci o ispravnosti prosledjenih podataka.
*/
return $greske;
}
/**
* Evidencija prijave administratora na sistem.
*/
function administratorskaPrijava(){
/*
* POdaci trenutno aktivnog korisnika (sesija i IP adresa) se upisuju kao novi vazeci autentifikacioni podaci
* za administratora.
*/
$sql_sesija = "UPDATE registar SET vrednost = '".session_id()."' WHERE naziv = 'adminSesija'";
$sql_ip = "UPDATE registar SET vrednost = '".htmlentities($_SERVER['REMOTE_ADDR'], ENT_QUOTES, 'utf-8')."' WHERE naziv = 'adminIP'";
/*
* Upiti idu odvojeno jer se upis vrsi u dve razlicite kolone ('adminSesija' i 'adminIP')
*/
upit($sql_sesija);
upit($sql_ip);
}
/**
* Odjavljivanje administratora sa sistema.
*/
function administratorskaOdjava(){
/*
* U tabelu 'registar' se upisuju prazne vrednosti za administratorsku sesiju i adminisratorski IP
* cime se administrator smatra odjavljenim.
*/
$sql_sesija = "UPDATE registar SET vrednost = '' WHERE naziv = 'adminSesija'";
$sql_ip = "UPDATE registar SET vrednost = '' WHERE naziv = 'adminIP'";
/*
* Odvojeni upiti zato sto se upis vrsi u dve odvojene kolone.
*/
upit($sql_sesija);
upit($sql_ip);
/*
* Nakon odjave vrsi se promena vrednosti sesije korisnika koji se odjavio kako
* ,ako bi se eventualno ponovo prijavio naknadno, ne bi bila koriscena ista sesija kao i pre odjave.
*/
session_regenerate_id();
}
/**
* Cisti prosledjene podatke od potencijalnog malicioznog koda pretvarajuci sve vrednosti koje tako mogu
* da se predstave u tzv. HTML entitete. Ovo je rekurzivna funkcija!
*
* @param mixed $ulaz Vrednost (potencijalno niz) koji se cisti
* @return mixed $izlaz Ociscene vrednosti.
*/
function ciscenjeIzlaza($ulaz){
/*
* Ukoliko je parametar ('$ulaz') tipa niz onda se za svaki od njegovih elemenata rekurzivno ova funkcija.
*/
if(is_array($ulaz)){
foreach($ulaz as $naziv => $vrednost){
/*
* Da bi ze zadrzala forma nizova vodi se racuna o tipu niza i pozicijama - nazivi (indeksi)
* i vrednosti elemenata izlaznog niza moraju da se poklapaju u potpunosti sa ulaznim nizom.
*/
$izlaz[$naziv] = ciscenjeIzlaza($vrednost);
}
} else {
/*
* Ukoliko '$ulaz' nije tipa niz to znaci da je u pitanju krajnji element koji moze da se obradi.
*/
$izlaz = htmlentities($ulaz ?? '', ENT_QUOTES, 'utf-8');
}
/*
* Vracanje rezultata obrade pozivaocu ili prethodnom nivou rekurzivne funkcije.
*/
return $izlaz;
}
/**
* Promena velicine ulazne fotografije uz postovanje proporcija slike i maksimalno uvelicanje
* u odnosu na dozvoljene maksimalne dimenzije.
*
* @param string $ulaz Apsolutna putanja do fotografije cije se dimenzije menjaju
* @param string $izlaz Apsolutna putanja do fajla u koji ce se smestiti rezultat obrade ulaza (promene velicine)
* @param string $formatFotografije Identifikacija tipa fotografije u MIME formatu.
*/
function promenaVelicineFotografije($ulaz, $izlaz, $formatFotografije){
/*
* U zavisnosti od prosledjene ekstenzije koristi se druga funkcija za kreiranje radnog objekta ('objektFotografije')
*/
switch($formatFotografije){
/*
* Izvorni fajl je JPEG (image/pjpeg obicno prosledjuje Explorer pa i njega treba uzeti u obzir)...
*/
case 'image/jpeg':
case 'image/pjpg':
/*
* '$ulazniFotoObjekt' sada biva popunjen kompletnim sadrzajem izvornog JPEG fajla (binarni podaci)...
*/
$ulazniFotoObjekt = imagecreatefromjpeg($ulaz);
break;
case 'image/png':
/*
* ... ili sadrzajem PNG fajla...
*/
$ulazniFotoObjekt = imagecreatefrompng($ulaz);
break;
case 'image/gif' :
/*
* ... ili sadrzajem GIF fajla.
*/
$ulazniFotoObjekt = imagecreatefromgif($ulaz);
break;
}
/**
* Sirina originalne fotografije pre promene velicine
*/
$sirinaOriginala = imageSX($ulazniFotoObjekt);
/**
* Visina originalne fotografije pre promene velicine
*/
$visinaOriginala = imageSY($ulazniFotoObjekt);
/*
* Odredjivanje proporcije slike i dominantne dimenzije. Osnovno pravilo je da ce nove dimenzije
* uvek biti proporcionalne dimenzijama originala (nece biti recimo 'zgnjecenih slika') pri cemu ce vodi racuna
* da slika dobije maksimalno moguce dimenzije u okviru dozvoljenih vrednosti.
*/
/*
* Ukoliko je sirina fotografije dominantna dimenzija u odnosu na visinu...
*/
if ($sirinaOriginala > $visinaOriginala) {
/*
* ... sirina izlazne slike je maksimalna dozvoljena...
*/
$sirinaIzlaza = FOTO_SIRINA;
/*
* ... a visina se proporcionalno prilagodjava.
*/
$visinaIzlaza = $visinaOriginala * (FOTO_SIRINA / $sirinaOriginala);
}
/*
* Ukoliko je visina dominantna dimenzija ili su sirina i visina originala jednake...
*/
if (($sirinaOriginala < $visinaOriginala) || ($sirinaOriginala == $visinaOriginala)) {
/*
* ...visina izlaza je maksimalna dozvoljena...
*/
$visinaIzlaza = FOTO_VISINA;
/*
* ...a sirina se proporcionalno prilagodjava.
*/
$sirinaIzlaza = $sirinaOriginala * (FOTO_VISINA / $visinaOriginala);
}
/*
* Kreira se novi prazan kontejner objekt '$izlazniFotoObjekt' koji ce sadrzati kranje binarne podatke
* fotografije sa promenjenim dimenzijama.
*/
$izlazniFotoObjekt = ImageCreateTrueColor($sirinaIzlaza,$visinaIzlaza) or die("Ciljni image objekat nije kreiran!");
/*
* Sadrzaj ulaznog kontejner objekta se kopira u izlazni kontejner pri cemu se podaci automatski binarno obradjuju
* i izlazna fotografija automatski menja svoje dimenzije.
*/
imagecopyresampled($izlazniFotoObjekt, $ulazniFotoObjekt, 0, 0, 0, 0, $sirinaIzlaza, $visinaIzlaza, $sirinaOriginala, $visinaOriginala);
/*
* Sadrzaj izlaznog kontejnera se sada upisuje u ciljni privremeni fajl koji ce kasnije biti prebacen
* na odgovarajucu lokaciju.
* Na disku servera se u priveremenom folderu (folder u kome PHP smesta privremene fajlove) kreira fajl
* identicnog imena kao '$ulaz' samo sa pridodatim '_resized' nastavkom.
*/
switch($formatFotografije){
/*
* Tip fomata ulaznog fajla je JPEG...
*/
case 'image/jpeg' :
case 'image/pjpeg' :
/*
* ...kreira se JPEG izlazni fajl...
*/
imagejpeg($izlazniFotoObjekt, $izlaz) or die("JPEG thumbnail nije kreiran!");
break;
/*
* ...ulazni fajl je tipa PNG...
*/
case 'image/png' :
/*
* ...kreira se PNG izlazni fajl...
*/
imagepng($izlazniFotoObjekt, $izlaz) or die("PNG thumbnail nije kreiran!");
break;
/*
* ...ulazni fajl je tipa PNG...
*/
case 'image/gif' :
/*
* ...kreira se GIF izlazni fajl...
*/
imagegif($izlazniFotoObjekt, $izlaz) or die("GIF thumbnail nije kreiran!");
break;
}
/*
* Po zavrsetku obrade treba osloboditi memorisjki prostor koji zauzimaju ulazni i izlazni objekt.
*/
imagedestroy($ulazniFotoObjekt);
imagedestroy($izlazniFotoObjekt);
}
?>