Home - Rasfoiesc.com
Educatie Sanatate Inginerie Business Familie Hobby Legal
Doar rabdarea si perseverenta in invatare aduce rezultate bune.stiinta, numere naturale, teoreme, multimi, calcule, ecuatii, sisteme




Biologie Chimie Didactica Fizica Geografie Informatica
Istorie Literatura Matematica Psihologie

Informatica


Index » educatie » Informatica
» - Aplicatie software pentru gestiunea resurselor umane


- Aplicatie software pentru gestiunea resurselor umane


 

Aplicatie software pentru gestiunea

resurselor umane



Domeniul resurselor umane

1.1 Descriere generala

Resursele umane sunt primele resurse strategice ale unei organizatii (societate comerciala, institutie, asociatie, etc), in noua societate informationala capitalul uman inlocuind capitalul financiar ca resursa strategica[1].

Managementul resurselor umane - MRU - este activitatea de management raspunzatoare de toate deciziile si actiunile care afecteaza relatia dintre o organizatie si membrii ei.

Un management riguros al resurselor umane presupune eficacitate in urmatoarele activitati de management[2]:

  • managementul fluxului de personal - recrutare, selectie, adaptare pe post, inductie si socializare, mentorat, promovare interna, managementul iesirii din organizatie;
  • managementul performantei - evaluarea performantelor, feed-back-uri consistente la atingerea sau nu a obiectivelor personale, de echipa sau organizationale, recompense si beneficii;
  • management organizatoric - definirea posturilor, a organigramei, a zonelor de responsabilitate, formarea echipelor sau a grupurilor de munca si instruirea angajatilor;
  • managementul comunicarii - implicarea angajatilor in activitatile decizionale, dezvoltarea comunicarii ascendente si descendente, pastrarea corectitudinii procedurale si a eticii organizationale;

Managerul departamentului resurse umane este subordonat direct managerului general, care defineste responsabilitatile in mod similar cu celelalte activitati importante din organizatie.

Managerul departamentului de resurse umane asigura indeplinirea responsabilitatilor departamentului condus in ce priveste :

Planificarea si managementul resurselor umane in concordanta cu obiectivele si managementul general al organizatiei;

Recrutarea si angajarea personalului pe principiul competentei;

Elaborarea programelor de calificare si/sau perfectionare profesionala;

Elaborarea unui sistem de salarizare care sa stimuleze obtinerea unor rezultate deosebite;

Elaborarea unui sistem de stimulare nefinanciara a personalului;

Dezvoltarea comunicarii organizationale;

Integrarea rapida a noilor angajati si elaborarea programelor de cariera pentru intregul personal al organizatiei.

1.2 Solutii software aplicabile in domeniu

Solutiile informatice reprezinta o cerinta obligatorie pentru un management eficient al resurselor umane.

Tinand cont de importanta managementului resurselor umane pentru companii, sistemele informatice dedicate este necesar sa dispuna de capacitati pentru exploatarea si integrarea cat mai eficienta a diverselor fluxuri informationale. In acest sens, solutiile de acest tip este necesar sa raspunda tuturor elementelor specifice culturii organizationale din cadrul companiei.

Solutiile informatice de HR trebuie sa dispuna de functii dedicate evaluarii performantelor angajatilor sau gestiunii eficiente a pregatirii profesionale. De asemenea, pentru procesele de recrutare sunt alocate in general resurse importante, sistemele informatice specializate putand contribui substantial la reducerea costurilor aferente acestor procese.

In ultimii ani, piata solutiilor pentru managementul resurselor umane a inregistrat o evolutie importanta. Cresterea in volum a acestui sector IT a fost insotita de diversificarea si cresterea nivelului calitativ al sistemelor informatice pentru managementul resurselor umane. "Metamorfoza" produsa in cazul aplicatiilor de resurse umane a fost desigur o consecinta a cerintelor utilizatorilor unor asemenea solutii si a unei nevoi acute de informatii tot mai amanuntite privind resursele umane din cadrul companiilor.

Una dintre tendintele pietei solutiilor de resurse umane consta in integrarea tot mai profunda a acestora cu sistemele de tip ERP (Enterprise Resource Planning) din cadrul companiilor. Astfel, au fost dezvoltate module specializate care sunt integrate complet in cadrul sistemelor informatice. Integrarea aplicatiilor de acest tip in cadrul sistemelor ERP este mai cu seama o cerinta pentru modulele de salarizare, in acest mod fiind asigurat un nivel ridicat de operativitate in derularea proceselor informationale si financiare.  Astfel, vor putea fi generate in mod automat operatiuni contabile in modulele financiare ale sistemului ERP sau vor putea fi  realizate platile catre salariati.

Bazele de date si depozitele sunt un element omniprezent in cele mai diverse domenii. Fie ca vorbim de solutii din categoria aplicatiilor ERP (Enterprise Resource Planning), fie ca vorbim de alte categorii de aplicatii, elementul fundamental pentru functionarea acestora il constituie sistemul de gestiune a bazelor de date. Un alt lucru important care trebuie oferit de astfel de solutii il constituie posibilitatea de dezvoltare simpla a rapoartelor pe baza informatiilor incluse in bazele de date.

Avand in vedere aceste considerente, tot mai multe companii care au in portofoliu solutii ERP au dezvoltat module specializate pentru analiza datelor si sintetizarea informatiilor de management al resurselor umane. Integrarea unor tehnologii BI(Business Intelligence) avansate cu solutiile de baze de date de referinta existente pe piata a permis companiilor sa implementeze functii pentru procesarea eficienta a datelor acumulate prin solutiile de acest tip.

De asemenea, multe produse ERP disponibile pe piata din Romania dispun de o componenta de raportare extrem de puternica, care asigura adaptarea situatiilor de iesire ale sistemului informatic la necesitatile de business.

Integrarea unor instrumente sintetizatoare pentru modul de derulare a proceselor de business este o alta trasatura pentru aplicatiile de acest tip. Prin intermediul "panourilor de comanda" din aplicatiile ERP, managerii vor putea lua decizii in timp real pentru managerii HR.

Arhitectura client-server constituie o stare de facto pentru majoritatea sistemelor informatice actuale si element de baza pentru sistemele informatice de resurse umane. Indiferent care este domeniul caruia ii este dedicat sistemul informatic (economic, social, stiintific etc.), arhitectura client-server s-a impus ca o conditie sine qua non pentru oferirea unei accesibilitati cat mai mari la resursele informationale oferite de sistemele de gestiune a bazelor de date. Raspandirea Internetului, combinata cu nevoia tot mai acuta de mobilitate si accesibilitate, au determinat generalizarea acestei arhitecturi in cadrul aplicatiilor de resurse umane.

1.3 Aplicatii software existente

Exista o gama variata de solutii software concrete, acestea diferentiindu-se prin gradul de automatizare a procesului de management de resurse umane. Astfel, in timp ce unele aplicatii se axeaza in principal pe un singur aspect din activitatea managerului de resurse umane (aplicatii de salarizare, aplicatii de gestiune a angajatilor), altele vizeaza oferirea unui tool complex, de tip ERP.

Printre aplicatiile de gestiune a resurselor umane, se numara:

JobOutlook este o suita de aplicatii software de asistenta in procesul de recrutare online. Joboutlook centralizeaza si automatizeaza gestiunea CV-urilor si job-urilor si lucreaza cu cele mai importante site-uri de recrutare online din Romania.[4]

Sal este un program de salarii si resurse umane, care indeplineste urmatoarele functii: calculul oricarui element de salariu (taxe angajat, taxe angajator, concedii medicale, concedii de odihna, avansuri, prime, sporuri, retineri, etc.), calculul de salarii in valuta, generarea de rapoarte standard (declaratii de somaj, CAS, sanatate, fise fiscale), analize complexe de costuri salariale.

Clarvision este un sistem multicompanie (poate tine evidenta pentru un numar nelimitat de sucursale, filiale, puncte de lucru si firme), sistem multilingv (permite configurarea limbii in care vor fi afisate toate meniurile in sistem, pe fiecare statie de lucru in parte), suporta lucrul cu mai multe valute, cu conversia automata a valorii dintr-o valuta in alta, conversie automata in unitati de masura alternative, sistem multi-utilizator, permitand adaugarea ulterioara de utilizatori suplimentari[6]

Sincron este un software de recrutare, o solutie dedicata activitatii companiilor de recrutare si plasare a fortei de munca sau departamentelor HR din cadrul companiilor.[7]

1.4 Aplicatia software propusa

Aplicatia propusa ofera posibilitatea utilizarii mai multor baze de date, fara a impune restrictii utilizatorului referitoare la baza de date. Astfel, oferind o interfata care poate interactiona cu orice baza de date, aplicatia permite vizualizarea si modificarea de baza a informatiilor din baza de date fara a fi necesar ca utilizatorul (firma de resurse umane) sa cunoasca informatii despre structura interna a bazei de date, pe care sa le furnizeze pentru a putea obtine informatiile necesare. Tot ce trebuie sa "stie" utilizatorul este numele bazei de date, host-ul acesteia si, desigur, username si parola pentru aceesarea bazei de date.

Aplicatia propusa reprezinta, practic, o interfata generica la o baza de date, care permine cu un minimum de efort din partea utilizatorului lucrul acestuia cu baza de date, fara a fi necesare cunostinte tehnice sau de gestiune a bazelor de date.

Desigur ca aceasta interfata generica poate fi folosita pentru orice baza de date, nefiind necesara restrictionarea la domeniul resurselor umane. Insa, pentru domeniul resurselor umane, acest gen de aplicatie este inovatoare intrucat majoritatea solutiilor software oferite pe piata in acest domeniu sunt dependente de structura si tipul bazei de date, necesitand efortul conjugat al programatorilor cu al angajatilor firmei de resurse umane care cunosc structura bazei de date folosite. Dezavantajul acestei abordari, de creare a unei aplicatii software personalizate, care isi construieste o baza de date proprie pe care o manipuleaza este aceea ca face necesara, pentru firma utilizatoare, inlocuirea bazei de date folosite pana la acel moment cu o noua baza de date, cea creata de aplicatie si pe care o prelucreaza aplicatia. De regula firmele de resurse umane manifesta reticenta in fata cerintei de a-si inlocui baza de date deja folosita, si care este probabil populata, cu o noua baza de date.

Aplicatia propusa inlatura acest neajuns. Serviciile oferite, de vizualizare, editare (adaugare, stergere), filtrare, filtrare avansata, printare, sunt disponibile pentru orice baza de date, nefiind necesara inlocuirea bazei de date folosite de firma respectiva cu una noua.

Descrierea functionalitatii aplicatiei

2.1 Obiectivul aplicatiei

Aplicatia de fata se intituleaza "RU Manager" si isi propune sa fie o aplicatie inovativa de gestionare a unei baze de date aplicat la si particularizat pe domeniul resurselor umane. Oiectivul propus in realizarea acestui program este de a nu impune, pe cit posibil, nici o restrictie utilizatorului in utilizarea ei, fiind pe de o parte intuitiva in utilizare si pe de alta parte foarte flexibila si adaptabila resurselor software mostenite de la utilizator.

Elementul de inovatie adus de aceasta aplicatie il constituie independenta codului si a interfetei de baza de date folosita. Aceasta solutie lasa la latitudinea utilizatorului alegerea de a folosi baza de date interna oferita de aplicatie sau propria baza de date sau, de ce nu, mai multe baze de date in acelasi timp.

Aceasta facilitate permite folosirea istoricului de date stocate de utilizator in propriile baze de date cu propriile lor structuri, fara a-l obliga sa mute o cantitate posibil imensa de date si sa se adapteze la noua baza de date.

Un alt beneficiu al acestei facilitati este posibilitatea utilizatorului de a-si gestiona toate bazele de date pe care le foloseste sau pe care le pastreaza doar pentru istoric cu aceeasi interfata.

Un ultim argument in favoarea acestei facilitati este orientarea utilizatorului spre reinnoirea bazei de date si a structurii acesteia cu una noua mai functionala si mai robusta la orice moment doreste, putind folosi ambele baze de date (cea noua si cea veche) simultan pina ce datele sunt mutate intre cele doua baze de date sau, de ce nu, oprirea introducerilor de date in baza de date veche si pastrarea acesteia pentru istoric impunind folosirea bazei de date noi pentru noile date. Toate aceste decizii sunt mult mai facile cind poti gestiona toate bazele de date cu aceeasi interfata, facind ca toate solutiile de baze de date ale utilizatorului sa aiba acelasi acoperis.

In acest fel, o firma ce se ocupa de gestionarea resurselor umane nu este obligata sa foloseasca sau sa isi recreeze baza de date pentru a se putea folosi de aplicatia de fata.

Dupa cum am enuntat in capitolul anterior, domeniul resurselor umane nu mai este la inceputuri iar firmele ce se ocupa de aceasta gestiune folosesc deja in cea mai mare parte baze de date si in mare parte chiar aplicatii de gestiune a acestora. Independenta de baza de date insa ar aduce acestei aplicatii un avantaj considerabil in persoana adaptabilitatii maxime la contextul fiecarui utilizator.

Din punct de vedere tehnic aplicatia de fata isi propune sa faca un "proof of concept" al ideii prezentate in paragrafele anterioare, astfel ca functionalitatea si mai ales suportul pentru diferite platforme (configuratii software, sisteme de operare, browsere) si diferite baze de date este limitat. Descrierea amanuntita a acestor limitari precum si propuneri de evolutie in sensul inlaturarii acestora se pot regasi in capitolul "Limitari si directii de dezvoltare a aplicatiei"- capitolul 7 al lucrarii de fata.

Aplicatia de fata este testata si functioneaza pe urmatoarele configuratie software si cu urmatoarele restrictii:

a) Baze de date

La acest moment nu exista suport decit pentru baze de date MySQL Community Server 5.0+[8]; acest lucru nu semnifica faptul ca nu se pot folosi si versiuni inferioare de baze de date MySQL sau versiunea comerciala, insa aplicatia nu a fost testata pe alte versiuni.

b) Browsere

Browserele suportate sunt Internet Explorer 6.0+ si Mozilla Firefox 2.0+[9]. Si in acest caz, aceste browsere au fost cele foslosite pentru a testa aplicatia. Acest lucru nu semnifica faptul ca aplicatia nu poate rula pe alte versiuni ale acestor browsere, doar ca aceste versiuni au fost folosite in testare.

Aplicatia este cel mai probabil ca nu functioneaza cu alte tipuri de browsere (Opera, Safari, etc.) datorita incompatibilitatilor la nivelul javascript si HTML DOM, tehnologii vitale pentru continutul dinamic al aplicatiei si implicit pentru functionalitatea acesteia.

c) Servere Web

Pentru functionarea scripturilor server-side si in general a functionalitatii dinamice a aplicatiei (cea mai mare parte) este necesar ca Serverul Web pe care rezida aplicatia respectiv browserul utilizat sa suporte urmatoarele Tehnologii Web:

PHP 5.2+[10]

AJAX (HTTP Requests)[11]

Javascript si HTML DOM

CSS 2.0+

2.2 Functionalitati oferite

Principalele functionalitati oferite de aplicatia de fata in ceea ce tine de necesitatile unui departament sau firme de resurse umane sunt urmatoarele:

a)     Vizualizarea tuturor tabelelor bazei de date

b)     Adaugarea si stergerea de date in/din tabelele bazei de date

c)     Generarea de rapoarte pe baza tabelelor bazei de date

d)     Cautarea de inregistrari in baza de date

Voi detalia fiecare din aceste functionalitati in subcapitolele ce urmeaza.

Vizualizarea bazei de date

In ceea ce tine de vizualizare tabelelor bazei de date, in interfata grafica este posibila afisarea tuturor tabelelor bazei de date prin aceasta atingindu-si scopul de vizualizare a angajatilor, interviurilor, CV-urilor, candidatilor, departamentelor, salariilor precum si a oricaror functionalitati oferite de baza de date folosita (reamintesc faptul ca aplicatia este independenta de baza de date, astfel ca functionalitatea ei este limitata la informatiile oferite de baza de date utilizata).

Vizualizarea tabelelor bazei de date permite si crearea de vizualizari personalizate pornind de la o tabela de baza (care se regaseste in baza de date). Astfel, se pot face expandari ale referintelor externe prezente in tabela de baza de la care s-a pornit, se pot sterge coloane din vizualizarea personalizata si se pot redenumi coloanele acestei vizualizari, toate acestea fara a afecta structura sau consistenta bazei de date.

Adaugarea si stergerea datelor in/din baza de date

Cea de-a doua functionalitate importanta oferita de aplicatia de fata este posibilitatea de adaugare de date in tabelel bazei de date, posibilitatea de a modifica date existente precum si de a sterge inregistrari din baza de date. Acest lucru este posibil pornind de la o tabela de baza (prezenta in baza de date) ce este afisata la fel ca in cazul vizualizarii, cu posibilitatea in acest caz de a edita datele tabelei.

Aceasta modalitate de editare a tabelelor evita folosirea formularelor clasice in scopul de a familiariza utilizatorul cu un singur tip de reprezentare a tabelelor, care este adeseori cel mai intuitiv: reprezentarea sub forma de tabel cu posibilitatea editarii oricarei celule a acestuia.

Rapoarte si listari ale bazei de date

Functionalitatea Print, sau raportare, permite utilizatorului sa afiseze orice tabel, chiar si un tabel expandat, deci obtinut din mai multe tabele ale bazei de date, in mod user friendly, pe o pagina html care nu mai contine si meniul de navigare initial. Altfel spus, aceasta functionalitate permite maximizarea unui view efectuat pe baza de date, urmand ca, pentru a printa, utilizatorul sa foloseasca optiunea Print a browser-ului.

Am optat pentru aceasta modalitate de raportare pentru a reduce efortul necesar din partea utilizatorului pentru obtinerea unui raport. Astfel, in loc sa foloseasca zone diferite din aplicatie pentru editarea bazei de date si pentru raportare, utilizatorul poate sa editeze, sa-si defineasca view-uri, sa sorteze, sa aplice filtre pe tabele, apoi sa obtina din tabelul rezultat un raport, folosind functia Print.

Ajutorul oferit utilizatorului

Aplicatia ofera utilizatorului o scurta prezentarea a functionalitatii sale prin intermediul functiei si ecranului Help, care contin descrierea succinta a celorlalte functionalitati.

Din Help, utilizatorul afla care sunt principalele operatii pe care le poate executa: View Database, Edit Database, Search Database, Print Tables, precum si descrierea comenzilor disponibile pentru fiecare operatie.

2.3 Interfata cu utilizatorul

Interfata cu utilizatorul oferita de aplicatia de fata este o interfata grafica web dinamica si ergonomica. Aceasta este organizata in citeva pagini de baza cu continut dinamic volatil. Toate datele prezentate sunt dependente de baza de date folosita, cea mai mare parte a partilor ce asigura functionalitatea aplicatiei fiind generate in functie de baza de date.

Acest tip foarte dinamic de intefata web ofera utilizatorului intregul avantaj al independentei de platforma sau sistemul fizic folosit oferit de intefetele web (fiind nevoie doar de un browser). Autogenerarea elementelor functionale adaptat la baza de date folosita ii da acestei interfete un aspect de universalitate si flexibilitate maxima.

Elementele principale ce constituie structura de baza a paginilor web (cu exceptia paginii introductive) sunt Meniul Principal, Panel-ul de control, butonul Logout si structura grafica ce da aspectul ergonomic al aplicatiei. Acestea sunt singurele elemente statice din aceasta interfata web.

Fig : Structura de baza a paginilor interfetei web

Din imaginea de ansamblu de mai sus se remarca in prima instanta meniul principal ce ofera acces la categoriile de operatii generice (independente de baza de date) oferite de aplicatia de fata.

Fiecare buton directioneaza catre una din paginile specifice (Pagina Principala, Pagina de vizualizare, Pagina de editare, Pagina de listare, Pagina de cautare si Pagina de ajutor ) ce constituie structura interfetei web a aplicatiei.

Pe parcursul subcapitolelor urmatoare este prezentata functionalitatea oferita de fiecare din aceste pagini.

Home    - Pagina principala

View    - Operatii de vizualizare

a bazei de date

Edit    - Operatii de editare a datelor

din baza de date

Print    - Rapoarte si listari ale

bazei de date

Search    - Operatii de cautare in

baza de date

Help    - Ajutor si explicatii oferite

utilizatorului

 

Fig : Meniul principal al interfetei web

Cel de-al doilea element important al structurii de baza il reprezinta Panel-ul de control prezent pe fiecare pagina ce va afisa controalele specifice generate in mod dinamic in functie de baza de date si specificul paginii.

Panel-ul de control contine controalele specifice principale.

In absenta conexiunii la o baza de date este afisat mesajul "No Tables Available".

 

Fig : Panel-ul de control

Un alt element al structurii de baza il reprezinta meniul din partea de jos a paginii, care are aceeasi functionalitate ca si meniul principal.

Fig : Meniul din partea inferioara a paginilor

Butonul Logout realizeaza deconectarea de la baza de date si incheierea sesiunii curente. Pagina afisata dupa folosirea Logout este pagina introductiva.

Pagina introductiva si gestiunea utlilizatorilor

Interfata dispune in primul rind de o pagina introductiva ce prezinta facilitatile de login precum si un formular pentru definirea conexiunii la una sau mai multe baze de date.

Fig : Pagina introductiva

Meniul de configurare si login este disponibil in urma unui click pe logo-ul produsului.

Fig : Pagina introductiva - meniul de login

Aplicatia de fata nu face gestiunea utilizatorilor. Numele de utilizator si parola cerute trebuie sa fie cel al bazei de date la care urmeaza sa se conecteze aplicatia.

Atunci cand nu a fost inregistrata nicio baza de date, valoarea default a elementului drop-down este "No Database Configured".

Username: user-ul cu drepturi de acces la baza de date

Password: parola pentru user

Database: numele logic al bazei de date

 

Fig : Formularul de Login

Pentru configurarea unei baze de date, se foloseste butonul "New Database", care afiseaza o caseta de dialog, cu campurile: DB Host, DB Type, DB Name.

DB Host: hostname-ul bazei de date

DB Type: tipul bazei de date

DB Name: numele bazei de date

 

Fig : Formularul de definire a bazei de date

Butonul Test din caseta de configurare a unui utilizator verifica daca baza de date configurata, impreuna cu username-ul si parola, functioneaza. Daca da, este afisat un mesaj de confirmare:

Fig : Mesajul de confirmare a conexiunii definite

Daca baza de date nu exista, mesajul afisat este:

Fig : Mesajul afisat pentru o baza de date inexistenta

Butonul Save salveaza baza de date configurata, in fisierul "config.txt" din folder-ul action. Dupa apasarea butonului Save utilizatorului i se solicita printr-o caseta de dialog numele logic al bazei de date.

Fig : Caseta de definire a numelui logic al bazei de date

La urmatoarea folosire a aplicatiei, bazele de date configurate anterior vor fi citite din fisierul "config.txt", iar utilizatorul va putea alege dupa numele logic definit anterior la care baza de date se va loga. Numele logic nu este obligatoriu sa fie identic cu numele fizic al bazei de date, astfel ca utilizatorul isi poate personaliza configuratiile, nefiind nevoit sa retina nume lungi sau nesugestive.

Dupa configurarea bazei de date, se poate trece la logarea la respectiva baza de date.

Fig : Logarea la baza de date

Pagina principala - HOME

Fig : Pagina HOME

Pagina HOME pastreaza elementele statice mentionate anterior: meniul principal, panel-ul de control si structura grafica. Pagina contine un mesaj de intampinare, ofera detalii despre conexiune (baza de date folosita, tipul si host-ul acesteia) si ghideaza utilizatorul succint in folosirea meniului principal.

Fig : Detaliile despre conexiune din HOME page

Din pagina HOME se pot folosi direct toate operatiile, cu exceptia operatiei Print, pentru care este necesara deschiderea unui tabel. Daca utilizatorul apasa Print, va primi un mesaj de ghidare:

Fig : Mesaj de directionare din pagina HOME

Pagina Vizualizari Tabele - VIEW

Fig : Pagina View

Pagina VIEW contine elementele statice comune tuturor paginilor (cu exceptia paginii introductive): Meniul Principal, Panel-ul de control, butonul Logout si structura grafica.

Aici, panel-ul de control contine butoane generate dinamic care reprezinta tabelele bazei de date. Numarul de butoane depinde de structura bazei de date, mai exact de numarul tabelelor acesteia.

Fig : Continutul panel-ului de control din View pentru o baza de date cu 6 tabele

Pentru a-si defini view-uri personalizate, utilizatorul trebuie sa selecteze, initial, un tabel, executand click pe butonul cu numele tabelului. Tabelul se deschide in dreapta, deasupra acestuia aflandu-se, in continuare, detalii despre baza de date folosita.

Fig : Vizualizarea de baza a unui tabel

Asupra tabelului utilizatorul poate opera sortare, prin click pe numele unei coloane. De asemenea este posibila realizarea de join-uri ad-hoc, prin efectuarea unui click pe numele unei coloane, foreign key, tinand in acelasi timp apasata tasra Ctrl. Coloana foreign key va fi stearsa din view-ul astfel obtinut, pe principiul ca expandarea unui tabel folosind foreign key nu necesita pentru utilizator si afisarea valorilor foreign, ci doar afisarea informatiilor la care ofera acces aceste valori, din tabelul referit.

Este posibila expandarea tuturor coloanelor foreign key din tabelul vizualizat, dar doar din tabelul de baza de la care s-a pornit. Astfel, chiar daca prin expandare au devenit vizibile coloane din alte tabele, care la randul lor sunt foreign key-uri, acestea nu pot fi expandate.

Daca utilizatorul incearca sa expandeze o coloana care nu este foreign key in tabelul de baza, va primi un mesaj explicativ:

Fig : Mesaj explicativ, la incercarea de expandare a unei coloane care nu e foreign key

Fiecare coloana are un meniu pop-up, care se deschide prin click pe pictograma-sageata din stanga numelui, si care permite cateva operatii de baza: redenumire, stergere, sortare.

Fig : Meniul pop-up al unei coloane

Selectarea comenzii Remove are ca efect stergerea coloanei din vizualizarea curenta, dar nu si din baza de date. Principiul este ca modificarile de vizualizare sa fie strict pentru vizualizare, si sa nu altereze structura bazei de date. Desigur, ce se urmareste aici in subsidiar este a nu permite utilizatorilor sa stearga coloane din baza de date, lucru ce ar putea afecta grav integritatea acesteia.

Selectarea comenzii Rename deschide o caseta de dialog care solicita utilizatorului noul nume.

Fig : Dialog-box pentru redenumirea unei coloane

Redenumirea opereaza, de asemenea, doar asupra vizualizarii, nu si in baza de date. Este permisa redenumirea coloanelor foreign key insa, in acest caz, utilizatorul nu va mai putea expanda dupa coloana respectiva, din view-ul curent, intrucat se pierde legatura cu tabelul referit.

Din pagina VIEW este posibila si editarea datelor, prin click pe butonul Edit, dar aceasta functionalitate va fi descrisa in continuare.

Pagina Formulare - EDIT

Fig : Pagina EDIT

Difera de pagina VIEW prin faptul ca butoanele de sub tabelul afisat sunt toate active, cu exceptia butonului Edit, care este inactiv pentru a marca faptul ca intreaga pagina curenta este destinata editarii. Este posibila selectarea unei linii prin dublu click intr-o celula a ei.

Fig : Bara de butoane de editare

Adaugarea unei linii se face cu ajutorul butonului Add Row. Revine utilizatorului sarcina de a completa cu informatie utila linia nou introdusa. Pentru a opera modificarile si asupra bazei de date, se foloseste butonul Apply changes.

Butonul Discard changes anuleaza modificarile. Folosirea oricaruia dintre butoanele Apply changes si Discard changes are ca efect schimbarea starii butoanelor de editare. Pentru a reveni in modul de editare, se va folosi butonul Edit.

Fig : Bara de butoane dupa aplicarea sau anularea modificarilor

Stergerea unei linii se face in urmatorii pasi: se selecteaza linia, se apasa butonul Mark for deletion. Linia va fi evidentiata pe fundal rosu. Apasarea butonului Apply changes va opera stergerea liniei, impreuna cu celelalte modificari.

Fig : Stergerea unei linii

In situatia prezentata in fig. 25, daca se va selecta Apply changes, linia 2, marcata cu rosu, va fi stearsa din tabel, linia 4, care este doar selectata, nu si marcata pentru stergere va ramane nemodificata.

Pagina Rapoarte - PRINT

Fig : Pagina PRINT

Pagina PRINT afiseaza tabelul din care a fost apelata, "user-friendly", in browser, fara a mai afisa meniul principal si structura grafica a celorlalte pagini. Practic, operatia Print realizeaza o maximizare a vizualizarii selectate (tabel simplu, tabel expandat). Utilizatorul poate printa folosind meniurile browser-ului.

Revenirea din pagina PRINT in aplicatie se face cu ajutorul butonului BACK.

Pagina Cautare - SEARCH

Cautarea intr-un tabel al bazei de date (tabel simplu sau expandat) este disponibila utilizatorului atat din pagina SEARCH, cat si din paginile VIEW si EDIT, prin intermediul butonului Search, care deschide urmatoarea caseta de dialog:

Fig : Fereastra de cautare

Cautarea se poate face case-sensitive, daca se activeaza optiunea Match case sau dupa intregul cuvant specificat, daca se activeaza optiunea Match whole word. Utilizatorul poate selecta in care coloane sa efectueze cautarea, default cautarea se face in toate coloanele vizualizarii curente. Daca dupa obtinerea unui rezultat se continua cautarea, cu un alt criteriu, acesta este aplicat, implicit, tabelului ramas dupa prima cautare, astfel ca, prin definiri succesive de criterii de cautare se realizeaza o filtrare pe mai multe niveluri. Utilizatorul poate cauta incepand cu criteriul cel mai general, apoi specializand, progresiv, criteriul.

Rezultatul cautarii este evidentiat prin stergerea din vizualizare a liniior care nu satisfac criteriul. De asemenea, fereastra de cautare afiseaza numarul liniilor gasite.

Fig : Un rezultat de cautare

In cazul in care utilizatorul apasa Cancel, se va reveni la tabelul initial, eliminandu-se toate filtrele.

Elemente de gestiunea bazelor de date

3.1 Sisteme de Gestiune a Bazelor de Date

Un sistem de gestiune al bazei de date (SGBD - Data Base Management System) este un produs software care asigura interactiunea cu o baza de date, permitand definirea, consultarea si actualizarea datelor din baza de date.

Datele organizate intr-o baza de date sunt structurate pe mai multe niveluri de abstractizare si de perceptie:

Nivelul fizic (intern) este descris de schema fizica a datelor (bit, octet, adresa).

Nivelul conceptual este descris de schema conceptuala a datelor (articol, inregistrare, zona) si reprezinta viziunea programatorilor de sistem asupra datelor.

Nivelul logic este descris de una din schemele logice posibile ale datelor si reprezinta viziunea programatorului de aplicatie asupra datelor.

Nivelul virtual (extern) reprezinta viziunea utilizatorului final asupra datelor.

Un alt concept legat de gestiunea bazelor de date este independenta datelor, care poate fi:

Independenta fizica: posibilitatea modificarii schemei fizice a datelor fara ca aceasta sa implice modificarea schemei conceptuale, a schemei logice si a programelor de aplicatie. O modificare a structurii fizice nu va afecta aplicatia si reciproc, modificari ale aplicatiei vor lasa nealterata structura fizica de date.

Independenta logica: posibilitatea modificarii schemei conceptuale a datelor fara ca aceasta sa implice modificarea schemei logice si a programelor de aplicatie.

Independenta fata de strategiile de acces: care permite programului sa precizeze data pe care doreste sa o acceseze, dar nu modul cum acceseaza aceasta data. SGBD-ul va stabili drumul optim de acces la date.

Utilizatorii unei baze de date pot fi:

utilizatori nespecialisti (conversationali), care folosesc baza de date doar pentru obtinerea unor rezultate, fara a cunoaste mecanismele interne de functionare a bazei de date;

utilizatori specialisti, care cunosc atat notiuni de utilizare, cat si de programare a unei baze de date;

administratorul bazei de date.

Obiectivele fundamentale ale unui SGBD sunt:

Independenta fizica.

Independenta logica.

Manipularea datelor de catre neinformaticieni.

Administrarea centralizata a datelor.

Neredundanta datelor.

Coerenta datelor.

Partajabilitatea datelor.

Securitatea si confidentialitatea datelor.

Arhitectura unui SGBD este constituita din 3 nivele:

nivelul intern (baza de date fizica structura interna de stocare a datelor fisiere care contin datele, articolele din fisiere, drumurile de acces la articole etc.);

nivelul conceptual (modelul conceptual, schema conceptuala);

nivelul extern (modelul extern, subschema, vizualizarea).

Pentru o baza de date particulara exista o singura schema interna, o singura schema conceptuala, dar pot exista mai multe scheme externe.

3.2 Standarde existente

SQL (Structured Query Language - Limbaj Structurat de Interogare) este un limbaj de programare specific lucrului cu bazele de date, devenit un standard in domeniu (standardizat ANSI-ISO), fiind cel mai popular limbaj utilizat pentru creearea, modificarea, regasirea si manipularea datelor de catre SGBD-urile (Sistemele de Gestiune a Bazelor de Date) relationale.

Atat ANSI, cat si ISO s-au ocupat de stabilirea de norme pentru a consacra SQL-ul ca limbaj standard. Sunt de amintit implementarile ANSI X3.135 (1992), ANSI X3.168 (1989), ANSI/ISO/IEC 9075-3 (1995), SQL2/ISO, SQL/400. (Uneori, aceste emanari de standarde sunt referite prin anul aparitiei.) In activitatea de reglementare a standardelor SQL sunt desigur implicate si marile firme producatoare de IT (IBM, ORACLE, Informix, Microsoft).

3.3 Baze de Date MySQL

MySQL este un sistem de gestiune a bazelor de date relational, produs de compania suedeza MySQL AB si distribuit sub Licenta Publica Generala GNU. Este cel mai popular SGBD open-source la ora actuala, fiind o componenta cheie a stivei LAMP (Linux, Apache, MySQL, PHP) .

Cu MySQL se pot construi aplicatii in orice limbaj major. Exista multe scheme API disponibile pentru MySQL ce permit scrierea aplicatiilor in numeroase limbaje de programare pentru accesarea bazelor de date MySQL, cum are fi: C, C++, C#, Borland Delphi, Java, Perl, PHP, Python, FreeBasic, etc., fiecare dintre acestea folosind un tip spefic API. O interfata de tip ODBC denumita MyODBC permite altor limbaje de programare ce folosesc aceasta interfata, sa interactioneze cu bazele de date MySQL cum ar fi ASP sau Visual Basic.

Pentru a administra bazele de date MySQL se poate folosi modul linie de comanda sau, interfete grafice, cum sunt: MySQL Administrator si MySQL Query Browser. Un alt instrument de management al acestor baze de date este aplicatia phpMyAdmin.

MySQL poate fi rulat pe multe dintre platformele software existente: AIX, FreeBSD, GNU/Linux, Mac OS X, NetBSD, Solaris, SunOS, Windows 9x/NT/2000/XP/Vista.

Elemente de Interfete Web pentru baze de date

4.1 Construirea unei interfete web eficiente si ergonomice

Un aspect important al design-ului unei interfete web il reprezinta ergonomia acesteia, usurinta, eficienta si rapiditatea cu care utilizatorul poate obtine informatiile necesare. De aceea prima etapa in proiectarea unui site trebuie sa ofere o solutie pertinenta intrebarii: Cum va naviga utilizatorul?

De asemenea trebuie stabilit setul de culori pentru background/fonturi/link-uri. E de dorit sa se foloseasca putine culori, iar acestea sa nu agreseze vizitatorul. Logo-ul site-ului este recomandat sa fie o imagine simpla, sugestiva si de dimensiuni cat mai mici. Prezenta unui logo nu ingreuneaza accesarea sitului, deoarece acesta se incarca in memoria cache a browserului la accesarea primei pagini. E preferabila folosirea unui singur logo in toate paginile, pentru familiarizarea utilizatorului cu logo-ul, dar si pentru coerenta mesajului. Numarul de nivele al site-ului nu trebuie sa fie prea mare, pentru a nu plictisi vizitatorul.

Conform unor statistici referitoare la persoanele care utilizeaza des interfete web, surfer-ilor nu le place scroll-ul, adica nu le place sa coboare in josul paginii, de aceea este recomandata folosirea cu precautie a paginilor ample, care necesita derulare. De asemenea, surfer-ilor nu le place sa astepte, iar asteptarea ii face adesea sa paraseasca site-ul, astfel ca o interfata web cu utilizatorul trebuie sa se incarce repede. Viteza de citire de pe monitor este cu 25% mai mica decat viteza de citire de pe hartie, aspect care trebuie avut in vedere la proiectarea unei interfete web interactive, care cere utilizatorului sa completeze formulare sau sa raspunda unor chestionare.

Exista mai multi indicatori care arata gradul de ergonomie al unei interfete web, cum ar fi: prezenta instrumentelor de navigare, adica a legaturilor cu:
pagina anterioara, pagina urmatoare, partea de sus a paginii sau cu
principalele sectiuni ale sitului, punerea la dispozitia utilizatorului a motoarelor de cautare ( search engines ) in interfata sau pe web, timpul de incarcare a unei pagini, care nu trebuie sa fie mai lung de 15 secunde, indiferent de conexiune, gradul de accesibilitate al informatiei utile (informatia utila nu trebuie sa fie la o distanta mai mare de doua click-uri), gradul de vizibilitate al paginii (folosirea redusa a scroll-ului), numarul nivelelor interfetei, dispunerea textului, care nu trebuie aranjat ca un bloc unitar de informatie, ci divizat prin linii orizontale sau imagini (frazele rezumat pot fi prezentate pe un fundal diferit colorat, eventual incadrate), modul de prezentare a informatiei, astfel incat efortul depus de utilizator pentru intelegerea si folosirea informatiei sa fie minim.

4.2 Tehnologii Web de baza

HTML

Unul din primele elemente fundamentale ale WWW ( World Wide Web ) este HTML (Hypertext Markup Language), care descrie formatul primar in care documentele sunt distribuite si vazute pe Web. Multe din trasaturile lui, cum ar fi independenta fata de platforma, structurarea formatarii si legaturile hipertext, fac din el un foarte bun format pentru documentele Internet si Web.

Primele specificatii ale Web-ului au fost HTML, HTTP si URL.
HTML a fost dezvoltat initial de Tim Berners-Lee la CERN in 1989. HTML a fost vazut ca o posibilitate pentru fizicienii care utilizeaza computere diferite de a schimba intre ei informatie utilizand Internetul. Erau prin urmare necesare cateva trasaturi: independenta de platforma, posibilitati hypertext si structurarea documentelor. Independenta de platforma inseamna ca un document poate fi afisat in mod asemanator de computere diferite (deci cu fonturi, grafica si culori diferite), lucru vital pentru o audienta atat de variata.

Hipertext inseamna ca orice cuvant, fraza, imagine sau alt element al documentului vazut de un utilizator (client) poate face referinta la un alt document, ceea ce usureaza mult navigarea intre multiple documente sau chiar in interiorul unui aceluiasi document. Structurarea riguroasa a documentelor permite convertirea acestora dintr-un format in altul precum si interogarea unor baze de date formate din aceste documente.

SGML si HTML

Tim Berners-Lee a utilizat ca model SGML (Standard Generalized Markup Language), un standard international in plina dezvoltare. SGML avea avantajul unei structurari avansate si al independentei de platforma dar proiectarea lui a avut in vedere mai mult structura semantica a documentului decat modul de formatare. Flexibil, SGML putea fi descris ca o specificare pentru descrierea altor formate. Utilizatorii puteau crea noi formate (DTD, Document Type Definitions) care puteau fi intelese de orice produs soft SGML pur si simplu prin citirea mai intai a definitiilor noilor formate.

HTML este pur si simplu un DTD, deci o aplicatie a SGML. In primii ani de evolutie HTML a crescut lent, in principal pentru ca ii lipseau posibilitatile de a descrie publicatii electronice profesionale; limbajul permitea un oarecare control asupra fonturilor dar nu permitea inserarea graficii. In 1933, NCSA a imbogatit limbajul pentru a permite inserarea graficii si au construit primul navigator grafic, Mosaic. Au urmat apoi contributii ad hoc ale diverselor firme care au adus adaugiri limbajului HTML (adaugiri si nu imbogatiri pentru ca unele taguri nu erau in conformitate cu principiile generale ale SGML) astfel incat, prin 1994 limbajul parea scapat de sub control. Urmarea a fost ca la prima conferinta WWW din Geneva (Elvetia) s-a constituit un grup (HTML Working Group) a carui prima misiune a fost formalizarea HTML intr-un DTD al SGML, lucru care s-a concretizat in HTML Level 2 (sau HTML 2.0; Nivelul 1, deci HTML 1.0, a fost proiectat de Tim Berners-Lee). Importanta actiunii acestui grup consta in faptul ca, odata standardizat, limbajul poate fi apoi extins intr-un mod mai controlat la alte nivele.

CSS

O data cu HTML 4.0 organizatia World Wide Web Consortium (W3C) a introdus conceptul de "stil" (engl. STYLE), iar in scurt timp toate browser-ele au adoptat aceasta schimbare majora, dar care a avut un efect foarte bun asupra dezvoltarii ulterioare ale site-urilor. Developerii web si designerii pot modifica foarte usor acum site-urile din punctul de vedere al stilului, folosind fisiere .css .

CSS sau "Cascading Style Sheets" ajuta la afisarea elementelor de HTML in functie de instructiunile pe care browser-erele le gasesc in locurile indicate. Se pot defini in patru locuri diferite stilurile pe care le vor respecta elementele de HTML ale unei pagini si, exact ca in programarea orientata pe obiect, se mostenesc si se pot suprascrie. Primul nivel este cel ar browser-ului, care este stilul implicit. Pe nivelul doi se gaseste stilul declarat intr-un fisier extern, salvat cu extensia .css. Stilul declarat in interiorul paginii, in cadrul elementului <head> este pe nivelul 3. Iar ultimul nivel, cel care este cel mai aproape de elementul HTML de afisat, este cel definit chiar in cadrul elementului in cauza.

Folosirea foilor de stil CSS intr-un document HTML Web are numeroase avantaje , cum ar fi:

  • reduce considerabil efortul depus atunci cand se doreste modificarea aspectului si aranjarii elementelor din paginile web; in loc de parcurgerea fiecarui document in parte si modificari asupra fiecarui element, e suficienta operarea de modificari doar asupra foii de stiluri, care controleaza aceste elemente; modificarile se vor reflecta asupra oricarui segment de text care a fost formatat cu stilul respectiv;
  • ofera control crescut asupra aspectului si plasarii textului in pagina;
  • reduce 'incurcatura' produsa de multitudinea de deschideri si inchideri ale etichetelor html care descriu elementele individuale ale textului;
  • procesul de modificare a diferitelor elemente din pagina se simplifica intrucat modificarea ulterioara a unui stil se reflecta automat in toate zonele in care a fost folosit;
  • pot fi create si aplicate foi css nu doar pentru controlul aspectului fonturilor, ci si a altor elemente de formatare ale paginii.

4.3 Standarde existente

Standarde HTML

Standardul oficial HTML este World Wide Web Consortium (W3C), care este afiliat la Internet Engineering Task Force (IETF). W3C a enuntat cateva versiuni ale specificatiei HTML, printre care si HTML 2.0, HTML 3.0, HTML 3.2, HTML 4.0 HTML 4.01 . In acelasi timp, autorii de browsere, cum ar fi Netscape si Microsoft, au dezvoltat adesea propriile 'extensii' HTML in afara procesului standard si le-au incorporat in browserele lor. In unele cazuri, cum ar fi cazul Netscape, aceste extensii au devenit standarde de facto adoptate de autorii de browsere.

HTML 2.0, elaborat in iunie 1994, este standardul pe care ar trebui sa-l suporte toate browserele curente - inclusiv cele mod text. HTML 2.0 reflecta conceptia originala a HTML ca un limbaj de marcare independent de obiectele existente pentru asezarea lor in pagina, in loc de a specfica exact cum ar trebui sa arate acestea.

Specificatia HTML 3.0, enuntata in 1995, a incercat sa dezvolte HTML 2.0 prin adaugarea unor facilitati precum tabelele si un mai mare control asupra textului din jurul imaginilor. Desi unele din noutatile HTML 3.0 erau deja folosite de autorii de browsere, multe nu erau inca. In unele cazuri, taguri asemanatoare implementate de autorii de browsere au devenit mai raspandite decat tagurile 'oficiale'. Specificatia HTML 3.0 acum a expirat, deci nu mai este un standard oficial.

In mai 1996, W3C a scos pe piata specificatia HTML 3.2, care era proiectata sa reflecte si sa standardizeze practicile acceptate la scara larga. Deci, HTML 3.2 include tagurile HTML 3.0 ce erau adoptate de autorii de browsere ca Netscape si Microsoft plus extensii HTML raspandite. In Bilantul asupra HTML, W3C recomanda ca providerii de informatii sa utilizeze specificatia HTML 3.2.Versiunile curente ale majoritatii browserelor ar trebui sa suporte toate, sau aproape toate aceste taguri.

De asemenea exista extensii Netscape si Microsoft care nu fac parte din specificatia HTML 3.2, ori pentru ca sunt mai putin utilizate, ori au fost omologate dupa aparitia HTML 3.2. Pentru ca navigatorul Netscape a fost printre primele browsere care suporta anumite taguri HTML 3.0, iar Netscape detine in jur de 70% din piata de browsere, multi au crezut eronat ca toate extensiile Netscape (incluzand taguri ca <BLINK> si facilitati ca ferestrele) fac parte din HTML 3.0 sau HTML 3.2.

HTML 4.0 este larg utilizat si au fost deja publicate specificatiile HTML 4.01.

Documentele HTML sunt documente in format ASCII si prin urmare pot fi create cu orice editor de texte. Au fost insa dezvoltate editoare specializate care permit editarea intr-un fel de WYSIWYG desi nu se poate vorbi de WYSIWYG atata vreme cat navigatoarele afiseaza acelasi document oarecum diferit, in functie de platforma pe care ruleaza.

Au fost de asemenea dezvoltate convertoare care permit formatarea HTML a documentelor generate (si formatate) cu alte editoare. Evident conversiile nu pot pastra decat partial formatarile anterioare deoarece limbajul HTML este inca incomplet.

4.4 Limbaje de programare web

JavaScript

JavaScript a fost creat in 1995 de Netscape pentru a aduce un plus de dinamism paginilor web. JavaScript ofera un limbaj simplu de scripting pentru a aduce modificari "Live" (numele initial al limbajului a fost LiveScript) paginilor web html pe partea de client.

In primii ani de viata utilizarea JavaScript era o aventura datorita lipsei unui standard universal, datorita evolutiei rapide in lumea browserelor si mai ales datorita evolutiei pe drumuri divergente a principalilor producatori (Microsoft, Netscape si Opera). Codul scris in JavaScript pentru Internet Explorer, Netscape si Opera nu producea decat rareori acelasi rezultat. Existau deseori diferente mari si intre rezultatele produse de versiuni succesive ale aceluiasi browser. Din aceste motive majoritatea scripturilor trebuiau scrise in mai multe variante similare, ceea ce era deosebit de neplacut pentru developeri. De asemenea a durat mult timp pana au aparut unele medii de dezvoltare si debugging avansate. Astfel a durat destul de mult pana cand tehnologia a ajuns la maturitate si a ajuns destul de avansata pentru a fi folosita pe scara larga. Astazi, o gama larga de aplicatii web (Google Mail, Yahoo Mail) folosesc aceasta tehnologie.

Scripturile Javascript se executa de catre browser si sunt incluse deci in pagina HTML ce se afiseaza pe calculatorul clientului. Scripturile pot fi incluse complet in pagina HTML sau pot fi create in fisiere separate si referite in pagina HTML. In ambele cazuri, marcajul HTML folosit este <script>.

Marcajul <script> poate fi inclus atat in interiorul marcajului <head>, cat si in cadrul marcajului <body>. Diferenta este ca in primul caz scriptul se executa la incarcarea paginii, in timp ce in al doilea caz se executa in momentul intalnirii marcajului. Din acest motiv in sectiunea <head> sunt incluse functiile ce vor fi folosite in restul paginii iar in <body> sunt in general apelurile functiilor.

Un script javascript poate contine definitii de functii, definitii de clase (cu mentiunea ca Javascript nu este un limbaj orientat obiect in adevaratul sens al cuvantului neavand o mare parte din mecanismele unui limbaj orientat obiect), apeluri ale functiilor definite sau ale functiilor oferite de browser.

Sintaxa Javascript este foarte asemanatoare cu sintaxa Java. Cuvintele cheie sunt cu mici exceptii aceleasi. Javascript este un limbaj cu tipare dinamica - verificarea tipului datelor efectuandu-se la rulare. Astfel la declararea unei variabile nu se va specifica tipul acesteia ci doar ca este vorba de o variabila. Se foloseste cuvantul cheie var.

Declararea unei functii se face folosind cuvantul cheie function urmat de numele functiei, de lista de parametri si de un bloc ce contine codul functiei. Ca si in Java, cuvantul cheie return este folosit pentru a intoarce rezultatul functiei.

Metodele de iterare in Javascript sunt aproape identice cu cele din Java. Sintaxa pentru instructiunile for, while si do..while este identica cu cea din Java. In plus fata de Java, Javascript ofera instructiunea foreach ce itereaza pe proprietatile unui obiect spre deosebire de alte limbaje de programare (C#, PHP) unde foreach itereaza pe elementele unei colectii.

Javascript pune la dispozitie si un numar mare de obiecte ce pot fi folosite in marea majoritate a browserelor printre care Array, Math, Date, String.

PHP

Acronimul PHP provine de la 'PHP Hypertext Preprocessor'. PHP reprezinta un popular limbaj 'server-side' prezent in jumatate din serverele Apache existente . PHP a fost creat de catre Rasmus Lerdorf in 1994 pentru a-si monitoriza CV-ul sau online. Rasmus si-a distribuit free 'tool-ul', denumit initial Personal Home Page. PHP a devenit in timp un puternic limbaj de scripting server-side, open-source si multi-platforma.
PHP poate fi incapsulat in HTML si se foloseste in conjunctie cu acesta pentru a realiza aplicatii web cu un continut generat dinamic. Spre deosebire de JavaScript, codul PHP este procesat pe server, clientul primeste doar cod HTML.
PHP este prezent pe Linux, Windows, HP-UX, Solaris, Mac OS X, OpenBSD. Suportul este oferit de servere web care includ: Apache, IIS, PWS, Netscape, iPlanet, Xitami, OmniHTTPd si altele.

PHP poate fi obtinut gratuit, fiind un produs al miscarii open-source. PHP ofera suport pentru acces la aproape 20 de servere de baze de date diferite printre care: MySQL, Oracle, MS-SQL, Sybase, Informix, Adabas D, DB2, dBase, Ingres, PostgreSQL, FilePro. PHP suporta de asemenea ODBC, permitandu-i sa se conecteze la servere de baze de date prin intermediul driver-ului ODBC.

PHP prezinta suport pentru XML, atat prin intermediul SAX, cat si DOM. De asemenea permite crearea 'on-the-fly' de fisiere PDF. Comunicarea cu alte servicii este permisa prin COM, HTTP, IMAP, LDAP, NNTP, POP3, SNMP si altele.

PHP-ul este unul din cele mai folosite limbaje de programare server-side, conform unui studiu efectuat de Netcraft in aprilie 2002, aparand pe 9 din cele 37 milioane de domenii cercetate in studiu. De asemenea, exista un grafic al cresterii folosirii PHP-ului pe site-ul oficial. Popularitatea de care se bucura acest limbaj de programare se datoreaza urmatoarelor caracteristici :

  • Familiaritatea: sintaxa limbajului este foarte usoara combinand sintaxele unora din cele mai populare limbaje Perl sau C;
  • Simplitatea: sintaxa limbajului este destul de libera. Nu este nevoie de includere de biblioteci sau de directive de compilare, codul PHP inclus intr-un document executandu-se intre marcajele speciale;
  • Eficienta: PHP-ul se foloseste de mecanisme de alocare a resurselor, foarte necesare unui mediu multiutilizator, asa cum este web-ul;
  • Securitatea: PHP-ul pune la dispozitia programatorului un set flexibil si eficient de masuri de siguranta;
  • Flexibilitatea: fiind aparut din necesitatea dezvoltarii web-ului, PHP a fost modularizat pentru a tine pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit server web, PHP-ul a fost integrat pentru numeroasele servere web existente: Apache, IIS, Zeus, server, etc.;
  • Gratuitatea: Dezvoltarea PHP-ului sub licenta open-source a determinat adaptarea rapida a PHP-ului la nevoile web-ului, eficientizarea si securizarea codului.

HTML DOM

Javascript este utilizat in special pentru a modifica modul de afisare sau continutul unei pagini web. Javascript trebuie sa poata accesa si modifica structura documentului de afisat. In acest scop este utilizat DOM.

DOM (Document Object Model) reprezinta un API standardizat de W3C pentru a manipula documente HTML sau XML valide. Prin intermediul Javascript se poate accesa dinamic arborele DOM al unei pagini web.

Obiectul radacina al acestui arbore este document. Prin intermediul acestui obiect putem accesa orice alt obiect sau marcaj din document. Metoda write este folosita pentru a scrie un sir de caractere in locatia curenta a documentului. O alta metoda foarte des utilizata a acestui obiect este getElementById(id). Aceasta metoda intoarce nodul (marcajul) care are marcajul id. In cazul in care sunt folosite id-uri in document putem gasi foarte rapid un anumit nod. O data gasit acest nod putem sa-i accesam sau sa-i schimbam proprietatile.

Toate elementele unei pagini web au asociate o lista de evenimente pe care le pot receptiona. Un element oarecare nu poate receptiona toate aceste evenimente. Pentru a vedea ce evenimente pot fi gestionate de un anumit element trebuie consultata referinta in DOM pentru elementul respectiv. Doua exemple de evenimente destul de comune sunt:

onmouseover: se declanseaza atunci cand cursorul mouse-ului intra in zona elementului

onmouseout: se declanseaza cand cursorul mouse-ului paraseste zona elementului.

Fiecarui astfel de tip de eveniment i se poate asocia un cod Javascript.

AJAX

AJAX - Asynchronous Javascript and XML este o tehnica de programare web ce permite efectuarea unor cereri http catre serverul web, prin intermediul carora se poate actualiza o pagina web fara a se efectua reincarcarea sa completa.

Obiectul Javascript care permite efectuarea acestor cereri asincrone se numeste XMLHttpRequest. Desi comportarea acestui obiect este standard in fiecare browser initializarea sa este diferita pentru fiecare browser.

Principalele metode, proprietaŃi si evenimente oferite de XMLHttpRequest sunt:

open - creeaza o conexiune GET sau POST catre un url dat ca parametru

send - efectueaza cererea catre server

onreadystatechange - evenimentul care este declansat de schimbarea valorii proprietatii readystate, proprietate ce poate avea urmatoarele valori (conform standardului):

o      UNSENT = 0

o      OPENED = 1

o      HEADERS_RECEIVED = 2

o      LOADING = 3

o      DONE = 4

Printre avantajele Ajax se numara:

Latimea de banda folosita

Datorita faptului ca genereaza local pagina HTML si downloadeaza doar scriptul JavaScript si datele, paginile web Ajax pot parea ca se incarca relativ repede. De asemenea, multumita functionalitatii 'load on demand' a continutului, unele pagini web incarca stub-uri ale event handler-elor iar apoi ruleaza functiile 'on the fly'. Aceasta tehnica reduce considerabil latimea de banda folosita pentru aplicatii web. In plus, clientul de Ajax imparte workload-ul cu serverul, astfel incat incarcarea acestuia din urma este redusa.

Separarea in data, format, style, si function

Un alt beneficiu de ordin mai putin pragmatic este ca Ajax tinde sa incurajeze programatorii sa separe clar metodele, functiile si format-urile folosite in diferite aspecte ale transferului de informatii pe web. Desi Ajax poate parea ca o amestecatura de multiple limbaje si tehnici, iar programatorii sunt liberi sa le aleaga pe cele pe care le prefera, acestia sunt adeseori impinsi catre a face o distinctie clara intre:

- datele brute sau continutul de transferat, care in mod uzual este imbracat in XML iar uneori obtinut dintr-o baza de date server side.

- formatul sau structura paginii web, care este aproape intotdeauna HTML sau XHTML, care este apoi disponibila spre a fi manipulata dinamic prin DOM.

- elementele de stil, ale paginii, totul, de la fonturi la plasarea imaginilor sunt configurate prin CSS.

- functionalitatea paginii, obtinuta printr-o combinatie de:

o      Javascript pe browserul client (DHTML),

o      HTTP si XMLHttp standard sau comunicatie client la server, Server side scripting si/sau programe in orice limbaj pentru a primi si a raspunde la requesturi corespunzator.

Printre dezavantajele Ajax se numara:

Integrarea in browser

Pagina incarcata dinamic nu apare in history-ul browser-ului, astfel incat butonul Back nu se va comporta dupa asteptari. S-au propus variate solutii la aceasta problema, precum folosirea de IFRAME-uri care sa inregistreze in history schimbarile.

O alta problema este ca update-ul paginii dinamice face dificila folosirea de bookmark-uri. O solutie propusa la aceasta problema este folosirea URL-ului, mai specific a acelei parti ce determina portiunea dinamica, pentru a permite intoarcerea la starea initiala a paginii. Aceasta solutie imbunatateste si comportamentul butonului Back.

Timpi de raspuns

Intervalul de timp dintre request si response trebuie avut in vedere cand se foloseste Ajax. Se poate intampla ca vizitatorii paginii sa observe o intarziere in incarcarea interfetei aplicatiei web, intarziere la care nu s-ar astepta si pe care nu ar intelege-o. In plus, cand o intreaga pagina este incarcata exista un glitch in afisare cand se schimba continutul. Folosirea de tool-uri care sa informeze utilizatorul ca se desfasoara activitati in background este deseori folosita ca solutie la astfel de probleme de latenta.

Motoarele de cautare

Site-urile care folosesc Ajax trebuie sa puna la dispozitie motoarelor de cautare un Sitemap la o locatie publica pe care motorul o poate citi, intrucat motoarele de cautare de obicei nu executa codul javascript din pagina.

Necesitatea folosirii JavaScript

Ajax depinde de JavaScript pentru functionare, iar JavaScript este deseori implementat in moduri diferite pe diferite browsere. Din aceasta cauza site-urile care folosesc JavaScript trebuie testate in mai multe browsere pentru a verifica sa nu apara probleme de compatibilitate. Sunt multe cazuri in care codul JavaScript trebuie scris de doua ori, o versiune pentru IE, de exemplu, si alta pentru Mozilla. Astfel de cazuri insa sunt mai rare odata cu aparitia de librarii de abstractizare a JavaScript precum Prototype JavaScript Framework sau Jquery. Aceste librarii abstractizeaza limbajul rezolvand transparent problemele de compatibilitate intre diferite browsere.

Java Servlets

Atunci cand un browser trimite o cerere catre un server, raspunsul pe care il primeste poate fi unul static (o simpla pagina web care este stocata pe serverul de web) sau unul dinamic, generat eventual in urma consultarii unei baze de date.

Pentru trimiterea unui raspuns dinamic catre client se pot folosi servletii.

Servletii reprezinta clase JAVA, al caror cod sursa este scris de programator, dupa care, prin compilare, se va obtine fisierul avand extensia .class, ce va fi copiat in anumite directoare specifice fiecarui server de Web in parte. Un servlet poate fi invocat prin intermediul unui URL, caz in care se va executa o metoda a acestei clase si va avea ca efect construirea raspunsului si transmiterea acestuia catre client intr-un anumit format.

Pasii realizarii unui servlet sunt urmatorii:

Se vor importa, obligatoriu, pachetele java.io.*; javax.servlet.* si javax.servlet.http.*. Utimele doua pachete se afla in servlet.jar ce este distribuit odata cu Tomcat-ul si nu cu JDK-ul.

Se va scrie o clasa ce va extinde obligatoriu clasa HttpServlet.

Se va suprascrie urmatoarea metoda a acestei clase:

void doGet (HttpServletRequest, HttpServletResponse) throws IOException, ServletException.

In cadrul acestei metode, se va apela urmatoarea metoda a clasei HttpServletResponse: PrintWriter getWriter(), in scopul de a obtine obiectul prin care se va transmite iesirea catre client. Dupa aceasta se va trimite iesirea cu ajutorul metodei println a clasei PrintWriter.

Un lucru important este ca ciclul de viata al unui servlet este de la prima invocare de catre oricare din clienti pana la oprirea serverului de Web, in sensul ca aceste clase ce extind HttpServlet se instantiaza doar o singura data dupa care la invocarea de metode cum ar fi doGet se executa in fire de executie (thread-uri) diferite. Exceptie face cazul in care servlet-ul implementeaza interfata SingleThreadModel. In acest din urma caz orice cerere trebuie sa astepte ca tratarea celorlaltor cereri anterioare sa se fi terminat, lucru ce degradeaza drastic performantele aplicatiei. Din acest motiv utilizarea SingleThreadModel nu este recomandata, mai ales ca implementarea sa nici macar nu garanteaza eliminarea tuturor problemelor generate de lucrul cu mai multe thread-uri. Se recomanda alternativa implementarii unui cod cat mai thread-safe care nu foloseste interfata SingleThreadModel.

CGI Script

CGI, prescurtare de la Common Gateway Interface, este un protocol standard de comunicare intre documentele Web si aplicatiile localizate pe serverul Web.

Scripturile CGI sunt programe care respecta acest protocol[17]. Un script CGI este, deci, un program care comunica intr-un anumit mod cu o pagina web. Existenta acestui protocol de comunicare intre programele de pe server si documentele Web permite crearea unor pagini interactive si dinamice, lucru care nu poate fi facut folosind doar HTML.

Atunci cand browserul solicita un script CGI aflat pe server, serverul lanseaza in executie scriptul si ii transmite acestuia headerele HTTP de cerere primite de la browser. Dupa ce executia scriptului se incheie, rezultatele sunt transmise serverului, care formateaza headerele de raspuns si le transmite browserului pentru ca acesta sa afiseze rezultatele. O alta posibilitate este ca scriptul sa contina instructiuni prin care headerele de raspuns sunt configurate chiar de script si transmise de acesta direct browserului.

Indiferent daca solicita un document Web sau un script, browserul trebuie sa cunoasca locatia serverului Web si numele fisierului solicitat. Aceasta informatie ii este transmisa browserului prin intermediul atributului action al etichetei <FORM> care primeste drept valoare adresa URL a scriptului stocat pe server. De obicei, scripturile CGI sunt stocate pe server intr-un director special destinat lor, care se numeste cgi-bin.

Datele sunt colectate prin intermediul formularelor si transmise de catre browser la serverul pe care este instalat scriptul CGI prin intermediul headerelor HTTP de cerere.

Cele mai importante headere HTTP de cerere sunt Get si Post. Prin intermediul atributului method al etichetei <FORM> este specificat ce tip de header HTTP de cerere este utilizat pentru a transfera datele la server. Daca metoda folosita este Get, datele sunt transmise prin intermediul adresei URL. Daca este folosita metoda Post datele sunt transmise sub forma unui fisier separat.

Este recomandata folosirea metodei Post atunci cand volumul de date transmise este mare (depaseste 1024 de octeti, lungimea maxima a unui URL). Dupa ce metoda de transmitere este stabilita, browserul creeaza un header HTTP de cerere prin care este identificata localizarea scriptului pe server si apoi transmite headerul la server. Serverul receptioneaza headerul de cerere si apeleaza scriptul CGI.

Odata datele ajunse la server, scriptul este lansat in executie iar datele ii sunt transmise acestuia prin intermediul unui tip special de variabile numite variabile de mediu (daca folositi metoda Get) sau prin intermediul fisierului standard de intrare (daca folositi metoda Post).

Scriptul CGI executa sarcinile pentru care a fost conceput si obtine anumite rezultate care urmeaza a fi transmise browserului prin intermediul unor headere HTTP de raspuns. De obicei, scriptul configureaza un singur header de raspuns, si anume Content-Type. Acest header comunica browserului tipul de date care ii vor fi returnate: documente HTML, imagini sau alt tip de fisiere. Serverul adauga si el headere HTTP de raspuns suplimentare, apoi strange toate rezultatele si headerele de raspuns intr-un pachet care este transmis browserului. Browserul il receptioneaza si afiseaza informatiile primite in modul descris de headerele de raspuns.

Dupa lansarea in executie, scriptul CGI executa sarcinile pentru care a fost construit. Sarcinile pe care le poate realiza un script sunt diverse si numeroase. Iata cateva exemple:  

manipularea informatiilor introduse prin intermediul formularelor

manipularea hartilor de imagini

generarea contoarelor care monitorizeaza numarul de accesari ale paginii (hit counters)

construirea de motoare de cautare

administrarea licitatiilor on-line

crearea de aplicatii interactive cum ar fi forumurile sau camerele de chat

crearea si manipularea bazelor de date

Structura unui script CGI contine urmatoarele sectiuni: citirea datelor introduse prin intermediul formularului, prelucrarea datelor si efectuarea sarcinilor impuse de programator, afisarea rezultatelor.

In general, raspunsurile pe care scriptul le transmite serverului se impart in doua categorii:

Sarcina a fost indeplinita cu succes

Sarcina nu a fost indeplinita, au aparut erori.

Daca executia scriptului este s-a desfasurat cu succes iar sarcinile sale au fost indeplinite, acesta transmite serverului un raspuns in consecinta. Daca, din diverse motive, au aparut erori la executia scriptului iar acesta nu si-a dus sarcinile la bun sfarsit, serverului ii este prezentat un mesaj de eroare, care trebuie sa contina informatii despre natura erorii aparute.

Tehnologii folosite

In conceperea aplicatiei de fata a fost necesara utilizarea unei game relativ vaste de tehnologii web cu diverse aplicabilitati si utilizari in cadrul acestui proiect. Pe parcursul acestui capitol voi elabora impactul, necesitatea si scopurile folosirii pentru fiecare tehnologie web ce si-a adus aportul in acest proiect.

Se vor prezenta si secvente de cod, API-uri, seturi de comenzi si scenarii de utilizare, precum si apresieri generale la adresa acestor tehnologii web in contextul proiectului.

5.1 Baze de Date MySQL

Rolul in proiect

Aplicatia ce face obiectul lucrarii de fata isi propune, asa cum am mentionat in capitolele introductive, sa fie prin excelenta o interfata de gestionare a bazelor de date. In cadrul acestui proiect, baza de date ce a fost utilizata si pe care aplicatia a fost si testata este MySQL Community Server 5.0

Este lesne de inteles rolul de sursa de informatie si actor in relatia cu utilizatorul pe care motorul MySQL il are in cadrul acestui proiect.

In contextul suportului ce poate fi gasit in tehnologiile web pentru acest tip de baza de date, acest suport este variat si in marea majoritate open-source. In cadrul acestui proiect layer-ul de interfatare intre codul web si serverul de baze de date a fost ales ca modulul MySQLi (MySQL improved) pus la dispozitie de PHP. Acest modul pune la dispozitia unui programator in PHP un API complet de metode de lucru atit de administrare cit si de interogare a acestui tip de baze de date.

In continuare voi incerca, impreuna cu o clasificare a functiilor din aceasta librarie, si o descriere a utilitatii lor in cadrul librariei precum si a utilizarii in cadrul proiectului.

De asemenea se vor mai pune in evidenta expresiiile SQL standard sau particulare MySQL ce s-au utilizat in cadrul acestui proiect.

Libraria MySQLi

Modalitatea de interfatare cu apicatia web a bazelor de date MySQL este facuta in acest proiect pe baza librariei PHP de extensie numita mysqli (mysql improved).

Aceasta se doreste a fi o evolutie a librariei initiale (mysql) ce ofera ca si distinctie principala de predecesorul sau, accesul la aceeasi functionalitate folosind o abordare orientata pe obiect.

MySQLi, desi pastreaza si metodele procedurale care erau folosite de predecesorul sau, nu pastreaza si backward compatibility cu acesta, numele functiilor procedurale, de altfel cu aceeasi functionalitate, avind nume diferite.

Tot dialogul intre baza de date si aplicatia web RU manager se face prin intermediul scripturilor PHP avind ca element de interfatare extensia MySQLi.

Pentru detalii despre implementarea acestei librarii, functii disponibile studiati capitolul "Detalii de implementare".

Registru de comenzi SQL specifice MySQL

MySQL poate fi numit, pe buna dreptate, un server de baze de date ce foloseste ca limbaj SQL standard. Pe linga suportarea standardului insa, acest server de baze de date suporta si extensii specifice de limbaj SQL. Niiunee din acestea nu afecteaza standardul ci doar ofera unelte suplimentare utilizatorului. In multe cazuri pe parcursul dezvoltarii bazate pe MySQL acestea se dovedesc extrem de utile adaugind la intuitivitatea limbajului SQL utilizat.

Aplicatia software de fata incearca sa profite la maxim de aceste specficitati de limbaj ce permit scrierea de cod de complexitate redusa pentru implementarea diferitelor functionalitati precum generarea Panel-ului de control bazat pe o listare a tabelelor bazei de date.

Acestea sunt citeva din comenzile SQL specifice bazelor de date MySQL si sunt folosite in marea majoritate si in codul aplicatiei de fata:

A)   Instructiunea SHOW

Aceasta instructiune are o sintaxa complexa ce permite utilizatorului sa o utilizeze pentru o gama variata de scopuri. Printre aceste scopuri posibile regasim obtinerea de informatii despre bazele de date, tabele, coloane, precum si informatii despre starea serverului. Specificatia de sitaxa este urmatoarea:

SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern

SHOW CREATE DATABASE db_name

SHOW CREATE FUNCTION funcname

SHOW CREATE PROCEDURE procname

SHOW CREATE TABLE tbl_name

SHOW DATABASES [LIKE 'pattern

SHOW ENGINE engine_name

SHOW [STORAGE] ENGINES

SHOW ERRORS [LIMIT [offset row_count

SHOW FUNCTION CODE sp_name

SHOW FUNCTION STATUS [LIKE 'pattern

SHOW GRANTS FOR user

SHOW INDEX FROM tbl_name [FROM db_name

SHOW INNODB STATUS

SHOW PROCEDURE CODE sp_name

SHOW PROCEDURE STATUS [LIKE 'pattern

SHOW [BDB] LOGS

SHOW MUTEX STATUS

SHOW PRIVILEGES

SHOW [FULL] PROCESSLIST

SHOW PROFILE [types] [FOR QUERY n] [OFFSET n] [LIMIT n

SHOW PROFILES

SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern

SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern

SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern

SHOW TRIGGERS

SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern

SHOW WARNINGS [LIMIT [offset row_count

B)    Instructiunea DESCRIBE

tbl_name [col_name | wild]

DESCRIBE ofera informatii despre coloanele unui tabel, avind o functionalitate similara cu cea a instructiunii SHOW COLUMNS. Incepind cu MySQL 5.0.1, aceasta instructiune ofera informatii si despre view-uri.

mysql> DESCRIBE city;

| Field | Type | Null | Key | Default | Extra |

| Id | int(11) | NO | PRI | NULL | auto_increment |
| Name | char(35) | NO | | | |
| Country | char(3) | NO | UNI | | |
| District | char(20) | YES | MUL | | |
| Population | int(11) | NO | | 0 | |

5 rows in set (0.00 sec)

C)    Instructiunea EXPLAIN

EXPLAIN tbl_name

sau:

EXPLAIN [EXTENDED] SELECT select_options

Instructiunea EXPLAIN poate fi folosita fie ca sinonim al instructiunii DESCRIBE, fie ca o metoda d a obtine informatii despre cum executa serverul MySQL o instructiune SELECT:

  • EXPLAIN tbl_name este sinonima cu DESCRIBE tbl_name si SHOW COLUMNS FROM tbl_name.
  • Cind o instructiune SELECT este precedata de EXPLAIN, MySQL afiseaza informatii despre planul de executie al interogarii. Astfel, MySQL explica exact cum va procesa instructiunea SELECT, inclusiv informatii despre joinurile existente intre tabele si in ce ordine vor fi realizate acestea.

D)   Instructiunea HELP


HELP 'search_string'

Instructiunea HELP ofera informatii inline din manualul de referinta MySQL. Pentru o functionare corecta trebuie verificat faptul ca tabelele de Help de pe serverul MySQL din baza de date mysql sunt populate cu infomatiile de indexare a capitolelor si topicurilor de documentatie.

Cu ajutorul HELP se cauta in tabelele mentionate in paragraful anterior informatia ceruta oferindu-se inline raspunsuri pe topicuri legate de mysql. Cautarea nu este case-sensitive.

Instructiunea HELP intelege mai multe tipuri de stringuri de cautare:

La nivelul cel mai general, se poate folosi contents pentru a obtine o lista a topicurilor generale:

HELP 'contents'

Pentru a obtine o lista de topicuri dintr-o anumita categorie, de exemplu Data Types, trebuie specificat numele categoriei:

HELP 'data types'

Exemplu: HELP 'replace' da urmatorul rezultat:

name: REPLACE

description: Syntax:

REPLACE(str,from_str,to_str)

Returns the string str with all occurrences of the string from_str replaced by the string to_str. REPLACE() performs a case-sensitive match when searching for from_str.

example: mysql> SELECT REPLACE('www.mysql.com', 'w', 'Ww');

-> 'WwWwWw.mysql.com'

Alte instructiuni si subiecte ce prezinta interes dintre particularitatile MySQL sunt urmatoarele:

Tabelele INFORMATION_SCHEMA

Instructiunea REPLACE

Instructiunea TRUNCATE

5.2 PHP

Limbajul PHP este folosit extensiv in aplicatia de fata pentru lucrul cu baza de date. Toata interfatarea cu baza de date se face prin intermediul unor programe PHP.

De asemenea PHP este folosit si pentru mecanismul de login al aplicatiei si pentru suportul variabilelor superglobale ce ofera un environment de variabile de interes general in cadrul diverselor scripturi.

5.3 Javascript si HTML DOM

Javascript este folosit pentru suportul HTML DOM in schimbarea dinamica a continutului paginilor aplicatiei Web.

Continutul si aspectul dinamic al aplicatiei RU manager este dat de un set de functii javascript ce genereaza astfel, in mod dinamic, interfata utilizatorului.

Aceasta tehnologie este folosita si ca interfata la scripturile PHP prin intermediul AJAX.

5.4 CSS

In mare parte, aspectul grafic al aplicatiei este dat de stiluri setate prin CSS. Fisierul mo06f.css contine o varietate de setari pentru elemente de baza HTML atit in mod direct cit si prin definirea de clase de stil.

5.5 AJAX

Aceasta tehnologie este liantul intre interfata grafica si interfata cu baza de date. Din functiile javascript, prin intermediul AJAX se transmit cereri HTTP asincrone la server, acesta din urma executind scripturi PHP pentru extragerea sau depunerea de informatii in / din baza de date.

Detalii de implementare

Baza de date MySQL gestionabila prin RU Manager

Intrucat scopul aplicatiei este independenta de baza de date folosita, teoretic, aplicatia se poate folosi cu orice model de baza de date. In scopul exemplificarii functionalitatii, in lucrarea de fata am folosit o baza de date cu urmatoarea structura:

Interfatarea cu baze de date MySQL folosind libraria MYSQLi

Aceasta librarie pune la dispozitie un API orientat pe obiecte, anume o ierarhie de clase ce ofera metodele necesare, precum si un API de metode procedurale clasice.

Prezint in continuare mnemonica principalelor metode procedurale disponibile prin libraria MySQLi:

mysqli_affected_rows - numarul de rinduri afectate de ultima operatie

mysqli_autocommit - seteaza optiunea de autocommit a tranzactiilor

mysqli_bind_param - Alias pentru mysqli_stmt_bind_param()

mysqli_bind_result - Alias pentru mysqli_stmt_bind_result()

mysqli_change_user - schimba utilizatorul curent

mysqli_close - inchide o conexiune la baza de date deschisa cu mysqli_connect

mysqli_commit - comiteaza tranzactia curenta

mysqli_connect_errno - codul de eroare in urma ultimei incercari de conectare

mysqli_connect_error - mesajul de eroare in urma ultimei incercari de conectare

mysqli_connect - functia de conectare la baza de date

mysqli_errno - codul de eroare in urma ultimei operatii

mysqli_error - mesajul de eroare in urma ultimei operatii

mysqli_execute - Alias pentru mysqli_stmt_execute()

mysqli_fetch_array - intoarce rezultatul unei interogari sub forma unei matrici cu index numeric, asociativ sau mixt

mysqli_fetch_assoc - intoarce rezultatul unei interogari sub forma unei matrici cu index asociativ

mysqli_fetch_field - intoarce urmatorul cimp din rezultat

mysqli_fetch_fields - intoarce o matrice de obiecte reprezentind cimpurile din rezultat

mysqli_fetch_lengths - intoarce o matrice cu dimensiunile cooanelor rezultatului

mysqli_fetch_object - intoarce rindul curent din rezultat sub forma unui obiect

mysqli_fetch_row - intoarce un rind din rezultat sub forma unei matrici

mysqli_fetch - Alias pentru mysqli_stmt_fetch()

mysqli_field_count - numarul de coloane din rezultat

mysqli_field_seek - muta pointerul rezultat la offsetul dorit in cimpurile rezultatului

mysqli_field_tell - intoarce offsetul curent al pointerul rezultat in cimpurile rezultatului

mysqli_free_result - elibereaza memoria alocata pentru rezultat

mysqli_get_client_info - intoarce versiunea de client MySQL sub forma de string

mysqli_get_client_version - intoarce informatii despre clientul MySQL

mysqli_get_host_info - tipul conexiunii subforma de string

mysqli_get_proto_info - versiunea protocolului MySQL folosit

mysqli_get_server_info - versiunea serverului MySQL folosit sub forma de string

mysqli_get_server_version - versiunea serverului MySQL folosit sub forma de numar intreg

mysqli_get_warnings --- warning-urile obtinute in urma ultimei operatii

mysqli_info - informatii despre ultima interogare

mysqli_init - initializeaza MySQLi si intoarce o resursa de folosit ulterior pentru apel la metoda mysqli_real_connect()

mysqli_insert_id - valoarea id-ului autogenerat in ultima interogare

mysqli_kill - se face cerere la server pentru a trimite semnal de kill la un thread mysql

mysqli_more_results - verifica daca mai sunt rezultate disponibile in urma unei interogari multiple

mysqli_multi_query - executa o interogare multipla

mysqli_next_result - intoarce urmatorul rezultat al interogarii multiple

mysqli_num_fields - numarul de cimpuri dintr-un rezultat

mysqli_num_rows - numarul de rinduri dintr-un rezultat

mysqli_options - setare optiuni

mysqli_param_count - Alias pentru mysqli_stmt_param_count()

mysqli_ping - face ping pe o conexiune si incearca sa se reconecteze daca a picat conexiunea

mysqli_prepare - pregateste un statement pentru executie

mysqli_query - interogare pe baza de date

mysqli_real_connect - deschide o conexiune cu un server MySQL

mysqli_real_query - executa o interogare SQL

mysqli_rollback - rollbaxk pe tranzactia curenta

mysqli_select_db - alege baza de date default

mysqli_set_opt - Alias pentru mysqli_options()

mysqli_sqlstate - eroarea SQLSTATE in urma ultimei operatii

mysqli_ssl_set - pentru stabilirea de conexiuni securizate folosind SSL

mysqli_stat - intoarce informatii despre starea sistemului

mysqli_stmt_affected_rows - numarul de rinduri modificate, sterse sau adaugate de executia ultimului statement

mysqli_stmt_bind_param - Binds asigneaza variabile statement-ului curent ca si parametri

mysqli_stmt_bind_result asigneaza variabile statement-ului curent ca si variabile de iesire

mysqli_stmt_close - inchide un statement pregatit

mysqli_stmt_data_seek - muta pointerul la locul dorit in rezultat

mysqli_stmt_errno - codul de eroare in urma executiei ultimului statement

mysqli_stmt_error - mesajul de eroare in urma executiei ultimului statement

mysqli_stmt_execute - executa o interogare pregatita (statement)

mysqli_stmt_fetch - intoarce rezultatul in variabilele de iesire asignate

mysqli_stmt_field_count - numarul de cimpuri din statement

mysqli_stmt_free_result - elibereaza memoria entru statement

mysqli_stmt_get_warnings --- warning-urile generate in urma executiei unui statement

mysqli_stmt_init - initializeaza un statement si intoarce un obiect cu scopul folosirii acestuia in apelul ulterior al metodei mysqli_stmt_prepare

mysqli_stmt_insert_id - intoarce id-ul generat in urma ultimei operatii INSERT

mysqli_stmt_num_rows - numarul de rinduri din rezultatul unui statement

mysqli_stmt_param_count - numarul de paramtri aiunui statement

mysqli_stmt_prepare - pregateste un statement SQL pentru executie

mysqli_stmt_reset - reseteaza un statemnt pregatit

mysqli_stmt_sqlstate - eroarea SQLSTATE in urma operarii ultimului statement

mysqli_stmt_store_result - transfera rezultatul statement-ului

mysqli_store_result - transfera rezultatul ultimei interogari

mysqli_thread_id - id-ul thread-ului conexiunii curente

mysqli_use_result - initiaza intoarcerea rezultatului

mysqli_warning_count - numarul de warningurigenerate de ultima interogare pe conexiunea data

Folosirea functiilor procedurale de baza ale librariei este ilustrata de urmatorul cod PHP:

<?php

/* Conectarea la un server MySQL */ $conexiune mysqli_connect   'localhost' /* Host-ul pe care este baza de date */ 'user' /* Username-ul pentru baza de date */ 'password' /* Passwordul corespunzator */ 'world' /* baza de date ce va fi default */ if (!$link

/* Operarea unei interogari pe baza de date */ if ($result mysqli_query $conexiune 'SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5'

/* Eliberarea memoriei ocupate de rezultatul interogarii */ mysqli_free_result $rezultat

/* Inchiderea conexiunii */ mysqli_close $conexiune ?>

Codul urmator arata cum se pot face aceleasi operatii de baza in varianta pe obiecte a librariei.

<?php /* Conectarea la un server MySQL */ $mysqli = new mysqli 'localhost' 'user' 'password' 'world'

if (
mysqli_connect_errno

/* Operarea unei interogari pe baza de date */ if ($rezultat $mysqli->query 'SELECT Name, Population FROM City ORDER BY Population DESC LIMIT 5'

/* Eliberarea memoriei ocupate de rezultatul interogarii */ $result->close

/* Inchiderea conexiunii */ $mysqli->close ?>

Continut dinamic in pagini HTML

Bara de butoane generabila dinamic folosind CSS

CSS in mo06f.css

/* =-=-=-=-=-=-=-[Menu Eight]-=-=-=-=-=-=-=- */

#menu8 ul

#menu8

#menu8 li a '';

voice-family: inherit;

height: 24px;

}

#menu8 li a:link, #menu8 li a:visited

#menu8 li a:hover

#menu8 li a:active

HTML generat folosind interogari pe baza de date in SHOW_TABLES.PHP

$con = mysqli_connect($host, $usr, $pass);

if (!$con)


mysqli_select_db($con, $dbname);

$sql=
'SHOW TABLES'

$result = mysqli_query($con, $sql);

echo
<div id='menu8'><ul> while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))

}

echo
</ul></div>

mysqli_free_result($result);
mysqli_close($con);

Meniu drop-down generabil dinamic folosind Javascript

JAVASCRIPT in ACTION.JS

/*------------ dropdown MENU action ----- ----- -----*/
var timer
null;

function showMenu
x y menuId
contents document getElementById 'contents'
var Container document createElement 'div' contents appendChild Container Container id menuId;
Container
className 'dropDownMenu';
Container
style left x 'px';
Container
style top y 'px';
Container
addEventListener 'mouseout' mouseOutMenu false Container addEventListener 'mouseover' mouseOverMenu false
var Menu document createElement 'ul' Container appendChild Menu
var removeBtn document createElement 'li' removeBtn innerHTML '<a href='#1' onclick='removeColumn('' menuId substr '')'>Remove</a>';

var renameBtn
document createElement 'li' renameBtn innerHTML '<a href='#1' onclick='renameColumn('' menuId substr '')'>Rename</a>';;

var sortBtn
document createElement 'li' sortBtn innerHTML '<a href='#1' onclick='sortTable('' menuId substr '')'>Sort</a>';;

Menu
appendChild removeBtn Menu appendChild renameBtn Menu appendChild sortBtn ;
}

function mouseOverMenu



function mouseOutMenu


timer
setTimeout 'document.getElementById('' this id '').style.visibility = 'hidden''

CSS in mo06f.css

/*- Menu 3----- ----- ----- ----- ------- */ dropDownMenu dropDownMenu ul dropDownMenu li a

.dropDownMenu li a link dropDownMenu li a visited dropDownMenu li a hover /*--- End ---*/

HTML generat in LOAD_TABLE.PHP

$dropdown <img valign center width height id dropdown_ k src images dropdown_btn gif onmouseover this src images dropdown_btn_ gif onmouseout this src images dropdown_btn gif onclick showMenu event clientX event clientY menu_ k >

Obtinerea unei tabele din baza de date folosind AJAX

JAVASCRIPT in ACTION.JS

function loadTable tableName


currentTable
tableName

var url
'action/load_table.php'
url
url '?q=' tableName
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertTable
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertTable

PHP in LOAD_TABLE.PHP

$con = mysqli_connect($host, $usr, $pass);
if (!$con)


mysqli_select_db($con, $dbname);

$sql=
'SELECT * FROM '.$q;

$result = mysqli_query($con, $sql);


echo
'<table id q border cellpadding align center >'

$header_printed =
FALSE while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))

echo
'</tr>'
$header_printed =
TRUE
}

echo
'<tr>' foreach($row as $k => $v)

echo
'</tr>'
}
echo
'</table>'

mysqli_free_result($result);
mysqli_close($con);

Obtinerea tabelelor unei baze de date folosind AJAX

JAVASCRIPT in ACTION.JS

var xmlHttp
var currentTable

function GetXmlHttpObject


catch
e

catch
e

}
return xmlHttp;
}

function showTables



var url
'action/show_tables.php'
url
url '?q='
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertTableButtons
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertTableButtons

PHP in SHOW_TABLES.PHP

$con = mysqli_connect($host, $usr, $pass);

if (!$con)


mysqli_select_db($con, $dbname);

$sql=
'SHOW TABLES'

$result = mysqli_query($con, $sql);

echo
<div id='menu8'><ul> while($row = mysqli_fetch_array($result, MYSQLI_ASSOC))

}

echo
</ul></div>

mysqli_free_result($result);
mysqli_close($con);

Obtinerea tabelei si a coloanei referite de o cheie externa folosind PHP

EXPAND_TABLE_REFERENCE.PHP

$con = mysqli_connect($host, $usr, $pass);
if (!$con)


mysqli_select_db($con, $dbname);

// determine names
$reftbl = $tbl;
$newtbl = $tbl;
$isview =
false if (!startsWith($tbl,'v_' else // find referenced table
$sql='SELECT REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA='$dbname' AND TABLE_NAME='$reftbl' AND COLUMN_NAME='$col''

$result = mysqli_query($con, $sql);
$tbl2 = NULL;
$col2 = NULL;
if ($row = mysqli_fetch_array($result, MYSQLI_ASSOC))


mysqli_free_result($result);

Limitari si directii de dezvoltare a aplicatiei

7.1 Evolutia interfetei cu utilizatorul

Directiile in care se poate specializa interfata cu utilizatorul sunt: adaugarea de functionalitati de creare de rapoarte, filtrari complexe, lucrul cu mai multe tabele in acelasi timp, editarea view-urilor cu efecte in tabelele de baza, extinderea suportului pentru mai multe browsere si servere web.

Suportul oferit in aceasta versiune a aplicatiei pentru rapoarte este limitat, utilizatorul poate doar sa obtina un view maximizat al unui tabel. Ca imbunaratire, se pot oferi utilizatorului template-uri de rapoarte, cat si operatii complexe cu datele din rapoarte (sume, medii, sortari dupa mai multe criterii, etc).

Filtrarea (functionalitatea Search) se poate face dupa mai multe criterii succesive, intrucat dupa aplicarea unui filtru (prima folosirea a butonului Search), tabelul rezultat este cel asupra caruia se va aplica filtrul urmator. Se poate imbunatati complexitatea filtrarii prin adaugarea la interfata a unui modul de filtrare, care sa permita descrierea concomitenta a mai multor criterii, si posibilitatea gruparii acestora prin operatii logice (and, or, not). De asemenea se poate imbunatati filtrarea oferind suport pentru cautarea in toata baza de date a unei informatii, nu numai in tabelul curent, cum se intampla in versiunea curenta a aplicatiei.

Pentru lucrul cu mai multe tabele in acelasi timp, o versiune ulterioara ar trebui sa permita lucrul cu tabele in mai multe frame-uri (2 sau 4), pentru a permite utilizatorului paralelizarea actiunii de vizualizare a bazei de date.

Editarile care se fac asupra view-urilor (redenumire, sortare, stergere) nu se reflecta in baza de date, astfel incat utilizatorul sa nu poata altera din greseala datele. Se poate insa oferi si optiunea de a opera modificarile facute intr-o vizualizare asupra bazei de date.

7.2 Suport extins pentru baze de date

Extinderea suportului pentru baze de date se poate face prin folosirea unui standard SQL pentru scrierea interogarilor, suportat de mai multe baze de date. Dupa cum se stie, sistemele de gestiune a bazelor de date se diferentiaza sensibil prin sintaxa interogarilor sql pe care le folosesc. Suportul pentru alte baze de date decat Mysql implica testarea pe alte baze de date si particularizarea codului la acestea.

De asemenea trebuie considerat faptul ca, desi dinamica sporita a aplicatiei ofera multe beneficii, precum adaptarea la baza de date, scriptingul aduce si o multime de inconveniente, legate in special de probleme de compatibilitate. Scripturile sunt puternic dependente de browserul utilizat, de gestiunea erorilor facuta distinct pentru fiecare baza de date, fiecare limbaj in parte precum si, la modul genereal, de fiecare librarie folosita.

Aceste aspecte suporta ideea necesitatii standardizarii tehnologiilor web la un mod mult mai extins si generalizat decit la acet moment. O cale de urmat in acest sens sunt recomandarile W3C despre care se poate presupune ca multe din software-urile existente au luat aminte si au incercat, macar in parte, sa le respecte.

7.3 Gestiunea erorilor

In ceea ce priveste gestiunea erorilor, se pot aduce imbunatatiri prin crearea unui fisier header cu coduri de eroare, prin definirea unui protocol de transmitere a erorilor intre PHP - JS, cit si prin introducerea de mesaje de ghidare pentru mai multe cazuri decat suporta aplicatia in acest moment.

Dupa cum am mentionat si in subcapitolul anterior, gestiunea erorilor este facuta de o maniera descentralizaa cind vine vorba de domeniul tehnologiilor si aplicatiilor web. Se pot remarca diferente considerabile intre versiuni diferite de browsere, de limbaje web (precum PHP) ce nu tin cont intr-o masura acceptabila de backward compatibility, intre servere web diferite, precum si in cadrul programelor web pentru fiecare librarie in parte (de exemplu intre mysql si mysqli).

In acest context se cere ca o aplicatie ce isi propune sa fie compatibila cu majoritatea sistemelor ce pot fi folosite de un utilizator curent, sa isi propuna si telul uniformizarii gestiunii erorilor prin construirea de fisiere header specifice ce contin un set coerent si uniform de coduri si mesaje de eroare.

7.4 Imbunatatirea securitatii

Imbunatatiri legate de securitate implica: folosirea conexiunii securizate SSL cu serverul de baze de date, evitarea folosirii sesiunilor si a lucrului cu sistemul de fisiere. Organizarea scripturilor si codului PHP in vederea evitarii SQL injection si alte tipuri de atacuri bazate pe scripting.

Modalitatea de login trebuie imbunatatita din acest punct de vedere, aceasta facindu-se la acest moment fara criptarea datelor la transmiterea acestora intre pagina introductiva si pagin principala. De asemenea, conform recomandarilor php, exista o serie de recomandari printre care si aceea de a nu mai folosi variabile superglobale cum sunt variabilele de sesiune si inlocuirea acestora prin formulare.

De asemenea, in cazul acestei aplicatii, se remarca si aspectul confidential al datelor cu care se lucreaza (tabelele de date ale companiei) ce necesita o atentie deosebita pentru preintimpinarea posibilitatii de furt de informatie.

Fisierul de configurare folosit la acest moment pentru a tine in clar configurari de conexiui la baze de date nu prezinta suficiente prevederi din punctul de vedere al securitatii informatiei. Desi aceste informatii nu ar fi suficiente pentru un atac de hacking, ele releva locatia bazelor de date pe care le detine compania, ceea ce ar putea dauna intereselor firmei utilizatoare si incurajeaza cel putin incercarile de atac din partea unor terti.

ANEXA 1 Fragmente din codul aplicatiei

Fisierul index.php

<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>
<?php
session_start();
if isset($_SESSION['usr' ?>
<html xmlns='https://www.w3.org/1999/xhtml'> <head> <title>Gestiune Resurse Umane</title> <meta http-equiv='Content-Type' content='text/html; charset=utf-8' /> <meta name='keywords' content='hr, rh, ru, resurse, umane, gestiune, personal, angajati, concediu, salariu, raport ' /> <meta name='description' content='Gestiunea facila a resurselor umane la un click distanta' />

<script type='text/javascript'>
<!-- // preload stuff
function newImage
arg
}

function changeImages

}
}

var preloadFlag
false;
function preloadImages
// --> </script>

<script type='text/javascript' src='action/action.js'></script>
<link href='mo06f.css' rel='stylesheet' type='text/css' /> </head> <body onload='preloadImages(); showTables();' > <!-- MAIN TABLE --> <table border cellpadding cellspacing width > <tr> <td colspan ><img name 'top' src 'images/top.jpg' width height border alt ></td> </tr> <!-- TOP ROW --> <tr> <!-- LEFT COLUMN --> <td align 'center' valign 'top' class 'left_bgr'> <!--MAIN MENU--> <table width border cellpadding cellspacing > <tr> <td rowspan valign 'top'><img src 'images/menu_left.jpg' alt 'menu_left' width height ></td> <td valign 'top'><a href 'index.php' onmouseover 'changeImages('home', 'images/home_.jpg'); return true;' onmouseout 'changeImages('home', 'images/home.jpg'); return true;'><img src 'images/home.jpg' name 'home' alt 'Home' width height border ></a></td> <td rowspan valign 'top'><img src 'images/menu_right.jpg' alt 'menu_right' width height ></td> </tr> <tr> <td valign 'top'><a href onclick 'view()' onmouseover 'changeImages('about', 'images/about_.jpg'); return true;' onmouseout 'changeImages('about', 'images/about.jpg'); return true;'><img src 'images/about.jpg' name 'about' alt 'About Us' width height border ></a></td> </tr> <tr> <td valign 'top'><a href onclick 'edit()' onmouseover 'changeImages('news', 'images/news_.jpg'); return true;' onmouseout 'changeImages('news', 'images/news.jpg'); return true;'><img src 'images/news.jpg' name 'news' alt 'News' width height border ></a></td> </tr> <tr> <td valign 'top'><a href onclick 'print()' onmouseover 'changeImages('portfolio', 'images/portfolio_.jpg'); return true;' onmouseout 'changeImages('portfolio', 'images/portfolio.jpg'); return true;'><img src 'images/portfolio.jpg' name 'portfolio' alt 'Portfolio' width height border ></a></td> </tr> <tr> <td valign 'top'><a href onclick 'searchPage()' onmouseover 'changeImages('services', 'images/services_.jpg'); return true;' onmouseout 'changeImages('services', 'images/services.jpg'); return true;'><img src 'images/services.jpg' name 'services' alt 'Services' width height border ></a></td> </tr> <tr> <td valign 'top'><a href onclick 'help()' onmouseover 'changeImages('contact', 'images/contact_.jpg'); return true;' onmouseout 'changeImages('contact', 'images/contact.jpg'); return true;'><img src 'images/contact.jpg' name 'contact' alt 'Contact Us' width height border ></a></td> </tr> <tr> <td valign 'top'><img src 'images/menu_bottom.jpg' alt 'menu_bottom' width height ></td> </tr> </table> <!-- END MAIN MENU --> <br /> <div style=' top:330px; left:165px; font-variant:small-caps;'><a href onclick 'cleanup(); window.location='intro.html';'>Logout</a></div> <!-- PANEL --> <div id='panel' style='visibility:hidden;'> <table width border cellpadding cellspacing > <tr> <td><img src 'images/panel_top.gif' alt width height ></td> </tr> <tr> <td class 'panBgr' id 'tableButtons'> <h4>No Tables Available</h4> </td> </tr> <tr> <td><img src 'images/panel_bottom.gif' alt 'p2' width height ></td> </tr> </table> </div> <!-- END PANEL --> <br /> </td> <!-- END LEFT COLUMN --> <!-- RIGHT COLUMN --> <td width valign 'top' class 'bottom_bgr'> <table width border cellpadding cellspacing > <tr> <td><img src 'images/company_rumanager.jpg' alt 'Management facil al resurselor umane' width height onclick 'javascript:void(showMenu(400,400))' ></td> </tr> <tr> <td valign 'top' class 'content_bgr'> <table width border cellpadding cellspacing > <tr> <td valign 'middle'><img src 'images/vertical_line.jpg' alt 'vertical line' width height ></td> <td valign 'top' class 'content'> <script type='text/javascript' src='action/menu_items.js'></script>
<div id='contents'> <h1>Welcome <b><?php echo $_SESSION['usr' ?></b></h1> <hr /> <p>Using Database: <b style='font-style:oblique; font-variant:small-caps; color:blue;'><?php echo $_SESSION['dbname' ?></b></p> <p>Of Type: <b style='font-style:oblique; font-variant:small-caps; color:blue;'><?php echo $_SESSION['dbtype' ?></b></p> <p>At location: <b style='font-style:oblique; font-variant:small-caps; color:blue;'><?php echo $_SESSION['host' ?></b></p> <hr /> <p>Click on <b>View</b> to start viewing tables from your database</p> <p>Click on <b>Edit</b> to start editing tables from your database</p> <p>Click on <b>Search</b> to start searching information in the tables from your database</p> <p>Click on <b>Help</b> to get a description of how to use the main functionalities of <b>RU Manager</b></p> <p>&nbsp;</p> </div> </td> </tr> </table> </td> </tr> </table> </td> <!-- END RIGHT COLUMN --> </tr> <!-- END TOP ROW --> <!-- BOTTOM ROW --> <tr> <td colspan align 'left'> <div class='copyrights'> <a href 'index.php'>Home</a>&nbsp;|&nbsp;
<a href onclick 'view()'>View</a>&nbsp;|&nbsp;
<a href onclick 'edit()'>Edit</a>&nbsp;|&nbsp;
<a href onclick 'print()'>Print</a>&nbsp;|&nbsp;
<a href onclick 'searchPage()'>Search</a>&nbsp;|&nbsp;
<a href onclick 'help()'>Help</a> <div>&copy; 2008 Iulia Trifan</div> </div> </td> <td>&nbsp;</td> </tr> <!-- END BOTTOM ROW --> </table> <!-- END MAIN TABLE --> <p> <a href 'https://validator.w3.org/check?uri=referer'><img src 'https://www.w3.org/Icons/valid-xhtml10-blue' alt 'Valid XHTML 1.0 Transitional' height width style 'border:0' ></a> <a href 'https://jigsaw.w3.org/css-validator/'><img style 'border:0;width:88px;height:31px' src 'https://jigsaw.w3.org/css-validator/images/vcss-blue' alt 'CSS Valide !' ></a> </p> </body> </html>

Fisierul action.js

<script type='text/javascript'>
var xmlHttp
var currentTable

function GetXmlHttpObject


catch
e

catch
e

}
return xmlHttp;
}

function showTables



var url
'action/show_tables.php'
url
url '?q='
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertTableButtons
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertTableButtons


}
}

function loadTable
tableName
currentTable tableName

var url
'action/load_table.php'
url
url '?q=' tableName
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertTable
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertTable


}

function sortTable
column


var url
'action/sort_table.php'
url
url '?tbl=' currentTable
url
url '&q=' column
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertTable
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function expandTableReference
column
var url 'action/expand_table_reference.php'
url
url '?tbl=' currentTable
url
url '&col=' column
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertExpandedTableReference
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertExpandedTableReference

if currentTable indexOf 'v_'
currentTable
'v_' currentTable

document
getElementById 'contents' innerHTML xmlHttp responseText
}
}

function removeColumn
column


var url
'action/remove_column.php'
url
url '?tbl=' currentTable
url
url '&col=' column
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertAlteredTable
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function insertAlteredTable

if currentTable indexOf 'v_'
currentTable
'v_' currentTable

document
getElementById 'contents' innerHTML xmlHttp responseText
}
}

function renameColumn
column


var newColumnName
prompt 'Please enter new column name' ;
if
newColumnName null newColumnName


if
document getElementById 'header_' newColumnName


var url
'action/rename_column.php'
url
url '?tbl=' currentTable
url
url '&oldcol=' column
url
url '&newcol=' newColumnName
url
url '&sid=' Math random
xmlHttp
onreadystatechange insertAlteredTable
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function cleanup



var url
'action/cleanup.php'
url
url '?sid=' Math random
xmlHttp
open 'GET' url true
xmlHttp
send null /*------------ dropdown MENU action ----- ----- -----*/
var timer
null;

function showMenu
x y menuId
contents document getElementById 'contents'
var Container document createElement 'div' contents appendChild Container Container id menuId;
Container
className 'dropDownMenu';
Container
style left x 'px';
Container
style top y 'px';
Container
addEventListener 'mouseout' mouseOutMenu false Container addEventListener 'mouseover' mouseOverMenu false
var Menu document createElement 'ul' Container appendChild Menu
var removeBtn document createElement 'li' removeBtn innerHTML '<a href='#1' onclick='removeColumn('' menuId substr '')'>Remove</a>';

var renameBtn
document createElement 'li' renameBtn innerHTML '<a href='#1' onclick='renameColumn('' menuId substr '')'>Rename</a>';;

var sortBtn
document createElement 'li' sortBtn innerHTML '<a href='#1' onclick='sortTable('' menuId substr '')'>Sort</a>';;

Menu
appendChild removeBtn Menu appendChild renameBtn Menu appendChild sortBtn ;
}

function mouseOverMenu



function mouseOutMenu


timer
setTimeout 'document.getElementById('' this id '').style.visibility = 'hidden'' /*----- ----- ------- TABLE EDIT ACTIONS ----- ----- ------------*/
var alteredRows
null
var error
null
var deletedRows
null

function contains
arr elem


return false;
}

function editTable



alteredRows
new Array
deletedRows new Array document getElementById 'editBtn' disabled true;
document
getElementById 'addBtn' disabled false;
document
getElementById 'delBtn' disabled false;
document
getElementById 'applyBtn' disabled false;
document
getElementById 'discardBtn' disabled false;
}

function addRow


}

function delRow


}

function applyChanges


else
updStr
'NULL';

for
j ; j < cells length; j

else
updStr
', NULL';
}

if
allNULL continue;
updateRow
updStr ;

if
error

else

}
}

var delStr;
while
deletedRows length >

else


for
j ; j < cells length; j


deleteRow
delStr ;

if
error

}

cells
document getElementsByName 'tblCell'
for i ; i < cells length; i


alteredRows
null;   
deletedRows
null;
document
getElementById 'editBtn' disabled false;
document
getElementById 'applyBtn' disabled true;
document
getElementById 'discardBtn' disabled true;
document
getElementById 'addBtn' disabled true;
document
getElementById 'delBtn' disabled true;
}

function deleteRow
str


var url
'action/delete_row.php'
url
url '?tbl=' currentTable
url
url '&row=' str
url
url '&sid=' Math random
xmlHttp
onreadystatechange getDeleteResult
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function getDeleteResult


}
}

function updateRow
str


var url
'action/update_row.php'
url
url '?tbl=' currentTable
url
url '&row=' str
url
url '&sid=' Math random
xmlHttp
onreadystatechange getUpdateResult
xmlHttp
open 'GET' url true
xmlHttp
send null
}

function getUpdateResult


}
}

function discardChanges



function search


else


cells
document getElementsByName 'headerCell' list document getElementById 'searchCols' list options new Option 'All' list options selected true;
for
i ; i < cells length; i


document
getElementById 'searchBtn' disabled true;
}

function cancelSearch



function doSearch


}
}

resultRows
new Array
var i
for i ; i < cells length; i


if
idx < continue;

if
document getElementById 'word' checked


upperLimit
idx text value length;

if
upperLimit < cells i value length && isAlphanum cells i value charAt upperLimit

}

resultRows
push cells i parentNode parentNode // parent row
}

document
getElementById 'matches' innerHTML 'Got ' resultRows length ' matches.';

var tbl
document getElementById currentTable var sz tbl rows length;
var i
for i ; i < sz; i

}

var numb
';
var lwr
'abcdefghijklmnopqrstuvwxyz';
var upr
'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function isValid
parm val


return true;
}

function isNum
parm
function isLower
parm
function isUpper
parm
function isAlpha
parm
function isAlphanum
parm /********** PAGES *************/
function view


else

}

function edit


editBtn
click }
else

}

var savePage

function print


savePage
document body innerHTML;
document
body innerHTML document getElementById 'contents' innerHTML '<div style='text-align:center; width:100%; ba'><a href='#' onclick='document.body.innerHTML = savePage; savePage = null;'> BACK </a></div>';
}

function searchPage


searchBtn
click }
else

}

function help /* END PAGES */

BIBLIOGRAFIE

Cursul de Interfete evoluate

Cursul de Baze de Date

https://www.elfconsulting.ro/showdef.php?nrdef=38

https://hosted.regionalnet.org/asper/managementul_resurselor_umane.html

https://www.pcworld.ro/index.php?id=9301&page=node&print=true

https://www.joboutlook.ro/

https://www.sal.ro/

https://www.ebsromania.ro/produse/clarvision4.htm

https://www.sincronhr.ro/

https://www.mysql.com

https://www.mozilla.com

https://www.php.net

https://html-tutor.net/ceestehtml/#sgml

https://www.ici.ro/RRIA/ria2005_3/art04.html

https://www.phpromania.net/info/desprephp/

https://www.softpageinternet.ro/manual_html/Capitole/Capitolul%2012.htm

https://ro.wikipedia.org/wiki/MySQL



https://hosted.regionalnet.org/asper/managementul_resurselor_umane.html

https://www.elfconsulting.ro/showdef.php?nrdef=38

https://www.pcworld.ro/index.php?id=9301&page=node&print=true

https://www.joboutlook.ro/

https://www.sal.ro/

https://www.ebsromania.ro/produse/clarvision4.htm

https://www.sincronhr.ro/

Kituri de instalare pentru MySQL precum si documentatie legata de acestea pot fi gasite pe situl official MySQL: https://www.mysql.com

Firefox este un browser open-source. Kituri de instalare precum si documentatie legata de acest subiect pot fi gasite pe situl official Mozilla: https://www.mozilla.com

Kituri de instalare pentru PHP precum si documentatie legata de acest subiect pot fi gasite pe situl official PHP: https://www.php.net

Obiectul XMLHttpRequest este suportat in Internet Explorer 5.0+, Safari 1.2, Mozilla 1.0 / Firefox, Opera 8+, si Netscape 7

https://ro.wikipedia.org/wiki/MySQL

https://html-tutor.net/ceestehtml/#sgml

https://www.ici.ro/RRIA/ria2005_3/art04.html

https://html-tutor.net/ceestehtml/#sgml

https://www.phpromania.net/info/desprephp/

https://www.softpageinternet.ro/manual_html/Capitole/Capitolul%2012.htm

Pentru mai multe detalii despre acest modul de extensie PHP consultati manualul PHP





Politica de confidentialitate





Copyright © 2024 - Toate drepturile rezervate

Informatica


Access
Adobe photoshop
Autocad
Baze de date
C
Calculatoare
Corel draw
Excel
Foxpro
Html
Internet
Java
Linux
Mathcad
Matlab
Outlook
Pascal
Php
Powerpoint
Retele calculatoare
Sql
Windows
Word


Introducere in limbajul LabVIEW
Proiect - Geometrie Computationala
Masive
Obiectele ADO.Net
Concepte ale controlului automat in sistemele de control timp real - controlul operational
GRAFICA 3D - Character Setup
Crearea unui site pentru studierea : Internet Information Server
Editorul de texte Microsoft Word - Formartarea la nivel de caracter
SURSE DISCRETE
Stive si Cozi - Creare. Inserare. Stergere.




termeni
contact

adauga