Pagina Web cu Baza de Date Relationala Pentru Un Magazin de Vanzari Template Uri
CUPRINS:
1 INTRODUCERE
1.1 Obiective
1.2 Prezentarea conținutului
2 FUNDAMENTARE TEORETICA
2.1 Elemente de teoria bazelor de date
2.1.1 Organizarea datelor
2.1.2 Structuri de date
2.1.3 Conceptul de baza de date
2.1.4 Sisteme de gestiune a bazelor de date (SGBD)
2.2 Proiectarea bazelor de date
2.2.1 Etape de realizare a unei baze
2.2.2 Analiza sistemului si a cerintelor informationale
2.2.3 Proiectarea structurii bazei de date
2.3 Baze de date relationale
2.3.1 Modelul relational al datelor
2.3.2 Sisteme de gestiune a bazelor de date relationale (SGBDR)
2.3.3 Proiectarea bazelor de date relationale
2.3.4 Proiectarea schemei externe
2.3.5 Proiectarea schemei interne
2.3.6 Directii de perfectionare a bazelor de date relationale
2.4 Limbaje folosite
2.4.1 SQL
2.4.2 PHP
2.4.3 HTML
2.4.4 Standardul CSS
2.5 Optimizare pentru motoare de căutare
2.6 Utilitare folosite
2.6.1 Photoshop
2.6.2 Ultimele instrumente
2.6.3 PhpMyAdmin
3 DESCRIEREA SOLUTIEI ADOPTATE
3.1 Descriere generala
3.2 Proiectarea bazei de date
3.3 Exploatarea bazei de date si implementarea in php
3.4 Structura relationala
3.5 Prezentare aplicatie
3.5.1 Interfata cu utilizatorul
3.5.2 Administrare
4 TESTAREA SI VALIDAREA REZULTATELOR
5 CONCLUZII
6 BIBLIOGRAFIE
7 ANEXA
INTRODUCERE
Obiective
Sa se proiecte si implementeze o pagina web folosind o baza de date relationala pentru realizarea unui magazin virtual de vanzari template-uri.
Baza de date va fi proiectata astfel incat sa contina urmatoarele sectiuni:
Tutoriale si articole;
Promovare template-uri;
Vanzare template-uri (Carucior de cumparaturi);
Gestionarea clientilor si a comenzilor
Cautare template-uri dupa diferite criterii;
Interfata de administrare a continutului website-ului;
Website-ul va fi proiectat in ideea de a oferi spre vanzare template-uri celor care doresc sa isi realizeze un site propriu si va cuprinde:
meniuri si submeniuri;
header care sa cuprinda sigla magazinului;
text insotit de poze (acolo unde este cazul) care sa fie preluate din baza de date;
produsele oferite spre vanzare;
bannere publicitare.
Functionalitatea magazinului virtual este urmatoarea: in prima faza un potential client acceseza pagina petru a vizualiza oferta site-ului; continului si organizarea paginilor terbuie sa fie atragatoare si mai ales usor de utilizat astfel incat acesta sa isi atinga cu usurinta scopul vizitei iar magazinul sa il transforme in client. Ca urmare, in aplicatie trebuie evidentiata sectiunea de template-uri si mai ales promotiile. Pentru ca timpul in care un client va gasi un template, care sa ii satisfaca nevoile, sa fie cat mai scurt, aplicatia trebuie sa ii puna acestuia la dispozitie un modul de cautare dupa criterii bine definite (pret, domeniu in care va fi folosit ulterior).
Una dintre prioritatile aplicatiei este obtinerea de clienti fideli. Pentru a atinge acest scop trebuie tinuta o evidenta a clientilor in vederea oferirii de reduceri celor care se reintorc pentru a face o noua comanda.
Prezentarea conținutului
Lucrarea este structurata în 5 capitole, bibliografie si anexe si trateaza implementarea unei pagini web cu baza de date relationala pentru realizarea unui magazin virtual de vanzari template-uri.
In Capitolul 1 sunt prezentate obiectivele aplicatiei si structura lucrării.
Capitolul 2 contine: un breviar teoretic referitor la proiectarea bazelor de date, la mediul de programare în care a fost dezvoltata aplicatia si la utilitarele folosite.
In Capitolul 3 sunt prezentate: solutia adoptata pentru dezvoltarea aplicatiei precum si o prezentare a acesteia cu ajutorul screen-shot-urilor.
Capitolul 4 contine problemele intampinate pe parcursul gasirii modului de abordare a specificatiilor si a dezvoltarii aplicatiei.
Capitolul 5 contine concluziile trase pe parcursul dezvoltarii aplicatiei.
FUNDAMENTARE TEORETICA
Elemente de teoria bazelor de date
Organizarea datelor
Unul din rolurile de baza in proiectarea sistemelor informatice il are organizarea datelor.
Activitatea de organizare a datelor presupune urmatoarele:
definirea, stucturarea, ordonarea si gruparea datelor in colectii de date omogene;
stabilirea relatiilor intre date, intre componentele unei colectii si intre colectii de date;
stocarea colectiilor de date pe suport, astfel incat ele sa poata fi prelucrate intru-un sistem de calcul.
Scopul primordial al organizarii datelor este regasirea lor automata avand in vedere diverse criterii si forme.
Organizarea datelor are urmatoarele obiective:
timpul de acces la date trebuie sa fie minim;
spatiul de memorare interna si externa ocupat de colectiile de date, trebuie sa fie cat mai mic;
aceleasi date trebuie sa fie stocate o singura data in sistem, daca este posibil. Aceasta presupune utilizarea metodelor de diminuare sau eliminare a redundantei. Eliminarea redundantei si rapiditatea accesului la date sunt doua tendinte contradictorii si de aceea, pentru rapiditatea accesului se accepta un anumit nivel al redundantei;
sistemul de organizare a datelor trebuie sa reflecte, pe cat posibil, toate legaturile dintre obiecte, fenomene, procese pe care le reprezinta;
sistemul de organizare sa permita schimbarea structurii datelor si a relatiilor dintre ele fara a modifica sistemul de programare care le gestioneaza (flexibilitatea datelor).
Conceptele utilizate in organizarea datelor sunt: entitatea, atributul si valoarea, ele fiind introduse odata cu aparitia bazelor de date. Relatia dintre ele este urmatoarea: o entitate are mai multe atribute, iar fiecarui atribut i se poate asocia o valoare sau o multime finita de valori.
Entitatea este un obiect concret sau abstract reprezentat prin proprietatile sale.
Orice proprietate a unei entitati poate fi expimata printr-o pereche (atribut, valoare).
O entitate se poate exprima prin mai multe proprietati, deci, prin mai multe perechi (atribut, valoare).
Entitatea are echivalentul informatic mai vechi de inregistrare, iar atributul mai poarta numele de camp al inregistrarii.
Atributele pot fi simple, daca au valori elementare sau pot fi compuse, daca ele sunt formate din concatenarea mai multor atribute.
Atributele care identifica in mod unic o entitate poarta numele de atribute cheie. Celelalte atribute se numesc atribute noncheie.
Un alt concept este cel de data. Data este un model de reprezentare a informatiei, accesibil unui destinatar (om, program, calculator). Acest model este utilizat pentru a obtine noi informatii despre fenomenele si procesele lumii reale.
O data porta numele data elementara sau scalara, daca ea este indivizibila atat in raport cu informatia pe care o reprezinta, cat si cu modul ei de prelucrare.
O data poarta numele de data compusa daca este formata din mai multe date elementare.
Orice data se defineste prin : identificaror, atribut si valoare.
Din punct de vedere fizic, unei date ii corespunde o zona de memorie de o anumita marime situata la o adresa absoluta.
Structuri de date
O stuctura de date se defineste ca o colectie de date intre care s-au stabilit o multime de relatii care conduc la un anumit mecanism de selectie si identificare a componentelor ei.
Componentele structurii pot fi individualizate si identificate prin nume (identificator) sau prin pozitia pe care o ocupa in stuctura (in raport cu ordinea specificata).
Structura are acces secvential daca localizarea unei componente se face prin parcurgerea tuturor celorlalte componente aflate inaintea sa in ordinea specificata.
Structura are acces direct daca localizarea unei componente nu tine seama de celelalte componente, fiecare componenta avind un identificator propriu.
Componentele unei structuri pot fi datele elementare sau structuri de date.
Principalele operatii care se pot efectua asupra unei structuri de date si care se refera la valori si/sau la structura, sunt:
crearea sau memorarea datelor initiale pe suportul de memorie;
consultarea sau accesul la componentele structurii;
actualizarea sau schimbarea starii structurii prin adaugarea sau stergerea unor elemente, prin modificarea valorii unor elemente sau prin modificarea relatiilor dintre elemente;
sortarea sau ordonarea elementelor dupa anumite criterii;
ventilarea sau spargerea structurii in doua sau mai multe structuri;
fuzionarea sau formarea unei structuri noi din doua sau mai multe structurii existente;
copierea unei sau unor date;
interclasarea sau introducerea elementelor unor structuri printre elementele altei sau altor stucturi, dupa anumite criterii.
Un tip de structura de date se defineste pentru toate structurile de date care au aceeasi organizare si sunt supuse acelorasi operatii.
Un tip de structura de date este o multime ordonata de date intre care s-au stabilit anumite relatii si pentru realizarea operatiilor se foloseste un grup de operatori de baza cu o anumita semantica.
Clasificarea structurilor de date
Clasificarea are in vedere mai multe criterii, si anume:
Dupa tipul componentelor, structurile sunt:
omogene, daca componentele sunt de acelasi tip;
eterogene, daca componentele sunt de tipuri diferite;
Dupa substructurile componenete, structurile sunt:
recursive, daca structura se poate descompune in substucruri de acelasi tip;
nerecursive, in caz contrar.
Dupa posibilitatea de modificare a valorilor si / sau structurii, sunt:
structuri statice, daca au acelasi numar de componente si in aceeasi ordine pe toata durata existentei ei. Structura statica are cardinalitate finita adica are un numar finit de componente.
structuri dinamice la care se permite modificarea valorilor si / sau structurii lor prin aplicarea operatorilor. Structura dinamica poate avea un numar infinit de elemente, deci poate avea teoretic cardinalitatea infinita.
Dupa nivelul de stucturare al datelor, sunt:
structura logica ce se refera la modul de operare a datelor si la operatorii de tratare a datelor.
structura fizica ce se refera la modul de implementare si reprezentare pe suportii de informatie.
Alocarea memoriei pentru o stuctura statica este o alocare statica atat pentru componente cat si pentru structura.
Alocarea memoriei pentru o stuctura dinamica este o alocare dinamica atat la nivelul intregii stucturi cat si la nivelul componentelor. O structura poate fi implementata atat ca structura statica cat si ca structura dinamica. Organizarea datelor presupune definirea atat a structurii logice cat si a structurii fizice, aceste doua nivele, interconditionandu-se.
Conceptul de baza de date
Conceptul de baza de date a aparut pentru prima data in anul 1969 cu ocazia prezentarii primului raport CODASYL la o conferinta avind ca tema limbajele de gestiune a datelor. In acest raport s-a prezentat pentru prima data ideea organizarii datelor prin crearea unui fisier care contine descrierea globala a lor. Prin acest fisier se analizeaza independenta programelor fata de date si invers. Accesul utilizatorilor la date se realizeaza prin intermediul acestui fisier care contine atit colectiile de date cit si legaturile dintre ele. Dezvoltand acest concept initial s-a ajuns la conceptul actual de baza de date.
Baza de date se poate defini ca fiind una sau mai multe colectii de date D1 care se afla in interdependenta impreuna cu descrierea datelor si a relatiilor dintre ele, astfel:
BD={D1,D2,D3,….}
Conditiile principale pe care trebuie sa le indeplineasca o baza de date sunt:
interdependenta a datelor fata de programe si invers ;
asigurarea tuturor informatiilor necesare pentru cerintele de informare si decizie ;
asigurarea unei redundante minime si controlate a datelor;
posibilitatea accesului rapid la informatii.
Principalele centre specializate in dezvoltarea si standardizarea conceptelor care apar in baze de date sunt: CODASYL, IBM, ANSI/X3/SPARC.
Principalele criterii de clasificare a bazelor de date sunt:
orientarea, dupa care bazele date pot fi: specializate sau generalizate;
modelul de date, dupa ca gestiune a datelor. In acest raport s-a prezentat pentru prima data ideea organizarii datelor prin crearea unui fisier care contine descrierea globala a lor. Prin acest fisier se analizeaza independenta programelor fata de date si invers. Accesul utilizatorilor la date se realizeaza prin intermediul acestui fisier care contine atit colectiile de date cit si legaturile dintre ele. Dezvoltand acest concept initial s-a ajuns la conceptul actual de baza de date.
Baza de date se poate defini ca fiind una sau mai multe colectii de date D1 care se afla in interdependenta impreuna cu descrierea datelor si a relatiilor dintre ele, astfel:
BD={D1,D2,D3,….}
Conditiile principale pe care trebuie sa le indeplineasca o baza de date sunt:
interdependenta a datelor fata de programe si invers ;
asigurarea tuturor informatiilor necesare pentru cerintele de informare si decizie ;
asigurarea unei redundante minime si controlate a datelor;
posibilitatea accesului rapid la informatii.
Principalele centre specializate in dezvoltarea si standardizarea conceptelor care apar in baze de date sunt: CODASYL, IBM, ANSI/X3/SPARC.
Principalele criterii de clasificare a bazelor de date sunt:
orientarea, dupa care bazele date pot fi: specializate sau generalizate;
modelul de date, dupa care bazele de date pot fi: ierarhice, retele relationare, orientate pe obiecte;
zonele de implementare, dupa care pot fi: locale, distribuite ;
limbajele utilizate, dupa care pot fi: proprii (autonome), cu limbaj gazda sau mixte.
Arhitectura generala a unei baze de date cuprinde urmatoarele componente:
baza de date propriu-zisa in care se memoreaza colectiile de date;
Sistemul de Gestiune a Bazelor de Date (SGBD) format dintr-o colectie de programme care asigura gestiunea si prelucrarea datelor;
un set de proceduri manuale si automate si reglementarile administative pentru buna functionare a bazei de date;
un dictionar al bazei de date (metobaza de date) care contine informatii despre date, structura datelor, elementele de descriere a semanticii, etc.;
echipamentele hardware utilizate (specializate, comune ,etc);
personalul implicat: utilizatorii finali (neinformaticieni), utilizatorii de specialitate (administratori baze de date), analisti-programatori, operatori, gestionari.
Componentele bazei de date se pot sructura pe trei nivele:
nivelul logic dat de viziunea programatorului de aplicatii care realizeaza aplicatia pentru manipularea datelor si stuctura logica (substructura) corespunzatoare datelor aplicatiilor.
nivelul conceptual (global) dat de viziunea administratorului bazei de date care realizeaza stuctura conceptuala corespunzatoare descrierii bazei de date si administreaza componentele ei pentru manipularea datelor.
nivelul fizic dat de viziunea inginerului de sistem care realizeaza structura fizica corespunzatoare descrierii datelor pe suportul fizic.
Sisteme de gestiune a bazelor de date (SGBD)
Definirea sistemelor de gestiune a bazelor de date
SGBD – ul este reprezentat de software-ul de baza al bazei de date prin care se asigura urmatoarele activitati:
definirea structurii bazei de date (BD);
incarcarea datelor in BD;
accesul la datele BD pentru interogare, actualizare:
intretinerea BD care consta in colectarea si refolosirea spatiilor goale, refacerea BD in cazul unui accident si alte activitati;
reorganizarea BD care consta in restructurarea si modificarea strategiei de acces;
securitatea datelor.
SGBD este componenta activa a BD care interactioneaza cu toate celelalte componente, cu toate categoriile de personal implicat in functionarea BD.
Obiectivele SGBD
Principalele obiective ale SGBD sunt:
Asigurarea interdependentei datelor fata de aplicatie, astfel incat aplicatii diferite cu viziuni diferite asupra acelorasi date sa nu implice modificarea structurii datelor si a strategiei de acces care intra in atributiile administratorului BD. Independenta trebuie privita din doua puncte de vedere:
independenta fizica a datelor care permite ca memorarea lor si tehnicile fizice de memorare sa poata fi modificate fara a implica rescrierea programelor de aplicatie.
independenta logica a datelor prin care se permite adaugarea de noi articole de date sau extinderea structurii conceptuale globale, fara a fi necesara rescriera programelor existente.
Asigurarea unei redundante minime si controlate a datelor din BD. Este preferabil ca aceleasi date sa apara o singura data, dar totusi, pentru reducerea timpilor de acces, se acepta o redundanta minima controlata.
Asigurarea unor facilitati sporite de utilizare a datelor presupune:
utilizarea acelorasi date de mai multi utilizatori in aplicatii diferite;
accesul usor si simplu al utilizatorilor la date fara ca acestia sa cunoasca structura intregii BD.
utilizarea unor limbaje performante de regasire a datelor care permite accesul conversational, unor criterii de selectie a datelor si indicare a unor reguli cit mai generale pentru editarea informatiilor solicitate;
posibilitatea unui acces multicriterial (direct, secvential, secvential-indexat), fara sortari suplimentare.
utilizarea unor limbaje cit mai apropiate de limbajul natural care sa permita utilizarea BD in regim conversational.
cresterea gradului de securitate a datelor impotriva accesului neautorizat. Administratorul BD trbuie sa prevada accesul la BD numai prin canale corespunzatoare si sa defineasca verificari de autorizare.
asigurarea integritatii datelor impotriva unor distrugeri intentionate sau accidentale prin intermediul unor proceduri de validare, a unor protocoale de control concurent si a unor procedurii de refacere a BD in urma unui incident.
asigurarea partajabilitatii datelor sub aspectul asigurarii accesului mai multor utilizatori la aceleasi date si dezvoltarea unor aplicatii noi fara modificarea structurii bazei de date.
Functiile sistemului de gestiune a bazelor de date
Definirea functiilor sistemului de gestiune a bazelor de date (SGBD) are un caracter relativ care depinde de tipul BD. Se pot definii, totusi, urmatoarele functii principale ale BD:
1. Functia de descriere a datelor prin care se permite definirea structurii BD cu ajutorul limbajului de definire a datelor. Definirea datelor se poate face la nivelul logic, conceptual si fizic. Functia consta in descrierea atributelor (cimpurilor) din cadrul structurii BD, a legaturilor dintre entitatile BD sau dintre atributele acelorasi entitati, definirea criteriilor de validare a datelor, a metodelor de acces, a aspectelor referitoare la asigurarea integritatii si confidentialitatii datelor, etc. Functia are ca rezultat elaborarea schemei BD care se memoreaza in cod intern.
2. Functia de manipulare a datelor. Este cea mai complexa si consta in urmatoarele activitati:
crearea sau incarcarea BD;
adaugarea de noi inregistrari (tupluri) sau stergerea de inregistrari;
stergerea unor inregistrari;
modificarea valorilor unor campuri (atribute);
cautarea, sortarea, editarea partiala sau totala a unei inregistrari virtuale, etc.
Functia se realizeaza cu ajutorul limbajului de manipulare a datelor.
3. Functia de utilizare care asigura multimea interfetelor necesare pentru comunicarea tuturor utilizatorilor cu BD. Se pot definii mai multe tipuri de utilizatori:
utilizatori liberi sau conversationali sau utilizatori finali care folosesc limbaje de interogare a BD intr-o forma mai simpla. Ei sunt neinformaticieni;
utilizatori programatori, care prin intermediul limbajelor de manipulare, pot realiza proceduri complexe de exploatare a BD;
administratorul BD, care are in sarcina functionarea optima a BD.
4. Functia de administrare este de competenta administratorului BD.
Proiectarea bazelor de date
Etape de realizare a unei baze
Principalele etape de realizare a unei baze de date sunt:
Analiza sistemului sau a domeniului si a cerintelor informationale pentru care se realizeaza BD.
Proiectatea structurii BD (sechema conceptuala, interna si externa).
Introducerea datelor in BD.
Explotarea si intretinerea BD.
Continutul acestor etape depinde de tipul BD ce va fi construita. Realizarea BD presupune utilizarea unor metode si tehnici de analiza, de programare precum si a unor instrumente de lucru cum ar fi: limbaje de descrierea datelor (LLD) si limbaje de manipulare a datelor (LMD).
Analiza sistemului si a cerintelor informationale
Activitatea de analiza consta in:
Analiza componentelor sistemului si a legaturilor dintre acestea. Aceasta etapa poarta numele de analiza structurala sau statica si se finalizeaza prin elaborarea modelului structural (static) al sistemului.
Analiza starilor si a tranzitiilor posibile dintre acestea in raport cu anumite evenimente. Etapa poarta numele de analiza temporala sau compotamentala si are ca rezultat elaborarea modelului dinamic al sistemului.
Analiza cerintelor informationale si a transformarilor de date din sistem prin care sunt satisfacute aceste cerinte. Are ca rezultat elaborarea modelului functional al sistemului.
Intercorelarea modelelor structural, dinamic si functional pentru analiza integrala a sistemului.
In cazul BD ierarhice, retea si relationale analiza structurala este foarte importanta deoarece aceasta reflecta preponderent aspectele structurale si mai putin cele dinamice.
Pentru BD postrelationale si in special BD orientate pe obiecte, foarte importante sunt si analizele temporala si functionala deoarece astfel de BD surprind foarte bine si aspectele dinamice, functionale, semantice.
Proiectarea structurii bazei de date
Modelele elaborate in fazele anterioare (structural, dinamic, functional) sunt modele conceptuale sau semantice si sunt independente de Sistemul de Gestiune al Bazei de Date (SGBD) pe care vor fi implementate pentru a deveni operationale. Independenta fata de SGBD este o cerinta a modelelor. Aceste dependente pot genera numeroase dezavantaje dupa cum urmeaza:
schimbarea SGBD-ului impune reproiectarea BD;
structura constructiva si functionala a unui SGBD poate influienta negativ activitatea de analiza, prin restrictiile impuse de acesta, putand incuraja sau descuraja anumite reprezentari;
luand ca reper facilitatile unui SGBD, utilizatorul neinformatician care nu cunoaste bine SGBD-ul ales nu isi poate exprima cerintele in deplina cunostinta de cauza.
Proiectarea structurii BD impune luarea in consideratie a SGBD-ului cu ajutorul caruia va fi implementata si exploatata BD. Structura BD trebuie sa reprezinte un model al datelor exprimat in conceptele specifice unui anumit SGBD. Cu alte cuvinte, proprietatea structurii BD reprezinta transpunerea modelelor conceptuale in termenii unui model al datelor acceptat de un SGBD.
Proiectarea structurii BD consta in parcurgerea urmatoarelor activitati:
alegerea SGBD-ului care urmeaza a fi utilizat pentru implementare;
proiectarea schemei conceptuale a BD ;
proiectarea schemei externe (subschema) a BD;
proiectarea schemei interne (subschema) a BD.
Alegerea sistemului de gestiune a bazei de date
Alegerea SGBD-ului presupune efectuarea urmatoarelor activitati:
Stabilirea cerintelor utilizatorilor sub aspectul tipurilor de aplicatii, timpului de raspuns, confidentialitatii datelor, securiatatii datelor; usurinta in utilizare; etc.
Stabilirea cerintelor de ordin tehnic printre care: portabilitatea SGBD-ului, a colectiilor de date si a programelor; facilitati obligatoriu de asigurat referitor la incarcarea, exploatarea si intretinerea BD, etc.
Stabilirea cerintelor de ordin economic privind: incadrarea in bugetul alocat pentru realizarera BD; timpul necesar pentru pregatirea utilizatorilor si trecerea la exploatarea curenta a BD, etc.
Ierarhizarea cerintelor stabilite la punctele 1, 2, 3 in functie de importanta acordata fiecarei cerinte.
Analiza comparativa a SGBD-urilor disponibile pentru alegerea unuia dintre ele.
Stabilirea coespondentei intre cerintele precizate la punctele 1, 2, 3 si caracteristicile SGBD-urilor analizate in scopul satisfacerii cerintelor formulate.
Alegerea SGBD-ului.
Proiectarea schemei conceptuale
Proiectarea schemei conceptuale impune efectuarea urmatoarelor activitati:
Stabilirea colectiilor de date si definirea detaliata a continutului acestora;
Determinarea legaturilor intre colectiile de date si a modului de reprezentare a acestora in cadrul schemei conceptuale;
Testarea schemei conceptuale si imbunatatirea acesteia, daca este cazul;
Descrierea schemei conceptuale in limbajul de descriere a datelor al SGBD si incarcarea acestei descrieri in BD.
Stabilirea colectiilor de date si definirea detaliata a continutului acestora are ca punct de plecare rezultatele obtinute in etapa de analiza a sistemului. Fiecarei entitati identificate in etapa de analiza ii corespunde, de obicei, o colectie de date din cadrul schemei conceptuale. In cadrul acestor colectii se vor defini atributele specifice entitatilor si atributele specifice pentru exprimarea legaturilor dintre componentele sistemului real. Sunt cazuri cand nu exista o corespondenta stricta intre entitatile din modelele semantice si colectiile de date din schema conceptuala a BD, deoarece, din considerente de imbunatatire a lucrului pe colectiile de date, se poate decide spargerea unei entitati in doua sau mai multe colectii de date.
Intre atributele unei entitati pot exista raporturi de determinare. Aceste dependente pot avea efecte negative asupra exploatarii BD, indeosebi la actualizare. Din acest motiv se recomanda descompunerea unei colectii mari de date in doua sau mai multe colectii mai mici, cu un numar mai mic de atribute. Dar o crestere prea mare a numarului de colectii de date poate determina cresterea dificultatilor in satisfacerea cerintelor informationale impunand cai de acces prea lungi, iar BD devenind mai lenta. Legaturile intre un numar mare de colectii de date determina cresterea redundantei datelor in BD si deci, o utilizare ineficienta a suporturilor de enumerare.
In lucrul cu BD se introduc colectii de date care contin unele rezultate obtinute prin prelucrarea datelor in BD, prelucrari care impun calcule costisitoare. Aceste colectii maresc redundanta BD, dar reduc timpii de acces.
Pentru scurtarea cailor de acces la date se impune includerea unor atribute concomitent in mai multe colectii ale BD, deci, redundanta marita.
In figura 2.1 se prezinta un exemplu de 2 colectii de date apartinand unui institut de cercetari: una privind personalul, iar cealalta privind proiectele in derulare:
Figura 2.1
Colectia cercetatorilor stiintifici contine datele personale, datele referitoare la activitatea stiintifica si identificatorii proiectelor la care lucreaza (a).
Colectia privind proiectele de cercetare contine, pentru fiecare proiect in parte identificat prin cod proiect, tema, tipul proiectului, precum si date referitoare la personalul de cercetare al proiectului (b).
Obtinerea unor informatii complete despre un anumit proiect presupune consultarea ambelor colectii.
Pentru scurtarea timpului de acces se poate recurge la includerea unor date des solicitate cum ar fi: numele si sexul cercetatorilor in colectia de date PROIECTE (c) si similar, in colectia de date CERCETATORI, se poate introduce denumirea temei si tipul proiectului (d).
Determinarea legaturilor intre colectiile de date si a modului de reprezentare a acestora in cadrul schemei
Se porneste de la legaturile dintre entitatile identificate in etapa de analiza a sistemului pentru stabilirea cerintelor informationale. Trebuie determinate si legaturile dintre colectiile care nu au un corespondent direct in entitatile sistemului, dar care se afla in asociere unele cu altele.
Modul de reprezentare a legaturilor depinde de modelul SGBD-ului. Pentru modelele ierarhic si retea se utilizeaza pointeri (adrese de legatura) pentru inlantuirea datelor.
Pentru modelul relational, legaturile dintre colectiile de date se reprezinta cu ajutorul cheilor externe sau cu ajutorul unor colectii distincte.
Testarea schemei conceptuale si imbunatatirea acesteia
Testarea schemei conceptuale si imbunatatirea acesteia, daca este cazul presupune determinarea gradului in care schema contine elementele informationale necesare satisfacerii cerintelor utilizatorilor si masura in care elementele informationale reflecta raporturile naturale dintre componentele sistemului. Mai trebuie verificat si daca redundanta datelor este la nivelul minim si daca ea poate fi controlata.
Prin testare se identifica eventualele erori de proiectare care fac necesara revizuirea schemei.
Descrierea schemei conceptuale in limbajulde descriere a datelor al SGBD si incarcarea acestei descrieri in baza de date
Descrierea schemei se face prin intermediul limbajului de descriere a datelor (LDD) de care dispune SGBD-ul. Prin descriere se obtine proiectul BD sau schema BD (in conceptia CODASYL). Compilatorul LDD transcrie schema in formatul de memorare in BD.
Proiectarea schemei externe
Schema externa a BD reprezinta forma de reprezentare a schemei conceptuale pentru un utilizator oarecare. Programele de aplicatii opereaza asupra elementelor schemei conceptuale, numai prin intermediul schemei externe, avand acces doar la acele elemente care sunt incluse in schema externa. In conceptia CODASYL, schema externa reprezinta o parte a schemei conceptuale.
Proiectarea schemei interne
Schema conceptuala poate contine diferite forme de structurare a datelor: liniara, arborescenta, retea, relationala. Memorarea datelor pe suportul fizic se face numai sub forma unei structuri liniare. La proiectarea schemei interne trebuie stabilita metoda de liniarizare a schemei conceptuale. Metoda de liniarizare depinde de tipul SGBD-ului sau de sistemele de operare sub care functioneaza BD.
Baze de date relationale
Ideea unui model asamblist al datelor a fost lansata in anul 1968 de catre cercetatorul american Childs D. F. care a subliniat faptul ca orice structura de date poate fi reprezentata prin una sau mai multe tabele de date in cadrul carora este necesar sa existe informatii de legatura pentru asigurarea relatiilor dintre tabele.
Primele articole referitoare la modelul relational al datelor au aparut in anii 1970, cand Codd E. F. a pus bazele acestui model.
Codd a dezvoltat ideile cu privire la utilizarea teoriei apartenentei la un ansamblu sub forma unui model coerent de structurare a datelor, punand astfel bazele modelului relational.
In momentul actual numai 15 – 20% din BD sunt de tip relational, restul utilizeaza sisteme de gestiune a fisierelor sau SGBD-uri ierarhice/retea si, foarte putin, alte sisteme de gestiune. In afara de modelele relationale standard sau mai dezvoltat modelul relational cu valori structurale, modelul relational fuzzy, modelul orientat pe obiecte, etc.
Modelul relational al datelor
Principalele avantaje ale modelului relational in comparatie cu modelele istoric mai vechi de tip ierarhic si retea sunt:
asigura un grad sporit de independenta a programelor de aplicatie fata de modul de reprezentare interna a datelor si fata de metodele de acces la date;
furnizeaza metode si tehnici eficiente de control al coerentei si redundantei datelor cu o buna fundamentare teoretica;
ofera facilitati multiple de definire si manipulare a datelor prin utilizarea unor limbaje procedurale si neprocedurele care au la baza calculul relational;
amelioreaza integritatea si confidentialitatea datelor.
Principalele componente ale modelului relational sunt:
Structura relationala a datelor;
Operatorii modelului relational;
Restrictiile de integritate ale modelului relational.
Structura relationala a datelor
Pentru prezentarea structurii relationale trebuiesc definite urmatoarele notiuni: domeniu, relatie, atribut si schema a unei relatii.
Domeniul reprezinta ansamblul de valori, caracterizat printr-un nume. Un domeniu poate fi definit explicit, prin enumerarea tuturor valorilor care apartin acestuia sau implicit prin precizarea proprietatilor pe care le au valorile din domeniu.
Relatia reprezinta un subansamblu al produsului cartezian al mai multor domenii. Este caracterizata printr-un nume si contine tupluri cu semnificatie.
Un tuplu reprezinta o linie a tabelului. Numarul tuplurilor dintr-o relatie reprezinta cardinalul relatiei, iar numarul valorilor (atributelor) dintr-un tuplu reprezinta gradul relatiei.
Atributul reprezinta coloana unei tabele de date caracterizata printr-un nume care exprima de obicei semnificatia valorilor din coloana respectiva.
Schema unei relatii se defineste prin numele relatiei urmat de lista atributelor, pentru fiecare atribut precizandu-se domeniul asociat, astfel:
R(A1: D1 ,. . . , An:Dm),
sau:
R:
Tabel 1
Schema unei relatii mai poarta numele de extensie a unei relatii. Extensia unei relatii reprezinta ansamblul tuplurilor care compun la un moment dat relatia, ansamblul ce este variabil in timp.
Operatorii modelului relational
Modelul relational ofera doua colectii de operatori pe relatii: algebra relationala si calculul relational.
In algebra relationala se cunosc doua tipuri de operatii:
operatii de baza: reuniunea, diferenta, produsul cartezian, etc;
operatiuni derivate: intersectia, diviziunea, etc.
Calculul relational este cunoscut sub doua variante:
o variantă utilizează în calitate de valori ale variabilelor asupra relațiilor tupluri de relație; din această cauză variabilele au fost denumite variabile tuplu, iar calculul relațional a primit denumirea de calcul relațional orientat pe tuplu.
cealalta variantă presupune că variabilele sunt definite asupra domeniilor; aceste variabile se numesc variabile domeniu, iar calculul relațional bazat pe acest tip de variabile e cunoscut sub numele de calcul relațional orientat pe domeniu.
Sisteme de gestiune a bazelor de date relationale (SGBDR)
Definirea SGBDR
Sistemul de gestiune a bazelor de date relationale este un sistem de gestiune a bazelor de date care se bazeaza pe conceptul de model relational al organizarii datelor.
Diversitatea modelelor relationale operationale a determinat aparitia si existenta unei mari diversitati de SGBDR si acest fapt impune nuantarea terminologiei pentru prezentarea lor. Astfel au aparut mai multe tipuri de sisteme printre care amintim: sisteme cu interfata relationala, sisteme pseudorelationale, sisteme complet relationale.
Notiunii de fisier din sistemul de operare ii corespunde notiunea de tabela din SGBDR, notiunii de relatie din teoria relationala ii corespunde notiunea de fisier, notiunii de inregistrare sau record a fisierului ii corespunde notiunea de linie din tabel si notiunea de tuplu din teoria relationala, iar notiunii de camp al inregistrarii ii corespunde notiunea coloana din linie si notiunea de atribut din teoria relationala.
Principalele criterii de definire a SGBDR
Un SGBDR este minimal relational daca satisface conditiile:
toate datele din BD sunt reprezentate prin valori in tabele;
operatiile cu relatii (tabele) nu fac apel la pointeri, indecsi, fisiere inverse, etc.;
SGBDR suporta operatii de proiectie, selectie si join natural fara limitari impuse din considerente interne. Unitatea de informatie cu care se lucreaza in aceste operatii este relatia.
Un SGBDR este complet relational daca este minimal relational si satisface urmatoarele criterii:
Suporta, fara limitari impuse din considerente interne, toate operatiile algebrei rationale.
SGBDR suporta restrictia privind unicitatea cheii unei relatii si restrictia referentiala.
Un SGBD este pseudorelational daca se satisfac conditiile a) si c).
Un SGBD care satisface conditiile a) si c), dar conditia c) este independenta numai in raport cu functia de interogare, este un SGBD cu interfata relationala.
Proiectarea bazelor de date relationale
Etapele necesare pentru proiectarea unei baze de date relationale sunt aceleasi ca cele prezentate la proiectarea bazelor de date in general. Continutul etapelor de proiectare prezinta insa unele particularitati. Singurele etape care raman valabile in totalitate sunt etapele de analiza a sistemului si de stabilire a cerintelor informationale. Ca urmare, aceste etape nu vor mai fi prezentate in prezentul paragraf. Se vor prezenta numai etapele care prezinta particularitati specifice. Acestea sunt: proiectarea schemei conceptuale; proiectarea schemei interne si externe. In final se va face o scurta prezentare a principalelor directii de dezvoltare a bazelor de date.
Proiectarea schemei conceptuale
In procesul de proiectare, schema conceptuala mai poarta si numele de schema conceptuala optima deoarece un deziderat important de urmarit este proiectarea unei scheme conceptuale care sa inlature posibilitatea aparitiei unor anomalii ce se manifesta in deosebi la intretinerea bazei de date, cunoscute sub numele de anomalii de actualizare a datelor.
Printr-o schema optima trebuie asigurate performante sporite la incarcarea, exploatarea si intretinerea bazei de date. Aceste performante se stabilesc in functie de exigentele formulate de utilizatorii finali, de administratorul BD si de gradul de perfectiune al relatiilor care este compatibil cu acestea.
Formele normale superioare reduc dificultatile de actualizare, dar reduc in acelasi timp si performantele de regasire a datelor, astfel ca, in anumite situatii nu este recomandata utilizarea acestora.
Formele normale ale relatiilor
Majoritatea anomaliilor care apar in lucrul cu bazele de date relationale se produc datorita dependentelor nedorite care se manifesta intre datele din cadrul relatiilor bazei de date. Dependentele nedorite determina cresterea redundantei datelor si reduc flexibilitatea structurii BD, ceea ce ingreuneaza substantial lucrul cu baza de date.
Principalele categorii de anomalii sunt:
Anomalii de actualizare datorate dependentelor functionale partiale;
Anomalii de actualizare datorate dependentelor functionale tranzitive;
Anomalii de actualizare datorate dependentelor multivaloare;
Anomalii de actualizare datorate dependentelor jonctiune.
a) Anomalii de actualizare datorate dependentelor functionale partiale
Prezenta dependentelor functionale partiale face ca la actualizarea relatiei sa se produca urmatoarele anomalii:
limitarea posibilitatilor de inserare a datelor deoarece restrictia de integritate a entitatii impune ca intr-o relatie, atributele cheie sa nu aiba valoarea “null”;
pierderi de date la stergere ce apar in situatiile in care se sterg tupluri ce contin informatii de legatura la alte tupluri care nu se mai regasesc in alte tupluri;
aparitia unor inconsistente la modificarea datelor in sensul ca modificarea unei caracteristici a unui tuplu, adica a unui atribut, trebuie sa duca la modificarea acestei caracteristici peste tot unde apare acel atribut. Daca baza de date nu este optimizata, astfel de actualizari pot apare la unele tupluri, in timp ce la altele nu apar.
b) Anomaliile de actualizare datorate dependentelor functionale tranzitive pot apare la inserarea si la stergerea datelor cand, datorita dependentelor tranzitive, se pot sterge si alte date decat cele dorite. De asemenea, pot apare si la modificarea datelor, cand datorita unor inconsistente, modificarea unei caracteristici nu trebuie sa se efectueze in toate tuplurile care o contin.
c) Anomalii de actualizare datorate dependentelor multivaloare
Dependentele multivaloare determina aparitia unei mari redundante a datelor si aceasta poate crea mari dificultati la efectuarea unor operatii, ca: modificarea, inserarea si stergerea datelor.
d) Anomalii datorate dependentelor jonctiune care presupun modificari in tuplurile jonctiunii.
Formele normale ale relatiilor se definesc in raport cu anomaliile care pot apare in lucrul cu aceste relatii, deci, in functie de dependentele „nedorite” care se manifesta in cadrul acestor relatii. La proiectarea unei baze de date relationale trebuie avute in considerare urmatoarele forme normale:
Forma normala 1 (FN1). O relatie R este in FN1 daca domeniile pe care sunt definite atributele relatiei sunt constituite numai din valori atomice (elementare). Un tuplu nu trebuie sa contina atribute sau grupuri de atribute repetitive.
Forma normala 2 (FN2). O relatie R este in FN2 daca este in FN1 si oricare dintre atributele noncheie este dependent functional complet de cheia primara a relatiei. Cu alte cuvinte, FN2 interzice dependentele functionale partiale din cadrul relatiei.
Forma normala 3 (FN3). O relatie R este in FN3 daca este in FN2 si atributele noncheie nu sunt dependente tranzitiv de cheia primara a relatiei. Cu alte cuvinte, FN3 interzice manifestarea dependentelor functionale tranzitive in cadrul relatiei.
Forma normala 4 (FN4). O relatie R este in FN4 daca este in FN3, iar in cadrul ei nu se manifesta mai mult de o dependenta multivaloare.
Forma normala 5 (FN5). O relatie R este in FN5 daca este in FN4 si daca fiecare dependenta jonctiune este implicata printr-un candidat cheie a lui R.
Formele normale se afla in urmatoarea relatie:
relatii nenormalizate.
Proiectarea schemei externe
Schema externa a BDR cuprinde ansamblul tabelelor de date la care are acces un utilizator. Pentru o BDR, se considera ca are atatea scheme externe cati utilizatori exista la un moment dat. Aceste scheme trebuiesc proiectate si apoi facute operationale.
Schema externa contine modelul de organizare si de structurare a datelor de care are nevoie un utilizator pentru a-si satisface cerintele informationale. Schema externa reprezinta o partitie a schemei conceptuale a BDR. Ea mai poarta numele de subschema a BDR.
Modulul de structurare a datelor din schema externa poate fi acelasi cu cel din schema conceptuala, cand reprezinta o partitie efectiva a schemei conceptuale, sau poate fi diferit.
Schema conceptuala trebuie sa reprezinte un optim in raport cu ansamblul cerintelor informationale ale tuturor utilizatorilor, in timp ce schema externa urmareste satisfacerea cerintelor informationale ale unui utilizator.
Principalele etape de proiectare a schemei externe sunt:
determinarea domeniului de interes pentru un utilizator;
analiza structurala, dinamica si functionala a acestui domeniu;
proiectarea schemei externe pe baza analizei de la punctul b);
operationalizarea schemei externe. Presupune descrierea sa in limbajul de descriere a datelor al SGBDR, compilarea acestei descrieri si incarcarea formei compilate in BDR. Pentru a putea fi folosita de utilizator, acesta trebuie sa primeasca drepturi de acces la tabelele de date care compun schema externa.
Un alt mod mai practic de proiectare a schemei externe presupune parcurgerea urmatoarelor etape:
identificarea in cadrul schemei conceptuale a BDR, a datelor necesare unui utilizator;
structura datelor identificate in etapa a) cu ajutorul mecanismului de definire a view-urilor (relatii virtuale). Schema externa va fi formata din ansamblul relatiilor de baza si/sau relatiilor virtuale care contin datele necesare utilizatorului;
testarea si imbunatatirea schemei externe;
operationalizarea schemei externe cu ajutorul mecanismului de acordare a dreptului de acces.
Proiectarea schemei interne
Consta in restabilirea structurilor de memorare a datelor pe suportul extern si implementarea drumurilor de acces la date.
O metoda de lucru pentru proiectarea schemei interne este metoda arborilor de predicate specifice SGBDR SABRINA care poate fi implementata si la alte sisteme.
Un arbore de predicate reprezinta o metoda ierarhica de impartire a unei relatii in subrelatii in scopul identificarii datelor care satisfac acelasi criteriu in aceeasi subrelatie.
Arborii de predicate permit regruparea multicriteriala a tuplurilor unei relatii, plasand subrelatiile in zone fizice apropiate. Partitionarea logica definita de arbori de predicate se traduce in partitionarea fizica. Arborii de predicate se utilizeaza pentru definirea adreselor logice bazate pe continut si profil. Profilul unui nod este reprezentat de concatenarea numarului de ramuri pe drumul care pleaca de la radacina arborelui si ajunge in nodul respectiv. Acesta se exprima printr-un sir de biti. Asocierea dintre adresa logica si partitie definesste arborele de plasare a relatiei.
Directii de perfectionare a bazelor de date relationale
Modelul relational are urmatoarele limite:
Utilizarea numai de atribute elementare cu un numar redus de tipuri predefinite. Acest tip ne permite modelarea corespunzatoare a diversitatii de proprietati ale obiectelor.
Simplitatea prea mare a modelului si structurarea artificiala pe colectii ca urmare a procesului de normalizare a relatiilor.
Directiile de perfectionare au drept scop eliminarea sau diminuarea limitelor constatate ale SGBDR . Principalele limite ale SGBDR sunt:
Mijloace limitate de exprimare a restrictiilor de integritate;
Diferente mari intre tratarea datelor de catre limbajele relationale de manipulare a datelor si limbajele evaluate de programe;
Absenta mecanismelor de lucru cu versiuni;
Controlul concurentei este orientat pe gestiune, tranzactiile lungi nefiind tratate;
Saracia mecanismelor deductive;
Inflexibilitatea interfetelor cu utilizatorii. Din acest motiv se impune introducerea unor tipuri de interfete adaptate aplicatiilor;
Lipsa mecanismelor de tratare a cerintelor recursive de date, pentru realizarea prelucrarilor paralele in ceea ce priveste cererile si accesul la date;
Comportamentul reactiv al BDR in sensul ca reactia de raspuns BDR se manifesta ca o consecinta a actiunilor realizate asupra BD. In vederea schimbarii acestui comportament si transformarea lui intr-un comportament activ (BDR activa) trebuie ca SGBDR sa fie inzestrat cu mecanisme declansatoare care sa permita initierea unor actiuni ca urmare a unor evenimente asincrone din afara sau din interiorul BD. Aceste mecanisme ofera, in general, facilitati de tratare a actiunilor conditionate ce sunt modelate prin reguli care exprima actiuni ce trebuiesc realizate intr-un anumit context.
Pentru depasirea acestor limite se pot contura urmatoarele directii de perfectionare a bazelor de date relationale:
a) Perfectionarea BDR in limitele modelului relational. In acest sens se pot mentiona:
introducerea modelului relational binar;
introducerea conceptului de BDR normalizata (modelul relational cu valori structurate). Un model in acest sens il constituie modelul BDR fuzzy (atributele pot avea valori fuzzy);
b)Extinderea modelului relational si fuctionalitatea SGBDR dincolo de limitele BDR. Astfel au aparut bazele de date deductive care incorporeaza facilitati inferentiale specifice sistemelor expert. [8] [9] [10] [12] [13] [24]
Limbaje folosite
SQL
Scurt istoric al limbajului SQL
SQL a fost conceput ca un limbaj standard de descriere a datelor si acces la informatiile din bazele de date, ulterior dezvoltandu-se ca o adevarata tehnologie dedicata arhitecturilor client/server.
Utilizat initial de catre firma I.B.M. pentru produsul DB2, limbajul de interogare a bazelor de date relationale SQL(“Structured Query Language”) a devenit la mijlocul decenului trecut un standard de factor in domeniu. De atunci si pana in prezent au fost dezvoltate un numar de sapte versiuni ale standardului SQL, trei dintre acestea apartinand Institutului National American de Standarde(ANSI), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft si Borland, sau de catre consortiile industriale SAG( “The SQL Access Group”) si X/Open, primul format din sute de firme ce comercializeaza software pentru baze de date, iar cel din urma orientat spre activitati de promovare a standardelor in domeniul sistemelor deschise. Din pacate, lipsa unui standard unic SQL, are drept consecinte cresterea costurilor programelor de gestiune a bazelor de date si ingreuneaza intretinerea arhitecturilor client/server.
Primul standard SQL a fost creat in anul 1989 de catre ANSI fiind cunoscut sub numele de ANSI-SQL’89 si a fost revizuit in octombrie 1992 sub noua denumire ANSI-SQL’92. Proliferarea intre timp a diferitelor implementari ale limbajului SQL a determinat formarea consortiului SAG, cu scopul de a concepe un set de standarde SQL, care sa aiba la baza un subset al standardului ANSI-SQL’89 si in plus sa rezolve probleme legate de implementarea acestora in arhitecturi client/server cum ar fi conectivitatea si interfete cu utilizatorul ale programelor.
In anul 1992 firma Microsoft in calitate de membru SAG a lansat pe piata produsul ODBC( “Open Database Connectivity”), un standard API-SQL ce are la baza un proiect de standard si defineste o interfata de programare a aplicatiilor( API) pentru accesul la bazele de date.
Cauzele care au determinat proliferarea unui numar atat de mare de standarde SQL rezida in esenta in faptul ca acestea sunt concepute ca un set de recomandari, ceea ce lasa loc pentru interpretari variate in ce priveste specificatiile limbajului si implementarea lui in aplicatii.
Interfata de programare cunoscuta in domeniu sub initialele API, ofera o cale de comunicare intre programe si bazele de date prin apeluri de functii care substituie instructiunile SQL. Astfel, standardele API se bazeaza pe conectivitate si anume conectarea utilizatorului la baza de date, precum si schimbul de date si mesaje SQL.
Concluzionand, in viitorul apropiat nu se intrevad schimbri majore in domeniul standardelor SQL care sa impuna renuntarea in mare parte la tot ce s-a realizat pana in prezent.
Descrierea comenzilor SQL
SQL este un limbaj simplu si in consecinta accesibil tuturor utilizatorilor. Se fundamenteaza in principal pe conceptul de bloc de cerere care se poate formaliza, dupa cum urmeaza:
<bloc de cerere>
lista de atribute
din lista tabele ale bazei de date
criteriu de indeplinit <expresie>
unde: lista de atribute cuprinde atribute din structura tabelei sursa sau atribute calculate pe baza celor existente in tabela/tabele sursa.
Limbajul SQL pune la dispozitia utilizatorilor urmatoarele categorii de comenzi:
Comenzi SQL de descriere a datelor, permitand definirea tabelelor reale si virtuale ale bazei de date, modificarea structurii tabelelor, stergerea tabelelor si a indecsilor( CREATE TABLE, CREATE VIEW,ALTER TABLE, DROP TABLE, DROP INDEX
Comenzi SQL de manipulare a datelor, permitand inserarea, stergerea si actualizarea de tupluri( INSERT, DELETE, UPDATE);
Comenzi de interogare a datelor, permitand regasirea, selectarea si afisarea datelor ( SELECT);
Comnzi de control a datelor, permitand atribuirea si/sau revocarea dreptului de acces la date( GRANT, REVOKE).
In continuare se va trece la explicarea comenzilor:
Comenzi SQL de descriere a datelor
Crearea tabelelor se realizeaza prin lansarea comenzii Create Table prezentand urmatoarea sintaxa:
CREATE TABLE<nume tabela> ([atribut 1] tip-atribut1 (dimensiune) [,[atribut 2] tip-atribut2 (dimensiune) …] )
CONSTRAINT nume-index {PRIMARY KEY | UNIQUE ([ATRIBUT])};
unde :
atribut 1, atribut 2,…, atribut n reprezinta atributele definite in cadrul tabelei;
tip-atribut specifica natura atributului( tipul atributului);
primary key permite specificarea atributului cu rol de cheie primara pe care se construieste un index.
Daca se doreste modificarea structurii tabelei prin adaugarea unui nou atribut se va folosi comanda ALTER TABLE:
ALTER TABLE nume-tabela ADD COLUNM nume-atribut tip [NOT NULL],…;
Stergerea unei tabele se realizeaza cu comanda DROP TABLE avand sintaxa:
DROP TABLE nume-tabela;
Crearea tabelelor virtuale, view-uri, permite definirea unor “ferestre” prin care se poate “privi” in tabele sau, altfel spus, putem vizualiza datele dorite dintr-o tabela specificata:
CREATE TABLE nume-view [(nume-atribut),…] AS cerere;
Comenzi de manipulare a datelor
Pentru inserarea unui tuplu intr-o tabela se realizeaza comanda INSERT, prezentand urmatoarea sintxa:
INSERT INTO nume-tabela [(nume-atribut,…)] {VALUES (valoare,…)|cerere}
Actualizarea datelor dintr-o tabela se realizeaza prin comanda UPDATE:
UPDATE nume-tabela SET{nume-atribut=expresie,…|(nume-atribut=subcerere),…} [Where conditie];
Noua realizare a atributului actualizat se precizeaza prin expresie sau este returnat de subcererea precizata. Clauza where permite selectarea tuplurilor afectate de actualizare.
Comenzi SQL de interogare a datelor
O cerinta a utilizatorului de selectare a datelor relationala se exprima prin ceea ce am numit un bloc de cerere.
Un bloc de cerere in SQL prezinta urmatoarea sintaxa simplificata:
SELECT [ALL/DISTINCT/DISTINCTROW] lista atribute
FROM nume-tabele
[Where criteriu-de-cautare]
[Group BY atribut–de-grupare]
[HAVING criteriu-de-grupare]
[ORDER BY criteriu-de-ordonare[ASC|DESC]]
unde:
lista-atribute – specifica atributele ale caror valori vor fi returnate;
nume-tabele – specifica tabelele din care se vor extrage datele;
ALL – specifica returnarea tuturor tuplurilor care indeplinesc conditiile precizate in blocul de cerere;
DISTINCTROW – vizeaza inregistrari duplicate care nu vor fi returnate in urma executarii cererii;
WHERE – permite, prin precizarea unei expresii, exprimarea criteriului de selectie;
ORDER BY – precizeaza atributul dupa care se face ordonarea;
GROUP BY – folosit pentru a partitiona o relatie in grupuri, acordand acestora valori pe un atribut sau lista de atribute;
HAVING – folosit pentru a specifica criterii de selectie pe grupuri de tupluri.
Operatorii utilizati in blocurile de cereri
In construirea blocurilor de cereri se pot folosi urmatorii operatori:
operatori aritmetici: +, -, *, / etc.
operatori logici: and, or, not
operatori de atribute si comparare: >, <, =, <=, >=, <>
Comenzi SQL de control
Acordarea drepturilor unor utilizatori de a utiliza baza de date sau de a lucra cu obiecte ale bazei de date definite de alti utilizatori se realizeaza folosind comanda GRANT.
GRANT [CONNECT] [RESOURCE] TO utilizator,… [IDENTIFIED BY parola,…]
GRANT {privilegiu, privilegiu,…|ALL} ON tabela TO {utilizator|PUBLIC};
Prima sintaxa permite utilizatoului precizat in clauza TO sa se conecteze la baza de date, respectiv sa-si creeze propriile tabele.
Cea de-a doua sintaxa permite actiunile( privilegiile) de care dispune un utilizator sau toti utilizatorii( PUBLIC) aupra tabelei spacificate.
Anularea drepturilor acordate se realizeaza utilizand comanda REVOKE;
REVOKE {privilegiu,…|ALL} ON tabela FROM{utilizator,…|PUBLIC}
[2] [14] [19]
PHP
Introducere
PHP a fost conceput candva in toamna anului 1994 de catre Rasmus Lerdorf. Versiuni anterioare nepublicate erau folosite pe pagina lui pentru a tine evidenta celor ce se uitau la Curricullum Vitae. Prima versiune folosita de altii a fost disponibila in prima parte a anului 1995 si era cunoscuta sub numele “Personal Home Page Tools” . Era alcatuit dintr-un foarte simplistic motor parser ce intelegea doar cateva macrouri si cateva utilitare ce se foloseau atunci pe paginile web. Parserul a fost rescris pe la jumatatea anului 1995 si se numea PHP/FI Version 2. Numele de FI venea de la un alt pachet pe care Rasmus il scrisese care interpreta formuri html. El a combinat scripturile uilitarelor personal page cu Form Interpreter si a adaugat suport mySQL si astfel s-a nascut PHP/FI. PHP/FI a crescut in ritm uluitor si oamenii au inceput sa-si aduca contributia la codul lui.
Este dificil de dat statistici dar se estimeaza ca la sfarsitul lui 1996 PHP/FI se folosea pe 15000 de site-uri. La jumatatea lui 1997 numarul crescuse pana la 50000. La jumatatea lui 1997 s-a facut o schimbare la dezvoltarea PHP-ului, in micul proiect al lui Rasmus a devenit lucrarea a unui grup de oameni. Parserul a fost rescris de la zero de catre Zeev Suraski si Andi Gutmans si el a format baza pentru php versiunea 3. Mult cod a fost pastrat din PHP/FI si mult a fost rescris.
Ultima versiune PHP4 foloseste motrul de scripting Zend pentru o mai mare performanta suporta si o mai larga libertate de librarii si extensii si ruleaza ca un modul nativ de server pe toate serverele web cunoscute. Astazi php3 sau php4 se livreaza cu un numar de produse comerciale cum ar fi Red Hat's Stronghold web server. In momentul de fata se foloseste php-ul pe 5.100.000 de site-uri.Aceasta inseamna putin mai mult decat numarul de site-uri pe care ruleaza serverul Microsoft's IIS ( acesta din urma ruland pe 5030000 site-ri).
PHP este un limbaj de scripting inserat in html pentru partea de server.
<html>
<head>
<title>Example</title>
</head>
<body>
<?php
echo "Hi, I'm a PHP script!";
?>
</body>
</html>
Se observa cat de diferit este acesta de un script CGI scris in alte limbaje ca Perl sau C –in loc de a scrie un program cu multe comenzi pentru a genera cod HTML se scrie un script HTML cu ceva cod inserat in el pentru a face o anumita actiune( in acest caz de a scrie un text). Codul Php este inclus in taburile speciale de start si end ce permit intrarea si iesirea in modul php.
Lucrul care distinge PHP-ul de un alt limbaj( de exemplu JavaScrip) este ca codul este executat pe server. Daca ar exista un cod similar cu cel de mai sus pe server, clientul ar primi rezultatele executarii sciptului, dar nu si-ar da seama care este codul care genereaza.Se poate chiar configura serverul de web ca sa proceseze toate fisierele html cu php, astfel incat utilizatorii nu pot vedea sursele paginii.
Potentialul limbajului PHP
La nivelul cel mai de baza, PHP face ce face orice alt program CGI, ca de exemplu sa conecteze date, sa genereze pagini dinamice, sa trimita si sa primeasca cookies. Probabil ca cea mai puternica si mai importanta trasatura a PHP-ului este faptul ca suporta o mare varietate de baze de date. Urmatoarele baze de date sunt suportate in prezent:
Tabel 2
De asemenea php-ul poate comunica cu alte servicii folosind protocoale ca: IMAP, SNMP, NNTP, POP3, HTTP si multe altele.
1. <? echo ("this is the simplest, an SGML processing instruction\n"); ?>
2. <?php echo("if you want to serve XHTML or XML documents, do like this\n"); ?>
3. <script language="php">
echo ("some editors (like FrontPage) don't
like processing instructions");
</script>
4. <% echo ("You may optionally use ASP-style tags"); %>
<%= $variable; # This is a shortcut for "<%echo .." %>
Sunt patru moduri de a iesi din html si a intra in modul php:
Primul mod este disponibil doar daca optiunea de marcaje scurte( short tags) a fost activata. Aceasta poate fi facuta activand in php config file, optiunea short open tags. A doua metoda este metoda preferata in general deoarece permite noi generatii de xhtml sa fie implementate usor cu php. Al 4-lea mod este disponibil doar daca marcajele tip asp au fost actiate folosind setarea de configurare asp tags.
Instructiunile sunt separate ca in C sau Perl adica cu caracterul ”;”. Marcajul de incheiere(?>) indica sfarsitul instructiunii.
Descrierea limbajului
Numere intregi
Pot fi specifiate folosind una din urmatarele sintaxe:
$a = 1234; # numar zecimal
$a = -123; # numar negativ
$a = 0123; # numar octal
$a = 0x12; # numar hexazecimal
Marimea unui intreg este dependenta de platforma pe care ruleaza desi valoarea maxima de 2 miliarde este cea obisnuita adica valoarea pe 32 biti.
Numere cu virgula mobila
Numerele cu virgula mobila(double) pot fi specificate folosind una din urmatoarele sintaxe:
$a = 1.234;
$a = 1.2e3;
Marimea unui numar cu virgula mobila este dependenta de platforma pe care ruleaza desi valoarea maxima de 1.8e308 cu precizie de 14 cifre este valoarea obisnuita( format IEEE pe 64 biti).
Sirurile
Pentru siruri sunt doua seturi de delimitare. Daca sirul este inclus intre ghilimele, variabilele sirului vor fi expandate. Ca si in C si Perl caracterul backslash poate fi folosit pentru a specifica caractere speciale:
Tabel 3
Vectori
PHP suporta vectori scalari si asociativi. De fapt nu exista nici o diferenta intre cei doi. Se poate crea un vector folosind functiile list sau array sau se poate seta explicit fiecare valoare a elementelor vectorului.
$a[0] = "abc";
$a[1] = "def";
$b["foo"] = 13;
Se poate crea un vector adaugand valori vectorului. Cand se asigneaza o valoare unui variabile tip vector nedand niciun argument, valoarea va fi adaugata la sfarsitul vectorului.
$a[ ] = "hello"; // $a[2] == "hello"
$a[ ] = "world"; // $a[3] == "world"
Operatori aritmetici
Adunarea operatorilor
Tabel 4
Compararea operatorilor
Tabel 5
Incrementarea/Decrementarea operatorilor
Tabel 6
Operatori logici
Tabel 7
Prezentarea instructiunilor
In acest capitol se vor prezenta instructiunile utilizate in acest proiect.
Instructiunea if – else
if (expr)
statement
Sintaxa:
Daca evaluarea expr este TRUE, atunci PHP executa statement iar daca evaluarea este FALSE atunci va ignora statement.
In continuare se va prezenta un exemplu concret:
if ($a > $b)
print "acesta este un exemplu";
Daca sunt mai multe statement de executat, atunci instructiunea if ca arata ca mai jos:
if ($a > $b) {
print "a este mai mare ca b";
$b = $a;
}
Instructiunea if-else permite programarea unei structuri de decizie in care o conditie( rezultatul evaluarii unei expresii) determina:
executarea sau nu a unei secvente de intructiuni;
executarea unei secvente in doua alternative.
if ($a > $b) {
print "a este mai mare decat b";
} else {
print "a nu este mai mare decat b";
}
Instructiunea while
Instructiunea while permite programarea ciclurilor cu test
while (expr)
statement
Instructiunea se executa de mai multe ori cat timp conditia testata( expr) este adevarata( nenula).
$i = 1;
while ($i <= 10)
{
print $i++;
}
Instructiunea for
Instructiunea for are o definitie care ii extinde mult domeniul de aplicare. Ea ofera cea mai compacta metoda de programare a ciclurilor cu test initial, motiv pentru care este cel mai des folosita.
for (expr1; expr2; expr3)
statement
Aceasta forma reprezinta de fapt forma compactizata a unui ciclu while. Efectul este similar cu al secventei:
expresie1;
while(expresie 2)
{
instructiune
expresie3;
}
Rolurile celor trei expresii sunt definite in felul urmator:
expresia1 se evalueaza o singur data, inaintea primei iteratii, pentru a efectua initializarile necesare;
expresia 2 este evaluata si testata inaintea fiecarei iteratii si reprezinta conditia de iesire din ciclu;
expresia 3 se evalueaza la sfarsitul fiecarei iteratii, pentru actualizarea parametrilor ciclului.
Instructiunea break
Instructiunea break se utilizeaza numai in doua contexte:
in instructiunea swich, pentru a marca incheierea secventei de instructiuni asociate unui selector case si iesirea din instructiunea switch.
in instructiunile de ciclare, pentru a determina iesirea fortata dintr-un cilu while, do-while sau for, indiferent de valoarea conditiei de ciclare.
HTML
HTML este prescurtarea de la Hyper Text Mark-up Language si este codul care sta la baza paginilor web.
Paginile HTML sunt formate din etichete sau tag-uri si au extensia .html sau .htm. In marea lor majoritate aceste etichete sunt pereche, una de deschidere <eticheta> si alta de inchidere </eticheta>. browserul interpreteaza aceste etichete afisand rezultatul pe ecran. HTML-ul nu este un limbaj case sensitiv (nu face deosebirea intre litere mici si mari).
Pagina principala a unui domeniu este fisierul index.html. Aceasta pagina este setata a fi afisata automat la vizitarea unui domeniu. De exemplu la vizitarea domeniului
Taguri de baza HTML
Cele mai importante taguri in HTML sunt tagurile care definesc anteturile, paragrafele si intreruperile de rand.
Tabel 8
Structura documentelor HTML
HTML foloseste o multime de elemente pentru structurarea celor afisate, cum ar fi text bold sau italic.
Tabel 9
Caractere speciale HTML
Un caracter special are trei parti: un prefix (&); caracterul sau un # si un numar si la sfarsit un punct si o virgula (;).
Cele mai intalnite caractere speciale sunt:
Tabel 10
Alte caractere frecvent folosite:
Tabel 11
Ancore HTML
HTML foloseste un hiperlink pentru a se lega de alt document web.
Tagurile link-urilor si targets:
Tabel 12
Cadre HTML
Cu ajutorul cadrelor, se poate afisa mai mult de o pagina web in aceeasi fereastra de browser. Fiecare document HTML poarta numele de cadru (frame) si fiecare cadru este independent de celelalte.
Tabel 13
Tabele HTML
Tabelele se definesc cu tagul <table>. Un tabel este divizat in randuri (cu ajutorul tagului <tr>) si fiecare rand este impartit in celule de date (cu ajutorul tagului <td>). Td inseamna "table data" si este continutul unei celule de date. O celula de date poate contine text, imagini, liste, paragrafe, formulare, linii orizontale, tabele etc.
Tabel 14
Liste HTML
O lista neordonata incepe cu tagul <ul>. Fiecare termen al listei incepe cu tagul <li>. O lista neordonata este o lista de itemi.
Tabel 15
Formulare HTML
Formularele HTML sunt folosite pentru a selecta diferite moduri de introducere a datelor de catre utilizator.
Tabel 16
Imagini HTML
In HTML, imaginile se definesc cu tagul <img>. Tagul <img>este gol, adica are doar atribute si nu are tag de inchidere. Pentru a afisa o imagine pe o pagina, trebuie sa folositi atributul src. Src inseamna "sursa". Valoarea acestui atribut este adresa imaginii pe care vreti s-o afisati pe pagina. URL-ul duce catre locatia unde imaginea este stocata.
Tabel 17
Standardul CSS
CSS este un acronim provenind din Cascading Style Sheets, care inseamna "foi de stil in cascada". In documentele W3C, CSS nu e definit ca un nou limbaj, ci ca un mecanism care permite formatarea documentului HTML. CSS-ul nu exclude HTML-ul din pagina web. Nu se poate realiza o pagina web folosind numai CSS, care a fost proiectat astfel incat sa conlucreze cu HTML-ul.
Stilurile pun la dispozitia creatorilor de site-uri web noi posibilitati de personalizare a paginilor HTML. Un stil reprezinta un mod de formatare exacta a unui bloc de text (spre exemplu anumite caracteristici pentru font, marime, culoare, aranjare in pagina, distantare fata de margini etc).
Folosind CSS, se ajunge la un control mai fin asupra paginii web, la scaderea dimensiunii in octeti a paginii web, atunci cand codul CSS e continut intr-un fisier extern. Modificand fisierul CSS extern, modificam simultan toate paginile web in care acesta e inclus. Se pot crea efecte mai sofisticate decat cele produse de codul HTML: suprapunerea unei imagini peste alta imagine, a unui text peste alt text, impresia de relief, efectul hover, afisarea unor fonturi mai mari decat h1 etc.
In documentul HTML, codul CSS poate fi introdus in mai multe moduri:
1. Codul CSS e prezent in pagina web, iar efectul sau se aplica asupra intregului document.
<html>
<head>
<style>
b {color:red;}
i {color:blue;}
</style>
</head>
<body>
<p align=center><b>Introducere in CSS</b></p>
<p><i>Aceasta sectiune se adreseaza celor ce cunosc deja HTML-ul. </i></p>
</body>
</html>
Consecinta: Orice text cuprins intre <b>si </b> va fi afisat cu rosu, oriunde s-ar afla in document. Orice text afisat cu italice va fi de culoare albastra. Se observa ca introducerea codului CSS in head duce la marirea dimensiunii in octeti a fisierului.
Eticheta <style> anunta browserul ca urmeaza codul CSS, iar </style> ca a luat sfarsit codul CSS.
2. Codul e prezent in pagina web, iar efectul sau se aplica elementelor izolate.
<html>
<head>
</head>
<body>
<a href="Intro.htm" style="color:red;">Introducere</a>
<a href="A.htm" style="color:green;">Partea I</a>
<a href="B.htm" style="color:blue;">Partea a II-a</a>
</body>
</html>
Se observa ca nu mai avem, in acest caz, o eticheta <style>, ci un atribut style al etichetei <a>. Orice eticheta HTML poate beneficia de acest atribut. Pentru formatarea unor portiuni mari de text, puteti folosi containerele div sau span. Totusi, aceasta abordare nu satisface principiul separarii codului CSS de textul afisat in browser.
3. Codul CSS se afla intr-un fisier extern, cu extensia css. Efectul sau se aplica intregului document.
<html>
<head>
<link rel=StyleSheet href="x.css" title="Setarea link-urilor" type="text/css">
</head>
<body>
<a href="Intro.htm">Introducere</a>
<a href="A.htm">Partea I</a>
<a href="B.htm">Partea a II-a</a>
</body>
</html>
Fisierul extern poate fi scris in Notepad si salvat cu extensia css. Includerea sa in pagina web se face folosind tag-ul <link>, care trebuie sa se afle intre <head>si </head> (in antetul paginii).
Fisierul x.css poate contine urmatorul cod:
body { color: blue;}
a {color: red; text-decoration: none;}
Consecinta va fi afisarea cu fonturi albastre a intregului text, exceptand link-urile, care vor fi colorate in rosu.
Observatie:
Intr-un fisier html, pot fi incluse astfel oricate alte fisiere cu extensia css, htm, html sau pdf. Aceasta metoda de includere a CSS-ului in pagina web e mai avantajoasa ca primele doua. Codul CSS introdus astfel conlucreaza cu cel scris direct in pagina.
4. Documentul CSS se poate importa in pagina web.
<html>
<head>
<style>
@import url(http://www.exemplu.ro/x.css);
</style>
</head>
<body>
</body>
</html>
Importul trebuie declarat imediat dupa tag-ul <style>, inaintea oricarei alte linii de cod. In exemplul alaturat, s-a realizat importul in pagina curenta a fisierului x.css din site-ul www. exemplu.ro. Desigur, fisierul importat poate avea si o adresa relativa.
Sintaxa CSS este alcatuita din trei parti: un selector, o caracteristica si o valoare. Selectorul este elementul/tagul pe care vreti sa-l definiti, caracteristica este atributul pe care doriti sa-l schimbati si fiecare caracteristica poate lua o valoare. Caracteristica si valoarea sunt separate de semnul (:) si sunt incadrate de acolade:
body {color: black}
Daca doriti sa specificati mai mult de o caracteristica, trebuie sa separati fiecare caracteristica cu semnul (;). Exemplul de mai jos arata cum sa definiti un paragraf aliniat central, cu culoarea rosie a textului:
p {text-align: center; color: red}
Pentru a intelege mai bine aceasta definitie de stil, puteti descrie o caracteristica pe fiecare rand, ca in exemplul urmator:
p {
text-align: center;
color: black;
font-family: arial
}
Atributul class
Cu acest atribut puteti defini stiluri diferite pentru acelasi element. Sa zicem ca vreti doua tipuri de paragrafe in documentul dvs: unul aliniat la dreapta si unul centrat. Iata cum puteti face asta cu stiluri:
p.right {text-align: right}
p.center {text-align: center}
Trebuie sa folositi atributul class in documentul dvs. HTML:
<p class="right">
Acest paragraf va fi aliniat la dreapta.
</p>
<p class="center">
Acest paragraf va fi aliniat pe centru.
</p>
Atributul id
Atributul id trebuie sa fie unic pe pagina. Nu poate exista decat un element cu un id dat intr-un document. El este marcat in documentul HTML cu id in loc de class:
<p id="intro">
Acest paragraf va fi aliniat la dreapta.
</p>
Atributul id poate fi definit in doua moduri. Poate fi definit pentru a se potrivi tuturor elementelor cu un id specific sau sa se potriveasca numai unui element cu un id specific. In exemplul urmator, atributul id se va aplica tuturor elementelor cu id= "intro":
#intro {
font-size:110%;
font-weight:bold;
color:#0000ff;
background-color:transparent
}
Optimizare pentru motoare de căutare
„Search Engine Optimization” (SEO, în română optimizare pentru motoare de căutare) este o subcategorie a marketing-ului online, practică apărută în anul 1990, odată cu apariția primelor site-uri pe Internet, și care reprezintă totalitatea tehnicilor prin care un site web este adus la o formă în care este propulsat mai sus în lista de rezultate date de un motor de căutare pentru diverse cuvinte-cheie. Cu timpul, optimizarea unei pagini web a unui site a devenit un serviciu oferit de unele companii și/sau corporații.
Pentru a putea obtine rezultate multumitoare la cautarile pe motoare de cautare, ar trebui sa detineti o setie de informatii sumare in legatura cu anumite elemente si aplicatii necesare in practicare SEO pentru site-urile Web, cum ar fi:
Stapanirea si alegerea corecta de cuvinte cheie potrivite domeniului de activitate a site-ului Web pe care il detineti; Cuvintele cheie alese pentru crearea de continut optimizat pentru motoare de cautare tinand cont de domeniul de activitate pe care site-ul Web il prezinta.
Realizarea site-urilor Web cu o anumita accesibilitate Web, astfel incat o gama larga de vizitatori sa poata avea acces la site-ul dumneavoastra, in special persoanele cu handicap care pot crea un numar consideratil de vizite.
Ce este Page Rank ? Cum putem obtine Page Rank si ce repercurisiuni poate avea el asupra unu site Web.
Care sint factorii de evaluare in optimizare si cum puteti evita anumite penalitati SEO cunoscand relatia negativa dintre motoarele de cautare si SPAM-ul creat in scopuri imediate, dar fara un efect scontat de durata.
Care sint acele garantii SEO ce va pot oferi siguranta si ce intrebari pentru un potential client SEO ar putea pune un prestator de servicii SEO. Cunoastrea domeniului in care doriti sa angajati o persoana, va poate scuti de unele neplaceri.
Intelegerea conceptului de inscriere in directoare Web si confuzia facuta cu inscrierea in motoare de cautare sau inscrierea in Google, inscriere in Yahoo!. Site-urile se inscriu in directoare web si nu in motoare de cautare.
Ce implica procesul de validare HTML (textul din Tag-ul title, elementele HTML|Tag-urile HTML, stributele ALT pentru imagini, titlul link-urilor) in raportul direct cu vizitatorii, browsere, motoare de cautare, etc. Un moft al webmasterilor sau o neintelegere a termenilor si utilitatii unei astfel de aplicatii.
Cuvintele cheie sint o modalitate de a gasi rezultate relevante prin intermediu motoarelor de cautare. Aceste cuvinte cheie sint folosite de catre utilizatori, spre a descrie ceea ce acestia ar dori sa gasesca pentru o cautare dupa cuvinte cheie. Se creeaza o stare reala de cerere/nevoie in timp real al utilizatorilor de care webmasterii ar trebui sa stie sa profite, prin optimizarea dupa cuvinte cheie. Rezultatul final se rezuma la aducerea de utilizatori, veniti de pe motoarele de cautare, potentiali clienti, cresteri de vanzari (pentru site-urile Web comerciale) si o recunoastere ca firma/brand.
Utilitare folosite
Photoshop
Photoshop este un software folosit pentru editarea imaginilor digitale pe calculator, program produs și distribuit de compania americană Adobe și care se se adresează în special profesioniștilor domeniului.
Date curente
Adobe Photoshop, așa cum este cunoscut astăzi, este vârful de lance al gamei de produse software pentru editare generică de imagini fotografice digitale, grafică pentru tipar și Web de pe piață. Photoshop este un program cu o interfață intuitivă și care permite o multitudine extraordinară de modificări necesare în mod curent: editări de luminozitate și contrast, culoare, focalizare, aplicare de efecte pe selecții și nu numai, retușare de imagini degradate, număr arbitrar de canale de culoare, suport de canale de culoare pe 8, 16 sau 32 biți, efecte third-party etc. Există situații specifice pentru un profesionist în domeniu când alte pachete duc la rezultate mai rapide, însă pentru prelucrări generale de imagine, întrucât furnizează instrumente solide, la standard industrial, Photoshop este efectiv indispensabil.
Alături de aplicația Photoshop (ajuns la versiunea CS4), este inclusă și aplicația ImageReady, cu un impresionant set de instrumente Web pentru optimizarea și previzualizarea imaginilor (dinamice sau statice), prelucrarea pachetelor de imagini cu ajutorul sistemului droplets-uri (mini-programe de tip drag and drop) și realizarea imaginilor rollover (imagini ce își schimbă aspectul la trecerea cu mouse-ul peste), precum și pentru realizarea de GIF-uri animate.
Istorie
Prima versiune a programului a fost distribuită în februarie 1990 de către frații Knoll, Thomas și John.
Povestea începe cu tatăl lor, profesorul de liceu Glenn Knoll, pasionat de fotografie. Cei doi băieți au ajuns cu timpul să aibă oarecare interese în domeniul în plus, atât Glenn cât și cei doi copii au ajuns să fie pasionați de calculatoare încă din 1978 când au cumpărat un calculator produs de Apple Computer. În 1987 Thomas a cumpărat unul dintre modelele noi de Apple, un Apple Macintosh Plus, pentru a-l ajuta la scrierea lucrării de doctorat, "prelucrarea imaginilor digitale". Dezamăgit de faptul că nu putea afișa tonurile de gri din imagini, Thomas a început să scrie cod care să le simuleze pe afișaj. În vacanța pe care au petrecut-o împreună, fratele său John a fost fascinat de rezultatele muncii lui Thomas în această privință, mai ales că aceste rutine semănau în mod izbitor cu uneltele de editare deja existente în programul Pixar – John lucra la Industrial Light and Magic. Acest interes comun s-a concretizat în decizia celor doi de a încerca să creeze un pachet grafic pentru calculatoare personale.
Prima versiune a rezultatului muncii celor doi frați se numea "Display"; încet-încet, datorită necesităților apărute pe parcurs, chiar această primă versiune includea import-export de diverse formate și chiar corecție gamma. În 1988 acest pachet a ajuns să se numească "ImagePro", și cei doi au început să încerce să creeze o bază comercială pentru crearea unei afaceri: soția lui Thomas deja aștepta un copil, iar el încă lucra cu fratele său la dezvoltarea acestui program în continuare personal. La începutul lui 1988, Thomas a decis să-și mai acorde șase luni pentru a finaliza o versiune beta a acestui program înainte de a-și căuta o slujbă, urmând ca John să-și încerce apoi norocul în Silicon Valley pentru a-l vinde unei firme suficient de mari ca să asigure distribuția și dezvoltarea ulterioară. În general, companiile din Silicon Valley nu au fost foarte interesate de acest pachet: o singură companie, BarneyScan a arătat ceva interes și a distribuit programul, deja numit "Photoshop", pe termen scurt, împreună cu scannerele lor, fără costuri suplimentare pentru clienți. În total 200 de copii ale programului au fost distribuite în acest fel. Firma SuperMac a refuzat colaborarea cu cei doi fiindcă nu li s-a părut că Photoshop ar aduce ceva nou față de propriul lor program de editare, PixelPaint.
Abia în septembrie 1988 frații Knoll au reușit să-și atingă scopul: au trezit interesul firmei Adobe după o prezentare a programului și acestora le-a plăcut. Au semnat un contract de licențiere a Photoshop către Adobe, iar după încă zece luni de dezvoltare au apărut, în februarie 1990 Photoshop 1.0.
Thomas încă este implicat în proiectul Photoshop – n-a reușit să-și termine niciodată teza de doctorat. John și-a continuat cariera la ILM, participând printre altele la proiecte mari ale acestora, incluzând părți din proiectele Mission Impossible, Star Trek și Star Wars. Glenn continuă să fie profesor.
Avantaje
Principalele elemente prin care Photshop se diferențiază de aplicațiile concurente și prin care stabilește noi standarde în industria prelucrării de imagini digitale sunt:
Selecțiile
Straturile (Layers)
Măștile (Masks)
Canalele (Channels)
Retușarea
Optimizarea imaginilor pentru Web
Ultimele instrumente
Camera RAW: Instrumentul oferă acces rapid și facil la imaginile tip RAW produse de majoritatea camerelor foto digitale profesionale și de mijloc. Camera RAW se folosește de toate detaliile acestor fișiere pentru a obține un control total asupra aspectului imaginii, fără a modifica fișierul în sine.
Adobe Bridge: Un browser complex, de ultimă generație, ce simplifică gestionarea fișierelor, poate procesa mai multe fișiere de tip RAW în același timp și pune la dispoziția utilizatorului informația metadata de tip EXIF etc.
Multitasking: Adobe introduce posibilitatea de a folosi toate aplicațiile sale din suita "Creative suite 2" în sistem multitasking.
Suport High Dynamic Range (HDR) pe 32 biți: Crează și editează imagini pe 32 biți, sau combină cadre fotografice de expuneri diferite într-una ce include valorile ideale de la cele mai intense umbre până la cele mai puternice zone de lumină.
Shadow/Highlight: Îmbunătățește contrastul fotografiilor subexpuse sau supraexpuse, inclusiv imagini CMYK, păstrând în continuare echilibrul vizual al imaginii.
Vanishing Point: Oferă posibilitatea de a clona, picta sau lipi elemente ce automat se transpun în perspectiva obiectelor din imagine.
Image Warp: Capacitatea de a deforma imaginile plane după o matrice ușor editabilă, folosind mouse-ul.
Corectarea deformărilor cauzate de lentile: Lens Distort corectează cu ușurință efectele obișnuite date de lentilele aparatelor foto precum cele cilindrice, sferice, tip pâlnie, "efectul de vignetă" (funcție de poziționarea față de lumină, colțurile fotografiilor sunt fie întunecate, fie luminate în contrast cu restul fotografiei) sau aberațiile cromatice.
Personalizarea aplicației:Posibilitatea de a personaliza orice scurtătură sau chiar funcțiile din meniul aplicației și posibilitatea de a salva modificările pentru fiecare mod de lucru în parte.
Control îmbunătățit al straturilor (layers): capacitatea de a selecta mai multe straturi în același timp.
Smart objects: abilitatea de a deforma, redeforma și a reveni la starea inițială a obiectelor fără a pierde din calitate.
PhpMyAdmin
Acesta este un pachet de scripturi php care ajuta sa gestionati baza de date folosind o interfata web.
In poza de mai jos va este aratat cum arata acest pachet de scripturi php numit phpMyAdmin.
Dupa ce s-a descarcat de pe internet ultima versiune de phpMyAdmin, se dezarhiveaza folderul in directorul www.
Se intra apoi in folderul phpMyAdmin si deschideti fisierul config.inc.php si se cauta si se editateaza liniile 84, 85 si 86 care arata cam asa:
$cfg['Servers'][$i]['auth_type'] = 'config'; // Authentication method (config, http or cookie based)?
$cfg['Servers'][$i]['user'] = 'root'; // MySQL user
$cfg['Servers'][$i]['password'] = ‘’; // MySQL password (only needed
Se modifica modul de autentificare si alegeti in loc de config, cookie astfel incat linia sa fie:
$cfg['Servers'][$i]['auth_type'] = 'cookie';
apoi se seteaza o parola pentru modul de autentificare.
Se cauta linia $cfg['blowfish_secret'] = ''; si se seteaza in interiorul ei un cuvant, de exemplu $cfg['blowfish_secret'] = 'baubau';
Dupa ce s-au facut aceste modificari, este recomandat ca in locul user-ului root, sa creati un altul cu mai putine drepturi. Se intra in phpMyAdmin ca root si se creaza un nou utilizator apoi setati-l in config.inc.php.
Se acceseaza apoi http://localhost/phpmyadmin si observati ca va cere un user si o parola pentru a se face autentificarea.
Se inrtoduc username root iar ca parola, se introduce cea setata de mai devreme.
Fara sa se faca vreo modificare in fisierul acesta de configurare, se acceseaza http://localhost/phpmyadmin dupa ce se pune folderul phpMyAdmin in www.
Dupa ce s-a incarcat pagina, se apasa pe legatura “Drepturi de acces” (daca interfata este in limba romana), iar daca este in engleza, se apasa pe “Privileges”. Acest buton se afla in mijlocul paginii. Se va incarca pagina cu drepturile de acces asupra MySQL-ului, apoi se apasati pe butonul incercuit in poza de mai jos.
Apoi dupa ce s-a incarcat urmatoarea pagina, unde apare ”Schimbare parola” se bifeaza ”Parola”, apoi se tasteaza parola dorita dupa care se apasa pe butonul „Executa”.
Dupa setarea parolei se merge la baza de date MySQL, urmatorul pas fiind intoarcerea la fisierul config.inc.php si sa ii setam parola in campul $cfg['Servers'][$i]['password'] = ‘’; si anume:
$cfg['Servers'][$i]['password'] = ‘parolamysql’;
O baza de date este coloana vertebrala a unui site dinamic. Ea este alcatuita din tabele care, la randul lor, sunt formate din inregistrari dispuse in campuri.
Dupa cum se vede, in prima poza apare baza de date cu numele “tutorial” cu tabela “formular”.
In a-II-a poza, apar inregistrarile (coloanele) din cadrul tabelei formular.
Un rand din baza de date se alcatuieste din:
1) Un nume, dupa cum vedeti in coloana camp. Acest nume nu poate contine spatiu.
2) O valoare tip care difera coloana la coloana.
Cele mai folosite tipuri sunt:
Tipuri numerice:
INT – Stocare octeti 4
BIGINT – 64 biti
Tipuri de sir:
CHAR – Interval 1-255 caractere
VARCHAR – Interval 1-255 caractere
Tipuri de text:
TEXT – Lungime maxima de caractere 65.535
LONGTEXT – Lungime maxima de caractere 4.294.967.295
Exemple de folosire phpMyAdmin
1) Crearea unei baze de date
Se acceseaza http://localhost/phpmyadmin/ se observa in mijloc, campul “Creaza baza de date noua” si se apasa butonul “Executa”
Se scrie numele bazei de date, dupa care apasati butonul “Creaza”.
In cazul de fata s-a ca exemplu, baza de date cu numele tutorial
Dupa ce s-a creat baza de date cu numele tutorial, se observa ca in partea stanga apare numele acesteia, iar in mijloc este scris textul “Nu s-a gasit nici un tabel in baza de date.”.
Pentru a adauga un tabel in baza noastra de date, trebuie sa complet campul “Creaza tabela noua in baza de date tutorial”
In casuta campul “Nume” se introduce numele tabelei ce va apare in baza de date tutorial, iar in casuta “Campuri” se introduce numarul de randuri ce le va avea aceasta tabela.
Sa luam ca exemplu: Nume: formular
Campuri: 4, apoi se apasa butonul Executa
Intorcandu-ne putin la cunostintele pe care le-am acumulat cu o pagina mai sus, vom observa ca apar campurile: “Camp”, “Tip”, “Lungime”. . .
O prima adaugare in orice baza de date, este bine sa fie un camp cu numele id, iar ca tip sa fie INT, si o setare speciala pentru aceasta prima linie din tabela noastra, este alegerea valorii auto_increment din categoria “Extra”, si apoi trebuie bifat optiunea primar
Se adauga pe rand in coloana “Camp” urmatoarele: nume , prenume , varsta.
Ca Tip pentru aceste 3 intrari, alegeti CHAR, apoi in coloana “Lungime/Setare” se adauga o valoare numerica, adica numarul de caractere maxime care sa poata intra in acel rand.
Exemplu: Pentru coloana camp cu valoarea “nume” o sa avem ca tip CHAR si lungime 30. Asta inseamna ca putem introduce un text mai mic sau egal cu 30 caractere.
Dupa ce s-au introdus datele precum am spus mai sus si am aratat in poze, se apasa butonul “Salveaza”.
In urmatoarele 2 poze se vede ca tabelul a fost creat, se arata comanda SQL, dupa care se listeaza aceasta tabela.
Dupa ce s-a creat baza de date cu numele tutorial si tabela cu numele formular, se pot adauga informatii in aceasta tabela.
Sus in pagina avem un meniu:
Se apasa pe butonul “Inserare”.
Se completeaza campul “Valoare” cu datele pe care doritm sa le introduceti in formular pentru fiecare in valorile casutei “Camp”, si anume:
Dupa ce ati adaugat informatii in casuta “Valoare”, se apasati butonul “Executa”.
La fel ca si in atunci cand am adaugat o tabela, ni se va arata sintaxa SQL.
Pentru a vizualiza datele adaugate in tabela formular, se apasa pe butonul “Navigare” din partea de sus a paginii.
[8][9][27]
DESCRIEREA SOLUTIEI ADOPTATE
Descriere generala
Realizarea site-ului a avut urmatoarele etape :
proiectarea in Adobe Photoshop a imaginii(design-ului) site-ului ;
dupa realizarea imaginii, s-a trecut la spargerea ei si includerea in HTML ; s-au definit active butoanele, s-au realizat link-urile, s-au creat spatii pentru text (tabele invizibile), spatii pentru reclama si totodata s-a creat standardul CSS pentru text(aceeasi marime, culoare, pentru editoriale, titluri, link-uri) ; la sfarsitul acestui pas putem spune ca avem template-ul pentru site-ul ce urmeaza a fi dezvoltat.
s-a proiectat baza de date, cu tabelele aferente si relatiile dintre ele, in functie de datele si rapoartele care aveau sa se ceara, urmarind sa contina :
produse;
cos de cumparaturi
detalii comanda
interfata administrare produse
interfata administrare reclama
implementarea aplicatiei in sine cu ajutorul limbajelor php si sql.
Pornind de la premisa ca proiectarea imaginii si crearea templatului nu prezinta un grad de dificultate ridicat, in continuare vom trata in detaliu doar proiectarea bazei de date, exploatarea acesteia cu sql si implementarea aplicatiei in sine cu php.
Proiectarea bazei de date
Pentru a dezvolta aceasta aplicatie vom avea nevoie de o serie de informatii pe care le vom stoca in doua baze de date numite templateshop si templateshopcore . Aceste informatii pot fi grupate in doua categorii: informatii necesare unei aplicatii de tip website (meta-informatii, titlul si continutul paginilor) si informatii necesare unui magazin (produse, comenzi, cumparatori).
In continuare vom prezenta tabelele acestor baze de date (structura si continutul acestora).
Baza de date:templateshop
Este baza de date creata pentru partea de template-uri de pe site.
tbpagini
Este tabela ce contine paginile template-urilor
id_pagina – identificatorul paginii
id_template – identificatorul template-ului
titlu_pagina – titlul paginii
descriere descrierea paginii
rank – gradul paginii
tbadministratori
Pentru a facilita manipularea informatiilor de pe site si a comenzilor din magazinul virtual am implementat o zona de administrare. Accesul in acesta zona se face pe baza unui username si a unei parole, date care sunt stocate in tabelul tbadministratori.
Campurile acestuia sunt urmatoarele:
id_admin – identificator administrator
username – numele administratorului
parola – parola administratorului
tbautori
Este tabela in care se retin numele autorilor template-urilor.
id_autor – identificator autor
nume_autor – numele autorului
tbcategorii
Este tabela in care se retin categoriile pe care sunt sortate template-urile
id_categorie – identificator categorie
nume – numele categoriei
descriere – descrierea categoriei
tborderlines
Este tabela in care se retin informatii despre tranzactiile efectuate catre clienti
id_orderline – identificator linie de comanda
id_template – identificator template
id_order – identificator comanda
tip_buy – tip de cumparare
pret – tip de pret
tborders
Este tabela in care se retin informatii despre clienti returnate din serviciul extern de plata
id_order – identificator comanda
orderdate – data comenzii
orderstate – situatia comenzii
email – email-ul de comanda
co_order_number – numarul de ordine
card_holder_name – numele detinatorului cardului de credit
street_adress – adresa beneficiarului
city – orasul beneficiarului
state – statul beneficiarului
zip – codul orasului beneficiarului
country – tara beneficiarului
phone – telefonul beneficiarului
credit_card_processed – cardul de credit procesat
total – suma totala
tbpoze
Este tabela in care se retin informatii despre pozele template-urilor
id_poza – identificatorul pozei
id_pagina – identificatorul paginii
nume_poza – numele pozei
descriere – descrierea pozei
titlu_poza – titlul pozei
objtype – tipul obiectului
rank – gradul pozei
id_poza_flash – identificatorul animatiei flash
tbpozeflash
Este tabela in care se retin informatii despre templaturile care folosesc animatie flash
id_poza-flash – identificatorul animatiei flash
dimensiune_x – dimensiunea x a animatiei flash
dimensiune_y – dimensiunea y a animatiei flash
nume_poza_flash – numele animatiei flash
tbsoftware
Este tabela in care se retin informatii despre tehnologia necesara utilizarii template-urilor achizitionate
id_software – identificatorul tehnologiei software necesare utilizarii template-ului
software – numele software-ului necesar pentru utilizarea template-ului
tbtemplates
Este tabela in care se retin informatii despre template-urile disponibile cumpararii
id_template – identificatorul template-ului
id_software – identificatorul tehnologiei software necesare utilizarii template-ului.
id_autor – identificatorul autorului template-ului
id_tip – identificatorul tipului template-ului
id_categorie – identificatorul categoriei din care face parte template-ul
cod – codul template-ului
downloads – numarul de downloaduri facute asupra template-ului respectiv
pret_full – pretul de cumparare unica al template-ului
pret_resell – pretul de cumparare ne-unica a template-ului
descriere – descrierea template-ului
poza – poza template-ului
available – disponibilitatea template-ului pentru cumparare
htmlsource – cod sursa html al template-ului
psdsource – sursa photoshop a template-ului
flashsource – sursa flash a template-ului
downloadaddress – adresa de download a template-ului
tbtipuri
Este tabela in care se retin tipurile de template-uri
id_tip – identificatorul tipului template-ului
tip – tipul template-ului
Baza de date: templateshopcore
Este baza de date creata pentru retinerea informatiilor de tip stiri, intrebari puse frecvent, articole ajutatoare si liste de mail.
tbarticole
Este tabela in care se retin articolele.
id_articol – identificatorul articolului
nume_articol – numele articolului
new – tag in functie de noutatea articolului
tbfaq
Este tabela in care se retin intrebarile puse frecvent
id_faq – identificatorul intrebarii puse frecvent
intrebare – intrebarea pusa frecvent
raspuns – raspunsul la intrebarea pusa frecvent
isfaq – stabileste daca intrebarea pusa intra la capitolul intrebari puse frecvent
tbparti_articol
Este tabela in care se retin partile unui articol
id_parte_articol – identificatorul unei parti a unui articol
titlu_articol – titlul articolului
text_articol – textul continut in articol
id_articol – identificatorul articolului
Exploatarea bazei de date si implementarea in php
Bazele de date prezentate anterior sunt exploatate cu ajutorul interogarilor sql. Astfel, in sectiunea de interfata cu utilizatorul, in majoritatea cazurilor s-au efectuat diferite extrageri de informatii (rapoarte), iar in sectiunea de adminsitrare s-au efectuat adaugari, modificari, stergeri de date.
Spre exemplu, pentru afisarea informatiilor din pagini se extrag date in functie de pagina curenta, pentru cautarea de template-uri se extrag din baza de date acele inregistrari care indeplinesc anumite conditii (cautarea se face dupa criterii bine definite – pret, categorie).
In sectiunea de administrare se gestioneza comenzile si clientii, se introduc produse noi (template-uri), se modifica cele deja existente sau se sterg cele care nu mai sunt disponibile. De asemenea, se actualizeaza continutul paginilor.
Rezultatele interogarilor sql ajung in cele doua sectiuni cu ajutorul limbajului de programare php. Un exemplu concret privind modul in care cu ajutorul php-ului rezultatul une I nterogari asupra unei baze de date ajunge in apliactie este uramtorul:
//returneaza FAQ
function GetFAQ()
{
$strsql = "SELECT * FROM tbfaq WHERE isfaq='da' ORDER BY id_faq ASC";
return $strsql;
}//GetFAQ
class FAQList
{
var $myDbObj;
var $m_sHTML;
function FAQList($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQ());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='#ancora_$rw[0]'>" . $rw[1] . "</td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQList
<table width="98%" border="0" cellspacing="2" cellpadding="3">
<tr>
<td align="left" valign="top" class="redmare">INTREBARI FRECVENTE </td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td align="left" valign="top" class="text">
Va recomandam sa vedeti lista noastra de F.A.Q.. Contine un set de intrebari detaliate pe care le-au pus clientii nostri si poate fi de un real folos daca deja ati cumparat un template sau tocmai planuiti asta.<br>
<?php
$list = new FAQList($m_objDb);
$list->ToScreen();
?>
</td>
</tr>
<?php
$rs = $m_objDb->execute(QueryHolder::GetFAQ());
while($rw=mysql_fetch_array($rs))
{
?>
<tr>
<td align="left" valign="top">
<?php
$det = new FAQDetaliu($rw[0],$m_objDb);
$det->ToScreen();
?>
</td>
</tr>
<?php
}//end while
?>
</table>
Structura relationala
Site-ul este construit pe baza urmatoarei scheme – bloc :
Prezentare aplicatie
Interfata cu utilizatorul
Pagina principala incepe cu imaginea de mai sus. In partea superioara se afla meniul de sectiuni, din care se pot accesa diferitele sectiuni ale magazinului. In partea dreapta se afla meniul cu template-uri promovate , din care se pot alege din template-urile propuse de autor. In partea centrala gasim campuri de cautare care ne ofera facilitatea de a gasi un anume template in functie de cod si pret. Tot in partea centrala gasim inceputul unor articole si tutoriale pe care le putem citi in intregime accesand sectiunea “articole si tutoriale gratis”
In secventa de cod de mai jos a fost creata partea de sus a site-ului (header.inc).
<table width="760" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="1" align="left" valign="top" background="../poze/bgpatratele.gif"></td>
<td align="left" valign="top"><table width="758" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td align="left" valign="top">
<table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td height="161" align="left" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="182" align="left" valign="top"><img src="../poze/logo.jpg" width="178" height="161" border="0" /></td>
<td width="287" align="center" valign="middle">
<table width="283" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="1">
<tr>
<td width="18" rowspan="2" align="center" valign="middle"><img src="../poze/intrebare.gif" border="0" /></td>
<td align="left" valign="middle" class="subtitles">De ce este ClubDesign folositor pentru tine?</td>
</tr>
</table></td>
</tr>
<tr>
<td align="left" valign="top" class="text">Pentru ca aici gasesti <b>template-uri de cea mai buna calitate</b> create de <b>designeri profesionisti.</b> Poti de asemeanea conta pe designeri in <b>personalizarea template-urilor</b> pentru ca ele sa arate asa cum vrei ! Nu ezita ! Ia un template !</td>
</tr>
</table>
</td>
<td align="center" valign="center">
<table border=0 width=100% cellspacing=2 cellpadding=2>
<!–<tr>
<td align=right valign=top height=48>
<table border=0>
<tr>
<td align=left valign=top>
<a href=# onclick='javascript:viewshoppingcart()'><img src="../poze/butviewcart.jpg" border=0></a>
</td>
</tr>
</table>
</td>
</tr>–>
<tr>
<td align=right valign=top class='textmic'><font class='redmare'>Important</font><br />Pentru managementul carucirului de cumparaturi ( retragere template-uri, golire carucior, schimbare a tipului de cumparare pentru un template anume, verificare) foloseste butonul View card !
</td>
<td align=left valign=top>
<a href=# onclick='javascript:viewshoppingcart()'><img src="../poze/butviewcart.jpg" border=0></a>
</td>
</tr>
</table>
</td>
</tr>
</table></td>
</tr>
<tr>
<td align="left" valign="middle"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td align="left" valign="bottom" bgcolor="#86C0FF" height=23 background="../poze/stelutemici.jpg" style="background-repeat:no-repeat;background-position:top right">
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=middle>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
<td align=left valign=middle class="linkblue"> <a class="linkblue" href='../index.php'>Acasa</a> </td>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
</tr>
</table>
</td>
<td align=left valign=middle>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=middle class="linkblue"> <a class="linkblue" href='about.php'>Despre</a> </td>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
</tr>
</table>
</td>
<td align=left valign=middle>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=middle class="linkblue"> <a class="linkblue" href='information.php'>Informatii & Suport</a> </td>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
</tr>
</table>
</td>
<td align=left valign=middle>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=middle class="linkblue"> <a class="linkblue" href='faq.php'>F.A.Q.</a> </td>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
</tr>
</table>
</td>
<td align=left valign=middle>
<table border="0" width="100%" cellspacing="0" cellpadding="0">
<tr>
<td align=left valign=middle class="linkblue"> <a class="linkblue" href="contact.php">Contact</a> </td>
<td align=left valign=top><img src="../poze/separator.gif" border=0></td>
</tr>
</table>
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td height="1" align="left" valign="top" bgcolor="#FFFFFF"></td>
</tr>
<tr>
<td align="left" valign="top"><table width="100%" border="0" cellspacing="0" cellpadding="0">
<tr>
<td width="125" align="left" valign="top"><a href="detalii_categorie.php?crit=free"><img src="../poze/butWebsite.jpg" width="125" height="29" border="0" /></a></td>
<!–<td width="125" align="left" valign="top"><img src="../poze/butLogo.jpg" width="125" height="29" border="0" /></td>–>
<td width="125" align="left" valign="top"><a href="template_customisation.php"><img src="../poze/butCustomization.jpg" width="125" height="29" border="0" /></td>
<td width="125" align="left" valign="top"><a href="custom_webdesign.php"><img src="../poze/butCustom.jpg" width="125" height="29" border="0" /></a></td>
<td width="125" align="left" valign="top"><a href="freetutorials.php"><img src="../poze/butFreeArticles.jpg" width="125" height="29" border="0" /></a></td>
<td> </td>
</tr>
<tr>
<td height="5" colspan="6" align="left" valign="top"></td>
</tr>
</table></td>
</tr>
</table></td>
</tr>
<tr>
<td align="center" valign="top">
Aceasta este apelata la inceputul fiecarui fisier (pagina noua):
<?
require_once "../utils/header.inc";
?>
De asemenea, exista fisierul footer.inc, fisier care are acelasi rol ca si header.inc:
</td>
</tr>
</table></td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td height="80" align="center" valign="middle"><table width="95%" border="0" cellspacing="1" cellpadding="2">
<tr>
<td align="right" valign="middle" class="subtitles">Harta site-ului:</td>
<td align="left" valign="middle" class="text"><a href="detalii_categorie.php?crit=free">Template-uri</a> | <a href="template_customisation.php">Personalizarea template-ului</a> | <a href="custom_webdesign.php">Design personalizat</a> | <a href="freetutorials.php">Tutoriale si articole gratis</a> |
<a href="about.php">Despre</a> | <a href="faq.php">F.A.Q.</a>
| <a href="contact.php">Contact</a> | <a href="../index.php">Acasa</a></td>
</tr>
<tr>
<td align="right" valign="middle" class="subtitles">informatii
& suport:</td>
<td align="left" valign="middle" class="text"><a href="freesampletemplate.php">Modele de template-uri gratis</a> | <a href="terms.php">Termini de utilizare</a>
| <a href="privacypolicy.php">Politica de confidentialitate</a> </td>
</tr>
<tr>
<td align="right" valign="middle" class="subtitles">Parteneri:</td>
<td align="left" valign="middle" class="text"><a href="http://www.bitexpert.com" target="_blank">Bitexpert
Software Solutions</a></td>
</tr>
</table></td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
</table></td>
<td width="1" align="left" valign="top" background="../poze/bgpatratele.gif"></td>
</tr>
</table>
</center>
</body>
</html
<?php
//===================================
//database constants used for connection to database
//===================================
define("cHOST", "localhost");
define("cDB", "templateshop");
define("cUSER", "");
define("cPWD", "");
//===================================
//database constants used for connection to core database
//===================================
define("cHOST_CORE", "localhost");
define("cDB_CORE", "templateshopcore");
define("cUSER_CORE", "");
define("cPWD_CORE", "");
Acest fisier apelat este fisierul in care sunt salvate date despre conectarea bazei de date. S-a recurs la aceasta metoda pentru a nu mai fi nevoit sa scriu de fiecare data conectarea la baza de date.
In continuare, vom prezenta implementarea in php a cautarii template-urilor dupa diferite criterii:
cautare template dupa cod
<tr>
<form name='frmSearch' method='POST' action='" . $asTarget . "'>
<td align='left' valign='top' class='bluetitles'>DUPA CODUL TEMPLATE-ULUI</td>
</tr>
<tr>
<td height='17' align='left' valign='top' class='text'>Introdu codul template-ului</td>
</tr>
<tr>
<td align='left' valign='top'><input name='txtTemplateCode' type='text' class='control' id='txtTemplateCode' size='10' maxlength='10' /></td>
</tr>
<tr>
<td align='left' valign='top' class='text'>
<input name='chkZeroDownloads' type='checkbox' id='chkZeroDownloads' />
0 downloads</td>
</tr>
cautare template dupa pret:
<tr>
<td align='left' valign='top' class='bluetitles'>DUPA PRET </td>
</tr>
<tr>
<td height='13' align='left' valign='top' class='text'>Introdu pretul:</td>
</tr>
<tr>
<td align='left' valign='top' class='text'>Min:
<input name='txtMinPrice' type='text' class='control' id='txtMinPrice' size='5' />
Max:
<input name='txtMaxPrice' type='text' class='control' id='txtMaxPrice' size='6' maxlength='6' />
USD </td>
</tr>
<tr>
<td align='left' valign='top' class='text'><input name='radPriceType' type='radio' value='regular' checked='checked' />
Pret normal<br /> <input type='radio' name='radPriceType' value='unique' />
Pret unic</td>
</tr>
</table></td>
</tr>
<tr>
<td align='left' valign='top' class='text'>
</td>
<td align='center' valign='middle' class='text'>
<input type='image' src='../poze/butSearch.jpg' border=0 /></form>
</td>
</tr>
Dupa ce cautam un template dupa unul din criteriile de cautare va aparea o pagina cu toate template-urile gasite. In dreptul fiecarui template vor fi notate : pretul obisnuit, pretul unic, codul template-ului si numarul de download-uri pana in momentul respectiv. In afara acestor informatii ni se ofera posibilitatea vizionarii detaliilor unui template sau a cumpararii acestuia : butonul ”Vezi” si butonul “Adauga”.
Daca dorim vizualizarea unui template ne sunt prezentate capturi in mai multe browsere (Internet Explorer, Mozilla FireFox ) precum si detalii legate de el (sursele disponibile, pretul).
In momentul in care hotaram sa cumparam un anume template (sau mai multe) acesta va fi adaugat in caruciorul de cumparaturi:
Caruciorul de cumparaturi are urmatoarele obtiuni: actualizare carucior, golire carucior, continuare cumparaturi, verificare. Daca hotaram ca am adaugat in carucior toate template-urile alese opatam pentru verificare. Ni se ofera apoi posibilitatea anularii comenzii (“vreau sa anulez cumpararea si sa ma intorc pe site”) sau continuarea procesului de cumparare (“continua cumpararea”). Alegand sa continuam cumpararea vom fi trimisi pe www.2checkout.com , site-ul care se ocupa cu efectuarea tranzactiilor bancare.
Dupa ce tranzactia a fost efectuata clientul va primi un email cu link-ul de unde va downloada template-ul(urile) comandate. Acest link este activ timp de 3 zile. Daca template-ul nu a fost dowloadat si link-ul a expirat acesta se poate reactiva.
De la achizitionarea unui template pana la realizarea unui site mai sunt multi pasi. Site-ul ofera si servicii suplimentare si ca urmare aveti suport total pentru a avea propriul site.
Toate informatiile necesare clientului care doreste sa personalizeze template-ul cumparat sunt disponibile pe site.
Administrare
Pagina de logare: sectiunea de administrare a site-ului este securizata . Aceasta a fost conceputa sa vina in ajutorul administratorului site-ului.
Fiind un site comercial cu date importante s-a implementat o prima pagina de autentificare, datele privind logarea fiind comparate cu date din baza de date.
Fragment din codul sursa pentru realizarea logarii este prezentat mai jos :
if(isset($_POST["butSubmit"]))
{
$m_objUser = $_POST["txtUser"];
$m_objParola = $_POST["txtPassword"];
if(Helper::isValidAdmin($m_objUser,$m_objParola,$m_objDbObj))
{
//set the session for login ok
$_SESSION["administrator"] = $m_objUser;
//header("Location:acasa.php?" . SID);
?>
<script language='javascript'>
GoToLocation("<?echo("acasa.php?" . SID);?>");
</script>
<?
}//end if is valid
else
{
?>
<br><br><br>
<br><br>
<center>
<font class='redmare'>Utilizator sau parola incorecta! Incerca din nou!</font><br><br>
<table border=0 width=300 class="bordertablecolor" cellpadding=3>
<tr>
<td align=left valign=middle colspan=2 class="titles">Pnoul de control</td>
</tr>
<tr>
<td align=right valign=middle class='text'><form action="<?=$_SERVER["PHP_SELF"]?>" method="POST">User:</td>
<td align=left valign=midle><input type='text' name='txtUser'></td>
</tr>
<tr>
<td align=right valign=middle class='text'>Parola:</td>
<td align=left valign=midle><input type='password' name='txtPassword'></td>
</tr>
<tr>
<td align=center valign=middle colspan=2><input type="submit" name="butSubmit" value="Login"></form></td>
</tr>
</table>
</center>
<?
}//end else
}//end if
else
{
?>
<br><br><br>
<br><br>
<center>
<table border=0 width=300 class="bordertablecolor" cellpadding=3>
<tr>
<td align=left valign=middle colspan=2 class="titles">Panoul de control</td>
</tr>
<tr>
<td align=right valign=middle class='text'><form action="<?=$_SERVER["PHP_SELF"]?>" method="POST">User:</td>
<td align=left valign=midle><input type='text' name='txtUser'></td>
</tr>
<tr>
<td align=right valign=middle class='text'>Parola:</td>
<td align=left valign=midle><input type='password' name='txtPassword'></td>
</tr>
<tr>
<td align=center valign=middle colspan=2><input type="submit" name="butSubmit" value="Login"></form></td>
</tr>
</table>
</center>
<?
}//end if
$m_objDbObj->close();
require_once "../utils/footer_admin.inc";
?>
Schema bloc a sectiunii administrare :
Dupa ce s-a realizat cu succes logarea, administratorul va fi directionat catre o pagina unde va gasi meniurile din sectiunea administrare :
Sectiunea template-uri vine in ajutorul administratorului cu modurile de adaugare, vizualizare, cautare si gasire a template-urilor finalizate sau in stadiu de finalizare.
Adaugare template-uri.
Aceasta sectiune permite administratorului site-ului sa adauge template-uri . Template-urile adaugate vor fi organizate in categorii. Administratorul are optiune de inserare poza, inserare sursa , informeaza clientul de cerintele de soft pentru rularea in conditii optime a site-ului achizitionat, de pret. Odata completate campurile formularului acestea pot fi salvate, informatiile merg in baza de date, iar din baza de date vor fi afisate pe site.
Lista template-uri:
In aceasta sectiune se face prezentarea tuturor template-urilor de pe site . Administratorul are posibilitatea de a face o cautare in baza de date in functie de optiunile prezentate in partea superioara a modulului. Mai departe sunt prezentate template-urile de pe site impreuna cu optiuni suplimentare : F/U (feature/unfeature) – optiune de promovare sau de anulare a promovarii template-ului pe site , Hide/unhide – optiune ce ascunde sau anuleaza ascunderea template-ului de pe site, pretul schimbarea pretului unic sau non-unic. Alaturi de aceste optiuni este prezentat codul template-ului si numarul de download-uri corespunzatoare template-ului.
Aceasta sectiune este binevenita deoarece ofera avantajul ca pentru a modifica anumite caracteristici ale unui template administratorul nu este nevoit sa stearga template-ul respectiv de pe site.
Sectiunea Gaseste template-uri nefinalizate vine in sprijinul administratorului site-ului astfel:
Prin conceptia site-ului arhivele aferente template-urilor nu ar fi avut loc aici astfel s-a folosit un host extern cu spatiu suficient pentru gazduire care sa tina arhivele template-urilor. Deoarece acest lucru presupune noi probleme cum ar fi existenta pozei template-ului fara a exista si arhiva template-ului propriu-zis spre downloadare , aceasta sectiune face verificarea existentei arhivei. De notat ar fi faptul ca numele arhivei a fost concatenat folosind MD5 din motive de securitate.Daca unui cod al unui template I-ar fi corespuns doar o arhiva cu codul si extensia arhivei unui potential cumparator I-ar fi fost foarte usor sa mai downloadeze si alte surse. Astfel cu numele concatenat se asigura securizarea download-ului catre client.
Sectiunea comenzi vine in ajutorul administratorului pentru efectuarea de vizualizari asupra comenzilor facute de clienti
Sectiunea lista comenzi permite adminstratorului sa vizualizeze situatia comenzilor la un anumit moment dat si sa execute operatii asupra bazei de date care contine informatii legate de comenzile facute. Se poate face o cautare in functie de anumite conditii si trimite email la clienti.
Sectiunea cautare comenzi permite cautarea comenzilor in functiede id-ul comenzii , data la care a fost facuta comanda, statusul comenzii sau email-ul unde a fost trimisa comanda.
Sectiunea e-zine vine in sprijinul administratorului in sensul ca poate sa adauge articole pe site prin accesarea meniului “adaugare articol”. Aceasta contine numele articolului, numele partii 1 din articol , cea care contine un preview al articolului, apoi numele partii a 2-a si continutul partii a 2-a ,cea care contine intreg articolul din preview-ul folosit de partea 1.
Sectiunea adaugare articol:
Sectiunea Diverse vine in sprijinul administratorului cu posibilitatea de a adauga intrebari si raspunsuri puse frecvent in sprijinul clientilor.
Sectiunea adauga intrebare contine campurile intrebare, raspuns, si campul care poate fi bifat in cazul in care intrebarea este de categorie frecventa sau nebifat daca este plangere.
Sectiunea lista faq contine intrebarile cu caracter frecvent adaugate anterior cu posibilitatea de a le sterge de pe site.
Sectiunea centru de ajutor vine in intampinarea unor intrebari cu caracter general puse asupra site-ului.
TESTAREA SI VALIDAREA REZULTATELOR
Printre problemele intalnite pe parcursul dezvoltarii acestui proiect am intalnit mai multe probleme printre care enumar : proiectarea unei baze de date optime pentru satisfacerea cerintelor din specificatiile aplicatiei, crearea unor interogari sql care sa nu solicite prea tare serverul bazei de date.
Pentru testarea si validarea aplicatiei este necesara introducerea de produse (template-uri) si urmarirea procesului de efectuare a cautarilor si a plasarii comenzilor cu produsele gasite. Astfel, se poate verifica corectitudinea functionalitatii aplicatiei.
Un alt paramentru testat a fost rapiditatea cu care un produs este gasit daca numarul de inregistrari este mare,deoarece un timp prea mare ar deveni deranjat pentru un potential client.
Proiectul prezentat de mine are aplicabilitate in lumea reala, deorace in ultimii ani s-a dezvoltat in ritm alert vanzarea online de produse, deoarece un magazin virtual prezinta multe avantaje fata de unul clasic. Pintre acestea cel mai important este ca un client poate efectua cumparaturi indiferent de ora sau locatie.
CONCLUZII
Aceasta aplicatie a fost realizata in ideea de schimba metoda clasica de abordare a unui magazin.
acces in orice moment;
posibilitate de cautare in interiorul magazinului;
rapiditate in gasirea unei informatii.
comoditate in cumpararea unui produs.
La construirea acestei aplicatii, s-au folosit anumite unelte software. Acestea au avut intaietate din urmatoarele considerente:
acces la documentatie;
limbaje care pt fi folosite fara licenta in scop didactic(php, html, sql);
ofera accesibilitate din orice punct (Intranet sau Internet);
ofera administrare zero pe client;
ofera incarcare mica a retelei.
Aplicatia se foloseste pe local, poate fi folosita si accesata de pe Internet, insa, poate fi folosita si intr-un Intranet.
BIBLIOGRAFIE
[1] Allen Brown, Alison Balter – Bazele de date Access, Editura TEORA,
București, 1998.
[2] Corina Pascu – Totul despre … SQL, Editura Tehnică, București, 1999.
[3] C. A. Giumale – Programare funcțională, Editura Tehnică, București, 1997.
[4] C. Ionescu, I. Zsako – Structuri arborescente cu aplicațiile lor, CET, ASE,
București, 1990.
[5] D. Fife, T. Hardgrave – Database concepts, South Western, 1986.
[6] D. M. Popovici, I. M. Popovici, I. Tănase – Tehnologia orientată pe obiecte.
Aplicații, Editura TEORA, București, 1996.
[7] E. Fernandez, R. Summers, C. Wood – Database security and integrity, 1981.
[8] Gheorghe Popa – Sisteme de gestiune a bazelor de date, Editura ALL,
București, 1999.
[9] Gh. Sabău, I. Lungu – Sisteme informatice și baze de date, CET, ASE,
București, 1993.
[10] Ileana Popescu – Baze de date relaționale, Editura Univ. București, 1999.
[11] Ilie Popa – Inginerie software pentru conducerea proceselor industriale,
Editura ALL, București, 1998.
[12] Ion Lungu, Constanța Bodea, Georgeta Bădescu, Cristina Ioniță – Baze de
date, Editura ALL, București, 1995.
[13] Ion Lungu – Baze de date relaționale, Editura ALL, București, 1998.
[14] Ion Lungu, N. Mușat, I. Roșca, Gh. Sabău – Limbajul SQL Plus, Editura ALL,
București, 1992.
[15] I. Kaufmann, I. Jurcă, D. Petriu, V. Crețu – Programarea în limbajul ADA, Editura FACLA, Timișoara, 1982.
[16] J. Darlington, P. Henderson, D.A.Turner – Functional programming and its applications, Cambridge Universitz Press, 1982.
[17] J. G. Hughes – Object Oriented Database, Practice Hall International Ltd, 1991.
[18] J. D. Ullman, J. Widom – A first course in Database Systems, Practice Hall, 1997.
[19] J. Perkins, B. Morgan – SQL, Editura TEORA, București, 1997.
[20] K, Jeffery – Experts Database Systems, Academic Press, Ldt. 1992.
[21] Kevin Marlowe – Utilizare Access 97, Editura TEORA, București, 1998.
[22] Kovacs Sandor – Access 97, ghid de utilizare, Editura Albastră, Cluj-Napoca,
1999.
[23] Michel Mauny – Functional Programming Using CAML Light – IRIA, 1991 (disponibil pe internet).
[24] Octavian Bâscă – Baze de date, Editura ALL, București, 1997.
[25] P. Rob, C. Coronel – Database Systems – Design, Implementation and Management, International Thomson Publishing Co., 1997.
[26] R. Heydth, D. Heydth – DB2 Database Design and Administration, John
Wiley & Sons,1989.
[27] T. Gant – Oracle Power Objects, Editura TEORA, București, 1998.
[28] W. Chen, P. Chen – Centralized and distributed data base systems, New York: IEEE Computer Society, 1989.
ANEXA
QueryHolder.obj
<?php
class QueryHolder
{
//changes the status of a picture to flash and adds the ID to the flash
function SetPictureToFlash($adPictureID,$adFlashID)
{
$strsql = "UPDATE tbpoze SET objtype='flash', id_poza_flash=" . $adFlashID . " WHERE id_poza=" . $adPictureID;
return $strsql;
}//SetPictureToFlash
//inserts the flash to a picture
function AddFlash($aiX,$aiY,$asNumePoza)
{
$strsql = "INSERT INTO tbpozeflash (dimensiune_x,dimensiune_y,nume_poza_flash) VALUES ('" . $aiX . "','" . $aiY . "','" . $asNumePoza . "')";
return $strsql;
}//AddFlash
//returns the flash by ID
function GetFlashByID($adIDPozaFlash)
{
$strsql = "SELECT * FROM tbpozeflash WHERE id_poza_flash=" . $adIDPozaFlash;
return $strsql;
}//GetFlashByID
//returns the articles for the index page
function GetArticlesForIndex()
{
$strsql = "SELECT * FROM tbarticole ORDER BY id_articol DESC LIMIT 0,3";
return $strsql;
}//GetArticlesForIndex
//adds an article part to the collection
function AddPart($asTitle,$asContent,$adIDArt)
{
$strsql = "INSERT INTO tbparti_articol(titlu_articol, text_articol, id_articol) VALUES ('" . $asTitle . "','" . $asContent ."','" . $adIDArt . "')";
return $strsql;
}//AddPart
//adds an article to the collection
function AddArticle($asTitle)
{
$strsql = "INSERT INTO tbarticole(nume_articol, new) VALUES ('" . $asTitle . "','da')";
return $strsql;
}//AddArticle
//selects the email from the newsletter table
function EmailExists($asEmail)
{
$strsql = "SELECT * FROM tbnewsletter WHERE email='" . $asEmail . "'";
return $strsql;
}//EmailExists
//adds the email to the database
function InsertNewsletter($asEmail)
{
$strsql = "INSERT INTO tbnewsletter (email) VALUES ('" . $asEmail . "')";
return $strsql;
}//InsertNewsletter
//returns the articles in the list in menu on the right side ususally
function GetArticlesBeside($adArticleID)
{
$strsql = "SELECT * FROM tbarticole WHERE id_articol<>" . $adArticleID . " ORDER BY id_articol DESC LIMIT 0,3";
return $strsql;
}//GetArticlesBeside
//returns the parts of an article by article id
function GetArticleDetailsByArticleID($adArticleID)
{
$strsql = "SELECT * FROM tbparti_articol WHERE id_articol=" . $adArticleID . " ORDER BY id_parte_articol ASC";
return $strsql;
}//GetArticleDetailsByArticleID
//returns the article by ID
function GetArticle($adID)
{
$strsql = "SELECT * FROM tbarticole WHERE id_articol=" . $adID;
return $strsql;
}//GetArticle
//returns all the articles
function GetAllArticles()
{
$strsql = "SELECT * FROM tbarticole ORDER BY id_articol DESC";
return $strsql;
}//GetAllArticles
//returneaza FAQ
function GetFAQ()
{
$strsql = "SELECT * FROM tbfaq WHERE isfaq='da' ORDER BY id_faq ASC";
return $strsql;
}//GetFAQ
//returneaza FAQHelp
function GetFAQHelp()
{
$strsql = "SELECT * FROM tbfaq WHERE isfaq='nu' ORDER BY id_faq ASC";
return $strsql;
}//GetFAQHelp
//returneaza un FAQ dupa ID
function GetFAQByID($adID)
{
$strsql = "SELECT * FROM tbfaq WHERE id_faq=" . $adID;
return $strsql;
}//GetFAQByID
//returneaza poza dupa ID
function GetPictureByID($adID)
{
$strsql = "SELECT * FROM tbpoze WHERE id_poza=$adID";
return $strsql;
}//GetPictureByID
//returneaza categoriile dintr-o categorie
function GetCategoriesOfCategory($adIDCategorie)
{
$strsql = "SELECT * FROM tbcategorii WHERE tbcategorii_id_categorie=$adIDCategorie";
return $strsql;
}//GetCategoriesOfCategory
//returneaza datele de preview
function GetPreviewTemplate($adIDTemplate)
{
$strsql = "SELECT * FROM tbtemplates WHERE id_template=$adIDTemplate";
return $strsql;
}//GetPreviewTemplate
//returns the templates that are not sold
function GetTemplatesNotSold()
{
$strsql = "SELECT * FROM tbtemplates WHERE available<>'sold'";
return $strsql;
}//GetTemplatesNotSold
//returns the templates from a category
function GetTemplatesFromCategory($adIDCategorie)
{
$strsql = "SELECT * FROM tbtemplates WHERE tbcategorii_id_categorie=$adIDCategorie ORDER BY id_template DESC";
return $strsql;
}//GetTemplatesFromCategory
//returns the templates from a category paged
function GetTemplatesFromCategoryPaged($adIDCategorie,$adStartingRecord)
{
$strsql = "SELECT * FROM tbtemplates WHERE tbcategorii_id_categorie=$adIDCategorie LIMIT $adStartingRecord," . cRECORDS_PER_PAGE;
return $strsql;
}//GetTemplatesFromCategoryPaged
//returns the pages from a template
function GetPagesOfTemplate($adTemplateID)
{
$strsql = "SELECT * FROM tbpagini WHERE tbtemplates_id_template=$adTemplateID ORDER BY rank ASC";
return $strsql;
}//GetPagesOfTemplate
//returns the pictures of a page
function GetPicturesOfPage($adPageID)
{
$strsql = "SELECT * FROM tbpoze WHERE tbpagini_id_pagina=$adPageID ORDER BY rank ASC";
return $strsql;
}//GetPicturesOfPage
//returns the category information
function GetCategoryByID($adCategoryID)
{
$strsql = "SELECT * FROM tbcategorii WHERE id_categorie=$adCategoryID";
return $strsql;
}//GetCategoryByID
//returns the first two featured templates
function GetFeaturedTemplates()
{
$strsql = "SELECT * FROM tbtemplates WHERE (isFeatured=1 AND available='free') LIMIT 0,2";
return $strsql;
}//GetFeaturedTemplates
//returns the software by ID
function GetSoftwareByID($adID)
{
$strsql = "SELECT * FROM tbsoftware WHERE id_software=" . $adID;
return $strsql;
}//GetSoftwareByID
//inserts the new order
function InsertOrder()
{
$strsql = "INSERT INTO tborders(orderdate,orderstate) VALUES (NOW(),'INIT')";
return $strsql;
}//InsertOrder
//adds lines to the order
function AddOrderLine($adOrderID,$adTemplateID,$aiTipBuy,$aiPrice)
{
$strsql = "INSERT INTO tborderlines(tbtemplates_id_template,tborders_id_order,tip_buy,pret) VALUES ('" . $adTemplateID . "','" . $adOrderID . "','" . $aiTipBuy . "','" . $aiPrice . "')";
return $strsql;
}//AddOrderLine
//completes the order
function SetOrderStateToEmail($adOrderID)
{
$strsql = "UPDATE tborders SET orderstate='EMAIL_ADDED' WHERE id_order=" . $adOrderID;
return $strsql;
}//SetOrderStateToEmail
//completes the order
function CompleteOrder($adCart_order_id,$asEmail,$as2COOrderNumber,$asCard_holder_name,$asStreet_address,$asCity,$asState,$asZip,$asCountry,$asPhone,$asCart_id,$asCredit_card_processed,$asTotal_processed)
{
$strsql = "UPDATE tborders SET orderstate='COMPLETED',email = '". $asEmail ."',co_order_number='" .$as2COOrderNumber. "',card_holder_name='". $asCard_holder_name ."',street_address='". $asStreet_address ."',city='". $asCity ."',state='" . $asState . "',zip='". $asZip ."',country='" . $asCountry . "',phone='" . $asPhone . "',credit_card_processed='" . $asCredit_card_processed . "',total='" . $asTotal_processed . "' WHERE id_order=" . $adCart_order_id;
return $strsql;
}//CompleteOrder
//completes the order
function AddEmailToOrder($adOrderID,$asEmail)
{
$strsql = "UPDATE tborders SET email='" . $asEmail . "' WHERE id_order=" . $adOrderID;
return $strsql;
}//AddEmailToOrder
//checks the login
function LoginCheck($asUser,$asParola)
{
$strsql = "SELECT * FROM tbadministratori WHERE (username='" . $asUser . "' AND parola='" . $asParola . "')";
return $strsql;
}//LoginCheck
//gets the software
function GetSoftware()
{
$strsql = "SELECT * FROM tbsoftware";
return $strsql;
}//GetSoftware
//inserts a template in RDB
function InsertTemplate($asDescription,$iCategID,$iTipID,$bHTML,$bPSD,$bFLA,$iSoftware,$bisFeatured,$iUPrice,$iRPrice)
{
$strsql = "INSERT INTO tbtemplates(descriere,tbcategorii_id_categorie,tbtipuri_id_tip,htmlsource,psdsource,flashsource,tbsoftware_id_software,isFeatured,pret_full,pret_resell) VALUES('" . $asDescription . "','" . $iTipID . "','" . $iCategID . "','" . $bHTML . "','" . $bPSD . "','" . $bFLA . "','" . $iSoftware . "','" . $bisFeatured . "','" . $iUPrice . "','" . $iRPrice . "')";
return $strsql;
}//InsertTemplate
function SetTemplateCodeAndPicture($adID,$asPoza)
{
$strsql = "UPDATE tbtemplates SET cod='T" . $adID . "',poza='" . $asPoza . "',downloadaddress='" . md5("T" . $adID) . ".zip' WHERE id_template=" . $adID;
return $strsql;
}//SetTemplateCode
//adds a page
function AddPage($asName,$adRank,$adID)
{
$strsql = "INSERT INTO tbpagini (tbtemplates_id_template,titlu_pagina,rank) VALUES('" . $adID . "','" . $asName . "','" . $adRank . "')";
return $strsql;
}//AddPage
//adds a picture to the page
function AddPicture($asName,$adRank,$adIDPage,$asTitle)
{
$strsql = "INSERT INTO tbpoze (tbpagini_id_pagina,nume_poza,titlu_poza,objtype,rank) VALUES('" . $adIDPage . "','" . $asName . "','" . $asTitle . "','picture','" . $adRank . "')";
return $strsql;
}//AddPicture
//features or unfeatures a template
function SetFeatured($aiYes,$adID)
{
$strsql = "UPDATE tbtemplates SET isFeatured=" . $aiYes . " WHERE id_template=" . $adID;
return $strsql;
}//SetFeatured
//features or unfeatures a template
function SetHidden($aiYes,$adID)
{
$strsql = "UPDATE tbtemplates SET available='" . $aiYes . "' WHERE id_template=" . $adID;
return $strsql;
}//SetHidden
//order by ID
function GetOrder($adOrderID)
{
$strsql = "SELECT * FROM tborders WHERE id_order=" . $adOrderID;
return $strsql;
}//GetOrder
//GetTemplatesFromOrder returns the templates
function GetTemplatesFromOrder($adOrderID)
{
$strsql = "select * from tbtemplates inner join tborderlines ON tbtemplates.id_template = tborderlines.tbtemplates_id_template WHERE tborderlines.tborders_id_order=" . $adOrderID;
return $strsql;
}//GetTemplatesFromOrder
//returns the search string from posted vars
function GetSearchCriteriaAdmin($aobjPost)
{
$strsql = "";
$bComplexCriterium = false;
if($aobjPost["txtTemplateCode"]!="")
{
$strsql = "SELECT * FROM tbtemplates WHERE (cod='" . $aobjPost["txtTemplateCode"] . "' AND available='')";
}//end if
else
{
if(is_numeric($aobjPost["txtMinPrice"])&&is_numeric($aobjPost["txtMaxPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell BETWEEN " . $aobjPost["txtMinPrice"] . " AND " . $aobjPost["txtMaxPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full BETWEEN " . $aobjPost["txtMinPrice"] . " AND " . $aobjPost["txtMaxPrice"];
}
}
elseif(is_numeric($aobjPost["txtMinPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell >=" . $aobjPost["txtMinPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full >=" . $aobjPost["txtMinPrice"];
}
}
elseif(is_numeric($aobjPost["txtMaxPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell <=" . $aobjPost["txtMaxPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full <=" . $aobjPost["txtMaxPrice"];
}
}
else
{
$bComplexCriterium = false;
$strsql = "SELECT * FROM tbtemplates";
}
//I add the search in zero downloads
if(isset($aobjPost["chkZeroDownloads"]))
{
if($bComplexCriterium==true)
{
if($aobjPost["chkZeroDownloads"]=="on")
{
$strsql .= " AND downloads=0";
}
}//end if $bComplexCriterium
else
{
if($aobjPost["chkZeroDownloads"]=="on")
{
$strsql .= " WHERE downloads=0";
}
}//end else
}
else
{
if($bComplexCriterium==true)
{
$strsql .= " AND available='free'";
}//end if $bComplexCriterium
else
{
$strsql .= " WHERE available='free'";
}//end else
}
}//end else
return $strsql;
}//GetSearchCriteriaAdmin
//returns the order search string from posted vars
function GetOrderSearchCriteriaAdmin($aobjPost)
{
$strsql = "";
$bComplexCriterium = false;
if($aobjPost["txtOrderID"]!="")
{
$strsql = "SELECT * FROM tborders WHERE id_order='" . $aobjPost["txtOrderID"] . "' ORDER BY orderdate DESC";
}//end if
else
{
if(checkdate($aobjPost["selLuna"],$aobjPost["selZi"],$aobjPost["selYear"])&&checkdate($aobjPost["selLunaTo"],$aobjPost["selZiTo"],$aobjPost["selYearTo"]))
{
$bComplexCriterium = true;
$strsql = "SELECT * FROM tborders WHERE orderdate>='" . $aobjPost["selYear"] . "-" . $aobjPost["selLuna"] . "-" . $aobjPost["selZi"] . " 00:00:00' AND orderdate<='" . $aobjPost["selYearTo"] . "-" . $aobjPost["selLunaTo"] . "-" . $aobjPost["selZiTo"] . " 23:59:59'";
}
if($bComplexCriterium==true)
{
if($aobjPost["selStatus"]!="undefined")
{
$strsql .= " AND orderstate='" . $aobjPost["selStatus"] . "'";
}
if($aobjPost["txtEmail"]!="")
{
$strsql .= " AND email='" . $aobjPost["txtEmail"] . "'";
}
}//end if $bComplexCriterium
else
{
if($aobjPost["selStatus"]!="undefined")
{
$strsql = "SELECT * FROM tborders WHERE orderstate='" . $aobjPost["selStatus"] . "'";
if($aobjPost["txtEmail"]!="")
{
$strsql .= " AND email='" . $aobjPost["txtEmail"] . "'";
}
}
else
{
if($aobjPost["txtEmail"]!="")
{
$strsql = "SELECT * FROM tborders WHERE email='" . $aobjPost["txtEmail"] . "'";
}
else
{
$strsql = "SELECT * FROM tborders";
}
}
}
$strsql .= " ORDER BY orderdate DESC";
}//end else
return $strsql;
}//GetOrderSearchCriteriaAdmin
//order by ID
function GetOrderLines($adOrderID)
{
$strsql = "SELECT * FROM tborderlines WHERE tborders_id_order=" . $adOrderID;
return $strsql;
}//GetOrder
//sells a template
function SetSold($adID)
{
$strsql = "UPDATE tbtemplates SET available='SOLD' WHERE id_template=" . $adID;
return $strsql;
}//SetSold
//sells a template
function IncrementDownloads($adDownloadNumber,$adID)
{
$strsql = "UPDATE tbtemplates SET downloads=" .$adDownloadNumber. " WHERE id_template=" . $adID;
return $strsql;
}//IncrementDownloads
//update the faq
function SaveFAQ($asQuestion,$asAnswer,$adID)
{
$strsql = "UPDATE tbfaq SET intrebare=\"" .$asQuestion. "\", raspuns=\"" . $asAnswer . "\" WHERE id_faq=" . $adID;
return $strsql;
}//updates the faq
//Adds faq
function AddFAQ($asQuestion,$asAnswer,$asisFAQ)
{
$strsql = "INSERT INTO tbfaq(intrebare,raspuns,isfaq) VALUES('" . $asQuestion . "','" . $asAnswer . "','" . $asisFAQ . "')";
return $strsql;
}//AddFAQ
function DeleteFAQ($adID)
{
$strsql = "DELETE FROM tbfaq WHERE id_faq=" . $adID;
return $strsql;
}//DeleteFAQ
}//end class QueryHolder
?>
components.inc
//===========================================================
//class FAQList – scrie lista de FAQuri la inceput de pagina
//===========================================================
class FAQList
{
var $myDbObj;
var $m_sHTML;
function FAQList($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQ());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='#ancora_$rw[0]'>" . $rw[1] . "</td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQList
//===========================================================
//class FAQListHelp – scrie lista de FAQListHelp la inceput de pagina
//===========================================================
class FAQListHelp
{
var $myDbObj;
var $m_sHTML;
function FAQListHelp($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQHelp());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='#ancora_$rw[0]'>" . $rw[1] . "</td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQListHelp
//===========================================================
//class FAQListAdmin – scrie lista de FAQuri la inceput de pagina in admin
//===========================================================
class FAQListAdmin
{
var $myDbObj;
var $m_sHTML;
function FAQListAdmin($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQ());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='listfaq.php?id_faq=$rw[0]'>" . $rw[1] . " <a class='topnavigation' href='listfaq.php?id_faq=" . $rw["id_faq"] . "&action=delete'>[Sterge]</a></td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQListAdmin
faq.php
<?php
require_once "../utils/includer.php";
$m_objDb = new mysqldb(cDB_CORE);
$m_objDb->open();
?>
<table width="98%" border="0" cellspacing="2" cellpadding="3">
<tr>
<td align="left" valign="top" class="redmare">INTREBARI FRECVENTE </td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td align="left" valign="top" class="text">
Va recomandam sa vedeti lista noastra de F.A.Q.. Contine un set de intrebari detaliate pe care le-au pus clientii nostri si poate fi de un real folos daca deja ati cumparat un template sau tocmai planuiti asta.<br>
<?php
$list = new FAQList($m_objDb);
$list->ToScreen();
?>
</td>
</tr>
<?php
$rs = $m_objDb->execute(QueryHolder::GetFAQ());
while($rw=mysql_fetch_array($rs))
{
?>
<tr>
<td align="left" valign="top">
<?php
$det = new FAQDetaliu($rw[0],$m_objDb);
$det->ToScreen();
?>
</td>
</tr>
<?php
}//end while
?>
</table>
<?php
$m_objDb->close();
include "../utils/footer.inc";
?>
BIBLIOGRAFIE
[1] Allen Brown, Alison Balter – Bazele de date Access, Editura TEORA,
București, 1998.
[2] Corina Pascu – Totul despre … SQL, Editura Tehnică, București, 1999.
[3] C. A. Giumale – Programare funcțională, Editura Tehnică, București, 1997.
[4] C. Ionescu, I. Zsako – Structuri arborescente cu aplicațiile lor, CET, ASE,
București, 1990.
[5] D. Fife, T. Hardgrave – Database concepts, South Western, 1986.
[6] D. M. Popovici, I. M. Popovici, I. Tănase – Tehnologia orientată pe obiecte.
Aplicații, Editura TEORA, București, 1996.
[7] E. Fernandez, R. Summers, C. Wood – Database security and integrity, 1981.
[8] Gheorghe Popa – Sisteme de gestiune a bazelor de date, Editura ALL,
București, 1999.
[9] Gh. Sabău, I. Lungu – Sisteme informatice și baze de date, CET, ASE,
București, 1993.
[10] Ileana Popescu – Baze de date relaționale, Editura Univ. București, 1999.
[11] Ilie Popa – Inginerie software pentru conducerea proceselor industriale,
Editura ALL, București, 1998.
[12] Ion Lungu, Constanța Bodea, Georgeta Bădescu, Cristina Ioniță – Baze de
date, Editura ALL, București, 1995.
[13] Ion Lungu – Baze de date relaționale, Editura ALL, București, 1998.
[14] Ion Lungu, N. Mușat, I. Roșca, Gh. Sabău – Limbajul SQL Plus, Editura ALL,
București, 1992.
[15] I. Kaufmann, I. Jurcă, D. Petriu, V. Crețu – Programarea în limbajul ADA, Editura FACLA, Timișoara, 1982.
[16] J. Darlington, P. Henderson, D.A.Turner – Functional programming and its applications, Cambridge Universitz Press, 1982.
[17] J. G. Hughes – Object Oriented Database, Practice Hall International Ltd, 1991.
[18] J. D. Ullman, J. Widom – A first course in Database Systems, Practice Hall, 1997.
[19] J. Perkins, B. Morgan – SQL, Editura TEORA, București, 1997.
[20] K, Jeffery – Experts Database Systems, Academic Press, Ldt. 1992.
[21] Kevin Marlowe – Utilizare Access 97, Editura TEORA, București, 1998.
[22] Kovacs Sandor – Access 97, ghid de utilizare, Editura Albastră, Cluj-Napoca,
1999.
[23] Michel Mauny – Functional Programming Using CAML Light – IRIA, 1991 (disponibil pe internet).
[24] Octavian Bâscă – Baze de date, Editura ALL, București, 1997.
[25] P. Rob, C. Coronel – Database Systems – Design, Implementation and Management, International Thomson Publishing Co., 1997.
[26] R. Heydth, D. Heydth – DB2 Database Design and Administration, John
Wiley & Sons,1989.
[27] T. Gant – Oracle Power Objects, Editura TEORA, București, 1998.
[28] W. Chen, P. Chen – Centralized and distributed data base systems, New York: IEEE Computer Society, 1989.
ANEXA
QueryHolder.obj
<?php
class QueryHolder
{
//changes the status of a picture to flash and adds the ID to the flash
function SetPictureToFlash($adPictureID,$adFlashID)
{
$strsql = "UPDATE tbpoze SET objtype='flash', id_poza_flash=" . $adFlashID . " WHERE id_poza=" . $adPictureID;
return $strsql;
}//SetPictureToFlash
//inserts the flash to a picture
function AddFlash($aiX,$aiY,$asNumePoza)
{
$strsql = "INSERT INTO tbpozeflash (dimensiune_x,dimensiune_y,nume_poza_flash) VALUES ('" . $aiX . "','" . $aiY . "','" . $asNumePoza . "')";
return $strsql;
}//AddFlash
//returns the flash by ID
function GetFlashByID($adIDPozaFlash)
{
$strsql = "SELECT * FROM tbpozeflash WHERE id_poza_flash=" . $adIDPozaFlash;
return $strsql;
}//GetFlashByID
//returns the articles for the index page
function GetArticlesForIndex()
{
$strsql = "SELECT * FROM tbarticole ORDER BY id_articol DESC LIMIT 0,3";
return $strsql;
}//GetArticlesForIndex
//adds an article part to the collection
function AddPart($asTitle,$asContent,$adIDArt)
{
$strsql = "INSERT INTO tbparti_articol(titlu_articol, text_articol, id_articol) VALUES ('" . $asTitle . "','" . $asContent ."','" . $adIDArt . "')";
return $strsql;
}//AddPart
//adds an article to the collection
function AddArticle($asTitle)
{
$strsql = "INSERT INTO tbarticole(nume_articol, new) VALUES ('" . $asTitle . "','da')";
return $strsql;
}//AddArticle
//selects the email from the newsletter table
function EmailExists($asEmail)
{
$strsql = "SELECT * FROM tbnewsletter WHERE email='" . $asEmail . "'";
return $strsql;
}//EmailExists
//adds the email to the database
function InsertNewsletter($asEmail)
{
$strsql = "INSERT INTO tbnewsletter (email) VALUES ('" . $asEmail . "')";
return $strsql;
}//InsertNewsletter
//returns the articles in the list in menu on the right side ususally
function GetArticlesBeside($adArticleID)
{
$strsql = "SELECT * FROM tbarticole WHERE id_articol<>" . $adArticleID . " ORDER BY id_articol DESC LIMIT 0,3";
return $strsql;
}//GetArticlesBeside
//returns the parts of an article by article id
function GetArticleDetailsByArticleID($adArticleID)
{
$strsql = "SELECT * FROM tbparti_articol WHERE id_articol=" . $adArticleID . " ORDER BY id_parte_articol ASC";
return $strsql;
}//GetArticleDetailsByArticleID
//returns the article by ID
function GetArticle($adID)
{
$strsql = "SELECT * FROM tbarticole WHERE id_articol=" . $adID;
return $strsql;
}//GetArticle
//returns all the articles
function GetAllArticles()
{
$strsql = "SELECT * FROM tbarticole ORDER BY id_articol DESC";
return $strsql;
}//GetAllArticles
//returneaza FAQ
function GetFAQ()
{
$strsql = "SELECT * FROM tbfaq WHERE isfaq='da' ORDER BY id_faq ASC";
return $strsql;
}//GetFAQ
//returneaza FAQHelp
function GetFAQHelp()
{
$strsql = "SELECT * FROM tbfaq WHERE isfaq='nu' ORDER BY id_faq ASC";
return $strsql;
}//GetFAQHelp
//returneaza un FAQ dupa ID
function GetFAQByID($adID)
{
$strsql = "SELECT * FROM tbfaq WHERE id_faq=" . $adID;
return $strsql;
}//GetFAQByID
//returneaza poza dupa ID
function GetPictureByID($adID)
{
$strsql = "SELECT * FROM tbpoze WHERE id_poza=$adID";
return $strsql;
}//GetPictureByID
//returneaza categoriile dintr-o categorie
function GetCategoriesOfCategory($adIDCategorie)
{
$strsql = "SELECT * FROM tbcategorii WHERE tbcategorii_id_categorie=$adIDCategorie";
return $strsql;
}//GetCategoriesOfCategory
//returneaza datele de preview
function GetPreviewTemplate($adIDTemplate)
{
$strsql = "SELECT * FROM tbtemplates WHERE id_template=$adIDTemplate";
return $strsql;
}//GetPreviewTemplate
//returns the templates that are not sold
function GetTemplatesNotSold()
{
$strsql = "SELECT * FROM tbtemplates WHERE available<>'sold'";
return $strsql;
}//GetTemplatesNotSold
//returns the templates from a category
function GetTemplatesFromCategory($adIDCategorie)
{
$strsql = "SELECT * FROM tbtemplates WHERE tbcategorii_id_categorie=$adIDCategorie ORDER BY id_template DESC";
return $strsql;
}//GetTemplatesFromCategory
//returns the templates from a category paged
function GetTemplatesFromCategoryPaged($adIDCategorie,$adStartingRecord)
{
$strsql = "SELECT * FROM tbtemplates WHERE tbcategorii_id_categorie=$adIDCategorie LIMIT $adStartingRecord," . cRECORDS_PER_PAGE;
return $strsql;
}//GetTemplatesFromCategoryPaged
//returns the pages from a template
function GetPagesOfTemplate($adTemplateID)
{
$strsql = "SELECT * FROM tbpagini WHERE tbtemplates_id_template=$adTemplateID ORDER BY rank ASC";
return $strsql;
}//GetPagesOfTemplate
//returns the pictures of a page
function GetPicturesOfPage($adPageID)
{
$strsql = "SELECT * FROM tbpoze WHERE tbpagini_id_pagina=$adPageID ORDER BY rank ASC";
return $strsql;
}//GetPicturesOfPage
//returns the category information
function GetCategoryByID($adCategoryID)
{
$strsql = "SELECT * FROM tbcategorii WHERE id_categorie=$adCategoryID";
return $strsql;
}//GetCategoryByID
//returns the first two featured templates
function GetFeaturedTemplates()
{
$strsql = "SELECT * FROM tbtemplates WHERE (isFeatured=1 AND available='free') LIMIT 0,2";
return $strsql;
}//GetFeaturedTemplates
//returns the software by ID
function GetSoftwareByID($adID)
{
$strsql = "SELECT * FROM tbsoftware WHERE id_software=" . $adID;
return $strsql;
}//GetSoftwareByID
//inserts the new order
function InsertOrder()
{
$strsql = "INSERT INTO tborders(orderdate,orderstate) VALUES (NOW(),'INIT')";
return $strsql;
}//InsertOrder
//adds lines to the order
function AddOrderLine($adOrderID,$adTemplateID,$aiTipBuy,$aiPrice)
{
$strsql = "INSERT INTO tborderlines(tbtemplates_id_template,tborders_id_order,tip_buy,pret) VALUES ('" . $adTemplateID . "','" . $adOrderID . "','" . $aiTipBuy . "','" . $aiPrice . "')";
return $strsql;
}//AddOrderLine
//completes the order
function SetOrderStateToEmail($adOrderID)
{
$strsql = "UPDATE tborders SET orderstate='EMAIL_ADDED' WHERE id_order=" . $adOrderID;
return $strsql;
}//SetOrderStateToEmail
//completes the order
function CompleteOrder($adCart_order_id,$asEmail,$as2COOrderNumber,$asCard_holder_name,$asStreet_address,$asCity,$asState,$asZip,$asCountry,$asPhone,$asCart_id,$asCredit_card_processed,$asTotal_processed)
{
$strsql = "UPDATE tborders SET orderstate='COMPLETED',email = '". $asEmail ."',co_order_number='" .$as2COOrderNumber. "',card_holder_name='". $asCard_holder_name ."',street_address='". $asStreet_address ."',city='". $asCity ."',state='" . $asState . "',zip='". $asZip ."',country='" . $asCountry . "',phone='" . $asPhone . "',credit_card_processed='" . $asCredit_card_processed . "',total='" . $asTotal_processed . "' WHERE id_order=" . $adCart_order_id;
return $strsql;
}//CompleteOrder
//completes the order
function AddEmailToOrder($adOrderID,$asEmail)
{
$strsql = "UPDATE tborders SET email='" . $asEmail . "' WHERE id_order=" . $adOrderID;
return $strsql;
}//AddEmailToOrder
//checks the login
function LoginCheck($asUser,$asParola)
{
$strsql = "SELECT * FROM tbadministratori WHERE (username='" . $asUser . "' AND parola='" . $asParola . "')";
return $strsql;
}//LoginCheck
//gets the software
function GetSoftware()
{
$strsql = "SELECT * FROM tbsoftware";
return $strsql;
}//GetSoftware
//inserts a template in RDB
function InsertTemplate($asDescription,$iCategID,$iTipID,$bHTML,$bPSD,$bFLA,$iSoftware,$bisFeatured,$iUPrice,$iRPrice)
{
$strsql = "INSERT INTO tbtemplates(descriere,tbcategorii_id_categorie,tbtipuri_id_tip,htmlsource,psdsource,flashsource,tbsoftware_id_software,isFeatured,pret_full,pret_resell) VALUES('" . $asDescription . "','" . $iTipID . "','" . $iCategID . "','" . $bHTML . "','" . $bPSD . "','" . $bFLA . "','" . $iSoftware . "','" . $bisFeatured . "','" . $iUPrice . "','" . $iRPrice . "')";
return $strsql;
}//InsertTemplate
function SetTemplateCodeAndPicture($adID,$asPoza)
{
$strsql = "UPDATE tbtemplates SET cod='T" . $adID . "',poza='" . $asPoza . "',downloadaddress='" . md5("T" . $adID) . ".zip' WHERE id_template=" . $adID;
return $strsql;
}//SetTemplateCode
//adds a page
function AddPage($asName,$adRank,$adID)
{
$strsql = "INSERT INTO tbpagini (tbtemplates_id_template,titlu_pagina,rank) VALUES('" . $adID . "','" . $asName . "','" . $adRank . "')";
return $strsql;
}//AddPage
//adds a picture to the page
function AddPicture($asName,$adRank,$adIDPage,$asTitle)
{
$strsql = "INSERT INTO tbpoze (tbpagini_id_pagina,nume_poza,titlu_poza,objtype,rank) VALUES('" . $adIDPage . "','" . $asName . "','" . $asTitle . "','picture','" . $adRank . "')";
return $strsql;
}//AddPicture
//features or unfeatures a template
function SetFeatured($aiYes,$adID)
{
$strsql = "UPDATE tbtemplates SET isFeatured=" . $aiYes . " WHERE id_template=" . $adID;
return $strsql;
}//SetFeatured
//features or unfeatures a template
function SetHidden($aiYes,$adID)
{
$strsql = "UPDATE tbtemplates SET available='" . $aiYes . "' WHERE id_template=" . $adID;
return $strsql;
}//SetHidden
//order by ID
function GetOrder($adOrderID)
{
$strsql = "SELECT * FROM tborders WHERE id_order=" . $adOrderID;
return $strsql;
}//GetOrder
//GetTemplatesFromOrder returns the templates
function GetTemplatesFromOrder($adOrderID)
{
$strsql = "select * from tbtemplates inner join tborderlines ON tbtemplates.id_template = tborderlines.tbtemplates_id_template WHERE tborderlines.tborders_id_order=" . $adOrderID;
return $strsql;
}//GetTemplatesFromOrder
//returns the search string from posted vars
function GetSearchCriteriaAdmin($aobjPost)
{
$strsql = "";
$bComplexCriterium = false;
if($aobjPost["txtTemplateCode"]!="")
{
$strsql = "SELECT * FROM tbtemplates WHERE (cod='" . $aobjPost["txtTemplateCode"] . "' AND available='')";
}//end if
else
{
if(is_numeric($aobjPost["txtMinPrice"])&&is_numeric($aobjPost["txtMaxPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell BETWEEN " . $aobjPost["txtMinPrice"] . " AND " . $aobjPost["txtMaxPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full BETWEEN " . $aobjPost["txtMinPrice"] . " AND " . $aobjPost["txtMaxPrice"];
}
}
elseif(is_numeric($aobjPost["txtMinPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell >=" . $aobjPost["txtMinPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full >=" . $aobjPost["txtMinPrice"];
}
}
elseif(is_numeric($aobjPost["txtMaxPrice"]))
{
$bComplexCriterium = true;
if($aobjPost["radPriceType"]=="regular")
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_resell <=" . $aobjPost["txtMaxPrice"];
}
else
{
$strsql = "SELECT * FROM tbtemplates WHERE pret_full <=" . $aobjPost["txtMaxPrice"];
}
}
else
{
$bComplexCriterium = false;
$strsql = "SELECT * FROM tbtemplates";
}
//I add the search in zero downloads
if(isset($aobjPost["chkZeroDownloads"]))
{
if($bComplexCriterium==true)
{
if($aobjPost["chkZeroDownloads"]=="on")
{
$strsql .= " AND downloads=0";
}
}//end if $bComplexCriterium
else
{
if($aobjPost["chkZeroDownloads"]=="on")
{
$strsql .= " WHERE downloads=0";
}
}//end else
}
else
{
if($bComplexCriterium==true)
{
$strsql .= " AND available='free'";
}//end if $bComplexCriterium
else
{
$strsql .= " WHERE available='free'";
}//end else
}
}//end else
return $strsql;
}//GetSearchCriteriaAdmin
//returns the order search string from posted vars
function GetOrderSearchCriteriaAdmin($aobjPost)
{
$strsql = "";
$bComplexCriterium = false;
if($aobjPost["txtOrderID"]!="")
{
$strsql = "SELECT * FROM tborders WHERE id_order='" . $aobjPost["txtOrderID"] . "' ORDER BY orderdate DESC";
}//end if
else
{
if(checkdate($aobjPost["selLuna"],$aobjPost["selZi"],$aobjPost["selYear"])&&checkdate($aobjPost["selLunaTo"],$aobjPost["selZiTo"],$aobjPost["selYearTo"]))
{
$bComplexCriterium = true;
$strsql = "SELECT * FROM tborders WHERE orderdate>='" . $aobjPost["selYear"] . "-" . $aobjPost["selLuna"] . "-" . $aobjPost["selZi"] . " 00:00:00' AND orderdate<='" . $aobjPost["selYearTo"] . "-" . $aobjPost["selLunaTo"] . "-" . $aobjPost["selZiTo"] . " 23:59:59'";
}
if($bComplexCriterium==true)
{
if($aobjPost["selStatus"]!="undefined")
{
$strsql .= " AND orderstate='" . $aobjPost["selStatus"] . "'";
}
if($aobjPost["txtEmail"]!="")
{
$strsql .= " AND email='" . $aobjPost["txtEmail"] . "'";
}
}//end if $bComplexCriterium
else
{
if($aobjPost["selStatus"]!="undefined")
{
$strsql = "SELECT * FROM tborders WHERE orderstate='" . $aobjPost["selStatus"] . "'";
if($aobjPost["txtEmail"]!="")
{
$strsql .= " AND email='" . $aobjPost["txtEmail"] . "'";
}
}
else
{
if($aobjPost["txtEmail"]!="")
{
$strsql = "SELECT * FROM tborders WHERE email='" . $aobjPost["txtEmail"] . "'";
}
else
{
$strsql = "SELECT * FROM tborders";
}
}
}
$strsql .= " ORDER BY orderdate DESC";
}//end else
return $strsql;
}//GetOrderSearchCriteriaAdmin
//order by ID
function GetOrderLines($adOrderID)
{
$strsql = "SELECT * FROM tborderlines WHERE tborders_id_order=" . $adOrderID;
return $strsql;
}//GetOrder
//sells a template
function SetSold($adID)
{
$strsql = "UPDATE tbtemplates SET available='SOLD' WHERE id_template=" . $adID;
return $strsql;
}//SetSold
//sells a template
function IncrementDownloads($adDownloadNumber,$adID)
{
$strsql = "UPDATE tbtemplates SET downloads=" .$adDownloadNumber. " WHERE id_template=" . $adID;
return $strsql;
}//IncrementDownloads
//update the faq
function SaveFAQ($asQuestion,$asAnswer,$adID)
{
$strsql = "UPDATE tbfaq SET intrebare=\"" .$asQuestion. "\", raspuns=\"" . $asAnswer . "\" WHERE id_faq=" . $adID;
return $strsql;
}//updates the faq
//Adds faq
function AddFAQ($asQuestion,$asAnswer,$asisFAQ)
{
$strsql = "INSERT INTO tbfaq(intrebare,raspuns,isfaq) VALUES('" . $asQuestion . "','" . $asAnswer . "','" . $asisFAQ . "')";
return $strsql;
}//AddFAQ
function DeleteFAQ($adID)
{
$strsql = "DELETE FROM tbfaq WHERE id_faq=" . $adID;
return $strsql;
}//DeleteFAQ
}//end class QueryHolder
?>
components.inc
//===========================================================
//class FAQList – scrie lista de FAQuri la inceput de pagina
//===========================================================
class FAQList
{
var $myDbObj;
var $m_sHTML;
function FAQList($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQ());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='#ancora_$rw[0]'>" . $rw[1] . "</td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQList
//===========================================================
//class FAQListHelp – scrie lista de FAQListHelp la inceput de pagina
//===========================================================
class FAQListHelp
{
var $myDbObj;
var $m_sHTML;
function FAQListHelp($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQHelp());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='#ancora_$rw[0]'>" . $rw[1] . "</td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQListHelp
//===========================================================
//class FAQListAdmin – scrie lista de FAQuri la inceput de pagina in admin
//===========================================================
class FAQListAdmin
{
var $myDbObj;
var $m_sHTML;
function FAQListAdmin($aobjConn)
{
$this->myDbObj = $aobjConn;
$this->getdata();
}//FAQList
function getdata()
{
$rs = $this->myDbObj->execute(QueryHolder::GetFAQ());
$this->m_sHTML .= "<table border=0 width=95% cellpadding=2 cellspacing=2>";
$this->m_sHTML .= "<tr><td align=left valign=top><a name='susdetot'></a></td></tr>";
while($rw = mysql_fetch_array($rs))
{
$this->m_sHTML .= "<tr><td align=left valign=top class='bluetitles'><img src='../poze/book_blue.jpg' border=0 align='absmiddle'><a class='link' href='listfaq.php?id_faq=$rw[0]'>" . $rw[1] . " <a class='topnavigation' href='listfaq.php?id_faq=" . $rw["id_faq"] . "&action=delete'>[Sterge]</a></td></tr>";
}
$this->m_sHTML .= "</table>";
}//getdata
function ToString()
{
return $this->m_sHTML;
}//ToString
function ToScreen()
{
echo $this->m_sHTML;
}//ToScreen
}//FAQListAdmin
faq.php
<?php
require_once "../utils/includer.php";
$m_objDb = new mysqldb(cDB_CORE);
$m_objDb->open();
?>
<table width="98%" border="0" cellspacing="2" cellpadding="3">
<tr>
<td align="left" valign="top" class="redmare">INTREBARI FRECVENTE </td>
</tr>
<tr>
<td height="6" align="left" valign="top" background="../poze/bglinii.gif"></td>
</tr>
<tr>
<td align="left" valign="top" class="text">
Va recomandam sa vedeti lista noastra de F.A.Q.. Contine un set de intrebari detaliate pe care le-au pus clientii nostri si poate fi de un real folos daca deja ati cumparat un template sau tocmai planuiti asta.<br>
<?php
$list = new FAQList($m_objDb);
$list->ToScreen();
?>
</td>
</tr>
<?php
$rs = $m_objDb->execute(QueryHolder::GetFAQ());
while($rw=mysql_fetch_array($rs))
{
?>
<tr>
<td align="left" valign="top">
<?php
$det = new FAQDetaliu($rw[0],$m_objDb);
$det->ToScreen();
?>
</td>
</tr>
<?php
}//end while
?>
</table>
<?php
$m_objDb->close();
include "../utils/footer.inc";
?>
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Pagina Web cu Baza de Date Relationala Pentru Un Magazin de Vanzari Template Uri (ID: 150089)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
