Aplicatie Web. Examen Grila Online
LUCRARE DE DIPLOMĂ
Aplicație WEB. Examen Grila 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.
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.
Capitolul 1. Noțiuni Generale
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.
. 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, 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ăe sunt in mod frecvent depasite pentru ca sunt bazate pe estimariezastruos al proiectului. Termenele plicate ajuta la producerea unor mai bune rezultate pentru proiect. Contine majori 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 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
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 multiutilizatorin 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 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
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;
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.
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 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.
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
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.
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”.
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
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.
Î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).
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:
serverul nu necesită să fie repornit des
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.
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
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ă.
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.
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 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;
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”
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”
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:
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”
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:
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:
accesarea prin intermediul unui web-browser este acum la îndemâna oricărui student
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:
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
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
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 = "[anonimizat]" – 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,
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 '',
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.
Î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:
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:
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.
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:
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:
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.
Î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.
Administrarea întrebărilor grilă
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.
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 ș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:
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ă:
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.
Î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.
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ă:
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
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:
Modul de notare, calcularea rezultatelor
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:
, dacă această notă este mai mică decât 0 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ă:
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
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>
</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";
$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 = "[anonimizat]";
$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>";
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");
$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;
$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";
}
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";
}
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;
}
}
// 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"];
// 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))
{
?>
<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;
}
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)
{?>
<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;
$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)
{
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'";
$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)
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";
}
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>
<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;
}
// 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)
{
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='';
}
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);
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);
$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");
$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"> </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> ";}
?>
<tr>
<td colspan=2> </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>
<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;
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;
}
$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>
<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>
<? } ?>
Capitolul 6. Bibliografie
***, (2003), http://www.w3schools.com, HTML, CSS, JavaScript courses
Sean Hull, (2004), PHP and ASP.NET Go Head-to-Head (http://otn.oracle.com/pub/articles/hull_asp.html)
Stig Sæther Bakken, Alexander Aulbach, Egon Schmid, (2004), PHP Manual
Jay Greenspan, Brad Bulger, (2001), MySQL/PHP Database Applications, IDG Books Worldwide, Inc.
Tim Convense, Joyce Park, (2000), PHP 4 Bible, Hungry Minds
***, (2004), MySQL Manual
***, (2004), http://www.westciv.com, Complete CSS Guide
Prof. dr. ing. Claudia Botez , curs de Baze de Date
***, Modelarea datelor și proiectarea bazelor de date relaționale.
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Aplicatie Web. Examen Grila Online (ID: 149050)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
