Sunteți pe pagina 1din 80

LUCRARE DE DIPLOMĂ

Aplicaţie WEB. Examen Grila


Online
Aplicaţie Web. Examen Grilă Online

Argument. Justificarea alegerii temei

Mediul Internet a cunoscut o dezvoltare fără precedent în ultimii ani,


prezenţa şi utilizarea sa ajungând să fie practic indispensabile în multe
domenii de activitate. Parte integrantă a societăţii, pe de o parte, şi
promotor al informaţiilor şi noutăţilor de ultimă oră, nici învăţământul, cel
superior în particular, nu a putut rămane indiferent la aceasta, integrarea
Internet-ului în procesul instructiv-didactic venind practic de la sine.
Învăţarea şi instruirea bazate pe Web oferă astfel o nouă dimensiune
actului pedagogic, permiţând în acelaşi timp un acces lărgit şi
“democratic” la sursele de informaţii.
Din această perspectivă si cum orice proces de învaţare presupune
şi testarea cunoştiinţelor acumulate, a apărut ideea unui site destinat
testării online a studenţilor. Lucrarea de faţă vine în întâmpinarea
acestor idei, oferind o soluţie viabilă şi eficientă, prezentând o aplicaţie
software din clasa aplicaţiilor cu baze de date pe Internet. În cazul nostru
aplicaţia a fost concepută pentru a rula atât în mediul Internet, cât şi în
Intranet.
Publicul ţinta a fost bine definit: studenţi si elevi, ca urmare s-a ţinut
cont de necesitatea acestora de a obţine rapid si cu un grad mare de
acurateţe informaţiile dorite. Din acest motiv s-a preferat evitarea
meniurilor complexe, cu multe opţiuni, preferându-se imparţirea
suprafeţei utile de lucru în zone clare de interes, care să permită
evaluarea rapidă a informaţiei şi stabilirea gradului de interes
corespunzător.
Scopul aplicaţiei este crearea unui site Web dedicat examinării
studenţilor printr-un examen grilă online, grupat în două module,
secţiunea utilizatorilor, în cazul de faţa al studenţilor şi cea a
administratorului (ce are la dispoziţie unelte pentru managementul
utilizatorilor ,al bazei de date).
- studenţii unei facultăţi au acces la informaţii utile (detalii
despre obiectul studiat, cursuri, laboratoare), acces la examen.
- administratorii aplicaţiei au următoarele facilităţi: uşurinţa la
instalare şi configurare, securitatea oferită asigură integritatea
datelor, aplicaţia poate fi uşor modificată pentru dezvoltări
ulterioare.

Avantajele aplicaţiei:
- site-ul poate fi foarte uşor personalizat
- poate fi folosit atat pe Internet, cat si pe reţeaua locală a unei
companii
- datorită tehnologiilor folosite (PHP, mySQL) este independent
de platformă, in sensul că poate fi upload-at atât pe servere cu
Linux, cat şi pe cele cu Windows.

2
Aplicaţie Web. Examen Grilă Online

Sistemul dispune de un nivel primar de securitate, la nivel de


utilizator, în sensul că utilizatorul este înregistrat de către o persoană
autorizată si işi poate administra singur contul şi nu permite browse-area
directoarelor aplicaţiei prin evitarea paginii de logare.
In final trebuie spus că site-ul a fost conceput în ideea găzduirii în
cadrul unei instituţii de învăţământ (şi accesat intranet/internet), varianta
prezentată fiind una deschisă, destinată dezvoltării, actualizării şi
îmbunătăţirii permanente.

3
Aplicaţie Web. Examen Grilă Online

Capitolul 1. Noţiuni Generale

1.1. Notiuni indroductive

Sistemul de învăţământ a cunoscut o mare dezvoltare prin


intermediul internetului, aceasta datorită multitudinilor de informaţii
oferite de acesta. De aici a plecat şi ideea creeări unui site care să poată
să testeze cunoştiinţele studenţilor sau elevilor la terminarea unui curs
sau a unui laborator.
În momentul de faţă testele sunt generate aleator şi pot conţine 10
– 30 întrebări, în funcţie de alegerea pe care o face profesorul, acelaşi
lucru se întâmplă şi cu timpul pus la dispoziţie pentru rezolvarea grilei,
acesta putând varia între 10 -120minute.
Pentru acest lucru studenţii sunt nevoiţi să-şi creeze un cont cu
user şi parolă. La inscriere datele trebuiesc introduse corect, deoarece se
face verificarea acestora cu cea aflată în baza de date cu studenţii
înscrişi la cursul respectiv. Acest lucru a fost conceput în scopul de a
preveni creearea de utilizatori din afara facultăţii.
A fost creeată şi o interfaţă de administrare a utilizatorilor si de
administrare a bazei de date.
Se doreşte ca acest site să se dezvolte astfel încât să satisfacă
toate cerinţele şi de aceea el rămâne deschis oricărei propuneri de
îmbunătăţire a site-ului.

1.2 . Intranet

Se pune din ce in ce mai mult astazi accent pe organizarea digitală


a informaţiilor unei instituţii de învăţământ, în principal pe un sistem
integrat de informaţii care să contribuie la înlesnirea si îmbunătaţirea
activităţilor acelei instituţii. Majoritatea acestor instituţii posedă o reţea
locală de computere (LAN) care de obicei este folosită doar pentru e-
mail, acces internet şi sharing simplu de documente. Adesea această
reţea de calculatoare este asociată cu termenul “Intranet”.

Din punct de vedere practic Intranetul ar trebui definit ca un set de


aplicaţii construite pe baza tehnologiilor Internet, destinate nevoilor
interne ale unei instituţii. Intranetul este de obicei accesibil via LAN sau
WAN (Wide Area Networks). Toate informaţiile si resursele pot fi
accesibile intr-o manieră organizată, într-un cadru securizat, activităţile
efectuate prin intermediul PC-ului pot fi organizate în fluxuri de lucru cu
roluri si etape bine definite. Soluţiile oferite constau într-un mediu
client/server pe mai multe nivele, unde marea parte a procesărilor se
efectueaza pe server. Aceasta conferă două avantaje majore: în primul
rând, datorită faptului că serverul se ocupă cu majoritatea sarcinilor,
calculatoarele pe care rulează aplicaţiile client nu au nevoie de putere
mare de calcul, deci rezultă un cost mai mic al staţiilor de lucru. În al
doilea rând, datorită structurii logicii aplicaţiei pe mai multe nivele,

4
Aplicaţie Web. Examen Grilă Online

sarcina procesărilor pe server poate fi împărţită pe mai multe


calculatoare, fiecare din acestea putând fi configurat astfel încât să
producă rezultate optime pentru genul de acţiune pe care o prestează
(ex: nivelul bazelor de date, nivelul serverului de aplicaţii, nivelul
serverului de web, de mail etc.)

Deseori, in soluţiile intranet, ca şi client este folosit un browser de


Internet. Cererile sunt procesate pe server, iar rezultatul este întors sub
formă de pagini web. Astfel, se elimină riscul dependenţei de platformă,
eliminând costurile unor noi licenţe de sisteme de operare. În plus orice
update al aplicaţiei este făcut centralizat, pe server, iar schimbările vor fi
vizibile imediat clienţilor. Dacă reţeaua de calculatoare este legată la
Internet se pot rula aplicaţiile de oriunde, printr-un cadru de securitate
pe mai multe nivele, asigurându-se astfel confindenţialitatea informaţiilor
schimbate si integritatea bazei de date centrale. Soluţiile au o structură
modulară într-o arhitectură deschisă, se pot achiziţiona doar
funcţionalităti care interesează si se pot construi altele noi, în funcţie de
cerinţele viitorului.

1.3. World Wide Web

Internetul, supranumit şi „reţeaua reţelelor“, poate fi definit ca


totalitatea calculatoarelor şi a reţelelor de calculatoare ce comunică între
ele printr-un anumit protocol. Internet reprezintă mult mai mult decât o
reţea uriaşă de calculatoare. El constituie o reţea de retele şi în plus un
mediu informaţional şi de calcul cu foarte bogate servicii şi resurse,
biblioteci şi baze de date; este în acelaşi timp şi o imensă comunitate de
persoane din toate domeniile vieţii economico-sociale, gata să răspundă
la solicitări şi să partajeze informaţii.

Dezvoltarea lumii Internet a depasit cu mult cele mai optimiste


viziuni ale proiectanţilor initiali. Deşi cu destinaţii relativ educaţionale,
realizarile tehnologice din domeniul computerelor si comunicatiilor a
impus ca element major a societăţii informaţionale a secolului XXI
structurile de procesoare conectate în diferite topologii de reţele, in
principal toate putând vehicula informaţii la nivel global datorită unor
standarde de reprezentare a informaţiilor precum şi unor protocoale de
comunicaţii adecvate.

Lansat relativ recent (1989), prin WEB s-a vrut în principal definirea
unui mod de reprezentare a documentelor complexe conţinand pe lângă
text, şi imagini, animaţie, sunete astfel încât acestea să poata fi
vehiculate economic pe reţeaua Internet deja aparută din anii ’60.
Iniţiatorul acestui proiect a fost Tim Berners-Le, cercetător in cadrul
Consiliului European pentru Cercetarea Nucleară (CERN), Laboratorul
European pentru Fizica Particulelor de la Geneva. Obiectivul principal al
proiectului a constat in definirea unui sitem hipertext de comunicare
între computere pentru schimbul de documente în vederea utilizării în

5
Aplicaţie Web. Examen Grilă Online

comun a rezultatelor cercetărilor stiinţifice. Noua structură denumită


TML(), derivată din SGML (Standard Generalized Markup Language, ISO
8879), a devenit rapid un limbaj standard de marcare a documentelor
hipertext.

Ca şi in alte cazuri, rezultatele au fost extrapolate in afara reţelei


proprii de cercetare, noţiunea de WEB căpătând dimensiuni planetare.
Pe la sfârşitul anului 1990, Berners-Lee împreună cu Robert Cailiau
au creat primul browser (navigator) pentru web şi totodată primul server.
Aceste browsere aveau nevoie de un protocol prin care să fie
reglementată discuţia cu serverele; pentru aceasta, Berners-Lee şi
Cailiau au creat prima versiune a protocolului HTTP (Hypertext Transfer
Protocol).

De atunci, traficul web a crescut şi a dominat Internetul. În 1998,


protocolul HTTP acumula 75% din traficul serverelor. Restul era ocupat
de email, FTP (File Transfer Protocol) şi administrare de la distanţă prin
intermediul canalelor VPN (Virtual Private Network). Astăzi, cel puţin în
limbajul curent, Reţeaua Mondială - World Wide Web înseamnă Internet.
Şi WWW-ul continuă să crească. La sfârşitul anului 2002, Proiectul
Censorware reporta că pe Web se vehiculau:
− mai bine de 3.2 miliarde de pagini
− 62 300 000 000 000 byte de text
− 721 milioane de imagini
− 12 300 000 000 000 bytes de imagini

Recentele dezvoltări ale reţelelor fără fir (Wireless) datorate în


special cercetărilor din ţarile nordice ale Europei (Finlanda, Danemarca,
Suedia) cu posibilitatea implementării unor browsere pe telefoane
celulare multiplica masiv numărul utilizatorilor produselor WEB. Faţă de
specificaţiile iniţiale, HTML suportă versiuni de actualizare, o extensie
consistentă fiind realizată odată cu lansarea structurii XML (Extensible
Markup Language). Aducându-se noi facilităţi, în special în flexibilitate şi
funcţionalitate, noul standard accepta şi documente în format HTML cu
versiuni mai mari de 4.0.

Principalele produse web sunt serverele WEB, browserele WEB,


precum şi structurile vehiculate între acestea, în mod uzual denumite
pagini WEB. Din categoria serverelor WEB cele mai cunoscute şi mai
folosite sunt IIS (Internet Information Server dezvoltat de către Microsoft
Corporation) si Apache (dezvoltat iniţial pentru platforma Linux).

Programele de tip browser (client) schimbă informaţii cu


programele server utilizând în acest sens protocolul HTTP.

1.4. Gestiunea datelor

6
Aplicaţie Web. Examen Grilă Online

Problema proiectării unei structuri eficiente pentru datele necesare


unei probleme constituie cheia întregii aplicaţii. În general în aplicaţiile
de gestiune, problema cea mai mare nu o reprezintă implementarea
aplicaţiei de exploatare a bazei de date cât proiectarea unei structuri
care să permita accesul cât mai rapid la date şi care să sufere de cat mai
puţine anomalii. După cum se spune şi este demonstrat practic, dându-
se o problema putem rezolva 50% din ea proiectând structurile adecvate.

În alegerea pe care vrem să-l folosim o foarte mare pondere o


reprezintă protecţia datelor. Astfel cele două cerinţe de bază legate de
protecţia datelor cu care lucrează sunt:
- asigurarea confidenţialităţii anumitor informaţii;
- asigurarea integrităţii datelor prin protecţia datelor în condiţiile
accesului multiutilizator şi împotriva defectelor hardware sau
erori ale programatorilor.

Confidenţialitatea datelor înseamnă protecţia împotriva accesului


neautorizat la bazele de date. Este rolul administratorului de sistem de a
decide necesitatea unui sistem de securitate şi de a menţine integritatea
acestuia. Înainte de a defini un plan de securitate este necesar să fie
detectate toate riscurile posibile şi să fie analizate consecinţele directe si
indirecte. Câteva mecanisme de asigurare a confidenţialităţii datelor
sunt:
- criptarea datelor cele mai importante (de ex. parolele care
trebuiesc ţinute criptate)
- accesul restricţionat către anumite date ale sistemului (de ex.
tabela cu utilizatorii care se pot conecta la respectivul sistem de
date)

Cel de-al doilea aspect, cel al integrităţii datelor se realizeaza prin


prevenirea introducerii unor date incorecte si efectuarea unor prelucrări
greşite si presupune includerea in programele de aplicaţie a unor
secvenţe de testare a datelor si respectarea restricţiilor de integritate a
bazei de date. Un avantaj major al folosirii bazelor de date in reţelele de
calculatoare este acela al accesului unui utilizator la versiunea
actualizată a unei baze de date. Dar în acelaşi timp pot avea loc si situaţii
conflictuale când doi administratori doresc să modifice aceeaşi dată,
sistemul trebuie controlat astfel încât datele să nu fie compromise sau
actualizate necorespunzător.
Organizarea datelor ocupă un rol important în proiectarea
sistemelor informatice. De modul în care sunt organizate datele depinde
eficienţa sistemului informatic.

Organizarea datelor presupune:


- definirea, structurarea, ordonarea si gruparea datelor în colecţii
de date omogene;
- stabilirea legăturilor (relaţiilor) între date, între elementele unei
colecţii de date;
- reprezentarea (stocarea) lor pe un suport informaţional,
prelucrabil într-un sistem de calcul;

7
Aplicaţie Web. Examen Grilă Online

Scopul organizării datelor îl constituie regăsirea automată a datelor


după diverse criterii si forme. Obiectivele urmărite în organizarea datelor
sunt:
- timpul de acces la datele organizate pe diferite suporturi de
date să fie minim (acces rapid la date);
- spaţiul de memorie internă si externă ocupat de date să fie cât
mai redus (economie de memorie internă si externă). Se
urmareşte ca pe un spaţiu de memorie cât mai mic să se
introduca un volum cât mai mare de date; - datele să apară o
singură dată în sistem (unicitatea datelor). Totuşi, uneori, pentru
realizarea unui acces mai rapid la date, se impune acceptarea
unei redundanţe minime a datelor;
- în sistemul de organizare a datelor să se reflecte, pe cât posibil,
toate legăturile dintre date;
- să se permita schimbarea structurii datelor si relaţiilor dintre ele
(flexibilitatea datelor).

Evoluţia metodelor si tehnicilor de organizare a datelor a fost


determinată de necesitatea de a avea acces cât mai rapid şi mai usor la
un volum din ce in ce mai mare de informaţii precum şi de perfecţionarea
echipamentelor de culegere, memorare şi prelucrare a datelor. Conceptul
de bază de date poate fi definit ca fiind una sau mai multe colecţii de
date aflate in interdependenţă, împreună cu descrierea datelor şi relaţiile
dintre ele.
O altă mare problemă care se pune la alegerea unui sistem de
gestiune a bazelor de date este aceea a costurilor.

Conceptele modelului E-R sunt: entitate, atribut, valoare.


Acestea sunt legate între ele după cum urmează: o entitate are
mai multe atribuţii, iar atributelor li se asociaza o mulţime de valori.
Prin entitate se înţelege un obiect concret sau abstract reprezentat
prin proprietăţile sale. Orice proprietate a unui obiect poate fi exprimată
printr-o pereche (ATRIBUT, VALOARE).
Noţiunea de atribut este cunoscută şi sub denumirea de câmp.
Fiecare atribut este caracterizat de natura valorilor pe care le poate lua.
Astfel un atribut este de tip numeric dacă valorile sale sunt numerice,
alfanumerice dacă valorile sale sunt şiruri de caractere, etc…In general,
un atribut are valori elementare, dar pot exista atribute ce identifică în
mod unic o entitate, ele numindu-se atribute cheie sau pot exista si
atribute care nu identifică in mod unic o entitate şi se numesc atribute
non cheie.
Structura de date este definită ca o colecţie de date între care s-au
stabilit o serie de relaţii care conduc la un anumit mecanism de selecţie
si de identificare a componentelor.
Mulţimea de date asociată structurii poate fi alcatuită din datele
unui tip sau mai multor entităţi. Componentele structurii pot fi
individualizate si identificate prin nume (identificator) sau prin poziţia pe
care o ocupă în structură (în raport cu ordinea specificata).
Componentele unei structuri de date pot fi date elementare sau pot fi ele
însele structuri de date.

8
Aplicaţie Web. Examen Grilă Online

Un tip de structură de date este o mulţime ordonată de date între


care s-au stabilit anumite relaţii, şi pentru realizarea operaţiilor se
foloseşte un grup de operatori de bază cu o anumită semantică. Entităţile
sunt legate între ele prin cardinalitate. Cardinalitatea asocierilor exprimă
numărul minim şi maxim de realizări (instante) de entitate care pot fi
asociate cu o realizare a partenerului de asociere. Acesta se exprimă prin
perechi de numere, câte o pereche pentru fiecare entitate din cadrul
legăturii.

Pentru identificarea asocierilor dintre entitati pe baza unor legături


se identifică atributele aferente ce exprimă caracteristici, proprietati ale
componentelor sistemului analizat. Aceste atribute de indentificare
(cheie) reprezintă atribute care se caracterizează prin unicitatea valorilor
pentru fiecare instanţă a entităţii.
În scopul stabilirii atributelor de idenficare pentru entităţile din
cadrul sistemului analizat este necesar sa se examineze mai întâi
potenţialitatea fiecărui atribut de a se construi drept cheie. Pentru
aceasta atributele respective trebuie să îndeplinească o serie de cerinţe:
 să ofere o identificare unică a instanţelor de entitate.
Unicitatea cheii impune ca la încărcarea unui tuplu, valoarea cheii să fie
cunoscută, pentru a se putea verifica faptul că această valoare nu există
deja încarcată. Restricţia de integritate impune ca într-o relaţie atributele
cheii primare să fie nenule;
 să posede o semnificaţie;
 să fie uşor de utilizat;

Trecerea de la diagrama E-R la modelul relaţional.


Modelul relaţional de date rezultat subliniază faptul că orice
structură de date poate fi reprezentata prin una sau mai multe tabele de
date, in cadrul carora este necesar sa existe si informatii de legatura,
pentru asigurarea legaturilor intre tabele. Folosirea acestui model
asigura un grad sporit de independenta a programelor de aplicatie fata
de modul de reprezentare interna a datelor si metodelor de acces la
date. Metodele si tehnicile folosite furnizeaza coerenta datelor,
integritatea si confidentialitatea acestora.
Restrictiile de integritate, denumire si reguli de integritate,
definesc cerintele pe care trebuie sa le satisfaca datele in cadrul bazei de
date pentru a putea fi considerate corecte, coerente in raport cu lumea
reala pe care o reflecata.
Se afirma adesea ca modelul relational este prea simplu pentru a
putea exprima semantica datelor. Relatiile bazei de date sunt toate la
acelasi nivel, iar setul de operatori este relativ sarac, neputand exprima
semantica operationala a obiectelor complexe, aspect ce ramane exclusiv
in sarcina programelor de aplicatie. Cu toate acestea, sistemele relationale
detin o serie de mecanisme pentru tratarea aspectelor de ordin semantic.
Restrictiile de integritate reprezinta principalul mod de integrare a
semanticii datelor in cadrul modelului relational al datelor, mecanismele
de definire si verificare a acestor restrictii reprezentand principalele
instrumente pentru controlul semanticii datelor. Avantajele incorporarii
semanticii datelor in cadrul bazelor de date constau din posibilitatea

9
Aplicaţie Web. Examen Grilă Online

intretinerii mai usoare a aplicatiilor si posiblitatea implementarii unor


mecanisme fizice mai eficiente.
Modelul relational ofera urmatoarele avantaje: accesul la date este
mai usor pentru ca datele sunt reprezentate sub forma de tabele
bidimensionale. Legaturile dintre colectii sa fac prin chei. Programele nu
depind de structura fizica. Datele pot fi prelucrate diferit de utilizatori
diferiti. Structura datelor se poate imbunatati prin operatia de normalizare.
Ameliorarea schemei conceptuale se realizeaza prin aducerea
tabelelor in forma normala 3, compromisul fiind intre dimensiunea bazei
de date si viteza necesara prelucarii cererilor clientilor.

10
Aplicaţie Web. Examen Grilă Online

Capitolul 2. Tehnologii folosite

2.1. Serverul de aplicaţii - Apache

Un server web este un program care rulează pe un calculator,


aşteaptă pe un port o conexiune TCP venită de la un client şi serveşte
acestuia pagini web folosind protocolul HTTP.
Schema de principiu a funcţionării unui server web

Serverul web este un software, un program de sine stătător, un


executabil cu o funcţie bine stabilită: accea de a servi la cerere pagini de
Internet într-un mod bine determinat.

Apache Web Server este o aplicaţie software standalone,


concepută ca un server Web care poate fi folosită de majoritatea
sistemelor de operare existente la această dată. Apache Web Server sau
Apache HTTP Deamon cum este numi pe site-ul www.apache.org si este
parte componentă a proiectului GNU General Public License (GPL). Prima
lansare oficială a avut loc in Aprilie 1995 iar de atunci programatori din
intreaga lume au colaborat cu autorii pentru a se fixa bug-uri, a se scrie
nou cod, idei sau documentaţii. Apache Group, o echipă de programatori
cu responsabilitate directă asupra proiectului. Apache au format Apache
Software Foundation organizaţie care asigură suport legal, financiar
pentru proiectul Apache.
Apache este proiectat să fie modular, cu module şi pachete uşor de
adăugat la serverul web Apache. Cele mai populare module sunt
mod_perl şi mod_php. Un pachet important este Tomcat web server.
Modulele sunt API (Aplication Programming Interface) care sunt create de
programatori pentru a extinde funcţionalitatea serverului Apache şi pot fi
rulate doar impreună cu serverul Apache deoarece nu pot rula singure.
Pachetele deşi pot fi integrate in Apache au abilitatea de a rula ca
aplicaţii standalone. Diferenţa între module şi pachete nu este definită în
totalitate.

Iată câteva din cele mai importante atuuri ale acestui server Web:
- Este un web server puternic, flexibil, care respectă
standardele HTTP/1.1

11
Aplicaţie Web. Examen Grilă Online

- Ocupă 80% din numărul total al serverelor de web active


momentan pe Internet (următorul este Internet Information Server, cu
5%)
- Implementează ultimele protocoale, inclusiv HTTP/1.1
(RFC2616)
- Este foarte configurabil şi extensibil cu module provenite de
la diferiţi dezvoltatori
- Poate fi customizat, scriind 'modules' folosind API-ul pentru
module de la Apache
- Suport pentru IPv6, viitoarea implementare a adresării IP-
urilor
- Licenţă nerestrictivă, codul este open source
- Rulează pe Windows NT/9x, Netware 5.x şi mai vechi, OS/2,
aproape toate subfamiliile Unix, precum şi pe alte câteva sisteme de
operare
- Este dezvoltat în continuu, eventualele erori fiind corectate în
timpi foarte mici; implementează diferite cereri de la utilizatori, cum ar fi:
baze de date DBM pentru autentificare; permite crearea unor
pagini/secţiuni protejate de parolă pentru un utilizator sau un grup de
utilizatori fără a aduce un surplus de activitate serverului
- Erori customizabile pentru erori şi diferite probleme permite
setarea unor fişiere sau chiar a unor scripturi care să fie returnate de
server atunci când serverul răspunde cu o pagină de eroare
- Negociator de conţinut: abilitatea de a servi automat clienţi
care suportă diferite nivele de compatibilitate cu standardul HTML, cu
documente care oferă cea mai bună reprezentare a informaţiei pe care
clientul poate să o accepte
- Host-uri Virtuale (adesea cunoscută ca “server cu mai multe
case” = multi-homed servers. Acesta permite serverului să distingă între
cereri diferite care vin pe adrese diferite/nume de domeniu sau IP
(mapate pe o aceeaşi maşină)
- Audit al acţiunilor: se poate configura Apache astfel încât să
genereze erori în formatul de loguri dorit. Ca un bonus, pe marea
majoritate a maşinilor bazate pe arhitectura Unix, Apache-ul poate
trimite fişierele de audit către pipe-uri, permiţând astfel filtrarea hit-
urilor, despărţirea real-time în diferite fişiere de audit pentru virtual host-
urile găzduite de el, rezolvarea DNS-ului asincron în mod real-time

Popularitatea serverului Apache este in contiunua crestere. In Mai


2004 procentul detinut pe piata serverelor Web era de aproape 77,21%.
Aceasta cifra reprezinta mai mult decat toate celelalte servere web la un
loc.
Apache Web Server a fost ales pentru acest proiect din mai multe
motive. Primul dintre acestea este acela ca Apache Web Server este
oferit cu pachetul mod_php deja integrat, posibilitatea incompatibilităţii
fiind foarte mica. Un alt motiv pentru alegerea noastră este uşurinţa
instalării, configurării si întreţinerii. Datorită faptului ca proiectul a fost
proiectat pentru a rula pe cat mai multe platforme serverul Apache s-a
considerat ca fiind cel mai potrivit.

12
Aplicaţie Web. Examen Grilă Online

2.2. Sisteme de gestiune a bazelor de date -


MySQL

MySQL, un sistem client/server de gestiune a bazelor de date


relaţionale originar din Scandinavia care include un server SQL,
programe client pentru accesul la server, instrumente administrative şi o
interfaţă de programare pentru scrierea propriilor dumneavoastră
programe.

MySQL este un produs al companiei MySQL AB, şi face parte la


rândul său din proiectul GNU General Public License (GPL). MySQL se
distinge de celelalte sistem de gestiune a bazelor de date prin
următoarele caracteristici:

 uşurinţa în folosire: foloseşte sintaxa standard SQL


(Structured Query Language), însă suportă conexiunea cu aplicaţii care
folosesc ODBC (Open Database Connectivity);
 viteză. MySQL este rapid. Programatorii pretind că MySQL
este cel mai rapid sistem de baze de date pe care îl puteţi găsi;
 cost zero, MySQL este gratuit pentru majoritatea utilizărilor
interne;
 rapiditate: este mai rapid decat majoritatea optiunilor aflate
la dispozitie (de ex. PostgreSQL, AdaBasD, Empress pentru platformele
Linux, cat si decat Acces 2000, DB2, Informix, mSQL, MSSQL, Solid,
Sybase si Oracle 8.0.3. pentru platformele Windows);
 conectivitate şi securitate, MySQL poate fi folosit integral în
reţele, iar bazele de date sunt accesibile de oriunde din Internet, deci se
pot partaja datele cu oricine, oriunde. Dar MySQL are controlul accesului,
astfel încât persoanele care nu au dreptul să vă citească datele nu vor
avea această posibilitate.
 caracteristici. La server se pot conecta mai mulţi clienţi
simultan. Clienţii pot folosi mai multe baze de date simultan. Se poate
obţine acces la MySQL în mod interactiv, folosind numeroase interfeţe
care vă permită introducerea interogărilor şi vizualizarea rezultatelor:
clienţi în linie de comandă, browsere Web sau clienţi X Window System.
De asemenea, este disponibilă o varietate de interfeţe de programare
pentru limbaje precum C, Perl, Java, PHP şi Python. Astfel, există
opţiunea de a folosi programe client preambalate sau de a scrie propriile
programe client pentru aplicaţii personalizate.
 distribuţie liberă. MySQL este uşor de obţinut; pentru
aceasta, se foloseşte browserul de Web. Dacă nu se înţelege
funcţionarea unei componente sau apare curiozitatea cu privire la un
algoritm, se poate procura codul sursă pentru examinare. Dacă modul de
funcţionare a unei componente nu este mulţumitoare, acesta se poate
modifica.
 portabilitate: datorita faptului ca este disponibil pentru mai
multe platforme (Windows, Linux, MacOs) se supune principiului “Write
ONCE Run EVERYWERE”.

13
Aplicaţie Web. Examen Grilă Online

MySQL este un candidat ideal pentru evaluare dacă vă aflaţi în


procesul de selectare a sistemelor de baze de date

2.3. PHP

PHP4 este ultima „încarnare” a PHP-ului – Preprocesorul


Hypertext PHP (iniţial numit Personal Home Page). Este un limbaj de
programare pentru crearea de site-uri web dinamice, interactive, aşa
cum a fost plănuit la început de Rasmus Lerdorf tocmai în 1994. De
atunci a trecut prin multe schimbări şi a fost adoptat de programatori
web din întreaga lume. Şi atunci, ce este, mai exact ?
În termeni tehnici, PHP este un limbaj neutru din punct de vedere
arhitectural, încapsulat în HTML, de scripting pe web, la nivel de server
(server-side). Să ne oprim pentru un moment să definim aceşti termeni:
 Neutru din punct de vedere al arhitectural
Putem rula mare parte din codul PHP4, fără nici o altă
modificare, pe computere ce rulează multe sisteme de operare diferite
între ele. Un script PHP4 care rulează pe Linux, în general va rula şi pe
Windows.
 Încapsulat în HTML
Codul PHP4 este scris în fişiere ce conţin o mistură de de
instrucţiuni PHP şi cod HTML
 La nivel de server (server-side)
Programele PHP4 ce scriem sunt rulate pe un server – în
speţă, un server web.
 Limbaj de scripting web
Rulăm programe PHP4 printr-un browser web. Accesăm
serverul web pe care sunt stocate, iar acesta rulează programul,
trimiţând orice ieşire rezultată, înapoi browserului.

Asta înseamnă că programele reunesc cod PHP şi HTML la un loc,


folosind primul pentru control şi ultimul pentru formatare.
Documentele PHP standard, pentru versatilitatea lor, sunt ceva mai
mult decât aranjamente statice de text şi imagini, fie ele unele frumos
prezentate. Dar majoritatea site-urilor ce le găsim pe Web nu sunt
statice, ci dinamice, chiar interactive. Ne prezintă o listă de site-uri ce
conţin cuvintele pe care le-am specificat, ne prezintă ultimele ştiri, chiar
ne întâmpină cu numele nostru atunci când ne logăm. Ne permit să
interacţionăm şi prezintă pagini diferite în concordanţă cu alegerile
noastre.

Nu putem construi astfel de site-uri web folosind HTML standard, şi


iată unde intervine PHP4. Ce putem face cu el? Ei bine, putem programa
site-uri care:

• Prezintă date dintr-o largă varietate de surse diferite, cum ar


fi baze de date sau fişiere

14
Aplicaţie Web. Examen Grilă Online

• Incorporează elemente interactive, cum ar fi facilităţi de


căutare, forumuri de discuţii sau sondaje
• Permit utilizatorului să realizeze diverse acţiuni, cum ar fi
trimiterea de e-mailuri sau cumpărarea unor produse

O pagină web dinamică este o pagină care interacţionează cu


utilizatorul astfel încât fiecare utilizator care vizitează această pagină
vede informaţiile personalizate. Conţinutul acestor pagini este generat de
informaţiile provenite din baza de date sau surse externe. Sintaxa
limbajului provine din C, Java si Perl şi este uşor de învăţat pentru oricine
are cunoştinţe minime de programare: PHT rulează pe mai multe
platforme şi poate fi folosit ca un program executabil sau ca un modul
pentru o varietate de servere Web. Are integrat suport pentru baza de
date, XML, IMAP, Java, numeroase protocoale pentru internet şi pentru
manipularea datelor si poate fi extins prin intermediul interfeţelor. Este
permanent dezvoltat de o echipă talentată formată din membri din
întreaga lume. Acest lucru înseamnă ca bug-urile sunt reparate imediat
ce sunt semnalate, iar noua versiune este disponibilă fără nici un cost
suplimentar. Sunt disponibile numeroase pachete pentru tot felul de
utilizatori ale acestuia (de ex. Conectarea la un server MSSQL).

PHP oferă o soluţie simplă şi universală pentru crearea de pagini


web dinamice. Interfaţa intuitivă permite programatorilor să includă
comenzi PHP chiar în pagina HTML.

Design-ul său elegant face ca PHP-ul să fie mai uşor de întreţinut şi


de dezvoltat ulterior comparativ cu celelalte limbaje de scripting.

Datorită răspandirii sale in randul unui număr mare de utilizatori


PHP este bine documentat. PHP a fost dezvoltat începând cu 1994,
versiunea PHP3 lansată în iunie 1998 iar PHP4.2.0. lansat în 24 Aprilie
2002. Şi-a câştigat rapid popularitatea, iar momentan este folosit in
aplicaţii web de către unele din cele mai proeminente organizaţii cum ar
fi Mitsubishi, Redhat, MP3-Lycos, Ericsson si NASA (foloseste de curand
ca sistem de gestiune a bazelor de date MySQL ca si Yahoo! Finance).

Spre deosebire de alte limbaje de scripting pentru Web, PHP oferă


suport pentru majoritatea bazelor de date (Oracle, Sybase, MySQL,
ODBC), PHP ofera de asemenea numeroase librării externe care permit
programatorului să facă aproape orice de la generarea de documente
PDF la parsarea fişierelor XML. Poate cel mai mare avantaj al PHP-ului
comparativ cu alte limbaje de scripting (ASP, ColdFusion) este faptul că
este opensource şi independent de platformă, ceea ce îl integrează
perfect în mediile de reţea eterogene.

O altă caracteristică importantă este managementul de memorie al


acestuia, care încarcă în memorie un fişier doar dacă este nevoie de el,
eliberând memoria după ce a fost folosit.

15
Aplicaţie Web. Examen Grilă Online

În cele din urmă însă nu şi ca importanţă este rolul securităţii care


de câţiva ani de zile a devenit o problemă serioasă, datorită dezvoltării
reţelei Internet însă şi a celor Intranet. În PHP sistemul poate fi protejat
setând anumite nivele de securitate in fisierul php.ini.

Conform www.netcraft.com în acest moment mai mult de 6


milioane de domenii folosesc PHP si această rata creşte cu aproximativ
1,5% pe luna. PHP este instalat pe aproximativ 36% din serverele
Apache. Însă PHP nu se instalează doar pe serverele Apache, ci şi pe cele
de la Microsoft IIS sau Netscape. Ultima versiune, PHP 4 a fost copiată
de aproape 265.000 ori în primele doua luni de la apariţie.

De ce PHP4 ?

Când vine vorba de dezvoltare Web în zilele de azi, avem o


mulţime de opţiuni. Multe din aceste metode implică preprocesare –
adică inserarea de cod în pagini HTML cu etichete speciale ce
sermnalează unui preprocesor că ele conţin cod şi că ar trebui să facă
ceva cu el.

Atât limbajul de scripting open-source PHP, cât şi limbajele din


mediul de lucru (framework) al Microsoft ASP.NET, dar şi Paginile
JavaServer (JSP) sau Perl/Mason. Şi totuşi, de ce PHP ?

PHP va fi familiar oricărui programator care a mai lucrat cu limbaje


de programare imperative. Vom observa similitudini cu Perl, C şi Java.
PHP împrumută de la aceastră structură atunci când îi este necare, dar
nu este un limbaj pur orientat obiect.

PHP e rapid şi uşor. A reuşit să combine perfect puterea, structura


şi uşurinţa folosirii. Sintaxa PHP-ului este superioară faţă de cea a ASP-
ului şi a JSP-ului. De asemenea, pune mai multă putere la îndemâna
noastră mai rapid decât o face ColdFusion şi nu este atât de dificil de
învăţat precum Perl[6]. Spre deosebire de Java Server Pages sau CGI,
PHP nu necesită acumularea unei adânci înţelegeri a principalelor limbaje
de programare înainte de a face o banală conexiune la o bază de date.
Spre deosebire de Perl, care a fost numit în glumă un „limbaj doar-scris”,
PHP are o sintaxă care este destul de uşor de analizat şi înţeles de către
utilizator. Şi, spre deosebire de Active Server Pages, PHP nu ne face să
învăţăm două limbaje de programare diferite pentru ocazii diferite!

PHP este mai puţin evoluat ca HTML, dar probabil mai simplu decât
JavaScript sau ASP şi cu siguranţă mai puţin complex din punct de vedere
conceptual decât JSP. Este un adevărat limbaj de programare. Spre
deosebire de PHP, ColdFusion este o aglomeraţie de etichete predefinite,
precum HTML. În PHP, putem defini funcţii după placul inimii doar scriind
un nume şi o definiţie. În ColdFusion ar trebui să folosim etichete
dezvoltate de alte persoane sau procesul de dezvoltare a etichetelor
extensii personalizate (Custom Tag Extension).

16
Aplicaţie Web. Examen Grilă Online

Aşa cum a spus un membru al comunităţii PHP odată, „ColdFusion


face lucrurile uşoare, uşoare, iar cele mediu-grele, imposibile.” Şi orice
programator îi va da dreptate: odată ce-ai experimentat puterea
acoladelor şi a ciclurilor, nu te vei mai uita înapoi la tag-uri.

PHP este stabil. „Stabil” însemnând două lucruri în acest context:


1. serverul nu necesită să fie repornit des
2. software-ul nu se schimbă radical şi nu devine incompatibil
de la versiune la versiune
În mod fericit, amândouă aceste conotaţii se aplică în cazul PHP-
ului.

PHP este plăcut de rapid în execuţie, în special când este compilat


ca modul Apache pe partea UNIX. PHP4 este acum mult mai rapid pentur
aproape orice folosire decât scripturile CGI. Majoritatea site-urilor Web se
îndepărtează de folosirea CGI-urilor din motive de performanţă şi
securitate.

PHP beneficiază şi de aportul de viteză derivat din statutul său ca


modul al serverului Web. Când este compilat astfel, PHP devine parte a
serverului. Deoarece nu există nici un transfer spre şi dinspre o aplicaţie
server separată (cum este cazul ColdFusion-ului, de exemplu), cererile
pot fi satisfăcute cu mai multă eficienţă.

Concluzionând, PHP oferă cea mai bună oportunitate de a dezvolta


rapid aplicaţii Web puternice.

Există trei domenii principale unde sunt folosite scripturile PHP:


• Scripturi ce rulează pe server. Acesta este cel mai tradiţional
şi cel mai important pentru PHP. Avem nevoie de trei lucruri pentru a
face sa meargă. Interpretorul PHP (CGI sau modul de server), un server
de web şi un navigator de web. E nevoie ca serverul de web să fie pornit,
cu o conexiune PHP instalată. Putem accesa rezultatul programelor PHP
cu un navigator prin intermediul serverului de web.

Scripting la linia de comandă. Putem face ca PHP să ruleze



fără a fi nevoie de server şi de browser, ci doar de interpretorul PHP.
Această metodă este ideală pentru scripturile ce se vor a fi executate
regulat folosind cron (task scheduler în Windows), sau sarcini simple
de procesare a textelor.

•Scrierea de aplicaţii ce rulează de partea clientului în


mod grafic (GUI). Probabil că PHP nu este limbajul cel mai bun de a
scrie aplicaţii cu ferestre pentru Windows sau alte sisteme de operare,
dar dacă cunoaştem PHP foarte bine şi vrem să folosim nişte facilităţi
avansate ale PHP-ului în aplicaţiile noastre ce rulează de partea
clientului, putem totuşi folosi PHP-GTK pentru a scrie astfel de programe.
De asemenea, avem posibilitatea de a scrie aplicaţii ce rulează pe
platforme diferite folosind această metodă. PHP-GTK este o extensie a
PHP-ului, nedisponibilă în distribuţia principală de PHP.

17
Aplicaţie Web. Examen Grilă Online

PHP poate fi folosit pe aproape toate marile sisteme de operare,


incluzând Linux, multe variante de Unix (incluzând HP-UX, Solaris şi
OpenBSD), Microsoft Windows, Mac OS X, RISC OS, probabil şi altele. PHP
are, de asemenea suport pentru majoritatea serverelor de web din
prezent. Acestea includ serverele Apache, Microsoft Internet Information
Server, Personal Web Server, Netscape şi iPlanet, serverul Oreilly
Website Pro, Caudium, Xitami, OmniHTTPd, şi multe atele. Pentru
majoritatea serverelo, PHP are un modul, iar pentru celelalte suportă
standardul CGI, PHP putând să lucreze ca un procesor CGI.
Deci, cu PHP, avem libertatea de a alege un sistem de operare şi
un server de web. Chiar mai mult, avem posibilitatea de a alege
programarea procedurală sau programarea orientată obiect, sau chiar să
le amestecăm. Cu toate acestea, nu orice facilitate a standardului POO
este prezentă în versiunea curentă a PHP-ului, multe librării de cod şi
aplicaţii mari (incluzând şi librăria PEAR) sunt scrise folosind doar cod
POO.
Cu PHP nu suntem limitaţi să scoatem rezultat HTML. Posibilităţile
PHP-ului includ afişarea de imagini, fişiere PDF şi chiar filmuleţe Flash
(folosind librăriile libswf şi Ming) toate generate instant. Putem de
asemenea ca rezultatul nostru să fie orice fişier text, cum ar fi XHTML
sau orice alte fişiere XML. PHP poate genera autmoat aceste fişiere şi să
le salveze în sistemul de fişiere în loc să le afişeze, formând un cache de
partea serverului pentru conţinutul nostru dinamic.
Sunt şi alte arii de interes în care PHP-ul excelează. Preţul utilizării
este 0, aşa că nu va trebui să ne facem griji în legătură cu probleme de
licenţiere. Este open-source, astfel că o întreagă comunitate va avea
atenţia îndreptată spre dezvoltarea sa, identificând bug-urile şi
asigurându-se că ele sunt reparate. Iar dacă este o anumită opţiune care
nu ne place sau vrem mai mult de la ea, putem să ne amestecăm în
codul sursă. Mai mult, PHP lucrează nativ cu serverul de aplicaţii
Apache: poate fi compilat ca modul sau direct în fişierele binare Apache.
Şi, cu Apache, PHP are instrucţiuni mai puternice datorate micşorării
comenzilor ce trebuie executate de serverul web pentru parsarea şi
executarea paginilor PHP, ceea ce rezultă într-o mai eficientă utilizare a
memoriei şi o mai rapidă execuţie.
Revenind la problema costurilor, să nu uităm combinaţia
Apache/PHP/MySQL ce rulează minunat pe componente hardware ce nu
necesită neapărat putere mare de calcul, nu aşa stând lucrurile în cazul
IIS/ASP/SQL Server.

Tabel comparativ cu costurile diverselor implementări

Obiect ASP ColdFusion JSP PHP


Dezvoltare $0-480 $395 $0 $0
Server $620 $1.295 $0-595 $0
Baza de $1.220- $0-~10.000 $0-~10.000 $0
date 4.220
Suport $0-245 $0-75 $0-75 $0
tehnic

18
Aplicaţie Web. Examen Grilă Online

2.4. Javascript

Limbajele de tip script (probabil inspirate din UNIX Shell) au fost


proiectate în special pentru a oferi productivitate asemănătoare
editoarelor specializate, dar şi flexibilitate sporită asemănătoare
limbajelor de programare.

Având iniţial denumirea de LiveScript şi aparţinând firmei Netscape


Corporation, produsul capătă denumirea de JavaScript în urma
agreementului între companiile SUN si NETSCAPE realizat in 1995 şi care
au sesizat necesitatea existentei unui limbaj simplu şi eficient destinat
realizării paginilor WEB.

Similar UNIXshel, JavaScript este un limbaj de tip script (scripting


language), dezvoltat pentru a fi utilizat ca un limbaj de programare
‘inţeles’ de către browsere WEB. Din aceste considerent modulele de
programare JavaScript pot fi incluse direct in surse HTML, nefiind
necesară operaţia de compilare. Majoritatea editoarelor complexe pentru
pagini WEB permit inserarea secvenţelor JavaScript. Java si JavaScript
sunt considerate limbaje complementare.

JavaScript utilizeaza masiv avantajele tehnolgiei de programare


orientată pe obiecte. Spre deosebire de alte medii de programare din
aceasta categorie (C++, Java), clasele utilizate, evenimentele, funcţiile
etc, sunt foarte asemănătoare cu cele utilizate pentru realizarea
browserelor. Dacă putem să consideram un browser ca fiind un
interpretor de limbaje, HTML ar fi asemănător unui limbaj de asamblare
pentru acesta, iar JavaScript poate fi considerat un limbaj evoluat
asemanator cu C, Pascal. Sintaxa, variabilele, definirea funcţiilor,
operatorii sunt aproape identici cu noţiunile similare utilizate in Java si
C++.

Poate cel mai important aspect oferit de JavaScript il constituie


faptul că din punct de vedere didactic, permite una din cele mai eficiente
medote de insusire a fundamentelor programării orientate obiect cu
aplicaţii multimedia. Acest lucru este datorat în mare parte faptului că
obiectele principale cu care se operează sunt deja construite şi aparţin
de fapt browserelor, fiind posibilă astfel o simplificare a limbajului în
sensul că nu este necesară întotdeauna o fază de specificare completă a
claselor carora aparţin.

Programele fiind executate imediat de către browsere, pot fi scrise


usor şi testate imediat.

Sursele de documentare precum si produsele de tip tutorial


existente pe Internet au permis o răspândire accelerată a limbajului
precum şi formarea unei biblioteci considerabile de programe sursă.

19
Aplicaţie Web. Examen Grilă Online

2.5. CSS

CSS (Cascading Style Sheet) a fost conceput şi dezvoltat ulterior de


către W3.org grupul care se ocupa de standardele majoritatilor limbajelor
meta, si s-a impus rapid ca standard fiind recunoscut de majoritatea
browserelor. Principala utilitate a CSS-ului este aceea ca separă stilul de
conţinutul unei pagini web. O pagina in mod normal pe langa continut
poate sa aiba inclus si stilul. Insa modificarile ulterioare sunt mult mai
dificile. Astfel cu ajutorul stilurilor se poate schimba layout-ul unei pagini
doar modificand stilul, intr-un singur fisier si nu toate documentele
suspuse modificarii.

Cu ajutorul acestora se micsoreaza considerabil si marimea paginii


trimise clientului crescand viteza de incarcare. Prin folosirea CSS-urilor
spre deosebire de alte tehnologii web (ActiveX, JavaScript, VBScript)
userii nu pierd nimic din functionalitate în cazul in care browserul nu
recunoaşte anumite elemnte CSS, ci doar li se va afisa textul direct.
Deoarece modificarea stilului unui site implică modificarea doar a unui
fisier asta înseamnă un caştig.

Stilurile oferă o mai mare flexibilitate layout-ului, astfel proprietăţi


precum color, background, margin, border şi multe altele pot fi aplicate
tutror elementelor. Autorii pot în sfârşit influenţa prezentarea
documentelor fara a lasa paginile neaccesibile anumitor utilizatori.

Cap 3. Structura bazei de date

Construită folosind SGBD-ul MySQL , baza de date a fost


conceputa in urma unei analize detaliate a problemei in vederea
functionarii cât mai performante a aplicatiei . De asemenea un rol
important în stabilirea entităţilor care intră în alcătuirea bazei de date l-
au constituit şi următoarele probleme care trebuiau abordate :
respectarea setului de reguli dupa care se desfăşoară un examen si
asigurarea unui nivel ridicat al securităţii datelor (protejarea prin parolă a
bazei de date, doar administratorii si secretariatul, de asemenea
identificaţi pe baza unui nume şi a unei parole, sunt cei care au acces la
date) şi creşterea vitezei interogărilor în baza de date prin împărţirea
informaţiilor necesare utilizatorilor în mai multe tabele. Iar modificarea
datelor , a statusurilor sau a levelui de acces ale utilizatorilor, va putea fi
făcută din interfaţa Web, fără a fi nevoie să se scrie sau modifice cod
program PHP.

20
Aplicaţie Web. Examen Grilă Online

Regulile după care se desfăşoară un examen şi care constituie şi


baza funcţionării aplicaţiei sunt :
• fiecare student are dreptul să dea o singura data un
examen;
• examenul poate fi susţinut numai de pe maşinile
autorizate in prealabil;
• întrebările sunt selectate în prealabil din baza de
date;
• studenţii sunt împărţiţi pe grupuri , fiecare grup
având denumirea datei în care se defăşoară examenul ;
• fiecare student are un set diferit de întrebări.

Problema securităţii într-o astfel de aplicaţie este una destul de


importantă deoarece trebuie evitată pe cat posibil o eventuala fraudă şi
mimimizată posibilitatea unui candidat de a trişa în vreun anumit fel.

De asemenea trebuie veificată locaţia din care un candidat poate


susţine examenul deoarece el poate fi susţinut doar din săli special
amenajate şi autorizate . Reţeaua locală sălii de unde se poate susţine
exemnul are alocate anumite ip-uri care trebuie introduse în tabela
ipexam pentru a fi validate . În momentul în care un student suţine
examenul grilă este verificat ip-ul maşinii de pe care se doreşte să se
conecteze şi comparat cu cele din tabele ipexam. În cazul în care
rezultatul căutării este diferit de null se poate trece la pasul urmator.

În tabela studsecr se află o lista nominală cu toţi studenţii înscrişi


în anul şcolar în curs şi care au dreptul de a susţine proba solicitată. În
momentul în care se doreşte crearea unui nou utilizator se verifică daca
el se află în tabela studsecr pentru a vedea daca el este înscris în anul
şcolar respectiv şi dacă are dreptul de a susţine examenul . În cazul în
care căutarea se termină cu un rezultat diferit de null
se poate crea un nou utilizator, informaţiile fiind stocate in tabela
utilizatori. Pe lângă informaţiile absolute necesare cum ar fi username
si parola mai sunt memorate nişte informaţii care ajută la cresterea
securităţii şi posibilitatea verificării fiecărui candidat daca s-a depistat
vreo frauda in sistem . Tot pentru creşterea securităţii rezultatele
examenului sunt reţinute într-o tabelă separată(studenţi) care poate fi
acesată numai de peroanele autorizate .

Tabela setări este nu este legată de nici o altă tabelă şi aici sunt
memorate datele specifice fiecărui examen cum ar fi: procentajele din
examen , numărul de întrebări , timpul alocat fiecarei probe . Poate fi
modificată numai de utilizatorii care au un level mare de acces la nivelul
aplicaţiei .

Întrebările pentru fiecare utilizator sunt generate random din


tabela grila pentru evitarea repetării lor de la un student la altul.
Întrebările pentru fiecare student sunt reţinute in tabela grila_id_user
care este o tabelă temporară, deoarece trebuia evitată folosirea optiunii

21
Aplicaţie Web. Examen Grilă Online

de refresh a paginii, în sensul că dupa ce s-a calculate nota obţinută de


un student sunt şterse toate înregistrările aferente lui.

Baza de date

Figura 3.1. Baza de date

Cele 8 tabele reţin informaţii despre studenţi, datele lor de


utilizator, grupurile în care sunt grupaţii ei, setările pentru examen şi
pentru site, intrebarile grila şi ip-urile de la care se va putea susţine
examenul grila.

Tabelul „utilizatori”

Figura 3.2. Tabelul „utilizatori”

Scop: reţine informaţii despre utilizatorii site-ului


Câmpuri:
− id – cheie primară
− uname – numele de utilizator, el este introdus la înscriere;

22
Aplicaţie Web. Examen Grilă Online

− passwd – parola utlilizatorului; uname, împreună cu passwd,


vor stabili dacă cel care încearcă să se logheze pe site este
acreditat în acest scop;
− team – numele grupului în care vor fi încadraţi utilizatorii;
− level – reprezintă levelul de acces pe site;
− status – poate fi active/inactive – reprezintă dreptul de
acces;
− lastlogin – păstrează data la care s-a logat ultima oara un
utilizator;
− logincount – camp care se incrementeaya la fiecare logare a
utilizatorului.

Tabelul „studsecr”

Figura 3.3. Tabelul „studsecr”

Scop: Sunt introduse informaţiile celor care sunt înscrişi la cursul


respectiv, respectiv da acces numai anumitor studenţi de a se inscrie la
examen.
Câmpuri:
− id – cheie primară;
− fname – numele (de familie) al studentului;
− lname – prenumele studentului;
− grupa – grupa in care este incadrat studentul;
− nrmatricol – nr. matricol al studentului;
− cnp – codul numeric personal;
− user_creat – pastrează daca studentul s-a inscris sau nu pe
site.

Tabelul „studenti”

23
Aplicaţie Web. Examen Grilă Online

Figura 3.4. Tabelul „studenti”


Scop: Conţine informaţii despre studenţi: notele la examen si
laborator, media, data examenului.
Câmpuri:
− id – cheie primară;
− user_id – cheie straină;
− data_ex – conţine data de examen aleasă de student;
− id_secr – cheie straină;
− nota_ex – nota pe care studentul o va lua in urma susţinerii
examenului grilă.
− nota_lab – nota de la laborator;
− media – dintre nota de examen şi nota de la laborator, in
funcţie de anumite procente;

Tabelul „email”

Figura 3.5. Tabelul „email”

Scop: pastrează email-ul şi data când s-a înregistrat pentru ficare


utilizator în parte, tabela este folosită doar pentru anumite scripturi, ex:
reamintirea parolei.

Câmpuri:
− id_user – păstrează id-ul utilizatorului;
− email – email-ul utilizatorului;
− datejoined – data la care s-a inscris pe site.

Tabelul „setari”

24
Aplicaţie Web. Examen Grilă Online

Figura 3.6. Tabelul „setari”

Scop: conţine setarile examenului si pe cele aferente sitului .

Câmpuri:
− id – cheie primară;
− pexamen –procentul alocat examenului din media finală;
− plab – procentul alocat laboratorului din media finală;
− nrintrebari – numărul de întrebari pe care le v-a conţine
examenul;
− nrminute – numărul de minute alocate examinării;
− autoapprove – (0/1)- 0 daca utilizatorul nu are acces imediat
după înscriere, accesul rămâne astfel la decizia
admimistratorului şi 1 in caz contrar.

Tabelul „ipexam”

Figura 3.7. Tabelul „ipexam”

Scop: conţine setarile examenului si pe cele aferente sitului .


Câmpuri:

25
Aplicaţie Web. Examen Grilă Online

− id – cheie primară;
− ip – pastrează ip-urile de la care un student are acces la
examen;
− id_user – în cazul în care un student a intrat de la un ip
din lista, id_user pastrează id-ul utilizatorului;

Tabelul „grupuri”

Figura 3.8.. Tabelul „grupuri”


Scop: conţine grupurile in care sunt organizati studentii.

Câmpuri:
− teamname– cheie primară;
− teamlead – organizatorul grupului;
− status – se poate seta statusul pentru toti utilizatorii
grupului.

Tabelul „grila”

26
Aplicaţie Web. Examen Grilă Online

Figura 3.9. Tabelul „grila”

Scop: conţine toate întrebările grilă.


Câmpuri:
− id – cheie primară;
− NrRaspunsuri – numarul de raspunsuri alocate unei
întrebări;
− Intrebare – intrebarea;
− Raspuns1 – 5 – răspunsurile la intrebarea aferentă;
− chk1 – 5 – raspunsurile corecte sau incorecte.

Schema relaţională a bazei de date este urmatoarea:

27
Aplicaţie Web. Examen Grilă Online

28
Aplicaţie Web. Examen Grilă Online

Cap 4. Studiu de caz: dezvoltarea unui site dedicat


examinării online

Această secţiune, care are ca scop prezentarea contribuţiei


personale în cadrul acestui proiect, este structurată în 5 module, şi
anume:

− Descrierea aplicaţiei
− Structura bazei de date
− Implementarea secţiunii utilizatorilor
− Modalităţi de trimitere a SMS-urilor
− Implementarea secţiunii de administrare

Capitolul 4.1. Prezentarea soluţiei

Aşa cum spuneam în deschiderea lucrării de faţă, în mod inevitabil,


viitorul va fi unul tehnologic. În mod inevitabil, viitorul v-a conţine
cuvântul Internet, în viitor este posibil ca învaţământul sa devina unul
electronic, ca instituţiile de învaţamânt sa fie doar niste servere de
stocare a informaţiilor.

Motivele pentru care Web-ul a fost ales ca metodă de prezentare


sunt următoarele:
1) accesarea prin intermediul unui web-browser este acum la
îndemâna oricărui student
2) Internetul are o mare accepţiune şi arie de răspândire

Proiectul este o soluţie web pentru institutiile de invatamant care


doresc şi examinarea studenţilor înscrisi la un anumit curs printr-un
examen grila online, site-ul urmează a fi personalizat în funcţie de cursul
respectiv. La întocmirea proiectului s-a optat pentru cursul de Structuri
de date si algoritmi (SDA). Acest site unde studenţii care au drept de
inscriere la examen, pot apela la documentaţia oferită online, si pot
susţine un examen grilă, având deasemenea posibilitatea de a vizualiza
si rezultatele.

Pentru a putea localiza cu rapiditate si parcurge cu uşurinţa


informaţia dorită, s-a optat pentru realizarea unei structuri organizate
ierarhic, cu definirea clară a zonelor de interes pe ecran si delimitarea si
separarea acestora ca mod de actualizare si interes, precum şi ca
funcţionalitate, prin folosirea frame-urilor:

29
Aplicaţie Web. Examen Grilă Online

Titlul site-ului

Continutul, prezentarea
Meniul informatiei

Dupa cum am precizat, s-a ales modul de prezentare a unui curs


universitar, cu prezentarea cuprinsului (asigurând informarea directă şi
rapidă asupra conţinutului, cu posiblitatea accesării neliniare a zonelor
de interes) şi o zonă de informaţii suplimentare.
Pentru a asigura consistenţa şi ergonomicitatea site-ului, meniul
principal este în permanenţă vizibil, cu posibilitatea părăsirii sau revenirii
în orice moment la un curs, iar cuprinsul este bine evidenţiat şi afişat tot
timpul. În plus, organizarea “pe cursuri” şi “laboratoare” permite
dezvoltarea usoară, cu adaugarea sau eliminarea facilă a unor noi cursuri
sau laboratoare.
Utilizatorii îşi pot modifica oricând datele personale, parola
(eventual, dacă au uitat-o, pot apela la tool-ul de generare a unei noi
parole, furnizând, în schimb, doar câteva detalii), îşi pot vedea datele
personale şi rezultatele opţinute.
Ca orice site, lucrarea are şi secţiunea de administrare a acestui
site. Administratorul in cazul de faţa poate fi vorba de titularul cursului
are la dispoziţie, de asemenea, o serie de opţiuni de administrare a
studenţilor, a site-ului si a contului propriu. Astfel şi administratorul îşi
poate modifica parola sau, în cazul unei probleme, genera o altă parolă,
folosind tool-ul corespunzător. Poate vedea toţi utilizatorii, studentii si
grupurile create cu informaţiile complete ale profilelor acestora, cu
posibilitatea de a modifica unele din datele acestora, statusul acestora,
activ sau inactiv, sau levelul. Tot administratorul este cel care introduce
in baza de date intrebarile gila care vor aparea in cadrul examenului, si
ip-urile de la care au studentii acces , tot el e cel care da acces si la
examen în data prestabilită de dinainte.

Capitolul 4.2. Consideraţii de implementare

30
Aplicaţie Web. Examen Grilă Online

4.2.1. Structura de fişiere

Pentru asigurarea consistentei site-ului şi usurinţa întreţinerii şi


dezvoltării, fişierele au fost organizate ierarhic pe directoare.
Structura directoarelor este urmatoarea:

În directorul admin se afla toate fişierele care sunt utilizate la


implementarea interfeţei administratorului.
În directorul cursuri sunt ţinute toate paginile html care ajută la
implementarea cursurilor, fiecare director reprezentând un curs.
În directorul grile se regăsesc fişierele necesare examenului grilă.
În directorul imagini se află imaginile necesare layout-ului.
În directorul init sunt ţinute fisierele necesare configurării aplicaţiei
(vezi fig.4.2.2.)
În directorul laboratoare sunt ţinute toate paginile html care ajută
la implementarea cursurilor.
În directorul style se află cele 2 stiluri necesare personalizării site-
ului (Style.css pentru implementarea cursurilor si laboratoarelor,
tabel.css pentru implementarea interfeţei utilizator.). In acest fel
modificarea aspectului nu ridică probleme de implementare şi
administrare.
În directorul members se regăseşte pagina principală a meniului
studenţi.
În directorul secretariat se află pagina principală, cea de
introducere date, a secretariatului.
Restul fişierelor se află în directorul rădăcină
Fişierele *.htm din directorul rădăcină sunt fişierul principal,
“index.htm” (care descrie organizarea in cadre), “butoane.htm” (care
descrie meniul principal) şi “titlul.htm” (care conţine titlul site-ului).
Din punct de vedere al implementării practice s-au folosit frame-uri,
iar actualizarea dinamică a conţinutului şi funcţionalitatea butoanelor s-
au obţinut cu ajutorul scripturilor flash.

4.2.2. Configurarea şi instalarea aplicaţiei

31
Aplicaţie Web. Examen Grilă Online

Acest lucru se realizează prin setarea anumitor parametri in fisierul


init.php din directorul init. Structura fişierului de configurare, doar
variabilele ce trebuiesc configurate, este următoarea:
$domain="http://172.18.19.144/a/"; - Se setează adresa
serverului de pe care se va rula aplicatia.
Setarile Bazei de date
$dbhost = "localhost"; // nume host-ului
$dbusername = "root"; // numele utilizatorului
$dbpass = ""; // parola utilizatorului
$dbname = "fonseca"; // numele bazei de date
$dbpassword = ""; // parola bazei de date
$dbport = "3306"; // portul default este 3306;

$adminemail = "fonseca@hal.cs.tuiasi.ro" - se setează


email-ul administratorului.
$level_admin=1; $level_secretariat=2; $level_examen=3;
- nivelul de acces pe pagina
La instalarea aplicaţiei se setează numărul de date de examen şi
datele la care se va susţine examenul, ca exemplu:
$nr_date_ex=2;
$data_examen[1]="19.06.2004";
$data_examen[2]="20.06.2004";
La fel şi cu grupele care participă în care sunt încadraţi studenţii ce
vor fi înscrişi la examen:
$nr_grupe=3;
$grupa_std[1]="1201";
$grupa_std[2]="1202";
$grupa_std[3]="1203";

Tabelele necesare funcţionării aplicaţiei sunt creeate cu ajutorul


rularii unui aflat in fisierul instal.php din directorul init.

CREATE TABLE email (


id_user int(4) NOT NULL default '0',
email varchar(45) NOT NULL default '',
datejoined datetime NOT NULL default '0000-00-00 00:00:00'
)

CREATE TABLE grila (


id int(4) NOT NULL auto_increment,
NrRaspunsuri int(1) default NULL,
Intrebare varchar(255) NOT NULL default '',
Raspuns1 varchar(155) default NULL,
Raspuns2 varchar(155) default NULL,
Raspuns3 varchar(155) default NULL,
Raspuns4 varchar(155) default NULL,
Raspuns5 varchar(155) default NULL,
chk1 int(1) default NULL,
chk2 int(1) default NULL,

32
Aplicaţie Web. Examen Grilă Online

chk3 int(1) default NULL,


chk4 int(1) default NULL,
chk5 int(1) default NULL,
PRIMARY KEY (id)
)

CREATE TABLE ipexam (


id int(4) NOT NULL auto_increment,
ip varchar(15) NOT NULL default '',
id_user int(4) default NULL,
PRIMARY KEY (id)
)

CREATE TABLE grupuri (


teamname varchar(25) NOT NULL default '',
teamlead varchar(25) NOT NULL default '',
status varchar(10) NOT NULL default '',
PRIMARY KEY (teamname),
)

CREATE TABLE setari (


id int(4) NOT NULL auto_increment,
pexamen int(2) default NULL,
plab int(2) default NULL,
nrintrebari int(2) default NULL,
autoapprove tinyint(4) NOT NULL default '0',
autosendadmin tinyint(4) NOT NULL default '0',
nrminute int(4) default '20',
PRIMARY KEY (id),
UNIQUE KEY id (id)
)

CREATE TABLE studenti (


id int(4) NOT NULL auto_increment,
id_user int(4) NOT NULL default '0',
data_ex varchar(10) default NULL,
id_secr int(4) default NULL,
nota_ex float default NULL,
nota_lab float default NULL,
media float default NULL,
PRIMARY KEY (id)
)

CREATE TABLE studsecr (


id int(4) NOT NULL auto_increment,
fname varchar(30) NOT NULL default '',

33
Aplicaţie Web. Examen Grilă Online

lname varchar(20) NOT NULL default '',


grupa int(5) default NULL,
nrmatricol int(4) default NULL,
cnp varchar(13) default NULL,
user_creat int(1) default NULL,
PRIMARY KEY (id)
)

CREATE TABLE utilizatori (


id int(4) NOT NULL auto_increment,
uname varchar(25) NOT NULL default '',
passwd varchar(32) NOT NULL default '',
team varchar(25) NOT NULL default '',
level int(4) NOT NULL default '0',
status varchar(10) NOT NULL default '',
lastlogin datetime default NULL,
logincount int(11) default NULL,
PRIMARY KEY (id)
)

Tot la instalare vor fi adăugate în tabela utilizatori două înregistrări,


cu alte cuvinte se vor creea două conturi admin respectiv secretariat cu
o parolă stabilită în script, parola putându-se schimba dupa prima logare.
Si tot la instalare sunt creeate şi grupurile, vor fi creeate 2 grupuri pentru
admin si secretariat şi mai multe grupuri care reprezintă datele de
examen care sunt trecute în fişierul init.php.

4.3. Implementarea soluţiei

Transformările de date se vor prezenta sub forma unei diagrame


de flux a prelucrărilor (modelul funcţional), în care nodurile reflectă
procesele de prelucrare informaţională şi arcele reflectă fluxurile
informaţionale.
În figura următoare este prezentată schema de funcţionare a
aplicaţiei şi cea de administrare a bazei de date.

34
Aplicaţie Web. Examen Grilă Online

Pagina
Principala

Info Inscriere Cursuri


Laboratoare

Inscriere Autentificare

Validare
Validare
date
NU DA date NU
DA

Verfica tipul
Utilizatorului

Admin Secretariat Student

setari
Vizualizare
Securizare Date Verifica
utilizatori utilizatori Personale accesul

DA NU
Studenti
Acces
Examen
Interzis

Introducere
grile

grupuri

35
Aplicaţie Web. Examen Grilă Online

În pagina principală a site-ului, vizitatorii sunt întâmpinaţi cu o


scurtă pagină de prezentare a cursului, mai precis programa analitică a
materiei prezentate.
În frame-ul de sus este prezentat titlul materiei, iar în frame-ul din
stânga se află meniul principal cu legături către principalele opţiuni şi
zone de interes ale site-ului.

4.3.1 Înregistrarea

Un student, ce doreşte să-şi creeze un cont , trebuie să se îndrepte


către pagina ce constituie form-ul de înregistrare.
Aici, completând corect fiecare dintre câmpurile form-ului (altfel
vor fi redirecţionaţi către o pagină explicativă ce conţine avertismente în
legătură cu tipul de eroare survenită), noul utilizator introduce anumite
date personale (numele de utilizator ales, parola dorită, cerându-i-se o
reintroducere a acesteia pentru verificare, numele şi prenumele, adresa
e-mail pentru diverse contacte, numarul matricol, grupa, codul numeric
personal, şi să aleagă data de examen, completându-şi astfel profilul
personal.
Formularul de înregistrare este următorul:

36
Aplicaţie Web. Examen Grilă Online

Pe lângă verificarea corectitudinii câmpurilor, se verifică ca


anumite date să corespundă cu datele introduse în baza de date
secretariat, date care sunt introduse prealabil cu studentii care sunt
înscrisi la cursul respectiv.
La creare, în baza de date, în câmpul corespunzător respectivului
utilizator, vor mai fi introduse informaţii precum statusul el poate fi
“inactiv” sau “activ” depinde de setarile făcute de admin, precum si
level-ul de acces, acesta fiind la inscriere 999. Dacă status-ul este pe
inactiv, studentul nu se poate conecta pe site, el trebuind să aştepte
activarea contului sau să contacteze administratorul site-ului.

4.3.2 Logarea

Dacă se doreşte intrarea pe site atunci utilizatorii trebuie să se


îndrepte către pagina ce constituie partea de logare a utilizatorilor, cu
opţiunea „reamintirea parolei”.

În cazul în care un utilizator (ce are deja un cont) îşi uită parola,
este ajutat prin punerea la dispoziţie a paginii de reamintire a parolei.

Furnizând numele de utilizator şi adresa email specificată la


înregistrare, o nouă parolă (numerică) îi va fi generată, aceasta fiindu-i
atât afişată, cât şi trimisă la acea adresă. Logându-se cu noua parolă,
este indicat să o schimbe cât mai repede posibil cu o nouă parolă
proprie.

Level-ul de acces pe care le accepta aplicatia sunt:

37
Aplicaţie Web. Examen Grilă Online

- Level 1: administrator aplicatie, initial unul singur, insa doar el


poate creea sau atribui level de administrator altor utilizatori;
- Level 2: level secretariat, important prentru securizarea
conturilor studentilor;
- Level 3: level examen, doar având acest level un student
are acces la examen;
- Level 999: level student, studentul are dreptul să vizualizeze
doar cursurile laboratoarele, notele de la laborator cat şi de la
examen.

4.3.3 Securizarea accesului

Intrarea in sistem se face prin introducerea unui username si a


unei parole care iniţial sunt setate in două cookie:
$password=md5($password);
setcookie ("USERNAME", $username, time()+7200);
setcookie ("PASSWORD", $password, time()+7200);

Parola este initial codata, pentru codare s-a folosit criptarea


acesteia, folosind functia md5 din php, functie care cripteaza pe 32 biti
sirul respectiv. Compararea parolei introduse cu parola deja existenta in
baza de date se face cu ajutorul clasei auth. Daca autentificarea s-a
facut cu succes atunci returneaza informatii din baza de date, şi dacă
gaseşte level=1, atunci returnează 1, iar dacă e level=2 atunci
returnează 2. In caz de insucces returnează false.

Toate aceste date sunt interpretate de către scripul de


autentificare care interpretează informaţiile returnare si redirectează cu
ajutorul unor scripturi java, utilizatorul către pagina la care are acces.

Deasemenea fiecare pagină este verificată în scopul de a preveni


accesarea ei prin evitarea paginii de logare. Este verificat dacă numele
de utilizator şi parola aflate in cookie se potrivesc cu cele din baza de
date. În caz de nepotrivire returnează false, acest lucru fiind interpretat
de scriptul check.php care returnează un mesaj de acces ilegal pe site.

Trebuie menţionat că un student nu poate să se înscrie de două ori


pe site, cu două nume de utilizator diferite. Asta deoarece după prima
înscriere a studentului se completează câmpul user_creat din baza de
date studsecr, câmp care este verificat la fiecare înscriere a unui student
nou.

4.4. Implementarea secţiunii de administrare

Această secţiune este dedicată partii de administrare a site-ului şi


a studenţilor inscrişi la examen.

38
Aplicaţie Web. Examen Grilă Online

Meniul se schimbă odată cu logarea pe site a unui administrator,


potrivit nevoilor şi uneltelor administratorilor, el va rămâne în aceeaşi
formă fiind bine explicit şi uşor de utilizat.

În prima pagină sunt descrise pe scurt opţiunile din meniu, asta


pentru o mai bună inţelegere a lor.

4.4.1 Opţiunea setări

Primul parte a acestui submeniu este cea de vizualizare a datelor


contului şi de modificare a parolei „Schimba parola”, un tool pus la
îndemână utilizatorului pentru a-şi schimba parola, pentru a-şi spori
securitatea propriului cont, evitând ca cineva să-i folosească acest cont,
efectuând modificari, spre exemplu, fără permisiunea sa.

Trebuie introdusă neapărat vechea parolă, deoarece aceasta se compara


cu cea din baza de date, dupa care ii permite să introducă o noua parolă.

Următoarele setări se referă la configurarea examenului si a site-


ului:

39
Aplicaţie Web. Examen Grilă Online

Se poate seta dacă utlizatorii să fie activaţi imediat după inscriere,


în cazul când este permisă activarea lor, ei se pot loga pe site imediat
dupa înscriere, în caz contrar trebuie să aştepte permisiune de la
administrator, sau să-l contacteze în vederea activării. Pentru aceasta în
interfaţa de login este introdus un link de contact, care permite
trimiterea unui mail către administrator.

Următoarele setări se referă la procentajul pe care îl ocupă nota de


la laborator şi cea de la examen din nota finală, completarea unui câmp
va conduce la completarea automată a celui de-al doilea.

Setările pentru examen constau în stabilirea numărului de întrebări


pe care poate să-l conţină testul grilă şi a timpului care se alocă acestuia,
timpul este setat in minute.
Ultima setare se referă la posibilitatea ca administratorul să
primească un email la fiecare inscriere nouă.

4.4.2. Administrare date utilizatori

Administratorul are posibilitatea de a creea noi conturi, insă


conturile pot fi doar conturi de administrare sau conturi de secretariat,
mai are posibilitatea de a vizualiza baza de date a utilizatorilor, putând
modifica informaţiile acestora, poate sa schimbe parola oricarui utilizator
neavând nevoie de parola introdusa de utilizator, de asemenea poate să
modifice grupul de examen al utilizatorilor, cât şi level-ul şi statusul
acestora.
Administratorul poate deasemenea să şteargă un utilizator din
baza de date, în cazul unui student el este şters din toate bazele de date
aferente lui, datele de utilizator, cele de student şi email-ul, mai puţin
datele personale care rămân în baza de date de la secretariat. Totuşi in
această ultimă baza de date câmpul user-creat devine 0, asta însemnând
că studentul are dreptul in viitor să-şi creeze un nou cont.
În continuare este prezentată schema funcţională a acestei opţiuni:

40
Aplicaţie Web. Examen Grilă Online

Pagina Principală

Adaugare Vizualizează
utilizator utilizatori

Selectează
utilizator
Validare
date
NU DA

Afişează datele Modifică Schimba


utilizatorului datele parola

Adaugă
utilizator

Şterge
utilizator

4.4.3 Administrare informaţii studenţi

Administratorul are posibilitatea de a schimba data de examen a


studentului, de a introduce nota la laborator , de a modifica nota de la
examen. Tot aici se regaseşte şi opţiunea de printare a notelor
studenţilor. La printare studenţii pot fi grupaţi doar după grupa, sau se
poate lista toată baza de date.

41
Aplicaţie Web. Examen Grilă Online

Pagina Principală

Vizualizează Listare
studenţii Rezultate studenţi

Selectează
utilizator

Afişează datele
utilizatorului

Modifică
Note şi data de examen

Validează
NU
DA date

Mesaj Eroare

În cadrul opţiunii de listare a studenţilor, cu ajutorul scripturilor


java la apăsarea butonului de printare se ascund butoanele care apar in
interfaţa, astfel se poate face listarea la tabelul cu studenţi.

4.4.4 Administrarea întrebărilor grilă

42
Aplicaţie Web. Examen Grilă Online

Grilele sunt administrate cu ajutorul formularului intrebare.php din


directorul admin, care foloseşte tehnologii Javascript, Formularul arată ca
în figura:

Se pot introduce întrebări cu multiple variante de răspunsuri 3, 4


sau 5, ele pot fi corecte sau incorecte, depinde cum se selectează
casuţele de check box. Casuţele selectate vor indica raspunsurile
corecte, prin introducerea in baza de date a valorii 1 daca ele au fost
marcate ăi respectiv a valorii 0 în caz contrar.
De exemplu daca este introdusă o intrebare care conţine doar 3
variante de răspuns atunci in baza de date răspunsurile 4 si 5 răman
necompletate. Acest lucru nu impiedică afişarea corectă în cadrul
examenului, deoarece se testează câmpul NrRaspunsuri, făcându-se
afişarea corespunzătoare acelui număr.
Daca se doreşte introducerea unei întrebări care conţine caracterul
CR atunci este obligatore introducerea în textarea a tag-ului html
“<br>”. Asta din cauză că ele vor fi interpretate de către un browser
web.
Întrebările pot fi deasemenea vizualizate , modificate şi şterse din
baza de date aferentă lor. Vizualizarea constă in id-ul intrebării, numarul
de răspunsuri şi întrebarea propriu-zisă. Modificarea unei întrebări se
face prin suprascrierea ei.

4.4.5. Administrare grupuri

Această opţiune a fost implementată, deoarece s-a dorit o mai


bună organizare şi structurare a utilizatorilor acestui site. Grupurile sunt
creeate la instalarea aplicaţiei, insă pot fi creeate si ulterior. Iniţial sunt
creeate grupurile “admin”, unde se vor regăsi cei cu drept de
administrare a studenţilor sau a paginii, “secretariat”, acest grup este
important deoarece autentificarea unui utilizator la nivelul secretariat se
face după level de acces si dupa grupul secretariat. Acest lucru a fost
implementat pentru o mai bună securizare a datelor de la secretariat. De
asemenea mai este creeat grupul “ungrouped” , grup care preia toti
utilizatorii dintr-un grup care a fost şters. Aceste 3 grupuri nu pot fi

43
Aplicaţie Web. Examen Grilă Online

şterse nici de catre administrator ele fiind vitale in funcţionarea corectă a


site-ului.
La instalare se mai creează şi un numar variabil de grupuri, în
funcţie de numărul de date de examen trecute in fişierul init.php. Aceste
grupuri vor purta denumirea zilei de examen, lucru deasemenea foarte
important deoarece examenul grilă va putea fi startat doar prin opţiunea
start examen aferentă fiecărui grup. Această opţiune verifică numele
grupului, care este de fapt sub forma unei date, sa coincidă cu data
curentă şi daca această verificare se incheie cu succes atunci tuturor
studenţilor li se atribuie level de examen, acest level le permite să
acceseze pagina de start examen. Tot in cadrul acestei opţiuni a mai fost
implementată o măsura de siguranţă, aceasta constă în posibilitatea
introducerii de către utilizator a tuturor ip-urilor de pe care se poate
susţine examenul.
În continuare este prezentată schema funcţională a acestei opţiuni:

Pagina Principală

Securizare
Adauga un acces
grup Vizualizează
grupurile

Pagina de introducere
Selectează grup a ip-rilor

Afişează datele
Afişează datele studentilor din
grupului grupul respectiv

Selectează
Modifică Şterge Start Stop date student
date grup grup Examen Examen

Pagina de
administrare
studenti

Modificare
date student

44
Aplicaţie Web. Examen Grilă Online

4.5 Implementarea secţiunii studenţilor

Această secţiune este dedicată parţii de examinare online a


studenţilor înscrişi la curs. Această examinare constă într-un examen
online, examen care se poate susţine doar in ziua pe care studentul a
ales-o la înscriere ca fiind ziua în care vrea să susţină examenul.
Meniul se schimbă odată cu logarea pe site a unui student, el va
arata în felul următor:

După cum se observă studenţii logaţi au incă acces la cursuri si


laboratoare, la datele lor personale şi la notele obţinute la examen cât
şi la laborator. Singurul lucru pe care-l pot modifica este parola.

4.6. Implementarea opţiunii de examinare


online

Această opţiune este dedicată examinării studenţilor la


terminarea unui curs. Examenul îl poate susţine doar cei care sunt
înscrişi la respectivul curs, şi doar la data în care s-au înscris la examen.
În afară de aceste verificari, studenţii au acces la examen doar de pe
anumite ip-uri, stabilite iniţial de către administratorul site-ului.

4.6.1 Pagina de verificare a accesului

Prima pagină accesată când se doreşte intrarea la examen este


pagina de start examen care va efectua verificările de level de acces,
aceste sunt prezentate in următoarea schemă:

45
Aplicaţie Web. Examen Grilă Online

Pagina Principală

Verifică dacă
administratorul a
dat acces la
examen
studenţilor DA
NU

Mesaj: Examenul nu
a inceput
Verifică dacă
ca ip-ul sa fie
autorizat
NU DA

Mesaj:
Ip-ul nu este
autorizat

Verifică sa nu
mai existe o
alta conexiune
de la acelasi
cont.
DA NU

Mesaj: Contul mai


are o conexiune de
Pagina Start la alt ip.
Examen

46
Aplicaţie Web. Examen Grilă Online

Dupa ce au fost trecute toate verificările se accesează o pagină


de informaţii asupra examenului, care specifică numărul de întrebări
setat de administrator căt şi

4.6.2 Interfaţa examenului grilă

Delimitarea pe cadre a paginii a condus la o bună organizare a


informaţiei oferite. Astfel în locul meniului din partea stângă a paginii vor
apărea informaţii despre examenul în curs de desfăşurare, precizând
numărul de întrebări şi timpul alocat pentru rezolvarea lor. Aceste
informaţii pot fi schimbate foarte uşor doar modificând textul din codul
html.

47
Aplicaţie Web. Examen Grilă Online

În frame-ul din partea de sus a ecranului se regăseşte o funcţie


de timp şi butonul de terminare examen. Acest lucru a fost impus
deoarece timpul de lucru rămas trebuie să fie in permanenţa vizibil.
Această funcţie a fost realizată cu ajutorul funcţiilor JavaScript. Funcţia
folosită este setinterval(comanda , timp), timpul reprezintă intervalul la
care este rulată funcţia, 0,5s. Astfel comanda se incrementează iar
timpul scurs se transformă în ore/minute/secunde şi se rescrie pe ecran.
Şi aici s-a incercat inlăturarea opţiunii de refresh a paginii prin
introducerea in cookie a timpului ramas, acest lucru a fost realizat cu
ajutorul a două funcţii de citire/scriere furnizate de către Macromedia.
Astfel dacă se foloseşte refresh-ul paginii de examen timpul rămane
neshimbat.

În frame-ul principal se regăsesc întrebările grilă, împărţite în


două layere, pentru o mai bună organizare a lor.
Această delimitare în frame-uri asigură şi evitarea accesării
paginii de examen prin alte metode, cum ar fi browse-area directă a
fişierelor, şi asta deoarece trebuiesc doua frame-uri pentru a duce la bun
sfarsit examenul.

4.6.3 Crearea grilei de examen

După ce se activează butonul de start examen se accesează


scriptul de creare a interfeţei de examen. Şi aici se verifică din nou
accesul studentului la examen, acces de la ip-urile autorizate. Dupa care
se trece la crearea bazei de date temporale. Pentru o mai bună
înţelegere este prezentată schema logică:

48
Aplicaţie Web. Examen Grilă Online

Start Examen

Grila examen

Verifică dacă
ca ip-ul sa fie
autorizat
NU DA

Mesaj:
Mesaj:
Examenul nu Ia id-ul intrebarii Creare grila
Ip-ul nu este
a inceput
autorizat temporala

Baza de date
Grila

Afisarea intrebarilor selectate


din baza de date

Astfel se creează un formular în care fiecare răspuns posibil are


câte x checkboxuri, x fiind numărul de întrebări, notate id_intrebare+al
câtelea răspuns din întrebare. Ex chk_5_1=on, la întrebarea 5 s-a bifat
răspunsul numărul 1. De asemenea mai este trimis şi un câmp ascuns
id_intrebare, care conţine id-ul întrebării din baza de date.
Când se dă submit la formular, prin apăsarea butonului “Am
Terminat” sau prin scurgerea timpului alocat atunci se trimit toate
rezultatele către modulul de notare. Şi aici intervine împărţirea zonei de
lucru în cadre, deoarece aceasta împiedică vizualizarea variabilele
trimise.

4.6.4 Crearea bazei de date temporale

49
Aplicaţie Web. Examen Grilă Online

S-a apelat la această metodă deoarece s-a dorit înlaturarea opţiunii


de refresh asupra paginii de testare, aceată opţiune conducea la
schimbarea întrebărilor generate iniţial. Iniţial au existat 2 optiuni de
rezolvare a acestei probleme, fie făcându-se o copie a paginii de testare
pe server, iar studentul să aibă acces doar la accea pagină, fie creearea
unei baze de date temporale. În final s-a optat pentru a doua variantă.
Astfel se creează o grilă temporală cu numele Grila_id_stud, în această
grilă sunt păstrate id-urile întrebărilor din baza de date Grila, întrebări
care vor apărea în cadrul examenului grila. Această tabelă se va şterge
imediat după terminarea examenului.

Mai jos vom prezenta schema conceperii acestei baze de date:

Creeare baza de date


temporală Grilă_id_stud

Verifică
NrIntrebari !=Max

Max
Se alege un
Baza de date a număr aleator
fost creeata

Verifică
Dacă nu a fost
deja introdus
DA
Introduce in baza
temporală creeată
id-ul intrebării

4.6.5. Modul de notare, calcularea rezultatelor

50
Aplicaţie Web. Examen Grilă Online

Aceast modul calculează rezultatele furnizate în urma susţinerii


examenului grilă. Dupa cum am menţionat mai sus id_1, id_2… au
asignat valoarea reala id din baza de date cu întrebari. Se caută
răspunsurile corecte în baza de date si se compară cu răspunsurile aflate
in varialbilele trimise în urma examenului, chk1_1, chk1 – număr
întrebare, _1 număr răspuns. S-a considerat drept răspunsuri corecte
doar răspunsurile care coincid în baza de date fie ca ele au fost
completate de utilizator sau nu, şi raspunsuri gresite cele care nu se
potrivesc. Astfel notarea se face după urmatoarea formula:
nr _ corecte− 0.5 * nr _ gresite
nota= , dacă această notă este mai mică decât 0
nr _ raspunsuri
ea se aduce la valoarea 0.
Nota finală rezultă din însumarea notelor parţiale, suma fiind
împărţită la numărul de întrebări.
Schema funcţională:

Utilizator

Id Intrebari Raspunsul furnizat


Intrebare

Raspuns corect

Baza de date
Grila
Se compara
raspunsurile
daca coincid daca nu coincid

Se incrementeaza Se incrementeaza
raspunsul corect raspunsul incorect

Formula nota

După calcularea notei finale, se calculează şi media în funcţie de


nota de la laborator şi cea de la examen, ambele adăugându-se în baza
de date.

4.7. Cerinte hardware si software

51
Aplicaţie Web. Examen Grilă Online

Cerinţe hardware

Aplicaţia a fost realizată şi testată pe un sistem cu următoarea configuraţie


- Intel CELERON 400 MHz
- 128 MB RAM
Deoarece testarea s-a efectual local, numarul de utilizator fiind limitat, aceasta
configuratie a indeplinit cu succes cerintele aplicatiei

Cerinţe software

Deoarece aplicaţia foloseşte componente independente de sistemul de operare,


acesta nu prezintă o mare importanţa, putând fi folosit cu succes oricare din SO-urile
prezente (Windows, Unix). Pentru testare, s-a folosit Windows XP Profesional..
Alte cerinţe:
- Flash player 6.0
- Apache 1.3.14
- MySQL 3.23.32
- PHP 4.0.5
- browser Web, recomandabil Internet Explorer 5.5

Acestea sunt cerinţele minime de funcţionare, versiunile ulterioare fiind bineînţeles


suportate.

4.4. Dezvolări ulterioare ale aplicaţiei

La nivel de student

- creearea unei secţiuni rezolvare a unor probleme propuse;


- implementarea unei secţiuni de comunicare între studeţi, în scopul colaborării.

La nivel de administrator:

- implementarea unei secţiuni de comunicare cu studenţii, prin trimiterea de


mesaje în cadrul site-ului.
- Creeare unei sectiuni pentru propunerea problemelor, şi implementarea unui
criteriu de notare pentru ce-i care se implică în proiect.
implementarea unor module pentru o mai bună administrare a utilizatorilor, in cazul
apariţiei de noi cerinţe

Capitolul 5. Anexă

Index.htm

<html>
<head>
<title>Structuri de Date si Algoritmi</title>

52
Aplicaţie Web. Examen Grilă Online

</head>
<frameset rows="62,*" cols="*" framespacing="3" frameborder="yes" border="3"
bordercolor="#336699" >
<frame src="titlu.htm " name="titlu" frameborder="no" scrolling="no" noresize marginwidth="0"
marginheight="0">

<frameset rows="*" cols="150,*" framespacing="2" border="2" bordercolor="#336699">


<frame src="butoane.htm" name="Meniu" id="Meniu" frameborder="no" scrolling="no" noresize
marginwidth="0" marginheight="0" bordercolor="#336699">
<frame src="prezentare.htm" name="Continut" frameborder="0" noresize marginwidth="20"
marginheight="5">
</frameset>
</frameset>
<noframes>
<p>Aceasta pagina necesita frames, insa browser-ul dumneavoastra nu le suporta.
</p>
</noframes></frameset>
<body bgcolor="#000000">
</body>
</html>

init.php
<?
function back_link()
{
?>
<script>
parent.Meniu.location.href='/a/butoane2.php';
function backlink()
{
parent.Meniu.location.href='/a/butoane.htm';
}
</script>
<?
}
// Setarile Bazei de date
$dbhost = "localhost"; // DB nume host
$dbusername = "root"; // DB Utilizator
$dbpass = ""; // DB Parola
$dbname = "fonseca"; // DB Nume
$dbpassword = "";

$domain="http://172.18.19.144/a/";
$domain2=$domain."Grile/";
$domain3=$domain."admin/";

$resultpage = "autentificare.php";
$admin = "admin/index.php";
$studenti = "members/index.php";
$link_secretariat= "secretariat/index.php";
$failure = "congresita.php";
$changepassword = $domain."chgpwd.php";
$changepassworda = $domain3."chgpwdadmin.php";
$utilizatori=$domain3."utilizatori.php";
$login = $domain."login.php";
$logout = $domain."logout.php";
$submit = $domain."submit.php";
$info = $domain2."info.php";
$grila_ex = $domain2."grila_ex.php";
$titlu = $domain."titlu.htm";

53
Aplicaţie Web. Examen Grilă Online

$link1 = $domain."butoane.htm";
$link2 = $domain."butoane2.php";
$link3 = $domain."butoane3.htm";
$dbport = "3306"; // default is 3306;
$RelLogin = "login.php";
$confirm = $domain."confirm.php";
$adminemail = "fonseca@hal.cs.tuiasi.ro";
$level_admin=1;
$level_secretariat=2;
$level_examen=3;
$nr_level=4;
$levelu[1]="1"; // level admin
$levelu[2]="2"; // level student
$levelu[3]="3"; //level examen
$levelu[4]="999"; //level student
//date examen
$nr_date_ex=5;
$data_examen[1]="18.06.2004";
$data_examen[2]="19.06.2004";
$data_examen[3]="20.06.2004";
$data_examen[4]="21.06.2004";
$data_examen[5]="22.06.2004";
$nr_grupe=15;
$grupa_std[1]="1201";
$grupa_std[2]="1202";
$grupa_std[3]="1203";
$grupa_std[4]="1204";
$grupa_std[5]="1205";
$grupa_std[6]="1206";
$grupa_std[7]="1207";
$grupa_std[8]="1208";
$grupa_std[9]="1209";
$grupa_std[10]="1210";
$grupa_std[11]="1211";
$grupa_std[12]="1212";
$grupa_std[13]="1213";
$grupa_std[14]="1214";
$grupa_std[15]="1215";
?>

install.php

<?php
include_once('init.php');
//Se creeaza daza de date
function cr_DB()
{
global $dbhost,$dbusername,$dbpass,$dbname,$nr_date_ex,$level_secretariat;
echo "Se initializeaza conectarea la baza de date MYSQL.<BR><BR>";
echo "dbhost.user.pass".$dbhost.$dbusername.$dbpass;
$link=mysql_connect($dbhost,$dbusername,$dbpass)
or die("Nu se poate conecta la baza de date.<BR>");
mysql_drop_db($dbname);
mysql_create_db($dbname);
$echo1="Database ".$dbname." a fost creeata .<BR><BR>";

54
Aplicaţie Web. Examen Grilă Online

echo $echo1;
mysql_select_db($dbname);
mysql_query("CREATE TABLE studenti (id int(4) NOT NULL auto_increment,id_user
int(4) NOT NULL default '',data_ex varchar(10),id_secr int(4),nota_ex float,nota_lab float,media
float,PRIMARY KEY (id))");
echo "Table Studenti a fost creeata .<BR>";
mysql_query("CREATE TABLE ipexam (id int(4) NOT NULL auto_increment,ip
varchar(15) NOT NULL default '',id_user int(4),PRIMARY KEY (id))");
echo "Table Ipexam a fost creeata .<BR>";
mysql_query("CREATE TABLE studsecr (id int(4) NOT NULL
auto_increment,fname varchar(30) NOT NULL default '',lname varchar(20) NOT NULL default
'',grupa int(5),nrmatricol int(4),cnp varchar(13),user_creat int(1),PRIMARY KEY (id))");
echo "Table Secretariat a fost creeata .<BR>";
mysql_query("CREATE TABLE utilizatori (id int(4) NOT NULL auto_increment,uname
varchar(25) NOT NULL default '',passwd varchar(32) NOT NULL default '',team varchar(25) NOT
NULL default '',level int(4) NOT NULL default '0',status varchar(10) NOT NULL default
'',lastlogin datetime default NULL,logincount int(11) default NULL,PRIMARY KEY (id))");
$pass=md5("a");
mysql_query("INSERT INTO utilizatori VALUES ( '1', 'admin', '$pass', 'Admin', '1', 'active', '',
0)");
mysql_query("INSERT INTO utilizatori VALUES ( '2', 'secretariat', '$pass', 'Secretariat',
'$level_secretariat', 'active', '0', 0)");
echo "Table Utilizatori a fost creeata .<BR>";
mysql_query("CREATE TABLE grupuri (teamname varchar(25) NOT NULL,teamlead
varchar(25) NOT NULL,status varchar(10) NOT NULL, PRIMARY KEY teamname");
mysql_query("INSERT INTO grupuri VALUES ( '1', 'Ungrouped', 'admin', 'active')");
mysql_query("INSERT INTO grupuri VALUES ( '2', 'Admin', 'admin', 'active')");
mysql_query("INSERT INTO grupuri VALUES ( '3', 'Secretariat', 'admin', 'active')");
global $data_examen;
for($i=1;$i<=$nr_date_ex;$i++)
{
mysql_query("INSERT INTO grupuri VALUES ( '(3+$i)', '".$data_examen[$i]."', 'admin',
'active')");
echo "Am creat grupul ".$data_examen[$i]." <br> "; }
echo "Table Grupuri a fost creeata .<BR>";
mysql_query("CREATE TABLE email (id_user int(4) NOT NULL default '',email varchar(45)
NOT NULL default '',datejoined datetime NOT NULL default '0000-00-00 00:00:00')" );
echo "Table Email a fost creeata .<BR>";
mysql_query("CREATE TABLE setari (id int(4) NOT NULL auto_increment,pexamen int(2),plab
int(2),nrintrebari int(2),autoapprove tinyint(4) NOT NULL default '0',autosendadmin tinyint(4)
NOT NULL default '0',nrminute int(4) default '20',PRIMARY KEY (id),UNIQUE KEY id (id))");
echo "<BR>Tabelul Grila a fost creat .<BR>";
mysql_close($link);
echo "<BR>Conexiunea cu serverul MYSQL a fost inchisa .<BR>";
}
echo "<BR><BR><BR><center><b>Initzializare pagina</b></center><BR><BR><BR>";
cr_DB();
?>

autentificare.php

<?
// deschide o sesiune
// se vor stoca in cookie variabilele username and password chiar daca nu sunt corecte.
pentru asta // //trebuie verificata fiecare pagina pentru ca ea sa fie securizata..
$password=md5($password);
setcookie ("USERNAME", $username, time()+7200);
setcookie ("PASSWORD", $password, time()+7200);
include ("auth.php");
include_once("init/init.php");

55
Aplicaţie Web. Examen Grilă Online

$Auth = new auth($USERNAME, $PASSWORD,$dbhost,$dbusername,$dbpass,$dbname);


$detail = $Auth-> autentificare($username, $password);
if ($detail==0)
{
?><HEAD>
<SCRIPT language="JavaScript1.1">
<!--
location.replace("<? echo $failure; ?>");
//-->
</SCRIPT>
</HEAD>
<?
}
elseif ($detail == 1) {
?><HEAD>
<SCRIPT language="JavaScript1.1">
<!--
location.replace("<? echo $admin; ?>");
//-->
</SCRIPT>
</HEAD>
<?
}
elseif(($detail == 2 )||($detail["team"] == "Secretariat") ) {
?><HEAD>
<SCRIPT language="JavaScript1.1">
<!--
location.replace("<? echo $link_secretariat; ?>");
//-->
</SCRIPT>
</HEAD>
<?
}
else
{
?><HEAD>
<SCRIPT language="JavaScript1.1">
<!--
location.replace("<? echo $studenti; ?>");
//-->
</SCRIPT>
</HEAD>
<?
}
?>

auth.php

<?php
include_once("init/init.php");
class auth{
var $DBHOST ; // DB DBHOST
var $USERNAME ; // Utilizator
var $PASSWORD ; // PASSWORD utilizator
var $DBNAME ; // DB NAME
var $DBUSERNAME;
var $DBPASSWORD;
function auth($username1, $password1,$host1,$dbusername1,$dbpassword,$dbname1) {
$this->DBHOST=$host1;
$this->USERNAME=$username1;

56
Aplicaţie Web. Examen Grilă Online

$this->PASSWORD=$password1;
$this->DBNAME=$dbname1;
$this->DBUSERNAME=$dbusername1;
$this->DBPASSWORD=$dbpassword;
}
// Autentificarea
function autentificare($username1, $password1)
{
$query = "SELECT * FROM utilizatori WHERE uname='$username1' AND
passwd='$password1' AND status='active'";
$UpdateRecords = "UPDATE utilizatori SET lastlogin = NOW(), logincount =
logincount + 1 WHERE uname='$username1'";
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
$row = mysql_fetch_array($result);
// Daca numarul de campuri cautate este 0, inseamna ca nu s-a potrivit numele
userului cu parola.

if ($numrows == 0) {
return false;
}
elseif ($row["level"]==1) { // LOGARE ADMIN
$Update = mysql_query($UpdateRecords);
return 1;
}elseif ($row["level"]==2) { // LOGARE secretariat
$Update = mysql_query($UpdateRecords);
return 2;
}
else {
$Update = mysql_query($UpdateRecords);
return $row;
}
}
// Aceasta functie e folosita pt fiecare pagina care se doreshte a fi securizata

function page_check($username1, $password1) {


$query = "SELECT * FROM utilizatori WHERE uname='$username1' AND
passwd='$password1' AND status <> 'inactive'";
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($query);
$numrows = mysql_num_rows($result);
$row = mysql_fetch_array($result);
// Daca numarul de campuri cautate este 0, inseamna ca nu s-a potrivit numele
userului cu parola.
if ($numrows == 0) {
return false;
}
return $row;
}
// modifica informatii useri
function modify_user($username1, $password1, $team, $level, $status) {
$qUpdate = "UPDATE utilizatori SET passwd='$password1', team='$team',
level='$level', status='$status' WHERE uname='$username1'";
if (trim($level)=="") {
return "Fara level";
}

57
Aplicaţie Web. Examen Grilă Online

elseif (($username1=="admin" AND status=="inactive")) {


return "Userul admin nu poate fi inactiv ";
}
elseif (($username1=="secretariat" AND status=="inactive")) {
return "Userul secretariat nu poate fi inactiv ";
}
else {
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME,
$this->DBPASSWORD);
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($qUpdate);
return 1;
}
}
// Sterge Utilizator
function delete_user($username1) {
$qDelete = "DELETE FROM utilizatori WHERE uname='$username1'";

if ($username1 == "sa") {
return "Utilizatorul nu poate fi sters.";
}
elseif ($username1 == "admin") {
return "Utilizatorul admin nu poate fi sters.";
}
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
$SelectedDB = mysql_select_db($this->DBNAME);
$IdUtil = "SELECT id FROM utilizatori WHERE uname='$username1'";
$result1=mysql_query($IdUtil);
$row1=mysql_fetch_array($result1);
$temp1=$row1['id'];
$IdStud = "SELECT id_secr FROM studenti WHERE id_user='$temp1'";
$result2=mysql_query($IdStud);
$row2=mysql_fetch_array($result2);
$temp2=$row2['id_secr'];
mysql_query("UPDATE studsecr SET user_creat = '0' WHERE id='$temp2'");
$result3 = mysql_query("DELETE FROM studenti WHERE id_user='$temp1'");
$result = mysql_query($qDelete);
return mysql_error();
}
// Adauga Utilizator
function add_user($username1, $password1, $team, $level, $status) {
$qUserExists = "SELECT * FROM utilizatori WHERE uname='$username1'";
$qInsertUser = "INSERT INTO utilizatori(uname, passwd, team, level, status,
lastlogin, logincount)
VALUES ('$username1', '".md5($password1)."', '$team', '$level', '$status', '', 0)";
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
// Verifica daca campurile au fost completate
if (trim($username1) == "") {
return "camp gol";
}
elseif (trim($level) == "") {
return "level gol";
}
// Verifica daca user-ul exista
$SelectedDB = mysql_select_db($this->DBNAME);
$user_exists = mysql_query($qUserExists);
if (mysql_num_rows($user_exists) > 0) {
return "exista utilizator";

58
Aplicaţie Web. Examen Grilă Online

}
else {
// Adauga Utilizatorul in baza de date
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($qInsertUser);
return mysql_affected_rows();
}
}

// Adauga o grupa
function add_team($teamname, $teamlead, $status="active") {
$qGroupExists = "SELECT * FROM grupuri WHERE teamname='$teamname'";
$qInsertGroup = "INSERT INTO grupuri(teamname, teamlead, status)
VALUES ('$teamname', '$teamlead', '$status')";
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
// Verifica daca campurile au fost completate
if (trim($teamname) == "") {
return "campul grup gol";
}
// Verifica daca grupul exista
$SelectedDB = mysql_select_db($this->DBNAME);
$group_exists = mysql_query($qGroupExists);
if (mysql_num_rows($group_exists) > 0) {
return "grupa exista";
}
else {
// Adauga Utilizatorul in baza de date
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($qInsertGroup);
return mysql_affected_rows();
}
}
// Modifica grupul
function modify_team($teamname, $teamlead, $status) {
$qUpdate = "UPDATE grupuri SET teamlead='$teamlead', status='$status'
WHERE teamname='$teamname'";
$qUserStatus = "UPDATE utilizatori SET status='$status' WHERE
team='$teamname'";
if ($teamname == "Admin" AND $status=="inactive") {
return "Grupul Admin nu poate fi inactivat.";
}
elseif ($teamname == "Secretariat" AND $status=="inactive") {
return "Grupul Secretariat nu poate fi inactivat.";
}
elseif ($teamname == "Ungrouped" AND $status=="inactive") {
return "Ungrouped nu poate fi inactivat.";
}
else {
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME,
$this->DBPASSWORD);
// Face Update la status , daca el era Inactiv
$SelectedDB = mysql_select_db($this->DBNAME);
$userresult = mysql_query($qUserStatus);
$result = mysql_query($qUpdate);
return 1;
}

59
Aplicaţie Web. Examen Grilă Online

}
// Sterge Grupa
function delete_team($teamname) {
$qDelete = "DELETE FROM grupuri WHERE teamname='$teamname'";
$qUpdateUser = "UPDATE utilizatori SET team='Ungrouped' WHERE
team='$teamname'";
if ($teamname == "Admin") {
return "Grupul Admin nu poate fi sters.";
}
elseif ($teamname == "Ungrouped") {
return "Ungrouped nu poate fi sters.";
}
elseif ($teamname == "Secretariat") {
return "Grupul Secretariat nu poate fi sters.";
}
$connection = mysql_connect($this->DBHOST, $this->DBUSERNAME, $this-
>DBPASSWORD);
$SelectedDB = mysql_select_db($this->DBNAME);
$result = mysql_query($qUpdateUser);
$result = mysql_query($qDelete);
return mysql_error();
}
}
?>

process.php

<?
include_once("init/init.php");

$fname=strtolower($fname);
$lname=strtolower($lname);

?>

<html>
<head>
<title>Procesare date</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<link href="./style/tabel.css" rel="stylesheet" type="text/css">
</head>

<body bgcolor="#FFFFFF" text="#000000">

<?
include ("auth.php");
$connection = mysql_connect($dbhost, $dbusername, $dbpassword);
$db = mysql_select_db($dbname);

// Setarile pt login
$qSetup = mysql_query("SELECT * FROM setari");
$SetupRow = mysql_fetch_array($qSetup);
$AutoApprove = $SetupRow["autoapprove"];
$AutoSendAdmin = $SetupRow["autosendadmin"];

60
Aplicaţie Web. Examen Grilă Online

// Procesarea de date la inscriere


$EmailQuery = mysql_query("SELECT * FROM email WHERE email='$email'");
$email = strtolower($email);
$EmailExist = mysql_num_rows($EmailQuery); // Retureaza 0 daca nu exista
$username = strtolower($username);
$UsernameQuery = mysql_query ("SELECT * FROM utilizatori WHERE
uname='$username'");
$UsernameExist = mysql_num_rows($UsernameQuery);
$NameQuery = mysql_query("SELECT * FROM studsecr WHERE lname='$lname' and
fname='$fname'");
$NameExist = mysql_num_rows($NameQuery);
$NrmatrQuery = mysql_query("SELECT * FROM studsecr WHERE lname='$lname' and
fname='$fname' and nrmatricol='$nr_matr_signup'");
$NrmatrExist = mysql_num_rows($NrmatrQuery);
$CNPQuery = mysql_query("SELECT * FROM studsecr WHERE lname='$lname' and
fname='$fname' and nrmatricol='$nr_matr_signup' and cnp='$cnp_signup'");
$CNPExist = mysql_num_rows($CNPQuery);
$GrupaQuery = mysql_query("SELECT * FROM studsecr WHERE lname='$lname' and
fname='$fname' and nrmatricol='$nr_matr_signup' and cnp='$cnp_signup' and
grupa='$grupa_student'");
$GrupaExist = mysql_num_rows($GrupaQuery);

if (trim($ValidEmailDomains)=="")
{
$EmailArray = "";
}
else
{ $EmailArray = split (" ", $ValidEmailDomains);
}

// Verifica daca numele utilizatorului este deja folosit


if (trim($username)=='secretariat' || trim($username)=='admin' )
{
$UsernameExist = 1;
}

// Verifica campurile sa fie completate


if (!trim($username))
{
//print "<p><font size=\"3\" face=\"Verdana, Arial\"
color=\"#FF0000\"><b>Campul Utilizator nu poate sa ramana necompletat!</b></font></p>";
?>
<br><br><br>
<div align="center"><font size="4"><b>Campul Utilizator nu poate sa ramana necompletat!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if (!trim($password))
{
?>
<br><br><br>
<div align="center"><font size="4"><b>Campul Parola nu poate sa ramana necompletat!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if (!trim($fname))
{
?>

61
Aplicaţie Web. Examen Grilă Online

<br><br><br>
<div align="center"><font size="4"><b>Campul Nume nu poate sa ramana necompletat!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if (!trim($lname))
{
?>
<br><br><br>
<div align="center"><font size="4"><b>Campul Utilizator nu poate sa ramana necompletat!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if (!trim($email))
{ ?>
<br><br><br>
<div align="center"><font size="4"><b>Campul E-mail nu poate sa ramana necompletat!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<? exit;
}
if (!trim($nr_matr_signup))
{ ?>
<br><br><br>
<div align="center"><font size="4"><b>Numarul matricol trebuie introdus corect!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if (!trim($cnp_signup))
{ ?>
<br><br><br>
<div align="center"><font size="4"><b>Codul numeric personal trebuie introdus corect!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<?
exit;
}
if(!$NameExist)
{
?>
<br><br><br>

<div align="center"><font size="4"><b><? print "<font size=\"3\" face=\"Verdana, Arial\"


color=\"#FF0000\"><b>".ucwords($fname)." ".ucwords($lname)."</b></font>";?> nu apare in
baza de date ca fiind inscris la curs<br><input type=button value="Reveniti" onClick="history.go(-
1)"></b></font></div>
<?
exit;
}

if(!$NrmatrExist)
{ ?>
<div align="center"><font size="4"><b><? print "<font size=\"3\" face=\"Verdana, Arial\"
color=\"#FF0000\"><b>".ucwords($fname)." ".ucwords($lname)."</b></font>";?> cu numarul
matricol <font color="Blue"> <?echo $nr_matr_signup;?> </font> nu apare in baza de date ca fiind
inscris la curs<br><input type=button value="Reveniti" onClick="history.go(-
1)"></b></font></div>
<?
exit;
}

62
Aplicaţie Web. Examen Grilă Online

if(!$CNPExist)
{?>
<div align="center"><font size="4"><b><? print "<font size=\"3\" face=\"Verdana, Arial\"
color=\"#FF0000\"><b>".ucwords($fname)." ".ucwords($lname)."</b></font>";?> cu numarul
matricol <?echo $nr_matr_signup;?> si cu CNP <font color="Blue"><? echo $cnp_signup; ?
></font> nu apare in baza de date ca fiind inscris la curs!<br><input type=button value="Reveniti"
onClick="history.go(-1)"></b></font></div>

<?
exit;
}

if(!$GrupaExist)
{ ?>
<div align="center"><font size="4"><b><? print "<font size=\"3\" face=\"Verdana, Arial\"
color=\"#FF0000\"><b>".ucwords($fname)." ".ucwords($lname)."</b></font>";?> cu numarul
matricol <?echo $nr_matr_signup;?> si cu CNP <? echo $cnp_signup; ?> si grupa <font
color="Blue"><?echo $grupa_student;?></font> nu apare in baza de date ca fiind inscris la curs!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>

<? exit;
}

// Verifica daca campul email e completat corespunzator


$good = ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.
'@'.
'[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
'[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$',
$email);
if (!$good)
{ ?>

<div align="center"><font size="4"><b>Campul E-mail are format


necorespunzator!<br><input type=button value="Reveniti" onClick="history.go(-
1)"></b></font></div>

<? exit;
}

$found=false;
if ($EmailArray!="")
{
for ($ct=0;$ct<=sizeof($EmailArray)-1;$ct++)
{
if (eregi($EmailArray[$ct], $email))
{
$ct=sizeof($EmailArray);
$found=true;
}
else
{
$found=false;
}
}
}
else
{
$found = true;
}
if (!$found)
{?>

63
Aplicaţie Web. Examen Grilă Online

<div align="center"><font size="4"><b> E-mail neacceptat!<br><input


type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<? exit;
}

// Verifica daca username-ul mai exista in baza de date


if ($UsernameExist>0)
{ ?>
<div align="center"><font size="4"><b>Numele de utilizator exista deja in baza de
date!<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<? exit;
}

// // Verifica daca e-mail-ul mai exista in baza de date


if ($EmailExist>0)
{ ?>
<div align="center"><font size="4"><b>Email-ul exista deja in baza de date!
<br><input type=button value="Reveniti" onClick="history.go(-1)"></b></font></div>
<? exit;
}

//Daca in tabela studsecr campul cont_creat==1 atunci nu se mai poate crea alt cont(cu alt
username/pass) pentru
//respectivul student.
$UsercreatQuery = mysql_query("SELECT * FROM studsecr WHERE cnp='$cnp_signup'
and user_creat='0'");
$UsercreatExist = mysql_num_rows($UsercreatQuery);

if(!$UsercreatExist)
{ ?>
<div align="center"><font size="4"><b><? print "<font size=\"3\" face=\"Verdana, Arial\"
color=\"#FF0000\"><b>".ucwords($fname)." ".ucwords($lname)."</b></font>";?> cu numarul
matricol <?echo $nr_matr_signup;?> si cu CNP <? echo $cnp_signup; ?> din grupa <?echo
$grupa_student;?>mai este odata inregistrat pe site!<br><input type=button value="Reveniti"
onClick="history.go(-1)"></b></font></div>
<? exit;
}

// Adauga un nou utilizator


$addmember = mysql_query("INSERT INTO email VALUES ('','$email',NOW())");

// Daca a fost adaugat cu succes


if ($addmember)
{
// Verifica drepturile
if ($AutoApprove==1)
{
$MemberStatus = "active";
}
else
{
$MemberStatus = "inactive";
}

//$enc_passwd = md5($password);
$AddToAuth = new auth($USERNAME, $PASSWORD,$dbhost,$dbusername,
$dbpass,$dbname);
for($i=1;$i<=$nr_date_ex;$i++)
if($data_examen[$i]==$data_ex) $team_temp=$data_ex;

64
Aplicaţie Web. Examen Grilă Online

$add = $AddToAuth->add_user($username,$password,$team_temp,"999",
$MemberStatus,'', 0);
if ($add)
{
$IdsecrQuerry=mysql_query("SELECT id FROM studsecr WHERE
cnp='$cnp_signup'");
$IdsecrRow = mysql_fetch_array($IdsecrQuerry);
$temp=$IdsecrRow['id'];

$IduserQuerry=mysql_query("SELECT id FROM utilizatori


WHERE uname='$username'");
$IduserRow = mysql_fetch_array($IduserQuerry);
$temp1=$IduserRow['id'];

mysql_query("UPDATE studenti SET id_user =


'$temp1',data_ex='$data_ex' WHERE id_secr='$temp'");
mysql_query("UPDATE studsecr SET user_creat = '1' WHERE
cnp='$cnp_signup'");
mysql_query("UPDATE email SET id_user = '$temp1' WHERE email='$email'");
}
}

// se seteaza daca sa trimita email automat sau nu?


//$EmailerFrom=trim($email);
//$EmailerName=trim($username);

if ($AutoSendAdmin == 1)
{
if ($add==1)
{
$AdminSubject = "O noua inscriere!";
$AdminMessage = "Suntetzi informat ca" . $username . " s-a inscris la
examen in data de ";//".$data_ex .";
$sent = @mail($adminemail, $AdminSubject, $AdminMessage, "From:
$adminemail\r\nReply-to:$email");
}
}
?>

<p><font size="3" face="Verdana, Arial, Helvetica, sans-serif" color="#FF0000"><b> Multumim


pentru inscriere!</b></font></p>

<SCRIPT language="JavaScript1.1">
<!--
location.replace("<? echo $RelLogin; ?>");
//-->
</SCRIPT>

</body>
</html>

check.php

<?
include_once("init/init.php");
$CheckSecurity = new auth($USERNAME, $PASSWORD,$dbhost,$dbusername,$dbpass,
$dbname);
$check = $CheckSecurity->page_check($USERNAME, $PASSWORD);
if ($check == false)
{

65
Aplicaţie Web. Examen Grilă Online

print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";


print "<b>Acces Ilegal</b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\"
color=\"#000000\">";
print "<b>Nu ai permisiunea sa vizualizezi aceasta pagina.</b></font>";
?>
<div align="left"><br><input type=button value="Reveniti" onClick="history.go(-
1)"></div>
<? exit;
}
?>

stud.php

<?
include_once("/init/init.php");

function start_ex($dbhost,$dbusername,$dbpassword,$dbname,$team)
{
global $data_examen,$nr_date_ex,$level_examen;
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)
or die("Nu se poate conecta la baza de date.<BR>");
$SelectedDB = mysql_select_db($dbname);

$today = date("d.m.Y");
if(strcmp($team,$today)==0)
{
//$temp_grup="ZiuaEx".substr($team,6,1);
$querry1= "UPDATE utilizatori SET level='$level_examen' WHERE team='$team'";
mysql_query($querry1);
return $temp_grup;
}
else return "data cur dif de data ex pt grup";
}
function stop_ex($dbhost,$dbusername,$dbpassword,$dbname,$team)
{
global $data_examen,$nr_date_ex,$level_examen;
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)
or die("Nu se poate conecta la baza de date.<BR>");
$SelectedDB = mysql_select_db($dbname);

$today = date("d.m.Y");
$querry1= "UPDATE utilizatori SET level='999' WHERE team='$team'";
mysql_query($querry1);
return $team;
}
function modify_stud($dbhost,$dbusername,$dbpassword,$dbname,$data_ex,$nota_ex,$nota_lab,
$media,$cnpS)
{
global $data_examen,$nr_date_ex;
if($nota_lab=='')
return "nota_lab vid";
if($nota_ex<0 || $nota_ex>=11)
return "nota_ex incorecta";
if($nota_lab<0 || $nota_lab>=11)
return "nota_lab incorecta";
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)
or die("Nu se poate conecta la baza de date.<BR>");
$SelectedDB = mysql_select_db($dbname);
$querry="SELECT id FROM studsecr WHERE cnp='$cnpS'";

66
Aplicaţie Web. Examen Grilă Online

$result=mysql_query($querry);
$row=mysql_fetch_array($result);
$temp=$row['id'];
$querry1= "UPDATE studenti SET nota_ex='$nota_ex', nota_lab='$nota_lab',
media='$media',data_ex='$data_ex' WHERE id_secr='$temp'";
$result0 = mysql_query("SELECT id_user FROM studenti WHERE id_secr='$temp' ");
$row0 = mysql_fetch_array($result0);
$id_user= $row0["id_user"];
$temp_team=$data_ex;
$querry01= "UPDATE utilizatori SET team='$temp_team' WHERE id='$id_user'";
$result01=mysql_query($querry01);
$result1=mysql_query($querry1);
return mysql_affected_rows();
}
?>

secr.php
<?
function add_secr_stud($dbhost,$dbusername,$dbpassword,$dbname,$numeS,$prenumeS,$grupaS,
$nrmatricolS,$cnpS){
$numeS=strtolower($numeS);
$prenumeS=strtolower($prenumeS);
if($numeS=='')
return "Nume_vid";
if($prenumeS=='')
return "Prenume vid";
if($grupaS=='')
return "Grupa vida";
if($nrmatricolS=='')
return "Nrmatricol vid";
if($cnpS=='')
return "CNP vid";
for($i=0;$i<=strlen($numeS)-1;$i++)
if(!((ord($numeS[$i])>=ord("a") && ord($numeS[$i])<=ord("z") ) ||
(ord($numeS[$i])>=ord("A") &&ord($numeS[$i])<=ord("Z"))))
{
return "Nume incorect";
}
for($i=0;$i<=strlen($prenumeS)-1;$i++)
if(!((ord($prenumeS[$i])>=ord("a") && ord($prenumeS[$i])<=ord("z") ) ||
(ord($prenumeS[$i])>=ord("A") &&ord($prenumeS[$i])<=ord("Z"))))
{
return "Prenume incorect";
}
for($i=0;$i<=strlen($nrmatricolS)-1;$i++)
if(!(ord($nrmatricolS[$i])>=ord("0") && ord($nrmatricolS[$i])<=ord("9")) )
{
return "nrmatricol incorect";
}
for($i=0;$i<=strlen($cnpS)-1;$i++)
if(!(ord($cnpS[$i])>=ord("0") && ord($cnpS[$i])<=ord("9")) )
{
return "cnp incorect";
}
if(strlen($nrmatricolS)!=4) return "nrmatricol!=4";
if(strlen($cnpS)!=13) return "cnp!=13";
$qInsertStud= "INSERT INTO studsecr (fname,lname,grupa,nrmatricol,cnp,user_creat) VALUES
('$numeS','$prenumeS','$grupaS','$nrmatricolS','$cnpS','0') ";
$CNPQuerry="SELECT * FROM studsecr WHERE cnp='$cnpS'";
$nrMatricolQuerry="SELECT * FROM studsecr WHERE nrmatricol='$nrmatricolS'";
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)

67
Aplicaţie Web. Examen Grilă Online

or die("Nu se poate conecta la baza de date.<BR>");


$SelectedDB = mysql_select_db($dbname);
$CNP_exists = mysql_query($CNPQuerry);
$CNP_Num_rows = mysql_num_rows($CNP_exists);
$CNP_rows = mysql_fetch_array($CNP_exists);
$nrMatricol_exists = mysql_query($nrMatricolQuerry);
$nrMatricol_Num_rows = mysql_num_rows($nrMatricol_exists);
$nrMatricol_rows = mysql_fetch_array($nrMatricol_exists);
if ($CNP_Num_rows > 0) {
return "CNP exista";
}
else
if ($nrMatricol_Num_rows > 0) {
return "NrMatr exista";
}
else {
$qInsertStud_result = mysql_query($qInsertStud);
$qSelectStudSecr=mysql_query("SELECT id FROM studsecr WHERE
cnp='$cnpS'");
$row_stud_secr=mysql_fetch_array($qSelectStudSecr);
$id_secr_temp=$row_stud_secr['id'];
$qInsertStud1="INSERT INTO studenti (data_ex,id_secr,nota_ex,nota_lab,media) VALUES
('','$id_secr_temp','','','') ";
$qInsertStud_result1 = mysql_query($qInsertStud1);
return mysql_affected_rows();
}
}

function delete_secr_stud($dbhost,$dbusername,$dbpassword,$dbname,$cnpS) {
$qDelete = "DELETE FROM studsecr WHERE cnp='$cnpS'";
$connection = mysql_connect($dbhost,$dbusername,$dbpassword);
$SelectedDB = mysql_select_db($dbname);
$qSelectStudSecr=mysql_query("SELECT id FROM studsecr WHERE
cnp='$cnpS'");
$row_stud_secr=mysql_fetch_array($qSelectStudSecr);
$id_secr_temp=$row_stud_secr['id'];
$qDelete1 = "DELETE FROM studenti WHERE id_secr='$id_secr_temp'";
$result1 = mysql_query($qDelete1);
$result = mysql_query($qDelete);
return mysql_error();
}
function modify_secr_stud($dbhost,$dbusername,$dbpassword,$dbname,$numeS,$prenumeS,
$grupaS,$nrmatricolS,$cnpS){
$numeS=strtolower($numeS);
$prenumeS=strtolower($prenumeS);
if($numeS=='')
return "Nume vid";
if($prenumeS=='')
return "Prenume vid";
if($grupaS=='')
return "Grupa vida";
if($nrmatricolS=='')
return "Nrmatricol vid";
if($cnpS=='')
return "CNP vid";
for($i=0;$i<=strlen($numeS)-1;$i++)
if(!((ord($numeS[$i])>=ord("a") && ord($numeS[$i])<=ord("z") ) ||
(ord($numeS[$i])>=ord("A") &&ord($numeS[$i])<=ord("Z"))))
{
return "Nume incorect";
}

68
Aplicaţie Web. Examen Grilă Online

for($i=0;$i<=strlen($prenumeS)-1;$i++)
if(!((ord($prenumeS[$i])>=ord("a") && ord($prenumeS[$i])<=ord("z") ) ||
(ord($prenumeS[$i])>=ord("A") &&ord($prenumeS[$i])<=ord("Z"))))
{
return "Prenume incorect";
}
for($i=0;$i<=strlen($nrmatricolS)-1;$i++)
if(!(ord($nrmatricolS[$i])>=ord("0") && ord($nrmatricolS[$i])<=ord("9")) )
{
return "nrmatricol incorect";
}
for($i=0;$i<=strlen($cnpS)-1;$i++)
if(!(ord($cnpS[$i])>=ord("0") && ord($cnpS[$i])<=ord("9")) )
{
return "cnp incorect";
}
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)
or die("Nu se poate conecta la baza de date.<BR>");
$SelectedDB = mysql_select_db($dbname);

$CNPQuerry="SELECT * FROM studsecr WHERE cnp='$cnpS' AND fname<>'$numeS'";


$nrMatricolQuerry="SELECT * FROM studsecr WHERE nrmatricol='$nrmatricolS' AND
fname<>'$numeS'";
$CNP_exists = mysql_query($CNPQuerry);
$CNP_Num_rows = mysql_num_rows($CNP_exists);
$CNP_rows = mysql_fetch_array($CNP_exists);
$nrMatricol_exists = mysql_query($nrMatricolQuerry);
$nrMatricol_Num_rows = mysql_num_rows($nrMatricol_exists);
$nrMatricol_rows = mysql_fetch_array($nrMatricol_exists);
if ($CNP_Num_rows > 0) {
return "CNP exista";
}
else
if ($nrMatricol_Num_rows > 0) {
return "NrMatr exista";
}
if(strlen($nrmatricolS)!=4) return "nrmatricol!=4";
if(strlen($cnpS)!=13) return "cnp!=13";

$qUpdateStudent= "UPDATE studsecr SET fname='$numeS', lname='$prenumeS',


grupa='$grupaS', nrmatricol='$nrmatricolS', cnp='$cnpS' WHERE cnp='$cnpS' ";
$connection = mysql_connect($dbhost,$dbusername,$dbpassword)
or die("Nu se poate conecta la baza de date.<BR>");
$SelectedDB = mysql_select_db($dbname);
$qUpdateStud_result = mysql_query($qUpdateStudent);
return mysql_affected_rows();
}
?>

logout.php

<?
// Distruge sesiunea
setcookie ("USERNAME", "", time() - 3600);
setcookie ("PASSWORD", "", time() - 3600);
include_once("init/init.php");
?>
<html>
<head>
<title>Delogare</title>

69
Aplicaţie Web. Examen Grilă Online

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">


<link href="./style/tabel.css" rel="stylesheet" type="text/css">
</head>
<body text="#000000">
<p align="center"><font face="Arial, Helvetica, sans-serif" size="5"><b>Va multumim
ca atzi utilizat site-ul noustru. </b></font></p>
<p align="center"><font face="Arial, Helvetica, sans-serif" size="3"><b> Datzi
click <a href="<? echo $login; ?>">aici</a> pentru a intra din nou pe site.</b></font></p>

changepasswd.php
$user = new auth($USERNAME, $PASSWORD,$dbhost,$dbusername,$dbpass,$dbname);
$connection = mysql_connect($dbhost, $dbusername, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$userdata = mysql_query("SELECT * FROM utilizatori WHERE uname='$USERNAME' and
passwd='$PASSWORD'");
if ($submit)
{
// Verifica daca a fost completata vechea parola
if (trim($oldpasswd) == "")
{
print "<p align=\"center\">";
print " <font face=\"Arial\" color=\"#FF0000\">";
print " <b>Trebuie introdusa parola veche!</b>";
print " </font>";
print "</p>";
exit;
}
// Verifica daca vechea parola este corecta
if ((md5($oldpasswd) != $PASSWORD)&&($oldpasswd!=''))
{
print "<p align=\"center\">";
print " <font face=\"Arial\" color=\"#FF0000\">";
print " <b>Parola veche este greshita!</b>";
print " </font>";
print "</p>";
exit;
}

// Verifica daca a fost complectata noua parola


if (trim($newpasswd) == "")
{
print "<p align=\"center\">";
print " <font face=\"Arial\" color=\"#FF0000\">";
print " <b>Trebuie introdusa noua parola!</b>";
print " </font>";
print "</p>";
exit;
}

// Verifica daca noua parola a fost confirmata


if ($newpasswd != $confirmpasswd)
{
print "<p align=\"center\">";
print " <font face=\"Arial\" color=\"#FF0000\">";
print " <b>Parola noua trebuie confirmata!</b>";
print " </font>";
print "</p>";
exit;
}

70
Aplicaţie Web. Examen Grilă Online

// Daca totul este in regula se foloseshte class auth pentru modificare


$update = $user->modify_user($USERNAME, md5($newpasswd), $check["team"],
$check["level"], $check["status"]);
if ($update) {
print "<p align=\"center\">";
print " <font face=\"Arial\" color=\"#FF0000\">";
print " <b>Schimbare Parolei a fost efectuata !</b><br>";
print " Pentru recunoashterea parolei este nevoie de relogare. <BR>";
print " "
?>
<input type=button value="Relogare"
onclick="parent.Continut.location.href='<? echo $login ?>',parent.Meniu.location.href='<? echo $link1 ?>'">
<?
print " </font>";
print "</p>";
}

}
?>

AdminIp.php
<?
// functia de verificare a ip-ului.
function verif_ip($ip)
{
if($ip=='') return "ip vid";
for($i=0;$i<strlen($ip);$i++)
if(!($ip[$i]>='0' && $ip[$i]<='9') && $ip[$i]!='.')
return "ip incorect";

if (eregi("^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$", $ip)) {
for ($i = 1; $i <= 3; $i++) {
if (!(substr($ip, 0, strpos($ip, ".")) >= "0" && substr($ip, 0, strpos($ip, ".")) <= "255"))
{
return "ip format";
}
$ip = substr($ip, strpos($ip, ".") + 1);
}

if (!($ip >= "0" && $ip <= "255")) {


return "ip format";
}
}
else {
return "ip format";
}
return 1;
}
$Ip=trim($Ip);
if (!class_exists(auth))
{
include ("../auth.php");
}
include ("../check.php");
include_once("../init/init.php");

global $dbhost,$dbusername,$dbpass,$dbname;
$link=mysql_connect($dbhost,$dbusername,$dbpass) or die("Nu se poate conecta la baza de date.<BR>");
mysql_select_db($dbname);
$SelectezDB = mysql_select_db($this->DBNAME);
if ($check["level"] != $level_admin)

71
Aplicaţie Web. Examen Grilă Online

{
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Acces Nepermis</b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>Nu ai permisiunea sa vizualizezi aceasta pagina.</b></font>";

exit;
}?>
<?

$get_id=$_GET["id"];
$mesaje="<center>".$_GET["mesaje"]."</center>";

if ($_GET["action"]=='Sterg')
{
$query="delete from ipexam where id=".$_GET["id"];
mysql_query($query);
}
$Ip=$_GET["ip"];
if ( $Ip!='')
{
$gExistaIp="SELECT ip FROM ipexam where ip='$Ip'";
$query="INSERT INTO ipexam VALUES ('','$Ip','')";

if ($_GET["action"]=="Edit")
{ $situation=verif_ip($Ip);
if($situation=="ip vid")
{ $mesaje="<center><font color='red'>Campul Ip este vid!</font></center>";
$situation='';
}elseif($situation=="ip incorect")
{$mesaje="<center><font color='red'>Campul Ip trebuie sa contina cifre sau caracterul '.' !
</font></center>";
$situation='';
}
elseif($situation=="ip format")
{
$mesaje="<center><font color='red'>Format ip gresit!</font></center>";
$situation='';
}
else
{$query="Update ipexam SET id='$get_id',ip='$Ip' where id='$get_id'" ;
mysql_query($query);
$mesaje="<center>Modificati ip-ul: $Ip</center>";
$situation='';
}
} else
{
$exista_ip = mysql_query($gExistaIp);
$temp=mysql_num_rows($exista_ip);
if ( $temp > 0)
{
$mesaje="<center>Ip-ul pe care doritzi sa-l introducetzi mai exista in baza de date .</center>";
}
else
{
$situation=verif_ip($Ip);
if($situation=="ip vid")
{
$mesaje="<center><font color='red'>Campul Ip este vid!</font></center>";
$situation='';

72
Aplicaţie Web. Examen Grilă Online

}
elseif($situation=="ip incorect")
{
$mesaje="<center><font color='red'>Campul Ip trebuie sa contina cifre sau caracterul '.' !
</font></center>";
$situation='';
}
elseif($situation=="ip format")
{
$mesaje="<center><font color='red'>Format ip gresit!</font></center>";
$situation='';
}
else
{
mysql_query($query);
$mesaje="<center>Ip-ul $Ip a fost introdus in baza de date.</center>";
$situation='';
}
}
}
}
?>

Startexamen.php
<?
include_once ("../init/init.php");
if (!class_exists(auth))
{
include ("../auth.php");
}
include ("../check.php");

if ($check["level"] != $level_examen)
{
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Acces Nepermis</b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>Examenul inca nu a inceput.</b></font>"; exit;
}
$id_user=$check["id"];
$connection = mysql_connect($dbhost, $dbusername, $dbpass);
$SelectedDB = mysql_select_db($dbname);
$ip_local=$_SERVER['REMOTE_ADDR'];

$querrya="select * from ipexam where ip='$ip_local'";


$result=mysql_query($querrya);
$num_ip_valid=mysql_num_rows($result);
if(!$num_ip_valid)
{
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Acces Nepermis.</b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>De pe ip-ul $ip_local nu se poate da examenul.</b></font>";
exit;
}

$querrya="select * from ipexam where id_user='$id_user' and ip<>'$ip_local'";


$result=mysql_query($querrya);
$num=mysql_num_rows($result);

73
Aplicaţie Web. Examen Grilă Online

if($num)
{
$row = mysql_fetch_array($result);
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Acces Nepermis. </b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>Acest cont mai este conectat odata la examen de la ip-ul".
$row['ip']."</b></font>";
exit;
}
$querry="select * from setari";
$result=mysql_query($querry);
$x=mysql_fetch_array($result);
$nrintreb=$x["nrintrebari"];
$timp=$x["nrminute"];
mysql_close();
?>

Grila _ex.php
<html>
<head>
</script>
<link href="../style/tabel.css" rel="stylesheet" type="text/css">
<title>Grila Examen</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<meta http-equiv="Pragma" content="no-cache">
<meta http-equiv="no-cache">
<meta http-equiv="Expires" content="0">
<!--<meta http-equiv="refresh" content="5"> -->
<meta http-equiv="Cache-Control" content="no-cache"><meta http-equiv="Pragma" content="no-cache">
</head>

<body>
<?
include_once('./../init/init.php');

function nr_chk($chk)
{
if ($chk=='on')
return 1;
else return 0;
}

global $dbhost,$dbusername,$dbpass,$dbname,$NumarDeIntrebari;

if (!class_exists(auth))
{
include_once ("../auth.php");
}
include_once ("../check.php");

mysql_connect($dbhost,$dbusername,$dbpass);
mysql_select_db($dbname);

$ip_local=$_SERVER['REMOTE_ADDR'];

$querrya="select * from ipexam where ip='$ip_local'";


$result=mysql_query($querrya);

74
Aplicaţie Web. Examen Grilă Online

$num_ip_valid=mysql_num_rows($result);
if(!$num_ip_valid)
{
//echo "level:".$check["level"];
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Acces Nepermis.De pe ip-ul $ip_local nu se poate da examenul.</b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>Nu ai permisiunea sa vizualizezi aceasta pagina.</b></font>";
exit;
}

$id_stud=$check["id"];
mysql_query("update ipexam set id_user='$id_stud' where ip='$ip_local'");

$query="select * from $dbname.studenti where id_user=".$id_stud;


$result=mysql_query($query);
$nota_ta=mysql_result($result,0,"nota_ex");
if ($nota_ta==0)
{
include_once('creare_grila.php');
}

if ($nota_ta==0)
{
$query1="select * from ".$dbname.".Grila_".$id_stud." order by Id_Intrebare";
$result1=mysql_query($query1);
$num=mysql_num_rows($result1);
$i=0;
while ($i < $num) {
$id_intrebare=mysql_result($result1,$i,"Id_Intrebare");
$nr_grila[$i]=$id_intrebare;

$i++;
}

$link=mysql_connect($dbhost,$dbusername,$dbpass)
or die("Nu se poate conecta la baza de date.<BR>");
mysql_select_db($dbname);

$i=0;
?>
<form name=formularul method=GET action="rezultate.php">
<div id="Layer1" style="position:Absolute; left:5px; top:50px; width:450px; height:226px; z-index:1">
<?
echo "<table width='400px' cellspacing=0 style=\"border:solid 1px; bgcolor:#cccccc;\">";
while ($i < $NumarDeIntrebari) {
$j=0;
$j1=0;
$query="select * from Grila where id=".$nr_grila[$i]." order by id";
$result=mysql_query($query);
$num=mysql_num_rows($result);

$id=mysql_result($result,0,"id");
$Intrebare=mysql_result($result,0,"Intrebare");
$NR=mysql_result($result,0,"NrRaspunsuri");
$R[$j++]=mysql_result($result,0,"Raspuns1");
$R[$j++]=mysql_result($result,0,"Raspuns2");
$R[$j++]=mysql_result($result,0,"Raspuns3");
$R[$j++]=mysql_result($result,0,"Raspuns4");

75
Aplicaţie Web. Examen Grilă Online

$R[$j++]=mysql_result($result,0,"Raspuns5");

if ($i==round($NumarDeIntrebari/2))
{
?></table>
</div>
<div id="Layer2" style="position:Absolute; left:455px; top:50px; width:450px; height:226px; z-index:1">
<?
echo "<table width='400px' cellspacing=0 style=\"border:solid 1px; bgcolor:#cccccc;\" >";
}
?>
<input type="hidden" name="id_<?echo $i+1;?>" value="<?echo $nr_grila[$i];?>">
<tr bordercolor="#000000" bgcolor="#00CCFF">
<td class="th"></td>
<td class="th" align="center">Intrebarea nr. <?echo $i+1;?></td>
</tr>
<tr>
<td class="row3"></td>
<td class="row3"><?echo $Intrebare;?></td>
</tr>
<tr>
<td colspan=2 class="th">&nbsp;</td>
</tr>

<?
for ($nri=0;$nri<$NR;$nri++)
{
?>
<tr >
<td width="15px" class="th"><input type="checkbox" name="chk<?$js=$i+1;$nrj=$nri+1; echo $js."_".
$nrj;?>"> </td>
<td class="rowpic"><?echo $R[$nri];?> </td>
</tr>
<?}

if ($NR<5)
for ($nri=$NR;$nri<5;$nri++)
{ echo "<tr><td>&nbsp;";}
?>
<tr>
<td colspan=2>&nbsp;</td>
</tr>
<?

$i++;
}
mysql_close($link);
?></table>
</div>
<div style="position:Absolute; left:405px; top:0px; width:450px; height:226px; z-index:5">
</div>
</form>
<?}
else
{
?>
<script>
parent.Meniu.location.href='<? echo $link3 ?>';
parent.titlu.location.href='<? echo $titlu ?>';
</script>
<br><br>

76
Aplicaţie Web. Examen Grilă Online

<table width="30%" align="center" border="0" cellpadding="0" cellspacing="0" bordercolor="#000000">


<tr>
<td width="30%" align="center"><font size="3"><b>Aveti dat o data examenul cu nota</b></font></td>
</tr>
<tr>
<td align="center"><font size="3" color="red"><b><? echo $nota_ta;?></b></font></td>
</tr>
</table>
<? } ?>
</body><html>

creare_grila.php
<?
if (!class_exists(auth))
{
include ("../auth.php");
}
include_once ("../check.php");
include_once('../init/init.php');
include_once('nr_grile.php');

$id_stud=$check["id"];

global $dbhost,$dbusername,$dbpass,$dbname;
mysql_connect($dbhost,$dbusername,$dbpass);
mysql_select_db($dbname);

$query="CREATE TABLE IF NOT EXISTS ".$dbname.".Grila_".$id_stud." (Id_Intrebare int(5) NOT


NULL)";
mysql_query($query);
$query="select * from ".$dbname.".Grila_".$id_stud;
$result=mysql_query($query);
$num=mysql_num_rows($result);

if ($num==0)

{
include_once('../init/init.php');
global $dbhost,$dbusername,$dbpass,$dbname;
$link=mysql_connect($dbhost,$dbusername,$dbpass)
or die("Nu se poate conecta la baza de date.<BR>");
mysql_select_db($dbname);
$query="select * from Grila ";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close($link);

$Intrebare=$_GET["Intrebare"];

for ($i=0;$i<$NumarDeIntrebari;$i++)
{
$test=rand(0,$num-1);
if ($i>0)
{
$j=0;
while ($j<$i)
{
if ($nr_grila[$j]!=$test)
$nr_grila[$i]=$test;

77
Aplicaţie Web. Examen Grilă Online

else
{$test=rand(0,$num-1);
$j=-1;
}
$j++;
}
}
else
$nr_grila[$i]=$test;
}
$i=0;
while ($i < $NumarDeIntrebari) {
$j=0;
$j1=0;
$id=mysql_result($result,$nr_grila[$i],"id");
mysql_connect($dbhost,$dbusername,$dbpass);
mysql_select_db($dbname);
$query="insert into ".$dbname.".Grila_".$id_stud." values ('$id')";
mysql_query($query);
mysql_close();

$i++;
}
}
?>

rezultate.php
<html>

<head>
<title>Rezultate</title>
<body>
<?
include_once('../init/init.php');
include_once ("nr_grile.php");
if (!class_exists(auth))
{
include ("../auth.php");
}
include ("../check.php");

global $dbhost,$dbusername,$dbpass,$dbname,$NumarDeIntrebari;
$link=mysql_connect($dbhost,$dbusername,$dbpass)
or die("Nu se poate conecta la baza de date.<BR>");
mysql_select_db($dbname);

if ($check["level"] != $level_examen)
{
$query="drop table Grila_".$id_stud;
mysql_query($query);
mysql_close($link);
print "<font face=\"Arial, Helvetica, sans-serif\" size=\"5\" color=\"#FF0000\">";
print "<b>Examenul s-a </b>";
print "</font><br>";
print "<font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#000000\">";
print "<b>Nu ai permisiunea sa vizualizezi aceasta pagina.</b></font>";

exit;
}

78
Aplicaţie Web. Examen Grilă Online

$id_stud=$check["id"];

$query="select * from studenti where id_user=".$id_stud;


$result=mysql_query($query);
$nota_ta=mysql_result($result,0,"nota_ex");
if ($nota_ta==0)

{
$nota=0;
$nr_casute=0;
?>
<table width="60%" align="center" border="1" cellpadding="0" cellspacing="0" bordercolor="#000000">
<tr>
<td width="15%" class="th" align="center">Intrebarea NR. </td>
<td width="15%" class="th" align="center">NR. Raspunsuri </td>
<td width="15%" class="th" align="center">Raspunsuri Corecte </td>
<td width="15%" class="th" align="center">Punctajul Raspunsului </td>
<?
for ($i=1;$i<=$NumarDeIntrebari;$i++)
{

$nr_grila[$i]=$_GET["id_$i"];
$query="select * from Grila where id=".$nr_grila[$i];

$result=mysql_query($query);
$num=mysql_num_rows($result);

$id=mysql_result($result,0,"id");
$Intrebare=mysql_result($result,0,"Intrebare");
$NR=mysql_result($result,0,"NrRaspunsuri");

?>
<tr>
<td width="15%" class="rowpic" align="center"><? echo $i ?></td>
<?
$corecte=0;
$incorecte=0;

for ($nri=1;$nri<=$NR;$nri++)
{

$R[$nri]=mysql_result($result,0,"Raspuns".$nri);
$c[$nri]=mysql_result($result,0,"chk".$nri);
$c1[$nri]=0;
if($_GET["chk".$i."_".$nri]=='on')
$c1[$nri]=1;

if ($c[$nri]==$c1[$nri])
$corecte++;
else
$incorecte++;
}
$nota1=($corecte-0.5*$incorecte)/$NR;
if($nota1<0)
{
$nota1=0;
}
$nota1= round($nota1*100)/100;
$nota+=$nota1;
?>
<td width="15%" class="rowpic" align="center"><? echo $NR ?></td>

79
Aplicaţie Web. Examen Grilă Online

<td width="15%" class="rowpic" align="center"><? echo $corecte ?></td>


<td width="15%" class="rowpic" align="center"><? echo $nota1?></td>
</tr>
<?
}
$nota=$nota*$NumarDeIntrebari/$NumarDeIntrebari;
?>
</tr>
</table>
<br>
<table align="center" border="1">
<tr>
<td class="th" align="center">Nota finala</td>
</tr>
<tr>
<td class="rowpic" align="center"><font color="red"><? echo $nota ?></font></td>
</tr>
</table>
<?
$query="Update studenti SET nota_ex='$nota' where id_user=".$id_stud;
mysql_query($query);
$query="select * from studenti where id_user=".$id_stud;
$result=mysql_query($query);
$num=mysql_num_rows($result);
$nota_lab=mysql_result($result,0,"nota_lab");
$query="drop table Grila_".$id_stud;
mysql_query($query);

$query="select * from setari ";


$result=mysql_query($query);

$num=mysql_num_rows($result);
$pex=mysql_result($result,0,"pexamen");
$plab=100-$pex;

$media=$pex/100*$nota+$plab/100*$nota_lab;
$query="Update studenti SET media='$media' where id_user=".$id_stud;
mysql_query($query);
mysql_close($link);
?>
</body><html>
<?
}
else
{ ?>
<br><br>
<table width="30%" align="center" border="0" cellpadding="0" cellspacing="0" bordercolor="#000000">
<tr>
<td width="30%" align="center"><font size="3"><b>Aveti dat o data examenul cu nota</b></font></td>
</tr>
<tr>
<td align="center"><font size="3" color="red"><b><? echo $nota_ta;?></b></font></td>
</tr>
</table>
<? } ?>

80