Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Aplicatie software pentru gestiunea
resurselor umane
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]:
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.
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.
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]
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.
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+
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.
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.
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.
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.
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.
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.
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
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
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.
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.
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.
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.
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.
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).
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.
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.
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.
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.
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:
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.
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.
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 :
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 - 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.
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, 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.
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.
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.
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".
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.
DESCRIBE city;
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:
D) Instructiunea 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
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.
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.
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.
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.
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:
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
?>
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);
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 >
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);
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);
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);
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.
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.
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.
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.
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> </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> |
<a href onclick 'view()'>View</a> |
<a href onclick 'edit()'>Edit</a> |
<a href onclick 'print()'>Print</a> |
<a href onclick 'searchPage()'>Search</a> |
<a href onclick 'help()'>Help</a> <div>© 2008 Iulia Trifan</div> </div> </td> <td> </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 */
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.ebsromania.ro/produse/clarvision4.htm
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
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
Copyright © 2024 - Toate drepturile rezervate