Lucrare de licen ță [614093]
Lucrare de licen ță
MediCare – clinică medicală
online
Autor: Andrei Biolan
Coordonator științific: Conf . Dr. Livia Sangeorzan
Brașov, 2020
Programul de studii :
Informatică
1
Cuprins
CAPITOLUL 1. INTRODUCERE ………………………….. ………………………….. ………………. 2
1.1 Generalități ………………………….. ………………………….. ………………………….. ……… 2
1.2 Obiectiv ………………………….. ………………………….. ………………………….. ………….. 3
1.3 Cerințe funcționale ………………………….. ………………………….. ……………………….. 3
1.4 Posibilități de dezvoltare ………………………….. ………………………….. ………………… 4
CAPITOLUL 2. TEHNOLOGII FOLOSITE ………………………….. ………………………….. ….. 4
2.1 Servere și pagini WEB ………………………….. ………………………….. ………………….. 4
2.2 Limbajul PHP ………………………….. ………………………….. ………………………….. ….. 6
2.3 Framework -ul PHP CodeIgniter ………………………….. ………………………….. ……. 13
2.4 Baze de date ………………………….. ………………………….. ………………………….. …. 15
2.5 Limbajul SQL ………………………….. ………………………….. ………………………….. …. 16
2.6 MySQL ………………………….. ………………………….. ………………………….. …………. 17
CAPITOLUL 3. SPECIFICAȚIILE APLICAȚIEI ………………………….. ………………………. 19
3.1 Prezentare generală ………………………….. ………………………….. ……………………. 19
3.2 Pagina principală ………………………….. ………………………….. ………………………… 21
3.3 Stocarea informațiilor site -ului web ………………………….. ………………………….. .. 22
3.4 Securitatea site-ului web ………………………….. ………………………….. ……………… 24
CAPITOLUL 4. IMPLEMENTAREA ȘI UTILIZAREA APLICAȚIEI …………………………. 26
4.1 Crearea bazei de date folosind utilitarul XAMPP ………………………….. ………….. 26
4.1.1 Crearea unui tabel al bazei de date folosind phpMyAdmin …………………… 27
4.1.2 Restaurarea unei baze de date folosind un fișier cu extensie .sql …………. 29
4.2 Instalarea și rularea aplicației ………………………….. ………………………….. ……….. 29
4.2.1 Interfața utilizatorului ………………………….. ………………………….. ……………… 31
4.2.2 Înregistrea utilizatorului ………………………….. ………………………….. ………….. 31
4.2.3 Conectarea în con tul utilizatorului ………………………….. ………………………… 34
4.2.4 Funcția de recuperare parolă ………………………….. ………………………….. ….. 37
4.3 Tipuri de utilizatori ………………………….. ………………………….. ………………………. 39
4.3.1 Utilizator normal ………………………….. ………………………….. ……………………. 39
4.3.2 Utilizator de tip doctor ………………………….. ………………………….. ……………. 47
4.3.3 Administrator ………………………….. ………………………….. ……………………….. 51
CAPITOLUL 5. CONCLUZII ………………………….. ………………………….. …………………… 57
BIBLIOGRAFIE………………………………………………………………… ……………………………… 58
2
CAPITOLUL 1. INTRODUCERE
1.1 Generali tăți
Trăim într -o societate în care tehnologia evoluează pe zi ce trece și pe parcursul
trecerii timpului și dezvoltării tehnologiei oamenii au devenit dependenți de aceasta. Fie
că vrem, fie că nu, trăim î ntr-o eră digitală în care tehnologia a devenit indispensabilă.
Dezvoltarea rapidă din ultimii ani atât a resurselor hardware, cât și a celor software
a oferit un acces mult mai ușor la orice tip de informație, și totodată la o mai bună
comunicare.
Programarea web, cunoscută deobicei și sub denumirea de web development
joacă un rol foarte important în viața de zi cu zi în care oamenii folosesc rețele de
socializare sau website -uri de tip magazin online, un exemplu arhicunoscut este Amazon
care a reușit să strângă în anul 2019 impresionanta cifră de 150.6 milioane de accesări
prin aplicația sa de mobil. Programarea web se referă la construcția, crearea și
mentenanța site -urilor web. În majoritatea cazurilor include a specte precum design -ul
web, publicarea, programarea web dar și management -ul bazelor de date.
În general se creează o confuzie î ntre termenii de web developer ș i web designer.
Pentru a întelege și a diferenția cât mai bine termenii, un web developer este responsabil
cu utilizarea de componente variate cum ar fi motorul, transmisia, roțile, etc. pentru a
construi o mașină complet -funcțională, în timp ce web designer -ul este responsabil cu
design -ul estetic al mașinii, confortul șoferului și pasagerilor, des ign-ul bord ului, și altele.
Dezvoltarea web are mai multe tipuri de a crea conținutul web. Câteva exempl e
includ codarea paginilor web î ntr-un editor de text, crearea unui website într -un program
de tipul Adobe Dreamweaver sau actualizarea unui blog person al printr -o platformă de
blogging.
Prima diferență pe care orice utilizator o poate observa între codarea unui site web
într-un editor de text și crearea acestuia într -un program dedicat ca cel prezentat mai sus
este că în programul dedicat construirii de site-uri web utilizatorul poate vedea în timp
real modificările aduse paginii web, în timp ce codarea într -un simplu editor de text
necesită mai întai salvarea fișierului cu noile modificări aduse, mai apoi deschiderea
fișierului folosind un browser.
În ultimii ani sistemele de tip CMS sau Content Management System ca
WordPress, Joomla sau Drupal au devenit foarte populare în ceea ce înseamnă pe scurt
web development -ul. Un CMS este pe scurt o întreagă platformă de publicare a site -urilor
web care ajută ut ilizatorii fără prea multe cunoștințe sa creeze web site -uri fără a fi nevoie
de cunoștințe de management -ul bazelor de date sau altele.
Față de un website clasic HTML, un website creat prin intermediul unuI CMS poate
fi modificat foarte ușor fără a fi ne voie de a modifica fișiere manual. Modificările se fac,
de obicei, din pagina de administrare a CMS -ului care este foarte asemănătoare oricărui
editor de text, cum ar fi Microsoft Word.
3
În concluzie, programarea web variază de la crearea de pagini cu text simplu în
editoare de text, la crearea de aplicații complexe bazate pe web, aplicații pentru rețelele
sociale, pentru magazine online și chiar pentru clinici medicale.
1.2 Obiectiv
Îmi propun realizarea unei aplicații web care să vină în ajutorul unei clini ci și
utilizatorii acesteia de la administratorii platformei și până la utilizatorul care face o
programare. Scopul aplicației este de a ușura toate acțiunile pe care un pacient trebuie
să le facă pentru a face programare la un doctor dorit de acesta, toat e acțiunile pe care
un doctor trebuie să le facă in momentul în care pacientul se prezintă la programare, dar
și toate acțiunile pe care angajații clinicii trebuie să le facă pentru a face o programare la
o anumită data calendaristică, la o anumită oră din zi și la un anumit doctor dorit de
pacient.
În principal, rolul aplicației este de a scădea acțiunile pe care oamenii le fac atunci
când vine vorba fie a de a face programare, fie de a accepta și nota programarea pentru
a se ține cont de ea, dar totodată are și scopul să scutească pacienții din păstrarea de
hârtii din care aceștia află problemele de sănătate, recomandările facute de doctor,
acestea putând fi disponibile pentru fiecare programare la care pacientul s -a prezentat
direct din contul personal a l acestora de pe platforma web creată.
1.3 Cerințe funcționale
În momentul în care utilizatorul acceseaz ă website -ul, acesta îl poate utiliza cu un
acces restricționat neavând un cont sau nefiind logat în contul său. Utilizatorul își poate
crea un nou cont utlizând pagina ”Creaz ă cont ”. Contul va fi creat folosind date personale
ale utilizatorului cum ar fi n ume, prenume, telefon, adres ă de e -mail, parolă, și altele.
Principalul scop al aplicației web este administrarea programărilor într -o clinică
medicală. Așadar, utlizatorii vor putea crea cereri de programări noi la doctorii doriți, vor
putea vedea istoric ul programăril or, vor putea vedea tratamentul/ recomandările
doctorului în urma programării și prezentarea pacientului la consult.
Dupa ce pacientul s -a prezentat la consult în urma programării create online
acesta îi poate lăsa o recenzie doctorului fără c a doctorul sa poată vedea cine i -a lăsat
acea recenzie, totul fiind privat și doar administratorii au acces la astfel de date. Această
funcție va motiva doctorii să trateze cât se poate de bine un pacient, astfel ei vor obține
o recenzie bună și nota lor v a crește.
Pe pagina unde utilizatorii își vor filtra lista cu medici în funcție de preferințele lor
vor putea vedea și nota pe care doctorul o are, notă calculată în urma recenziilor lăsate
de pacienți.
4
1.4 Posibilități de dezvoltare
Versiunea site -ului web “MediCare ” – clinică medicală online nu este versiunea
finală. Aplicația web poate fi îmbunătățită continuu, adaugând noi facilități, verificări și
orice pentru a face navigarea și munca administratorilor sau doctorilor mai facilă.
Câteva din posbilitățile de dezvoltare pentru această aplicație web ar fi
următoarele :
Aplicație poate fi dezvoltată și mai mult astfel încât să funcționeze pentru mai multe
clinici, din orașe diferite, astfel și baza de date cu utilizatori are nevoie de mai multe
detalii.
O altă idee de dezvoltare ar putea fi conectarea aplicației web la un API de plată,
astfel utilizatorii pot plăti online, pot avea o balanță în cont și astfel se evită facerea
plății la clinică, se evită folosirea bancnotelor și utilizat orii pot folosi direct interfața
site-ului web pentru a adauga fonduri.
A treia idee de dezvoltare poate fi legată cu a doua idee pentru că având fonduri
în cont, utilizatorii pot cere ca anumite consultații să se faca online, astfel evitând
drumurile pier dute până la locația clinicii.
O alta idee de dezvoltare poate fi crearea unui nou tip de utilizator, asemănător
unui tutore, astfel un utilizator cu o vârstă înaintată sa ofere acces la datele sale,
la programările facute, recomandarile primite și asa mai departe unei alte
persoane din familie.
Acestea sunt doar niște idei de dezvoltare ale aplicației “MediCare ” – clinic ă
medicală online, dar având în vedere progresul foarte rapid al tehnologiei, pot apărea
altele de la o zi la alta.
CAPITOLUL 2. TEHNOLOGII FOLOSITE
Pentru dezvoltarea aplicației web “MediCare – clinic ă medicală online ” au fost
folosite urmatoarele tehnologii:
Servere și pagini Web
Limbajul PHP
Framework -ul PHP CodeIgniter
Baze de date
Limbajul SQL
MySQL
2.1 Servere și pagini WEB
World Wide Web cunoscut de majoritatea utilizatorilor sub denumirea lui
prescurtată și anume WWW este creat pe baza protoculului numit Hypertext Transfer
5
Protocol (HTTP). HTTP este un protocol conceput pentru a transfera informații între
dispozitivele din rețea și ruleaza deasupra altor straturi ale stivei de rețea. Un flux tipic
HTTP implică o mașină client care face o solicitare către un server, care trimite apoi un
mesaj de răspuns. HTTP este denumit protocol fără stare, deoarece fiecare comandă
este exe cutată independent, fără a se cunoaște comenzile pe care le -a primit înainte.
Acesta este principalul motiv pentru care este dificil să implementam web site -uri care
reacționează inteligent la intrarea utilizatorului. Acest punct slab al HTTP -ului este
abordat într -o serie de tehnologii noi precum ActiveX, Java, JavaScript, și altele.
Web-ul este reprezentat de pagini cu informații de pe gazde pe care rulează
programe software de tip web server. În majoritatea cazurilor, gazda este identificat ă
drept server web, afirmație care nu este corectă deoarece server -ul web este un software,
nu calculatorul sau mașina în sine.
Web server se poate referi atât la hardware, cât și la software, sau ambele
funcționând împreună.
1. Pe partea de hardware, un server web este un calculator sau o mașină care
stochează software -ul server -ului web și fișierele componente ale website -ului
(exemplu : fișiere de tip HTML/PHP, imagini, fișiere de tip CSS și fișiere de tip .js, adică
JavaScript). Acesta este conectat la internet și suport ă interschimbarea de date fizice
cu alte device -uri conectate la web.
2. Pe partea de software, un server web deține multe parți care controlează
cum userii accesează fișierele gazdei. Un server HTTP este o parte din software care
întelege URL -uri (adresele web) și protocolul HTTP folosit in browser -uri pentru a
vizualiza pagini web. Gazdele pot fi accesate direct prin nume de domenii (exemplu
google.ro) ale website -urilor deținute și livrează conținutul către utilizatori.
La cel mai mic nivel, în momentul în care browser -ul are nevoie de un fișier hostat
pe un server web, browser -ul trimite un request de fișier prin protocolul HTTP. Când
request -ul ajunge pe server -ul web hardware corect, server -ul software HTTP accept ă
request -ul, găsește documentul cerut și il trimite înapoi direct la browser tot prin HTTP.
De obicei, cand nu este găsit documentul se returneaza o eroare de tip 404.
Pentru publicarea unui website este nevoie fie de un server web static, fie de unul
dinamic.
Un server web de tip static, sau stivă, constă dintr -un calculator (hardware) cu un
server HTTP (software). Îl numim static pentru că server -ul trimite fișierele găzduite
“așa cum sunt ” browser -ului.
Un server web de tip dinamic, const ă dintr -un serv er web static plus un software
suplimentar, cel mai frecvent un server de aplicație și o bază de date. Îl numim
server web de tip dinamic pentru că fișierele găzduite se actualizează înainte de a
fi trimise c ătre browser -ul utilizatorului tot prin server -ul HTTP.
Fișierele solicitate sunt determinate de c ătre browser -ul folosite de utilizator,
browser -ul determină ceea ce trebuie cerut și nu server -ul web. Fișierele pot fi de multe
6
tipuri precum: codul surs ă al paginii HTML, o imagine cu extensie PNG, un fi șier flash,
sau chiar un fișier de tip MP4.
Pe aceeași gazdă pot rula mai multe aplicații, de exemplu pot rula un server WEB,
un server de tip FTP, un server DNS și un server de email SMTP, toate rulând în același
timp. Pentru a asigura buna funcționare a server -ului îi este atribuit un port pentru a
asigura că fiecare server va răspunde cererilor utilizatorilor corespunzători.
Majoritatea serverlor au î n fișierele lor de configurare porturi predefinite. Serverele
web folosesc de obicei portul 80, însă nu e ste o regulă și acesta poate fi schimbat.
Serverele pot fi instalate pe porturi diferite pentru a fi ascunse utilizatorilor simpli, și de
asemenea, pe un calculator / o ma șină pot fi instalate mai multe servere web, fiecăruia
dintre acestea asociindu -se un port diferit.
În aplicația web dezvoltată în acestă lucrare a fost folosit server -ul Web Apache,
folosind utilitarul gratuit Xampp care este cel mai popular mediu de dezvoltare PHP .
2.2 Limbajul PHP
PHP este un acronim pentru “PHP: Hypertext Preprocessor” e ste un limbaj de
scripting open -source HTML, care este utilizat pentru a dezvolta aplicații web dinamice
și interactive , prin integrarea codului PHP în documente HTML salvate cu extensia “.php” .
Totodată este utilizat și ca limbaj de programare cu scop general.
Sintaxa PHP -ului provine din limbaje ca C, Java sau Perl și este ușor de învățat.
Cu ultimele versiuni învățarea acestui limbaj este și mai facilă utilizatorilor pentru că s -a
urmărit a fi un limbaj orientat pe obiecte. Scopul principal al acestul limbaj este a face
paginile web dinamice.
PHP-ul este unul dintre cele mai interesante tehnologii existente în prezent
deoarece îmbină caracteristici cât mai complexe cu simplitatea în utilizare, de aceea a și
devenit rapid un instrument principal pentru dezvoltarea aplicatiilor web dinamice. Limbaj –
ul PHP este unul comod, ușor de învățat și pentru cei care nu au avut în trecut activități
de programare.
Spre deosebire de celălalte limbaje de scripting, cum ar fi JavaScript, limbajul PHP
rulează pe s erver -ul Web, nu în browser -ul Web al utilizatorului. Așa da, limbajul PHP
poate obține accesul la fișiere, la baze de date, dar și la alte resurse care sunt inaccesibile
programului JavaScript. Toate astea constituite surse mari de conținut dinamic, care atrag
utilizatorii.
Noțiuni fundamentale ale limbajului PHP
Spre deosebire un program scris in alte limbaje cum ar fi C / C++ / Python, și altele ,
în loc de a scrie un program cu o mulțime de comenzi pentru a genera un HTML, folosind
limbajul PHP putem ob ține un script HTML, ca cel de mai jos, ce include cod care
realizeaza ceva.
7
Codul PHP este delimitat de coduri de început și de sfârșit ce permit într -un fișier
scris in mod HTML intrarea și ieșirea din modul PHP.
<html>
<head>
<title>Titlu</title>
</head >
<body>
<?php
$firstValue = 1;
echo "Prima valoare este ".$firstValue.", iar valoarea următoare este
".$firstValue+1.".";
?>
</body>
</html>
Codul de mai sus va afișa in browser -ul web al utilizatorului textul : “Prima valoare
este 1, iar valoarea următoare este 2.”
În trecut, majoritatea utilizatorilor considerau limbajul PHP un limbaj server -side
pe când JavaScript era considerat un limbaj de tip client -side care poate fi executat doar
pe anumite browsere web. Însă după versiunea 8, NodeJS și orice alt framework apaărut
a facut limbajul JavaScript capabil de a face o grămada de lucruri pe care doar PHP -ul
obișnuia să le facă. Deci pe măsura ce tehnologiile au evoluat JavaScript -ul acum este
considerat la fel de puternic ca și limbajul PHP.
Unele av antaje ale limbajului JavaScript în fața limbajului PHP sunt că limbajul
JavaScript este capabil să fie utilizat atât pentru front -end cât și pentru back -end, în timp
ce limbajul PHP se poate folosi doar pentru partea de back -end și că limbajul JavaScript
este asincron ceea ce îl face capabil să nu aștepte pentru operații de tip intrare – ieșire,
în timp ce limbajul PHP este sincron și așteapta pentru executarea operațiilor de intrare
– ieșire.
În mare parte folosind limbajul PHP se pot dezvolta multe tipuri de aplicații, însă
este un limbaj care e înclinat spre partea de scripting ce rulează pe un server , deci poate
executa ceea ce execută și un program de tip CGI. Protocolul CGI este cel care permite
unei pagini web sa ruleze un program de tip CGI pe un server de hostare web.
Pe lângă afișarea datelor dintr -o bază de date, colectarea datelor dintr -un formular,
generarea de conținut dinamic sau primirea anumitor cookie -uri din browserele
utilizatorilor limbajul PHP mai poate face și alte activități.
În lume există dou ă domenii principale unde este folosit limbajul PHP sub forma
de scripting :
8
în script -urile ce ruleaz ă pe server
Acest domeniu este cel mai simplist și cel mai folosit pentru limbajul PHP. Pentru
că scripting -ul scris in limbajul PHP s ă funcționeze are nevoie de 3 lucrur i: un server Web,
un interpretor de limbaj PHP, dar și un browser web. Pentru accesare este nevoie ca
server -ul Web să aiba o conexiune de tip PHP instalată, astfel rezultatul poate fi accesat
direct din browser -ul utilizato rului prin intermediul server -ului de tip Web.
în scripting -ul în linie de comandă
Limbajul PHP poate fi rulat fără a fi nevoie de un server Web și de un browser
Web, însă are nevoie de interpretorul de tipul PHP. Acestă metodă folosind doar
interpretorul este folosită în cea mai mare parte pentru scripturile ce trebuie rulate la un
anumit interval de timp, de regulă script -urile de tip cron jobs, scripturi ce sunt programate
să ruleze la un anumit interval de timp.
Limbajul PHP poate fi folosit pe aproape oricare din sistemele de operare mai
cunoscute, incluzând Microsoft Windows, Linux, alte variante de Unix precum OpenBSD,
FreeBSD sau Solaris, sistemul de operare Apple, și anume Mac OS și cu siguranță multe
altele. T otodată limbaul PHP oferă suport pentru majoritatea serverelor Web cunoscute
în prezent cum ar fi Apache, Apache TomCat, Nginx, Netscape, Lightppd, Xitami,
Microsoft Internet Server, OmniHTTPd și multe altele. Așadar, PHP -ul oferă libertatea
utilizatorului de a alege ce sistem de operare și ce server web dorește sau care îi sunt
cunoscute, fără a limita utilizatorul de a alege doar un tip de server web și/sau sistem de
operare.
Totuși, deși în versiunile din prezent ale limbajului PHP se urmărește orientarea
limbajului pe obiecte acesta nu e ste un limbaj complet orientat pe obiecte. Așadar, nu
orice opțiune ce aparține standardului programării orientate pe obiecte poate fi folosită în
versiunea curenta a PHP -ului.
Framework -uri PHP
Totuși pe parcursul dezvoltării atât al industriei informat ice, dar și a limbajelor au
fost create framework -uri ce vin întampinarea programat orilor pentru a le ușura munca.
Un framework este recomandat uno r programatori care nu sunt la î nceput de drum,
pentru ca de exemplu în cazul de față este mult mai greu de î nvățat limbajul PHP folosind
un framework fără a avea cunoștințe ale acestui limbaj dinainte.
Framework -ul PHP este, în esență, un set de clase și funcții scrise î n limbajul PHP
pe care în ultimul timp majoritatea dezvoltatorilor de aplicatii web le folo sesc atunci c ând
creeaza site -uri web.
Framework -urile folosesc paradigma Model -View -Controller care poate fi vazută
ca o extensie la motoarele de șablonare :
Model (model) – modelul con ține codul logic pentru partea de server. Aici
se scriu deobicei part ea de citire și scrierea de date dinspre și spre o bază
de date cu anumite pre -procesări sau modificări.
9
View (partea de vedere) – aici este doar partea pe care utilizatorul site -ului
web o vede și este cea cu care acesta interacționează. De obicei este sc risă
folosind marcaje HTML, însă în funcție de aplicația web dezvoltata poate să
apară și sub forma de XML sau JSON.
Controller (controlor) – un controller este în mare parte codul care
controlează preluarea și afișarea datelor. Întâi acesta intercepteaza URL-ul
accesat de utilizator, în funcție de cod și cerința utilizatorului accesează
metode scris e în partea de model și apoi partea de view pentru a afișa
datele colectate din partea de model utilizatorului pe browser.
Folosirea unui framework este foarte recomandată în fiecare proiect de dezvoltare
a unui site web folosind PHP având anumite avantaje. Mai jos avem câteva argumente
pro și contra folosirii unui framework.
Argumente PRO
1. Se pot dezvolta aplica ții web foarte ușor
2. Permite un ciclu mai rapid de dezvoltare a unei aplicații
3. Programatorii pot face trecerea de la un proiect la altul fără a ține prea mult
cont de structura codului
4. Oferă securitate în partea de SQL injection
5. Codul de baza se va schimba mai rar, facând astfel website -ul mai stabil
6. Salva rea în fișiere de tip logs erorile de PHP / SQL
Argumente CONTRA
1. Unele framework -uri pot avea un mod de învățare destul de greoi
2. în context ul joburilor poate fi găsit mai greu dezvoltator cu experiență strictă
într-un anumit framework
3. Unele frame work -uri prezintă buguri fiind î n stadii beta de dezvoltare
4. Hackerii pot exploată vulnerabilitățile din framework -uri
Însă framework -urile oferă caracteristici pe care limbajul PHP standard nu le poate
oferi. Mai jos avem o listă cu anumite caracteristici mai impor tante pe care framework –
urile le oferă :
Func ții ajutătoare – putem crea diferite funcții ajutătoare care scutesc dezvoltatorul
de a folosi repetitiv anumite părți de cod, inclusiv query -uri către baza de date. Î n
proiectul “MediCare” am folosit astfel de f uncții ajutătoare , un exemplu ar fi în
afișarea di n partea de sus a website -ului numărul de notificări necitite ale
utilizatorului folosind un query către baza de date.
Caching – aici framework -urile ajută bazele de date : când în limbajul standard PHP
folosimd query -uri pentru a cere sau a trimite date de la / la baza de date query -ul
se execută la fiecare accesare a website -ului și asta duce la o creșterea timpului
de încarcare și la suprasolicitarea server -ului pentru baza de date în cazul în care
websit e-ul nostru este accesat de o multitudine de utilizatori în același timp, astfel
10
prin caching se creează anumite fișiere temporare pe server -ul Web care vor fi
folosite la afișarea datelor pentru o perioadă de timp setată de utilizator evitându –
se astfel r epetarea executării query -urilor la fiecare refresh al paginii.
Unit testing
Generare de form ulare – framework -urile ne ajută la crearea de formulare fără a fi
nevoie de a scrie de fiecare dată tot codul HTML necesar, de exemplu, unui
formulare de logare în cont.
Sesiuni – la partea de sesiuni framework -ul ne ajută s ă creă m sesiuni temporare
în momentul în care utilizatorul se loghează, astfel putem menține o securitate
bună utilizatorilor. De obicei, framework -ul creând o sesiune noua unui utilizator în
momentul logării în cont al acestuia, în caz ca utilizator cade în capcana unui
hacker care îi fură datele / cookie -urile sesi unii framework -ul se va “autosesiza ” și
va bloca accesul hacker -ului din amumite motive precum IP diferit, geoloca ție
diferit ă sau browser diferit.
Șablonare – framework -urile ne fac munca mai ușoară și putem folosi diferite tag –
uri lângă anumite variabil e, exemplu de cod :
Name: {$name|capitalize}
La partea de Nume, va fi afi șat conținutul variabilei “$name ” cu litere mari.
Extindere – framework -urile oferă posbilitatea de a folosi librării sau module third –
party compatibile
Admin panel – unele framework -uri oferă management de control asupra accesului
și al autentificării
Interpretarea codului scris PHP
Limbajul PHP î n momentul în care interpretează un fișier trece prin tot conținutul
acestuia până când întâlnește unul din tag -urile spec iale corespunzătoare PHP -ului,
astfel pornește interpretarea textului ca fiind cod scris în limbajul PHP. După parser -ul
execută tot codul găsit, până la găsirea în fișier a unui tag PHP de închidere, care anunț ă
parser -ul opri rea citirii textului î n mod P HP și se trece înapoi la text normal.
Această facilitate a PHP -ului ofera posibilitatea combinarea codului PHP în
interiorul codurilor scrise tip HTML, mai exact: tot ce este în afara tag -urilor PHP este
afișat nemodificat, așa cum este, în timp ce partea scrisă în PHP este interpr etată ca fiind
cod și este afișat în funcție de rezultatul interpretat de limbaj.
Există patru categorii de tag -uri PHP care sunt folosite pentru a marca părțile de
cod scrise în limbajul PHP:
11
1. <?php echo( “Acesta este un mesaj af isat folosind metoda echo din limbajul
PHP.”); ?>
2. <script language=”php”> echo (“text”); </script>
3. <? echo (“text”); ?.
4. <% echo(“tag de stil ASP”); %>
Primul tip de tag PHP (<?php … ?>) este cel mai folosit și este totodată și cel mai
recomandat pentru că oferă posibilitatea folosirea limbajului PHP în cod conform cu
standardul XML.
Altă facilitate a limbajului PHP este posibilitatea de a f olosi structuri combinate
HTML ș i PHP ca în exemplul de mai jos:
<?php
if($variabila) {
?>
<b>True</b>
<?php
} else {
?>
<b>Fals</b>
<?php
}
?>
Structura de mai sus func ționează perfect și asa cum este de așteptat, deoarece
parser -ul din PHP știe când tag -ul de închidere “?>” PHP este folosit și afișeaza ceea ce
întalnește sub forma de HTML până la găsirea unui alt t ag de start cod.
Comentariile în PHP
Limbajul PHP suportă comentarii ca limbajele de tip C / C++.
Exemplu :
1. // comentariu pe o singur ă linie de cod
2. # comentariu de tip Unix pe o linie de cod
3. /*
Comentariu pe mai multe
Linii de cod
*/
12
Închiderea instrucțiunilor în PHP
La fel cum se întample și în alte limbaje precum C sau C++ fiecare instrucțiune
dată în PHP se închide folosind caracterul “;” (punct și virgulă).
<?php echo “Salut!”; ?>
<?php echo “Salut!” ?>
Cele două instrucțiuni sunt echivalen te pentru că deși în al doilea exemplu lipsește
caracterul punct și virgulă este ultima și singura instrucțiune scrisă între cele 2 tag -uri
PHP și tag -ul de închidere reprezinta și sfârșitul instrucțiunii.
Tipurile de date în PHP
Limbajul PHP suportă 10 tipuri de date primitive.
Patru tipuri scalare: boolean, integer, float, string
Patru tipuri compuse: array, object, callable, iterable
Doua tipuri speciale: resource, NULL
Variabilele în PHP
Variabilele în limbajul PHP sunt reprezentate punând în fața nu melelor semnul de
tip dolar ($).
Exemplu : $variabila = 1;
Totodat ă numele variabilelor din PHP sunt case -sensitive.
Variabilele superglobale în PHP
Variabilele superglobale sunt variabile incorporate care sunt mereu disponibile în
toate modurile.
Variabilele superglobale sunt:
$_SERVER – variabila conține informații provenite din headere, locații sau locații
ale scriptului, conținutul acestui array este creat de server -ul Web.
$GLOBALS – conține o referință către toate variabilele care sunt definite în scop
global în script, numele variabilelor sunt cheile array -ului.
$_ENV – reprezintă variabilele pasate script -ului curent prin mediul folosit.
$_REQUEST – reprezintă un array care conține în mod implicit conținutul
variabilelor $_GET, $_POST și $_COOKIE.
$_GET – este un array asociativ de valori pasează script -ului curent prin parametrii
trimiși din URL.
13
$_POST – este un array asociativ care pasează script -ului curent prin metoda
HTTP POST când se folosește “application/x -www -form-urlencoded ” sau
‚multipart/form -data” in request -ul creat.
$_FILES – este un array de iteme încărcate către script -ul curent folosind tot
metoda HTTP POST.
$_COOKIE – este tot un array asociativ cu variabile pasate c ătre script -ul curent
folosind Cookie -urile HTTP.
$_SESSION – reprezin tă variabilele înregistrate de sesiunea curentă a script -ului.
2.3 Framework -ul PHP CodeIgniter
Pentru a crea o aplicație web în limbajul PHP, un programator petrece foarte mult
timp scriind aceleași părți de cod din nou și din nou. Frame work -urile oferă
programatorilor un bloc de pornire și în același timp reduc și cantitatea de cod necesară
pentru a construi un site web.
CodeIgniter este de asemenea un framework PHP de tip MVC (model – view –
controller) utilizat pentru dezvoltarea rapid ă a aplicațiilor web. CodeIgniter oferă în afara
cadrului librării pentru conectarea la baze de date și pentru efectuarea de operațiuni
diverse precum trimiterea de mail -uri folosind servere de tip SMTP, încărcarea de fișiere,
gestionarea sesiunilor, gesti onarea cache -ului și multe altele.
CodeIgniter deși este un framework bazat pe PHP nu este un substitut pentru
limbajul PHP. Crearea unui website folosind CodeIgniter nu înseamnă că programatorul
lasă în urma limbajul PHP și nu îl mai folosește.
Framework -ul prezentat conține biblioteci, o interfață simplă și structura logică
pentru a accesa bliblioteci, plug -in-uri, helperi și alte resurse care rezolvă funcțiile
complexe ale PHP menținând mai ușor performanțe ridicate. Totodat ă simplifică codul
PHP și sco ate la iveală un site web complet interactiv și dinamic într -un timp mult mai
scurt față de crearea unui website în limbajul PHP fără a folosi acest framework.
Framework -ul acceptă versiuni de PHP minim 5.4 sau mai nouă și versiuni de MySQL
5.1 sau mai noi . Practic acest framework face partea de web mult mai robustă și codul
scris este mult mai ușor de citit și de întreținut. CodeIgniter poate fi considerat și ca un
set de instrumente gratuit, de dimensiuni mici și usor de instalat.
Un programator ca re util izează CodeIgniter trebuie să fie familiarizat cu limbajul
PHP. Pentru folosirea acestui framework sunt necesare cunoștințe bune de PHP, cel
puțin sintaxa de bază și modul în care interacționează cu bazele de date și codul HTML.
Compania de software EllisL ab a creat CodeIgniter. Prima versiune a acestui
framework a fost lansată în Februarie 2006. Pe 13 iulie 2013 aceștia au anunțat că nu
vor mai putea oferi resursele necesare dezvoltării acestui produs software, însă un an
mai tarziu proiectul a fost prelua t de Institutul de Tehnologie din Columbia Britanica
denumit și BCIT.
Daca îl comparam cu celălalte framework -uri PHP folosite în momentul de față,
CodeIgniter este poziționat foarte bine raportat la ușurința în utilizare, astfel conform unor
14
statistici ca re datează din anul 2015 este poziționat in top 5 framework -uri la capitolul
popularitate, memorie utilizată sau viteză, întrecând la memorie utilizată unul dintre cele
mai populare framework -uri PHP, și anume Laravel.
Cele 8 motive pentru folosirea acestu i framework sunt :
Gratuitatea framework -ului
Versiunea minima de PHP 5.4
Foarte puțină memorie consumată
Foarte rapid
Structură de tip Model – View – Controller
Documentație completă
Dezvoltarea continuă și suport pentru bug -uri pe github din partea comunității
CodeIgniter se bazează pe un concept URL. Asta înseamnă că partea de
controller, este văzută ca unitate a de control centrală dintre vi ew și model, este accesat
introducând o adresă URL în browser -u web. Dezvoltatorii creează așa -numitele clase
de controlere. Este vorba despre fișiere PHP care conțin diferite funcții utilizate pentru
încărcarea bibliotecilor, pluginurilor sau asistenților, conectarea la bazele de date,
integrarea unui model de date s au căutarea unei vizualizări specifice.
Fluxul de aplicații al CodeIgniter se bazează pe următoarea structură URL:
exemplu.ro/clasă/funcție/parametru. În teorie, o adresa URL de tip CodeIgniter ar putea
arăta în felul următor : exemplu.com/ știri/articol/134 5.
Flow -ul de întelegere este foarte clar, simplu și poate fi descris prin figura 1:
Figura 1
Routing – reprezint ă configurarea routărilor, este foarte simplu de configurat,
fișierul respectiv se găsește în calea: application/config/routing.php din folderul principal
al framework -ului. Framework -ul permite scrierea întregii adrese URL, dar se pot folosi și
expresii de tip RegEx.
Caching – reprezintă unul dintre cele mai importante elemente în dezvoltarea de
aplicați i web. CodeIgniter permite caching atât pe rezultatele din baza de date pentru a
evita repetarea query -urilor la refresh -ul unei pagini, cât și pe partea de view a paginii.
Security – în framework sunt incluse în mod standard caracteristici clasice de
secu ritate PHP cum ar fi: securizarea variabilelor superglobale ($_GET, $_POST,
$_REQUEST, $_COOKIES), securizarea adreselor URL (URI), XSS flitering, protectie
15
CSRF prin intermediul unor tokeni genera ți, dar și validarea formularelor în funcție de
cerințele u tilizatorului.
View – este pagina sau o parte dintr -o pagină (exemplu: header, body, footer).
View -ul este apelat prin intermediul controller -ului folosind sintaxa: $this ->load –
>view(‘exemplu.php’); calea către paginilor de tip view este in application/vie ws.
Application Controller – este partea de controller care se poate extinde prin
CI_Controller (CI acronim pentru CodeIgniter).
Models – partea de model este, în general, folosită pentru manipularea datelor din
baza de date. Modelul extinde modelul de baz a CI_Model și poate fi apelat direct din
controller, însă doar dup ă ce aceasta a fost inițializat fie setat din fișierul autoload.php din
folder -ul config, fie folosind manual în controller sintaxa: $this ->load ->model(‘exemplu’);.
Libraries – putem folosi librării, calea către librării este : application/libraries.
Aceste clase sunt incluse în controller manual folosind sintaxa $this ->load –
>library(‘libraria_mea’);
Helpers – pentru anumite func ții proprii scrise de dezvoltator se pot folosi fișiere
de tip he lper, unde se pot declara toate funcțiile necesare apelării în anumite locuri.
Acest framework are în fișierele standard propriile librării care sunt necesare în
majoritatea proiectelor. Acestea sunt în numar de 30 și printre cele mai importante sunt:
Benchmark, Email, Caching, Form validation, Encrypt, File Upload, și altele.
Motivul principal pentru care CodeIgniter are un consum de memorie foarte mic și
este foarte rapid este pentru că oferă posibilitatea d e a încărca strict ce dezvoltatorul are
nevoie pentru o anumită rută stabilită, fără clase sau alte obiecte suplimentare .
2.4 Baze de date
Bazele de date reprezintă unul dintre cele mai importante aspecte în dezvoltarea
aplicațiilor web. În ultimii ani bazel e de date au jucat un rol impotant atât în modul de
organizare, cât și în modul de funcționare a numeroaselor companii, servicii și instituții.
Acestea se regăsesc în domenii precum comerț, transport, asigurări, învâțământ și multe
altele.
Zilnic interacț ionăm sau desfășurăm activități care implică baze de date fără să ne
dam seama : extragerea unei sume de bani de la bancomat, verificarea soldului contului
bancar, rezervarea unui bilet la teatru, cump ărarea produselor din magazinele online etc.
Bazele de d ate ajung să aibă marimi extrem de mari și există baze de date de la câteva
zeci de înregistrări, de exemplu : agenda unei persoane pentru luna curent ă și se ajunge
la milioane de înregistrări, de exemplu : toate comenzile unui magazin online.
O baz ă de date se poate definii ca o colecție de date corelate din punct de vedere
logic, care reflectă anumite aspecte ale lumii reale și este destinată unui grup de
utilizatori. Bazele de date există și în afara tehnologiei, de exemplu : catalogul elevilor,
16
reprezint ă tot o bază de date care este întreținută manual de un grup de utilizatori, în
exemplul de față de profesori.
Baza de date trebuie să asigure cele 6 aspecte ale datelor :
1. Integritatea
2. Abstractizarea
3. Securitatea
4. Integrarea
5. Partajare a
6. Independen ța
2.5 Limbajul SQL
SQL, acronim provenit de la Structured Query Language (Limbaj Structurat de
Interogare) apărut în anul 1970 este un limbaj de programare specific în lucrul cu bazele
de date care este și în prezent unul dintre cele mai puternice limbaje pentru interog area
cu bazele de date.
Este c onsiderat un limabj declarativ ș i neprocedural pentru că utilizatorul nu
trebuie sa menționeze ce date vrea sa preia și nici nu trebuie să menționeze modalitățile
prin care limbajul ajunge la datele cerute de utilizator. Este lansat inițial de IBM și a fost
standardizat prima oară de ANSI, mai apoi de ISO. Pentru că exista această
standardizare a acestui limbaj, multe sisteme de gestionare a bazelor de date precum
Oracle sau Access recunosc cel puțin instrucțiunile de bază ale acestui limbaj.
Există 3 metode de baza pentru implementarea acestui limbaj:
Încapsulată (Embedded SQL)
Modular ă (Module language)
Apelare directă (Direct invocation)
Deși acest limbaj este un limbaj care are un format liber, o instrucțiune SQl devine
mai lizibilă daca se utilizează urmatoarele:
Începutul fiecărei clauze trebuie să fie aliniat cu celălalte
Fiecare clauză dintr -o instrucțiune SQL trebuie să apară pe o linie nouă;
Dacă o clauză este formată din mai multe părți, fiecare parte trebuie să fie pe o
linie separată și trebuie să fie identată față de începutul clauzei ;
Exemple de comenzi SQL
Deși sintaxa comenzilor de tip SQL este relativ simpl ă folosind cuvinte întregi în
limba engleză în majoritatea cazurilor bazele de date și tabele acestora se creeaza
folosind anumite utilitare sau panouri de administrare, cum ar fi PhpMyAdmin.
CREATE DATABASE exemplu_DB – comanda creeaz ă o bază de date cu numele
“exemplu_DB ”.
17
CREATE TABLE exemplu_tabel
(camp1 tip_dată,
camp2 tip_dată
…) – comanda creează un tabel cu câmpurile, tipurile de date menționate
de utilizator.
Exemplu de query de tip SELECT:
SELECT * FROM `users` WHERE id= “$_SESSION[ ‘logged_in_user_id’] ”; – acest
exemplu de query de tip SELECT preia din baza de date, din tabela `users` datele use r-
ului logat.
Operatori în SQL
Un operator este un cuvant ș i/sau simbol rezervat într -un limbaj ș i folosit pentru a
executa anumite operații. Exista 3 tipuri de operatori:
1. Operatori aritmetici (+, -, *, /, %)
2. Operatori de compara ție (=, !=, <>, <, >, <=, >=, !<, !>)
3. Operatori logici (AND, OR, LIKE, BETWEEN, EXISTS, IS NULL, UNIQUE)
Funcții în SQL
Funcțiile î n SQL sunt de mai multe tipuri și sunt împărțite în funcție de diferite
criterii:
Pentru șiruri de caractere (exemple : LOWER, UPPER, CONCAT, SUBSTR,
LENGTH)
Pentru gestionarea datelor calendaristice (exemple : NEXT_DAY,
CURRENT_DATE, DATE_ADD)
Aritmetice (exemple : SUM, ABS, FLOOR, GREATEST, POWER, SIN)
Pentru diferite conversii (exemple: TO_CHAR(data_calendaristică, ‘format’),
TO_NUMBER(‘caracter’), TO _DATE (‘caracter’, ‘format’ ))
Func țiile sunt folosite pentru manipularea datelor din bazele de date. De obicei
funcțiile acceptă unul sau mai multe argumente și întorc o valoare. Acestea sunt folosite
pentru a modifica anumite date, pentru a converti anumite date, pentru a calcula diferite
date etc.
2.6 MySQL
MySQL este un sistem de gestionare a bazelor de date relaționale, open -source
care este utilizat în majoritatea cazurilor pentru aplicațiile online. MySQL poate gestiona
bazele de date exact ca oric e alt sistem cum ar fi popularul Microsoft Access, însă deși
18
toate aceste sisteme gestionează bazele de date ele pot fi foarte diferite în utilizare, de
la un sistem la altul.
Acest sistem a fost produs de compania MySQL AB, o c ompanie din Suedia
binecunos cută pentru dezvolarea acestui sistem de gestionare. În momentul de față este
cel mai popular SGBD, fiind și open -source și este o componentă cu o foarte mare
importanță în stiva LAMP, acronim format din inițialele aplicațiilor folosite pentru platforma
de găzduire a website -urilor formată din componentele open -source dupa cum urmează :
LAMP – Linux, Apache, MySQL, PHP.
MySQL -ul este folosit în mare parte cu limbajele Java și PHP, însă cu ajutorul lui
se pot crea aplicații în aproape orice limbaj cunoscut, mai toate oferind posibilitatea
conectării la un astfel de SGBD. Putem aminti limbaje precum: C, C#, C++, Python, Java,
Perl etcc., însă fiecare dintre aceste limbaje foloseș te un API specific. Interfața de tip
ODBC oferă posibilitatea limbajelor de programare cum ar fi Visual Basic sau ASP de a
interacționa cu o astfel de bază de date MySQL.
Acest sistem este descris în multe publicații precum foarte ușor de folosit și de
învățat pentru ca folosește comenzi simple și evidente precum comanda pentru ieșire
“quit”.
De asemenea acest SGBD poate fi executat pe majoritatea platformelor existente
de la FreeBSD, Linux, Mac OS la Windows 10. Inițial acest server -ul MySQL a fost creat
pentru lucrul cu baze de date de dimensiuni foarte mari fiind mult mai rapid decât restul
variantelor de SGBD existente.
În zilele noastre MySQL a evoluat mult mai mult față de ideea de bază de a
procesa query -uri foarte rapid. Sistemul se afla sub o conti nuă dezvoltare și mereu se
adaugă caracteristici noi. O scurtă listă cu cele mai importante caracteristici este
urmatoarea:
A fost scris î n C și C++ și a fost compilat pentru a rula pe foarte multe platforme
folosite la nivel global
Oferă API -uri pentru mu ltiple limbaje de programare comune inclusiv PHP
Oferă atât linia de comandă, cât și instrumente grafice pentru administrarea și
gestionarea bazelor de date
Deține suport pentru baze de date mari care utilizează și peste 5 miliarde de
rânduri de date
Incor porează o proiectare modulară pentru a crea un design de server împărțit
pe mai multe straturi
Suporta multi -threading și este ușor scalabil pentru a incorpora mai multă
putere de procesare
Utilizeaza un sistem bazat pe thread -uri pentru alocarea memoriei sistemului
Implementeaza hash -tables pentru o performanță crescută
Acceptă atât medii client server, cât și medii de server incorporate
Suportă mai multe motoare de stocare a datelor
Implementează toate funcțiile SQL
Ofera suport pentru toate tipurile de d ate SQL
19
Oferă sistem de securitate care acceptă atât verificarea bazată pe utilizator,
cât și pe cea gazdă
Administrarea bazelor de date de tip MySQL pe Windows
În cazul de față, pe Windows putem administra baza de date fie din linie de
comandă fie din modul interactiv recomandat, și anume, PhpMyAdmin.
Pentru rularea din linie de comanda vom folosi comanda :
X:\mysql_folder \bin > mysql.exe
În linia de comandă comenzile nu sunt case -sensitive, așadar indiferent ca se scriu
cu litere mari sau mici acestea vor executa aceleași lucruri. Pentru informații în linia de
comandă putem folosi comanda ‚help ;”.
Din linia de comandă putem executa comenzi precum:
– Create data base – creeaz ă o bază de date
– Show databases ; – listeaz ă bazele de date
– Use [db_name] – selecteaz ă baza de date pe care vrem sa o gestionăm
– Create table – creează tabele sub baza de date selectată
– Alter table – aduce modificari asupra campurilor / structur ii tabelului ales
– Insert into – adaug ă înregistrări în tabel
– Update – permite modificarea anumitor valori din câmpurile unui tabel
– Drop table/database – șterge tabelul / baza de date selectată fară a putea fi
recuperată în lipsa unui backup
– Quit – închide conexiunea cu serverul de MySQL
CAPITOLUL 3. SPECIFICAȚIILE APLICAȚIEI
3.1 Prezentare generală
Odată cu dezvoltarea tehnologiei omul a devenit un “homo oeconomicus” . Hom
oeconomicus sau în traducere “om economic” este caracterizarea omului în anumite teorii
economice ca o persoană rațională care urmărește dezvoltarea în propriul interes de sine.
Omul ec onomic este descris ca unul care evită munca inutilă folosind judecata rațională.
Presupunerea că toți oamenii se comportă în acest mod a fost o premisă fundamentală
pentr u mai multe teorii economice.
Ideea că omul acționează în propriul interes de sine este adesea atribuită altor
economiști și filosofi, precum economiștii Adam Smith și David Ricardo, care considerau
omul drept un agent economic rațional, interesat de sine și Aristotel care a considerat
omul interesat de sine în munca sa.
20
Apariția calculatoarelor, internetului, dar și dezvoltarea rapidă a tehnologiei a dus
la folosirea acestora în toate domeniile de dezvoltare majoră în viața omenirii. Din prima
zi în care omul a folosit tehnologia pentru orice tip de nevoi, fie cele personale, fie pentru
nevoile comunității sau pentru locul de muncă a realizat că își ușureaza viața și că poate
sa realizeze mult mai multe activități pe care până în acel moment nu putea sa le
desfășoare sau până în acel moment au fost foarte greu de desfășurat.
Să ne gândim cum ar fi aratat o instituție publică fără acces la tehnologie, de la
serviciul de evidență al populației unde pentru eliberarea unor documente, de exemplu
pentru re înoirea unui buletin tot procesorul ar fi fost foarte complicat fără tehnologie.
Alt exemplu ar fi modul de lucru într -o clinică medicală în care nu s -ar folosi
tehnologia, internetul și automat și calculatoarele. Probabil ar fi fost nevoie de o cantitate
mare d e hârtie doar pentru a nota într -un fel sau altul programarile unor pacienți ceea ce
necesită un spațiu destul de mare de depozitare, daca mai notăm și consulturile,
recomandările sau istoricul unui pacient la un anumit medic ar fi destul de greu să ne
imaginăm cum ar fi putut să fie depozitate astfel încât sa faciliteze și găsirea rapidă, spre
exemplu, a unui document de acum 2 ani. Dacă mai luam în calcul și lipsa securității
acestor date în lipsa unui backup ceea ce ar fi imposibil de facut fără un calcu lator.
Calculatorele și în general tot ce ține de tehnologie au rezolvat toate aceste probleme și
în general peste tot este folosită tehnologia și astfel de practic precum cea de mai sus nu
mai sunt folosite.
Aplicația dezvoltată “MediCare – clinică medica lă online” este proiectată pentru a
fi folosită de orice categorie de oameni care interacționează cu o clinică medicală, de la
un simplu pacient care își face un cont și implicit și prima programare online, până la
administratorul website -ului care oferă a ccese doctorilor și administratorilor care se ocupă
cu buna desfășurare a tuturor lucrurilor în cadrul clinicii. Prin aplicația dezvoltată de mine
am reușit să creez o platforma care poate fi folosită de persoane fara cunoștințe mari în
domeniul informatic ii. Site -ul web conține butoane, câmpuri de introducere a datelor,
tabele împărțite cât mai bine, în anumite cazuri și pe mai multe categorii pentru a oferi
utilizatorilor o experiență de utilizare cât mai ușoară. Acest lucru pot spune că poate
motiva anum ite categorii de persoane care nu folosesc tehnologia să adere la aceasta și
să realizeze ca le ușureaza viața în foarte multe moduri.
Proiectul permite crearea de rezervări, verificare istoric pacient, lăsarea de recenzii
după prezentarea la un consult în urma programării, verificarea informațiilor despre un
anumit doctor, pe partea de doctor oferă un asamblu al programărilor pe care acesta le
va avea în zilele calendaristice și multe altele, acestea fiind doar câteva operații standard
care se pot face în interiorul site -ului web. Pentru a ajuta din nou oamenii aplicația deține
de funcții de resetare a parolei pentru o rice fel de cont creat, astfel șans ele ca un utilizator
care nu este foarte familiarizat cu tehnologia să își piard ă contul fiind minime.
21
3.2 Pagina principală
Spre deosebire de limbajul PHP standard, fișierul predefinit pentru site -ul web
index.php nu conține date despre website, acestea fiind scrise în fișiere predefinite de tip
Model – View – Controller. Î n fișierul index.php standard al framework -ului putem seta
anumite configurări cum ar fi tipul de mediu pe care vrem sa îl folosim : dezvoltare,
produc ție sau testare. Pagina principală numită adesea “acas ă” este afi șată în browser
ca în captura de ecran de mai jos (Figura 2).
Figura 2 – pagina principală
Dupa cum se poate observa din Figura 2 pagina principală prezintă mai multe
statistici ale clinicii care informează utilizatorii. Pentru așezarea î n pagină și pentru a face
website -ul responsive în funcție de dev ice-ul de pe care este accesat am folosit
Bootstrap.
Bootstrap poate fi considerat o unealtă, la fel ca altele deja existente pe piață, sau
un conglomerat de șabloane și instrumente pentru a ușura dezvolatrea unui site web,
însă cea mai importantă caracter istică a acestui conglomerat este faptul că prin folosirea
bootstrap -ului site -ul devine total responsive pentru toți utilizatorii, indiferent de rezoluția
monitorului de pe care este accesat, astfel ca site -ul devine ușor de accesat și automat
pozitionare a tuturor elementelor prezentate pe pagini se face automat.
Cadrul Bootstrap este construit pe HTML, CSS și JavaScript (JS) pentru a facilita
dezvoltarea de site -uri și aplicații responsive, prim -mobile.
Inițial Bootstrap a fost un proiect în cadrul compa niei americane Twitter, însă
ulterior a devenit un proiect open -source și accesibil pentru toate persoanele. După ce
proiectul a devenit open -source și sursele acestuia au fost publicate pe GitHub,
proiectului i s -au alăturat un numar foarte mare de dezvol tatori care au contribuit în
dezvoltarea acestuia până în ziua de azi.
Un alt punct forte în folosirea bootstrap -ului pentru dezvoltati este că acesta nu
necesită fișiere găzduite exclusiv pe hostingul site -ului gazdă ci pot fi preluate de pe CDN –
22
ul ofici al al acestuia. CDN este acronimul pentru Content Delivery Network sau Content
Distribution Network și este un sistem distribuit care servește fișiere statice. Pentru a
adauga fișierul CSS în orice proiect, chiar și într -un fișier simplu de tip HTML putem folosi
următoarea linie de cod :
<link href="https://maxcdn.bootstrapcdn.com/bootstrap /3.3.5/css/bootstrap.min.css"
rel="stylesheet">
Această caracteristică face B ootstrap foarte ușor de folosit și accesat pentru orice
dezvoltator fără a avea nevoie de fiș iere descărcate separat pe calculatorul acestuia, de
instalare de software special pentru el.
Designul activ permite o pagină web sau o aplicație să detecteze dimensiunea și
orientarea ecranului vizitatorului și să adapteze automat afișajul în consecință; prima
abordare mobilă presupune că smartphone -urile, tabletele și aplicațiile mobile specifice
sarcinilor sunt instrumentele principale ale angajaților pentru realizarea lucrărilor și
abordează cerințele acestor tehnologii în proiectare.
Bootstrap include componente de interfață pentru utilizator, machete și
instrumente JavaScript, împreună cu cadrul de implementare. Software -ul este disponibil
precompilat sau sub formă de cod sursă.
Mark Otto și Jacob Thornton au dezvoltat Bootstrap la Twitter ca mijloc de a
îmbunătăți consistența instrumentelor utilizate pe site și de a reduce întreținerea.
Software -ul a fost cunoscut anterior ca Twitter Blueprint și este uneori denumit Twitter
Bootstrap.
În calculatoare, cuvântul bootstrap înseamnă “să porniți ”: să încărc ați un program
într-un computer folosind un program inițial mult mai mic pentru a încărca în programul
dorit (care este de obicei un sistem de operare).
3.3 Stocarea informațiilor site -ului web
Un site web preia datele din diferite locuri, fie dintr -o baz ă de date, fie dintr -un API
apelat, spre exemplu, prin request -uri de tip XML pentru fiș iere de tip JSON, însă totodată
acesta prelucrează și diferite tipuri de date precum șiruri de caractere, date
calendaristice, date numerice și altele.
Exemple din proiec tul “MediCare” – speciali zări ale doctorilor, nume de utilizatori,
parolele criptate ale acestora, adrese de e -mail, istoricul programărilor, recenziile
doctorilor, datele calendaristice ale creării unei programări anume etc. Aceste informații
sunt păstrat e într -o bază de date de tip relațional de unde sunt dispuse într -o colecție de
fișiere.
Fiecare câmp din baza de date are un nume, un tip de dată și conține un tip de
informație de tipul de dată setat cum ar fi o valoare numerica, un șir de caractere, un
fișier, o dată calendaristică și multe altele. Acesta are o lungime maximă de reprezentar e
a informației respective, de exemplu câmpurilor de tip numeric se precizează numărul de
23
zecimale. Totodat ă câmpurile pot primi valori implicite de tip NULL sau o altă valoare
setată în funcție de tipul de dată și pot avea valori care se setează în moment ul actualizării
câmpului, spre exemplu în momentul în care utilizator își creeaz ă un cont nou pe site -ul
web în baze de date într -un camp numit “data_înregistrării ” se seteaz ă automat data
calendaristică la care informația se adaugă în baza de date. Pentru că formatul este
stabilit, fixat, în general pentru un fișier care conține o reprezentare tabelară se folosește
denumirea de “tabele ”.
O aplica ție de tip server este un software care așteaptă comenzi din partea unor
aplicații de tip client. Serverele baze lor de date relaționale, spre exemplu MariaDB,
MySQL, Oracle, IBM DB, Microsoft Access, și altele se folosește limbajul SQL descris
mai în capitolul precedent.
Pentru stocarea și citirea de către website a informațiilor din baza de date am
folosit utilitar ul XAMPP, care este, de fapt, un pachet de aplicații care formează un tot
întreg și este necesar în găzduirea de site -uri web. După cum urmează software -ul
XAMPP conține următoarele aplcații software : server -ul web Apache, server -ul de baze
de date MySQL și anumite interpretoare pentru scripturi scrise în limbajul de programare
PHP.
Utilitarul poate fi folosit pentru a găzdui site -uri web exact după instalare activand
serviciile necesare site -ului web, însă nu este recomandat să fie folosit pe un server ca re
găzduiește site -uri web pentru ca, mai înt âi se recomandă operarea anumitor modificări
în fișierele de configurare ale serviciilor pentru menținerea unei securităti ale acestor
servicii.
În mare parte, XAMPP -ul a fost creat însă pentru a pune la dispozi ția
dezvoltatorilor de site -uri web un utilitar eficient, ușor și rapid de instalat pentru testarea
diferitelor aplicații web în dezvoltarea acestora. Odată instalat și pe un calculator personal
acesta are comportamentul exact al unui server web, permițând astfel testarea aplicațiilor
web fără a intra în conflict cu alte aplicații sau cu firma de g ăzduire web care va găzdui
într-un final produsul software dezvoltat de către programatori.
După instalarea software -ului XAMPP serviciile oferite de acest pachet pot fi
accesate prin aplicația “XAMPP Control Panel ” care arat ă ca în captura de ecran de mai
jos (Figura 3).
Utilitarul ofera utilizatorilor anumite acțiuni ce se pot efectua prin apăsarea
butoanelor de la categoria “Actions ”. Printre butoane se numară și cel de pornire a
serviciilor, cât și cel de oprire, astfel un utilizator care nu este familiarizat cu utilizarea
acestor servicii pentru dezvoltare web din linie de comandă poate foarte ușor sa
pornească, să oprească sau chiar s ă administreze aceste ser vicii pr in intermediul acestor
butoane.
Pentru a verfica buna funcționare a aplicațiilor/ serviciilor pornite prin intermediul
aplicației “XAMPP Control Panel ” se poate realiza utiliz ând butoanele “Admin ” care deși
în figura 3 apar ca fiind blocate acestea vor deveni disponibile în momentul în care
serviciul respectiv va fi pornit. Spre exemplu pentru testarea serviciului de baze de date
MySQL se poate accesa în browser adresa http://localhost/phpmyadmin/ .
24
Figura 3 – XAMPP control panel
Ca aplicație de tip server web am folosit modulul oferit de Xampp , și anume,
Apache. Server -ul Web accesează ansamblul de fișiere stocate pe hard disk -ul
calculatorului pe care acesta rulează și server -ul le va furniza clientului respectand
regulile protocolului utilizat în cererea cli entului, în cazul de față protocolul HTTP.
Paginile Web sunt de obicei documente de tip multimedia care conțin text, ima gini,
sunet, animații și chiar fișiere de tip video. Ele sunt stocate pe hard disk în mai multe
fișiere, fiecare fișiere conținând informațiile corespunzătoare tipului acestuia.
3.4 Securitatea site -ului web
Securitatea unui site web este foarte importantă în zilele noastre, deoarece
conform cu unele estimări realizate în anul 2018, în fiecare zi sunt hackuite intre
aproximativ 30.000 și 50.000 de site -uri web. A fi sigur în lumea online devine din ce în
ce mai important pe zi ce trece și este un lucru vital ca site -ul web s ă fie protejat.
Unul dintre cele mai cunoscute metode de “spargere ” a site -urilor web care
folosesc PHP este injecția SQL. Cheia pentru întelegerea termenului de injectie SQL este
chiar în numele său: SQL + injecție. Cuv ântul “injec ție” nu are nicio conota ție medicală,
ci este mai degrabă utilizarea verbului provenit din limba engle ză “inject”. Împreună,
aceste două cuvinte transmit ideea de a introduce limbajul SQL într -o aplicație web.
Pentru a înțelege mai bine conceptul voi scrie un ex emplu mai jos.
Să presupunem că avem un formular de contact scris în PHP pur :
<form action=" send_ message.php" method="POST">
<label> Nume </label>
<input type="text" name="name">
25
<label> Mesaj </label>
<textarea name="message" rows="5"></textarea>
<input type= "submit" value="Send">
</form>
În momentul în care se apasă butonul “Send ” formular ul trimite datele c ătre fișierul
send_message.php care arată în felul următor :
<?php
$name = $_POST['name'];
$message = $_POST['message'];
mysqli_query($conn, "SELECT * from mesaje where nume = $name");
… … … …
În partea de cod scrisă mai sus putem vedea că primul query este cel în care
verificăm dac ă utilizatorul are deja un mesaj trimis. Problema apare acum când deja am
deschis porțile pentru distrugere ale bazei noastre de date. Ca asta să se întâmple
atactorul are nevoie ca anumite condiții să fie împlinite :
Aplica ția să ruleze pe o bază de date SQ L
Conexiuna către baza de date curentă să aibă permisii de editare sau ștergere
către baza de date
Numele tabelelor importante să poată fi ghicite ușor
Pentru ultima condiție putem oferi ca exemplu formularul de contact al un magazin
online, astfel atacato rul poate ghici că datele unei comenzi sunt salvate în tabela
“comenzi ”, astfel în câmpul nume din formular acesta introduce exact : “Andrei; truncate
comenzi;”. Acum query -ul care va fi trimis c ătre baza de date din pagina
“send_message.php ” arată în felul următor: SELECT * FROM mesaje WHERE name =
Andrei; truncate orders;. Ini țial va fi o eroare de sintaxă în MySQL pentru că nu se
folosesc ghilimele la introducerea numelui “Andrei”, dar motorul MySQL va continua s ă
interpreteze următoarea parte din query, și anume “truncate comenzi; ” exact a șa cum
este scrisă și în cateva secunde sau minute, în funcție de marimea bazei de date tot
istoricul comenzilor a fost șters.
Acest atac de tip injecție SQL este mult mai redus de framework -urile PHP, astfel
șansele ca un site să poată fi vulnerabil în momentul în care se folosește un framework
și se respectă regulile și documentația sa scad spre 0%.
În proiectul curent “MediCare ” cele mai bune exemple în care am evitat aceste
atacuri de tip injecție SQL se pot vedea cân d la citirea datelor din câmpurile formularelor
se folosește funcția HTML Purify din librărira HTMLPurifier.
Tot în mod asemănător cu injecția SQL, mai există și atacuri de tip XSS, în engleză
Cross -site Scriping care este un atac de injecție de cod din pa rtea clientului. Atacatorul
își propune să execute scripturi rău intenționate într -un browser web al victimei prin
26
includerea codului rău intenționat într -o pagină web sau o aplicație web legitimă. Atacul
propriu -zis are loc atunci când victima vizitează p agina web sau aplicația web care
execută codul rău intenționat. Pagina web sau aplicația web devine un vehicul pentru a
livra scriptul rău intenționat browserului utilizatorului. Vehiculele vulnerabile care sunt
utilizate în mod obișnuit pentru atacurile d e scripturi între site -uri sunt forumuri, panouri
de mesaje și pagini web care permit comentarii.
În concluzie, injecția SQL este un atac foarte puternic și distructiv asupra unei
aplicații web, dar este ușor de evitat. Așa cum am descris mai sus dacă dezv oltatorul este
atent atunci când prelucrează introducerea utilizatorului și interogarea bazei de date se
poate evita.
CAPITOLUL 4. IMPLEMENTAREA ȘI UTILIZAREA APLICAȚIEI
4.1 Crearea bazei de date folosind utilitarul XAMPP
Baza de date a proiectului a fost realizată cu aplicația XAMPP folosind MySQL
împreună cu interfața de administrare phpMyAdmin. Pentru deschiderea interfeței de
administrare phpMyAdmin se tastează în browser -ul folosit de utilizator adresa :
http://localhost/phpmyadmin/ ca în Figura 4, însă această interfață este disponibilă doar
după pornirea serviciului MySQL.
Figura 4 – adresa pentru accesarea phpMyAdmin
După încărcarea paginii utilizatorul poate crea manual baza de date introducând
numele și apoi se va apăsa butonul “Creează ”.
Figura 5 – crearea unei baze de date din phpMyAdmin
Interfața de administrare va crea o comanda SQL de creare a unei baze de date
către server -ul MySQL. Pentru a a juta utilizatorii phpMyAdmin va afișa de fiecare dată
27
când utilizatorul face o acțiune și o trimite către server -ul de baze de date MySQL astfel
că un utilizator începător poate fi ajutat învățând astfel comenzile.
Odată cu creearea bazei de date aceasta p oate fi selectată folosind meniul din
partea stângă al interfeței (Figura 6).
Figura 6 – lista cu bazele de date
4.1.1 Crearea unui tabel al bazei de date folosind phpMyAdmin
Voi oferi ca exemplu crearea tabelului “validateuser ”. Tabelul validateuser va
conține datele introduse de utilizatori în momentul înregistrării și vor fi stocate în tabelă
până la validarea contului prin intermediul confirmării puse la dispoziție de aplicatia web.
Crearea unui nou tabel se realizează concomit ent cu definirea câmpurilor sale.
Figura 7 – crearea unui tabel în baza de date
Tabelul validateuser conține 9 câmpuri ( în engleză fields). Pentru a putea crea
tabelul respectiv phpMyAdmin necesită minim introducerea numelui și tipului fiecăruia
dintre câmpurile pe care tabelul le va avea.
28
Figura 8 – selectarea tipurilor campurilor unui tabel
Câmpurile tabelului validateuser sunt id (de tip INT – valoare î ntreagă,
AUTO_INCREMENT, PRIMARY), ukey (de tip VARCHAR cu lungime maximă de 200 de
caractere), used (de tip INT – valoare întreagă cu lungime maxima de 1 caracter și
valoare implicită setată la 0), email (de tip VARCHAR cu o lungime maximă de 30 de
caractere), password (de tip VARCHAR cu o lungime maxi mă de 50 de caractere), phone
(de tip VARCHAR cu o lungime maximă de 15 de caractere), nume (de tip VARCHAR cu
o lungime maximă de 50 de caractere), prenume (de tip VARCHAR cu o lungime maximă
de 50 de caractere), regdate (de tip VARCHAR cu o lungime maxim ă de 50 de caractere).
Prima caracteristică a câmpului id, și anume PRIMARY indică faptul că id este o
cheie primară. Cheia primară a unui tabel din baza de date este un câmp care are valori
unice pentru fiecare articol inserat în tabel, mai mult are rolul de identificator unic pentru
articolele introduse în tabelul respectiv.
Proprietatea de AUTO_INCREMENT indică modul în care valorea câmpului va fi
obținută în momentul inserării unei linii noi în tabel, mai exact valoarea acestui câmp va
fi calculat ă de către MySQL automat în momentul introducerii unei noi linii prin preluarea
valorii precedente și apoi incrementarea acesteia. În cazul de față adaugând prima linie
în acest tabel câmpul id va avea valoarea “1”.
Câmpul “email ” este definit ca INDEX . Definir ea unui c âmp drept INDEX reduce
timpul de căutare a unei linii din tabel dacă se va efectua dupa valori ale respectivului
câmp. De obicei, definirea câmpurilor drept INDEX se folosesc în bazele de date de mari
dimensiuni pentru că dupa cum am spus și mai s us faciliteaz ă cautările în baza de date
dacă se fac după câmpul respectiv. Trebuie menționat însă că, în comparație cu
PRIMARY, definirea unui câmp ca INDEX nu înseamnă ca acesta trebuie sa aibă valori
distincte, așadar câmpul “email ” poate avea aceea și valoare de mai multe ori.
Crearea tabelului se realizează apăsând butonul “Salvează ” și apoi phpMyAdmin
va afișa și comanda CREATE TABLE cu toate câmpurile introduse de utilizator care este
trimisă către server -ul de baze de date MySQL.
29
4.1.2 Restaurarea unei baze de date folosind un fișier cu extensie .sql
Pentru a veni în sprijinul celor care vor folosi această aplicație tabelele nu vor trebui
făcute manual fie din linie de comandă, fie din interfața phpMyAdmin ci vom folosi funcția
de importare oferită de p hpMyAdmin. Putem importa în baza noastră de date orice tabele
care au fost exportate în format .sql, dar și în formate comprimate (gzip, bzip2, zip).
Folosind pagina de importare din phpMyAdmin putem alege un fișier de pe
calculatorul nostru pentru a -l imp orta în baza de date.
Figura 9 – importarea unei baze de date
În mod prestabilit folosind server -ul MySQL creat de XAMPP putem încărca fișiere
de maximum 40 de mega -bytes, însă această limită poate fi ușor modificată din fișierele
de configurare având acces la aceste configurări prin XAMPP, dar pe anumite servicii de
gazduire web aceste limite vor fi impuse și utilizatorilor nu li se va permite mărirea
limitelor.
Practic în momentul în care noi încărcăm fișierul de tip .sql cu instrucțiunile salvate
phpMyAdmin va procesa linie cu linie fișierul și se va simula introducerea manuală a
acestor date. Mai exact în fișierul backup .sql sunt notate comenzile pe utilizatorul le
observă în momentul în care face anumite acțiuni în baza de date cum ar fi crearea unui
nou t abel.
4.2 Instalarea și rularea aplicației
După ce baza de date a fost creată și toate tabele le au fost create cu câmpurile
necesare sau mai ușor a fost folosită funcția de importare din phpMyAdmin este necesar
să fie copiate fișierele framework -ului și alte website -ului în folder specific fiecărui server
web. În cazul de față folosind XAMPP cu server -ul web Apache fișierele necesare vor fi
copiate în folder -ul “htdocs ” ce poate fi găsit în rădăcina folder -ului creat de XAMPP.
După ce copierea a fost exec utată cu succes fișierele vor arată în felul următor:
30
Figura 10 – conținutul folder -ului “htdocs ”
Pentru ca site -ul să fie complet securizat în fișierul index.php al framework -ului va
trebui să definim mediul pentru care va fi folosit website -ul: define( “ENVIRONMENT ”,
“development ”). Folosind acest define vom defini mediul site -ului web ca mediu de
dezvoltare, pentru producție vom folosi cuvântul cheie “production ”.
Având serviciul pentru ba za de date instalat și automat ș i baza de date necesară
site-ului web creată vom naviga în folderul “application ”, apoi vom alege folderul “config ”
și apoi vom desc hide fișierul “config.php ” în care vom face mai multe modificări necesare.
Pentru început vom seta URL -ul de bază al site -ului web folosind linia de cod :
$config['base_url'] = 'http://localhost/’; astfel framework -ul va știi că URL-ul implicit este
http://localhost în cazul nostru.
După modificarile pe care le -am fă cut în fișierul “config.php ”, vom trece la fișierul
“database.php ” care se afl ă în același director cu fișierul modificat anterior. În fișierul
database, după cum spune și numele acestuia vom lega site -ul web la baza noastră de
date folosind datele oferite de server -ul de bază de date MySQL. Codul pentru conectarea
la o bază de date este următorul:
$db['default'] = array('dsn' => 'mysql:host=localhost; dbname=te st; charset=utf8;',
'hostname' => '', 'username' => 'root', 'password' => '', 'database' => 'test', 'dbdriver' =>
'pdo', 'dbprefix' => '', 'pconnect' => FALSE, 'db_debug' => FALSE, 'cache_on' => FALSE,
'cachedir' => 'application/cache/', 'char_set' => 'ut f8', 'dbcollat' => 'utf8_general_ci',
'swap_pre' => '', 'encrypt' => FALSE, 'compress' => FALSE, 'stricton' => FALSE, 'failover'
=> array(), 'save_queries' => TRUE);
Folosind ace astă linie de cod ne v om conecta la baza de date “test”, cu numele de
utilizat or “root” fără parolă. Totodată server ul gazdă al bazei de date este localhost. Tot
folosind acestă linie de cod putem face mai multe setări precum activarea modului de
debug al bazei de date, ecriptarea datelor, setarea directorului implicit pentru salvar ea
fișierelor cache .
Pe lângă modificările pentru funcționarea minimă a site -ului web pe care le -am
făcut în aceste fișiere de configurare, în folderul config aici găsim mai multe fișiere pe
care le putem modifica precum : foreign_chars, constants, profiler , migration și multe
altele.
31
4.2.1 Interfața utilizatorului
Aplicația web prin accesarea ei produce apariția paginii de tip “Acasă ”, care unui
utilizator neconectat în contul său va afișa anumite informații generale, meniul din stânga
și în partea de sus butoane pentru crearea contului sau pentru logarea în contul său
(Figura 10).
Figura 11 – pagina principala a site -ului web
4.2.2 Înregistrea utilizatorului
Prin apăsarea butonului din partea de sus a website -ului “Creaz ă cont ” utilizatorul
va fi redirec ționat către pagina de crearea a contului (Figura 11).
Figura 12 – pagina de crearea a unui cont de utilizator
32
Aici utilizatorului îi sunt cerute niște date standard pentru crearea unui cont. La
început, în momentul în care utilizatorul își crează contul acesta se salvează temporar în
tabelul validateuser și utilizatorul va primi un email de confirmare, astfel ne asigurăm ca
utilizatorii care se înregistrează în cadrul aplicației web nu pot folosi email -uri pe care
aceștia nu le dețin.
Codul pentru partea de validare a formularului folosind facilitățile oferite de
framework este:
$this ->load ->library('form_validation');
$this ->form_validation ->set_rules('email', 'email',
'trim|valid_email|require d|callback_validate_user|xss_clean|max_length[30]');
$this ->form_validation ->set_rules('password', 'Password',
'trim|required|xss_clean|callback_check_password|min_length[6]|max_length[30]');
$this ->form_validation ->set_rules('passwordr', 'Re -enter passwor d',
'trim|required|xss_clean|max_length[30]|matches[password]');
$this ->form_validation ->set_rules('nume', 'Nume',
'trim|required|xss_clean|max_length[30]');
$this ->form_validation ->set_rules('prenume', 'Prenume',
'trim|required|xss_clean|max_length[30]');
$this ->form_validation ->set_rules('telefon', 'Telefon',
'trim|required|xss_clean|max_length[12]');
Spre exempl u, la partea regulilor pentru câ mpul email, folosim valid_email regulă
oferit ă de framework pentru a verifica daca textul introdus în câmpul res pectiv se
potrivește unei adrese de email, un callback către funcția validate_user din controller
care verifică dacă email -ul introdus există deja în tabelul cu utilizatori din baza de date și
tipul max_length care verifică dacă lungimea email -ului introd us este de maximum 30 de
caractere. Codul pentru funcția validate_user este:
function validate_user() {
$email = html_purify($this ->input ->post('email'), false);
if($this ->Register_model ->checkExistingUser($email) == TRUE) {
$this ->form_validation ->set_message('validate_user', 'Email -ul este deja
folosit de un alt utilizator.');
return FALSE;
} else {
return TRUE;
}
}
33
Dacă email -ul căutat a fost găsit în baza de date seteaz ă un mesaj de eroare
pentru c ă email -ul este deja folosit, iar în caz contrar returnează TRUE. Dacă folosim un
email existent deja în baza de date mesajul va apărea deasupra formularului de
înregistrarea ca în captura de ecran de mai jos (Figura 12).
Figura 13 – mesaj de eroare
Query -ul trimis către baza de date dacă formular a fost completat corect și trimis
de utilizator este : $this ->db->query("INSERT INTO `validateuser` (ukey, regdate, email,
password, phone, nume, prenume) VALUES (?, ?, ?, ?, ?, ?, ?)", a rray($finalkey,
time()+1800, $email, md5($password), $phone, $firstname, $lastname));
Pentru a oferi o securitate m ărită utilizatorilor, toate parolele salvate în baza de
date sunt criptate mai întâi folosind funcția md5().
Variabila $finalkey este crea tă folosind funcția uniqid() din PHP care generează un
ID unic, iar mai apoi este criptată de 2 ori folosind criptarea MD5, astfel acea variabila
$finalkey face parte din link -ul care va fi trimis utilizatorului pe email pentru a -și confirma
contul. Șablon ul mail -ului trimis utilizatorului arată așa :
<html xmlns= \"http://www.w3.org/1999/xhtml \" dir= \"ltr\">
<head>
<meta http -equiv= \"Content -Type \" content= \"text/html; charset=utf -8\" />
<meta name= \"viewport \" content= \"width=device -width, initial -scale=1.0 \"/>
<title></title>
</head>
<body><br>
Salut ". $firstname . " " . $lastname .",<br>
Ai primit acest email pentru ca ai solicitat inregistrarea contului tau pe website -ul
clinicii Medicare.<br>
Dacă nu dore ști să îți creezi contul, poti ignora/sterge acest email.<br>
Pentru a -ti crea contul da click pe link -ul de mai jos î n maximum 30 de minute de
la primirea acestui email: <br>
<a href= \"" . base_url("register/check/$finalkey") . " \">" .
base_url("register/check/$finalkey") . "</a> <br>
Cu stima,<br>
Echipa Medicare.
34
</body>
</html>
În momentul în care utilizatorul accesează link -ul primit pe email folosind cheia
unică auto -generată contul acesta este creat cu datele din tabelul “validateuser ” în tabela
“users “. Funcția împreună cu query -urile trimise către baza de date sunt :
function isValidKey($key) {
$query = $this ->db->query("SELECT * FROM `validateuser` WHERE `ukey` = ?
AND `used` = 0 LIMIT 1", array($key));
$qq = $query ->row();
if($query ->num_rows())
{
if($qq ->regdate > time())
{
if($this ->Reg ister_model ->checkExistingUser($qq ->email) == TRUE) {
return false;
}
$this ->db->query("UPDATE `validateuser` SET `used` = 1 WHERE `ukey`
= ? LIMIT 1", array($key));
$this ->db->query("INSERT INTO `users` (email, pass word, phone, nume,
prenume, regdate) VALUES (?, ?, ?, ?, ?, ?)", array($qq ->email, $qq ->password, $qq –
>phone, $qq ->nume, $qq ->prenume, date('Y -m-d H:i:s')));
return true;
}
else return false;
}
else return false;
}
4.2.3 Conectarea în contul utilizatorului
În cazul în care utilizator ul deține deja un cont creat și confirmat pe site poate folosi
funcția “Login ” pentru a se autentifica în contul său. Pagina de autentificare arată ca în
captura de ecran din figura de mai jos (Figura 14).
35
Figura 14
Aici utilizator ul va trebui să completeze email -ul și parola, apoi să completeze
captcha -ul introdus în formular de logare pentru a spori protecția site -ului și apoi să apese
pe butonul “Login ”. Utilizatorul mai poate selecta și butonul “Remember me ” ceea ce va
salva sesiunea acestuia pentru un timp mai îndelungat.
Codul pentru formularul de logare din partea de view este următorul:
<?php echo form_open("login/continueLogin/"); ?>
<div class=" form-group has -feedback">
<input class="form -control" type="text" name="email" value="<?php echo
set_value('email'); ?>" placeholder="Enter email" required>
<span class="fa fa -user form -control -feedback text -muted"></span>
</div>
<div class="form -group has -feedback">
<input class="form -control" id="exampleInputPassword1" name="password"
type="password" value="<?php echo set_value('password'); ?>"
placeholder="Password" required>
<span class="fa fa -lock form -control -feedback text -muted"></span>
</div>
<div c lass="clearfix">
<div class="checkbox c -checkbox pull -left mt0">
<label>
<input type="checkbox" value="" name="remember">
<span class="fa fa -check"></span>Remember Me</label>
</div>
36
<div class="pull -right"><a class="text -muted" href="<?php echo
base_url("login/recover"); ?>">Forgot your password?</a>
</div>
</div>
<div align="center">
<?php echo $widget;?>
<?php echo $script;?>
</div>
<button class="btn btn -block btn -primary mt -lg" type="submit">Login</button>
<?php echo form_close(); ?>
După ce utilizatorul completează câmpurile necesare și apasă butonul de
“Trimitere ” datele sunt trimise către pagina de continuare a logării unde mai întai se
valideaza formularul folosind librăriile puse la dispoziție de CodeIgniter:
$this ->load ->library('fo rm_validation');
$this ->form_validation ->set_rules('email', 'Email',
'trim|required|xss_clean|max_length[30]');
$this ->form_validation ->set_rules('password', 'Password', 'trim|required|xss_clean');
$this ->form_validation ->set_rules('g -recaptcha -response', 'recaptcha validation',
'callback_validate_captcha|required');
$this ->form_validation ->set_message('validate_captcha', 'Please check the the captcha
form.');
Folosind validarea pentru răspunsul părții de captcha al formularului callback -ul
pentru funcția validate_captcha se verifică dacă utilizatorul a completat corect captcha –
ul. Pentru acest captcha am folosit API -ul oferit de Google gratuit, și anume reCaptcha
v2.
După aceea dacă toate câmpurile sunt completate corect se va executa
următoarea secvență de cod :
$result = $this ->Login_model ->checkLogin($email, $password);
if($result != false) {
$sess_array = array();
$info = explode('|', $result);
$sess_array = array( 'id' => $info[0], 'email' => $info[1]);
if($this ->input ->post('remember')) $this ->session ->sess_expiration = '10800';
37
else $this ->session ->sess_expiration = '100';
$this ->session ->set_userdata('logged_in', $sess_array);
$this ->session ->mark_as_temp(array( 'id' => 60, 'email' => 60, 'logged_in' => 60 ));
$this ->Login_model ->addIPL og($info[0], $this ->input ->ip_address());
$this ->Login_model ->updateLoginDate($info[0]);
redirect(base_url());
În urma acestei secvențe cod se verifică dac ă datele introduse (email -ul și parola)
corespunde celor existente în baza de date, apoi se verifică dacă utilizatorul a selectat
butonul de ’remember’ pentru a știi pentru cât timp se creează sesiunea acestuia, apoi la
finalul codului se adaugă în baza de date loguri pentru adresele IP conectate pe cont și
se actualizează în baza de date campul în care se salvează data ultimei logări pe site al
user-ului respectiv.
4.2.4 Funcția de recuperare parolă
Pentru a veni în sprijinul utilizatorilor care ori și -au uitat parola, ori nu sunt atat de
familiarizaț i cu tehnologia și implicit cu aminterea de parole, site-ul web deține funcția
pentru recuperarea parolei . Odată accesată pagina pentru recuperarea parolei care arată
ca în captura de ecran din Figura 15, utilizatorul va trebui sa completeze email -ul pe care
îl avea la cont, dar și numărul de telefon, astf el evităm cererile de resetare a parolei
nejustificate cerute de persoane care deși nu au acces la cont cunosc adresa de email a
persoanei respective.
Figura 15 – pagina de resetare a parolei
Când formular ul este trimis codul din spatele site -ului verifică dacă acea adresă
de email și num ărul de telefon introdus corespund unui cont creat pe site și dacă acestea
corespund se va crea o cheie unică folosind din nou funcția uniqid() urmată de 2 convertiri
ale valorii in MD5, astfel cr eem o cheie unică pentru resetarea acestei parole. Folosind
linia de cod : $this ->Login_model ->recoverPassword($email, $final_key); apel ăm funcția
38
“recoverPassword ” din partea de model a site -ului web care trimite query -ul către baza
de date și care arată î n felul următor :
public function recoverPassword($email, $lastKEY) {
$this ->db->query("INSERT INTO recover (RecoverKey, email, done, timeexpire)
VALUES (?, ?, ?, ?)", array($lastKEY, $email, 0, time()+1800));
}
Folosind “time()+1800” se adaug ă în c âmpul “timeexpire ” un string de tip UNIX
DATE care reprezintă ora și data actuală la care se adaugă 1800 de secunde,
reprezentând timpul maxim în care utilizatorul poate utiliza cheia unică generată pentru
resetarea parolei. În momentul în care utilizatorul prime ște email -ul de resetare a parolei
acestuia îi este oferit un link de genul: http://webiste.com/login/recoverchange/$final_key ,
$final_key reprezent ând cheia unică generată.
Când utilizator ul accesează link -ul primit se verifică din nou în baza de date
folosind partea de model dacă cheia respectivă există în baza de date și dac ă timpul nu
este depăși folosind codul:
public function isValidRecovery($key) {
$query = $this ->db->query("SELECT Re coverKey, timeexpire FROM recover
WHERE `RecoverKey` = ? LIMIT 1", array($key));
if($query ->num_rows()) {
if($query ->row() ->timeexpire > time()) return true;
else return false;
}
else return false;
}
Dacă valoarea din câmpul “timeexpire ” este mai mic ă dec ât cea primită folosind
funcția time() care returneaz ă un string de dată și ora din momentul actual, mai explicit
are aceași utilitate ca funcția SQL “now() ”. Dac ă valoarea este mai mic ă se returnează
true, în caz contra r false , însă și daca acea cheie preluată din link nu este gasită în baza
de date se returnează tot false.
Cheia pe care o cautăm în link se preia automat în controller folosind din nou
facilitățile oferite de framework, și anume linia de cod : $this ->uri->segment(3); care
extrage din link segmentul num ărul 3, de exemplu acea linie de cod va returna valorea
“segment3 ” pentru link -ul:
http://website.com/segment1/segmen t2/segment3/segment4/segment5
39
4.3 Tipuri de utilizatori
4.3.1 Utilizator normal
În momentul în care utilizatorul își confirmă contul de pe email acesta primește
automat rolul de utilizator normal pe website. Automat utilizatorului deja îi sunt încărcate
părți din website care nu puteau fi văzute sau accesate de acesta far ă să fie logat în cont
ca în capturile de ecran din figurile de mai jos:
Figura 16 – buton “următoarea programare ”
În partea website -ului de lângă panoul cu știri, odată ce utilizator este logat în cont
acestuia îi este afișat butonul “Următoarea programare ” și dac ă se face click pe acesta
vor apărea anumite detalii despre următoare a programare p e care utilizatorul o are făcută
pe site -ul web al clinicii sau mesajul “Nu a fost gasită nicio programare. ” în caz contrar.
Pe langă acel buton în partea de sus a website -ului mai găsim anumite obiecte noi
apărute ca în captura din Figur a 17.
Figura 17 – meniul unui utilizat or logat
Putem observa în Figuta 17 ca în momentul logării în cont putem vedea numărul
de notificări necitite și la un click pe numele folosit de utilizator un nou meniu își face
apariția. Din meniul respectiv utilizatorul poate accesa profilul acestuia, funcția de
schimbare a e mail-ului și deconectarea din contul în care acesta este logat. Aceste
opțiuni apar tuturor utilizatorilor logați indiferent de gradul pe care aceștia îl au.
Pagina de profil a unui utilizator logat arată ca în Figura 18. Utilizatorului îi sunt
prezentate te anumite informații personal e completate de acesta, totodată putem observa
și butonul “Următoarea programare ” care are aceea și func ție cu butonul de pe prima
pagină prezentat mai sus, dar și un nou buton numit “Acțiuni ”,
40
Figura 18 – profilul unui utilizator
În partea din dreapta observăm că unui utilizator nou îi este atribuită o poză
implicită. Pentru a modifica detalii ale contului printre care și acea poză reprezentativă
utilizatorul poate folosi link -ul “editare profil ” poziționat sub poză.
Figura 19 – funcția de editare profil
În pagina de editare a profilului putem vedea două formulare unul pentru editarea
informațiilor text ale profilului și unul pentru încărcarea unei fotografii de profil pentru
utilizatorul logat. Pentru încărcarea fotografiei se folosește un formular standard precum
cele de mai sus, însă dife rită este partea de încarcarea ș i trimitere a datelor către server –
ul web și baza de date. Pentru asta folosim codul următor din controller :
$config['upload_path'] = './assets/img/profilepictu res/';
$config['allowed_types'] = 'jpg|png';
$config['max_size'] = 4096;
$config['max_width'] = 10200;
41
$config['max_height'] = 5000;
$config['overwrite'] = FALSE;
$config['file_ext_tolower'] = TRUE;
$config['file_name'] = md5("uid".$this ->session –
>userdata('logged_in')["id"]."".time()."");
$config['master_dim'] = 'width';
$config['width'] = 355;
$this ->load ->library('image_lib', $config);
$this ->image_lib ->initialize($config);
$this ->image_lib ->resize();
$this ->load ->libra ry('upload', $config);
Codul de mai sus are anumite configur ări precum calea unde fotografia va fi
încărcată, extensiile aceptate, dimensiunea maximă acceptată.
Pentru a evita dublarea fotografiilor sau înlocuirea unei fotografii încărcate de un
utilizator, de exemplu : utilizatorul cu id -ul 1 are fotografia de profil cu denumirea
“poza.jpg ” și utilizatorul cu id -ul 2 încearcă să încarce o poză cu aceeași denumire poza
utilizatorului vechi va fi înlocuită, însă configurând opțiunea “overwrite ” ca fal să și
modificând denumirea fișierului din numele fișierului uploadat într -o cheie unică folosind
hash -ul MD5 pe șirul de carctere format din id -ul utilizatorului logat și rezultat funcției
time() ne asigurăm ca fiecare fotografie uploadată de un utilizator are denumirea unică,
random fără un nume care ar reprezenta ceva.
Utilizatorul normal are acces la c ăutarea unor anumiți doctori după filtrele
completate de el în formularul din pagina “Caut ă un doctor ” și care arată ca în Figura 20.
Figura 20 – pagina de căutare a unui doctor
42
Un utilizator normal mai are acces și la pagina “Progra mări”, unde poate vedea
program ările făcute de acesta pentru o dată din viitor, dar și ultimele 20 de programări
din trecut (Figura 21).
Figura 21 – pagina cu progra mările utilizatorului
Query -ul trimis către baza de date pentru afișarea programărilor viitoare este :
$this ->db->query("SELECT * FROM appointments WHERE clientid = ? AND `date` <= ?
ORDER BY `id` DESC LIMIT 20", array($clientID, date('m/d/Y', strtotime('+1 days'))));.
Query -ul trimis către baza de date pentru afișarea programărilor trecute arată în
felul următor: $this ->db->query("SELECT * FROM appointments WHERE clientid = ?
AND `date` >= ? ORDER BY `id` DESC", array($clientID, date('m/d/Y', strtotime(' -1
days'))));
În momentul în care utilizator ul navighează pe site -ul web prin lista cu doctori și
accesează butonul Solicit ă programare din dreptul doctorului respectiv este redirec ționat
către pagina unde acesta poate face o cere re pentru o programare (Figura 18).
Figura 22 – pagina pentru solicitarea unei programări
43
Pentru a evita aglomerarea utilizatorilor care vor verifica și accepta sau respinge
aceste cereri pentru programare la un anumit doctor utilizatorul este limitat și dac ă în
controller site -ul web detectează că în intervalul orar ales de utilizator sunt prea multe
cereri în așteptare acesta nu va mai putea crea una și va fi avertizat cu un mesaj că “Sunt
deja prea multe solicitari de programari î n așteptare pentru intervalul orar. ”. Codul pentru
aceste verific ări este :
if($choicedHour == "pana12") {
$value = $this ->Programare_model ->getAppointmentsByDate($doctorID,
$choicedHour);
if($value > 5)
{
$this ->session ->set_flashdata('error', 'Sunt deja prea multe solicitari de
programari in asteptare pentru intervalul orar '.interval_orar($choicedHour).' din ziua
'.$choicedDate.'!<br>Incearca alt interval orar sau alta data.');
redirect(base_url("programa re/new/".$doctorID.""));
}
} elseif ($choicedHour == "intre1417") {
$value = $this ->Programare_model ->getAppointmentsByDate($doctorID,
$choicedHour);
if($value > 3)
{
$this ->session ->set_flashdata('error', 'Sunt deja pr ea multe solicitari de
programari in asteptare pentru intervalul orar '.interval_orar($choicedHour).' din ziua
'.$choicedDate.'!<br>Incearca alt interval orar sau alta data.');
redirect(base_url("programare/new/".$doctorID.""));
}
} elseif ($choicedHour == "dupa17")
{
$value = $this ->Programare_model ->getAppointmentsByDate($doctorID,
$choicedHour);
if($value > 6)
{
$this ->session ->set_flashdata('error', 'Sunt deja prea multe solicitari de
programari in asteptare pentru intervalul orar '.interval_orar($choicedHour).' din ziua
'.$choicedDate.'!<br>Incearca alt interval orar sau alta data.');
44
redirect(base_url("programare/new/".$doctorID.""));
}
}
O cerere pentru o programare care nu a fost verif icată de un administrator arată
ca în imaginea de mai jos (Figura 23).
Figura 23 – cerere pentru o programare
O programare din trecut care a fost acceptată de un administrator și la care
pacientul s -a prezentat, a primit tratamentul și recomandările de la doctorul respectiv
arată ca în captura de ecran de mai jos (Figura 24) :
Figura 24 – detaliile unei program ări
Dacă programarea este din trecut în momentul în care utilizatorul o accesează sub
profilul și informațiile referitoare la doctor își face apariția un formular pentru a lasă o
recenzie doctorului respectiv o notă. Partea de cod procesată de site -ul web în momentul
în care un utilizator trimite o recenzie este următoarea :
$postAppointmentID = (int)html_purify($th is->input ->post('idAppointment'), false);
$patientID = (int)html_purify($this ->input ->post('patientID'), false);
$doctorID = (int)html_purify($this ->input ->post('doctorID'), false);
$appointmentInfo = $this ->Programari_model ->getAppointment($postAp pointmentID);
if($appointmentInfo ->clientid != $this ->session ->userdata('logged_in')['id'] || $this –
>session ->userdata('logged_in')['id'] != $patientID) {
45
$this ->session ->set_flashdata('error', 'Nu poti lasa un review la o programare care
nu este pe numel e tau!');
redirect(base_url('programari/view/'.$postAppointmentID.''));
}
if($appointmentInfo ->date <= date('m/d/Y', strtotime(' -1 days'))) {
$this ->session ->set_flashdata('error', 'Nu poti lasa un review pentru o programare
ce va avea loc in viit or!');
redirect(base_url('programari/view/'.$postAppointmentID.''));
}
if($appointmentInfo ->reviewd > 0) {
$this ->session ->set_flashdata('error', 'Ai acordat deja o recenzie pentru aceasta
programare!');
redirect(base_url('programari/view/'.$postAppo intmentID.''));
}
if(getUserData($this ->session ->userdata('logged_in')['id'], "doctor") != 0) {
$this ->session ->set_flashdata('error', 'Nu poti lasa o recenzie in calitate de
doctor!');
redirect(base_url('programari/view/'.$postAppointmentID.''));
}
if($appointmentInfo ->date <= date('m/d/Y', strtotime(' -30 days'))) {
$this ->session ->set_flashdata('error', 'Poti lasa o recenzie in maximum 30 de zile
de la data programarii.');
redirect(base_url('programari/view/'.$postAppointmentID.''));
}
$ratingValu e = (int)html_purify($this ->input ->post('notaservicii'), false);
$message = html_purify(strip_tags($this ->input ->post('reviewmessage')), false);
if(!is_numeric($ratingValue) || $ratingValue < 0 || $ratingValue > 5) {
$this ->session ->set_flashdata('error', 'Form error.');
redirect(base_url('programari/view/'.$postAppointmentID.''));
}
$this ->Programari_model ->updateDoctorRating($ratingValue, $doctorID);
46
$this ->Programari_model ->insertIntoReviews($doctorID, $patientID, $message,
$ratingValue);
$this ->Programa ri_model ->updateReviewedAppointment($appointmentInfo ->id);
$this ->db->cache_delete('programari', 'view');
$this ->session ->set_flashdata('success', 'Ai trimis recenzia cu succes!');
redirect(base_url('programari/view/'.$postAppointmentID.''));
Codul pentru redactare a unei recenzii din partea utilizatorului este relativ simplu,
în partea de început se preiau datele din formulare folosind ș i funcția de purificare a
datelor din libraria HTML Purifier. Apo i se verfică daca utilizatorul este un utilizator simplu
pentru a evita cazurile în care doctorul și -ar lăsa singur o recenzie și daca programarea
a fost facută acum maxim treizeci de zile, astfel după trecerea celor treizeci de zile daca
nu a lăsat, utilizatorul nu va mai putea să lase altă recenzie.
Partea d e notificări ale unui utilizator arată ca în figura de mai jos (Figura 25) .
Figura 25 – pagina cu notificările unui utilizator
Site-ul afi șează automat notificările citite sau necit ite alături de dată și mesajul pe
care acestea le conțin. În momentul în care utilizatorul accesează pagina notificări,
ultimele 5 notificări necitite vor fi marcate automat ca citite, însă pentru a evita trimiterea
de query -uri către baza de date de fiecar e dată când un utilizator accesează această
pagină este introdus un timp de așteptare de 5 minute, mai exact 300 secunde și utilizator
în momentul în care va da reîmprospătare la pagină și acel timp de așteptare nu a trecut
acele notificări nu vor fi marca te ca citite.
Codul din partea de controller pentru pagina de afișare a notificărilor este:
if (!is_cache_valid(md5('notification+index'), 300)){
$this ->db->cache_delete('notification');
$this ->db->cache_delete('notification', 'index');
}
47
if($this ->session ->set_userdata('postTimeoutMarkAll') && (time() – $this ->session –
>userdata('postTmNotification') ) < 100) {
$this ->session ->set_userdata('postTimeoutMarkAll', time());
$this ->Notification_model ->readNotifications($this ->session –
>userdata(' logged_in')['id']);
}
if (!is_cache_valid(md5('notification'), 300)) {
$this ->db->cache_delete('notification');
}
$data["notification"] = $this ->Notification_model ->getNotificationsByUser($this ->session –
>userdata('logged_in')['id']);
$data["main_con tent"] = 'notification_view';
$this ->load ->view('includes/template.php', $data);
4.3.2 Utilizator de tip d octor
Făță de un utilizator normal doctorul are acces la anumite pagini în plus pentru a –
și gestiona programările din ziua curentă sau din zilele următore și pentru a completa
datele colectate în urma unei programări.
Pentru început doctorului în momentul logării în cont în meniul din stânga site -ului
web îi va apărea pagina “Programările mele ”, care odată accesată îi vor fi afișate 2 părți
unde vo r fi listate programări. În partea din stânga doctorului îi sunt afi șate programarile
pe care pacienții le au create și sunt confirmate de către administratori pentru ziua de
astăzi, în timp ce în partea dreaptă doctorului îi sunt afișate următoarele patru zeci de
programări din zilele următoare, astfel doctorul îsî va putea face un plan. Pagina arată ca
în captura de ecran de mai jos (Figura 26).
Figura 26 – programarile doctorului
48
Programările din partea dreaptă sunt sortate mai întâi după data când
programarea este cerută și apoi după ora confirmată. Query -ul trimis către baza de date
arată în felul următor :
$query = $this ->db->query("SELECT * FROM appointments WHERE doctorid = ?
AND `date` > ? AND `verified` = 1 ORDER BY `date` ASC, `confirmed_hour` ASC LIMIT
40", array($doctorID, date('m/d/Y')));
Doctorul ca orice alt pacient poate deschide programările pentru a afla detalii
despre pacient sau programare. Totodată fiind logat în cont de doctor acest a va putea
completa informații în urma consultului, informații cum ar fi: diagnosticul, tratamentul
prescris, recomandarile pentru pacient, cand consider ă doctorul ca este nevoie de un nou
consult, dar și alte informații care nu își găsesc loc în campurile numite anterior. În captura
de ecran de mai jos (Figura 27) se poate vedea formularul din pagina unei pro gram ări,
datele din acesta fiind deja completat e după cum scrie deasupra butonului de trimitere
(date adăugate pe …) sunt preluate automat de elementul “textarea ” al form ularului, dacă
nu ar fi fost deja introduse informațiile în acele câmpuri ar fi un text default numit
“placeholder ”.
Figura 27 – formularul de introducere a datelor unui consult efectuat
O scurtă parte din c odul scris î n partea de “view” al site -ului web pentru afi șarea
formularului pentru doctorul logat este :
<?php } elseif($this ->session ->userdata('logged_in')['id'] == $appointmentInfo ->doctorid)
{ ?>
<?php echo form_open_multipart("programaridoctor/addinfotoappointmen t"); ?>
<input type="hidden" name="appointmentID" value="<?php echo $appointmentInfo ->id;
?>">
<div class="md -input -wrapper">
<h4>Diagnostic</h4>
49
<div class="form -group">
<?php if($appointmentDetails ->diagnostic != null) { ?>
<textarea class="form -control" name="diagnostic" rows="3" maxlength="950"><?php
echo $appointmentDet ails->diagnostic; ?></textarea>
<?php } else { ?>
<textarea class="form -control" name="diagnostic" value="camp necompletat"
placeholder="introduceti aici textul dorit…" rows="3" maxlen gth="950"
required></textarea>
<?php } ?>
</div>
…
<?php if($appointmentDetails ->added_date) { ?>
<i>date adaugate pe data:</i> <?php echo $app ointmentDetails ->added_date; ?>
<?php } ?>
<div align="center">
<button type="submit" class="btn btn -danger waves -effect waves -light"> Trimite
informatiile </button>
</div>
<?php echo form_close(); ?>
<?php } ?>
Figura 28 – lista cu progra mările unui utilizator
50
În altă ordine de idei, doctorului îi mai este permis să vadă programăril e create în
trecut de pacient, accesând profilul acestuia, apoi butonul ‘Actiuni’ și apoi accesând lista
cu programarile create de utilizatorul respectiv. Pagina cu lista programărilor este
prezentată în Figura 28.
Pentru a facilita încărcarea rapidă și consumul mic de memorie lista totală de
programări create de un utilizator este împărțită pe pagini (vezi fig. 29).
Figura 29 – navigația prin paginile unei categorii
O parte din codul scris în controller pentru a crea paginarea programărilor este
următorul :
$params = array();
$limit_per_page = 25;
$start_index = ($this ->uri->segment(4)) ? $this ->uri->segment(4) : 0;
$total_records = $this ->Logs_model ->getTotalLogs("appointments", $userID);
if ($start_index < 0 || $start_index > $total_records) $start_index = 0;
if ($total_records > 0) {
$data["results"] = $this ->Logs_model ->getLog("appointments", $userID,
$start_index, $limit_per_page);
$config['base_url'] = base_url() . 'logs/appointments/' . $player;
$config['total_rows'] = $to tal_records;
$config['per_page'] = $limit_per_page;
$config["uri_segment"] = 4;
$config['full_tag_open'] = '<br><center><ul class="pagination m0">';
$config['full_tag_close'] = '</ul></center>';
$config['first_link'] = 'First Page';
$config['first_tag_open'] = '<li>';
$config['first_tag_close'] = '</li>';
$config['last_link'] = 'Last Page';
$config['last_tag_open'] = '<li>';
$config['last_tag_close'] = '</li>';
51
$config['next_link'] = '»';
$config['next_tag_open'] = '<li>';
$config['ne xt_tag_close'] = '</li>';
$config['prev_link'] = '«';
$config['prev_tag_open'] = '<li>';
$config['prev_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="active"><a href="#">';
$config['cur_tag_close'] = '</a></li>';
$config['num_tag_open'] = '<li>';
$config['num_tag_close'] = '</li>';
$this ->pagination ->initialize($config);
$data["links"] = $this ->pagination ->create_links();
4.3.3 Administrator
Administratorul este utilizatorul cu cel mai mare acces de pe site -ul web al clinicii.
Acesta pe l ângă meniurile standard din partea stângă îi mai este afișat un nou meniu
numit “Administrare ”. Pagina administrare este prezentat ă în Figura 30 de mai jos .
Figura 30 – pagina de administrare
52
În partea din stânga administratorul are câteva opțiuni pentru a c ăuta persoane
după anumite filtre cum ar fi adresa de email, numele prenumele persoanei sau numărul
de telefon. Funcția din partea de model pentru acel formular de căutare este scrisă în
următorul mod:
public function getBySearched Data($mail, $nume, $prenume, $phone) {
if(strlen($email) > 1 && strlen($phone) > 1 && strlen($nume) > 2 && strlen($prenume) >
2) {
$query = $this ->db->query("SELECT id, nume, prenume, phone, email, location
FROM users WHERE email = ? AN D phone = ? AND nume = ? AND prenume = ?",
array($mail, $phone, $nume, $prenume));
} elseif(strlen($mail) > 1 && strlen($phone) > 1) {
$query = $this ->db->query("SELECT id, nume, prenume, phone, email, location
FROM users WHERE email = ? AND phone = ?", ar ray($mail, $phone));
if($query ->num_rows()) return $query;
else return false;
} else {
$query = $this ->db->query("SELECT id, nume, prenume, phone, email, location FROM
users WHERE email = ? OR phone = ? OR nume = ? AND prenume = ?", array($mail,
$phone, $ nume, $prenume));
}
if(!$query ->num_rows())
$query = $this ->db->query("SELECT id, nume, prenume, phone, email, location
FROM users WHERE email = ? OR phone = ? OR prenume = ? AND nume = ?",
array($mail, $phone, $nume, $prenume));
if($query ->num_rows()) ret urn $query;
else return false;
}
Este o funcție care înlocuiește crearea unei funcții pentru fiecare dintre filtrele
alese în căutarea unui utilizator. Administratorul poate greși în scrierea numelui și
prenumelui unui pacient și poate inversa aceste date, astfel funcția “getBySearchedData ”
atribuie datele citite din formularul pentru căutarea unei persoane și în interiorul query –
ului atribuie atât numele introdus în formular la numele căutat în baza de date, dar și
numele introdus în formular la prenumele din baza de date, astfel dacă numele unei
persoane este “Popescu ”, iar prenumele “George ”, introduc ând în formularul de căutar e
datele inversate acesta tot va reuși sa găseasca în baza de date persoana căutată.
Accesând pagina cu lista de programări în așteptare administratorii pot vedea lista
cu acestea împărțite pe pagini.
53
Pagina pentru vizualizarea unei programări în așteptar e este diferită față de cea a
utilizatorilor normali pentru că aceasta are diferite opțiuni pentru alegerea intervalului orar
pentru a accepta programarea, butoane de acceptarea sau respingere și formular pentru
schimbarea datei programării.
În momentul î n care pagina cu o anumită programare care este în așteptare este
încărcată se verifica lista programărilor deja acceptate din data respectiv ă la doctorul
respectiv pentru a completa lista cu orele disponibile ca în captura de ecran de mai jos
(Figura 31).
Figura 31 – pagina de acceptare a unei programări
După cum putem observa în Figura 31 orele 9:30, 10:00 și 10:30 nu sunt
disponibile și nu pot fi selectate pentru acceptarea programării. După ce se selectează
ora aleasă administratorul apasă butonul de culoare verde numit “accept ă programare ”
și în baza de date se va confirma programarea la ora aleas ă și automat se va trimite o
notificare pe website către utilizatorul care a făcut programarea. Butonul “respinge
programare ” trimite către baza de date query -ul și seteaza programarea ca anulată, în
timp ce formularul “Schimb ă data ” trimite noua dată selectată către b aza de date. Funcția
din partea de model care verifică disponibilitatea doctorului pentru o dată anume este:
public function checkDoctorAvailable($doctor, $date, $string) {
$string = "%".$string;
$query = $this ->db->query("SELECT `id` FROM `appointments` W HERE
`doctorid` = ? AND `date` = ? AND `verified` = 1 AND `confirmed_hour` LIKE ? LIMIT 1",
array($doctor, $date, $string));
if(!$query ->num_rows()) return "true";
else return "false";
}
54
Partea de cod care preia data introdusă în formular și o trimite căt re baza de date,
iar apoi trimite o notificare în website către utilizatorul care a creat programarea arată în
felul următor :
$newDate = html_purify($this ->input ->post('appdate'), false);
$this ->db->query("UPDATE `appointments` SET `date` = ?, `verified` = 0 WHERE id =
?", ar ray($newDate, $appointmentID));
insertNotification($getAppointment ->clientid, "Programarea ta (ID:".$appointmentID.") la
medicul ".getUserFullName($getAppointment ->doctorid)." pentru ziua de
".$getAppointment ->date." a fost schimbata pe ntru noua data de:".$newDate.".",
"programari/view/".$appointmentID);
Utilizatorii de tip administrator pot accesa profilele utilizatorilor și în partea de sus
administratorilor le va fi afișat un buton numit “Admin Tools ” unde acestora le este oferit
accesul la logurile pentru conect ările pe contul utilizatorului respectiv, pot seta sau scoate
gradul unui doctor și pot seta sau scoate gradul de administrator altor utilizatori ca în
figura de mai jos (Figura 32).
Figura 32 – meniul de administrator
În momentul în care utilizator face click pe opțiunea “scoate gradul de doctor ”
acesta va fi întampinat de o fereastră ca cea din figura de mai jos (Figura 33) unde este
întrebat din nou daca dorește sa îi seteze sau să îi scoat ă gradul, astfel evităm click -urile
accidentale pe acele link -uri.
55
Figura 33 – setarea gradului de doctor
După ce un profil de utilizator nou este setat ca doctor, acestuia i se poate seta
specializarea sau specializările sale direct din profil fără a fi nevoie de conectarea
dezvoltatorului la baza de date pentru a oferi aceste grade.
Figura 34 – setarea specializarilor unui doctor
Codul și query -urile trimise către baza de date din partea de control ler pentru
această parte de setarea a specializ ărilor este :
$this ->load ->library('form_validation');
$this ->form_validation ->set_rules('specializare1', 'Prima specializare',
'differs[specializare2]|differs[specializare3]|differs[specializare4]|numeric|less_than[56]');
56
$this ->form_validation ->set_rules('specializare2', 'A doua specializare',
'differs[specializare1]|differs[specializare3]|differs[specializare4]|numeric|less_than [56]');
$this ->form_validation ->set_rules('specializare3', 'A treia specializare',
'differs[specializare1]|differs[specializare2]|differs[specializare4]|numeric|less_than[56]');
$this ->form_validation ->set_rules('specializare4', 'A patra specializare',
'differs[specializare1]|differs[specializare2]|differs[specializare3]|numeric|less_than[56]');
if($this ->form_validation ->run() == FALSE) {
$data["main_content"] = 'profile_view';
$this ->load ->view('includes/template.php', $data);
} else {
$firstT ype = (int)html_purify($this ->input ->post("specializare1"), false);
$secondType = (int)html_purify($this ->input ->post("specializare2"), false);
$thirdType = (int)html_purify($this ->input ->post("specializare3"), false);
$fourthType = (int)html_purify($this ->input ->post("specializare4"), false);
if(strlen($firstType) > 0 && strlen($secondType) > 0 && strlen($thirdType) > 0 &&
strlen($fourthType) > 0) {
$this ->db->query("UPDATE `users` SET `doctor_type1` = ?, `doctor_type2` = ?,
`doctor_type3` = ?, `doctor_type4` = ? WHERE `id` = ?", array($firstType, $secondType,
$thirdType, $fourthType, $userID));
} elseif(strlen($firstType) > 0 && strlen($secondType) > 0 && strlen($thirdType) > 0) {
$this ->db->query("UPDATE `users` SET `d octor_type1` = ?, `doctor_type2` = ?,
`doctor_type3` = ? = ? WHERE `id` = ?", array($firstType, $secondType, $thirdType,
$userID));
} elseif(strlen($firstType) > 0 && strlen($secondType) > 0) {
$this ->db->query("UPDATE `users` SET `doctor_type1` = ?, `doctor_type2` = ?
WHERE `id` = ?", array($firstType, $secondType, $userID));
} elseif(strlen($firstType) > 0) {
$this ->db->query("UPDATE `users` SET `doctor_type1` = ? WHERE `id` = ?",
array($firstType, $userID));
}
Din nou se folo sește libraria de vali dare a formularelor din framework -ul
CodeIgniter, astfel ne asig urăm c ă fiecare dintre câmpurile selectate sunt diferite între ele
57
pentru a evita apariția cazurilor în care, de exemplu, doctorul cu id -ul 10 în baza de date
are setat de 4 ori specializarea “Cardiologie ”.
CAPITOLUL 5. CONCLUZII
În zilele noastre internetul are o importanță foarte mare și exploatarea
oportunităților oferite de acesta trebuie să fie o prioritate pentru orice companie modernă
mai ales dacă concurența companiei respective își are deja prezența în mediul online.
Impor tanța foarte mare a internetului vine și din faptul că acesta este disponibil de pe
aproape toate dispozitivele moderne de la calculatoare, telefoane inteligente și tabele,
până la ceasuri inteligente și televizoare de tip inteligent.
Avantajul unui websi te este că acesta ramâne permanent online, utilizatorul nu are
nevoie de resurse foarte mari pentru a -l accesa, nu are nevoie de software descărcat
separat care la rândul său ar ocupa spațiu de stocare și consider că acest avantaj este
unul dintre cele mai importante, de asta și cred că tot ce ține de partea de web este viitorul
în tehnologie.
La baza aplicației “MediCare ” – clinic ă medicală online stă limbajul de programare
PHP împletit cu bazele de date SQL. Limbajul PHP deși nu este un limbaj nou este un
limbaj foarte puternic și foarte des folosit în zilele noastre. Din aceste motive am ales
limbajul PHP pentru implementarea acestei aplicații web împreună cu framework -ul
CodeIgniter care ajută la securitate și la anumite aspecte menționate în capitolul
Tehnologii folosite.
Deși tehnologia avansează rapid și totul se poate schimba de la o zi la alta, limbajul
PHP încă ocupă un loc foarte important în lumea tehnologiei și are un rol deosebit de
mare în d ezvoltarea noilor tehnologii ce vor apărea.
Aplicația “MediCare ” – clinic ă medicală online este doar o parte mic ă din tot ce ar
putea face în materie de site -uri web folosind limbajul PHP, dar totuși este o parte
semnificativă deoarece folosirea lui ușurează munca oamenilor de la vârste mici și până
la vârst e mari.
58
BIBLIOGRAFIE
1. Anghel, Traian, Programarea în PHP. Ghid practic , Polirom, 2005.
2. Upton, David , CodeIgniter for Rapid PHP Application Development: Improve your
PHP coding productivity with the free compact open -source MVC CodeIgniter
framework! , Packt Publishing, 2007.
3. Pitt, Chriss , Pro PHP MVC , Spring er-Verlag Berlin and Heidelberg, 2012.
4. Clarke, Justin, SQL Injection Attacks and Defense , Syngress Media, 2012.
5. Hudson, Paul, PHP in a Nutshell: A Desktop Quick Reference , O'Reilly Media ,
2005, la https://books.google.ro/books?id=dm2_jgULbBUC .
6. Amazon Statistics You Should Know: Opportunities to Make the Most of
America’s Top Online Marketplace , https://www.bigcommerce.com/blog/amazon –
statistics/#10 -fascinating -amazon -statistics -sellers -need -to-know -in-2020
7. PHP Manual , by the PHP Documentation Grou p, https://www.php.net/manual/en/
8. Tutortial PHP , disponibil la : https://www.w3schools.com/php/
9. CodeIgniter Framework User Guide , la: https://codeigniter.com/userguide3/
10. Skvorc, Bruno, " The Best PHP Framework for 2015: SitePoint Survey Results ",
30.03.2015, la https://sitepoint.com/best -php-framework -2015 -sitepoint -survey –
results/
11. Cațaron, Angel, curs baze de date, capitolul 5 , la:
http://vega.unitbv.ro/~cataron/Courses/BD/BD_Cap_5.p df
12. Prodromou, Agathoklis, " Exploiting SQL Injection: a Hands -on Example ",
26.03.2019, la: https://www.acunetix.com/blog/articles/exploiting -sql-injection –
example/
13. Blum , Richard, MySQL Features , la:
https://www.dummies.com/programming/php/mysql -features/ Thakur, Ankush,
"What is SQL Injection and How to Prevent in PHP Applications? ", 09.03.2020,
la: https://geekflare.com/sql -injection -prevention -php/
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Lucrare de licen ță [614093] (ID: 614093)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
