69
Universitatea din Craiova Facultatea de Automatica, Calculatoare si Electronica Colegiul Tehnica de Calcul PROIECT DE ABSOLVIRE Indrumator stiintific, S.l. dr. ing. Catalin Cerbulescu Absolvent,

Validari asupra datelor

Embed Size (px)

Citation preview

Page 1: Validari asupra datelor

Universitatea din CraiovaFacultatea de Automatica, Calculatoare si ElectronicaColegiul Tehnica de Calcul

PROIECT DE ABSOLVIRE

Indrumator stiintific, S.l. dr. ing. Catalin Cerbulescu

Absolvent, Popa Ionica Marian

Craiova - 2004

Page 2: Validari asupra datelor

Tema proiect

Gestiune si prezentare on-line a programelor cinematografelor din Romania

Page 3: Validari asupra datelor

Cuprins

Cap.1 Prezentare functiuniCap.2 Notiuni fundamentale de baze de dateCap.3 Limbajul SQLCap.4 Active Server pages

4.1 Pagini ASP4.2 Accesarea bazelor de date4.3 Obiectul Response4.4 Obiectul Request

Cap.5 Descriere aplicatie5.1 Structura bazei de date5.2 Legaturi intre tabele5.3 Interfata cu utilizatorul5.4 Validari asupra datelor5.5 Tehnici de programare utilizate in partea de administrare

5.5.1 Conexiunea la baza de date5.5.2 Inserarea si actualizarea datelor5.5.3 Stergerea datelor

5.6 Tehnici de programare utilizate in partea de client5.6.1 Pagina Acasa5.6.2 Pagina In cinematografe5.6.3 Pagina cu informatii detaliate despre un film5.6.4 Pagina cu informatii detaliate despre un actor5.6.5 Pagina Filme5.6.6 Pagina Actori5.6.7 Pagina Arhiva filme

Cap.6 Concluzii

BibliografieListing sursa

Page 4: Validari asupra datelor

Cap.1 Prezentare functiuni

Aplicatia care face obiectul acestui proiect se intituleaza Gestiune si prezentare on-line a programelor cinematografelor din Romania si reprezinta un site Web care afiseaza informatia existenta intr-o baza de date MS Access. Ca urmare este un site dinamic, schimbarea informatiei din baza de date conducind la schimbarea automata a informatiei care se afiseaza pe Internet.

Ca solutie pentru realizarea acestui site am ales HTML (HyperText Mark-up Language) si ASP (Active Server Pages).

Site-ul cuprinde doua parti distincte. Prima parte este destinata consultarii de catre orice persoana doritoare de a vedea un film la cinema.

Facilitatile oferite de aceasta prima parte a site-ului realizat de mine sunt grupate sub urmatoarele titluri :

1. Acasa – este pagina introductiva, in care vizitatorul este informat asupra a doua lucruri: filmele noi aparute in cinematografe in saptamina curenta, precum si filmele recomandate. Prin asta am inteles filmele care prin calitatea lor sunt recomandate spre vizionare. Pentru fiecare film apare titlul acestuia, afisul si date legate de subiect. Pe fiecare titlu este amplasata o hiperlegatura care conduce la pagina cu informatiile detaliate despre film.

2. In cinematografe - afiseaza datele ce incadreaza saptamina curenta si o lista drop-down din care trebuie ales orasul care intereseaza. In acest moment se afiseaza fiecare cinematograf din orasul respectiv cu adresa s telefonul sau. Apoi, pentru fiecare cinematograf in parte apare lista filmelor care ruleaza, precum si cu zilele si orele de vizionare. Si aici avem hiperlegatura pe titlul filmului pentru a merge in pagina cu detalii.

3. In viitor – aceasta pagina este asemanatoare cu cea anterioara, numai ca afiseaza informatii despre filmele programate sa ruleze in cinematografe in etapa de timp viitoare

4. Filme – afiseaza titlurile filmelor care ruleaza in tara in saptamina curenta.

5. Actori – afiseaza, in ordine alfabetica, numele actorilor care figureaza in baza de date. Numele actorului este o hiperlegatura care

Page 5: Validari asupra datelor

daca este urmata conduce la afisarea in partea inferioara a paginii a informatiilor detaliate despre actorul ales.

6. Arhiva filme – permite vizualizarea titlurilor filmelor care sunt in baza de date pentru ca au rulat in trecut intr-unul din cinematografele existente in baza de date. Aceasta arhiva este mentinuta, pentru ca un film poate sa ruleze din nou, peste un anume timp, fie in acelasi cinematograf, fie in altul.

Doresc sa mentionez ca interfata grafica este placuta, cu un fundal si butoane adecvate temei.

Cea de a doua parte a site-ului este pusa numai la dispozitia celor care au drepturi sa administreze baza de date MS Access. Acesti utilizatori trebuie sa se identifice printr-un nume de utilizator si parola. In partea de administrare, exista urmatoarele hiperlegaturi:

1. Cinematografe2. Filme3. Actori4. Saptamina5. Program

Aceste titluri corespund in general tabelelor din baza de date a caror informatie trebuie actualizata. Fiecare din aceste optiuni permite gestionarea informatiei corespunzatoare, prin adaugare, modificare sau stergere de inregistrari.

In pagina Filme, in afara de posibilitatea de adaugare, modificare si stergere exista doua hiperlegaturi numite Distributie si Imagini care permit gestionarea informatiilor corespunzatoare pentru fiecare film in parte.

In pagina Cinematografe, utilizatorul cu drept de administrare poate sa gestioneze informatia despre acestea: sa adauge, sa modifice sau sa stearga inregistrari.

In pagina Filme, administratorul poate sa modifice informtia legata de acestea, plus informatia legata de imaginile din filme si distributia acestora.

De exemplu,in cazul in care se administreaza informatia legata de distributia filmelor, numele actrilor se alege dintr-o lista drop-down, munca acestuia fiind mult simplificata. Aceasta tehnica este utilizata si in alte parti ale site-ului de administrare. Astfel, in cazul informatiilor despre cinematografe, se alege orasul din care apartine, la adagarea programului de rulare al unui film se alege sapatamina si apoi titlul filmului tot prin intermediul unor liste drop-down.

Lucrurile se produc asemanator in cazul celorlalte hiperlegaturi. Doresc sa evidentiez ca in aceasta sectiune am acordat atentie speciala

validarii datelor care se introduc sau se modifica in tabele, pentru a pastra

Page 6: Validari asupra datelor

consistenta informatiei, pentru a evita iesirea utilizatorului din pagina din cauza unei erori.

Cap.2 Notiuni fundamentale de baze de date

Entitate,relaţie,atribut

Se numeşte entitate orice obiect,fenomen sau concept care poate fi distins prin valorile caracteristicilor sale de alte obiecte,fenomene sau concepte asemănătoare.

Se numeşte atribut o caracteristică specifică unei entităţi.Un atribut se caracterizează prin :nume,semantică.structură,tipuldatelor

şi domeniul de definiţie.Prin tipul datelor înţelegem structura datei,mulţimea

valorilor,operaţiile admise si modul de tratare a erorilor specifice.Semantica înseamnă semnificaţia atributului în cadrul entităţii.Într-o

colecţie pot să apară diverse atribute cu acelaşi nume dar plasate in entităţi diferite.Chiar dacă au acelaşi nume atributele pot să aibă semnificaţii diferite.

Domeniul este o noţiune specifică bazelor de date şi puternic legată de semantica acestora.Cunoaşterea semanticii atributelor şi a domeniilor specifice este una din cerinţele de bază ale proiectării unei baze de date.

Din punct de vedere al semanticii distingem :1. Atribute identificator-ale cărui valori pot identifica în mod unic o

anumita entitate.2. Atribute descriptor-ale carui valori descriu o anumită proprietate a

entităţii.3. În asemenea situaţii o entitate poate să nu aibă cheie primară

naturală.În acest caz proiectantul bazei de date poate decide introducerea unei chei primare artificiale.

Din punct de vedere al structurii putem distinge :

1. Atribute atomice din a căror valoare nu poate fii eliminată nici o componentă fără a afecta semantica atribitului.

2. Atribute compuse a căror valoare este dată de reuniunea valorilor unor atribute atomice.

Page 7: Validari asupra datelor

Din punct de vedere al numărului de valori pe care-l poate lua la un moment dat un atribut pentru o anumită entitate distingem.

1. Atribute cu valoare unică care acceptă la un moment dat o singură valoare pentru fiecare entitate.

2. Atribute multivaloare care acceptă la un moment dat un set de valori pentru aceeaşi entitate.

Din punct de vedere al nivelului de structurare al unui atribut distingem :

1. Atribute slab structurate –sunt caracteristice aplicaţiilor multimedia.2. Atribute puternic structurate-sunt atribute care au o structură riguros

definită.Între entităţi se stabilesc legături.Legătura între clase de entităţi pune în

corespondenţă entităţiile ce participă la realizarea legăturii a două sau mai multe clase de entităţi reprezintă o submulţime a produsului cartezian al entităţiilor.

Caracteristici generale ale legăturilor:1. Orice legătură are un nume2. Orice legătură are o semantică riguros definită3. O legătură este bidirecţională4. Pot fi definite legături între entităţile aceleiaşi clase de entităţi5. Între aceleaşi clase de entităţi pot fi definite mai multe legături cu

semnificaţii diferite6. Pot fi definite legături peste mai mult de două clase de entităţi7. Legăturile pot avea atribute proprii ca şi entităţiileIndiferent de semantica lor legăturile prezintă câteva proprietăţi deosebit

de importante a căror cunoaştere este esenţială pentru înţelegerea si implementarea colecţiilor de date.

1. Gradul legăturii-indică numărul de clase de entităţi care participă la realizarea legăturii tip .

2. Indicator de participare-este un indicator care specifică dacă pot exista entităţi ale unei clase de entităţi care să nu participe obligatoriu la realizarea legături tip analizate.

3. Indicator de conectivitate-indică numărul de entităţi ale unei clase care pot fi puse în corespondenţă cu entităţi ce participă la realizarea unei anumite legături.

Baze de dateSe numeşte bază de date o colecţie de date conectate logic

exhaustivă,neredundantă şi care suportă independenţa aplicaţiilor în raport cu structura datelor.

Prin structura bazei de date se materializează de fapt informaţia conţinută de date .Structura datelor nu este unică .Prin duplicarea datelor înţelegem că

Page 8: Validari asupra datelor

aceleeaşi date sunt reprezentate în baza de date în aceeaşi formă sau în forme apropriate.

Conexiunea logică a datelor presupune că în baza de date sunt introduse numai date specifice unui anumit domeniu iar între ele pot fi puse în evidenţă legături cu o semantică bine determinată.

Exhaustivitatea datelor se referă la cerinţa impusă de precizia informaţiilor şi anume că pentru a obţine informaţii cât mai corecte într-un anumit domeniu respectiv.

Prin cerere vom înţelege o solicitare abstractă sistemului informatic sub forma unor comenzi într-un limbaj de programare în scopul obţineri unui anumit rezultat cu ajutorul unor prelucrări elementare asupra datelor păstrate în baza de date.

Prin aplicaţie se înţelege un grup de cereri concatenate semantic şi care solicită aproximariv aceleaşi date pentru obţinerea rezultatelor. În concluzie există un număr mare de elemente ale bazei de date a căror modificare nu trebuie să afecteze aplicaţiile deja implementate. Printre acestea putem aminti:

1. utilizarea unor tipuri de dată diferite pentru valorile aceluiaşi atribut2. formatul de reprezentare al datei calendaristice poate varia foarte

puternic în funcţie de aplicaţie,de preferinţele beneficiarului de tranzacţie.

3. anumite date pot fi văzute distinct de către o aplicaţie şi concatenate de către altă aplicatie.

4. diverse apilicaţii utilizează fiecare doar o parte a conţinutului bazei de date.

5. dacă la un moment dat se hotărăşte extinderea bazei de date prin adăugarea de noi categori de informaţii ,vechile aplicaţii care nu utilizează aceste date nu trebuie să fie afectate.

6. având în vedere preţul de cost mare al implementări unei baze de date şi a aplicaţiilor peste aceasta se poate decide implementarea bazei de date în etape.

7. modificările în structura sistemului informatic pri achiziţia de echipamente de calcul noi prin modificarea tipului suportului extern de informaţie,prin redistribuirea fişierelor de date nu trbuie să afecteze programele aplicative.

8. un program aplicativ poate fi utilizat în contexte diferite peste baze de date cu structuri de date identice dar implementate pe sisteme de calcul diferite.

Sistemul de gestiune a bazelor de date reprezintă un pachet de programme care permit crearea, utilizarea si eliminarea obiectelor ce compun baza de date în scopul creşteri randamentului global al utilizării bazelor de date si având ca principal obiectiv reducerea dependenţei aplicaţiilor în raport cu structura datelor. Principala noutate introdusă de SGBD a fost separarea descrierii datelor de programul aplicativ. Descrierea datelor se face în mod unitar pentru

Page 9: Validari asupra datelor

toate aplicaţiile cu ajutorul SGBD. SGBD-ul oferă mecanisme puternice de acces la date fără să necesite cunoştinţe avansate privind structura datelor şi sistemul de operare.

Introducerea SGBD-ului a permis crearea unei arhitecturi pe 3 nivele a sistemului informatic:

Nivelul logic corespunde modului în care fiecare utilizator vede conţinutul bazei de date.

Nivelul conceptual corespunde structurii întregii baze de date.Modelul conceptual este o descriere a continutului bazei de date independentă atât de aplicaţiile propriuzise cât şi de modelul de implementare al bazei de date.

Nivelul intern se referă la modul de implementare al bazei de date.Modelul intern conţine descrierea structurii de date implementate,

descrierea fişierelor a tehnicilor de acces la date, lista utilizatorilor, drepturile lor de acces.

Modelul relaţional este un model logig al bazei de date care sa impus datorită naturaleţii sale şi simplităţii în înţelegerea şi manipularea structurilor de date. Rrezentarea unei baze de date sub formă de relaţii se numeşte model relaţional al bazei de date.

O relaţie este formată dintr-un tabel bidimensional în care coloanele corespund atributelor iar fiecare linie corespunde unei entităţi.

Fiecare relaţie se identifică printr-un nume unic în cadrul unei baze de date.

Fiecare atribut are un nume unic şi trebuie să sugereze semnificaţia acestuia.

O linie a relaţiei se numeşte tuplu al relaţiei .Prin relaţie materializăm o clasă de entităţi în care fiecare tuplu reprezintă o entitate.

CHEI Noţiunea de cheie derivă din conceptul determinant . Se numeşte determinant orice atribut simplu sau compus ale cărui valori

identifică în mod unic valorile altor atribute.Se numeşte supercheie orice atribut simplu sau compus care identifică în

mod unic un tuplu.Există o supercheie care apare în orice relaţie numită cheie trivială şi

anume o supercheie formată din toate atributele relaţiei.

Page 10: Validari asupra datelor

Cheie candidat :Se numeşte cheie candidat o supercheie minimală adică o supercheie din

care îndepărtând cel puţin un atribut se pierde caracterul de determinant. Supercheile si cheile candidat rezultă în mod natural din semantica datelor.

Cheie primară :Cheia primară este o cheie candidat aleasă de către proiectantul bazei de

date pentru identificarea tuplurilor intr-o relaţie. Specificarea cheii primare este obligatorie în orice documentaţie privind baza de date. Alegerea cheii primare se poate face pe baza unei analize profunde a semnificaţiei datelor şi a modului în care acestea sunt utilizate în diverse aplicaţii sau pot fi fixate arbitrar dintre cheile candidat. În cazul in care nu există nici o cheie candidat sau cheile candidat naturale au un număr prea mare de atribute proiectantul poate decide introducerea unor chei primare artificiale generate de către SGBD.

Cheie alternantă : este o cheie candidat care nu a fost aleasă pentru postul de cheie primară.

Cheie secundară :Orice atribut sau grup de atribute prin ale căror valori se identifică o

mulţime de tupluri dintr-o relaţie.Fie o relaţie având schema r(a1,a2,…,an),unde a1 este cheie primară a

relaţiei. Se numeşte domeniu primar al relaţiei domeniul corespunzător cheii primare. Fie o altă relaţie s(b1,b2,…,bn),unde b1 este definit peste acelaşi domeniu primar din relaţia r.În acest caz se spune că b1 este cheie externă peste definită peste cheia primară din relaţia r.

Cheia externă reprezintă un mecanism fundamental pentru materializarea legături între relaţiile r şi s. Cheile externe pot fi definite în practică peste chei candidat în afara cheii primare.

Reguli de integritate Regulile de integritate a datelor dintr-o bază de date relaţională

reprezintă restricţii impuse datelor cu scopul de a elimina redundanţa datelor,inconsistenă a datelor şi erori de actualizare a datelor.

Există multe tipuri de integrităţi şi anume :1. Integritatea domeniului-această restricţie presupune definirea

domeniului unui atribut astfel încât să reprezinte efectiv valorile posibile ale unui atribut.

2. Integritatea cheilor-prin cheie vom înţelege toate cheile candidat puse în evidenţă într-o relaţie.

3. Integritatea entităţii-prin definiţie cheia primară trbuie să identifice în mod unic un tuplu al unei relaţii care în general este materializarea unei entităţi. Pentru ca să-şi poată realiza rolul de identificator cheia primară nu poate avea valori nule.

4. Integritatea referirii-această restricţie de integritate are ca scop să elimine referirile în gol, adică cheia externă nu are voie să se refere la

Page 11: Validari asupra datelor

un tuplu care nu există. Restricţia integrităţii referirii impune ca la un moment dat valorile cheii externe fie să fie nule, fie să se afle printre valorile deja înregistrate pentru cheia primară peste care este definită cheia externă.

5. Restricţii de utilizator-în unele situaţii utilizatorul poate impune şi alte restricţii decât cele impuse de regulile de integritate discutate anterior :-unicitatea altor atribute decăt cheia primară -valori nule-diverse validări

Operatori ai algebrei relaţionale 

Operatorii algebrei relaţionale pot fi împărţi în două grupe:1. Operatori clasici peste mulţimi2. Operatori relaţionali specifici

Se spune că relaţiile r1 şi r2 sunt compatibile cu reuniunea dacă cele 2 relaţii au aceeaşi paritate şi atributele care ocupă aceeaşi paritate sunt definite peste acelaşi domeniu chiar dacă au nume diferite.

Reuniunea :Fie r1 şi r2 două relaţii compatibile cu reuniunea .Se numeşte reuniune relaţia r care conţine toate tuplurile celor 2 relaţii iniţiale fără duplicate.

Intersecţia :Fie r1 şi r2 două relaţii compatibile cu reuniunea.Se numeşte intersecţie relaţia r care conţine toate tuplurile comune lui r1 şi r2.

Diferenţa :Fie r1 şi r2 două relaţii compatibile cu reuniunea.Se numeşte diferenţă relaţia r care conţine numai tuplurile din r1 care nu apar în r2.

Produsul cartezian :Fie r1 şi r2 două relaţii oarecare.Se numeşte produs cartezian relaţia r opţinută prin concatenarea fiecărui tuplu din r1 cu fiecare tuplu din r2.

Operatori relaţionali specifici :Selecţia-Fie o relaţie r şi o expresie relatională aritmetică f numită

filtru.Se numeşte selecţie o relaţie formată din toate tuplurile relaţiei r pentru care atributele iau valori care înlocuite în expresia f fac ca aceasta să aibă valoarea adevărată true.

Proiecţia-Fie o relaţie r şi ai1,ai2,…,ain, un set de atribute ale acestei relaţii.Se numeşte proiecţie o relaţie opţinută din relaţia r care conţine numai atributele specificate.

Tipuri de limbaje utilizate în domeniul bazelor de date

1. Limbaje de descriere a bazei de date(LDBD)-permit descrierea relaţiilor atributelor şi a unor restricţii de integritate,a unor vederi asupra bazelor de date a unor utilizatori şi aprivilegiilor acordate acestora.

Page 12: Validari asupra datelor

2. Limbaje de manipularea bazelor de date(LMDB)-acestea cuprind comenzi care permit :-introducerea de noi date în baza de date -modificare valorilor deja înscrise în baza de date -eliminarea unor tupluri ale unei relaţii

3. Limbaje de interogare-au ca scop posibilitatea formulări unor cereri de căutare a informaţiilor în baza de date.

4. Limbaje pentru generarea rapoartelor-sunt limbaje care permit o formatare sofisticată a datelor care să prezinte informaţia intr-o formă adecvată problemei rezolvate.

Normalizarea

Este un proces interativ şi reversibil prin care se înlocuieşte o colecţie dată de relaţii prin colecţii succesive în care relaţiile au o structură din ce în ce mai simplă şi mai regulată.

Obiectivele normalizării sunt :1.Să permită reprezentarea oricărei relaţii în baza de date .2.Să opţină algoritmii de căutare puternici bazaţi pe o colecţie de operatori relaţionali .3.Să elimine din relaţii anomaliile de inserţie ,modificare şi ştergere.4.Să reducă necesitatea restructurării relaţiilor atunci cănd se introduce un nou tip de date sau se modifică ipotezele de lucru.5.Să facă colecţia de relaţii imună în raport cu cererile aleatoare a căror semantică se modifică în timp.Pot fi puse în evidenţă cinci forme de normalizare ce formează o structură

riguros ierarhizată care vor fi notate cu FN1-FN5.Forma normală 1(FN1)O relatie este în FN1 dacă fiecare atribut al relaţiei are un domeniu de

valori atomice.FN1 este cea mai slabă formă normală.În general relaţiile în această formă prezintă numeroase anomalii la inserţie,modificare şi eliminare, acestea fiind eliminate de celelalte forme normale.

Forma normală 2(FN2)Fie X mulţimea tuturor atributelor relaţiei r(a1,a2,…,an),care nu

participă la formarea vreunei chei în r. Se spune că relaţia r este în FN2 dacă şi numai dacă fiecare atribut din X este complet dependent funcţional de oricare din cheile lui r.Un atribut este atribut prim dacă face parte din cel puţin o cheie a relaţiei r.Un atribut este atribut nonprim dacă nu face parte din cel puţin o cheie a relaţiei r.O relaţie este în FN2 dacă şi numai dacă orice atribut nonprim din r este complet dependent funcţional de toate cheile din r.

Proprietate :Dacă o relaţie nu este în FN2,există o descompunere a lui r într-un set

de proiecţii,fiecare în FN2. Descompunerea se poate realiza în aşa fel încât

Page 13: Validari asupra datelor

aplicând joncea naturală între proiecţii se opţine conţinutul informaţional al lui r fară pierdere de informaţie.

Forma normală 3(FN3)O relaţie este în FN3 dacă şi numai dacă nici unul din atributele sale

nonprime nu este dependent tranzitiv de o cheie a relaţiei r.Proprietăti :

1.Dacă o relaţie se află în FN3 ,ea este obligatoriu în FN2.2.Există relaţii în FN2 care nu se află în FN3.3.Dacă o relaţie r nu este în FN3,există o decompoziţie a lui r intr-un set de proiecţii,toate în FN3. Această decompoziţie este astfel realizată încât aplicând joncţiunea naturală între proiecţiile opţinute se reface relaţia iniţială fără pierdere de informaţii.

Forma normală Boyce-Codd(FNBC)Relaţia r(a1,a2,…,an) este în FNBC dacă şi numai dacă existenţa unei

dependenţe funcţionale netrivială X-Y ,unde X şi Y sunt seturi de atribute ale lui r implică existenţa dependenţelor funcţionale X-a1,pentru i=1,2,…,n.

Această definiţie poate fi reformulată utilizând termenul determinant.Se numaşte determinant orice atribut simplu sau compus care implică

funcţional alte atribute.O relaţie este în FNBC dacă şi numai dacă orice determinant al relaţiei

este cheie candidat.Proprietăţi :

1.Dacă o relaţie este în FNBC,ea este obligatoriu in FN3.2.Există relaţii în FN3 care nu sunt în FNBC.3.Dacă o relaţie nu este în FNBC,atunci această relaţie poate fi descompusă într-un set de proiecţii FNBC astfel încât conţinutul relaţiei iniţiale să poată fi refăcut fără pierdere de informaţie prin joncţiunea naturală a proiecţiilor.Procesul de normalizare poate fi rezumat astfel :N1.Se transformă tabelul iniţial într-unul sau mai multe tabele cu valori atomice.N2.Din relaţiile de la pasul precedent se elimină toate dependenţele funcţionale parţiale opţinând relaţii FN2.N3.Din relaţiile FN2 se elimină toate dependenţele funcţionale tranzitive de atribute cheie.Se opţin relaţii FN3.N4.Se aleg proiecţiile relaţiilor FN3 care elimină acele dependenţe funcţionale în care determinantul nu este cheie candidat şi se opţin relaţii FNBC.N5.Se aduc relaţiile FNBC în FN4.N6.Se aleg proiecţiile relaţiilor FN4 care elimină dependenţele joncţiune care nu sunt implicate prin chei candidat .Rezultă relaţii FN5.

Page 14: Validari asupra datelor

Cap.3 Limbajul SQL

SQL a fost conceput ca un limbaj standard de descriere a datelor si acces la informatiile din baze de date, dezvoltindu-se ca o adevarata tehnologie dedicata arhitecturilor client/server.

Utilizat initial de catre firma IBM pentru produsul DB2, limbajul de interogare a bazelor de date relationale SQL (Structured Query Language) a devenit la mijlocul deceniului trecut un standard in domeniu. De atunci si pina in prezent au fost dezvoltate mai multe versiuni ale standardului SQL, trei dintre ele apartinind Institutului National American de Standarde ( ANSI ), celelalte fiind concepute de firme de prestigiu ca IBM, Microsoft, Borland. 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 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 problemele legate de implementarea acestora in arhitecturi client/server cum ar fi conectivitatea si interfetele cu utilizatorul ale programelor.

In anul 1992, firma Microsoft, in calitate de membru SAG a lansat pe piata produsul ODBC ( Open Database Conectivity ), un standard API-SQL ce are la baza un proiect de standard si defineste o interfata de programare a aplicatiilor ( API ) pentru accesul la baze de date.

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, precum si schimbul de date si mesaje SQL.

SQL este un limbaj complet pentru baze de date, cuprinzind comenzi pentru definirea datelor, actualizare si interogare. Deci, este atit un limbaj pentru definirea datelor (DDL), cit si pentru manipularea datelor (DML). In plus, are facilitati pentru definirea viziunilor, pentru crearea si stergerea indecsilor si pentru incapsularea comenzilor SQL in limbaje de programare ca C sau Pascal.

Comenzile SQL pentru definirea datelor sint CREATE, ALTER si DROP.

Comenzile SQL pentru modificarea datelor sint INSERT, DELETE si UPDATE.

SQL are o singura comanda pentru regasirea datelor din bazele de date, SELECT .

Page 15: Validari asupra datelor

Avind in vedere ca in ASP, accesul la bazele de date de tip Access se realizeaza prin intermediul limbajului SQL, voi prezenta in continuare, sintaxa comenzilor SQL in Microsoft Access.

Comanda SELECT

Permite returnarea unui set de inregistrari din baza de date. Are urmatoarea sintaxa:

SELECT [predicate] { * | table.* | [table.]field1 [AS alias1] [,table.]field2 [AS alias2] [, ...]]}

FROM tableexpression [, ...] [IN externaldatabase]

[WHERE... ]

[GROUP BY... ]

[ORDER BY... ]

Comanda SELECT are urmatoarele parti:- Predicate – poate fi unul dintre urmatoarele predicate: ALL, DISTINCT, DISTINCTROW, or TOP, care se utilizeaza pentru a restrictiona numarul de inregistrari returnate. ( implicit este ALL).- * - specifica selectarea tuturor cimpurilor din tabela sau tabelelor selectate.

- table – specifica numele tabelei continind cimpurile din care se selecteaza datele

- field1, field2 – reprezinta numele cimpurilor din care dorim regasirea datelor.

- alias1, alias2 - reprezinta numele utilizate ca si titluri de coloane in locul numelor coloanelor din tabela

- tableexpression – reprezinta numele tabelei sau tabelelor din care se regases datele

- externaldatabase – reprezinta numele bazei de date externe, daca tabelele nu sint in cea curenta

Observatii:

Pentru a executa aceasta operatie, motorul de baze de date Microsoft Jet cauta tabela sau tabelele specificate, extrage coloanele alese, selecteaza

Page 16: Validari asupra datelor

rindurile care satisfac criteriul si sorteaza sau grupeaza rindurile rezultate in ordinea specificata.

Comanda SELECT nu modifica datele din baza de date.

Daca numele unui cimp apare in mai multe tabele din clauza FROM, el trebuie precedat de numele tabelei si operatorul punct (.).

Clauza WHERE specifica inregistrarile din tabelele ce apar in clauza FROM care vor fi afectate de comanda SELECT. Numai acele inregistari care satisfac criteriul din aceasta clauza vor fi incluse in interogarea rezultat.

Observatii :

Daca nu se specifica clauza WHERE vor fi returnate toate rindurile din tabele. Daca in interogare se specifica mai mult de o tabela si nu specifica clauza WHERE sau JOIN, se efectueaza produsul cartezian al tabelelor, operatie consumatoare de timp.

Clauza ORDER BY permite sortarea inregistrarilor dupa valorile din cimpurile specificate, ascendent sau descendent.

Sintaxa acestei clauze este:

[ORDER BY field1 [ASC | DESC ][, field2 [ASC | DESC ]][, ...]]]Observatii :

Clauza este optionala. Sortarea implicita este ascendenta, altfel trebuie specificat DESC. In aceasta clauza nu pot apare cimpuri de tip OLE sau Memo.

Clauza GROUP BY combina inregistrarile cu valori identice din lista de cimpuri specificate, intr-o singura inregistrare.Daca in comanda SELECT se specifica una dintre functiile agregat ( Sum, Count, Max ), atunci pentru fiecare astfel de inregistrare se creaza apoi o valoare agregat.

Clauza are urmatoarea sintaxa:

[GROUP BY groupfieldlist]

- groupfieldlist – reprezinta numele a cel mult 10 cimpuri utilizate pentru gruparea inregistrarilor. Ordinea acestor cimpuri in lista determina nivelele de grupare de la cel mai inalt pina la cel mai de josObservatii:

Page 17: Validari asupra datelor

Clauza este optionala. Valorile agregat sint omise daca in comanda SQL nu se specifica nici o functie agregat. Nu se poate face grupare dupa cimpuri de tip Ole sau Memo.

Jonctiunea interna ( INNER JOIN )

Se specifica cu urmatoare sintaxa:

FROM table1 INNER JOIN table2 ON table1.field1 compopr table2.field2

Operatia INNER JOIN are urmatoarele parti:

- table1, table2 - reprezinta numele tabelelor din care se combina inregistrarile- field1, field2 – reprezinta numele cimpurilor dupa care se face jonctiunea. Daca ele nu sint numerice, trebuie sa fie de acelasi tip, aceeasi dimensiune, dar nu trebuie sa aiba acelasi nume.- compopr – reprezinta orice operator relational: "=," "<," ">," "<=," ">=," sau "<>."

Observatii:

Acest tip de jonctiune este cel mai utilizat si se poate folosi in orice clauza FROM. Combina inregistrarile din doua tabele, ori de cite ori exista valori care isi corespund in cimpul comun din cele doua tabele.

Nu se poate face jonctiune pe tipuri de date OLE sau Memo.

Comanda UPDATE

Permite modificarea valorilor cimpurilor intr-o tabela specificata, pe baza unui criteriu specificat. Are urmatoarea sintaxa:

UPDATE tableSET newvalueWHERE criteria

Comanda UPDATE are urmatoarele parti:

- table – reprezinta numele tabelei ce contine datele ce vor fi modificate.

Page 18: Validari asupra datelor

- newvalue - este expresia care determina valoarea ce va fi memorata intr-un anume cimp din inregistrarile care se actualizeaza.- criteria – este expresia care determina inregistrarile ce vor fi actualizate

Cap.4 Active Server Pages4.1 Pagini ASP

O pagina ASP este un fisier stocat pe un server Web si care are extensia .ASP. Aceasta extensie speciala face deosebirea dintre o pagina ASP si un fisier HTML normal care are extensia .HTML sau .HTM.

Cind un utilizator viziteaza un site Web si cere un fisier HTML normal, serverul preia pur si simplu fisierul de pe hard-discul sau din memoria calculatorului si il trimite browserului utilizatorului. Browserul interpreteaza continutul HTML al fisierului si vizitatorul va vedea pagina Web.

Cind cineva solicita o pagina HTML normala, serverul Web nu este interesat de continutul fisierului. Rolul serverului Web se rezuma la preluarea fisierului corect fara a-l prelucra. Toata munca de interpretare a continutului fisierului este realizata de browserul utilizatorului.

Pe de alta parte, cind cineva solicita o pagina ASP, serverul Web va avea un rol mult mai activ. Inainte ca fisierul sa fie trimis catre browserul utilizatorului, el este mai intii prelucrat de catre serverul Web. Acesta din urma interpreteaza si executa orice script-uri dintr-o pagina ASP, inainte ca acesta sa fie trimis catre browserul utilizatorului. Datorita faptului ca o pagina ASP este prelucrata de catre server in loc de browser, o astfel de pagina este compatibila cu toate browserele Web.

Paginile ASP contin script-uri pe parte de server. Ca limbaj de generare a script-urilor, se poate utiliza Microsoft Visual Basic Scripting Edition (VBScript), sau Microsoft Jscript sau PerlScript. Firma Microsoft include Jscript in tehnologia ASP. PerlScript nu este un produs Microsoft.

Limbajele de generare de script-uri, cum este VBScript, difera de limbajele de programare complete, cum sunt Visual Basic si Java, prin simplitatea regulilor si sintaxei lor. De exemplu, VBScript nu necesita declararea variabilelor ca tipuri particulare de date.

Mai mult, spre deosebire de Visual Basic sau Java, o pagina ASP nu trebuie compilata intr-un fisier separat inainte de a o putea executa. Cind modificati o pagina ASP, aceasta este recompilata automat la urmatoarea solicitare.

Avantajul utilizarii unui limbaj de generare de script-uri la construirea paginilor Web este faptul ca acesta faciliteaza modificarea unui site Web chiar si dupa ce a fost lansat in Internet. Daca se descopera o eroare in site, se

Page 19: Validari asupra datelor

poate incarca rapid pagina respectiva in programul Notepad sau Wordpad unde se va rezolva problema.

Nu trebuie trasa concluzia ca, daca o pagina ASP utilizeaza un limbaj de generare de script-uri, atunci paginile Active Server sunt lente sau nu asigura acoperirea necesara. Script-urile ASP ruleaza in acelasi proces ca si serverul Web si poate fi divizat in fire de executie. Acest lucru permite unei pagini ASP sa ofere simultan, in mod eficient, suport pentru un numar mare de utilizatori.

O pagina ASP ar fi strict limitata daca nu ar putea contine decit script-uri. S-ar putea afisa ora exacta sau alte mesaje interesante, dar nu ar exista posibilitatea de a prelua informatii de la utilizatori, de a stoca date intr-o baza de date sau de a crea fisiere pe server. Din fericire, o pagina ASP poate contine componente pe parte de server.

O componenta este ceva care, de obicei, are metode, proprietati si colectii.Metodele unei componente determina actiunile pe care le puteti efectua

cu un obiect.Proprietatile unei componente pot fi citite sau stabilite pentru a preciza

starea componentei.Colectiile unei componente sunt seturi de perechi cheie si valoare,

referitoare la componenta.Paginile Active Server au doua tipuri de componente: obiecte incluse si

componente ce pot fi instalate.Cele sase obiecte incluse in Active Server pages sunt: Applications - reprezinta informatia care poate fi partajata intre toti

utilizatorii unei aplicatii ASP. ObjectContext - acest obiect se utilizeaza la paginile ASP care se

ocupa de tranzactii Request - reprezinta toate informatiile trimise de browser catre server,

inclusiv variabile de forma si siruri interogare. Response - reprezinta toate informatiile trimise de la un server catre un

browser, inclusiv continutul HTML trimis de catre o pagina ASP. Server - permite folosirea pe server a diferite functii utilitare Session - reprezinta informatia referitoare la sesiunea de lucru

particulara a unui utilizator.In paginile Active Server este inclus un set special de obiecte : ActiveX

Data, care permit accesarea unei baze de date dintr-o pagina ASP. Aceste obiecte se utilizeaza pentru a insera, actualiza si sterge linii dintr-un tabel. Aceste obiecte se pot folosi, de asemenea, pentru a prelua un set de inregistrari dintr-o tabela si a le afisa intr-o pagina ASP.

4.2 Accesarea bazelor de date

Page 20: Validari asupra datelor

ActiveX Data Objects ( ADO ) reprezinta o tehnologie extensibila si usor de utilizat care permite accesul la baze de date din cadrul paginilor de Web. ADO se poate utiliza pentru a scrie scripturi compacte si scalabile pentru conectarea la baze de date prin intermediul ODBC ( Open Database Connectivity ).

Inainte de a putea deschide o conexiune la o baza de date, va trebui sa furnizam paginii ASP informatii despre localizarea fizica a bazei de date. Cu alte cuvinte trebuie sa furnizam script-ului o metoda de gasire a bazei de date pe unitatea de hard disc. O cale de a realiza acest lucru cu ajutorul numelui de sursa de date ( Data Source name-DSN).

Se pot crea doua tipuri diferite de nume de sursa de date. In cazul in care se creaza un nume de sursa fisier (File DSN), informatia despre conectarea la baza de date va fi stocata intr-un fisier. In cazul in care se creaza un nume de sursa de sistem, informatia despre conectarea la baza de date va fi stocata in baza de date Registry a calculatorului.

Nu exista motive speciale care sa impuna utilizarea unuia sau celuilalt tip de nume de sursa de date. Ambele tipuri functioneaza la fel de bine, dar eu am utilizat in aplicatie un num,e de sursa de date sistem.

Pentru a crea un fisier DSN de tip System pentru o baza de date de tip MS Access se procedeaza astfel:

1. Din meniul Start din Windows se alege optiunea Settings apoi Control Panel

2. Dublu-click pe icoana ODBC ceea ce conduce la afisarea ferestrei ODBC Data Source Administrator3. Se selecteaza optiunea System DSN2. Se selecteaza butonul Add pentru a alege driverul bazei de date si

apoi se apasa butonul Finish3. Se introduce un nume pentru fisierul DSN in caseta Data Source

Name4. Prin apasarea butonului Select se alege o baza de date de tip Access

( *.mdb ) existenta si apoi se apasa butonul OK.

Conectarea la o baza de date

Primul pas in vederea accesarii informatiilor dintr-o baza de date este stabilirea unei conexiuni cu sursa datelor. In acest scop, ADO furnizeaza obiectul Connection care permite stabilirea si administrarea conexiunilor intre aplicatie si baza de date ODBC. Obiectul Connection are o mare varietate de proprietati si metode care permit deschiderea si inchiderea conexiunilor la baza de date, transmiterea interogarilor pentru selectarea si actualizarea datelor.

Page 21: Validari asupra datelor

Pentru a stabili o conexiune la baza de date trebuie creata o instanta a obiectului Connection. Scriptul urmator creaza o instanta a obiectului Connection si apoi deschide conexiunea :

<%' se creaza o instanta a obiectului ConnectionSet cn=Server.CreateObject ("ADODB.Connection")'se deschide conexiuneacn.Open "accessDSN" %>

Obiectul Server furnizeaza accesul la metodele si proprietatile de pe server. Multe dintre aceste metode si proprietati servesc ca si functii utilitare.

Sintaxa este :Server. proprietate | metodaMetodele sale sint : CreateObject, HTMLEncode, MapPath si

URLEncode, iar proprietatea sa este ScriptTimeout. In continuare se va descrie metoda CreateObject care a fost folosita in aplicatie.

Metoda CreateObject creaza o instanta a unei componente server. Sintaxa este :

Server.CreateObject ( progID)Parametrul progID specifica tipul de obiect care se creaza.Implicit, obiectele create cu aceasta metoda au ca scop pagina, ceea ce

inseamna ca sint distruse automat de catre server atunci cind acesta termina de procesat pagina ASP curenta.

Un obiect se mai poate distruge fie prin setarea variabilei la Nothing, fie prin setarea ei la o noua valoare.

Nu se poate crea o instanta a unui obiect avind acelasi nume ca si un obiect bult-in. De exemplu, <% Set Response = Server.CreateObject ("Response") %> va genera eroare.

Executarea interogarilor cu ajutorul obiectului Connection

Dupa deschiderea unei conexiuni cu ajutorul metodei Open a obiectului Connection, se poate utiliza metoda Execute a aceluiasi obiect pentru a transmite interogari SQL catre baza de date.Scriptul urmator utilizeaza metoda Execute a obiectului Connection pentru a transmite bazei de date o comanda SQL Update, care insereaza date intr-o anume tabela.

<%' se creaza o instanta a obiectului ConnectionSet cn=Server.CreateObject ("ADODB.Connection")'se deschide conexiuneacn.Open "lucrare" ' se defineste comanda SQLstrSQL="INSERT INTO Clienti ( Nume, Prenume ) Values ('popescu',

'Ion')"

Page 22: Validari asupra datelor

' se utilizeaza metoda Execute pentru a transmite aceasta comanda 'SQL la baza de datecn.Execute (strSQL)%>

In cazul in care utilizatorul doreste sa afiseze inregistrarile returnate de o interogare Select, rezultatul executiei acestei interogari trebuie depus intr-un obiect de tip Recordset, care se foloseste apoi la afisarea valorilor din cimpurile inregistrarilor, ca in exemplul de mai jos:

<%' se creaza o instanta a obiectului ConnectionSet cn=Server.CreateObject ("ADODB.Connection")'se deschide conexiuneacn.Open "lucrare" ' se defineste comanda SQLstrSQL="Select * from Clienti Order By den_client:' se utilizeaza metoda Execute pentru a transmite aceasta comanda 'SQL la baza de date, iar rezultatul executiei se depune in variabila 'obiect rs de tip recordsetset rs=cn.Execute (strSQL)' pentru afisarea inregistrarilor, setul rs se parcurge cu un cicludo while not rs.eof%>' se afiseaza valoarea din cimpul den_client

<%=rs.fields("den_client")%><%'metoda movenext se utilizeaza pentru a trece la urmatoarea 'inregistrarers.movenextloop %>

4.3 Obiectul Response

Intr-o pagina HTML normala exista continut static. De fiecare data cind este solicitata o pagina HTML, continutul afisat de catre pagina este acelasi. Insa, o pagina ASP are continut ce se modifica ori de cite ori este solicitata pagina.

Dintr-o pagina ASP se poate trimite continut dinamic utilizind obiectul Response, un obiect ASP inclus. Acest obiect reprezinta toata informatia trimisa de serverul Web catre un browser Web.

Sintaxa este :Response.colectie | proprietate|metodaSingura colectie care poate fi utilizata este Cookies si permite setarea

valorilor pentru cookies.

Page 23: Validari asupra datelor

Proprietatile obiectului Response sint : Buffer, cacheControl, Charset, ContentType, Expires, ExpiresAbsolute, IsClientConnected, Pics si Status.

Metodele obiectului Response sint : AddHeader, AppendToLog, BinaryWrite, Clear, End, Flush, Redirect si Write.

4.4 Obiectul Request

Daca obiectul Response reprezinta tot continutul trimis de serverul de Web catre un browser Web, obiectul Request reprezinta tot continutul trimis de un browser Web catre serverul Web. Ori de cite ori trebuie preluata informatie de la un client, se utilizeaza obiectul Request.

Sintaxa este :Request [.colectie | proprietate|metoda] (variabila)Colectiile care pot fi utilizate sint : ClientCertificate, Cookies, Form,

QueryString si ServerVariables.Singura proprietate a obiectului Request este TotalBytes, iar singura

metoda este BinaryRead.Parametrul variabila este un sir care specifica articolul care se regaseste

dintr-o colectie, sau care va fi utilizat ca intrare pentru o metoda sau proprietate.

Colectia Form

Pentru a prelua informatia introdusa de un client intr-un formular HTML se utilizeaza colectia Form a obiectului Request.

Sintaxa este :Request.Form (element) [(index)|.Count ]Parametrul element reprezinta numele elementului de pe forma din care

colectia isi regaseste valorile.Parametrul index reprezinta un parametru optional care permite

accesarea uneia dintre mai multe valori ale unui parametru. El poate lua valori intre 1 si Request.Form ( parametru ).Count.

In exemplul urmator se creaza o forma in care utilizatorul trebuie sa completeze doua cimpuri, si anume : cod si nume. In momentul in care se apasa butonul "Cauta" aceste valori sint trimise catre programul Cauta.asp.

<FORM ACTION="Cauta.asp" METHOD="post"><P> Cod : <INPUT NAME="COD" SIZE="50"></TD><P><TD>Nume:<INPUT NAME="Nume" SIZE="50"></TD><TD><INPUT TYPE="submit" value="Cauta"></TD></TR></FORM>

Page 24: Validari asupra datelor

In programul Cauta.asp trebuie utilizat scriptul urmator, care permite regasirea valorilor trimise de catre forma de mai sus. Cele doua valori sint memorate in variabilele acod_produs si aden_produs.

<%acod_produs=request.form("cod")aden_produs=request.form("nume")%>

Colectia QueryString

Colectia QueryString permite regasirea valorilor variabilelor dintr-un sir interogare HTTP. Un sir interogare HTTP este specificat de valorile care urmeaza semnului ?. Exista mai multe procese care genereaza un sir interogare. De exemplu, tagul A HREF

<A HREF ="exemplu?sir=acesta este un sir"> sir exemplu</A>genereaza o variabila cu numele sir care are valoarea "acesta este un

sir". Sirurile interogare sint generate si prin trimiterea unei forme, sau de catre utilizator prin tastarea unei interogari in caseta de adrese a browser-ului.

Sintaxa este :Request.QueryString ( varibila ) [ (index)|.Count ]Parametrul variabila specifica numele variabilei care trebuie regasita in

sirul interogare.Parametrul index reprezinta un parametru optional care permite

accesarea uneia dintre mai multe valori ale unui parametru. El poate lua valori intre 1 si Request.QueryString ( variabila ).Count.

Exemplu :<A HREF ="detaliu.asp?nume=popa&virsta=20"> Nume si virsta</A>Programului detaliu.asp i se transmite urmatorul sir interogare: nume=popa&virsta=20 Colectia QueryString va contine doi membri, adica nume si virsta. Regasirea valorilor celor doi membri se face astfel :<%Vnume=request.QueryString("nume")Vvirsta=request.QueryString("virsta")In final, cele doua variabile, vnume si vvirsta vor contine valorile

"popa" si "20".

Page 25: Validari asupra datelor

Cap.5 Descrierea aplicatiei

5.1 Structura bazei de date

Baza de date utilizata de aplicatie este realizata in MS Access 2000 si se numeste bdcinema.mdb. In figura 1 apar tabelele ce compun aceasta baza de date si legaturile stabilite intre acestea, rezultate in urma aplicarii teoriei normalizarii relatiilor.

Figura 1 : Structura bazei de date  bdcinema.mdb

Page 26: Validari asupra datelor

Tabela Orase contine un singur cimp den_oras de tip Text, si a fost creata in scopul usurarii activitatii de programare, in continuare putind fi imbogatita cu alte cimpuri asa incit sa poata contribui la publicitatea care se poate face in jurul unui oras in scop turistic.

Tabela Cinematografe cu structura de mai jos permite memorarea unor informatii legate de cinematografe:

- id_cinema (AutoNumber) PK- cinema (Text)- den_oras (Text) FK- adresa (Text)- telefon (Text)

Tabela Filme memoreaza datele necesare despre filmele care ruleaza in cinematografe:

- id_film (AutoNumber) PK- titlu (Text)- titlu_original (Text)- afis ( Text) – calea si numele fisierului care memoreaza poza cu

afisul filmului- gen (text)- roman_de (Text)- durata (Number) in minute- produs_de (Text) – casa producatoare- muzica (Text)- site (Text) – adresa site-ului oficial- subiect (Memo)- recomandat (Logic) –pentru filme de valoare care sunt

recomandate spre vizionare, capata valoarea true- nou (Logic) –pentru filme noi, capata valoarea true- regizor (Text)- imagine (Text)- producator (Text) – directorii filmului- scenarist (Text)

Imaginile din filme sunt memorate intr-o tabela separata numita Imagini care contine urmatoarele cimpuri:

- id_imagine (autonumber) PK- id_film (Number) -FK- cale_poza (Text) - calea fisierului imagine

Informatiile despre actori sunt grupate in cimpurile tabelei Actori:- id_actor (AutonNmber) PK- nume_actor (Text)

Page 27: Validari asupra datelor

- locul_nasterii (Text)- data_nast (Date/time)- biografie (Memo)

Tabela Distributie dispune de structura:- id (AutoNumber) PK- id_film (Number) FK- id_actor (Number) FK- personaj (Text) numele personajului interpretat de actor in film

Tabela Saptamina memoreaza date despre saptamina curenta si cea viitoare pentru care memoram datele:

- saptamina (Text) PK- data1 (Date/time) – data de inceput a saptaminii- data2 (Date/time – data de sfirsit a saptaminii

Tabela Programare memoreaza informatii despre orele la care ruleaza filmele in diferitele cinematografe:

- id (Autonumber) PK- saptamina (Text) - FK indica saptamina in care ruleaza filmul

(curenta sau viitoare)- id_cinema (Number) FK- id_film (Number) – FK- program (Text) - zilele si orele la care ruleaza filmul

Tabela Utiliz este cea care memoreaza numele de utilizator si parola pentru utilizatorii care vor primi drept de gestionare a bazei de date.

5.2 Legaturi intre tabele

In acest paragraf doresc sa explic legaturile pe care le-am stabilit intre tabelele bazei de date.

Intre tabelele Orase si Cinematografe exista o legatura 1 :m deoarece intr-un oras exista unul sau mai multe cinematografe.

Intre tabelele Filme si Imagini exista o legatura 1:m, deoarece pentru un film putem memora una sau mai multe scene.

Intre tabelele Filme si Actori exista o legatura m:m, pentru ca intr-un film joaca mai multi actori, iar un actor poate fi distribuit in mai multe filme. Pentru ca in modelul relational nu se poate implementa direct o legatura m:m,

Page 28: Validari asupra datelor

atunci a aparut cea de a treia tabela Distributie, care contine cheile primare din cele doua tabele implicate in legatura m:m, precum si cimpuri suplimentare.

Intre tabelele Cinematografe si Filme exista o legatura m:m, pentru ca intr-un cinema pot rula unul sau mai multe filme in saptamina curenta sau viitoare, iar acelasi film poate rula intr-unul sau mai multe cinematografe. Ca urmare, a aparut tabela Programare.

Se observa ca aici mai exista o legatura 1:m intre tabelele Saptamina si Programare, pentru ca atit pentru saptamina curenta, cit si pentru cea viitoare exista mai multe programari de filme in diverse cinematografe.

5.3 Interfata cu utilizatorul

In acest paragraf voi prezenta aspectul si continutul paginilor site-ului care face obiectul acestei lucrari.

Page 29: Validari asupra datelor

5.4 Validari asupra datelor

Procedurile de validare sunt utile in partea de administrare a site-ului, pentru ca acolo apar operatii de inserare sau actualizare asupra datelor. Procedurile de validare ajuta la pastrarea consistentei datelor si pentru a evita ca utilizatorul sa paraseasca pagina din cauza unei erori. Voi prezenta in continuare citeva din validarile facute pe parcursul acestei lucrari.

La adaugarea unui nou cinematograf, este necesar ca denumirea acestuia sa fie completat, adica cimpul cinema sa fie diferit de sirul vid. Verificarea se face in fisierul .asp care implementeaza operatia de inserare sau adaugare date. Daca valoarea din cimp este vida se afiseaza un mesaj de eroare corespunzator, ar utilizatorul este trimis inapoi in pagina in care trebuie sa repare gresala.

if cinema="" then errorform "Cimpul Cinematograf trebuie completat !", backpageend if

In aplicatie este utilizata procedura ErrorForm care are doi parametri formali: errormsg si backpage. La apel, Errormsg va contine mesajul de eroare care trebuie afisat, iar backpage numele fisierului .asp la care trebuie intors utilizatorul.

<!-- #INCLUDE FILE="formFields.asp" --><%SUB errorform (errorMSG,backpage)%><HTML><HEAD><TITLE>Eroare</TITLE></HEAD><BR><BR><BR><BR><BODY bgcolor="black"><CENTER><FONT SIZE=5 COLOR="White"><%=errorMSG%></FONT><FORM ACTION="<%=backpage%>" METHOD ="POST"><Input name="error" type="hidden" value="1"><%formFields%><INPUT TYPE="Submit" VALUE="Inapoi">

Page 30: Validari asupra datelor

</FORM></CENTER></BODY></HTML><%Response.EndEND SUB%>

La gestionarea informatiei din tabela Filme trebuie verificat ca titlul unui film nu este sirul vid. De asemenea, se verifica daca cimpul durata este numeric, pentru ca altfel vom avea eroare la executia comenzilor Insert sau Update. Aceasta ultima verificare se face cu functia IsNumeric().

if titlu="" then errorform "Titlul filmului trebuie completat !", backpageend if

if not isnumeric(durata) then errorform "Durata este un cimp numeric !", backpageend if

La introducerea sau actualizarea datelor despre actori, se verifica ca numele actorului sa nu fie sirul vid, si de asemenea ca data lui de nastere sa aiba formatul correct de data calendaristica. Pentru aceasta se foloseste functia IsDate().

if nume_actor="" then errorform "Numele actorului trebuie completat !", backpageend if

if not isdate(data_nast) then errorform "Data nasterii nu are format corect de data calendaristica !", backpageend if

La actualizarea datelor din tabela Saptamina, trebuie ca datele de inceput si sfirsit ale saptaminii sa fie completate, si sa aiba format correct.

if data1="" then errorform "Data inceput trebuie completata !", backpageend if

if not isdate(data1) then errorform "Data nu are format corect de data calendaristica !", backpageend if

if data2="" then errorform "Data sfirsit trebuie completata !", backpageend if

if not isdate(data2) then errorform "Data nu are format corect de data calendaristica !", backpageend if

Page 31: Validari asupra datelor

Mai jos apare un alt exemplu de validare, din pagina Utilizatori. Aici se verifica in primul rind ca nume_utilizator sa fie diferit de sirul vid. Se verifica apoi ca si cimpurile parola si confirma parola sa fie diferite de sirul vid si apoi sa fie identice.if nume_utilizator="" then errorform "Cimpul Nume utilizator trebuie completat !", backpageend ifif parola="" then errorform "Cimpul Parola trebuie completat !", backpageend ifif parola1="" then errorform "Cimpul Confirma parola trebuie completat !", backpageend ifif parola<>parola1 then errorform "Cimpul Confirma parola difera de cimpul Parola!", backpageend if

Pentru a avea acces la paginile de administrare, utilizatorul trebuie sa furnizeze un nume de utilizator si o parola. Trebuie sa se verifice daca in tabela Utilizator exista o inregistrare corespunzatoare acestuia. In cazul in care nu exista, se afiseaza mesajul corespunzator, altfel, utilizatorul va fi lasat sa mearga mai departe, dupa ce se seteaza in variabila cookie c datele de identificare ale acestuia ( utilizator si parola). Valorile din aceste doua cimpuri ale variabilei cookie c, vor fi verificate ca exista si sunt completate in fiecare pagina a site-ului.

<%utilizator=request.form("utilizator")%><%parola=request.form("parola")%><%mydsn="DSN=bdcinema"set con=server.createobject("adodb.connection") con.open mydsnsql="select * from utiliz where utilizator='" & utilizator & "' and

parola='" & parola & "'"set rs=con.execute (sql)if not rs.eof then Response.cookies("c")("utilizator")=utilizator

Response.cookies("c")("parola")=parola cuser =Request.Cookies ("c")("utilizator") cpass =Request.Cookies ("c")("parola")%> <%response.redirect "index.asp"

else%> <BR><BR><BR><BR>

<CENTER><FONT SIZE=5 color="white">Nu am putut identifica utilizatorul!</FONT>

<FORM ACTION="intra.asp" METHOD="POST"> <INPUT TYPE="Submit" VALUE="Inapoi"> </FORM> </CENTER><%end if%>

Dupa intrarea unui utilizator in partea de administrare a site-ului, in fiecare pagina are loc o verificare ca cea din script-ul de mai jos.

<%cuser =Request.Cookies ("c")("utilizator") cpass =Request.Cookies ("c")("parola")

Page 32: Validari asupra datelor

if cuser="" or cpass="" then permis=false else permis=true end if%>

Se regasesc valorile depuse in variabila cookie c ( utilizator si parola ) si se depun in variabilele cuser si cpass, folosind colectia Cookies a obiectului Request. Se verifica apoi daca acestea sunt diferite de sirul vid. Daca da variabila permis capata valoarea true altfel valoarea false. In continuare, in pagina se verifica daca variabila permis este true, caz in care se afiseaza informatia din acea pagina. In caz contrar, vizitatorul este refuzat, spunind ca nu are drepturi.

Aceasta forma de validare in fiecare pagina a site-ului de administrare impiedica intrarea in pagini ocolind partea de login unde trebuie furnizat numele si parola de utilizator.

5.5 Tehnici de programare utilizate in partea de administrare

5.5.1 Conexiunea la baza de date

In fiecare pagina a site-ului care afiseaza informatii din baza de date trebuie realizata conexiunea la baza de date. Dupa cum se observa conexiunea la baza de date este realizata prin intermediul ODBC (Open Database Connectivity). Pentru a realiza conexiunea la baza de date se creeaza o instanta a obiectului Adodb.Connection folosind metoda Createobject a obiectului Server. Obiectul de tip conexiune se numeste con. Aceasta conexiune se deschide folosind metoda open si specificind numele sursei datelor declarata in ODBC. Numele Bdcinema declarat in ODBC ( in System DSN ) indica catre baza de date bdcinema.mdb care este folosita de paginile site-ului.

<%mydsn="DSN=bdcinema"set con=server.createobject("adodb.connection") con.open mydsn%>

5.5.2 Inserarea si actualizarea datelor

In partea de administrare, lucrurile sunt programate sa se desfasoare astfel: in partea de sus apare meniul principal cu principalele hiperlegaturi, se afiseaza datele existente in tabela selectata, in dreptul fiecarei inregistrari se afiseaza hiperlegaturile Actualizare si Stergere, iar mai jos butonul Adauga care permite adaugarea unei noi inregistrari. Voi face exemplificare pe gestiunea tabelei cinematografe. Pentru afisarea inregistrarilor existente in aceasta tabela se executa comanda Select din variabila sqls. Dupa executia

Page 33: Validari asupra datelor

comenzii, se obtine variabila recordset rss folosita apoi pentru afisarea inregistrarilor. Se parcurg aceste inregistrari cu ajtorul unui iclu do while…loop peste variabila rss, in prealabil verificindu-se daca recordset-ul nu este vid. Se afiseaza datele despre cinematografe, adica valorile din cimpurile cinema, adresa si telefon. Hiperlegatura Actualizeaza permite editarea inregistrarii identificata in mod unic de valoarea id_cinema. Hiperlegatura ne conduce in aceeasi pagina catre care se trimite variabila id_cinema si edit pentru a sti ca este vorba de operatia de editare si pentru a sti ce inregistrare se editeaza.

<%sqls="select * from Cinematografe order by den_oras"set rss=con.execute (sqls)%>

<%if not rss.eof then%><CENTER><b>Cinematografe</b><br><TABLE BORDER=1 width=600 cellspacing=0><%do while not rss.eof%>

<%id_cinema=rss.fields("id_cinema")%><TR>

<TD><B><%=rss.fields("cinema")%><td><%=rss("den_oras")%></B></TD><td><%=rss("adresa")%><td><%=rss("telefon")%>

<%leg1="stergec1.asp?id_cinema=" & id_cinema%> <%leg2="c1.asp?edit=1&id_cinema=" & id_cinema%>

<TD><A HREF="<%=leg2%>">Actualizare</A>/<A HREF="<%=leg1%>">Stergere</A></TD>

</TR><%rss.movenext

loop%></TABLE></CENTER><BR><BR>

<%end if%>

Daca variabila edit recuperata cu ajutorul colectiei Querystring a obiectului Request are valoarea 1, trebuie efectuata operatia de editare a inregistrarii obtinuta prin executia comenzii Select din variabila sir sql1 si depusa in obiectul rs1.

<%edit=request.querystring("edit")%><%if edit=1 then sql1="select * from Cinematografe where id_cinema=" & id_cinema set rs1=con.execute (sql1)end if%>

Butonul de adaugare o noua inregistrare este un buton submit amplasat pe o forma care transfera controlul aceluiasi fisier, dar trimite variabila ad egala cu 1 pentru a indica operatia de adaugare.

<FORM ACTION="c1.asp?ad=1" METHOD="POST" ><TR><TD><INPUT TYPE="SUBMIT" VALUE="Adauga"></TD></TR></FORM>

Page 34: Validari asupra datelor

In continuare, in functie de valorile variabilelor edit si ad se afiseaza forma pentru editarea sau adaugarea datelor. Deci, se testeaza daca variabila edit are valoarea 1, caz in care se afiseaza controalele populate cu valorile din cimpurile inregistrarii de editat. Altfel, se testeaza daca variabila ad are valoarea 1, caz in care se afiseaza forma cu controalele vide, pregatita pentru primirea noilor date. Dupa completarea formei, controlul este redat unui alt fisier in care se face, dupa caz inserare sau actualizare.

<%if ad=1 then%><CENTER><TABLE><FORM ACTION="admod1.asp?ad=1" METHOD="POST"><TR><TD>Cinema:</TD><TD><INPUT TYPE="TEXT" NAME="cinema" VALUE="<%=cinema%>" SIZE=50></TD></TR><TR><TD>Oras:</TD><TD><%sqlo="Select * from Orase "set rso=con.execute(sqlo)%><select name="den_oras"><%if not rso.eof then%><%do while not rso.eof%> <option value="<%=rso("den_oras")%>" <%if rso("den_oras")=den_oras then%>selected<%end if%>><%=rso("den_oras")%><%rso.movenext%><%loop%><%end if%></select></TD></TR><TR><TD>Adresa:</TD><TD><INPUT TYPE="TEXT" NAME="adresa" VALUE="<%=adresa%>" SIZE=50></TD></TR><TR><TD>Telefon:</TD><TD><INPUT TYPE="TEXT" NAME="telefon" VALUE="<%=telefon%>" SIZE=20></TD></TR><TR><TD><INPUT TYPE="SUBMIT" VALUE="Salveaza"></TD></FORM>

<FORM ACTION="c1.asp?cancel=1" METHOD="POST"><TD><INPUT TYPE="SUBMIT" VALUE="Abandon"></TD></TR></FORM></TABLE></CENTER><%else%>

<%if edit=1 then%><CENTER><TABLE><FORM ACTION="admod1.asp?edit=1" METHOD="POST" ><INPUT TYPE=hidden NAME="id_cinema" VALUE="<%=rs1.fields("id_cinema")%>"><TR><TD>Cinema:</TD><TD><INPUT TYPE="TEXT" NAME="cinema" VALUE="<%=rs1.fields("cinema")%>" SIZE=50></TD></TR><TR><TD>Oras:</TD><TD><%sqlo="Select * from Orase"set rso=con.execute(sqlo)%><select name="den_oras"><%if not rso.eof then%>

Page 35: Validari asupra datelor

<%do while not rso.eof%> <option value="<%=rso("den_oras")%>" <%if rso("den_oras")=rs1("den_oras") then%>selected<%end if%>> <%=rso("den_oras")%><%rso.movenext%><%loop%><%end if%></select></TD></TR>

<TR><TD>Adresa:</TD><TD><INPUT TYPE="TEXT" NAME="adresa" VALUE="<%=rs1.fields("adresa")%>" SIZE=50></TD></TR><TR><TD>Telefon:</TD><TD><INPUT TYPE="TEXT" NAME="telefon" VALUE="<%=rs1.fields("telefon")%>" SIZE=20></TD></TR>

<TR><TD><INPUT TYPE="SUBMIT" VALUE="Salveaza"></TD></FORM>

<FORM ACTION="c1.asp?cancel=1" METHOD="POST" ><TD><INPUT TYPE="SUBMIT" VALUE="Abandon"></TD></TR></FORM></TABLE></CENTER>

<%end if%><%end if%>

In cazul exemplului nostru, actualizarea sau inserarea se face de catre fisierul admod1.asp. Catre acesta se trimit variabilele ad sau edit care se recupereaza folosind colectia Querystring a obiectului Request. Se obtin si valorile variabilelor completate pe forma, dar folosind colectia Forms a aceluiasi obiect Request. Se fac validarile asupra datelor. Daca acestea nu sunt completate, sau sunt completate gresit, controlul este redat inapoi fisierului pentru a corecta greselile. Daca toate lucrurile sunt bune, se trece la executia comenzii SQL Insert daca variabila ad are valoarea 1, sau a comenzii SQL Update daca variabila edit are valoarea 1. Executia acestor comenzi se face cu ajutorul metodei Execute a obiectului conexiune la baza de date. In final, controlul este redat fisierului anterior, folosind metoda Redirect a obiectului Response.

<%mydsn="DSN=bdcinema"set con=server.createobject("adodb.connection") con.open mydsn

ad=request.querystring("ad")edit=request.querystring("edit")%>

<%id_cinema=request.form("id_cinema")%><%cinema=request.form("cinema")%><%den_oras=request.form("den_oras")%><%adresa=request.form("adresa")%><%telefon=request.form("telefon")%>

<%if ad=1 then backpage="c1.asp?ad=1"

Page 36: Validari asupra datelor

else backpage="c1.asp?edit=1&id_cinema=" & id_cinemaend ifif cinema="" then errorform "Cimpul Cinematograf trebuie completat !", backpageend ifif ad=1 then sqlins="Insert into Cinematografe(cinema, den_oras, adresa, telefon) Values('" sqlins=sqlins & cinema & "','" & den_oras & "','" & adresa & "','" & telefon & "')"end ifif edit=1 then sqlins="Update cinematografe Set cinema='" & cinema & "'," sqlins=sqlins & "den_oras='" & den_oras & "'," sqlins=sqlins & "adresa='" & adresa & "'," sqlins=sqlins & "telefon='" & telefon & "' where id_cinema=" & id_cinemaend ifcon.execute (sqlins)ad=0edit=0%><BODY><%response.redirect "c1.asp"%>

5.5.3 Stergerea datelor

In ceea ce priveste stergerea unei inregistrari, trebuie urmata hiperlegatura cu acelasi nume care ne conduce in fisierul .asp ce realizeaza stergerea efectiva a acesteia. Catre acest fisier se trimite obligatoriu valoarea cimpului cheie primara pentru a identifica in mod unic inregistrarea care se sterge. N cazul administrarii tabelei Cinematografe, la stergere, controlul este dat fisierului stergec1.asp catre care se trimite valoarea variabilei id_cinema.

<%leg1="stergec1.asp?id_cinema=" & id_cinema%>

In fisierul stergec1.asp, se afla valoarea variabilei id_cinema trimisa sub forma unui sir interogare, se descide conexiunea la baza de date si se executa comanda Delete cu clauza Where care identifica in mod unic inregistrarea de sters. Dupa executia comenzii SQL delete controlul este redat fisierului anterior cu aceeasi metoda Redirect a obiectului Response.

<%id_cinema=request.querystring("id_cinema")%><%mydsn="DSN=bdcinema"set con=server.createobject("adodb.connection") con.open mydsnsqlins="Delete * from Cinematografe where id_cinema=" & id_cinemacon.execute (sqlins)%><%response.redirect "c1.asp"%>

In final, doresc sa precizez, ca in fiecare pagina de administrare a datelor din tabele bazei de date, lucrurile decurg intr-o maniera asemanatoare.

Page 37: Validari asupra datelor

5.6 Tehnici de programare utilizate in partea de client

5.6.1 Pagina Acasa

Afiseaza pe de o parte titlurile filmelor care au cimpul Nou setat la True, precum si filmele recomandate care au cimpul Recomandat setat la True. Pentru aceasta se selecteaza din tabela Filme inregistrarile care satisfac conditia nou=True. Comanda Select memorata in variabila sql1, este trimisa spre executie la SGBD, iar rezultatul este depus in variabila rs1, variabila obiect de tip recordset. Exectia unei comenzi SQL se face cu metoda Execute a obiectului conexiune la baza de date. Pentru a afisa titlurile filmelor noi se parcurge obiectul recordset rs1 cu ajutorul unui ciclu do while…loop. Trecerea la urmatoarea inregistrare se face cu metoda Movenext a obiectului recordset rs1.

<%sql1="Select * from Filme where nou=true" set rs1=conntemp.execute(sql1)%><%if not rs1.eof then%><h3>Filme noi</h3><%do while not rs1.eof%><table width=565><tr><td colspan=2><a href="./filme/filmed.asp?id_film=<%=rs1("id_film")%>"><h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a><tr><td valign="top"><%afis="." & rs1("afis")%><img src="<%=afis%>"><td><%=rs1("subiect")%><tr><td>&nbsp<td>&nbsp</table><%rs1.movenext%><%loop%><%end if%>

Afisarea valorii dintr-un cimp al recordset-ului se face cu constructia <%=recordset(“nume_cimp”)%>. De exemplu pentru a afisa titlul filmului se scrie : <%=rs1("titlu")%>. Pe titlul filmului este amplasata o hiperlegatura care ne trimite in pagina filmed.asp care afiseaza detalii despre film. Catre aceasta pagina se trimite sub forma unui sir interogare variabila id_film setata la valoarea cimpului id_film, care identifica in mod unic filmul despre care vrem detalii.

Pentru afisarea informatiilor despre filmele recomandate, se procedeaza asemanator, cu script-ul urmator:

<%sql1="Select * from Filme where recomandat=true and nou=false" set rs1=conntemp.execute(sql1)%><%if not rs1.eof then%><h3>Va recomandam urmatoarele filme</h3><%do while not rs1.eof%><table width=565>

Page 38: Validari asupra datelor

<tr><td colspan=2><a href="./filme/filmed.asp?id_film=<%=rs1("id_film")%>"><h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a><tr><td valign="top"><%afis="." & rs1("afis")%><img src="<%=afis%>"><td><%=rs1("subiect")%><tr><td>&nbsp<td>&nbsp</table><%rs1.movenext%><%loop%><%end if%>

5.6.2 Pagina In cinematografe

Se afiseaza datele care incadreaza saptamina curenta. Pentru aceasta, dupa ce ne conectam la baza de date selectam din tabela Saptamina inregistrarea corespunzatoare saptaminii curente.

<%sql1="Select * from Saptamina where saptamina='curenta'" set rs1=conntemp.execute(sql1)%><h3>Programul cinematografelor in saptamina <%=rs1("data1")%>-<%=rs1("data2")%></h3>

Se afiseaza apoi o lista drop-down care contine numele oraselor din tabela Orase ordonate alfabetic. Lista contine inregistrarile din tabela Orase selectate cu comanda din variabila sql2. Lista drop-down este realizata dinamic cu ajutorul obiectului recordset rs2, folosind tag-urile <Select> si <Option>. Lista este inclusa intr-o forma HTML care la apasarea butonului de tip Submit Alege ne va trimite in aceeasi pagina in_cinematografe.asp, pentru ca dupa alegerea unui oras tot aici se vor afisa cinematografele si programele lor corespunzatoare orasului ales.

<%sql2="Select * from orase order by den_oras" set rs2=conntemp.execute(sql2)%><table><form method="post" action="in_cinematografe.asp"><tr><td><select name="do1"><%if not rs2.eof then%><%do while not rs2.eof%>

<option value="<%=rs2("den_oras")%>" <%if den_oras=rs2("den_oras") then%>selected<%end if%>> <%=rs2("den_oras")%></option><%rs2.movenext%><%loop%><%end if%></select><td><input type="submit" value="Alege"><td>&nbsp

Page 39: Validari asupra datelor

</form>

Obtinerea variabilei care indica orasul ales in formularul HTML, se obtine folosind colectia Forms a obiectului Request. Variabila den_oras ne va ajuta mai departe sa selectam doar informatia aferenta acestui oras.

<%den_oras=request.form("do1")

Se selecteaza doar cinematografele din orasul selectat si indicat de varibila den_oras ( variabila sqlc). In rsc se depun aceste inregistrari. Acest recordset este parcurs secvential pentru a afisa numele cinematografului, adresa si telefonul sau. A fiecare pas al ciclului peste rsc, se executa interogarea Select din variabila sqlfilme. Este o interogare complicata care permite afisarea titlurilor filmelor ce ruleaza in sapatamina curenta la cinematograful curent. Pentru a afisa titlurile acestor filme, se parcurge cu un ciclu variabila recordset rsf in care sunt depuse aceste inregistrari. Pentru fiecare titlu de film afisat, trebuie sa apara si programarile acestuia, ziua si ora. Pentru aceasta trebuie executata interogarea din variabila sqlp care selecteaza din tabela Programari toate inregistrarile pentru filmul current si la cinematograful current. Ele sunt depuse in variabila recordset rsp care si ea trebuie parcursa cu un ciclu pentru afisare.

Ca urmare in script-ul de mai jos apar trei cicluri imbricate: unul pentru afisarea cinematografelor din orasul selectat, al doilea pentru filmele care ruleaza in saptamina curenta la fiecare cinematograf si al treilea pentru programarile fiecarui film la fiecare cinematograf.

<%if den_oras<>"" then%><%sqlc="Select * from cinematografe where den_oras='" & den_oras & "'"set rsc=conntemp.execute(sqlc)%><%if not rsc.eof then%><table width=565><%do while not rsc.eof%> <tr bgcolor="lightgrey"><td colspan=2><font color="black"><%=rsc("cinema")%>(<%=rsc("adresa")%> tel:<%=rsc("telefon")%>)</font><%sqlfilme="SELECT programare.id_cinema, programare.id_film, filme.titlu, "sqlfilme=sqlfilme & " filme.titlu_original, programare.saptamina FROM filme INNER JOIN "sqlfilme=sqlfilme & " programare ON filme.id_film = programare.id_film GROUP BY "sqlfilme=sqlfilme & " programare.id_cinema, programare.id_film, filme.titlu, "sqlfilme=sqlfilme & " filme.titlu_original, programare.saptamina "sqlfilme=sqlfilme & " HAVING programare.id_cinema=" & rsc("id_cinema") sqlfilme=sqlfilme & " AND programare.saptamina='curenta'"

set rsf=conntemp.execute(sqlfilme)%><%if not rsf.eof then%><%do while not rsf.eof %><tr><td valign="top">

Page 40: Validari asupra datelor

<a href="film.asp?id_film=<%=rsf("id_film")%>&den_oras=<%=den_oras%>"><%=rsf("titlu")%> (<%=rsf("titlu_original")%> )</a><td valign="top"><%sqlp="SELECT [programare].[id_film], [programare].[program], [programare].[saptamina], "sqlp=sqlp & " [programare].[id_cinema] FROM programare WHERE "sqlp=sqlp & " [programare].[saptamina]='curenta' And [programare].[id_cinema]=" & rsc("id_cinema")sqlp=sqlp & " and [programare].[id_film]=" & rsf("id_film")set rsp=conntemp.execute(sqlp)%><%if not rsp.eof then%><%do while not rsp.eof%> <%=rsp("program")%><br><%rsp.movenext%><%loop%><%end if%><tr bgcolor="lightblue"><td colspan=3><%rsf.movenext%><%loop%><%end if%><%rsc.movenext%><%loop%></table><%end if%><%end if%>

5.6.3 Pagina cu informatii detaliate despre un film

Asa cum am spus pe titlul filmului este pusa hiperlegatura la pagina cu informatii detaliate despre film, catre care se trimite varibila id_film ce identifica in mod unic filmul. Varibila, fiind trimisa ca sir interogare, se obtine folosind colectia Querystring a obiectului Request.

id_film=request.querystring("id_film")

Pentru a afisa informatiile despre filmul identificat unic de id_film, trebuie sa interogam tabela Filme si tabelele Distributie si Actori. Comenzile Select se afla in sql1 si sql2.

<%sql1="Select * from Filme where id_film=" & id_film set rs1=conntemp.execute(sql1)sql2="SELECT distributie.id_film, distributie.id_actor, distributie.personaj, "sql2=sql2 & " actori.nume_actor FROM actori INNER JOIN distributie "sql2=sql2 & " ON actori.id_actor = distributie.id_actor where distributie.id_film=" & id_film set rs2=conntemp.execute(sql2)%>

Folosind variabilele recordset rs1 si rs2 putem sa afisam toate informtiile despre film: gen, productie, regizor, scenarist,s.a.m.d. Pentru ca afisarea sa fie cit mai ordonata se folosesc tabele HTML.

<table width=565><tr><td bgcolor="lightgrey"><font color="black" size=4>

Page 41: Validari asupra datelor

<%=rs1("titlu")%> (<%=rs1("titlu_original")%>)</font></table><table><%afis=".." & rs1("afis")%><tr><td valign="top"><img src="<%=afis%>"><td><%=rs1("subiect")%></table><br><br><table width=450><tr><td>Gen:<td><%=rs1("gen")%><tr><td>Dupa un roman de:<td><%=rs1("roman_de")%><tr><td>Durata:<td><%=rs1("durata")%> minute<tr><td>Casa productie:<td><%=rs1("produs_de")%><tr><td>Director film:<td><%=rs1("producator")%><tr><td>Regie:<td><%=rs1("regizor")%><tr><td>Scenariu:<td><%=rs1("scenarist")%><tr><td>Imagine:<td><%=rs1("imagine")%><tr><td>Muzica:<td><%=rs1("muzica")%></table>

Pentru afisarea distributiei: nuem personaj si nume actor se parcurge variabila recordset rs2, ca mai jos.

<%if not rs2.eof then%><table width=565><tr><td colspan=3 bgcolor="lightgrey"><font color="black">Distributie</font><%do while not rs2.eof%> <tr><td><%=rs2("personaj")%><td>...<td><a href="actor.asp?id_actor=<%=rs2("id_actor")%>" target="new"><%=rs2("nume_actor")%><a href><%rs2.movenext%><%loop%></table><%end if%>

Filmele dispun, in general si de o colectie de imagini memorate in tabela Imagini. Pentru afisarea lor se executa comanda Select din variabila sql3, care selecteaza imaginile pentru filmul identificat de id_film. Pentru afisare se parcurge variabila recordset rs3 si se foloseste tag-ul HTML <IMG SRC>.

<%sql3="select * from Imagini where id_film=" & id_filmset rs3=conntemp.execute(sql3)%>

<%if not rs3.eof then%><table width=565>

Page 42: Validari asupra datelor

<tr><td colspan=2 bgcolor="lightgrey"><font color="black">Imagini din film</font><%do while not rs3.eof%> <%p=".." & rs3("cale_poza")%> <tr><td><img src="<%=p%>"> <%rs3.movenext%> <%if not rs3.eof then%>

<%p=".." & rs3("cale_poza")%> <td><img src="<%=p%>"> <%end if%><%if not rs3.eof then%> <%rs3.movenext%><%end if%><%loop%></table><%end if%>

5.6.4 Pagina cu informatii detaliate despre un actor

La afisarea distributiei unui film, pe numele fiecarui actor este amplasata o hiperlegatura care ne conduce in pagina actor.asp pentru a afla date despre acesta.

Obtinerea variabilei id_actor trimisa sub forma unui sir interogare, se face tot cu colectia Querystring a obiectului Request. Variabila ajuta la identificarea unica a actorului. Datele despre acesta se obtin din tabela Actori cu comanda Select din variabila sql1. Urmeaza apoi afisarea datelor ( nume, data nasterii, locul nasterii, biografie) in forma tabelara cu ajutorul obiectului Recordset rs1.

<%id_actor=request.querystring("id_actor")

mydsn="DSN=bdcinema"Set conntemp = Server.CreateObject("ADODB.Connection")conntemp.Open mydsn%><%sql1="Select * from Actori where id_actor=" & id_actor set rs1=conntemp.execute(sql1)%><center><table width=565><tr><td bgcolor="lightgrey" colspan=2><font color="black" size=5><%=rs1("nume_actor")%></font><tr><td>Data nasterii:<td><%=rs1("data_nast")%><tr><td>Locul nasterii:<td><%=rs1("locul_nasterii")%><tr><td colspan=2><%=rs1("biografie")%></table>

5.6.5 Pagina Filme

In aceasta pagina se afiseaza titlurile tuturor filmelor care ruleaza oriunde in tara in sapatamina curenta. Pentru fiecare film se afiseaza titlul, afisul si descrierea subiectului. Pentru a face selectia inregistrarilor se executa comanda Select din variabila sql1, rezultatul depunindu-se in variabila

Page 43: Validari asupra datelor

recordset rs1. Informatiile detaliate se obtin urmind hiperlegatura amplasata pe titlul filmului. Comanda Select foloseste optiunile Group By si Having.

<%mydsn="DSN=bdcinema"Set conntemp = Server.CreateObject("ADODB.Connection")conntemp.Open mydsn%><%sql1="SELECT filme.id_film, filme.titlu, filme.titlu_original, filme.afis, "sql1=sql1 & " filme.subiect, programare.saptamina FROM filme INNER JOIN programare "sql1=sql1 & " ON filme.id_film = programare.id_film GROUP BY filme.id_film, filme.titlu, "sql1=sql1 & " filme.titlu_original, filme.afis, filme.subiect, programare.saptamina "sql1=sql1 & " HAVING (((programare.saptamina)='curenta')) ORDER BY filme.titlu" set rs1=conntemp.execute(sql1)%><%if not rs1.eof then%><table width=565><%do while not rs1.eof%><tr><td colspan=2><a href="filmed.asp?id_film=<%=rs1("id_film")%>"><h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a><tr><td valign="top"><%afis=".." & rs1("afis")%><img src="<%=afis%>"><td><%=rs1("subiect")%><%rs1.movenext%><%loop%></table><%end if%>

5.6.6 Pagina Actori

Afiseaza lista alfabetica cu numele actorilor existenti in baza de date. Afisarea se face pe doua coloane pentru a ocupa mai bine fereastra browser-ului cu informatie. Se interogheaza tabela Actori. Inregistrarile sunt depuse in variabila recordset rs1. Numele fiecarui actor este o hiperlegatura la aceeasi pagina actori.asp catre care se trimite variabila id_actor. Asta inseamna ca datele de detaliu despre actorul selectat se fac in aceeasi pagina sub lista cu numele actorilor. Dupa obtinerea variabilei id_actor cu ajutorul colectiei Querystring a obiectului Request se executa cea de a doua interogare din script-ul de mai jos care selecteaza din tabela Actori numai inregistrarea corespunzatoare actorului selectat.

<%mydsn="DSN=bdcinema"Set conntemp = Server.CreateObject("ADODB.Connection")conntemp.Open mydsn%><%sql1="Select * from Actori order by nume_actor" set rs1=conntemp.execute(sql1)%><center><%if not rs1.eof then%><table width=565><%do while not rs1.eof%>

Page 44: Validari asupra datelor

<tr><td><font size=4><a href="actori.asp?id_actor=<%=rs1("id_actor")%>"><%=rs1("nume_actor")%></a></font> <%rs1.movenext%> <%if not rs1.eof then%> <td><font size=4> <a href="actori.asp?id_actor=<%=rs1("id_actor")%>"> <%=rs1("nume_actor")%></a></font> <%end if%><%if not rs1.eof then%> <%rs1.movenext%><%end if%><%loop%></table><%end if%></P><p><%id_actor=request.querystring("id_actor")%><%if id_actor<>"" then%><%sql1="Select * from Actori where id_actor=" & id_actor set rs1=conntemp.execute(sql1)%><center><table width=565><tr><td bgcolor="lightgrey" colspan=2><font color="black" size=5><%=rs1("nume_actor")%></font><tr><td>Data nasterii:<td><%=rs1("data_nast")%><tr><td>Locul nasterii:<td><%=rs1("locul_nasterii")%><tr><td colspan=2><%=rs1("biografie")%></table><%end if%>

5.6.7 Pagina Arhiva filme

Afiseaza titlurile filmelor existente in arhiva, adica cele despre care avem informatii in baza de date si care nu ruleaza in nici un cinematograf nici in saptamina curenta nici in cea viitoare. Pntru a face selectia acestor filme trebuie executata comanda Select memorat in variabila sql1 care contine si subinterogare ( Select in Select). E selecteaza toate filmele din tabela cu acelasi nume si care nu figureaza in tabela Programare folosind operatorul not in. Afisarea se face in modalitatea stiuta. Fiecare titlu de film este o hiperlegatura la pagina cu detalii.

<%mydsn="DSN=bdcinema"Set conntemp = Server.CreateObject("ADODB.Connection")conntemp.Open mydsn%><%sql1="SELECT * from Filme where id_film not in ( Select id_film from Programare)" set rs1=conntemp.execute(sql1)%><%if not rs1.eof then%><table width=565><%do while not rs1.eof%><tr><td colspan=2><a href="filmed.asp?id_film=<%=rs1("id_film")%>"><h3><%=rs1("titlu")%> ( <%=rs1("titlu_original")%> )</h3></a><tr><td valign="top"><%afis=".." & rs1("afis")%>

Page 45: Validari asupra datelor

<img src="<%=afis%>"><td><%=rs1("subiect")%><%rs1.movenext%><%loop%></table><%end if%>

In final doresc sa mentionez ca pagina in viitor are o realizare tehnica asemanatoare cu cea intitulata In cinematografe.

Cap.6 Concluzii

Aplicatia intitulata “Gestiune si prezentare on-line a programelor cinematografelor din Romania”, reprezinta o colectie de pagini web care realizeaza doua functiuni importante:

1. pune la dispozitia publicului larg o serie de informatii despre filmele are ruleaza in cinematografele din diverse orase

2. permite gestionarea informatiei din baza de date din care isi extrage site-ul continutul.

Informatiile oferite de site sunt grupate sub titlurile : Acasa, In cinematografe, In viitor, Filme, Actori, Arhiva.

Mentionez ca in partea de administrare, accesul se face numai pentru utilizatorii autorizati, care se identifica printr-un nume si o parola. Este impiedicat accesul utilizatorilor in diverse pagini daca acestia incearca sa ocoleasca pagina de login. Asupra tabelelor din baza de date se implementeaza operatiile traditionale pe baze de date: adaugare, modificare si stergere, cu validarea datelor pentru a pastra consistenta informatiei si a impiedica iesirea din aplicatie din cauza unei erori netratate.

Baza de date din spatele paginilor Web este implementata in MS Access 2000, iar accesul se face prin intermediul ODBC. Avind in vedere ca am construit un site dinamic, pentru realizarea aplicatiei am folosit HTMl (HyperText Mark-up Language) si ASP (Active Server Pages).

Luind in considerare faptul ca baza de date MS Access nu permite decit un numar de cinci utilizatori simultan o prima propunere de imbunatatire se refera la implemetarea bazei de date in MS SQL Server, care ofera facilitati suplimentare.

Page 46: Validari asupra datelor

O alta propunere de imbunatatire a lucrarii ar fi completarea site-ului cu o versiune in limba engleza, pentru a putea fi consultat si de catre persoane din strainatate.

De asemenea, site-ul ar trebui sa dispuna pe viitor de operatii simple sau mai avansate de cautare, avind in vedere ca baza de date poate atinge dimensiuni medii. Cautarea ar putea sa se faca dupa numele unui actor, regizor, dupa titlul filmului. De asemenea, cautarea ar trebui sa fie inexacta, permitind regasirea unor informatii chiar daca utilizatorul nu stie numele complet sau titlul complet si corect al filmului.

De asemenea, in partea de administrare ar mai putea fi adaugata o optiune care sa permita si gestionarea utilizatorilor: adaugare sau stergere utilizator de catre o persoana cu drepturi corespunzatoare, sau posibilitatea ca fiecare utilizator sa-si modifice numele sau parola cu care se logheaza.

Bibliografie

1. Allen Browne, Alison Balter – Access 95 Editura Teora 1996

2. Jeff Perkins, Bryan Morgan – SQL fara profesor, in 14 zile, Editura Teora 1998

3. Microsoft Access 2000, Editura Teora 2000

4. Sisteme de gestiune a bazelor de date si Proiectarea bazelor de date – notite de curs

5. Comert electronic - notite de curs

6. Internet si Intranet – notite de curs

7. Burdescu Dumitru dan, Ionescu Augstin Iulian, Stanescu Liana – Baze de date Access Indrumar de laborator Tipogafia Universitatii din Craiova 2002

8. S.Walther, J.levine - Programarea in ASP pentru comert electronic - Editura Teora 2000

9. www.cinema.ro

Page 47: Validari asupra datelor