Sunteți pe pagina 1din 760

Baze de date si aplicatii internet

Introducere

Informaţii şi date

Sisteme de gestiune a bazelor de date

Modele de date

Limbaje şi utilizatori

Avantaje şi dezavantaje ale sistemelor de


gestiune a bazelor de date
Introducere - Informaţii şi date

Disponibilitatea informaţiei şi capacitatea de a o


gestiona în mod eficient - esenţiale în orice activitate
Organizaţie ⇔ sistem informaţional - gestionează
informaţia necesară funcţionării
Informaţia este înregistrată sub formă de date
datele necesită o interpretare pentru a furniza informaţii
Nu se poate da o definiţie exactă a conceptului de
dată, precum şi a diferenţei dintre dată şi informaţie
Data nu are nicio semnificaţie, dar odată interpretată
şi corelată convenabil, ea furnizează informaţii ce
îmbogăţesc cunoaşterea
Introducere - Informaţii şi date

Exemplu

Şirul de caractere Popescu Ion


Numărul 123456

„Cine este şeful departamentului de cercetare şi care este


numărul său de telefon?”

„Persoana Popescu Ion este şeful departamentului de cercetare


şi numărul său de telefon este 123456”
Introducere - SGBD

Definiţie. O bază de date este o colecţie de date utilizată pentru a


reprezenta informaţiile de interes pentru un sistem informaţional

Definiţie. Un sistem de gestiune a bazelor de date (SGBD) este un


sistem software capabil
să gestioneze colecţii de date mari, partajate şi persistente
să asigure corectitudinea şi securitatea datelor
să fie eficient
să producă rezultatul scontat

Definiţie. O bază de date (BD) este o colecţie de date gestionate


de un SGBD
Introducere - SGBD
Caracteristici ale bazelor de date
BD sunt mari
• în general depăşesc memoria principală disponibilă
• SGBD-ul trebuie să gestioneze datele în memoria secundară ⇒ este
limitat doar de de capacitatea dispozitivelor de stocare

BD sunt partajate
• diverse aplicaţii şi utilizatori trebuie să aibă posibilitatea de a obţine
accesul la datele de interes
• “controlul concurenţei” – permite accesul partajat la date al mai multor
utilizatori ce operează simultan

BD sunt persistente
• BD au o durată medie de viaţă ce nu este limitată de o singură execuţie a
programelor utilizator
(datele gestionate de un program în memoria principală au o durată de viaţă
cuprinsă între începutul şi sfârşitul execuţiei programului, nefiind persistente)
Introducere - SGBD
Caracteristicile SGBD

corectitudinea datelor - funcţii specifice de backup

are capacitatea de a conserva conţinutul BD (sau cel


puţin permite reconstituirea acesteia) în cazul unor
defecţiuni hardware sau erori software

securitatea datelor - mecanisme de autorizare

fiecare utilizator, recunoscut prin intermediul unui nume


de utilizator specific accesului la SGBD, poate efectua
numai anumite operaţii asupra datelor
Introducere - SGBD

eficienţa - finalizează operaţiile utilizând cantitatea adecvată de


resurse (timp şi spaţiu) pentru fiecare utilizator

această caracteristică se bazează atât pe tehnicile utilizate în


implementarea SGBD-ului, cât şi pe modul de proiectare a
produsului respectiv

productivitatea mărită

productivitatea - capacitatea sistemului cu BD de a conduce la


realizarea scopurilor utilizatorilor

această definiţie este generică şi nu corespunde unei anumite funcţii


a SGBD-urilor, dat fiind că un SGBD pune la dispoziţia utilizatorilor
diverse servicii şi funcţii

sarcina proiectării unei BD şi a aplicaţiilor ce o utilizează vizează


garantarea unei bune productivităţi a întregului sistem
Introducere - Modele de date
Model de date - combinaţie de elemente destinată organizării
datelor
Fiecare model de date pune la dispoziţia utilizatorilor mecanisme
de structurare
similare constructorilor type din limbajele de programare - permit
definirea unor tipuri noi de date pe baza tipurilor elementare,
predefinite

Tipuri de modele de date:

Modelul de date relaţional

Modelul de date ierarhic (structuri de tip arbore şi ierarhie)

Modelul de date reţea (grafuri)

Modelul de date obiect (paradigma programării orientate


obiect)
Introducere - Modele de date

Modelul de date relaţional - propus la începutul anilor ’70


sistemele reale bazate pe modelul relaţional au apărut la începutul
anilor ’80
cel mai răspândit model de date
pune la dispoziţie constructorul relaţie
oferă astfel posibilitatea organizarea datelor sub forma unei colecţii de
înregistrări având structură fixă

Relaţia - se reprezintă sub forma unui tabel


liniile coincid cu înregistrările

coloanele corespund câmpurilor înregistrării

ordinea în care apar liniile şi coloanele nu este relevantă


Introducere - Modele de date
Exemplu

Datele referitoare la cursurile universitare şi titularii lor, precum şi


inserarea cursurilor în planul de învăţământ al diverselor specializări
pot fi organizate cu ajutorul a două relaţii (tabele) CURSURI şi
PLAN:
CURSURI
Curs Titular
Senzori Popescu
Acționări Ionescu
Roboți Anton

PLAN
Specializare Curs An
Mecatronică Achiziții de date 4
Mecatronică Acționări 3
Mecanică Roboți 3
Mecanică Metrologie 4
Mecanică Senzori 4
Introducere - Modele de date

Modelele prezentate - „modele logice”


deşi structurile utilizate sunt abstracte, ele reflectă o organizare
particulară (arbore, graf, tabel, obiect)

Modele conceptuale

au fost introduse pentru a descrie datele într-o manieră independentă


de modelul logic

nu sunt disponibile în SGBD-urile comerciale

sunt utilizate în faza preliminară a proiectării bazelor de date, pentru o


analiză cât mai bună a aplicaţiei, fără implicaţii de implementare

exemplu de model conceptual - modelul Entitate - Relaţie


Introducere - Modele de date
Scheme şi instanţe
schema bazei de date - caracteristici ale datelor care nu se modifică în timp;
conţine numele relaţiei (tabelului), urmat de numele atributelor (coloanelor)

Exemplu
CURSURI (Curs, Titular) – schema relaţiei (tabelului) CURSURI

instanţa (starea) bazei de date - valorile actuale din baza de date care se
modifică în timp; conţine o colecţie de linii ale relaţiei respective, care variază
în timp

Exemplu
Instanţa relaţiei CURSURI este dată de următoarele trei perechi:

Senzori Popescu
Acționări Ionescu
Roboți Anton
Introducere - Modele de date
Nivele de abstractizare în SGBD-uri

Arhitectura unui SGBD este împărţită pe trei nivele, logic,


intern şi extern; fiecare nivel are asociată o schemă

Schema logică - o descriere a întregii baze de date prin


prisma modelului logic adoptat de SGBD (relaţional,
ierarhic, reţea sau obiect)

Schema internă - descrie implementarea schemei logice


prin prisma structurilor de stocare fizică
Introducere - Modele de date

Schema externă - descrierea unei porţiuni a bazei de date


prin prisma modelului logic

o schemă externă poate oferi o organizare diferită a datelor cu


scopul de a reflecta un punct de vedere al unui anumit utilizator sau
grup de utilizatori

este posibil ca unei singure scheme logice să-i fie asociate diverse
scheme externe
fiecare schemă externă va furniza o anumită vedere asupra bazei de
date

în majoritatea sistemelor, nivelul extern nu apare explicit, dar este


posibilă definirea unor relaţii derivate, numite vederi
Introducere - Modele de date

Exemplu
Un student de la Automatică este interesat de cursurile oferite
în cadrul acestei specializări. Această informaţie este prezentă în
relaţia MECATRONICĂ, derivată din relaţia PLAN

AUTOMATICĂ
Specializare Curs An
Mecatronică Senzori 4
Mecatronică Achiziții de date 3

• schemelor externe li se pot asocia mecanisme pentru autorizarea


accesului
• un utilizator poate fi autorizat să manipuleze doar datele descrise prin
prisma schemei externe asociată
Introducere - Limbaje şi utilizatori

SGBD-urile oferă o gamă largă de limbaje pentru gestiunea datelor


şi implică un spectru larg de utilizatori

Ţinând cont de diferenţa dintre structura şi instanţa unui tabel,


putem face o diferenţiere similară între limbajele bazei de date:

limbajul de definire al datelor (LDD)


definirea schemelor logice, externe şi fizice
definirea autorizărilor de acces

limbajul de manipulare al datelor (LMD)


interogarea instanţelor unei baze de date
modificarea instanţelor unei baze de date

Remarcă: Unele limbaje (SQL) oferă facilităţile ambelor limbaje


(LDD şi LMD) într-o formă integrată
Introducere - Limbaje şi utilizatori

În funcţie de modul de exploatare a bazei de date, utilizatorii se pot


împărţi în:
administratorul bazei de date (DBA) – persoana responsabilă de
proiectarea, controlul şi administrarea bazei de date
mediază între cerinţele diverse, adesea conflictuale, exprimate de utilizatori,
asigurând controlul partajat asupra datelor

este responsabil pentru garantarea serviciilor

asigură corectitudinea sistemului

gestionează autorizările de acces la date

programatorii de aplicaţii – definesc şi creează programele ce


accesează baza de date
• utilizează LMD sau alte unelte pentru generarea interfeţelor cu baza de date
Introducere - Limbaje şi utilizatori

utilizatorii obişnuiţi – cei care utilizează efectiv baza de date

utilizatori finali – utilizează programe ce realizează activităţi frecvente


şi predefinite

utilizatori ocazionali – capabili să utilizeze limbaje interactive pentru a


accesa baza de date, formulând interogări (sau actualizări) de diferite
tipuri

pot fi specialişti în limbajul pe care îl utilizează şi interacţionează frecvent


cu baza de date; termenul „ocazional” se referă la faptul că interogările
nu sunt predefinite
Introducere - Avantaje şi dezavantaje SGBD

Avantaje
Datele - resurse comune ale organizaţiei, disponibile tuturor
membrilor autorizaţi
Baza de date furnizează un model standardizat şi precis
Modelul poate fi folosit, cu extensiile necesare, în aplicaţii viitoare

Control centralizat al datelor


Partajarea bazelor de date ⇒ reducerea redundanţei şi
inconsistenţei datelor
Independenţa datelor → dezvoltarea de aplicaţii mai flexibile
şi mai uşor de modificat
Introducere - Avantaje şi dezavantaje SGBD

Dezavantaje
SGBD - scumpe, complexe şi foarte diferite de multe
alte unelte software
Introducerea SGBD necesită un efort financiar
direct - costul produsului
indirect - resurse hardware şi software, pregătirea
personalului etc.
SGBD - furnizează, în forma standard, un set de
servicii care au un anumit cost
în cazurile în care câteva dintre aceste servicii nu sunt
neapărat necesare, e dificilă extragerea serviciilor necesare
la un moment dat → ineficienţă
Introducere - Avantaje şi dezavantaje SGBD

Situaţii în care folosirea SGBD-urilor nu este necesară:


există un singur utilizator
există mai mulţi utilizatori care nu au nevoie de acces concurent la
date

Dezvoltarea actuală a SGBD-urilor a dus la sisteme mai


eficiente şi mai fezabile, şi la arhitecturi din ce în ce mai
ieftine ⇒ a crescut posibilitatea dezvoltării aplicaţiilor cu
SGBD-uri
Partea I
Baze de date relaţionale

Modelul relaţional
Structura modelului relaţional

Constrângeri de integritate
Structura modelului relaţional
Conceptele ce stau la baza modelului
relaţional:

}
relaţie
diferă ca noţiuni dar sunt strâns legate
tabel

Relaţie - noţiune formală - domeniul teoriei


mulţimilor

Tabel - noţiune simplă şi intuitivă


Structura modelului relaţional
Definiţii

Fie date mulţimile D1 şi D2.


Produsul cartezian dintre D1 şi D2 (notat D1 × D2 ) se defineşte ca
fiind mulţimea perechilor ordonate (v1 , v2 ), v1 ∈ D1 , v2 ∈ D2 .

O relaţie pe mulţimile D1 şi D2 (numite domeniile relaţiei) este o


submulţime a produsului cartezian D1 × D2

Exemplu
CURSURI

01 Fizica D1 = ?
03 Chimie
04 Biologie D2 = ?
Structura modelului relaţional
Definiţii

Fie date mulţimile D1 şi D2.


Produsul cartezian dintre D1 şi D2 (notat D1 × D2 ) se defineşte ca
fiind mulţimea perechilor ordonate (v1 , v2 ), v1 ∈ D1 , v2 ∈ D2 .

O relaţie pe mulţimile D1 şi D2 (numite domeniile relaţiei) este o


submulţime a produsului cartezian D1 × D2

Mulţimile D1 şi D2 sunt finite sau nu ?


Este de dorit ca domeniile să aibă dimensiuni infinite, a.î. să putem
presupune existenţa unei valori care nu e prezentă în baza de date.
În practică relaţiile trebuie să fie finite deoarece bazele de date trebuie
stocate în sisteme computerizate de dimensiuni finite.


Vom presupune că bazele de date sunt alcătuite din relaţii finite,
definite pe domenii infinite
Structura modelului relaţional
Definiţiile anterioare pot fi generalizate

Fie n > 0 mulţimi D1 , D2 ,..., Dn , nu neapărat distincte

STUDENTI

276545 Ionescu Maria 25/11/1980


485745 Popescu Ana 23/04/1981
200768 Georgescu Paul 12/02/1981
587614 Luca Radu 10/10/1980
937653 Maftei Lucian 01/12/1980
Structura modelului relaţional
Definiţiile anterioare pot fi generalizate

Fie n > 0 mulţimi D1 , D2 ,..., Dn , nu neapărat distincte

Produsul cartezian D1 × D2 × ... × Dn este dat de mulţimea


n-tuplurilor v1 , v2 ,..., vn , unde vi ∈ Di , i = 1, n

O relaţie matematică pe domeniile D1 , D2 ,..., Dn este o submulţime a


produsului cartezian D1 × D2 × ... × Dn

n - gradul produsului cartezian şi al relaţiei (dat de numărul


componentelor produsului cartezian)
cardinalitatea relaţiei este dată de numărul n-tuplurilor
analogia relaţie – mulţime implică:
• între n-tupluri nu există o ordine predefinită
• n-tuplurile unei relaţii sunt distincte unele de celelalte ⇒ un tabel
reprezintă o relaţie doar dacă liniile sale sunt diferite între ele
Structura modelului relaţional

Notaţia non-poziţională – se asociază nume


(atribute) domeniilor unei relaţii

Atributele descriu rolurile jucate de domenii

EchipaGazda EchipaOaspete GoluriGazde GoluriOaspeti


Real Madrid Liverpool 3 1
Liverpool Milan 2 0
Real Madrid Roma 1 2
Roma Milan 0 1

Fig. 2.2 Relaţie cu atribute


Structura modelului relaţional
Pentru formalizarea conceptelor introduse anterior, definim:
D - mulţimea domeniilor
X - mulţimea atributelor
funcţia DOM : X → D care asociază fiecărui atribut un domeniu

Definiţie. Un tuplu definit pe o mulţime de atribute este o funcţie t care


asociază fiecărui atribut A∈ X o valoare din domeniul DOM ( A)

Definiţie. O relaţie pe o mulţime de atribute X este o mulţime de tupluri


definite pe X

Notaţie. Fie t un tuplu definit pe o mulţime de atribute X şi A∈ X un atribut.


Prin t[A] se notează valoarea tuplului t în domeniul DOM ( A)
Structura modelului relaţional

Definiţie. Un tuplu definit pe o mulţime de atribute este o funcţie t care


asociază fiecărui atribut A∈ X o valoare din domeniul DOM ( A)

Definiţie. O relaţie pe o mulţime de atribute X este o mulţime de tupluri


definite pe X

Exemplu
Fie t primul tuplu din relaţia prezentată în figura 2.2
t[EchipaOaspete]=Liverpool
t[EchipaOaspete, GoluriOaspeti]=Liverpool,1
Structura modelului relaţional
BD sunt formate din mai multe relaţii
tuplurile acestor relaţii conţin valori comune atunci când
acest lucru este necesar pentru stabilirea unor
corespondenţe
STUDENTI EXAMENE
NrInreg Nume Prenume DataNastere Student Nota Curs
276545 Ionescu Maria 25/11/1980 276545 8 01
485745 Popescu Ana 23/04/1981 276545 9 04
200768 Georgescu Paul 12/02/1981 937653 9 01
587614 Luca Radu 10/10/1980 200768 9 04
937653 Maftei Lucian 01/12/1980

CURSURI
Cod Denumire Titular
01 Fizica Melinte
03 Chimie Mardare
04 Chimie Dascalu
Fig. 2.3 Exemplu de bază de date relaţională
Structura modelului relaţional

Schema unei relaţii este formată din numele relaţiei R şi o mulţime de


atribute X = { A1 , A2 ,..., An } şi se notează R(X); fiecărui atribut i se asociază
un domeniu

Schema bazei de date este formată dintr-o mulţime de scheme de relaţii:


R = {R1 ( X 1 ), R2 ( X 2 ),..., Rn ( X n )}

Instanţa unei relaţii (pe scurt – relaţia) având schema R(X) este dată de
mulţimea r a tuplurilor definite pe mulţimea de atribute X

Instanţa bazei de date (pe scurt – baza de date) având schema


R = {R1 ( X 1 ), R2 ( X 2 ),..., Rn ( X n )} este mulţimea r = {r1 , r2 ,..., rn } de
relaţii în care fiecare ri , i = 1, n este o relaţie definită pe schema Ri ( X i )
Exemplu
Schema bazei de date din figura 2.3 este
R = {STUDENTI(NrInreg, Nume, Prenume, DataNastere),
EXAMENE(Student, Nota, Curs),
CURSURI(Cod, Denumire, Titular)}

STUDENTI EXAMENE
NrInreg Nume Prenume DataNastere Student Nota Curs
276545 Ionescu Maria 25/11/1980 276545 8 01
485745 Popescu Ana 23/04/1981 276545 9 04
200768 Georgescu Paul 12/02/1981 937653 9 01
587614 Luca Radu 10/10/1980 200768 9 04
937653 Maftei Lucian 01/12/1980

CURSURI
Cod Denumire Titular
01 Fizica Melinte
03 Chimie Mardare
04 Chimie Dascalu
Structura modelului relaţional
Informaţiile trebuie reprezentate sub forma unor tupluri omogene de
date
În particular, putem reprezenta în cadrul unei relaţii doar tupluri ce
corespund schemei relaţiei
În practică există cazuri în care datele disponibile nu corespund cu
exactitate formatului ales
Exemplu
Se consideră schema PERSOANĂ (Nume, Prenume, Adresă, TelefonFix)
Problemă: Pot exista tupluri pentru care valoarea atributului TelefonFix
nu este disponibilă
Rezolvarea problemei indisponibilităţii valorilor: s-a inclus posibilitatea
ca fiecare atribut al unui tuplu să poată lua fie valori din domeniul
asociat, fie o valoare specială, denumită valoare null
Valoarea null indică absenţa informaţiei
este o valoare suplimentară, ce nu este conţinută de domeniu;
la definirea unei relaţii se pot specifica acele atribute care acceptă valori
null
Constrângeri de integritate

STUDENTI
NrInreg Nume Prenume DataNastere
200768 George Paul 12/02/1981
937653 Maftei Lucian 10/10/1980
937653 Luca Radu 01/12/1980 CURSURI
Cod Denumire Titular
01 Fizica Melinte
EXAMENE 03 Chimie Mardare
04 Chimie Dascalu
Student Nota Promovat Curs
200768 11 DA 05
937653 4 DA 01
937653 6 DA 04
276545 7 DA 01
Constrângeri de integritate
Există situaţii când nu orice mulţime de tupluri în cadrul unei scheme
reprezintă informaţii corecte pentru aplicaţie
Pentru înlăturarea situaţiilor de incorectitudine a informaţiilor a fost
introdus conceptul de constrângere de integritate

Constrângerea de integritate - proprietate ce trebuie satisfăcută de


toate instanţele corecte ale bazei de date
O constrângere poate fi privită ca un predicat ce asociază valoarea
adevărat sau fals fiecărei instanţe
Se pot defini mai multe constrângeri pentru o bază de date
Vom considera corecte (sau legale) acele instanţe care satisfac toate
constrângerile impuse
Constrângeri de integritate
Clasificare
constrângeri intra-relaţionale - sunt definite pe o singură
relaţie a bazei de date şi pot fi de două tipuri:
• constrângeri la nivel de tuplu – pot fi evaluate pe fiecare tuplu,
independent de celelalte tupluri

• constrângeri la nivel de domeniu (la nivel de valoare) – impun restricţii


asupra domeniului unui atribut

constrângeri inter-relaţionale – implică mai multe relaţii

STUDENTI EXAMENE CURSURI


NrInreg Nume Prenume DataNastere Student Nota Promovat Curs Cod Denumire Titular
200768 George Paul 12/02/1981 200768 11 DA 05 01 Fizica Melinte
937653 Maftei Lucian 10/10/1980 937653 4 DA 01 03 Chimie Mardare
937653 Luca Radu 01/12/1980 937653 6 DA 04 04 Chimie Dascalu
276545 7 DA 01
Constrângeri de integritate
Exemplu. Fie baza de date din figura următoare
STUDENTI EXAMENE CURSURI
NrInreg Nume Prenume DataNastere Student Nota Promovat Curs Cod Denumire Titular
200768 George Paul 12/02/1981 200768 11 DA 05 01 Fizica Melinte
937653 Maftei Lucian 10/10/1980 937653 4 DA 01 03 Chimie Mardare
937653 Luca Radu 01/12/1980 937653 6 DA 04 04 Chimie Dascalu
276545 7 DA 01
Fig.2.4 Bază de date cu informaţii incorecte

constrângeri la nivel de tuplu:


• în primul tuplu al relaţiei EXAMENE avem ca rezultat la un examen nota 11
• în al doilea tuplu al relaţiei EXAMENE un student este considerat promovat la examen deşi nota
sa este 4
constrângeri la nivel de domeniu
• pentru atributul Notă din relaţia EXAMENE, numai valorile cuprinse între 1 şi 10 sunt permise
• ultimele două tupluri ale relaţiei STUDENTI conţin informaţii pentru doi studenţi diferiţi dar cu
acelaşi număr de înregistrare, identificarea studenţilor fiind astfel ambiguă
constrângeri inter-relaţionale
• al patrulea tuplu al relaţiei EXAMENE are, pentru atributul Student, o valoare care nu apare
printre numerele de înregistrare din relaţia STUDENTI
• primul tuplu al relaţiei EXAMENE are, pentru atributul Curs, o valoare care nu apare printre
codurile cursurilor din relaţia CURSURI
Constrângeri de integritate
Constrângerile pe tuplu - condiţii impuse valorilor fiecărui tuplu,
independent de celelalte tupluri
sintaxă - expresii booleene (folosind conectorii AND, OR şi NOT) ale căror atomi
compară valorile atributelor implicate în constrângeri sau expresii aritmetice
folosind valorile atributelor
singura condiţie este ca aceste expresii să utilizeze valorile unui singur tuplu

Exemple
1) Expresiile ce descriu constrângerile intra-relaţionale încălcate în exemplul prezentat
în figura 2.4:
(Nota ≥ 1) AND (Nota ≤ 10)
(Promovat = ’DA’) AND (Nota ≥ 5)
2) Fie dată schema
PLATĂ(Dată, Sumă, Deduceri, Net)
Se poate defini o constrângere care impune condiţia ca suma netă să fie egală cu
diferenţa dintre suma totală şi deduceri:
Net = Sumă - Deduceri
Constrângeri de integritate

Constrângeri de chei

O cheie este o mulţime de atribute ce ajută la identificarea în mod


unic a tuplurilor unei relaţii

Definiţii

O mulţime de atribute K este o super-cheie a relaţiei r dacă r


nu conţine două tupluri distincte t1 şi t2 astfel încât t1[K] = t2[K]

O mulţime K de atribute este o cheie a relaţiei r dacă mulţimea


K este o super-cheie minimală (nu există altă super-cheie K’ a
lui r astfel încât K ' ⊂ K )
Constrângeri de integritate

Exemplu. Se consideră următoarea relaţie

STUDENT

NrInreg Nume Prenume DataNastere Facultate


284328 Ionescu Maria 29/04/59 AC
296328 Ionescu Ana 29/04/59 TCM
587614 Ionescu Lucian 01/05/61 Textile
934856 Popescu Lucian 01/05/61 AC
965536 Popescu Lucian 05/03/58 TCM

O mulţime K de atribute este o cheie a relaţiei r dacă mulţimea K este o super-


cheie minimală (nu există altă super-cheie K’ a lui r astfel încât K ' ⊂ K )
Constrângeri de integritate
Exemplu. Se consideră următoarea relaţie
STUDENT
NrInreg Nume Prenume DataNastere Facultate
284328 Ionescu Maria 29/04/59 AC
296328 Ionescu Ana 29/04/59 TCM
587614 Ionescu Lucian 01/05/61 Textile
934856 Popescu Lucian 01/05/61 AC
965536 Popescu Lucian 05/03/58 TCM
Fig.2.5 Exemplu de relaţie pentru evidenţierea cheilor
Mulţimea {NrInreg} este o cheie
Mulţimea {Nume, Prenume, DataNastere} este o cheie, dar este şi super-cheie!
Mulţimea {NrInreg, Facultate} este o super-cheie, dar nu este cheie!
Mulţimea {Nume, Facultate} este o cheie
Întrebare: Putem afirma acest lucru în cazul general ?
Răspuns: nu, deoarece pot exista studenţi cu acelaşi nume şi care au terminat aceeaşi
facultate
Spunem că, în acest caz, mulţimea {Nume, Facultate} este, prin şansă, cheie a relaţiei
Pentru schema STUDENTI (NrInreg, Nume, Prenume, DataNastere, Facultate) se pot
stabili două constrângeri ce impun următoarele chei:
{NrInreg} şi {Nume, Prenume, DataNastere}
Relaţia din figura 2.5 satisface ambele constrângeri de chei
Constrângeri de integritate
Pentru orice relaţie se poate stabili cel puţin o cheie ⇒ se permite:
accesul la toate datele din baza de date
identificarea unică a datelor
stabilirea unor legături între datele conţinute de diverse relaţii

Exemplu. Se consideră baza de date din figura 2.3

STUDENTI EXAMENE CURSURI


NrInreg Nume Prenume DataNastere Student Nota Curs Cod Denumire Titular
276545 Ionescu Maria 25/11/1980 276545 8 01 01 Fizica Melinte
485745 Popescu Ana 23/04/1981 276545 9 04 03 Chimie Mardare
200768 Georgescu Paul 12/02/1981 937653 9 01 04 Chimie Dascalu
587614 Luca Radu 10/10/1980 200768 9 04
937653 Maftei Lucian 01/12/1980

Relaţia EXAMENE face referire la studenţii din relaţia STUDENTI prin NrInreg
şi la cursurile din relaţia CURSURI prin Cod
NrInreg este cheia relaţiei STUDENTI
Cod este cheia relaţiei CURSURI
Valorile atributelor cheie sunt utilizate pentru referirea conţinutului altor relaţii
Constrângeri de integritate

Cheia primară - cheia prin intermediul căreia se


realizează referinţe între relaţii

Constrângere: este interzisă utilizarea valorilor


null pentru cheile primare,

Valorile null sunt permise pentru celelalte chei

Pot apărea situaţii în care nu există atribute ale


căror valori să fie disponibile pentru o cheie
primară ⇒ se va introduce un atribut suplimentar
care va fi generat şi asociat fiecărui tuplu în
momentul inserării în relaţia corespunzătoare
Constrângeri de integritate
Constrângeri de referinţă
O constrângere de referinţă (sau cheie străină) între o mulţime de atribute X
ale relaţiei R1 şi altă relaţie R2 este satisfăcută dacă valorile fiecărui tuplu
din R1 corespunzătoare mulţimii X se regăsesc printre valorile cheii
primare a relaţiei R2. Apar două situaţii:
a) Cheia relaţiei R2 este unică şi conţine un singur atribut B
Constrângerea de referinţă între mulţimea X (formată din atributul A) şi
relaţia R2 este satisfăcută dacă ∀t1 ∈ R1 cu t1[ A] ≠ NULL, ∃t2 ∈ R2
astfel încât t1[ A] = t2 [ B ]

b) Cheia relaţiei R2 este unică şi coincide cu o mulţime K de atribute


Pentru stabilirea unei constrângeri între X şi R2 trebuie specificată o
anumită ordine pentru ambele mulţimi (X şi K). Indicând atributele în
ordine, X = A1 A2 ... Ap , K = B1 B2 ... B p , constrângerea este satisfăcută
dacă ∀t1 ∈ R1 cu t1[ Ai ] ≠ NULL, i = 1, p, ∃t2 ∈ R2 astfel încât
t1[ Ai ] = t2 [ Bi ], i = 1, p
Constrângeri de integritate
Exemplu. Se consideră baza de date din figura următoare
CADRE AUTOVEHICUL
NrInreg Nume Prenume NrInmat Judet Proprietar Adresa
567 Dascalescu Eugen 03 BBB IS Maftei Eduard Nicolina 30
456 Ionescu George 01 CCC IS Maftei Eduard Nicolina 30
638 Popescu Dan 02 AAA IS Luca Marian Primaverii 4
03 BBB VS Melinte Dan Primaverii 17

CONTRAVENTIE
Cod Data Cadru Judet NrInmat
143256 25/10/92 567 IS 02 AAA
987554 26/10/92 456 IS 02 AAA
987557 26/10/92 456 IS 03 BBB
630876 15/10/92 456 VS 03 BBB
539856 12/10/92 567 VS 03 BBB
Fig.2.6 Bază de date cu constrângeri de referinţă

Se definesc următoarele constrângeri de referinţă:


• între atributul Cadru al relaţiei CONTRAVENŢIE şi relaţia CADRE
• între atributele NrInmat şi Judet ale relaţiei CONTRAVENŢIE şi relaţia
AUTOVEHICUL, ordinea atributelor în cheia relaţiei AUTOVEHICUL fiind NrInmat,
Judet
Baza de date din figura 2.6 respectă ambele constrângeri
Probleme propuse
1. Se consideră baza de date din figura următoare
PACIENT INTERNARE
Cod Nume Prenume Pacient Intrare Iesire Sectie
A102 Popescu Maria A102 2/05/2004 9/05/2004 A
B372 Popa Mihai A102 2/12/2004 2/01/2005 A
B543 Ionescu Ioana S555 5/10/2004 3/12/2004 B
B444 Ionescu Radu B444 1/12/2004 1/01/2005 B
S555 Vasile Ion S555 5/10/2004 1/112004 A

MEDIC SECTIE
Numar Nume Prenume Sectie Cod Nume Specialist
203 Dumitrescu Mihai A A Chirurgie 203
574 Georgescu Stefan B B Pediatrie 574
461 Barbu Petre B C Medicala 530
530 Petrescu George C
405 Filipescu George A
501 Barbulescu Stefan A

Puneţi în evidenţă cheile şi constrângerile de referinţă din baza de date


prezentată. Precizaţi dacă respectivele constrângeri sunt satisfăcute de toate
bazele de date care au aceeaşi schemă cu baza de date din figură. Precizaţi
care atribute pot admite valori null.
2. Se consideră următoare informaţii referitoare la managementul împrumuturilor
dintr-o bibliotecă personală:
• proprietarul împrumută cărţi prietenilor, care se înregistrează prin
intermediul numelor (astfel încât să se evite repetiţiile)
• o carte este referită prin titlul său (nu există două cărţi cu acelaşi titlu)
• când clientul împrumută o carte, se înregistrează data împrumutului şi
proprietarul fixează data returnării

Definiţi o schema relaţională pentru reprezentarea informaţiilor de mai sus,


precizând domeniile adecvate pentru atribute şi o instanţă sub formă tabelară

Precizaţi cheia sau cheile relaţiei


3. Reprezentaţi prin intermediul unei relaţii sau a mai multora informaţiile conţinute
în mersul trenurilor dintr-o staţie: numărul trenului, ora sosirii, ora plecării,
punctul de plecare, destinaţia finală, tipul de tren şi opririle de pe parcurs

4. Definiţi o schemă a unei baze de date în care se organizează informaţiile


referitoare la o companie care are angajaţi (fiecare cu codul numeric personal,
nume, prenume şi data naşterii) şi subsidiari (fiecare cu cod, ramură şi director,
care este angajat). Fiecare angajat lucrează pentru un subsidiar. Indicaţi cheile
şi constrângerile de referinţă ale schemei. Arătaţi o instanţă a bazei de date şi
verificaţi dacă se respectă constrângerile.
Algebra relaţională
Reuniune, intersecţie, diferenţă

Redenumire, selecţie, proiecţie, joncţiune

Interogări în algebra relaţională

Valori NULL în algebra relaţională

Vederi
Actualizare - funcţie care pornind de la o bază
de date produce o altă bază de date (fără a-i
modifica schema).

Interogare - funcţie care returnează o relaţie,


plecând de la o bază de date.
Algebra relaţională

Se bazează pe o colecţie de operatori ce sunt aplicaţi


relaţiilor, producând relaţii.

Operatorii algebrici relaţionali se împart în următoarele clase:


Operatori clasici din teoria mulţimilor – reuniune, intersecţie,
diferenţă;
Operatori de redenumire, selecţie, proiecţie;
Operatorul join (joncţiune), împreună cu variantele sale –
joncţiune naturală, produs cartezian, theta joncţiune şi joncţiune
externă.
Reuniune, intersecţie, diferenţă
Reuniune, intersecţie, diferenţă - se aplică doar
asupra perechilor de relaţii definite pe aceleaşi atribute.

GPS RADIO Reuniune?


Producător MODEL Producător MODEL
Nokia N2310 Nokia N4215
Samsung S5100 Samsung S2110
Samsung S5600 Samsung S5600
Nokia N4215 Samsung S1100

Diferenţă?
Intersecţie?
Reuniune, intersecţie, diferenţă
Definiţii

Reuniunea a două relaţii r1(X) şi r2(X) este relaţia notată


r1 ∪ r2 care conţine tupluri ce aparţin fie lui r1 fie lui r2, fie
ambelor relaţii r1 şi r2.

Intersecţia dintre relaţiile r1(X) şi r2(X) este relaţia notată r1 ∩ r2


formată din tuplurile comune relaţiilor r1 şi r2.

Diferenţa dintre relaţiile r1(X) şi r2(X) este relaţia notată r1 - r2


care conţine tuplurile din r1 care nu se regăsesc în r2.
Redenumire

TATA_COPIL MAMA_COPIL
Tata Copil Mama Copil
Adam Dan Eva Dan
Adam Marian Eva Lucian
TATA_COPIL U MAMA_COPIL ??
Radu Cristi Maria Cristi
Radu Catalin Carmen Catalin
Redenumire
Operaţia de redenumire (ρ)
Limitările impuse operatorilor standard din teoria mulţimilor pot fi restrictive
în anumite situaţii.
Exemplu
Să considerăm cele două relaţii din figura 3.1.
TATA_COPIL MAMA_COPIL
Tata Copil Mama Copil
Adam Dan Eva Dan
Adam Marian Eva Lucian
TATA_COPIL U MAMA_COPIL ??
Radu Cristi Maria Cristi
Radu Catalin Carmen Catalin

Figura 3.1 Reuniune logică, dar incorectă

Ar avea sens executarea unei reuniuni între cele două relaţii cu scopul de a obţine
toate perechile ’părinte – copil’ din baza de date.
Acest lucru nu este însă posibil deoarece atributul denumit de noi ’părinte’ are
numele ’tata’ într-o relaţie şi numele ’mama’ în cealaltă relaţie.
Redenumire

Operatorului de redenumire – adaptează numele


atributelor atunci când este necesară aplicarea unui operator
din teoria mulţimilor.

Obs. Acest operator modifică numele atributelor lăsând intact conţinutul


relaţiei.

Exemplu
TATA_COPIL ρ Parinte←Tata (TATA_COPIL)
Tata Copil Parinte Copil
Adam Dan Adam Dan
Adam Marian Adam Marian
Radu Cristi Radu Cristi
Radu Catalin Radu Catalin

Fig.3.2 Exemplu de redenumire


Redenumire

Definiţie

Fie r o relaţie definită pe mulţimea X de atribute şi fie Y o altă mulţime


de atribute având aceeaşi cardinalitate ca şi X; fie secvenţele ordonate
şi A1A2...Ak , B1B2...Bk formate din atributele mulţimii X respectiv Y.

Redenumirea ρ A A ... A ← B B ... B ( r ) conţine pentru fiecare tuplu t din r un


1 2 k 1 2 k

tuplu t’ definit pe Y astfel încât t ' [ Bi ] = t[ Ai ], i = 1, k .

În practică, cele două secvenţe A1A2...Ak şi B1B2...Bk vor conţine doar


atributele ce urmează a fi redenumite şi noile lor nume.
Selecţie
Operatorul de selecţie (σ)
Rezultatul unei selecţii conţine tuplurile relaţiei operand ce satisfac
condiţia asociată operatorului.

Exemplu
Se consideră relaţia ANGAJAT din figura următoare:

ANGAJAT
Nume Prenume Varsta Salariu
Ionescu Maria 25 2000
Popescu Lucia 40 3000
Diaconescu Nicu 36 4500
Ionescu Marin 40 3900

σ Virsta<30∨ Salariu >4000 ( ANGAJAT ) ??


Selecţie
Operatorul de selecţie (σ)

Exemplu

ANGAJAT
σ Virsta<30∨ Salariu >4000 ( ANGAJAT )

Nume Prenume Varsta Salariu Nume Prenume Varsta Salariu


Ionescu Maria 25 2000 Ionescu Maria 25 2000
Popescu Lucia 40 3000 Diaconescu Nicu 36 4500
Diaconescu Nicu 36 4500
Ionescu Marin 40 3900

Fig.3.3 Exemplu de selecţie

După cum se poate observa, sunt selectate tuplurile din relaţia ANGAJAT
care îndeplinesc condiţia: Varsta < 30 sau Salariu > 4000 (formulă
propoziţională).
Selecţie

Definiţii

Fiind dată o relaţie r definită pe o mulţime de atribute X, spunem că o


formulă propoziţională F definită pe X este o formulă compusă din condiţii
atomice de tipul AθB sau Aθc legate prin conectorii ∨ (OR), ∧(AND) şi
¬(NOT), în care:

θ este un operator de comparaţie ( = , ≠ , < , ≤ , > , ≥ );

A şi B sunt atribute din X compatibile (conţin valori pentru care are


sens comparaţia);

c este o constantă compatibilă cu domeniul atributului A.


Selecţie

Definiţii

Fiind dată formula propoziţională F şi tuplul t, se defineşte valoarea


de adevăr a lui F pe t:

AθB este adevărată dacă şi numai dacă t[A] este în relaţia θ cu t[B];

Aθc este adevărată dacă şi numai dacă t[A] este în relaţia θ cu c;

F1 ∨F2, F1∧F2 şi ¬F1 au semnificaţia uzuală.

O selecţie σF(r) produce o relaţie care are aceleaşi atribute ca


relaţia r şi care conţine acele tupluri din r pentru care F este
adevărată.
Proiecţie

Operatorul de proiecţie (π)


Definiţie

Fie dată relaţia r definită pe mulţimea de atribute X şi o submulţime Y a


lui X.
Proiecţia relaţiei r pe Y (notată πY (r ) ) reprezintă mulţimea tuplurilor
definite pe Y obţinute din tuplurile lui r luând în considerare numai valorile
corespunzătoare atributelor din Y:

πY (r ) = {t[Y ]/ t ∈ r}

ANGAJAT
Nume Prenume Departament Sef
Ionescu Maria Vanzari Luca π Departament ,Sef (ANGAJAT) ??
Popescu Lucia Vanzari Luca
Diaconescu Maria Personal Damian
Ionescu Marin Personal Damian
Proiecţie
Situaţii în care numărul de tupluri ale rezultatului este egal, respectiv mai
mic decât numărul de tupluri ale operandului:

ANGAJAT π Departament ,Sef (ANGAJAT)


Nume Prenume Departament Sef Departament Sef
Ionescu Maria Vanzari Luca Vanzari Luca
Popescu Lucia Vanzari Luca Personal Damian
Diaconescu Maria Personal Damian
Ionescu Marin Personal Damian

Fig.3.4 Exemplu de proiecţie cu mai puţine tupluri decât operandul

ANGAJAT π Varsta , Salariu (ANGAJAT)


Nume Prenume Varsta Salariu Varsta Salariu
Ionescu Maria 25 2000 25 2000
Popescu Lucia 40 3000 40 3000
Diaconescu Nicu 36 4500 36 4500
Ionescu Marin 45 3900 45 3900

Fig.3.5 Exemplu de proiecţie cu acelaşi număr de tupluri ca şi operandul


Proiecţie

Întrebare:

Când πY (r ) conţine acelaşi număr de tupluri ca şi r ?


Proiecţie

Propoziţie

πY (r ) conţine acelaşi număr de tupluri ca şi r dacă şi numai dacă Y este


o super-cheie pentru r.
Joncţiune
Operatorul joncţiune – „join”
Permite realizarea unei conexiuni între datele conţinute de diverse relaţii.

Joncţiunea naturală ( ) – „natural join” - corelează datele din relaţii


diferite pe baza valorilor egale asociate atributelor cu acelaşi nume.
CONTRAVENTIE AUTOVEHICUL
Cod Data Cadru Judet NrInmat NrInmat Judet Proprietar Adresa
143256 25/10/92 567 IS 02 AAA 03 BBB IS Maftei Eduard Nicolina 30
987554 26/10/92 456 IS 02 AAA 01 CCC IS Maftei Eduard Nicolina 30
987557 26/10/92 456 IS 03 BBB 02 AAA IS Luca Marian Primaverii 4
630876 15/10/92 456 VS 03 BBB 03 BBB VS Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB

CONTRAVENTIE >< AUTOVEHICUL


Cod Data Cadru Judet NrInmat Proprietar Adresa
143256 25/10/92 567 IS 02 AAA Luca Marian Primaverii 4
987554 26/10/92 456 IS 02 AAA Luca Marian Primaverii 4
987557 26/10/92 456 IS 03 BBB Maftei Eduard Nicolina 30
630876 15/10/92 456 VS 03 BBB Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB Melinte Dan Primaverii 17
Joncţiune
Operatorul joncţiune – „join”
Permite realizarea unei conexiuni între datele conţinute de diverse relaţii.
Există două versiuni principale ale acestui operator, care, oricum, se pot
obţine una din cealaltă.

Joncţiunea naturală ( ><) – „natural join” - corelează datele din relaţii


diferite pe baza valorilor egale asociate atributelor cu acelaşi nume.

Definiţie
Fie r1(X1) şi r2(X2) două relaţii. Joncţiunea naturală r1 >< r2 este o relaţie
definită pe X1X2 (reuniunea dintre X1 şi X2) astfel încât:

r1 >< r2 = {t definit pe X 1 X 2 / ∃t1 ∈ r1 , ∃t2 ∈ r2 , a. i. t[ X 1 ] = t1 si t[ X 2 ] = t2 }

Pe scurt putem scrie:

r1 >< r2 = {t definit pe X 1 X 2 / t[ X 1 ] ∈ r1 si t[ X 2 ] ∈ r2 }
Joncţiune
Exemplu
CONTRAVENTIE AUTOVEHICUL
Cod Data Cadru Judet NrInmat NrInmat Judet Proprietar Adresa
143256 25/10/92 567 IS 02 AAA 03 BBB IS Maftei Eduard Nicolina 30
987554 26/10/92 456 IS 02 AAA 01 CCC IS Maftei Eduard Nicolina 30
987557 26/10/92 456 IS 03 BBB 02 AAA IS Luca Marian Primaverii 4
630876 15/10/92 456 VS 03 BBB 03 BBB VS Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB
CONTRAVENTIE >< AUTOVEHICUL

Cod Data Cadru Judet NrInmat Proprietar Adresa


143256 25/10/92 567 IS 02 AAA Luca Marian Primaverii 4
987554 26/10/92 456 IS 02 AAA Luca Marian Primaverii 4
987557 26/10/92 456 IS 03 BBB Maftei Eduard Nicolina 30
630876 15/10/92 456 VS 03 BBB Melinte Dan Primaverii 17
539856 12/10/92 567 VS 03 BBB Melinte Dan Primaverii 17

Joncţiunea naturală a celor două relaţii s-a obţinut prin combinarea fiecărui tuplu din
CONTRAVENŢIE cu exact un tuplu din AUTOVEHICUL:
• cu cel mult unul deoarece atributele Judet şi NrInmat formează o cheie a
relaţiei AUTOVEHICUL;
• cu cel puţin unul datorită constrângerii de referinţă dintre atributele Judet şi
NrInmat din CONTRAVENTII şi relaţia AUTOVEHICUL.
Joncţiune
Definiţie. Fie r1(X1) şi r2(X2) două relaţii. Spunem că joncţiunea naturală
r1 ><r2 este completă dacă:
∀t1 ∈ r1 , ∃t ∈ r1 ><r2, a.i. t[ X 1 ] = t1
∀t2 ∈ r2 , ∃t ' ∈r1 ><r2, a.i. t '[ X 2 ] = t2

r1 r2
Angajat Departament Departament Sef
Ionescu vanzari productie Manole
Balint productie vanzari Burlacu
Baltag productie

r1 ><r2
Angajat Departament Sef
Ionescu vanzari Burlacu
Balint productie Manole
Baltag productie Manole

Fig.3.6 Exemplu de joncţiune naturală completă


Joncţiune

r1 r2
Angajat Departament Departament Sef
Ionescu vanzari productie Manole
Balint productie depanare Burlacu
Baltag productie

r1 ><r2
Angajat Departament Sef
Balint productie Manole
Baltag productie Manole

Exemplu de joncţiune naturală incompletă


Joncţiune

r1 r2
Angajat Departament Departament Sef
Ionescu vanzari marketing Manole
Balint productie depanare Burlacu
Baltag productie

r1 ><r2
Angajat Departament Sef

Exemplu de joncţiune vidă


Joncţiune
Joncţiunea externă – „outer join”
Operatorul de joncţiune exclude tuplurile unei relaţii ce nu au
corespondent în celălalt operand.

Operatorul de joncţiune externă - asigură prezenţa în relaţia rezultat a


tuturor tuplurilor unei relaţii, acestea fiind completate cu valori NULL
atunci când nu au corespondent în cealaltă relaţie.

Acest operator are trei variante :


joncţiune externă la stânga – extinde doar tuplurile primului operand;
joncţiune externă la dreapta – extinde doar tuplurile celui de-al doilea
operand;
joncţiune externă completă – extinde toate tuplurile.
Joncţiune
Exemplu
r1 r2
Angajat Departament Departament Sef
Ionescu vanzari productie Manole
Balint productie achizitii Burlacu
Luca productie

r1 >< LEFT r2 r1 >< RIGHT r2


Angajat Departament Sef Angajat Departament Sef
Ionescu vanzari null Balint productie Manole
Balint productie Manole Luca productie Manole
Luca productie Manole null achizitii Burlacu

r1 >< FULL r2
Angajat Departament Sef
Ionescu vanzari null
Balint productie Manole
Luca productie Manole
null achizitii Burlacu

Fig.3.7 Exemple de joncţiuni externe


Joncţiune
Theta–joncţiune şi echi–joncţiune
În general produsul cartezian nu prezintă interes deoarece combină
tuplurile celor doi operanzi într-o manieră lipsită de semnificaţie.

ANGAJAT PROIECT
Angajat Proiect Cod Nume
Ionescu A A Venus
Balint A B Marte
Balint B

ANGAJAT >< PROIECT


Angajat Proiect Cod Nume
Ionescu A A Venus
Balint A A Venus
Balint B A Venus
Ionescu A B Marte
Balint A B Marte
Balint B B Marte

Figura 3.8 Produs cartezian


Joncţiune

Operatorul de theta–joncţiune - produs cartezian urmat de o selecţie.

r1 ><F r2 = σF (r1 >< r2 )

F este condiţia de selecţie

ANGAJAT PROIECT
Angajat Proiect Cod Nume
Ionescu A A Venus
Balint A B Marte
Balint B

σ Proiect=Cod (ANGAJAT >< PROIECT)


Angajat Proiect Cod Nume
Ionescu A A Venus
Balint A A Venus
Balint B B Marte

Figura 3.9 Produs cartezian urmat de o selecţie


Joncţiune

Echi–joncţiunea - o theta–joncţiune în care condiţia de selecţie F este o


conjuncţie de atomi de egalitate, fiecare atom implicând câte un atribut din
fiecare operand.
A treia relaţie din figura anterioară - rezultat al unei echi–joncţiuni.

Obs.

1. Majoritatea sistemelor de gestiune a bazelor de date nu exploatează


avantajele numelor atributelor în combinarea relaţiilor ⇒ theta şi echi–
joncţiunea au o importanţă deosebită.

2. interogările SQL corespund echi – joncţiunilor.

3. Joncţiunea naturală a devenit disponibilă doar în versiunile recente de


SQL.
Interogări în algebra relaţională
Interogarea - funcţie care, aplicată asupra unei instanţe
a unei baze de date, produce o relaţie;

Fiind dată o schemă R a unei baze de date, o interogare este


o funcţie care, pentru fiecare instanţă r a lui R, produce o
relaţie definită pe o mulţime X de atribute.

În algebra relaţională, interogările unei scheme R de


baze de date sunt formulate cu ajutorul unor expresii,
ale căror atomi sunt relaţii din R.
Interogări în algebra relaţională
Exemple
Se consideră o bază de date formată din relaţiile:
ANGAJAT (NrInreg, Nume, Varsta, Salariu)
SUPERVIZOR (NrSup, NrAng)

ANGAJAT SUPERVIZOR
NrInreg Nume Varsta Salariu NrSup NrAng
101 Maria Ionescu 34 40 210 101
103 Maria Balint 23 35 210 103
104 Lucia Popescu 38 61 210 104
105 Nicu Luca 44 38 231 105
210 Marcel Burlacu 49 60 301 210
231 Alin Lupu 50 60 301 231
252 Nicu Luca 44 70 375 252
301 Andrei Popa 34 70
375 Maria Ionescu 50 65

Fig.3.10 Bază de date pentru exemplificarea


interogărilor în algebra relaţională
Interogări în algebra relaţională

1) Să se găsească numerele de înregistrare pentru supervizorii acelor


angajaţi ce câştigă mai mult de 40.

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

π NrSup ( SUPERVIZOR >< NrAng = NrInreg (σ Salariu >40 ( ANGAJAT )))


Interogări în algebra relaţională

2) Să se găsească numerele de înregistrare şi numele supervizorilor ce au


numai subalterni ce câştigă mai mult de 40.

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

se găsesc toţi supervizorii pentru care există subalterni care câştigă


maxim 40;
πNrSup ( SUPERVIZOR ><NrAng =NrInreg ( σSalariu≤40 ( ANGAJAT )))
ANGAJAT SUPERVIZOR
NrInreg Nume Varsta Salariu NrSup NrAng
101 Maria Ionescu 34 40 210 101
103 Maria Balint 23 35 210 103
104 Lucia Popescu 38 61 210 104
105 Nicu Luca 44 38 231 105
210 Marcel Burlacu 49 60 301 210
231 Alin Lupu 50 60 301 231
252 Nicu Luca 44 70 375 252
301 Andrei Popa 34 70
375 Maria Ionescu 50 65
Interogări în algebra relaţională

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

se aplică operatorul de diferenţă între submulţimea supervizorilor şi


mulţimea obţinută la pasul anterior.
πNrInreg , Nume ( ANGAJAT ><NrInreg =NrSup ( πNrSup (SUPERVIZOR) −
πNrSup ( SUPERVIZOR ><NrAng =NrInreg ( σSalariu≤40 ( ANGAJAT )))))
ANGAJAT SUPERVIZOR
NrInreg Nume Varsta Salariu NrSup NrAng
101 Maria Ionescu 34 40 210 101
103 Maria Balint 23 35 210 103
104 Lucia Popescu 38 61 210 104
105 Nicu Luca 44 38 231 105
210 Marcel Burlacu 49 60 301 210
231 Alin Lupu 50 60 301 231
252 Nicu Luca 44 70 375 252
301 Andrei Popa 34 70
375 Maria Ionescu 50 65
Valori NULL în algebra relaţională
În cele discutate anterior am presupus că expresiile algebrice sunt aplicate
unor relaţii ce nu conţin valori NULL.
Ţinând cont de importanţa valorilor NULL în aplicaţii, vom vedea care este
impactul lor asupra limbajelor de interogare şi actualizare a datelor.
Exemplu. Să considerăm relaţia din figura următoare
PERSOANA
.

Nume Varsta Salariu


Ionescu 35 500
Popescu 27 600
Popa NULL 500

Figura 3.12 Relaţie cu valori NULL

şi selecţia σVarsta >30 ( PERSOANA)


- Primul tuplu va contribui la rezultatul selecţiei, iar al doilea tuplu nu.
- Ce putem spune despre al treilea tuplu (valoarea NULL având
semnificaţia unei informaţii pe care o ignoram)?
Valori NULL în algebra relaţională

În raport cu interogările prezentate anterior vom utiliza o logică


trivalentă în locul celei bivalente:
O formulă poate avea valorile de adevăr TRUE (T), FALSE (F) sau
UNKNOWN (U).
Rezultatul unei condiţii atomice va avea valoarea de adevăr
UNKNOWN dacă cel puţin un termen al comparaţiei are valoarea
NULL.
Revenind la exemplul anterior, expresia va produce o relaţie formată
din primul tuplu, pentru care valoarea de adevăr a expresiei a fost
TRUE.
Tabelele de adevăr în logica trivalentă pentru conectorii not, and şi or
sunt:

not and T U F or T U F
U U T T U F T T T T
F T U U U F U T U U
T F F F F F F T U F
Valori NULL în algebra relaţională
Este de notat că această logică trivalentă pentru operatorii algebrici
prezintă unele dezavantaje. PERSOANA
Nume Varsta Salariu
Exemplu Ionescu 35 500
Să considerăm expresia Popescu 27 600
Popa NULL 500

σVarsta >30 ( PERSOANA) ∪ σVarsta≤30 ( PERSOANA)

Logic, această expresie ar trebui să returneze relaţia PERSOANA.

Pe de altă parte, dacă cele două subexpresii sunt evaluate separat,


al treilea tuplu va produce un rezultat necunoscut pentru fiecare
subexpresie, deci şi pentru reuniune.

Numai prin intermediul unei evaluări globale (abordare care nu este


practică în cazul expresiilor complexe) putem ajunge la concluzia că
un astfel de tuplu trebuie să apară în rezultat.
Valori NULL în algebra relaţională
Cea mai bună metodă practică de a depăşi astfel de dificultăţi este de a
trata valorile NULL din punct de vedere pur sintactic.
În acest sens sunt introduse două noi condiţii atomice de selecţie pentru a
verifica dacă o valoare este specificată sau este NULL:
A is NULL este adevărată pentru tuplul t dacă t[A] = NULL şi falsă în
rest;
A is NOT NULL este adevărată pentru tuplul t dacă t[A] ≠ NULL şi falsă
în rest.

Exemplu
σVarsta >30 ( PERSOANA) - returnează persoanele cu vârsta peste 30 ani.
σVarsta >30 ∨ Varsta IS NULL ( PERSOANA) - returnează persoanele care au sau
care pot avea peste 30 ani.

Această abordare este utilizată în versiunile recente de SQL care suportă


logica trivalentă.
VEDERI

În cele prezentate anterior am văzut că se pot construi reprezentări diferite


ale datelor, reprezentări ce vor fi disponibile utilizatorilor prin
intermediul relaţiilor derivate.
Tipuri de relaţii într-o bază de date relaţională
relaţii de bază - conţinutul este autonom şi stocat în baza de date
relaţii derivate - conţinutul este definit pe baza conţinutului altor
relaţii
Există două tipuri principale de relaţii derivate:
vederi materiale - relaţii derivate stocate în baza de date;
vederi (relaţii virtuale) – relaţii definite prin intermediul unor funcţii
(expresii ale limbajului de interogare) care nu sunt stocate în baza de
date, dar pot fi folosite în interogări ca şi cum ar exista fizic.
Vederi

Vederile materiale oferă un avantaj când numărul cererilor de interogare


este mai mare decât operaţiile de actualizare ale relaţiei pe care se
bazează vederea.

Deoarece nu se pot specifica tehnici generale de păstrare a consistenţei


între relaţiile de bază şi vederile materiale, majoritatea sistemelor
comerciale oferă mecanisme numai pentru relaţiile virtuale (vederi).

Vederile sunt definite în sistemele relaţionale ca fiind expresii ale unui limbaj
de interogare.
Vederi

un utilizator interesat numai de o porţiune din baza de date poate evita


contactul cu componentele ce nu prezintă interes;

Exemplu

Într-o bază de date cu două relaţii având schemele

ANGAJAT (NrAngajat, Departament)


MANAGER (Departament, NrSupervizor),

un utilizator interesat doar de angajaţi şi de supervizorii lor ar putea fi


ajutat de existenţa unei vederi definită astfel:

π NrAngajat , NrSupervizor ( ANGAJAT >< MANAGER)


Calculul relaţional
Algebra relaţională este un limbaj procedural - expresiile
specifică pas cu pas construirea rezultatului

Calculul relaţional - familie de limbaje de interogare,


bazate pe calculul cu predicate de ordinul întâi
(limbaje descriptive)
interogarea este specificată prin proprietăţile
rezultatului
contează mai puţin procedura ce trebuie urmată

Versiuni ale calculului relaţional:


Calculul relaţional pe domenii - prezintă caracteristicile
de bază ale acestor limbaje
Calculul relaţional pe tupluri - formează bazele multor
constructori disponibili pentru interogarea în SQL
Calculul relaţional pe domenii
Expresiile din calculul relaţional pe domenii au forma
{ A1 : x1 , ..., Ak : xk | f },
A1 ..., Ak - atribute distincte
x1 ..., xk - variabile ( pentru simplitate le vom considera distincte)
f - formulă construită pe baza următoarelor reguli:

{NrInreg : m, Nume : n,Varsta : v, Salariu : s | ANGAJAT ( m, n, v, s) ∧ s > 40}

a) există două tipuri de formule atomice:


- R ( A1 : x1 , ..., Ap : x p ) unde R ( A1 , ..., Ap ) este o schemă relaţională şi
x1 ..., x p variabile
- xθy sau xθc,
x şi y variabile, c constantă
θ operator de comparaţie ( =, ≠ , ≤, <, ≥ , > )
Calculul relaţional pe domenii
b) dacă f1 şi f2 sunt formule, atunci f1 ∨ f 2 , f1 ∧ f 2 şi ¬f1 sunt formule

c) dacă f este o formulă şi x variabilă ce apare în f atunci ∃x ( f ) şi ∀x ( f )


sunt formule cu
∃ - cuantificatorul existenţial
∀ - cuantificatorul universal

{NrInreg : m, Nume : n,Varsta : v, Salariu : s | ANGAJAT ( m, n, v, s) ∧ s > 40}

Lista de perechi A1 : x1 , ..., Ak : xk se numeşte listă ţintă deoarece


defineşte structura rezultatului;

• rezultatul va consta din relaţia definită pe A1 ..., Ak care conţine tupluri


ale căror valori, substituite cu x1 ..., xk asigură că formula f este adevărată
Calculul relaţional pe domenii
Valoarea de adevăr a unei formule f se stabileşte pe baza următoarelor
reguli:

• formula atomică R ( A1 : x1 , ..., Ap : x p ) este adevărată pentru acele

valori ale lui x1 ..., x p ce formează un tuplu în R

• formula atomică xθy este adevărată pentru acele valori ale lui x şi
y astfel încât valoarea lui x se află în relaţia θ cu valoarea lui y

- în acelaşi mod se defineşte valoarea de adevăr a formulei xθc


• semnificaţia conectorilor ∨, ∧, ¬ este cea uzuală

• ∃x( f ) este adevărată dacă există cel puţin o valoare a lui x


pentru care formula f este adevărată

• ∀x ( f ) este adevărată dacă formula f este adevărată pentru


toate valorile posibile ale lui x
Calculul relaţional pe domenii
Modul de exprimare a interogărilor în calculul pe domenii

Exemple

1. Se consideră baza de date cu schema:

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

Să se găsească numerele de înregistrare, numele, vârsta şi salariul


pentru toţi angajaţii ce câştigă mai mult de 40
În algebra relaţională: σ Salariu > 40 ( ANGAJAT )

În calculul relaţional pe domenii ?


Calculul relaţional pe domenii
Modul de exprimare a interogărilor în calculul pe domenii

Exemple

1. Să se găsească numerele de înregistrare, numele, vârsta şi salariul


pentru toţi angajaţii ce câştigă mai mult de 40

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

În calculul relaţional pe domenii:

{NrInreg : m, Nume : n,Varsta : v, Salariu : s | ANGAJAT ( m, n, v, s ) ∧ s > 40}


Calculul relaţional pe domenii
2. Să se găsească numerele de înregistrare pentru supervizorii acelor
angajaţi ce câştigă mai mult de 40

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

În algebra relaţională:
π NrSup ( SUPERVIZOR >< NrAng = NrInreg (σ Salariu >40 ( ANGAJAT )))

În calculul relaţional pe domenii ?


Calculul relaţional pe domenii
2. Să se găsească numerele de înregistrare pentru supervizorii acelor
angajaţi ce câştigă mai mult de 40

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

În calculul relaţional pe domenii:

{NrSup : n | ANGAJAT ( NrInreg : m, Nume : u ,Varsta : v, Salariu : s ) ∧


s > 40 ∧ SUPERVIZOR( NrSup : n, NrAng : m)}

Variabila m, comună ambelor condiţii atomice, realizează


corespondenţa între tuplurile specificate în joncţiune.
Se pot utiliza cuantificatori existenţiali pentru toate variabilele ce
nu apar în lista ţintă ⇒ se complică formularea cererii.
Calculul relaţional pe domenii
Dacă într-o expresie este necesară implicarea unor tupluri diferite ale
aceleaşi relaţii este suficientă impunerea mai multor condiţii asupra
aceluiaşi predicat din formulă, utilizând variabile diferite.

3. Să se găsească numele şi salariile pentru supervizorii acelor angajaţi


ce câştigă mai mult de 40

În algebra relaţională:
π Nume, Salariu ( ANGAJAT >< NrInreg = NrSup
( SUPERVIZOR >< NrAng = NrInreg (σ Salariu ≥40 ( ANGAJAT ))))

În calculul relaţional pe domenii ?

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)
Calculul relaţional pe domenii

3. Să se găsească numele şi salariile pentru supervizorii acelor angajaţi


ce câştigă mai mult de 40

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

În calculul relaţional pe domenii - pentru fiecare tuplu din rezultat trebuie


să existe trei tupluri: un tuplu corespunde unui angajat ce câştigă
mai mult de 40, al doilea tuplu indică supervizorul său şi ultimul
furnizează informaţii detaliate despre supervizor:
{Nume : ns, Salariu : ss |
ANGAJAT ( NrInreg : ni, Nume : u ,Varsta : v, Salariu : s ) ∧ s > 40 ∧
SUPERVIZOR ( NrSup : n, NrAng : ni ) ∧
ANGAJAT ( NrInreg : n, Nume : ns,Varsta : q, Salariu : ss )}
Calculul relaţional pe domenii
Dezavantaje ale calculului relaţional pe domenii

Limitări ce au importanţă din punct de vedere practic:

{ A1 : x1 , A2 : x2 | R ( A1 : x1 ) ∧ x2 = x2 }

Expresia
produce ca rezultat 5.. ???

dacă domeniul se schimbă?


dacă domeniul este infinit?
Calculul relaţional pe domenii
Dezavantaje ale calculului relaţional pe domenii
Limitări ce au importanţă din punct de vedere practic:

Expresia { A1 : x1 , A2 : x2 | R ( A1 : x1 ) ∧ x2 = x2 } produce ca rezultat


o relaţie pe A1 şi A2 formată din tupluri ale căror valori pe A1 apar în
relaţia R, şi valoarea pe A2 poate fi orice valoare din domeniu
(deoarece condiţia este întotdeauna adevărată)
dacă domeniul se schimbă, spre exemplu de la întreg între 0 şi 99 la
întreg între 0 şi 999, răspunsul interogării se schimbă de asemenea;
dacă domeniul este infinit, atunci şi rezultatul este infinit, ceea ce este de
neacceptat.

O observaţie similară poate fi făcută şi referitor la expresia


{ A1 : x1 | ¬R( A1 : x1 )}
al cărei rezultat este o relaţie ce conţine acele valori din domeniul A1
care nu apar în relaţia R.
Calculul relaţional pe domenii
Definiţii

1. O expresie a unui limbaj de interogare este independentă de domeniu


dacă rezultatul său în fiecare instanţă a bazei de date nu variază
dacă se modifică domeniul pe care se evaluează expresia.

2. Un limbaj este independent de domeniu dacă toate expresiile lui sunt


independente de domeniu.

Pe baza acestor definiţii putem afirma că:


algebra relaţională este independentă de domeniu (construind
rezultatul pe baza relaţiilor din baza de date, fără a face referire la
domeniile atributelor);

calculul relaţional pe domenii este dependent de domeniu.


Calculul relaţional pe domenii
3. Spunem ca două limbaje de programare sunt echivalente dacă pentru
orice expresie dintr-un limbaj există o expresie echivalentă în cel de-
al doilea limbaj şi invers.

Algebra relaţională şi calculul pe domenii nu sunt echivalente,


deoarece calculul pe domenii permite formularea unor expresii ce
sunt dependente de domeniu
O echivalenţă se poate obţine dacă limităm calculul pe domenii la
o submulţime de expresii independente de domeniu

Un alt dezavantaj al calculului relaţional pe domenii este dat de numărul


mare de variabile cerute într-o expresie, de obicei o variabilă pentru
fiecare atribut

Singurul limbaj bazat, într-o anumită măsură, pe calculul pe domenii este


QBE (Query by Example)
Calculul relaţional pe tupluri
Expresiile din calculul pe tupluri au forma {T | L | f }
{s.NrSup | e( ANGAJAT ), s ( SUPERVIZOR ) |
e.NrInreg = s.NrAng ∧ e.Salariu > 40}

T - lista ţintă, compusă din elemente de tipul Y:x.Z (sau mai simplu x.Z ca
abreviere pentru Z:x.Z), cu x variabilă şi Y, Z secvenţe de atribute de lungimi
egale

• atributele din Z trebuie să apară în schema relaţiei ce constituie gama de


valori a lui x
• vom scrie x.* ca abreviere pentru X:x.X, unde gama de valori a variabilei x
este o relaţie definită pe atributele X

L - lista gamei de valori, în care sunt enumerate variabilele libere din formula f,
împreună cu gamele de variaţie corespunzătoare
• L este o listă de elemente de tipul x(R) , cu x variabilă şi R relaţie
• dacă x(R) este în lista gamei de valori, atunci x reprezintă tuplurile din R
Calculul relaţional pe tupluri

f - formulă constituită din:

• atomi de tipul x. Aθc sau x1. A1θx2 . A2 care compară valoarea lui x
corespunzătoare atributului A cu constanta c şi valoarea lui x1 pe
atributul A1 cu cea a lui x2 pe atributul A2

• conectori ( ∧, ∨, ¬ )

• cuantificatori:

∃x ( R )( f ) - există un tuplu x în R ce satisface f


∀x ( R)( f ) - orice tuplu x din R satisface f

Notă. În timp ce se introduce variabila x, o declaraţie a gamei de valori de


forma x(R) specifică faptul că x poate lua ca valori numai tupluri din
relaţia R ⇒ acest limbaj nu necesită formularea unor condiţii atomice
ca în calculul pe domenii care să indice că un tuplu aparţine unei
anumite relaţii.
Calculul relaţional pe tupluri
Exemple. Se consideră baza de date cu schema:

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

1) Să se găsească numerele de înregistrare, numele, vârsta


şi salariul pentru toţi angajaţii ce câştigă mai mult de 40

{e.* | e( ANGAJAT ) | e.Salariu > 40}


Calculul relaţional pe tupluri
Exemple. Se consideră baza de date cu schema:

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

2) Să se găsească numerele de înregistrare pentru


supervizorii acelor angajaţi ce câştigă mai mult de 40

{s.NrSup | e( ANGAJAT ), s ( SUPERVIZOR ) |


e.NrInreg = s.NrAng ∧ e.Salariu > 40}
Calculul relaţional pe tupluri
Exemple. Se consideră baza de date cu schema:

ANGAJAT (NrInreg, Nume, Varsta, Salariu)


SUPERVIZOR (NrSup, NrAng)

3) Să se găsească numele şi salariile pentru supervizorii


acelor angajaţi ce câştigă mai mult de 40

{NumeS , SalariuS : e '.( Nume, Salariu) |


e '( ANGAJAT ), e( ANGAJAT ), s( SUPERVIZOR) |
e '.NrInreg = s.NrSup ∧ s.NrAng = e.NrInreg ∧ e.Salariu > 40}
Calculul relaţional pe tupluri

Observaţii

Nu orice interogare din algebra relaţională sau din calculul relaţional


pe domenii se poate exprima în calculul relaţional pe tupluri

Exemplu - interogările care în algebra relaţională necesită operatorul


reuniune nu pot fi exprimate prin calculul pe tupluri

SQL pune la dispoziţie posibilitatea construirii în mod explicit a


reuniunii, deoarece aspectele declarative ale SQL se bazează pe
calculul pe tupluri cu declaraţia gamei de valori
Probleme propuse

1. Se consideră baza de date alcătuită din relaţiile următoare:

FILME (NumarFilm, Titlu, Regizor, An, CostProductie)


ARTISTI (NumarActor, Nume, Prenume, Sex, DataNastere, Nationalitate)
ROLURI ( NumarFilm, NumarActor, Personaj)

Exprimaţi următoarele interogări în calculul relaţional pe domenii şi în calculul


relaţional pe tupluri:

a) Să se găsească titlurile filmelor în care joacă Henry Fonda


b) Să se găsească titlurile filmelor pentru care regizorul este şi actor
c) Să se găsească actorii care au interpretat două personaje în acelaşi film;
precizaţi titlul filmului, numele şi prenumele actorului şi numele
personajelor interpretate
d) Să se găsească titlurile filmelor în care actorii sunt toţi de acelaşi sex
2. Se consideră baza de date care conţine următoarele relaţii:
CURSURI (Numar, Facultate, TitluCurs, Titular)
STUDENTI (Numar, Nume, Prenume, Facultate)
TITULARI (Numar, Nume, Prenume)
EXAMENE (Student, Curs, Nota, Data)
PLAN_INVATAMANT (Student, Curs, An)

Formulaţi în calculul relaţional pe domenii şi în calculul relaţional pe tupluri


interogările care produc:
a) studenţii care au obţinut nota 10 la cel puţin un examen, precizând pentru
fiecare numele, prenumele şi data când au obţinut prima notă de 10
b) pentru fiecare curs de la Automatică, studenţii care au trecut examenul în
ultima sesiune
c) studenţii care au trecut toate examenele cerute de planul de învăţământ
d) pentru fiecare curs de la Electronică, studenţii care au obţinut cea mai mare
notă
e) numele şi prenumele studenţilor care au luat examenul la un curs al cărui
titular are acelaşi nume ca şi studentul
3. Pentru baza de date cu relaţiile:

ORASE (Nume, Judet, NumarLocuitori)


TRAVERSARI (Oras, Râu)
RÂURI (Râu, Lungime),

formulaţi următoarele interogări în calculul relaţional pe domenii şi în calculul


relaţional pe tupluri :

a) găsiţi numele, judeţele şi numărul de locuitori pentru oraşele care au mai


mult de 50000 de locuitori şi sunt traversate de Siret sau Mureş

b) găsiţi oraşele care sunt traversate de cel puţin două râuri, precizând
numele oraşului şi numele celui mai lung râu care-l traversează
SQL

• Acronim pentru Structured Query Language


• Dezvoltat pentru sistemul de gestiune a bazelor de date System R, creat de
IBM Research Laboratory, San Jose, California, la sfârşitul anilor ’70.
• SQL a fost standardizat şi a devenit limbajul de referinţă pentru bazele de
date relaţionale.
• SQL are proprietăţile:
unui limbaj de definire a datelor, LDD (comenzi pentru definirea unei
scheme a unei baze de date relaţionale);
unui limbaj de manipulare a datelor, LMD (comenzi pentru modificarea şi
interogarea unei instanţe a unei baze de date relaţionale).
5.1 Definirea datelor în SQL

În această secţiune vom ilustra utilizarea SQL pentru definirea schemei unei
baze de date.
Notaţii folosite în sintaxa limbajului:
• cuvintele cheie - caractere normale
• variabilele - caractere italice.
• parantezele unghiulare <***> marchează termenii;
• parantezele pătrate [***] - termenii delimitaţi sunt opţionali (pot să nu
apară sau să apară doar o singură dată);
• acoladele {***} - termenul din interior poate să nu apară sau poate fi
repetat de un număr arbitrar de ori;
• barele verticale - unul dintre termenii delimitaţi de acestea trebuie să
apară.
• parantezele () rotunde - cuvinte cheie ale SQL.
5.1.1 Domenii elementare
SQL pune la dispoziţie şase familii de domenii elementare, care pot fi utilizate
pentru definirea domeniilor asociate atributelor schemei.

1) Caracter - permite reprezentarea caracterelor sau a şirurilor de caractere.


Lungimea şirurilor poate fi fixă sau variabilă; în cazul şirurilor de lungime
variabilă trebuie specificată lungimea maximă.
Pentru fiecare schemă este specificat un set de caractere implicit (latin, chirilic,
grecesc etc.).
În cazul în care este necesară folosirea a mai mult de un set de caractere se
specifică acest lucru pentru fiecare domeniu.
Sintaxa:
character [varying] [(Lungime)] [character set NumeSetCaracter]
Dacă lungimea nu este specificată, domeniul reprezintă un singur caracter.

Exemplu - şir de caractere de lungime variabilă, cu lungimea maximă de 1000


caractere, setul de caractere grecesc

character varying (1000) character set Greek


2) Bit - este utilizat pentru atribute ce pot avea doar două valori: 0 sau 1.
Se foloseşte pentru reprezentarea atributelor de tip flag (specifică dacă un
obiect are sau nu o anumită proprietate).
SQL pune la dispoziţie de asemenea domeniul „şir de biţi”, lungimea şirului
fiind specificată ca parametru.
Şirurile de biţi sunt utile pentru reprezentarea unui grup de proprietăţi.

Sintaxa:

bit [varying] [(Lungime)]

Exemplu - şir de biţi de lungime variabilă, cu lungimea maximă de 100 caractere

bit varying (100)


3) Domenii numerice - permit reprezentarea valorilor exacte, de tip întreg sau
exacte cu parte fracţionară.

SQL pune la dispoziţie patru domenii numerice diferite:


1. numeric [(Precizie [,Scală])] 3. integer
2. decimal [(Precizie [,Scală])] 4. smallint
Domeniile numeric şi decimal reprezintă numere în baza 10. Parametrul
Precizie specifică numărul total de digiţi, iar parametrul Scală indică numărul de
digiţi folosiţi pentru partea fracţionară.
Exemplu
decimal (4) – valori între -9999 şi +9999
numeric (6,3) – valori între -999,999 şi +999,999
Domeniile numeric şi decimal sunt similare funcţional.
Diferenţe: numeric (precizie fixă), decimal (precizia – cerinţă minimă)
Dacă precizia nu este specificată, sistemul utilizează valoarea implicită. Dacă
scala nu este specificată, se presupune a fi zero.
Domeniile integer şi smallint pot fi utilizate când nu este nevoie de parte
fracţionară.
4) Domenii numerice - permit descrierea numerelor reale, prin intermediul
aproximative reprezentării în virgulă mobilă, unde fiecare număr
corespunde unei perechi mantisă – exponent.
Mantisa este o valoarea fracţionară iar exponentul este un întreg.
Valoarea aproximativă a unui număr real se obţine înmulţind mantisa cu
puterea lui 10 specificată prin exponent.

Exemplu
0.17E16→0.17 • 1016
0.17 – mantisă; 16 – exponent; valoare = mantisă ⋅ 10exponent
SQL pune la dispoziţie următoarele domenii numerice aproximative:
• float [(Precizie)]
• real
• double precision
Pentru domeniul float se poate furniza, ca parametru, numărul de digiţi dedicaţi
pentru reprezentarea mantisei (parametrul Precizie).
Domeniul double precision reprezintă numere cu o precizie ridicată faţă de
domeniul real.
5) Dată calendaristică şi - oferă suport pentru gestiunea informaţiilor temporale
timp

• date
• time [(Precizie)] [with time zone]
• timestamp [(Precizie)] [with time zone]
Fiecare domeniu poate fi structurat pe câmpuri:
- domeniul date pune la dispoziţie câmpurile year, month şi day
- domeniul time câmpurile hour, minute şi second
- domeniul timestamp pune la dispoziţie toate câmpurile celor două domenii
amintite anterior.
Pentru domeniile time şi timestamp se poate specifica numărul de poziţii
zecimale utilizate în reprezentarea fracţiunilor de secundă (parametrul Precizie).
Dacă parametrul Precizie este omis:
- domeniul time va folosi precizie 0 (rezoluţie la nivel de secundă)
- domeniul timestamp va folosi o precizie de 6 (rezoluţie la nivel de
microsecundă).
Dacă este specificată opţiunea with time zone, va fi posibilă accesarea a două
câmpuri suplimentare: timezone_hour şi timezone_minute (reprezintă diferenţa
dintre timpul local şi timpul Greenwich).
6) Intervale temporale - oferă posibilitatea reprezentării intervalelor de timp (de
exemplu durata unei acţiuni).
Sintaxa:
Interval PrimaUnitateDeTimp [to UltimaUnitateDeTimp]

PrimaUnitateDeTimp şi UltimaUnitateDeTimp definesc unităţile de măsură ce


trebuie folosite.

Unităţile de măsură se împart în două grupuri distincte:


• year şi month;
• de la day la second.

Această separare are loc deoarece este imposibilă compararea exactă a


zilelor şi a lunilor (deoarece o lună poate avea între 28 şi 31 zile).

INTERVAL YEAR [(year_precision)] TO MONTH

INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]


INTERVAL YEAR [(year_precision)] TO MONTH

INTERVAL DAY [(day_precision)] TO SECOND [(fractional_seconds_precision)]

• Prima unitate de timp poate fi însoţită de precizie - numărul de digiţi


zecimali utilizaţi pentru reprezentare;
- dacă cea mai mică unitate este second, putem specifica numărul de poziţii
zecimale utilizate (precizia).

• Dacă a doua unitate de timp este şi prima (deci singura) atunci primul
parametru reprezintă numărul de poziţii zecimale semnificative, iar cel
de-al doilea poate reprezenta numărul de poziţii zecimale pentru partea
fracţionară.

Dacă precizia nu este specificată, se foloseşte valoarea implicită 2.


Exemplu

interval year(5) to month – permite reprezentarea intervalelor până la 99999


ani şi 11 luni

interval day(4) to second(6) – permite reprezentarea intervalelor până la


9999zile, 23 ore, 59 minute şi 59,999999
secunde (precizie de 1 milionime de
secundă)
5.1.2 Definirea schemei bazei de date

SQL permite definirea unei scheme de baze de date ca o colecţie de obiecte.


Fiecare schemă conţine o mulţime de domenii, tabele, indici, aserţii, vederi şi
privilegii şi este definită cu ajutorul următoarei sintaxe:

create schema [NumeSchemă] [[authorization] Autorizare]


{DefiniţieElementeDinSchemă}

• Autorizare - numele utilizatorului proprietar al schemei - dacă este omis se


consideră că utilizatorul care a executat comanda este proprietarul
schemei.
• Dacă NumeSchemă este omis va fi adoptat ca nume al schemei numele
utilizatorului ce a executat comanda.
• După comanda create schema se pot defini obiectele din schema
respectivă.
5.1.3 Definirea tabelelor

Un tabel SQL este format dintr-o mulţime ordonată de atribute şi o mulţime,


posibil vidă, de constrângeri.
create table NumeTabel
(NumeAtribut Domeniu [ValoareImplicită] [Constrângeri]
{, NumeAtribut Domeniu [ValoareImplicită] [Constrângeri]}
[,AlteConstrângeri])
După ce au fost definite toate atributele, se pot defini alte constrângeri ce
implică mai multe atribute.
Iniţial tabelul nu conţine înregistrări, proprietarul deţinând toate privilegiile
asupra tabelului, adică drepturi de a accesa şi de a modifica datele din tabel.

Exemplu
create table Departament
(NumeDept char(20) primary key,
Adresa char(50),
Oraş char(20))
5.1.4 Domenii utilizator
La definirea tabelelor, pe lângă domeniile predefinite pot fi utilizate şi domenii
definite explicit de utilizator.
Comanda SQL pentru definirea unui domeniu utilizator pe baza unui domeniu
predefinit este:
create domain NumeDomeniu as DomeniuElementar
[ValoareImplicită]
[Constrângeri]
Un domeniu este caracterizat deci de un nume, de un domeniu elementar
(predefinit sau un alt domeniu utilizator), de o posibilă valoare implicită şi de o
mulţime, posibil vidă, de constrângeri (condiţii ce trebuie îndeplinite de valorile
legale din domeniu).
SQL-2 nu dispune de constructori de domeniu de tip structură sau vector.
Această limitare este dată de conceptul de model relaţional de date, model ce
impune ca toate atributele să fie definite pe domenii elementare.
Declaraţia domeniilor asociază un nume de domeniu cu o mulţime de
constrângeri. Acest lucru este util atunci când trebuie să repetăm aceeaşi definiţie
de domeniu în mai multe tabele.
5.1.5 Valori implicite de domeniu
Termenul ValoareImplicită din definiţia domeniilor şi a tabelelor indică
valoarea ce va fi considerată pentru atributul asociat în cazul inserării unei linii ce
nu specifică o valoare pentru acel atribut.
Dacă este omisă specificarea unei valori implicite, atunci se va utiliza valoarea
NULL ca valoare implicită.
Sintaxa: default <ValoareGenerică | user | NULL>
• ValoareGenerică este o valoare compatibilă cu domeniul asociat;
• opţiunea user setează ca valoare implicită numele de login al utilizatorului
ce a executat comanda de actualizare a tabelului.

Exemplu
NumărCopii smallint default 0 – dacă se inserează o linie şi nu se specifică
valoarea pentru acest atribut, atunci
acestui atribut i se va atribui valoarea 0.
5.1.6 Constrângeri intra-relaţionale
În timpul definirii atât a domeniilor cât şi a tabelelor există posibilitatea de a
defini constrângeri.

Constrângerile sunt proprietăţi ce trebuie verificate de fiecare instanţă a bazei


de date şi se împart în:

constrângeri intra-relaţionale (implică o singură relaţie);


constrângeri inter-relaţionale (iau în considerare mai multe relaţii).

Cele mai simple constrângeri intra-relaţionale sunt:

not NULL

unique

primary key
Not Null

Această constrângere indică faptul că valoarea NULL nu este admisă ca


valoare pentru atributul afectat de constrângere.
În acest caz valoarea atributului trebuie să fie specificată la inserare.
Este posibilă inserarea unei linii fără a specifica valoarea unui atribut cu
constrângere not NULL doar dacă pentru atributul respectiv s-a definit o valoare
implicită diferită de valoarea NULL.
Specificarea acestei constrângeri se face prin adăugarea cuvintelor cheie not
NULL la definirea atributului.

Exemplu
Nume character(20) not NULL
Unique - impune ca un atribut sau o mulţime de atribute să formeze o (super)
cheie.
• Se impune astfel ca linii diferite să nu conţină aceleaşi valori.
• Excepţie face valoarea NULL, care poate apărea în diverse linii fără a
încălca constrângerea. Aceasta se datorează faptului că fiecare valoare
NULL reprezintă o valoare necunoscută diferită de a altei valori NULL.
Există două moduri de definire a acestei constrângeri.
Prima variantă se utilizează doar în cazul în care constrângerea implică un
singur atribut şi constă în adăugarea cuvântului cheie unique la definirea
atributului.
Exemplu
NrInreg numeric(4) unique
A doua variantă se aplică în cazul în care constrângerea implică mai multe
atribute şi constă în utilizarea clauzei unique (Atribut{, Atribut}) după definirea
atributelor.

Exemplu
Nume character(20) not NULL,
Prenume character(20) not NULL,
Unique (Nume, Prenume)
Primary key

Această constrângere poate fi specificată o singură dată pentru un tabel şi


poate fi definită pe un singur atribut sau pe o mulţime de atribute.

Definiţia unei astfel de constrângeri implică definirea implicită a unor


constrângeri not NULL pentru atributul (atributele) cheii primare.

Exemplu

Nume character(20),
Prenume character(20),
Dept character(15),
Salariu numeric(9) default 0,
primary key (Nume, Prenume)
5.1.7 Constrângeri inter-relaţionale

Cele mai importante constrângeri inter-relaţionale sunt constrângerile de


integritate referenţială.
Constrângerea de tip foreign key impune ca pentru fiecare linie dintr-un tabel
(numit tabel intern), valoarea corespunzătoare unui atribut, diferită de NULL, să se
regăsească printre valorile unui atribut din liniile unui alt tabel (numit tabel extern).
Singura cerinţă impusă de sintaxă este ca atributul referit din tabelul extern să
fie subiectul unei constrângeri unique. Această cerinţă este satisfăcută dacă
atributul în cauză formează o cheie primară pentru tabelul extern.

Constrângerile de referinţă pot fi definite în două moduri.


În cazul în care în constrângere este implicat un singur atribut se utilizează
construcţia sintactică references, care indică tabelul extern şi atributul asociat.

Exemplu

Create table Angajati


(
NrInreg numeric(6) primary key,
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15) references Departament (NumeDept),
Salariu numeric(9) default 0,
Oras character(15),
unique (Nume, Prenume)
)
Dacă legătura se face între o mulţime de atribute se va utiliza construcţia
foreign key, plasată după definirea tuturor atributelor.
Această construcţie listează mai întâi atributele constrânse din tabelul intern,
urmate de numele tabelului extern şi de numele atributelor referite.

Exemplu

Create table Angajati


(
NrInreg numeric(6) primary key,
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15) references Departament (NumeDept),
Salariu numeric(9) default 0,
Oras character(15),
unique (Nume, Prenume),
foreign key (Nume, Prenume) references DatePersonale (Nume, Prenume)
)
În cazul constrângerilor discutate până acum sistemul va rejecta (generând un
mesaj de eroare) orice operaţie de actualizare ce violează constrângerea.
Pentru constrângerea de referinţă SQL permite utilizatorului selecţia acţiunii ce
va fi executată în cazul violării constrângerii.

Exemplu. Să considerăm constrângerea de tip cheie externă asupra atributului


Dept în tabelul ANGAJATI.
Constrângerea poate fi violată operând atât asupra liniilor din tabelul intern
ANGAJATI cât şi asupra liniilor din tabelul extern DEPARTAMENT.
Există doar două căi de a încălca constrângerea prin modificarea conţinutului
tabelului intern:
• prin inserarea unei linii invalide;
• prin modificarea atributului Dept.
În aceste cazuri nu este oferit un suport special, operaţiile fiind pur şi simplu
rejectate.
Se oferă opţiuni variate de reacţie la încălcarea constrângerii de referinţă
determinată de modificarea tabelului extern.
Această diferenţă faţă de cazul anterior este dată de importanţa tabelului
extern care, din punctul de vedere al aplicaţiei, reprezintă tabelul principal
(master); tabelul intern (slave) trebuie să se adapteze la schimbările produse în
tabelul extern.
Operaţiile asupra tabelului extern care pot produce violări ale constrângerii de
referinţă sunt:
• modificarea valorilor atributelor referite;
• ştergerea de înregistrări (în exemplul anterior modificarea atributului
NumeDept respectiv ştergerea de înregistrări
din tabelul DEPARTAMENT).
Tipul reacţiei la astfel de încălcări ale constrângerii diferă în funcţie de
comanda ce a generat violarea constrângerii.
În cazul operaţiilor de actualizare este posibilă reacţia în unul din modurile
următoare:
• cascade: noua valoare pentru atributul din tabelul extern va fi atribuită
tuturor liniilor corespunzătoare din tabelul intern;
• set NULL: valoarea NULL este asignată atributului din tabelul intern în locul
valorii modificate din tabelul extern;
• set default: atributului din tabelul intern îi va fi asignată valoarea implicită în
locul valorii modificate în tabelul extern;
• no action: operaţia de actualizare este rejectată.

Opţiunile disponibile în cazul încălcării constrângerii de referinţă prin ştergerea


de înregistrări din tabelul extern sunt:
• cascade: vor fi şterse toate liniile din tabelul intern corespunzătoare liniei
şterse din tabelul extern;
• set NULL: se asignează valoarea NULL atributului din tabelul intern în locul
valorii şterse din tabelul extern;
• set default: atributul din tabelul intern va primi valoarea implicită în locul
valorii şterse din tabelul extern;
• no action: operaţia de ştergere este rejectată.
Specificarea modului de reacţie în cazul violării unei constrângeri de referinţă
se face imediat după definirea constrângerii prin sintaxa:

on <delete | update>
<cascade | set NULL | set default | no action>

Exemplu
Create table Angajati
(
NrInreg numeric(6),
Nume character(20) not NULL,
Prenume character(20) not NULL,
Dept character(15)
Salariu numeric(9) default 0,
Oras character(15),
primary key (Nr Inreg),
foreign key (Dept) references Departament (NumeDept)
on delete set NULL
on update cascade,
unique (Nume, Prenume)
)
5.1.8 Actualizarea schemei unei relaţii
Comenzile definite în SQL pentru manipularea schemelor unei baze de date
sunt alter şi drop.

Comanda alter - permite modificarea domeniilor şi schemelor de tabele şi poate


avea o varietate de forme:

alter domain NumeDomeniu <set default ValoareImplicită |


drop default |
add constraint DefiniţieConstrângere |
drop constraint NumeConstrângere>
alter table NumeTabel
<alter column NumeAtribut
<set default ValoareImplicită | drop default> |
add constraint DefiniţieConstrângere |
drop constraint NumeConstrângere |
add column DefiniţieAtribut |
drop column NumeAtribut>
Prin utilizarea celor două comenzi se pot opera următoarele modificări asupra
domeniilor şi tabelelor:

• adăugare / eliminare constrângeri;


• modificare valoare implicită;
• adăugare / eliminare atribute din schema unui tabel.

Notă

În momentul definirii unei noi constrângeri, datele din tabel trebuie să satisfacă
acea constrângere. În caz contrar definiţia constrângerii nu va fi validată.
Comanda drop - permite eliminarea datelor de tip schemă, domeniu, tabel, vedere
sau aserţie (constrângere ce nu este asociată unui anumit
tabel).
Sintaxa este:
drop <schema|domain|table|view|assertion> NumeComponentă [<restrict | cascade>]
restrict – o componentă nu va fi validată în situaţia în care componenta nu este
vidă sau este referită în definiţia altei componente.
• schemă nu va fi eliminată dacă ea conţine tabele sau alte componente;
• un domeniu nu va fi eliminat dacă apare în definiţia unui tabel ş.a.m.d.
• această opţiune este implicită.
cascade - o componentă este eliminată împreună cu toate componentele
dependente.
• eliminarea unei scheme care nu este vidă va conduce la eliminarea tuturor
obiectelor care intră în componenţa sa;
• ştergerea unui tabel folosind această opţiune implică ştergerea tuturor liniilor din
tabel;
• opţiunea cascade trebuie utilizată cu mare atenţie deoarece în cazul în care există
dependenţe care nu au fost luate în calcul, rezultatul poate fi diferit de cel scontat;
• multe din sistemele comerciale oferă posibilitatea testării rezultatului comenzii drop
cu opţiunea cascade înainte de execuţia efectivă a comenzii.
5.2 Interogări în SQL

Cererile de interogare exprimate în SQL prezintă un aspect declarativ


deoarece sunt specificate proprietăţile rezultatului şi nu modul de obţinere (SQL
urmăreşte principiile calculului relaţional).

Cererile SQL sunt pasate pentru execuţie optimizatorului de cereri.

Optimizatorul de cereri este o componentă a sistemului de gestiune a bazelor


de date care

• analizează cererea;

• selectează o strategie de execuţie;

• formulează o cerere echivalentă în limbajul procedural intern al sistemului


de gestiune a bazelor de date.
5.2.1 Interogări simple
Interogarea unei baze de date poate fi exprimată în SQL prin intermediul
instrucţiunii select, care are sintaxa:

Select ExprAtribut [[as] Alias ] {, ExprAtribut [[as] Alias]}


from NumeTabel [[as] Alias ] {, NumeTabel [[as] Alias]}
[where Conditie]

O cerere SQL va lua în considerare doar liniile ce aparţin produsului cartezian


al tabelelor listate în clauza from şi va stabili liniile ce satisfac condiţia exprimată în
clauza where.
Rezultatul execuţiei unei cereri SQL este un tabel, având câte o linie pentru
fiecare linie selectată de clauza where şi ale cărui coloane rezultă din evaluarea
expresiilor ExprAtribut ce apar în clauza select (lista ţintă).
Fiecare coloană poate fi redenumită cu ajutorul unui Alias ce urmează imediat
după expresie.
Tabelele pot fi de asemenea redenumite prin intermediul unui Alias.
Exemplu
Se consideră o bază de date care conţine tabelele
ANGAJATI (Nume, Prenume, Dept, Birou, Salariu),
DEPARTAMENT (Dept, Adresa, Oras),
cu precizarea ca salariul înregistrat este anual.
ANGAJATI DEPARTAMENT
Nume Prenume Dept Birou Salariu Dept Adresa Oras
Ionescu Maria Administratie 10 45 Administratie Independentei Iasi
Popescu Ion Productie 20 36 Productie Primaverii Bucuresti
Popa Stefan Administratie 20 40 Distributie Central Focsani
Dumitrescu Vasile Distributie 16 45 Planificare Nicolina Iasi
Ionescu Ion Planificare 14 80 Cercetare Trandafirului Cluj
Manole Radu Planificare 7 73
Luca Doru Administratie 75 40
Vasile Alina Productie 20 46

Fig. 5.1 Conţinutul tabelelor ANGAJATI şi DEPARTAMENT

Interogarea 1: Să se găsească salariile angajaţilor cu numele Ionescu.

select Salariu as SalariuAnual Salariu


from Angajati 45
80
where Nume = ’Ionescu’
Fig. 5.2. Rezultatul interogării 1
Lista ţintă - specifică elementele schemei tabelelor rezultat.

Caracterul special * poate să apară în lista ţintă şi reprezintă selecţia tuturor


atributelor tabelelor precizate în clauza from.

Exemplu

Interogarea 2: Să se găsească toate informaţiile referitoare la angajatul cu


numele Ionescu.

select *
from Angajati
where Nume = ’Ionescu’

Nume Prenume Dept Birou Salariu


Ionescu Maria Administratie 10 45
Ionescu Ion Planificare 14 80

Fig. 5.3 Rezultatul interogării 2


Lista ţintă poate conţine expresii ce utilizează valorile atributelor din fiecare
linie selectată.

Exemplu

Interogarea 3: Găsiţi salariul lunar al angajaţilor cu numele Popescu.

select Salariu/12 as SalariuLunar


from Angajati
where Nume = ’Popescu’

SalariuLunar
3.00

Fig. 5.4 Rezultatul interogării 3


Clauza from
Dacă o interogare implică înregistrări din mai multe tabele, argumentul din
clauza from va reprezenta o listă de tabele.
Condiţiile din clauza where sunt aplicate în acest caz produsului cartezian al
acestor tabele; se poate specifica o joncţiune prin indicarea explicită a
comparaţiilor între atribute din tabele diferite.

Interogarea 4: Să se găsească numele angajaţilor şi oraşele în care


aceştia lucrează.
select Angajati.Nume, Angajati.Prenume, Departament.Oras
from Angajati, Departament
where Angajati.Dept = Departament.Dept

Nume Prenume Oras


Ionescu Maria Iasi
Popescu Ion Bucuresti
Popa Stefan Iasi
Dumitrescu Vasile Focsani
Ionescu Ion Iasi
Manole Radu Iasi
Luca Doru Iasi
Vasile Alina Bucuresti
Fig. 5.5 Rezultatul interogării 4
În interogarea precedentă s-a folosit operatorul punct (’.’) pentru identificarea
tabelului din care se extrag atributele.

Folosirea acestei construcţii este necesară în cazul în care tabelele din clauza
from au atribute cu acelaşi nume, pentru a distinge între referinţele la atribute
omonime.

În cazul în care nu există posibilitatea apariţiei unei ambiguităţi se poate


specifica atributul fără a preciza tabelul căruia îi aparţine.

Într-o interogare se pot utiliza alias-uri pentru tabele cu scopul de a scurta


referinţa la acestea.

Exemplu

Interogarea „Să se găsească numele angajaţilor şi oraşele în care aceştia


lucrează” se poate exprima astfel:
select a.Nume, a.Prenume, d.Oras
from Angajati a, Departament d
where a.Dept = d.Dept
Clauza where
Condiţia din clauza where este o expresie booleană formată prin combinarea
predicatelor simple cu operatorii and, or şi not.
Fiecare predicat simplu utilizează operatorii de comparaţie (=, >, >=, <, <=, <>)
şi are, într-un membru, o expresie formată din valori ale atributelor dintr-o linie şi în
celălalt membru o valoarea constantă sau o altă expresie.
Prioritar este operatorul not, dar nu se introduce o precedenţă între and şi or.
Dacă într-o expresie se folosesc ambii operatori and şi or este indicată
specificarea precedenţei prin utilizarea parantezelor.
Exemplu
Interogarea 5: Să se găsească prenumele angajaţilor cu numele Ionescu
care lucrează în departamentele Administratie sau
Productie.
select Prenume
from Angajati
where Nume = ’Ionescu’ and (Dept = ’Administratie’ or Dept = ’Productie’)
Prenume
Maria
Fig. 5.6 Rezultatul interogării 5
Operatorul like - pentru compararea şirurilor de caractere

Acest operator compară un şir cu alt şir, specificat parţial cu ajutorul


caracterelor speciale ’_’ şi ’%’.
• Caracterul ’_’ substituie un caracter oarecare
• Caracterul ’%’ substituie un şir oarecare de caractere, posibil vid.

Exemplu

Comparaţia like ’ab%ba_’ va fi satisfăcută de toate şirurile de


caractere ce încep cu secvenţa ab şi au în componenţă perechea ba
înainte de ultimul caracter.
Gestiunea valorilor NULL
Predicatul is NULL este adevărat doar dacă atributul are valoarea NULL.
Predicatul is not NULL este adevărat în caz contrar celui prezentat anterior.
Sintaxa: Atribut is [not] NULL

Duplicate
În SQL un tabel poate avea mai multe linii ce conţin aceleaşi valori pentru
toate atributele (duplicate), spre deosebire de algebra relaţională şi calculul
relaţional.
Dacă se doreşte emularea comportării din algebra relaţională în SQL ar trebui
eliminate toate duplicatele la fiecare execuţie a unei operaţii de proiecţie.
Deoarece operaţia de eliminare a duplicatelor este consumatoare de timp şi
adesea nu este necesară, executarea acestei operaţii este lăsată la latitudinea
persoanei ce implementează interogarea.
Sintaxa eliminarea duplicatelor: select [<distinct | [all]>]
Opţiunea all indică faptul că vor fi păstrate toate înregistrările din rezultat (deci
inclusiv duplicatele) şi este opţiunea implicită.
Exemplu
Se consideră tabelul PERSOANA (Cod, Nume, Prenume, Oras)
PERSOANA
Cod Nume Prenume Oras
IS001122 Ionescu Maria Iasi
BC012345 Popescu Ion Bucuresti
IS123456 Ionescu Vasile Iasi
SV342345 Ionescu Radu Suceava

Fig. 5.7 Conţinutul tabelei PERSOANA

Interogarea 6: Să se găsească oraşele în care locuiesc persoanele cu


numele Ionescu.
Oras
select Oras Iasi
from Persoana Iasi
where Nume = ’Ionescu’ Suceava

Interogarea 7: Să se găsească oraşele în care locuiesc persoanele cu


numele Ionescu, fiecare oraş apărând o singură dată.
select distinct Oras Oras
from Persoana Iasi
Suceava
where Nume = ’Ionescu’
Joncţiuni

SQL-2 introduce o sintaxă alternativă pentru specificarea joncţiunilor, fiind


astfel posibilă realizarea unei distincţii între condiţiile ce reprezintă condiţii de
joncţiune şi cele ce reprezintă selecţii de linii.
Sintaxa este:
select ExprAtribut [[as] Alias] {, ExprAtribut [[as] Alias]}
from NumeTabel [[as] Alias]
{[TipJonctiune] join NumeTabel [[as] Alias] on CondJonctiune}
[where AlteConditii]
În acest fel, condiţia de joncţiune este mutată din clauza where în clauza from.
Parametrul TipJonctiune specifică tipul joncţiunii: inner, left sau full.
Inner join corespunde theta-joncţiunii din algebra relaţională.

Exemplu
Interogarea „Să se găsească numele angajaţilor şi oraşele în care aceştia
lucrează” se poate rescrie sub forma
select Nume, Prenume, Oras
from Angajati a inner join Departament d
on a.Dept = d.Dept
În cazul unei joncţiuni, liniile dintr-un tabel ce nu au linii corespondente în
celălalt tabel vor fi eliminate din rezultat.
Pentru a forţa apariţia unor astfel de linii în rezultat se poate apela la
joncţiunea externă, cu cele trei variante:
• left join – furnizează acelaşi rezultat ca şi inner join, dar include şi liniile
tabelului ce apare în stânga joncţiunii pentru care nu există linii
corespondente în tabelul din dreapta;
• right join – păstrează liniile tabelului din dreapta ce nu au corespondent în
tabelul din stânga;
• full join – furnizează acelaşi rezultat ca şi inner join, suplimentat cu liniile
excluse din ambele tabele.
Exemplu
Se consideră o bază de date care conţine tabelele prezentate în figură
SOFERI AUTOVEHICULE
Nume Prenume ID NrInreg Marca Model ID
Ionescu Maria VR 001Y IS01AAA BMW 323 VR 001Y
Popescu Ion PZ 111B SV02BBB BMW Z3 VR 001Y
Popa Stefan AP 222C IS02CCC Lancia Delta PZ 111B
IS01EFD BMW 316 MI 222C
Fig. 5.9 Conţinutul tabelelor SOFERI şi AUTOVEHICULE

Interogarea 8: Să se găsească şoferii ce deţin autovehicule, incluzând şi


şoferii fără autovehicule.

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model


from Soferi left join Autovehicule on
(Soferi.ID = Autovehicule.ID)

Nume Prenume ID NrInreg Marca Model


Ionescu Maria VR 001Y IS01AAA BMW 323
Ionescu Maria VR 001Y SV02BBB BMW Z3
Popescu Ion PZ 111B IS02CCC Lancia Delta
Popa Stefan AP 222C NULL NULL NULL
Interogarea 9: Să se găsească toţi şoferii şi toate maşinile împreună cu
posibilele relaţii între ele.

select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model


from Soferi full join Autovehicule on
(Soferi.ID = Autovehicule.ID)

Nume Prenume ID NrInreg Marca Model


Ionescu Maria VR 001Y IS01AAA BMW 323
Ionescu Maria VR 001Y SV02BBB BMW Z3
Popescu Ion PZ 111B IS02CCC Lancia Delta
Popa Stefan AP 222C NULL NULL NULL
NULL NULL NULL IS01EFD BMW 316
Unele implementări de SQL specifică joncţiunea externă prin adăugarea unui
caracter special sau a unei secvenţe de caractere (* sau (+)) la atributele implicate
în condiţia de joncţiune.

Exemplu
Interogarea „Să se găsească şoferii ce deţin autovehicule, incluzând şi
şoferii fără autovehicule” se poate exprima sub forma
select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model
from Soferi , Autovehicule
where Soferi.ID * = Autovehicule.ID

SQL-2 oferă posibilitatea realizării joncţiunii naturale (joncţiune pe baza


atributelor cu acelaşi nume) a două tabele prin utilizarea cuvântului cheie natural în
faţa tipului joncţiunii.

Exemplu
Interogarea „Să se găsească toţi şoferii şi toate maşinile împreună cu
posibilele relaţii între ele” se poate exprima sub forma
select Nume, Prenume, Soferi.ID, NrInreg, Marca, Model
from Soferi natural full join Autovehicule
Observaţii

În mod normal, joncţiunea naturală nu este disponibilă în sistemele


comerciale. Motivele acestei excluderi sunt :

- comportarea unei interogări se poate modifica în mod semnificativ ca rezultat


al unei mici modificări a schemei;

- joncţiunea naturală impune analizarea completă a schemelor tabelelor


implicate, cu scopul de a înţelege condiţia de joncţiune.
Utilizarea variabilelor

Prin folosirea alias-urilor se poate referi un tabel de mai multe ori, într-un mod
similar operatorului de redenumire ρ din algebra relaţională.

Când este introdus un alias, se declară o variabilă tip tabel care are ca valoare
conţinutul tabelului pentru care se introduce alias-ul.

Când un tabel apare doar o singură dată în interogare, nu este nici o diferenţă
între a interpreta alias-ul ca pseudonim sau ca o nouă variabilă.

Când tabelul apare de mai multe ori este esenţial să privim alias-ul ca o nouă
variabilă.
ANGAJATI DEPARTAMENT

Nume Prenume Dept Birou Salariu Dept Adresa Oras


Ionescu Maria Administratie 10 45 Administratie Independentei Iasi
Popescu Ion Productie 20 36 Productie Primaverii Bucuresti
Popa Stefan Administratie 20 40 Distributie Central Focsani
Dumitrescu Vasile Distributie 16 45 Planificare Nicolina Iasi
Ionescu Ion Planificare 14 80 Cercetare Trandafirului Cluj
Manole Radu Planificare 7 73
Luca Doru Administratie 75 40
Vasile Alina Productie 20 46

Exemplu
Interogarea 10: Se consideră baza de date de mai sus. Să se găsească
toţi angajaţii ce au acelaşi nume (dar prenume diferite) cu un angajat care
lucrează în departamentul Producţie.

select a1.Nume, a1.Prenume


from Angajati a1, Angajati a2
where a1.Nume = a2.Nume and
a1.Prenume <> a2.Prenume and
a2.Dept = ’Productie’
Utilizarea alias-urilor de tabel are importanţă din următoarele puncte de
vedere:

• se evită necesitatea scrierii întregului nume al tabelului ori de câte ori este
cerut acest lucru;

• se poate face referire de mai multe ori la acelaşi tabel; introducerea unui
alias are semnificaţia declarării unei variabile de tip tabel, ce are acelaşi
conţinut cu tabelul al cărui alias este;

• se pot specifica cererile imbricate.


Ordonarea
În general, rezultatul unei interogări conţine linii, aranjate într-o ordine
oarecare. Dacă se doreşte impunerea unei ordonări după un anumit criteriu asupra
liniilor returnate de o interogare se va utiliza clauza order by. Sintaxa este:
order by Atribut [asc | desc]
{, Atribut [asc | desc]}

Exemplu

Interogarea 11: Extrageţi conţinutul tabelului AUTOVEHICULE în ordine


descendentă după Marcă şi Model.

select *
from Autovehicule
order by Marca desc, Model desc

NrInreg Marca Model ID


IS02CCC Lancia Delta PZ 111B
SV02BBB BMW Z3 VR 001Y
IS01AAA BMW 323 VR 001Y
IS01EFD BMW 316 MI 222C
5.2.2 Interogări agregate

Operatorii agregaţi constituie una din cele mai importante extensii ale SQL în
comparaţie cu algebra relaţională.
În algebra relaţională toate condiţiile sunt evaluate pentru un singur tuplu la un
moment dat. Adesea apare necesitatea evaluării unor proprietăţi ce depind de o
mulţime de tupluri (de exemplu aflarea numărului de angajaţi ce lucrează în
departamentul Producţie).
Operatorii agregaţi sunt:

• count
Sintaxă: count ( < * | [distinct | all] ListaAtribute>)
• Opţiunea * returnează numărul de linii din rezultat.
• Opţiunea distinct returnează numărul valorilor distincte pentru lista de
atribute din rezultat.
• Opţiunea all returnează numărul liniilor ce conţin valori diferite de NULL
pentru lista de atribute.
Dacă se specifică un atribut fără un distinct sau all se consideră opţiunea
implicită all.
Exemplu
Se consideră baza de date cu relaţiile
ANGAJATI (Nume, Prenume, Dept, Birou, Salariu),
DEPARTAMENT (Dept, Adresa, Oras).
Interogarea 12: Să se găsească numărul angajaţilor din departamentul
Productie.
select count (*)
from Angajati
where Dept = ’Productie’
Interogarea 13: Să se găsească numărul valorilor distincte pentru atributul
Salariu pentru toţi angajaţii din tabela ANGAJAŢI.
select count (distinct Salariu)
from Angajati
Interogarea 14: Să se găsească numărul de linii din tabelul ANGAJATI
care au valori diferite de NULL pentru atributul Salariu.
select count (all Salariu)
from Angajati
• sum, max, min, avg

Sintaxă: <sum | max | min | avg> ([distinct | all] ExprAtribut)

Aceşti operatori se aplică liniilor selectate de clauza where a interogării şi au


următoarele semnificaţii:
- sum returnează suma valorilor deţinute de expresia atribut;
- max şi min returnează valoarea maximă, respectiv minimă;
- avg returnează media valorilor expresiei atribut.

Expresia atribut ExprAtribut poate fi un atribut sau o expresie.


Operatorii sum şi avg acceptă ca argument expresii ce reprezintă valori
numerice sau intervale de timp.
Funcţiile min si max necesită definirea unei ordini în expresia atribut, fiind
aplicabile şi asupra şirurilor de caractere şi momentelor de timp.
Cuvintele cheie distinct şi all au semnificaţiile discutate deja la operatorul
count.
Exemplu

Se consideră baza de date cu relaţiile

ANGAJATI (Nume, Prenume, Dept, Birou, Salariu),


DEPARTAMENT (Dept, Adresa, Oras).

Interogarea 15: Să se găsească salariul maxim, mediu şi minim pentru toţi


angajaţii din tabela ANGAJAŢI.

select max(Salariu), avg(Salariu), min(Salariu)


from Angajati

Interogarea 16: Să se găsească salariul maxim pentru angajaţii care


lucrează într-un departament din Iasi.

select max(Salariu)
from Angajati a, Departament d
where a.Dept = d.Dept and Oras = ’Iasi’
5.2.3 Interogări group by

Funcţiile agregat prezentate operează pe toate liniile returnate de interogare.


În cazul în care se doreşte utilizarea funcţiilor agregat pe o submulţime a liniilor
selectate SQL pune la dispoziţie clauza group by.
Această clauză specifică modul în care va fi împărţit tabelul în submulţimi de
linii.
Clauza acceptă ca argument o mulţime X de atribute, iar interogarea va opera
separat pe fiecare mulţime de linii ce posedă aceleaşi valori pentru X.
Pentru a înţelege mai bine semnificaţia clauzei group by să analizăm următorul
exemplu:

Exemplu

Se consideră tabela ANGAJATI (Nume, Prenume, Dept, Birou, Salariu)


Interogarea 17: Să se găsească suma salariilor angajaţilor din acelaşi
departament.
select Dept, sum(Salariu)
from Angajati
group by Dept
Nume Prenume Dept Birou Salariu
Într-o primă fază interogarea
Ionescu Maria Administratie 10 45
Popescu Ion Productie 20 36
este executată fără a ţine cont
Popa Stefan Administratie 20 40 de clauza group by. De fapt se
Dumitrescu Vasile Distributie 16 45 execută interogarea
Ionescu Ion Planificare 14 80
Manole Radu Planificare 7 73
Luca Doru Administratie 75 40 select Dept, Salariu
Vasile Alina Productie 20 46 from Angajati

Dept Salariu
Administratie 45
Productie 36
Administratie 40
Distributie 45
Planificare 80
Planificare 73
Administratie 40
Productie 46
Fig. 5.13 Proiecţia pe atributele Dept şi Salariu a tabelei ANGAJAŢI
Tabelul rezultat este apoi împărţit în mulţimi ce au aceeaşi valoare
pentru atributele listate în clauza group by.

Dept Salariu
Administratie 45
Administratie 40
Administratie 40
Productie 36
Productie 46
Distributie 45
Planificare 80
Planificare 73
Fig. 5.14 Regrupare în acord cu valorile atributului Dept

Odată stabilite grupurile de linii, funcţia agregat se aplică fiecărui grup


în parte. Rezultatul final al interogării este tabelul din figura 5.15.

Dept Salariu
Administratie 125
Productie 82
Distributie 45
Planificare 153
Fig. 5.15 Rezultatul final al interogării
Restricţie - atributele ce pot apărea în clauza select să fie o submulţime a
atributelor din clauza group by.
Motivul acestei restricţii va fi prezentat prin următorul exemplu.

Exemplu

Se consideră tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu).


Fie interogarea
select Birou
from Angajati
group by Dept
Această interogare este incorectă, deoarece pentru aceeaşi valoare a
atributului Dept, atributul Birou deţine mai multe valori.
După ce liniile au fost grupate după atributul Dept, fiecare grup trebuie
să corespundă unei singure linii în tabelul returnat de interogare.
Interogarea corectă este
select Birou
from Angajati
group by Dept, Birou
Pentru a lua în considerare doar grupurile de linii ce satisfac anumite condiţii
trebuie utilizată clauza having.
Dacă aceste condiţii pot fi verificate la nivel de linie, atunci este suficientă
utilizarea predicatelor corespunzătoare ca argument al clauzei where.
Clauza having conţine condiţii ce trebuie aplicate la terminarea execuţiei
interogării ce utilizează clauza group by. Fiecare submulţime de linii va participa la
formarea rezultatului doar dacă satisface condiţia din clauza having.
Sintaxa permite ca în clauza having să apară expresii booleene, formate din
predicate simple şi operatori booleeni. Predicatele simple pot fi:
• comparaţii între rezultatul evaluării unei funcţii agregat şi o expresie generică
• comparaţii între atribute ce formează clauza group by şi o expresie generică.
Se recomandă ca în clauza having să apară doar predicatele ce implică o
funcţie agregat şi restul predicatelor să fie incluse în contextul clauzei where.
Exemplu

Se consideră tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu)

Interogarea 18: Să se găsească departamentele în care salariul mediu al


angajaţilor din biroul 20 este mai mare ca 25.
select Dept
from Angajati
where Birou = ’20’
group by Dept
having avg(Salariu) > 25

Forma completă a unei instrucţiuni select devine

InterogareSQL ::= select ListaTinta


from ListaTabele
[where Conditie]
[group by ListaAtributeGrupare]
[having ConditieAgregata]
[order by ListaAtributeOrdonare]
5.2.4 Interogări cu operatori din teoria mulţimilor

SQL pune la dispoziţie operatori din teoria mulţimilor, cum ar fi operatorii de


reuniune (union), intersecţie (intersect) şi diferenţă (except sau minus).
Orice interogare ce utilizează operatorii de intersecţie şi diferenţă poate fi
exprimată cu ajutorul interogărilor imbricate.
Sintaxa pentru utilizarea operatorilor din teoria mulţimilor este:
InterogareSQL {<union | intersect | except> [all] InterogareSQL}
Operatorii din teoria mulţimilor presupun eliminarea duplicatelor ca opţiunea
implicită.
Dacă se doreşte utilizarea acestor operatori cu menţinerea duplicatelor este
suficientă specificarea opţiunii all.

Observaţii. SQL nu impune ca schemele pe care se execută operaţiile să fie


identice (spre deosebire de algebra relaţională), ci doar ca atributele
să aibă domenii compatibile.
Corespondenţa între atribute nu se bazează pe nume, ci pe poziţia
atributelor. Dacă atributele au nume diferite, rezultatul va prelua
numele de atribute din primul operand.
Exemple

Se consideră tabelul ANGAJATI (Nume, Prenume, Dept, Birou, Salariu)

a) Să se găsească numele şi prenumele tuturor angajaţilor.

select Prenume as NumeAngajat NumeAngajat


from Angajati Ionescu
union Popescu
Popa
select Nume Dumitrescu
from Angajati Manole
Luca
Vasile
Nume Prenume Dept Birou Salariu Maria
Ionescu Maria Administratie 10 45 Ion
Popescu Ion Productie 20 36 Stefan
Popa Stefan Administratie 20 40 Radu
Dumitrescu Vasile Distributie 16 45 Doru
Ionescu Ion Planificare 14 80 Alina
Manole Radu Planificare 7 73
Luca Doru Administratie 75 40
Vasile Alina Productie 20 46
b) Să se găsească numele de angajaţi care sunt şi prenume

select Prenume as NumeAngajat


from Angajati NumeAngajat
intersect Vasile
select Nume
from Angajati

c) Să se găsească numele de angajaţi care nu sunt şi prenume

select Nume as NumeAngajat NumeAngajat


from Angajati Ionescu
except Popescu
select Prenume Popa
Dumitrescu
from Angajati Manole
Luca
5.2.5 Interogări imbricate

Până acum toate interogările formulate conţineau în clauza where o condiţie


compusă, în care fiecare predicat reprezintă o comparaţie între două valori.
Se pot defini predicate cu structură complexă, în care o expresie valorică
poate fi comparată cu rezultatul execuţiei unei interogări SQL. Interogarea utilizată
în comparaţie se defineşte în interiorul predicatului din clauza where şi se numeşte
interogare imbricată.
În general, primul operand al unei comparaţii de genul celei amintite anterior
este un atribut, în timp ce în celălalt membru avem o mulţime de valori (rezultatul
interogării).
Pentru a rezolva această problemă a eterogenităţii termenilor comparaţiei,
SQL pune la dispoziţie cuvintele cheie any şi all pentru a extinde operatorii de
comparaţie.
any - specifică faptul că linia este validă dacă valoarea atributului se află în
relaţie cu cel puţin o valoare returnată de interogarea imbricată.
all - specifică faptul că linia este validă dacă valoarea atributului se află în
relaţie cu toate valorile returnate de interogare.
Sintaxa cere ca domeniul elementelor returnate de interogarea imbricată să fie
compatibil cu atributul cu care se face comparaţia.
Exemplu
Se consideră tabelele
ANGAJATI (Nume, Prenume, Dept, Birou, Salariu),
DEPARTAMENT (Dept, Adresa, Oras).
Interogarea 19: Să se găsească angajaţii ce lucrează într-un departament
din Iaşi.
select Nume, Prenume
from Angajati
where Dept = any (select Dept from Departament where Oras = ’Iasi’)
Observaţie. Această interogare poate fi rezolvată prin realizarea unei joncţiuni între
cele două tabele.
Interogarea 20: Să se găsească departamentele în care nu lucrează nici
un angajat cu numele Ionescu.

Select Dept select Dept


from Departament from Departament
where Dept <> all (select Dept except
from Angajati select Dept
where Nume = ’Ionescu’) from Angajati
where Nume = ’Ionescu’
Operatorii in şi not in - reprezintă apartenenţa la o mulţime. Aceşti operatori
sunt echivalenţi cu = any, respectiv <> all.
Să mai facem observaţia că funcţiile agregat max şi min pot fi utilizate în
interogările imbricate.

Exemplu
Se consideră tabelele ANGAJATI şi DEPARTAMENT prezentate în figura
5.1.
Interogarea 21: Să se găsească departamentele în care lucrează angajaţii
ce câştigă cel mai mare salariu.

select Dept select Dept


from Angajati from Angajati
where Salariu = any (select max(Salariu) where Salariu >= all (select Salariu
from Angajati) from Angajati)
Observaţii.
• Deşi cele două interogări sunt echivalente, este indicată folosirea
funcţiilor agregat deoarece sunt mai concludente şi se execută mai
eficient.
• În cazul primei interogări nu există nici o diferenţa dacă în loc de
operatorul any se foloseşte operatorul all (deoarece interogarea
internă are ca rezultat o singură linie).
Pentru a înţelege mecanismul rezolvării interogărilor ce conţin interogări
imbricate se pleacă de la presupunerea că interogarea imbricată se execută
înaintea analizei liniilor din interogarea externă.
Rezultatul interogării poate fi salvat într-o variabilă temporară şi predicatul
interogării externe poate fi evaluat cu ajutorul rezultatului temporar.
Uneori interogarea imbricată face referire la contextul interogării în care este
imbricată; acest lucru are loc prin intermediul unei variabile definită în interogarea
externă şi utilizată în cea internă.
Un astfel de mecanism este cunoscut sub numele de transferul legăturilor
dintr-un context în altul. În acest caz, noua interpretare pentru interogările
imbricate este următoarea: pentru fiecare linie din interogarea externă se
evaluează mai întâi interogarea imbricată şi apoi se evaluează predicatul din
interogarea externă.

Vizibilitatea variabilelor SQL


O variabilă poate fi utilizată doar în interiorul interogării în care este definită
sau în interogarea imbricată din interogarea în care este definită.
Dacă o interogare conţine interogări imbricate pe acelaşi nivel, variabilele
declarate în clauza from a unei interogări nu pot fi utilizate în contextul celeilalte
interogări.
Operatorului logic exists
Acest operator acceptă ca parametru o interogare imbricată şi returnează
valoarea adevărat doar dacă interogarea nu produce un rezultat vid.

Exemplu
Se consideră relaţia PERSOANA (Cod, Nume, Prenume, Oras).
Interogarea 22: Să se găsească persoanele care au acelaşi nume şi
prenume, dar coduri diferite.
select *
from Persoana P where exists (select * from Persoana P1
where P1.Nume = P.Nume
and P1.Prenume = P.Prenume
and P1.Cod <> P.Cod )
În acest caz nu se poate executa interogarea imbricată înaintea evaluării
interogării externe, dat fiind că interogarea imbricată nu este definită până când nu
se asignează o valoare variabilei P.
Este necesar în schimb să se evalueze interogarea imbricată pentru fiecare
linie produsă în cadrul interogării externe.
În exemplul prezentat vor fi examinate mai întâi liniile variabilei P una câte una.
Pentru fiecare din aceste linii va fi executată interogarea imbricată. Această
interogare poate fi formulată realizând o joncţiune a tabelei PERSOANA cu ea
însăşi.
O altă cale de a formula interogarea din exemplul anterior este prin folosirea
constructorului de tuplu, reprezentat de o pereche de paranteze rotunde care
marchează lista de atribute.

Exemplu
Se consideră relaţia PERSOANA (Cod, Nume, Prenume, Oras).
Interogarea 23: Să se găsească toate persoanele ce nu au omonime.

select *
from Persoana P
where (Nume, Prenume) not in (select Nume, Prenume
from Persoana P1
where P1.Cod <> P.Cod )

Sistemele comerciale nu rezolvă întotdeauna interogările imbricate prin


scanarea tabelului extern şi producerea unei interogări pentru fiecare linie din
relaţie.
În schimb se încearcă procesarea cât mai multor interogări într-o manieră
orientată pe mulţimi, cu scopul de a manevra cantităţi mari de date prin cât mai
puţine operaţii posibile.
5.3 Modificarea datelor în SQL
Pentru modificarea conţinutului unei baze de date SQL pune la dispoziţie
instrucţiunile insert, delete şi update.
5.3.1 Inserări în baza de date
Sintaxa instrucţiunii insert este:
insert into NumeTabel [(ListaAtribute)] <values (ListaValori) | InterogareSQL>
Prima variantă permite inserarea unei singure linii în tabele. Argumentul
clauzei values reprezintă valorile atributelor pentru linia inserată.
Exemplu
insert into Departament (Dept, Oras) values (’Producţie’, ’Suceava’)
A doua variantă permite adăugarea unei mulţimi de linii, care sunt extrase mai
întâi din baza de date.
Exemplu
insert into DepartamenteIasi (select Dept, Adresa
from Departament
where Oras = ’Iasi’)
Comanda anterioară inserează în tabelul DepartamenteIasi liniile din tabelul
Departament care au Iasi ca valoare a atributului Oras.
insert into NumeTabel [(ListaAtribute)] <values (ListaValori) | InterogareSQL>

Dacă valorile pentru anumite atribute nu sunt specificate în momentul inserării,


se vor asigna valori implicite sau valori NULL în cazul în care nu sunt definite valori
implicite.
Corespondenţa între atributele tabelului şi valorile ce urmează a fi inserate
este dictată de ordinea în care termenii apar în definiţia tabelului.
Astfel primul element din ListaValori (în cazul primei variante) sau primul
element din lista ţintă (în cazul celei de-a doua variante) trebuie să corespundă
primului element ce apare în ListaAtribute (sau în definiţia tabelului dacă
ListaAtribute este omisă) şi aşa mai departe pentru celelalte atribute.
5.3.2 Ştergerea înregistrărilor
Sintaxa instrucţiunii delete este:
delete from NumeTabel [where Conditie]
Dacă nu se specifică clauza where se vor şterge toate înregistrările din tabel.
În cazul în care instrucţiunea delete conţine clauza where se vor şterge doar
acele înregistrări ce satisfac condiţia precizată.
Condiţia poate conţine şi interogări imbricate ce fac referire la conţinutul altor
tabele.
În cazul în care există constrângeri de referinţă cu opţiunea cascade în care
tabelul este referit ştergerea unor linii din tabel poate duce la ştergerea unor linii
aparţinând altor tabele.

Exemplu
delete from Departament where Dept not in (select Dept from Angajati)
Comanda de mai sus şterge departamentele fără angajaţi.
Este de notat diferenţa dintre comanda delete şi comanda drop definită în
secţiunea 5.1.8.

O comandă de genul
delete from Departament
şterge toate liniile din tabelul DEPARTAMENT, şi posibil toate liniile tabelelor care
sunt legate prin constrângeri de referinţă de acesta, dacă opţiunea cascade este
precizată ca eveniment la ştergere; schema bazei de date rămâne neschimbată,
comanda modificând doar instanţa bazei de date.

Comanda
drop table Departament cascade
are acelaşi efect ca şi comanda anterioară, dar în acest caz schema bazei de date
se modifică, tabelul DEPARTAMENT fiind şters, la fel ca şi vederile sau tabelele
care se referă la el în definiţiile lor.

Comanda
drop table Departament restrict
eşuează dacă există linii în tabelul DEPARTAMENT.
5.3.3 Actualizarea înregistrărilor
Sintaxa instrucţiunii update este
update NumeTabel
set Atribut = <Expresie | InterogareSQL | NULL | default>
{, Atribut = <Expresie | InterogareSQL | NULL | default>}
[where Conditie]
Instrucţiunea update face posibilă actualizarea unuia sau a mai multor atribute
din liniile tabelului NumeTabel ce satisfac o posibilă Conditie.
Dacă nu apare clauza where se vor actualiza toate liniile din tabel.
Noua valoare ce va fi asignată unui atribut poate fi:
• rezultatul evaluării unei expresii, definită pe atributele din tabel;
• rezultatul unei interogări SQL;
• valoarea NULL;
• valoarea implicită a domeniului de definiţie.
Exemplu

Comanda

update Angajati set Salariu = Salariu * 1.1


where Dept = ’Administratie’

produce o creştere cu 10% a salariilor angajaţilor din departamentul


Administratie.
Natura SQL, care este orientat pe operaţiile cu mulţimi, trebuie luată în
considerare când se scriu comenzi de actualizare.
Să presupunem că se doreşte modificarea salariilor angajaţilor astfel:
creşterea salariilor sub 30 mii cu 10% şi a salariilor peste 30 mii cu 15%. O
cale de a face actualizarea este execuţia următoarelor comenzi:
update Angajati set Salariu = Salariu * 1.1
where Salariu <= 30
update Angajati set Salariu = Salariu * 1.15
where Salariu > 30
Să presupunem că avem un angajat care câştigă 28 mii, deci satisface
condiţia din prima comanda de actualizare şi atributul Salariu va fi setat la
30.8 mii. În acest moment, linia satisface de asemenea şi condiţia celei de-a
doua actualizări, deci salariul va fi modificat din nou. Creşterea pentru
salariatul respectiv va fi de 26.5%.

Această problemă particulară poate fi rezolvată prin inversarea celor două


operaţii de actualizare.
În situaţiile mai complexe soluţia ar putea să necesite introducerea unor
actualizări intermediare sau utilizarea unui limbaj de programare de înalt nivel care
foloseşte cursori.
5.4 Alte definiţii de date în SQL
Având descrise în acest moment interogările în SQL se poate completa
prezentarea componentelor unei scheme a unei baze de date cu clauza check, a
aserţiilor şi a primitivelor pentru definirea vederilor.

5.4.1 Constrângerea de integritate de tip check


Pentru specificarea altor constrângeri decât cele discutate până acum, SQL-2
a introdus constrângerea check, care are următoarea sintaxă:
check (Condiţie)
Condiţiile ce pot fi utilizate sunt cele ce pot apărea în clauza where a unei
interogări SQL.
Condiţia impusă trebuie verificată întotdeauna pentru a menţine corectitudinea
bazei de date.
În acest fel pot fi specificate toate constrângerile pe tuplu discutate anterior,
deoarece condiţia din constrângerea check poate face referire la alte atribute.
Exemplu. Vom redefini schema tabelului ANGAJATI din secţiunea 5.1.7:

create table Angajati


(NrInreg character(6) check ( NrInreg is not NULL and
1 = (select count(*)
from Angajati a
where NrInreg = a.NrInreg)),
Nume character(20) not NULL check ( Nume is not NULL),
Prenume character(20) check ( Prenume is not NULL and
1 = (select count(*)
from Angajati a
where Prenume = a.Prenume
and Nume = a.Nume)),
Dept character(15) check (Dept in (select NumeDept
from Departament))
)
• constrângerile predefinite permit o reprezentare compactă şi mai uşor de citit;
• prin utilizarea clauzei check se pierde posibilitatea specificării unei reacţii în cazul
încălcării constrângerii;
• când se utilizează constrângeri predefinite, sistemul le recunoaşte imediat şi le poate
verifica mult mai eficient.
5.4.2 Aserţii

Aserţiile reprezintă constrângeri ce nu sunt asociate unei anumite linii sau unui
anumit tabel în particular şi fac parte din schema bazei de date.
Aserţiile permit definirea tuturor constrângerilor prezentate şi, în plus, permit
definirea unor constrângeri care nu pot fi exprimate altfel (de exemplu constrângeri
între mai multe tabele, constrângeri ce impun ca un tabel să aibă o anumită
cardinalitate).
Aserţiile au un nume şi pot fi şterse cu ajutorul comenzii drop.
Sintaxa ce permite definiţia aserţiilor este:
create assertion NumeAsertie check (Conditie)

Exemplu

create assertion CelPutinUnAngajat


check ( 1<= (select count(*)
from Angajati))

Această constrângere impune ca tabelul ANGAJATI sa aibă cel puţin o


înregistrare.
Constrângerile de integritate check sau aserţie pot fi imediate sau întârziate.
• Constrângerile imediate sunt verificate după fiecare modificare a bazei de
date.
• Constrângerile întârziate sunt verificate la sfârşitul unei secvenţe de
modificări a bazei de date, numită tranzacţie.
Încălcarea unei constrângeri imediate de o instrucţiune reface starea bazei de
date din momentul anterior execuţiei instrucţiunii.
Dacă o constrângere întârziată este încălcată se va reface starea bazei de
date din momentul anterior începerii tranzacţiei.

În interiorul unui program se poate seta tipul unei constrângeri la imediată sau
întârziată cu ajutorul comenzilor

set constraints [NumeConstrangere] immediate


sau

set constraints [NumeConstrangere] deferred


5.4.3 Vederi

În capitolul 3 vederile au fost introduse ca fiind tabele „virtuale” al căror


conţinut depinde de conţinutul altor tabele din baza de date.
În SQL vederile sunt definite prin asocierea unui nume şi a unei liste de
atribute cu rezultatul execuţiei unei interogări.
O vedere se defineşte folosind comanda:
create view NumeVedere [(ListaAtribute)] as InterogareSQL
[with [<local | cascaded>] check option]
Interogarea SQL şi schema vederii trebuie să aibă acelaşi număr de atribute.

Exemplu
Să se definească vederea AngajatiAdmin care va conţine toţi angajaţii din
departamentul Administraţie şi care au salariul mai mare ca 10.
create view AngajatiAdmin (NrInreg, Nume, Prenume, Salariu) as
select NrInreg, Nume, Prenume, Salariu
from Angajati
where Dept = ’Administratie’ and Salariu > 10
În cazul anumitor vederi se pot efectua operaţii de actualizare, dar aceste
operaţii trebuie translate în instrucţiuni de modificare a tabelelor ce stau la baza
vederii.
Nu întotdeauna se pot găsi soluţii de modificare a tabelelor de bază, mai ales
în situaţiile în care vederea se defineşte pe baza unei joncţiuni între mai multe
tabele.
În general sistemele comerciale permit modificarea unei vederi doar dacă este
definită pe un singur tabel; alte sisteme cer ca atributele vederii să conţină măcar o
cheie primară a tabelului de bază.
Clauza check option specifică faptul că operaţiile de actualizare se pot face
numai asupra liniilor ce aparţin vederii şi după actualizare liniile continuă să
aparţină vederii.
Când o vedere este definită pe baza altor vederi, opţiunile local sau cascaded
specifică dacă ştergerea liniilor se face la nivel local sau trebuie propagată la toate
vederile de care depinde vederea în cauză.
Opţiunea implicită este cascaded.
Exemplu
Să se definească vederea AngajatiAdmin1, bazată pe vederea
AngajatiAdmin, care va conţine toţi angajaţii din departamentul
Administraţie şi care au salariul între 10 şi 50.

create view AngajatiAdmin1 as


select *
from AngajatiAdmin
where Salariu < 50
with check option
Încercarea de a da valoarea 8 atributului Salariu nu va fi acceptată de
definiţia curentă a vederii, dar ar fi fost validată dacă check option ar fi fost
definită ca local. Încercarea de a modifica valoarea atributului Salariu
pentru o linie din vedere la valoarea 60 nu ar fi validată nici cu opţiunea
local.
Vederile pot fi utilizate în SQL pentru formularea unor interogări care altfel ar fi
imposibil de exprimat.

În general, vederile pot fi considerate ca fiind unelte ce măresc posibilitatea


creării interogărilor imbricate.

Exemplu
Interogarea 24: Să se găsească departamentul cu cel mai mare buget
alocat salariilor.

create view BugetSalarii (Dept, SalariuTotal) as


select Dept, sum(Salariu)
from Angajati
group by Dept
select Dept
from BugetSalarii
where SalariuTotal = (select max(SalariuTotal) from BugetSalarii)
5.5 Controlul accesului la baza de date

Mecanismele de protecţie a datelor reprezintă un aspect important al


aplicaţiilor moderne ce lucrează cu baze de date.
Administratorul bazei de date are posibilitatea de a alege şi de a implementa
politici adecvate de control al accesului la baza de date.
SQL a fost proiectat astfel încât fiecare utilizator poate fi identificat în două
moduri:
• utilizator al sistemului de operare;
• utilizator al bazei de date.

5.5.1 Resurse şi privilegii

Resursele protejate de sistem sunt în general tabelele, dar pot fi protejate şi


alte componente, cum ar fi atributele unor tabele, vederi sau domenii.
Ca regulă generală, utilizatorul care creează o resursă este proprietarul ei şi
este autorizat să efectueze orice operaţie asupra acelei resurse.
Din cauza acestei limitări, SQL pune la dispoziţie mecanisme de organizare ce
permit administratorului să specifice acele resurse la care utilizatorii au acces şi
cele la care nu au acces.
Prin intermediul acestor mecanisme utilizatorii dispun de privilegii de acces la
resursele sistemului.
Fiecare privilegiu de acces este caracterizat de:
• resursa la care face referire;
• utilizatorul ce acordă privilegiul;
• utilizatorul ce primeşte privilegiul;
• operaţia permisă asupra resursei;
• posibilitatea acordării privilegiului altor utilizatori.
În momentul creării unei resurse, sistemul acordă, în mod automat, toate
privilegiile asupra resursei creatorului său.
Există un utilizator predefinit, _system, asociat administratorului bazei de date,
ce deţine toate privilegiile asupra tuturor resurselor.
Tipurile de privilegii disponibile sunt:
1) insert – permite inserarea unui obiect nou în resursă (aplicabil numai
tabelelor şi vederilor);
2) update – permite modificarea valorii unui obiect (poate fi utilizat cu tabele,
vederi şi atribute);
3) delete – permite eliminarea unui obiect din resursă (doar tabele sau vederi);
4) select – permite utilizatorului să citească resursa cu scopul de a o utiliza în
interogări (tabele, vederi sau atribute);
5) references – permite crearea unei referinţe către o resursă în contextul
definirii unui tabel. Poate fi asociat cu tabele sau atribute.
Acordarea acestui privilegiu asupra unei resurse poate conduce la
limitarea posibilităţii de modificare a resursei.
Să considerăm că utilizatorul Paul este proprietarul tabelului
DEPARTAMENT, iar utilizatorul Ştefan deţine privilegiul de
referinţă. Ştefan are posibilitatea să definească o constrângere de
tip foreign key pe tabelul său ANGAJATI, referind resursa indicată
de privilegiu (de exemplu cheia tabelului DEPARTAMENT).
Dacă Ştefan adoptă o politică no action la definirea constrângerii,
Paul va fi pus în situaţia de a nu putea şterge sau modifica linii din
tabelul său dacă aceste operaţii au ca efect încălcarea
constrângerii.
6) usage – se aplică domeniilor şi permite utilizarea lor, spre exemplu, pentru
definirea schemei unui tabel.
Privilegiul de a efectua operaţiile de drop sau alter nu poate fi acordat. Acest
tip de privilegiu este deţinut doar de proprietarul resursei.

Privilegiile se acordă sau se revocă cu ajutorul instrucţiunilor grant şi revoke.


5.5.2 Comenzi pentru acordarea şi revocarea privilegiilor
Sintaxa comenzii de acordare de privilegii este:
grant Privilegii on Resursă to Utilizatori [with grant option]
Această instrucţiune permite acordarea de Privilegii asupra Resursei către
Utilizatori.

Exemplu
grant select on Departament to Stefan

Clauza with grant option indică posibilitatea propagării privilegiului către alţi
utilizatori.
Se pot utiliza cuvintele cheie all privileges pentru acordarea tuturor privilegiilor.

Exemplu
grant all privileges on Departament to Stefan, Paul
Sintaxa comenzii de revocare de privilegii este:
revoke Privilegii on Resursă from Utilizatori [restrict | cascade]
Printre privilegiile ce pot fi revocate unui utilizator se găseşte şi privilegiul grant
option, ce derivă din utilizarea opţiunii with grant option.
Revocarea privilegiilor poate fi făcută doar de utilizator care, într-o primă fază,
a acordat aceste privilegii.
Opţiunea restrict împiedică execuţia instrucţiunii revoke dacă retragerea
privilegiului are ca efect o retragere în lanţ de privilegii. O astfel de comportare
poate apărea în situaţia în care utilizatorul a primit privilegiul cu opţiunea with grant
option şi a propagat privilegiul către alţi utilizatori.
Opţiunea cascade în schimb va avea ca rezultat revocarea tuturor privilegiilor
din lanţ şi în plus va elimina toate obiectele din baza de date ce au fost construite
pe baza acestor privilegii.
Partea a II-a. Proiectarea bazelor de date
Capitolul 6. Tehnici de proiectare şi modele

În capitolele precedente s-au analizat modele de baze de date şi limbaje,


presupunând în cele mai multe cazuri că există o bază de date cu care utilizatorii
pot interacţiona.
În acest capitol se va pune problema proiectării unei baze de date conform
cerinţelor utilizatorilor.
Proiectarea unei baze de date presupune definirea
• structurii
• caracteristicilor
• conţinutului
Utilizarea unor tehnici corespunzătoare este esenţială pentru crearea unui
produs de calitate bună.
6.1. Procesul de proiectare a bazei de date
6.1.1. Ciclul de viaţă al informaţiilor din sistem

Figura 1. Ciclul de viaţă al unui sistem informaţional


Studiul de fezabilitate

• definirea cât mai precisă a costurilor diferitelor soluţii posibile

• stabilirea priorităţilor în crearea componentelor sistemului

Extragerea şi analiza cerinţelor

• definirea şi studiul proprietăţilor şi funcţionalităţii sistemului informaţional

• presupune interacţiunea cu clienţii pentru extragerea cerinţelor

• rezultatul este o descriere completă a datelor care intervin şi a operaţiilor care


acţionează asupra datelor respective

• se stabilesc de asemenea necesităţile hardware şi software ale sistemului


Proiectarea

• proiectarea bazei de date - se stabilesc structura şi organizarea datelor

• proiectarea operaţională - se definesc caracteristicile programelor

Cei doi paşi sunt complementari şi se pot parcurge simultan sau consecutiv.

Descrierea datelor şi a programelor rezultate din această etapă este formală şi


se referă la modele specifice.

Implementarea

• crearea sistemului informaţional în concordanţă cu structura şi caracteristicile


precizate în etapa de proiectare

• se construieşte baza de date şi se scrie codul programelor


Validarea şi testarea

• verificarea funcţionării şi a calităţii sistemului informaţional

• testele trebuie să conţină, pe cât posibil, toate condiţiile de operare posibile

Operarea

• sistemul informaţional funcţionează îndeplinind scopurile pentru care a fost


creat

• această activitate constă doar în managementul şi întreţinerea sistemului


(presupunând ca nu există erori majore şi că nu este schimbată
funcţionalitatea sistemului)
Observaţii

• în practică aceste etape nu sunt în general secvenţiale, deoarece în timpul


uneia dintre activităţile menţionate este necesară revenirea la o etapă
anterioară

• câteodată este necesară introducerea unei noi activităţi – prototipizarea – care


constă în utilizarea unor unelte software specifice pentru crearea rapidă a unei
versiuni simplificate a sistemului informaţional cu ajutorul căreia se testează
funcţionalitatea acestuia

- prototipul poate fi prezentat clienţilor pentru a verifica dacă au fost


extrase şi modelate corect cerinţele acestora
6.1.2. Metodologii pentru proiectarea bazelor de date

O abordare structurată a proiectării bazelor de date constă în parcurgerea


următoarelor etape:
• descompunerea activităţii de proiectare în paşi succesivi, independenţi unul
de altul;
• o serie de strategii care trebuie urmate şi de criterii care permit o alegere în
cazul în care există mai multe soluţii;
• modele de referinţă pentru a descrie intrările şi ieşirile diferitelor faze.

Proprietăţile care trebuie garantate de o anumită metodologie sunt:


• generalitatea – privitoare la aplicaţiile şi sistemele pe care rulează (şi astfel
posibilitatea utilizării independent de o aplicaţie specifică şi de un sistem
disponibil);
• calitatea produsului, care presupune acurateţe şi eficienţă;
• uşurinţa utilizării.
Figura 2. Fazele proiectării bazelor de date
Proiectarea conceptuală

• Scop: reprezentarea cerinţelor informale ale aplicaţiei în termenii descrierii


complete şi formale dar independent de criteriul folosit pentru reprezentare în
sistemul de management al bazei de date.

• Rezultat: schema conceptuală - model de date conceptual - permite descrierea


organizării datelor la un nivel înalt de abstractizare fără a lua în considerare
aspectele de implementare.

• Proiectantul trebuie să reprezinte conţinutul bazei de date fără a lua în


considerare mijloacele prin care informaţiile respective vor fi implementate în
sistem sau eficienţa programelor ce utilizează aceste informaţii.
Proiectarea logică

• Scop: Translarea schemei conceptuale într-un model de date disponibil pentru


sistemul de gestiune al bazei de date

• Rezultat: schema logică - model de date logic - permite reprezentarea datelor


într-o formă independentă încă de detaliile fizice deşi sistemul de gestiune al
bazei de date folosit pentru implementare poate fi unul ce suportă acest model
de date.

• Proiectantul trebuie să ia în considerare criterii de optimizare.

• Se utilizează frecvent tehnici formale pentru verificarea calităţii schemei logice.

• În cazul unui model de date relaţional, tehnica folosită este aceea a


normalizării.
Proiectarea fizică

• Scop: schema logică se completează cu detalii de implementare fizică


(organizarea fişierelor şi indecşi) puse la dispoziţie de SGBD.

• Rezultat: schema fizică - model de date fizic - depinde de sistemul de


management al bazei de date şi ia în considerare criteriile pentru organizarea
fizică a datelor.
Cerinţe ale aplicaţiei care sunt utilizate în cele trei faze ale proiectării BD

• cerinţele de date - conţinutul bazei de date

• cerinţele operaţionale - utilizarea bazei de date de clienţi sau programatori

În proiectarea conceptuală
• cerinţele de date furnizează majoritatea informaţiilor
• cerinţele operaţionale se folosesc doar pentru a verifica dacă schema
conceptuală este completă

În proiectarea logică
• schema conceptuală (furnizată ca intrare), rezumă cerinţele de date
• cerinţele operaţionale se folosesc pentru a obţine schema logică

În proiectarea fizică
• schema logică şi cerinţele operaţionale se folosesc pentru optimizarea
performanţelor sistemului
• trebuie luate în considerare caracteristicile SGBD-ului utilizat
Rezultatul procesului de proiectare a bazei de date constă în:

• schema conceptuală - furnizează o reprezentare de nivel înalt a bazei de


date - folositoare pentru documentare.

• schema logică - furnizează o descriere a conţinutului bazei de date şi, pe


lângă aspectele de implementare, este utilă pentru realizarea interogărilor
şi modificărilor bazei de date.

• schema fizică;
6.2. Modelul Entitate – Relaţie (Entity – Relantionship model)

• model de date conceptual ce pune la dispoziţie o serie de construcţii

o descriu datele necesare unei aplicaţii într-o manieră uşor de înţeles şi


independentă de criteriile de gestiune şi organizare a datelor din sistem

• construcţiile modelului E-R

o definesc scheme ce descriu modul de organizare

o dictează care apariţii de date (valori pe care baza de date le poate stoca la
diferite momente de timp) sunt legale
Exemplu de model E-R
Entitate m,M
Cardinalitatea
unui atribut

Identificatori
Relaţie
interni

Atribut Identificator
simplu extern

Atribut
Generalizare
compus

m1,M1 m2,M2
Cardinalitatea Submulţime
unei relaţii

Figura 3. Construcţii ale modelului entitate-relaţie


Entităţi
• clase de obiecte ce au proprietăţi comune şi existenţă autonomă
• notaţia grafică - figura 4
ORAŞ, DEPARTAMENT, ANGAJAT, VÂNZĂRI sunt exemple de entităţi într-o
aplicaţie pentru o organizaţie comercială
• o apariţie a unei entităţi este un obiect al clasei reprezentate de entitatea
respectivă
oraşele Iaşi şi Bucureşti sunt apariţii ale entităţii ORAS

Figura 4. Exemple de entităţi

• într-o schemă, fiecare entitate are un nume unic.


Relaţii

• reprezintă legături logice între două sau mai multe entităţi


REZIDENŢĂ este un exemplu de relaţie care poate exista între entităţile ORAŞ şi
ANGAJAT
• o apariţie a unei relaţii este un n-tuplu format din apariţii ale entităţilor, câte o
apariţie pentru fiecare entitate implicată
• exemplu - apariţii ale relaţiei EXAMEN între entităţile STUDENT şi CURS:

Figura 5. Exemple de apariţii ale relaţiei EXAMEN


• fiecare relaţie are un nume unic

Figura 6. Exemple de relaţii

• între aceleaşi entităţi pot exista mai multe relaţii


• pentru numele relaţiilor este indicată folosirea substantivelor în locul verbelor,
pentru a evita sugerarea unei „direcţii”
• mulţimea apariţiilor unei relaţii este o relaţie matematică între mulţimile de
apariţii ale entităţilor implicate (este o submulţime a produsului cartezian al
celor două mulţimi de apariţii ale entităţilor implicate)
- este asigurat faptul că nici un n-tuplu nu va apărea de două ori pentru
apariţiile unei relaţii
- acest aspect are consecinţe importante:
• relaţia EXAMEN din figura 6 nu are capacitatea de a raporta faptul că un
student oarecare dă un examen de mai multe ori (deoarece aceasta ar
trebui să producă perechi identice)
• în acest caz, examenul trebuie reprezentat de o entitate legată de
entităţile STUDENT şi CURS prin intermediul a două relaţii binare
• sunt posibile relaţiile recursive care reprezintă relaţii între o entitate şi ea însăşi

Figura 7. Exemple de relaţii recursive

- relaţia recursivă COLEG a entităţii ANGAJAT conectează perechi de


oameni care lucrează împreună
- relaţia SUCCESIUNE a entităţii SUVERAN nu este simetrică ⇒ este
necesar să se asocieze identificatori liniilor din relaţia recursivă
• există relaţii care implică mai mult de două entităţi

Figura 8. Exemplu de relaţie ce implică mai multe entităţi

- o apariţie a relaţiei FURNIZEAZĂ descrie faptul că o anumită firmă


furnizează un anumit produs unui departament
Atribute
• descriu proprietăţile elementare ale entităţilor sau relaţiilor
Ex.: Nume, Salariu, Vârstă sunt atribute pentru entitatea ANGAJAT iar Dată, Notă
sunt atribute pentru relaţia EXAMEN

• un atribut asociază fiecărei apariţii a unei entităţi (sau relaţie) o valoare


aparţinând unei mulţimi denumite domeniul atributului

• domeniul conţine valori admisibile pentru atribut


Ex.: domeniul pentru atributul Nume poate fi orice şir de caractere de lungime 20,
iar domeniul pentru atributul Vârstă poate fi orice număr între 18 şi 60

• domeniile nu sunt reprezentate grafic, ele fiind de obicei descrise în


documentaţia asociată

• atributele pot fi

simple

compuse
Atribut compus - mulţime de atribute ale aceleaşi entităţi sau relaţii ale căror
înţelesuri sau utilizări sunt strâns conectate
Ex.: atributele Strada, NumărCasă, CodPoştal ale entităţii PERSOANĂ pot fi grupate
pentru a forma atributul compus Adresă

Figura 9. Schemă E-R cu relaţii, entităţi şi atribute


Figura 10. Exemplu de entitate cu un atribut compus

Figura 11. Exemplu de schemă Entitate-Relaţie


Cardinalitatea unei relaţii

• este specificată pentru fiecare entitate participantă la relaţie

• descrie numărul minim, respectiv maxim de apariţii ale relaţiei la care poate
participa o apariţie a entităţii

• într-o schemă E-R cardinalităţile minime şi maxime ale participărilor entităţilor


în relaţii sunt specificate în paranteze

Figura 12. Cardinalitatea unei relaţii într-un model E-R


• în principiu este posibil să atribuim orice valoare întreagă mai mare ca 0
cardinalităţii unei relaţii, singura cerinţă fiind ca valoarea minimă a cardinalităţii
să fie mai mică decât cea maximă

• în majoritatea cazurilor este suficientă utilizarea a trei valori: 0, 1 sau N (N este


o valoare întreagă mai mare ca 1):

cardinalitatea minimă 0 – participarea la relaţie este opţională

cardinalitatea minimă 1 – participarea la relaţie este obligatorie

cardinalitatea maximă 1 – fiecare apariţie a entităţii este asociată cel mult


unei singure apariţii a relaţiei

cardinalitatea maximă N – fiecare apariţie a entităţii este asociată unui


număr arbitrar de apariţii ale relaţiei

• în funcţie de cardinalităţile maxime ale entităţilor implicate într-o relaţie,


relaţiile se împart în:
relaţii unu-la-unu
relaţii unu-la-mai-mulţi
relaţii mai mulţi-la-mai mulţi
• relaţii unu-la-unu - definesc o corespondenţă unu la unu între entităţi

• relaţii unu-la-mai-mulţi - cardinalitatea maximă a unei entităţi este 1, iar


cardinalitatea maximă a celeilalte entităţi este N

• relaţii mai mulţi-la-mai mulţi - cardinalităţile maxime sunt N pentru ambele


entităţi
Observaţii

• este rar cazul în care participarea este obligatorie pentru toate entităţile
implicate;
o motiv: când se adaugă o nouă apariţie a entităţii, în general apariţiile
corespunzătoare ale altor entităţi legate de aceasta nu sunt cunoscute încă
sau nu există
Exemplu

Când se primeşte o nouă comandă, nu există încă o factură şi deci nu este


posibilă construirea unei apariţii pentru relaţia ONORARE care conţine noua
comandă.

• în relaţiile n-are, entităţile implicate au aproape întotdeauna cardinalitatea


maximă egală cu N
Cardinalitatea atributelor
• descrie numărul minim, respectiv maxim de valori ale atributelor asociate
fiecărei apariţii a unei entităţi sau relaţii.
• în general, cardinalitatea unui atribut este (1,1) şi este omisă pe schemă.
În acest caz atributul este o funcţie ce asociază o singură valoare fiecărei
apariţii a entităţii (relaţiei).
• valoarea unor atribute poate fi null sau pot exista valori diferite ale
atributului asociate unei apariţii a entităţii
Aceste situaţii pot fi reprezentate prin alocarea cardinalităţii minime egală cu
0 (în primul caz) respectiv cu cardinalitatea egală cu N (în al doilea caz).

Figura 14. Exemplu de atribute cu cardinalitate


• Într-un mod similar participării unei apariţii a unei entităţi într-o relaţie, putem
spune că:

un atribut cu cardinalitatea minimă egală cu zero este opţional pentru


entitatea asociată (sau relaţia asociată)

un atribut este obligatoriu în cazul în care cardinalitatea minimă este unu.

un atribut este multivaloare dacă are cardinalitatea maximă N.

Atributele multivaloare trebuie folosite cu precauţie deoarece ele


reprezintă situaţii care pot fi modelate, câteodată, prin entităţi adiţionale
legate prin relaţii unu-la-unu sau mai mulţi-la-mai mulţi cu entităţile la care
se referă.

Exemplu: Să presupunem că avem atributul multivaloare Calificări pentru


entitatea PERSOANĂ (o persoană poate avea mai multe
calificări).

Calificarea este un concept ce poate fi atribuit mai multor


persoane ⇒ este naturală modelarea acestui concept cu
ajutorul unei entităţi CALIFICARE legată de PERSOANĂ cu o
relaţie mai mulţi-la-mai mulţi.
Identificatori - sunt specifici fiecărei entităţi din schemă şi descriu conceptele
(atributele şi/sau entităţile) schemei ce permit identificarea
unică a apariţiilor acelei entităţi

Identificatorii se clasifică în:

• identificator intern - format din unul sau mai multe atribute ale entităţii - este
cunoscut sub numele de cheie

Figura 15. Exemple de identificatori interni


• identificator extern. Există cazuri când atribute ale unei entităţi nu sunt
suficiente pentru a identifica în mod unic apariţiile entităţii.

- Schema descrie studenţii înscrişi la diverse universităţi, doi studenţi din


universităţi diferite putând avea acelaşi număr de înregistrare ⇒ pentru a putea
identifica un student în mod unic avem nevoie atât de numărul său de
înregistrare, cât şi de universitatea de care acesta aparţine.
- Un identificator corect pentru entitatea student este format din atributul NrÎnreg şi
entitatea UNIVERSITATE - identificator extern.
Se observă că identificarea este posibilă prin relaţia obligatorie unu-la-mai
mulţi dintre entităţile UNIVERSITATE şi STUDENT, care asociază fiecare
student cu o singură universitate.
- O entitate E poate fi identificată prin alte entităţi doar dacă fiecare
astfel de entitate este implicată într-o relaţie în care E participă cu
cardinalitatea (1,1)
Observaţii

• un identificator poate implica unul sau mai multe atribute, cu condiţia ca


fiecare dintre ele să aibă cardinalitate (1,1);

• un identificator extern poate implica una sau mai multe entităţi, cu condiţia
ca fiecare dintre ele să fie într-o relaţie în care entitatea de identificat
participă cu cardinalitatea (1,1);

• un identificator extern poate implica o entitate care este la rândul său


identificată extern, atâta timp cât nu se generează cicluri;

• fiecare entitate trebuie să aibă un identificator (intern sau extern) dar poate
avea mai mult de unul;

- dacă există mai mult de un identificator atunci atributele şi entităţile


implicate într-o identificare pot fi opţionale (cardinalitatea minimă egală
cu zero).
În acest moment schema din figura 11 poate fi reexaminată, introducând
cardinalităţi şi identificatori.

Figura 17. Schema din figura 11 completată cu identificatori şi cardinalităţi


Generalizări
• reprezintă legături logice între o entitate părinte E şi una sau mai multe entităţi
copii, E1, ..., En

• entitatea E este mai generală, în sensul că E1, ..., En sunt cazuri particulare ale
lui E ⇒ E este o generalizare a lui E1, ..., En, iar E1, ..., En sunt particularizări
ale entităţii E.

• Exemplu: PERSOANĂ este o generalizare pentru BĂRBAT şi FEMEIE

Proprietăţi

• fiecare apariţie a unei entităţi copil este apariţie a entităţii părinte

• fiecare proprietate a entităţii părinte (atribut, identificator, relaţie,


generalizare) este de asemenea o proprietate a entităţii copil

Exemplu: dacă entitatea PERSOANĂ are atributele Nume şi Vârstă, atunci


entităţile BĂRBAT şi FEMEIE au de asemenea aceste atribute.
Mai mult, identificatorul pentru PERSOANĂ este de asemenea
un identificator valid pentru entităţile BĂRBAT şi FEMEIE.
Această proprietate se numeşte moştenire.
Figura 18. Exemplu de generalizare

Generalizările pot fi clasificate în modul următor:

• totală - fiecare apariţie a entităţii părinte este de asemenea o apariţie a unei


entităţi copil; în caz contrar generalizarea este parţială.

• exclusivă - fiecare apariţie a entităţii părinte este cel mult o apariţie a unei
entităţi copil; în caz contrar generalizarea este suprapusă.
• Exemple
- Generalizarea PERSOANĂ pentru BĂRBAT şi FEMEIE este totală
(persoanele pot fi numai bărbaţi sau femei) şi exclusivă (o persoană este fie
bărbat fie femeie).
- Generalizarea VEHICUL pentru AUTOMOBIL şi BICICLETĂ este parţială
(există şi alte tipuri de vehicule) şi exclusivă.
- Generalizarea PERSOANĂ pentru STUDENT şi ANGAJAT este parţială şi
suprapusă (există studenţi care sunt şi angajaţi).

• Generalizarea suprapusă poate fi transformată uşor într-o generalizare


exclusivă prin adăugare uneia sau mai multor entităţi copil pentru
reprezentarea entităţilor ce sunt „intersecţia” între entităţile ce se suprapun.
În ultimul exemplu prezentat se poate adăuga entitatea STUDENTANGAJAT
pentru a obţine o generalizare exclusivă.
• În general, o entitate poate fi implicată în mai multe generalizări diferite.
• Există generalizări cu mai multe nivele, cunoscute sub numele de ierarhii.
• De asemenea, o generalizare poate avea un singură entitate copil,
cunoscută sub numele de submulţime.
Figura 19. Exemplu de ierarhie a generalizărilor între entităţi
Observaţii finale asupra modelului E-R

Modelul E-R este realizat pe baza a două construcţii de bază: entitate şi


relaţie.
• o entitate poate participa în mai multe relaţii sau în nici una;
• o relaţie implică două sau mai multe entităţi;
• participarea unei entităţi într-o relaţie are o cardinalitate minimă şi una
maximă.

Modelul E-R mai are construcţiile atribut şi generalizare.


• un atribut are un nume şi o cardinalitate minimă şi una maximă şi aparţine
unui concept de bază (entitate sau relaţie);
• atributele compuse sunt specializări ale atributelor şi sunt formate din unul
sau mai multe atribute;
• o generalizare are o entitate părinte şi una (cazul submulţimilor) sau mai
multe entităţi copil;
• o entitate poate fi părinte sau copil în mai multe generalizări (de asemenea
în nici una);
Este esenţială folosirea de nume diferite în cazul construcţiilor de bază pentru
a evita ambiguităţile. Două atribute pot avea acelaşi nume dacă aparţin unor
construcţii de bază diferite

Există anumite restricţii în folosirea unor construcţii:


• o ierarhie a unei generalizări nu poate conţine cicluri.
• cardinalitatea minimă trebuie să fie mai mică decât cea maximă.

Schemele E-R furnizează o reprezentare abstractă a datelor unei aplicaţii şi


pot fi utilizate nu numai pentru proiectarea bazelor de date:
• se pot folosi pentru documentaţii deoarece pot fi înţelese uşor de către
nespecialişti;
• pot fi utilizate pentru descrierea datelor dintr-un sistem informaţional existent
deja (spre exemplu pentru integrarea cu alte baze de date);
• se pot folosi în cazul modificării cerinţelor clienţilor.
6.3 Documentaţia pentru schemele E-R

• O schemă E-R este adeseori insuficientă pentru a descrie toate aspectele unei
aplicaţii în detaliu.

• În primul rând într-o schemă E-R sunt precizate doar numele


conceptelor, acest fapt fiind insuficient pentru a explica semnificaţia
acestora

Spre exemplu, în figura 17, nu este clar dacă entitatea PROIECT se referă
la un proiect intern al companiei sau la un proiect extern la care compania
respectivă este parte.

• Mai mult, dacă schema este complexă, se poate întâmpla să nu poată fi


reprezentate toate proprietăţile conceptelor care apar într-un mod
inteligibil.

În schema din figura 17 ar fi greu de introdus şi alte atribute pentru


ANGAJAT fără a reduce accesibilitatea schemei.
• Pe de altă parte, este imposibilă reprezentarea unor proprietăţi ale
datelor prin intermediul schemelor E-R.
Exemple:
- un angajat poate fi manager doar în departamentul de care aparţine –
nu se pot corela două relaţii
- un angajat nu poate avea un salariu mai mare decât managerul
departamentului de care aparţine.
Ambele proprietăţi menţionate sunt de tipul constrângere de
integritate.
Modelul E-R nu furnizează mijloace potrivite pentru reprezentarea
constrângerilor complexe impuse datelor.

• Din motivele precizate mai sus, o schemă E-R trebuie însoţită de o


documentaţie care:
- facilitează interpretarea schemei
- permite descrierea proprietăţilor care nu pot fi exprimate direct prin
construcţiile puse la dispoziţie de modelul E-R.
Reguli de operare

Regulile de operare - unelte utilizate de analişti pentru a descrie proprietăţile


unei aplicaţii care nu pot fi exprimate direct cu ajutorul modelului conceptual.

Această abordare permite specificarea regulilor unei aplicaţii.


Exemplu de regulă de operare: un angajat nu poate câştiga mai mult decât
managerul său.

O regulă de operare poate fi o:

• descriere a unui concept relevant al aplicaţiei - o definire precisă a entităţilor,


atributelor sau relaţiilor unui model E-R;

• constrângere de integritate aplicată datelor aplicaţiei;

• derivare - un concept care poate fi obţinut pe baza unei deducţii sau a unui
calcul matematic din alte concepte ale schemei
Exemplu: atributul Cost poate fi obţinut ca sumă a atributelor Net şi Taxe.
Regulile pentru descrierea conceptelor se exprimă în general în limbaj natural.

Regulile ce descriu constrângeri de integritate şi derivări folosesc definiţii


formale.

O notaţie de tipul if <condiţie> then <acţiune> nu este potrivită pentru a


exprima o regulă.

O structură mai potrivită pentru a exprima o regulă de operare sub forma


unei aserţii poate fi:

<concept> trebuie/nu trebuie <expresie a conceptelor>

unde conceptele pot corespunde:

- unui concept a schemei E-R la care se referă

- unui concept derivat.


Exemplu: pentru a exprima constrângerile pentru schema din figura 17, se
utilizează următoarele reguli de operare:

(RO1) managerul departamentului trebuie să aparţină departamentului;

(RO2) un angajat nu trebuie să aibă salariul mai mare decât managerul


departamentului căruia îi aparţine;

(RO3) un departament din filială Iaşi trebuie manageriat de un angajat cu mai mult
de 10 ani vechime în companie

Regulile de operare care descriu derivări pot fi exprimate prin specificarea


operaţiilor (matematice sau de alt fel) care permit obţinerea conceptelor derivate.

O structură posibilă este următoarea:

<concept> este obţinut prin <operaţii asupra conceptelor>

Dacă în exemplul tratat până acum entitatea DEPARTAMENT are un atribut


NumărDeAngajaţi, se poate introduce o regulă de forma:

(RO4) numărul angajaţilor dintr-un departament este obţinut prin numărarea


angajaţilor care aparţin departamentului respectiv;
Tehnici de realizare a documentaţiei

Documentaţia pentru conceptele variate reprezentate într-o schemă pot fi


organizate uşor sub forma unui dicţionar de date.
Acesta este format din două tabele:
• primul tabel descrie entităţile din schemă: numele lor, definiţii informale în
limbaj natural, lista tuturor atributelor (cu o descriere a acestora) şi
identificatorii posibili;
• al doilea tabel descrie relaţiile: numele lor, descriere informală, lista
atributelor (cu descrieri posibile) şi lista entităţilor implicate împreună cu
cardinalităţile de participare la relaţie.
Observaţii:
• Dicţionarul de date poate fi utilizat şi pentru documentarea unor constrângeri
impuse datelor şi altor forme de reguli de operare.
• Se mai poate alcătui un tabel în care se listează regulile organizate după tip.
Unele reguli pot fi exprimate în formele precizate în secţiunea anterioară.
• Este importantă reprezentarea tuturor regulilor care descriu constrângeri ce
nu sunt exprimate în schemă.
- poate fi de asemenea folositoare reprezentarea regulilor deja reprezentate în
schemă.
Entitate Descriere Atribute Identificator
ANGAJAT Angajaţi care lucrează CNP, Nume, CNP
în companie Prenume, Vârstă
PROIECT Proiectele companiei la Nume, Buget, Nume
care lucrează angajaţii DatăLivrare
DEPARTAMENT Departamentele filialei Telefon, Nume Nume, FILIALĂ
companiei
FILIALĂ Filiala companiei într-un Oraş, Adresă Oraş
oraş (Număr, Stradă,
CodPoştal)

Relaţie Descriere Entităţi implicate Atribute


MANAGEMENT Asociază un manager Angajat (0,1)
cu un departament Departament (1,1)
MEMBRU Asociază un angajat cu Angajat (0,1) DatăStart
un departament Departament (1,N)
PARTICIPARE Asociază angajaţii cu Angajat (0,N) DatăStart
proiectele Proiect (1,N)
COMPOZIŢIE Asociază un Departament (1,1)
departament cu o filială Filială (1,N)
Figura 20. Dicţionarul de date pentru schema din figura 17
Constrângeri

(RO1) managerul departamentului trebuie să aparţină departamentului;


(RO2) un angajat nu trebuie să aibă salariul mai mare decât managerul
departamentului căruia îi aparţine;
(RO3) un departament din filială Iaşi trebuie manageriat de un angajat cu mai
mult de 10 ani vechime în companie
(RO4) un angajat care nu aparţine unui departament nu trebuie să participe la
nici un proiect.

Derivări

(RO5) bugetul unui proiect este obţinut prin înmulţirea sumei salariilor angajaţilor
ce lucrează la el cu 3

Figura 21. Reguli de operare pentru schema din figura 17


Probleme propuse.
1. Se consideră schema E-R din figura 22.
a) Corectaţi schema, luând în considerare proprietăţile fundamentale ale
generalizărilor.
b) Schema reprezintă doar femeile care muncesc; modificaţi schema astfel
încât să reprezinte toţi muncitorii, bărbaţi şi femei.
c) Atributul Judeţ poate fi privit ca o sub-proprietate a atributului Ţară;
restructuraţi schema în acest sens.
2. Adăugaţi cardinalităţile minime şi maxime şi identificatorii pentru schema
obţinută după rezolvarea problemei 1; specificaţi dacă există constrângeri de
integritate pe schemă care nu pot fi exprimate prin modelul entitate-relaţie.
3. Reprezentaţi următoarele informaţii printr-o schemă entitate-relaţie:
o companie produce CD-uri cu un cod şi un titlu; pe fiecare CD au fost înregistraţi
unul sau mai mulţi cântăreţi, fiecare având un nume şi o adresă şi câţiva dintre
aceştia şi un nume de scenă.
4. Completaţi schema din problema 3 cu informaţii care vi se par că lipsesc.
5. Creaţi o schemă E-R pentru a reprezenta următoarele concepte, utilizând,
dacă este cazul, construcţii de tip generalizare. Indicaţi atributele entităţilor
implicate şi tipul generalizărilor, rezolvând eventualele suprapuneri.
Angajaţii unei companii se împart în manageri, programatori, analişti, şefi de
proiect şi secretare. Există analişti care sunt de asemenea programatori. Şefii de
proiect trebuie să fie manageri. Fiecare angajat are un cod, nume şi prenume.
Fiecare categorie de angajaţi are un salariu de bază. Fiecare angajat (în afară de
manageri) are fixat un număr de ore de muncă.

Figura 22. Schema E-R pentru problema 1


Capitolul 7. Proiectarea conceptuală

• Scop: reprezentarea cerinţelor informale ale aplicaţiei în termenii descrierii


complete şi formale dar independent de criteriul folosit pentru reprezentare în
sistemul de management al bazei de date.

• Rezultat: schema conceptuală - model de date conceptual - permite descrierea


organizării datelor la un nivel înalt de abstractizare fără a lua în considerare
aspectele de implementare.

• Proiectarea conceptuală a bazelor de date constă în construirea unei scheme


Entitate-Relaţie care furnizează o descriere optimă a cerinţelor clienţilor.

• Construcţia schemei este un proces iterativ, aceasta suferind o serie de


transformări şi corecţii.

• În acest capitol se vor descrie strategii pentru dezvoltarea unei scheme


conceptuale.
7.1 Extragerea şi analiza cerinţelor

Extragerea cerinţelor - identificarea completă a problemelor pe care aplicaţia


trebuie să le rezolve şi a caracteristicilor aplicaţiei.

Cerinţele sunt transformate în specificaţii care în general sunt exprimate în


limbaj natural şi din acest motiv pot fi ambigue şi dezorganizate.

Analiza cerinţelor - clarificarea şi organizarea specificaţiilor cerinţelor.

Cerinţele pot proveni din mai multe surse, cum ar fi:

• Utilizatori ai aplicaţiei - informaţia este obţinută prin interviuri sau prin


intermediul unor documente specifice scrise special pentru acest scop.

• Documentaţie existentă referitoare la problema de rezolvat - reguli interne,


proceduri de operare etc. Sunt necesare colectarea şi selecţia.
Responsabilitatea revine proiectantului.

• Posibile aplicaţii anterioare care trebuie să fie înlocuite sau cu care noua
aplicaţie trebuie să interacţioneze.
Exemplu. Se cere proiectarea unei baze de date pentru o companie de training şi
pentru care s-au colectat specificaţiile prezentate în tabelul următor. Datele au fost
extrase prin interviuri cu angajaţii companiei.

1 Dorim crearea unei baze de date pentru o companie care face cursuri de instruire
2 Pentru aceasta trebuie să stocăm date despre instruiţi şi instructori. Pentru
3 fiecare participant la curs (în jur de 5000), identificaţi prin cod, vrem să stocăm
4 codul numeric personal, numele, vârsta, sexul, locul naşterii, numele
5 angajatorului, adresa şi numărul de telefon, angajatorii anteriori (şi perioada
6 angajării), cursurile urmate (există circa 200 de cursuri) şi aprecierea finală la
7 fiecare curs. Avem nevoie de asemenea să reprezentăm seminariile la care
8 fiecare participant este aşteptat în prezent şi, pentru fiecare zi, locurile şi orele la
9 care clasele sunt ocupate.
10 Fiecare curs are un cod şi un titlu şi fiecare curs poate fi organizat de oricâte ori.
11 Fiecărei organizări a unui curs particular îi spunem „ediţie” a cursului. Pentru
12 fiecare ediţie vom reprezenta data de start, data de sfârşit şi numărul
13 participanţilor. Dacă un instruit este dintr-o profesie liberală trebuie cunoscut
14 domeniul de expertiză şi dacă este necesar titlul său. Pentru oricine care lucrează
15 la companie, vom stoca nivelul şi poziţia deţinută.
16 Pentru fiecare instructor (circa 300) vom preciza numele, vârsta, locul naşterii,
17 ediţia cursului predat, cursurile predate în trecut şi cursurile pe care un titular este
18 calificat să le ţină.
19 Se stochează numerele de telefon ale tuturor instructorilor.
20 Un instructor poate fi angajat permanent al companiei de training sau poate fi
21 angajat temporar.
Este evident că cerinţele au ambiguităţi.
Spre exemplu există:
• participanţi sau instruiţi
• titulari sau instructori
• cursuri sau seminarii

Reguli pentru scrierea specificaţiilor mai precis şi fără ambiguităţi:

• Se alege un nivel potrivit de abstractizare. Se evită termenii prea generali


sau prea specifici.
Exemplu:
perioadă (linia 5) - dată start şi dată sfârşit
titlu (linia 14) - titlu profesional
apreciere (linia 6) - notă

• Se standardizează structura propoziţiei.


Exemplu:
„pentru <concept> păstrăm <proprietăţi>”
• Se evită frazele complexe
Exemplu:
angajat este preferat lui oricine care lucrează pentru o companie

• Se identifică sinonimele şi omonimele


Exemplu:
titular şi instructor
participant curs şi instruit
loc care înseamnă locul de naştere cât şi locul unde se ţin orele
Pentru sinonime se foloseşte un singur termen iar pentru omonime se
caută alţi termeni.

• Se marchează explicit referinţele. Absenţa referinţelor dintre termeni duce la


concepte ambigue.
Exemplu:
la linia 5 adresa şi numărul de telefon se referă la angajat sau
angajator ?
• Se construieşte un vocabular. Pentru fiecare termen, vocabularul conţine:
- o scurtă descriere
- sinonime posibile
- referinţe la alţi termeni conţinuţi de vocabular cu care este în legătură
logică

Termen Descriere Sinonime Legături


Instruit Participant la curs. Poate fi Participant Curs, Companie
angajat sau să aibă o profesie
liberală.
Instructor Titular curs. Poate fi angajat Titular Curs
temporar.
Curs Curs oferit. Poate avea mai Seminar Instructor, Instruit
multe ediţii
Companie Compania unde este angjat Instruit
participantul sau unde a fost
angajat.
Figura 2. Exemplu de vocabular

Se pot rescrie specificaţiile şi se grupează cerinţele ca în figura următoare.


Cerinţe generale
Se doreşte crearea unei baze de date pentru o companie care derulează cursuri de
instruire. Se doreşte păstrarea datelor pentru instruiţi şi instructori.
Cerinţe referitoare la instruiţi
Pentru fiecare instruit (în jur de 5000), identificat de un cod, se va păstra codul numeric
personal, nume, vârstă, sex, oraşul de naştere, angajatorul curent, angajatorul precedent
(cu data de start şi data de sfârşit a perioadei în care a fost angajat), ediţiile cursurilor pe
care instruitul le urmează în prezent şi cele pe care le-a urmat împreună cu nota obţinută.
Cerinţe referitoare la angajatorii instruiţilor
Pentru fiecare angajator a unui instruit se va păstra numele, adresa şi numărul de telefon
Cerinţe referitoare la cursuri
Pentru fiecare curs (în jur de 200) trebuie stocat numele şi codul. Fiecare organizare a unui
curs anume se numeşte ediţie a cursului. Pentru fiecare ediţie se va stoca data de start,
data de sfârşit şi numărul participanţilor. Pentru ediţia curentă se vor păstra datele, sălile de
clasă, şi momentele în care clasa este ocupată.
Cerinţe referitoare la tipuri specifice de instruiţi
Pentru un instruit care practică o profesie liberală (liber profesionist), se va păstra domeniul
de expertiză şi eventual titlul profesional. Pentru un instruit care este angajat, se vor păstra
nivelul şi poziţia ocupată.
Cerinţe referitoare la instructori
Pentru fiecare instructor (în jur de 300), se vor păstra numele, vârsta, oraş de naştere toate
numerele de telefon, ediţiile cursurilor predate în prezent şi în trecut, şi cursurile pe care
calificat să le predea. Instructorii pot fi angajaţi permanenţi ai companiei de training sau pot
fi angajaţi temporar
Figura 3. Exemplu de structurare a cerinţelor
După specificarea datelor trebuie specificate operaţiile care trebuie executate
asupra acestor date.
În cazul nostru operaţiile ar putea fi:
• Operaţia 1: se inserează un nou instruit incluzând datele despre el (se
realizează de aproximativ 40 de ori pe zi)
• Operaţia 2: se atribuie un instruit unei ediţii a unui curs (de 50 de ori pe zi)
• Operaţia 3: se inserează un nou instructor, incluzând toate datele şi cursurile
pe care acesta este calificat să le predea
• Operaţia 4: se atribuie un instructor calificat pentru o ediţie a unui curs (de
15 ori pe zi)
• Operaţia 5: se afişează toate informaţiile despre o ediţie anterioară a
cursului: titlu, orar, număr de instruiţi (de 10 ori pe zi)
• Operaţia 6: afişează toate cursurile disponibile, cu informaţii despre
instructorii calificaţi să le ţină (de 20 de ori pe zi)
• Operaţia 7: pentru fiecare instructor, se găsesc instruiţii pentru toate
cursurile pe care le ţine sau le-a ţinut(de 5 ori pe săptămână)
• Operaţia 8: se realizează o analiză statistică a tuturor instruiţilor cu toate
informaţiile despre ei, despre ediţiile cursurilor pe care le-au urmat şi notele
obţinute (de 10 ori pe lună)
7.2 Strategii de proiectare

Strategia top-down (se sus în jos)

• Schema conceptuală este obţinută printr-o serie de rafinări succesive ale


schemei iniţiale ce descrie toate cerinţele prin intermediul câtorva concepte
abstracte.

• Fiecare nivel reprezentat conţine o schemă ce descrie informaţii diverse la


diferite grade de detaliu.

• Trecerea de la un nivel la altul se face cu ajutorul unor transformări numite


primitive de transformare de sus în jos

operează pe un singur concept al schemei

îl transformă într-o structură de complexitate mai ridicată, capabilă să


descrie conceptul iniţial în detaliu

sunt disponibile 6 primitive de transformare


Figura 4. Strategia top-down
Transformare Concept iniţial Rezultat

T1
De la o entitate la două entităţi
şi relaţia dintre ele

• se aplică atunci când o entitate descrie două concepte logice diferite legate
unele de altele
Exemplu
în aplicaţia descrisă în secţiunea anterioară se poate începe cu
entitatea CURS
acest concept pare prea abstract, putând face deosebirea între:
- TIPCURS (care are un cod şi un titlu)
- EDIŢIECURS (care are o dată de start şi una de sfârşit)
aceste două entităţi pot fi legate prin relaţia TIP
Transformare Concept iniţial Rezultat

T2
De la o entitate la o
generalizare

• este aplicată atunci când o entitate este alcătuită din sub-entităţi

Exemplu

în aplicaţia noastră această transformare are loc atunci când ne dăm


seama că printre cei instruiţi se poate distinge între:
- ANGAJAT
- LIBERPROFESIONIST
Transformare Concept iniţial Rezultat

T3
De la o relaţie la relaţii
multiple

• se aplică atunci când o relaţie descrie două sau mai multe concepte diferite
legând aceleaşi entităţi

Exemplu

în relaţia PREDARE între instructori şi cursuri, PREDARECURENTĂ poate fi


separată de PREDAREANTERIOARĂ
Transformare Concept iniţial Rezultat

T4
De la o relaţie la o entitate
cu relaţii

• se aplică atunci când o relaţie descrie un concept cu existenţă autonomă

Exemplu

dacă relaţia CONTRACT între o entitate CONSULTANT şi o entitate


COMPANIE are multe atribute, atunci ea este mai bine reprezentată printr-o
entitate legată de altele prin intermediul unor relaţii binare
Transformare Concept iniţial Rezultat
T5
Adăugarea atributelor la o
entitate

• se aplică pentru adăugarea unor proprietăţi (atribute) entităţilor.

Exemplu

atunci când rafinăm entitatea INSTRUIT prin adăugarea atributelor:


CNP
Nume
Vârstă
Sex
OraşDeNaştere
Transformare Concept iniţial Rezultat

T6
Adăugarea atributelor la o
relaţie

• se aplică atunci când se adaugă proprietăţi la o relaţie, într-o manieră similară


transformării T5

Avantajul strategiei top - down

proiectantul poate începe cu o reprezentare completă a cerinţelor, chiar dacă


lipsesc unele detalii

Dezavantajul

este necesară o viziune globală asupra tuturor conceptelor, ceea ce este dificil
de realizat în cazul aplicaţiilor complexe
Strategia bottom-up (de jos în sus)

• specificaţiile iniţiale sunt descompuse în componente până când fiecare


componentă descrie un fragment elementar al specificaţiilor

• în acest punct, componentele sunt reprezentate prin scheme conceptuale


simple

• aceste scheme vor fi combinate pentru a se obţine schema finală

• şi în acest caz se utilizează transformări elementare - primitive de transformare


de jos în sus

• aceste primitive introduc în schemă concepte noi care nu au fost prezente


până în acel moment, capabile să descrie aspecte ale aplicaţiei care nu au fost
luate în considerare
Figura 6. Strategia bottom-up
Transformare Concept iniţial Rezultat

T1
Generarea unei entităţi

• se aplică atunci când se identifică în specificaţii o clasă de obiecte cu


proprietăţi comune

Exemplu

în aplicaţia descrisă anterior se poate identifica entitatea CLASĂ (ce


păstrează o anumită clasă la un anumit moment)
Transformare Concept iniţial Rezultat

T2

Generarea unei relaţii

• se aplică atunci când se identifică în specificaţii o legătură logică între două


entităţi

Exemplu

în aplicaţia noastră se poate identifica relaţia CALIFICARE între entităţile


INSTRUCTOR şi CURS
Transformare Concept iniţial Rezultat

T3

Generarea unei
generalizări

• se aplică atunci când se identifică în specificaţii o generalizare între entităţi

Exemplu

entitatea INSTRUCTOR este o generalizare a entităţilor PERMANENT şi


TEMPORAR
Transformare Concept iniţial Rezultat

T4

Agregarea unor atribute


pe o entitate

• se aplică atunci când se identifică în specificaţii o entitate care poate fi privită


ca o agregare a unor serii de atribute

Exemplu

se identifică entitatea INSTRUIT cu proprietăţile


CNP
Nume
Vârstă
Sex
OraşDeNaştere
Transformare Concept iniţial Rezultat
T5

Agregarea unor atribute


pe o relaţie

• se aplică atunci când o relaţie poate fi privită ca o agregare a unor atribute

Avantajul strategiei bottom – up

permite descompunerea problemei în componente simple care pot fi uşor


identificate şi astfel procesul de proiectare poate fi atribuit mai multor
proiectanţi dacă este necesar

Dezavantajul

este necesară integrarea mai multor scheme conceptuale


Strategia inside-out (din interior spre exterior)

• poate fi privită ca o particularizare a strategiei de jos în sus

• se începe cu câteva concepte importante şi apoi pe baza acestora,


proiectarea se extinde radial

• cu alte cuvinte se reprezintă mai întâi conceptele cele mai apropiate de


conceptele iniţiale şi apoi procesul de proiectare se mută spre conceptele
mai depărtate prin intermediul navigării prin specificaţii

• avantajul acestei strategii constă în eliminarea paşilor de integrare din


strategia de jos în sus

• este necesară examinarea, din timp în timp, a tuturor specificaţiilor căutând


concepte ce nu au fost reprezentate încă
Figura 8. Exemplu de strategie inside-out

Ariile indicate prezintă o dezvoltare cronologică posibilă a schemei.


Strategia mixtă

• se poate adopta o strategie mixtă care combină avantajele strategiilor top-


down, bottom-up şi inside-out

• proiectanţii descompun cerinţele în componente conform strategiei bottom-up,


dar nu se dezvoltă componentele separat

• în acelaşi timp se defineşte o schemă cadru care conţine, la nivel abstract,


principalele componente ale aplicaţiei

• schema cadru furnizează o viziune sintetică asupra procesului de proiectare şi


uşurează integrarea schemelor dezvoltate separat
Pentru exemplul prezentat în secţiunile anterioare o schemă cadru posibilă
este prezentată în figura următoare:

Figura 9. Schema cadru pentru procesul de instruire într-o companie

Din acest punct se pot examina separat conceptele principale prin:

• rafinări graduale (urmând paşii strategiei top-down)

sau

• se pot extinde componentele cu concepte care nu au fost încă


reprezentate (conform strategiei bottom-up)
7.3 Calitatea unei scheme conceptuale

Proprietăţile utilizate pentru a stabili calitatea unei scheme sunt:

Corectitudinea schemei
O schemă conceptuală este corectă dacă utilizează corect construcţiile puse la
dispoziţie de modelul conceptual.

Se pot defini două tipuri de erori:

• erorile sintactice marchează utilizarea ilegală a unei construcţii (ex.:


generalizarea dintre relaţii în detrimentul entităţilor)

• erorile semantice marchează utilizarea unei construcţii care nu-şi urmăreşte


definiţia (ex.: utilizarea unei relaţii pentru a descrie faptul că o entitate este o
specializare a altei entităţi)
Caracterul complet al schemei
O schemă conceptuală este completă dacă include concepte ce reprezintă
toate cerinţele de date şi care permit execuţia tuturor operaţiilor incluse în cerinţele
operaţionale.

Accesibilitatea schemei
O schemă conceptuală este accesibilă când reprezintă cerinţele într-un mod
natural şi uşor de înţeles.

Minimalitatea schemei
• schema este minimală când toate specificaţiile datelor sunt reprezentate
doar o singură dată în schemă
• schema nu este minimală când apar redundanţele – concepte derivate din
altele
• o sursă tipică de redundanţe este prezenţa ciclurilor determinate de
prezenţa relaţiilor şi/sau generalizărilor
• câteodată redundanţele sunt necesare din motive de proiectare, aceste
situaţii fiind precizate în documentaţie
7.4 Metodă de abordare a proiectării conceptuale

În practică se aplică foarte rar o singură strategie de proiectare conceptuală.

Independent de strategia aleasă, apare necesitatea modificării schemei


utilizând:

• transformări top-down (prin care se rafinează conceptele deja


prezentate)

• transformări bottom-up (prin care se adaugă concepte noi)

Etapele ce trebuie parcurse pentru realizarea unei scheme conceptuale sunt:

1. Analiza cerinţelor
• Construirea unui vocabular
• Analiza cerinţelor şi eliminarea ambiguităţilor
• Gruparea cerinţelor
2. Etapa de bază

• Identificarea celor mai relevante concepte şi reprezentarea lor într-o


schemă cadru

3. Descompunerea (folosită dacă este potrivită sau necesară)

• Descompunerea cerinţelor cu referire la conceptele prezentate în


schema cadru

4. Etapa iterativă (se repetă pentru toate schemele până când fiecare
specificaţie este reprezentată)

• Rafinarea conceptelor pe baza cerinţelor


• Adăugarea de concepte noi care descriu părţi ale cerinţelor
nereprezentate încă

5. Integrarea

• Integrarea sub-schemelor într-o schemă generală ţinând cont de


schema cadru
6. Analiza calităţii

• Verificarea corectitudinii şi realizarea restructurărilor necesare


• Verificarea caracterului complet al schemei şi realizarea restructurărilor
necesare
• Verificarea minimalităţii, listarea redundanţelor şi dacă este necesar
realizarea restructurărilor necesare
• Verificarea accesibilităţii şi realizarea restructurărilor necesare dacă este
necesar
7.5 Exemplu de proiectare conceptuală
Se consideră exemplul unui proces de instruire din cadrul unei companii
despre care am mai discutat şi în secţiunile anterioare.
Schema cadru

Din acest punct se poate decide analizarea separată a specificaţiilor pentru


instruiţi, cursuri şi instructori şi de a aplica o strategie inside-out pentru fiecare.

Instruiţi
Se pot identifica două tipuri:
• angajaţi
• liber profesionişti
Aceste entităţi se reprezintă ca specializări ale entităţii INSTRUIT;
generalizarea este totală.
Este necesară reprezentarea angajatorilor instruiţilor. Aceasta se poate face
introducând entitatea ANGAJATOR care este legată printr-o relaţie de ANGAJAT.
Este necesară de asemenea distincţia între conceptele angajare actuală şi
anterioară.
Decidem să divizăm relaţia în două relaţii: ANGAJAREANTERIOARĂ şi
ANGAJAREACTUALĂ.
Prima are o dată de start şi una de sfârşit şi este legată de entitatea
INSTRUIT (deoarece şi liber profesioniştii se poate să fi fost angajaţi).
A doua relaţie are doar dată de start şi este legată de entitatea ANGAJAT.
Adăugând atribute entităţilor şi relaţiilor, cardinalităţi pentru relaţii şi
identificatori ai entităţilor se obţine schema din figura 10.
Se observă că entitatea INSTRUIT are doi identificatori (Cod şi CNP). Atributul
TitluProfesional este opţional.
Figura 10. Rafinarea unei porţiuni a schemei cadru
Instructori
Se disting cazurile în care aceştia sunt fie angajaţi permanenţi ai companiei, fie
angajaţi temporar. Se realizează astfel o generalizare totală, cu entitatea părinte
INSTRUCTOR.

Se adaugă atributele precizate în specificaţii: Nume, Vârstă, OraşDeNaştere şi


Telefon.

Se observă cu nu se poate stabili un identificator pe baza acestor atribute ⇒


se decide folosirea CNP-ului instructorului chiar dacă nu este cerut în specificaţii.

Schema rezultată este prezentată în figura 11.


Figura 11. Rafinarea unei alte porţiuni a schemei cadru
În ceea ce priveşte entitatea CURS, există două concepte distincte legate:

• un concept abstract al cursului (cu nume şi cod)

• ediţia cursului (cu dată de start, dată de sfârşit şi numărul de participanţi)

Vom reprezenta aceste concepte cu două entităţi distincte legate prin relaţia
TIP.

Clasele unui curs se pot descrie printr-o entitate legată de ediţiile cursurilor
prin relaţia COMPOZIŢIE.

Se adaugă apoi atribute, cardinalităţi şi identificatori.

O clasă este identificată prin sală, timp şi dată.

Pentru ediţiile unui curs, presupunem că două ediţii ale aceluiaşi curs nu pot
începe în aceeaşi zi şi astfel un identificator pentru entitatea EDIŢIECURS este
format din atributul DatăStart şi entitatea CURS.

Schema rezultată este prezentată în figura 12.


Figura 12. Rafinarea unei alte părţi a schemei cadru

Schema finală este obţinută prin integrarea schemelor obţinute până în acest
punct.

Vom începe cu schemele referitoare la instructori şi cursuri.

În schema cadru aceste părţi sunt legate prin relaţia PREDARE.

Această relaţie trebuie rafinată.


Se identifică trei legături diferite între instructori şi cursuri: predare curentă,
predare anterioară şi calificare.

Aceste legături se reprezintă prin intermediul a trei relaţii:

• primele două leagă entităţile INSTRUCTOR şi EDIŢIECURS

• a treia leagă INSTRUCTOR de CURS

În aceste moment se poate face integrarea.

Ţinând cont de schema cadru, trebuie clarificată relaţia între cursuri şi instruiţi.

Apar două cazuri:

• prezenţă curentă

• prezenţă anterioară

⇒ definim două relaţii între entităţile INSTRUIT şi EDIŢIECURS.

Pentru o prezenţă anterioară interesează nota finală.

Se obţine în final schema din figura 13.


În acest moment se începe verificarea schemei obţinute.

Se verifică dacă schema este completă prin întoarcerea la specificaţii şi


verificarea dacă toate datele sunt reprezentate şi toate operaţiile pot fi efectuate.

Exemplu

Să considerăm operaţia 7, în care se cer instruiţii pentru toate cursurile ţinute


de un instructor.

Datele pentru această operaţie se găsesc pe schemă în felul următor:

• se pleacă de la entitatea INSTRUCTOR

• se trece prin relaţiile PREDARECURENTĂ şi PREDAREANTERIOARĂ,


entitatea EDIŢIECURS, relaţiile PREZENŢĂCURENTĂ şi
PREZENŢĂANTERIOARĂ şi apoi se ajunge la entitatea INSTRUIT
Cu privire la minimalitate, să notăm că există o redundanţă în schemă:

• atributul NrParticipanţi al entităţii EDIŢIECURS se poate obţine prin


numărarea numărului de instanţe ale entităţii INSTRUIT care sunt legate de
ediţia respectivă.

• se va discuta despre eliminarea sau menţinerea acestei redundanţe în


capitolul următor, referitor la proiectarea logică

Trebuie menţionat în final că schema trebuie să aibă o documentaţie potrivită.

• este importantă descrierea restricţiilor posibile care nu sunt exprimate în


schemă, sub forma regulilor de operare

• Exemplu: un instructor predă un curs doar dacă este calificat să o facă


Capitolul 8. Proiectarea logică

Scop - construirea unei scheme logice ce reprezintă corect şi eficient toate


informaţiile descrise într-o schemă entitate-relaţie

Etape:

• Restructurarea schemei E-R – fază independentă de modelul logic ales şi


care se bazează pe criterii de optimizare a schemei şi de simplificare a
următoarei etape;
• Translarea în modelul logic – ţine cont de un anumit model logic (modelul
relaţional spre exemplu) şi poate include alte optimizări, bazate pe
caracteristicile modelului logic.
Figura 1. Proiectarea logică a unei baze de date
8.1 Analiza performanţelor schemei E-R

Indicatori de performanţă:
• costul unei operaţii – evaluat în funcţie de numărul de apariţii ale entităţilor şi
relaţiilor ce sunt parcurse pentru a executa o operaţie asupra unei baze de
date
• cerinţa de stocare – evaluată în funcţie de numărul de octeţi necesari stocării
datelor descrise de schemă
Pentru a evalua aceşti indicatori avem nevoie de următoarele informaţii:
• volumul de date
– numărul de apariţii ale fiecărei entităţi şi relaţii din schemă
– dimensiunea fiecărui atribut
• caracteristicile operaţiilor
– tipul operaţiei (interactivă sau batch)
– frecvenţa operaţiei (numărul mediu de execuţii într-un anumit interval de
timp)
– datele implicate (entităţi şi/sau relaţii)
• operaţia 1: atribuie un angajat unui proiect;
• operaţia 2: găseşte datele pentru un angajat, pentru departamentul în care lucrează
acesta şi pentru proiectele în care este implicat;
• operaţia 3: găseşte datele pentru toţi angajaţii unui anumit departament;
• operaţia 4: pentru fiecare filială, găseşte departamentele, cu numele managerilor şi
lista angajaţilor din fiecare departament.
Tabelul volumelor
Concept Tip Volum
Filială E 10 Tabelul operaţiilor
Departament E 80 Operaţie Tip Frecvenţă
Angajat E 2000 Op 1 I 50/zi
Proiect E 500 Op 2 I 100/zi
Compoziţie R 80 Op 3 I 10/zi
Membru R 1900 Op 4 B 2/săptămână
Management R 80
Participare R 6000

În tabelul volumelor, numărul apariţiilor unei relaţii depinde de doi parametri:


• volumul entităţilor implicate în relaţie
• de câte ori o apariţie a acestor entităţi participă, în medie, într-o apariţie a
relaţiei; acest parametru depinde de cardinalităţile relaţiei

Exemplu:
• numărul de apariţii ale relaţiei COMPOZIŢIE este egal cu numărul departamentelor,
deoarece cardinalitatea relaţiei indică faptul că fiecare departament aparţine doar
unei filiale
• numărul de apariţii ale relaţiei MEMBRU este mai mic decât numărul angajaţilor,
deoarece există angajaţi care nu aparţin nici unui departament
• dacă un angajat este implicat în medie în trei proiecte avem 6000 de apariţii ale
relaţiei PARTICIPARE (şi deci 6000/500=12 angajaţi în medie pentru fiecare proiect)
Schema de navigare - constă în fragmente ale schemei E-R relevante pentru
operaţie; este utilă desenarea „căilor logice” care trebuie urmate pentru a accesa
informaţiile cerute.
• operaţia 2: găseşte datele pentru un angajat, pentru departamentul în care lucrează
acesta şi pentru proiectele în care este implicat;

Estimarea costului operaţiei 2:


• trebuie accesată o apariţie a
entităţii ANGAJAT pentru a
accesa o apariţie a relaţiei
MEMBRU şi, prin intermediul
acesteia, a unei apariţii a
entităţii DEPARTAMENT
• pentru a obţine datele
referitoare la un proiect la
care angajatul lucrează
trebuie să accesăm în medie
trei apariţii ale relaţiei
PARTICIPARE (deoarece am
presupus că un angajat
lucrează în medie la trei
proiecte); apoi, prin această
relaţie accesăm în medie trei
apariţii ale entităţii PROIECT
Aceste informaţii pot fi sumate în tabelul accesărilor. În ultima coloană a
acestui tabel se menţionează tipul accesului (R pentru citire, W pentru scriere)

Tabelul accesărilor
Concept Tip Accesări Tip
Angajat Entitate 1 R
Membru Relaţie 1 R
Departament Entitate 1 R
Participare Relaţie 3 R
Proiect Entitate 3 R
8.2 Restructurarea schemei E-R

decide ştergerea sau păstrarea unor


redundanţe din schema E-R;

înlocuieşte toate generalizările cu alte


construcţii

decide dacă este convenabilă


partiţionarea unui concept în mai multe
sau unirea mai multor concepte separate
în unul singur

alege un identificator pentru acele entităţi


care au mai mult de un identificator
Analiza redundanţelor

Într-o schemă conceptuală o redundanţă corespunde unei informaţii ce poate fi


derivată din alte date.
Cele mai frecvente exemple sunt:
• atribute ale căror valori pot fi derivate, pentru fiecare apariţie a unei
entităţi/relaţii, din valorile altor atribute pentru aceeaşi apariţie
Exemplu

fiecare atribut poate fi dedus din celelalte două prin operaţii aritmetice
• atribute ce pot fi derivate din alte atribute aparţinând altor entităţi/relaţii, de
obicei prin intermediul funcţiilor agregat
Exemplu

atributul ValoareTotala a entităţii ACHIZITIE poate fi calculat din valorile


atributului Pret a entităţii PRODUS prin sumarea preţurilor produselor
achiziţionate, după cum se specifică în relaţia COMPUNERE.
• atribute ce pot fi derivate din operaţii de numărare a apariţiilor
Exemplu

atributul NumarLocuitori poate fi obţinut prin numărarea apariţiilor relaţiei


REZIDENŢĂ în care apare un anumit oraş.
• relaţii ce pot fi derivate din alte relaţii în prezenţa ciclurilor
Exemplu

Relaţia INVATARE dintre studenţi şi profesori poate fi derivată din relaţiile


PREZENŢĂ şi ATRIBUIRE.

Observaţie. Prezenţa ciclurilor nu generează în mod automat redundanţe


Spre exemplu, dacă se înlocuieşte relaţia INVATARE cu relaţia SUPERVIZARE
reprezentând legătura dintre studenţi şi supervizori, atunci schema nu mai este
redundantă.
Prezenţa informaţiilor derivate într-o bază de date prezintă un avantaj şi
totodată dezavantaje.

Avantajul este reducerea numărului de accesări necesare obţinerii informaţiilor


derivate.

Dezavantajele ar fi:

• creşterea cererii de stocare;

• necesitatea efectuării de operaţii suplimentare pentru actualizarea


informaţiilor derivate.

Decizia menţinerii sau eliminării unei redundanţe poate fi luată prin


compararea costului operaţiilor ce implică informaţia redundantă şi capacitatea de
stocare necesară în cazul prezenţei, respectiv absenţei redundanţei.
Exemplu

• operaţia 1: adaugă o persoană nouă cu oraşul de rezidenţă al acesteia;


• operaţia 2: afişează toate datele referitoare la oraş (inclusiv numărul de
locuitori).
Presupunem că încărcarea bazei de date este dată în tabelele de mai jos.

Tabelul volumelor Tabelul operaţiilor


Concept Tip Volum Operaţie Tip Frecvenţă
Oraş E 200 Op 1 I 500/zi
Persoană E 1000000 Op 2 I 2/zi
Rezidenţă R 1000000

Volumul relaţiei REZIDENŢĂ este egal cu volumul entităţii PERSOANA deoarece


cardinalităţile indică faptul că fiecare persoană are rezidenţa într-un singur oraş.
1. cazul prezenţei redundanţei (atributul NumarLocuitori)
Presupunem că pentru stocarea numărului de locuitori dintr-un oraş sunt
necesari 4 octeţi ⇒ datele redundante necesită 4x200=800 octeţi (nesemnificativ).

Costul operaţiilor
Pentru operaţia 1 (adaugă o persoană nouă cu oraşul de rezidenţă al acesteia):
• 1 operaţie de scriere în entitatea PERSOANĂ (adăugare persoană);
• 1 operaţie de scriere în relaţia REZIDENŢĂ (adăugare pereche persoană-
oraş);
• 1 operaţie de citire din entitatea ORAŞ (găsire oraş);
• 1 operaţie de scriere în entitatea ORAŞ ( actualizare număr de locuitori).
Tabelul accesărilor (în prezenţa redundanţelor)
Operaţia 1
Concept Tip Accesări Tip
Persoana E 1 W
Rezidenţă R 1 W
Oraş E 1 R
Oraş E 1 W

Operaţia 1 necesită 3 x 500 = 1500 accesări în scriere / zi


1 x 500 = 500 accesări în citire / zi
Pentru operaţia 2 (afişează toate datele referitoare la oraş):
• 1 operaţie de citire din entitatea ORAŞ

Tabelul accesărilor (în prezenţa redundanţelor)


Operaţia 2
Concept Tip Accesări Tip
Oraş E 1 R

Operaţia 2 necesită 1 x 2 = 2 accesări în citire / zi (neglijabil)


Presupunând că accesul în scriere costă de două ori mai mult decât accesul în
citire, numărul de accesări / zi în prezenţa redundanţelor este 2 x 1500 + 500 =
3500.
2. cazul absenţei redundanţei

Costul operaţiilor

Pentru operaţia 1 (adaugă o persoană nouă cu oraşul de rezidenţă al acesteia):


• 1 operaţie de scriere în PERSOANA;
• 1 operaţie de scriere în REZIDENŢĂ.

Tabelul accesărilor (în absenţa redundanţelor)


Operaţia 1
Concept Tip Accesări Tip
Persoana E 1 W
Rezidenţă R 1 W

Operaţia 1 necesită 2 x 500 = 1000 accesări în scriere / zi


Pentru operaţia 2 (afişează toate datele referitoare la oraş):
• 1 operaţie de citire din ORAŞ (neglijabil)
• în medie 5000 de operaţii de citire din REZIDENŢĂ pentru a determina
numărul de locuitori (5000 = 1000000 persoane / 200 oraşe)

Tabelul accesărilor (în absenţaredundanţelor)


Operaţia 2
Concept Tip Accesări Tip
Oraş E 1 R
Rezidenţă R 5000 R

Operaţia 2 necesită 2 x 5000 = 10000 accesări în citire / zi


Numărul de accesări / zi în absenţa redundanţelor este de 2 x 1000 + 10000 =
12000.

Se observă că în al doilea caz sunt necesare 8500 accesări / zi în plus pentru


a „salva” mai puţin de un kilo-octet.
Putem trage concluzia că este mai convenabil să menţinem redundanţa în
cazul acestei probleme.
Eliminarea generalizărilor

Deoarece modelul relaţional nu permite reprezentarea directă a generalizărilor


din modelul E-R apare necesitatea transformării acestor construcţii în alte
construcţii ce pot fi translatate cu uşurinţă.
Există trei posibilităţi de reprezentare a unei generalizări cu ajutorul entităţilor
şi relaţiilor.
Pentru înţelegerea acestor moduri de transformare să considerăm schema
următoare

Exemplu de schema cu generalizare


1. Înglobarea entităţilor copil în entitatea părinte

• Se elimină E1 şi E2 şi proprietăţile acestora sunt adăugate entităţii E0.


• Se adaugă atributul Atype lui E0 pentru a distinge tipul (E1 sau E2) unei apariţii a lui E0.
• A11 şi A21 pot avea valoarea NULL pentru unele apariţii ale entităţii E0.
• Relaţia R2 va avea cardinalitatea minimă 0 pentru E0 deoarece apariţiile lui E2 formează o
submulţime a apariţiilor entităţii E0.
Se foloseşte când operaţiile implică apariţii şi atribute ale E0, E1 şi E2 într-un
mod asemănător.
• În acest caz, deşi se stochează valori NULL, alegerea asigură mai puţine
accesări în comparaţie cu celelalte variante în care apariţiile şi atributele sunt
distribuite celorlalte entităţi.
2. Înglobarea entităţii părinte în entităţile copil

• Entitatea părinte E0 este eliminată şi, prin proprietatea de moştenire, atributele sale,
identificatorii şi relaţiile în care era implicată sunt adăugate entităţilor copil E1 şi E2.
• Relaţiile R11 şi R12 reprezintă restricţia relaţiei R1 pe apariţiile entităţii E1, respectiv E2.

Este posibilă doar dacă generalizarea este totală, altfel apariţiile lui E0 care nu
sunt apariţii nici ale lui E1 nici ale lui E2 nu vor putea fi reprezentate.
o Această metodă este utilă când există operaţii care se referă doar la apariţiile lui
E1 sau ale lui E2 şi astfel se face distincţia între aceste entităţi.
o Nu mai există în principiu atribute ce pot lua valori NULL.
o Numărul de accesări este mai redus în comparaţie cu a treia metodă, deoarece
nu este necesară accesarea lui E0 pentru a accesa atribute ale E1 şi E2.
3. Substituirea unei generalizări cu relaţii

• Generalizarea este transformată în două relaţii „una la unu”


• Nu există transfer de atribute sau relaţii şi entităţile E1 şi E2 sunt identificate extern prin
entitatea E0.
• În noua schemă apar constrângeri în plus: nici o apariţie a lui E0 nu poate participa în
ambele relaţii RG1 şi RG2.; mai mult, dacă generalizarea este completă, fiecare apariţie a
lui E0 trebuie să participe în exact una din relaţiile RG1 şi RG2.

Este utilă atunci când generalizarea nu este totală şi operaţiile se referă fie la
apariţiile şi atributele lui E1(E2) fie ale lui E0
o Stocarea este mai mică în raport cu prima metodă datorită absenţei valorilor
NULL.
o Creşte numărul accesărilor pentru a păstra consistenţa apariţiilor.
Opţiunile prezentate nu sunt singurele posibile.
O variantă ar fi cea din figura următoare.

Restructurare posibilă a schemei anterioare

În acest caz, pe baza consideraţiilor anterioare, s-a decis înglobarea E0 şi E1


şi lăsarea separată a lui E2. Atributul Atype este adăugat pentru a distinge apariţiile
lui E0 de cele ale E1.
Partiţionarea / combinarea entităţilor şi relaţiilor

Creşterea eficienţei accesului la datele dintr-o bază de date se poate realiza


conform următorului :

Principiu.

Operaţiile de acces sunt reduse


• prin separarea atributelor aceluiaşi concept (entitate sau relaţie) ce
sunt accesate de operaţii diferite
respectiv
• prin combinarea atributelor aparţinând unor concepte diferite ce sunt
accesate de aceleaşi operaţii.
Partiţionarea entităţilor

• una din entităţi descrie informaţii


despre statutul unui angajat
• cealaltă descrie informaţii
personale ale unui angajat.

Este utilă doar dacă operaţiile ce


implică frecvent entitatea originală
necesită, pentru un angajat, ori
numai informaţii personale, ori
numai informaţii legate de
angajare.

partiţionare verticală - un concept


este divizat ţinând cont de
Figura 9. Exemplu de partiţionare a entităţilor atributele sale.

Avantajul partiţionării verticale este generarea unor noi entităţi cu număr


mai mic de atribute decât entitatea originală ⇒ noile entităţi pot fi translate în
structuri fizice din care se poate extrage un volum mare de date printr-un singur
acces.
Partiţionarea orizontală - divizarea se face în raport cu apariţiile entităţii.

Exemplu:

• Pot exista operaţii asociate analiştilor şi operaţii asociate angajaţilor din


departamentul vânzări.

• În acest caz se dovedeşte utilă partiţionarea entităţii ANGAJAT în două entităţi


distincte, ANALIST şi VÂNZARE, având aceleaşi atribute ca entitatea
originală.

Partiţionarea orizontală are ca efect secundar introducerea de duplicate pentru


relaţiile în care participă entitatea originală ⇒ impact negativ asupra
performanţelor bazei de date.
Ştergerea atributelor multi-valoare
Acest tip de restructurare este necesar deoarece modelul relaţional nu permite
reprezentarea directă a atributelor multi-valoare.

• Entitatea AGENTIE este separată în două entităţi: una având acelaşi nume şi
aceleaşi atribute cu entitatea originală, în afară de atributul multi-valoare
(Telefon) şi o entitate TELEFON cu atributul Numar.
• Entităţile sunt legate de o relaţie 1:N.
• Evident, dacă atributul este opţional, atunci cardinalitatea minimă pentru
entitatea TELEFON trebuie să fie 0.
Combinarea entităţilor - operaţia inversă partiţionării

Entităţile PERSOANA şi APARTAMENT aflate în relaţia PROPRIETAR sunt


combinate într-o singură entitate ce deţine atributele ambelor entităţi.
Această restructurare este sugerată de faptul că majoritatea operaţiilor
frecvente asupra entităţii PERSOANA necesită informaţii în legătură cu
apartamentul deţinut de persoana respectivă ⇒ se doreşte evitarea accesărilor
necesare extragerii datelor prin intermediul relaţiei PROPRIETAR.
Dezavantaj: posibilitatea apariţiei valorilor NULL în noua entitate PERSOANA
deoarece cardinalitatea entităţii originale PERSOANA indică faptul că există
persoane ce nu deţin un apartament.

Operaţia de combinare se efectuează în general asupra relaţiilor 1:1 şi mai rar


asupra relaţiilor 1:N sau N:N.

Motiv: apariţia redundanţelor în atributele non-cheie ale entităţii având


cardinalitatea N.

Alte tipuri de partiţionare şi combinare

Operaţiile de partiţionare şi combinare pot fi aplicate şi relaţiilor din


următoarele motive:
• pentru a separa apariţiile unei relaţii ce sunt întotdeauna accesate separat;
• pentru a uni două (sau mai multe) relaţii între aceleaşi entităţi într-o singură
relaţie, atunci când apariţiile lor sunt accesate întotdeauna împreună.
Figura 12. Exemplu de partiţionare a unei relaţii

• se face distincţie între jucătorii prezenţi ai unei echipe de fotbal şi cei din
trecut
Selecţia identificatorilor primari

În cazul în care există entităţi ce deţin mai mulţi identificatori apare necesitatea
stabilirii acelor atribute ce formează identificatorul primar.
Identificatorul primar va avea drept corespondent în modelul relaţional o cheie
primară.
Criteriile de alegere a unui identificator primar sunt:
• Atributele ce pot deţine valori NULL nu pot forma un identificator primar.
• Este indicat ca un identificator primar să conţină un atribut sau cât mai
puţine atribute.
Avantaje:
- indecşi de dimensiune redusă (un index este o structură auxiliară pentru
acces rapid la date);
- spaţiu redus pentru crearea legăturilor logice între relaţii;
- sunt facilitate operaţiile de joncţiune.
• Un identificator intern este de preferat unuia extern care poate implica mai
multe entităţi
- Motiv: identificatorii externi sunt translaţi în chei ce conţin identificatorii
tuturor entităţilor implicate în identificatorul extern.
• Este de preferat un identificator ce este utilizat de majoritatea operaţiilor
pentru a accesa apariţiile entităţii.
- operaţiile vor fi executate eficient, fiind avantajate de indecşii construiţi
automat de sistemul de gestiune a bazei de date.

Dacă în această etapă nu există nici un identificator care să satisfacă criteriile


anterioare, se va introduce un atribut suplimentar în entitate, atribut ce va fi utilizat
exclusiv pentru identificarea apariţiilor entităţii.
8.3 Translarea în modelul relaţional
Translarea în modelul relaţional este a doua etapă a proiectării logice.
Plecând de la o schemă E-R se construieşte schema relaţională echivalentă
(echivalentă din punct de vedere al capacităţii de a reprezenta informaţii
echivalente).
Translarea va pleca de la o schemă E-R simplificată, ce nu conţine
generalizări sau atribute multi-valoare şi are numai identificatori primari.

Entităţi şi relaţii N:N


Translarea în modelul relaţional se face urmând paşii:
• Fiecare entitate va fi translată într-o relaţie M-R (a modelului relaţional) cu
acelaşi nume şi având aceleaşi atribute ca şi entitatea;
o cheia fiecărei relaţii este dată de identificatorul entităţii corespunzătoare.
• Fiecare relaţie E-R dintre entităţi va avea drept corespondent o relaţie M-R
cu acelaşi nume şi cu atribute atributele relaţiei E-R şi identificatorii entităţilor
implicate;
o cheia relaţiei M-R va conţine identificatorii entităţilor.
• Dacă entităţile sau relaţiile E-R au atribute opţionale, atributele
corespunzătoare din modelul relaţional pot avea valoarea NULL.
Figura 13. Schemă E-R cu o relaţie N:N

ANGAJAT(Numar, Nume, Salariu)


PROIECT( Cod, Nume, Buget)
PARTICIPARE(Numar, Cod, DataStart)
În cazul în care se doreşte mărirea clarităţii schemei obţinute se pot opera
redenumiri de atribute:
PARTICIPARE(Angajat, Proiect, DataStart)
Domeniul atributului Angajat este o mulţime de numere de înregistrare
pentru angajaţi, iar domeniul pentru atributul Proiect este o mulţime de coduri de
proiecte.
Trebuie impuse constrângeri de referinţă între aceste atribute şi relaţiile
ANGAJAT, respectiv PROIECT.
Operaţia de redenumire este esenţială în cazul relaţiilor recursive.

Prin translare se obţine:


PRODUS(Cod, Nume, Pret)
COMPUNERE(Componenta, Subcomponenta, Cantitate)
Atributele Componenta şi Subcomponenta au ca domeniu mulţimea de coduri
ale produselor.
Trebuie impuse constrângeri de referinţă între Componenta şi PRODUS şi
Subcomponentă şi PRODUS.
Translarea relaţiilor E-R ce implică mai mult de două entităţi

FURNIZOR(IDFurnizor, NumeFurnizor)
PRODUS(Cod, Tip)
DEPARTAMENT(Nume, Telefon)
LIVRARE(Furnizor, Produs,
Departament, Cantitate)

• Se verifică dacă identificatorii entităţilor, luaţi împreună, nu formează o cheie sau


o super-cheie redundantă pentru relaţia M-R care reprezintă relaţia E-R.
Aceasta se poate întâmpla, spre exemplu, dacă există un singur furnizor care livrează un
produs dat unui departament dat.
• Rămâne validă cardinalitatea deoarece acest furnizor poate livra mai multe
produse acestui departament sau altor departamente.
În acest caz, cheia relaţiei M-R LIVRARE trebuie să fie formată doar din atributele Produs şi
Departament, deoarece, fiind dat un produs şi un departament, furnizorul este determinat în
mod unic.
Relaţii 1:N

JUCATOR(Nume, DataNastere, Pozitie)


ECHIPA(Nume, Oras, CuloriEchipa)
CONTRACT(NumeJucator,
DataNastereJucator, Echipa, Salariu)

Cheia relaţiei CONTRACT este formată numai din identificatorul entităţii JUCATOR
deoarece cardinalităţile indică faptul că fiecare jucător are contract la o singură echipă.
Observaţii
• Relaţiile JUCATOR şi CONTRACT au aceeaşi cheie ⇒ există posibilitatea combinării
celor două relaţii în una singură, fără să existe pericolul introducerii de redundanţe.
• Combinarea este posibilă datorită corespondenţei 1:1 între instanţele celor două relaţii:
JUCATOR(Nume, DataNastere, Pozitie, Echipa, Salariu)
ECHIPA(Nume, Oras, CuloriEchipa)
Trebuie impusă o constrângere de referinţă între atributul Echipa şi relaţia ECHIPA.
• Presupunem că entitatea JUCATOR participă opţional la relaţia CONTRACT ⇒ ambele
translări prezentate anterior sunt valide. Ce-a de-a doua prezintă dezavantajul că pot
exista valori NULL în relaţia JUCATOR pentru atributele Echipa şi Salariu.
Regulă: entitatea ce participă la o relaţie E-R cu cardinalitatea maximă 1 este translată
într-o relaţie M-R ce include identificatorii celorlalte entităţi implicate în relaţia E-R şi
posibilele atribute ale relaţiei E-R ⇒ nu mai este nevoie de o relaţie M-R separată pentru
relaţia din schema E-R.
Presupunem că entitatea PRODUS participă în relaţia LIVRARE cu
cardinalităţile minimă şi maximă 1 ⇒ pentru fiecare produs există un singur
furnizor care livrează produsul respectiv şi un singur departament deservit.
Schema este translatată sub forma:
FURNIZOR(IDFurnizor, NumeFurnizor)
DEPARTAMENT(Nume, Telefon)
PRODUS(Cod, Tip, Furnizor, Departament, Cantitate)
Se impun constrângeri de referinţă între atributul Furnizor al relaţie
PRODUS şi relaţia FURNIZOR şi între atributul Departament al relaţiei PRODUS
şi relaţia DEPARTAMENT.
Entităţi cu identificatori externi

Schema relaţională este:


STUDENT(NrInregistrare, Universitate, Nume, AnInregistrare)
UNIVERSITATE(Nume, Oras, Adresa)
Există o constrângere de referinţă între atributul Universitate şi relaţia
UNIVERSITATE.
Este de notat faptul că, prin reprezentarea identificatorului extern, a fost
reprezentată şi relaţia dintre entităţi.
Acest tip de translare este valid indiferent de cardinalitatea cu care participă
celelalte entităţi la relaţie.
Relaţii 1:1
Pentru relaţiile 1:1 există mai multe posibilităţi de translare.
Să considerăm relaţia din figura următoare, cu participare obligatorie din
partea celor două entităţi implicate.

Există două posibilităţi valide de translare:


SEF(Numar, Nume, Salariu, Departament, DataStart)
DEPARTAMENT(Nume, Telefon, Filiala)
cu constrângere de referinţă între atributul Departament al relaţiei SEF şi relaţia
DEPARTAMENT, sau
SEF(Numar, Nume, Salariu)
DEPARTAMENT(Nume, Telefon, Filiala, Sef, DataStart)
cu constrângere de referinţă între atributul Sef al relaţiei DEPARTAMENT şi
relaţia SEF.
Pe lângă aceste două soluţii, există posibilitatea obţinerii unei singure relaţii,
incluzând toate atributele din schema E-R.
Această soluţie va fi eliminată.
Motiv: dacă după faza de restructurare (care precede faza de translare) schema E-
R conţine două entităţi legate printr-o relaţie 1.1, este de dorit ca în faza de
translare cele două concepte să rămână separate.

Să considerăm cazul unei relaţii 1:1 cu participarea opţională a uneia dintre


entităţi, ca în schema următoare:

Soluţia este:
ANGAJAT(Numar, Nume, Salariu)
DEPARTAMENT(Nume, Telefon, Filiala, Sef, DataStart)
cu constrângere de referinţă între atributul Sef al relaţiei DEPARTAMENT şi
relaţia ANGAJAT.
Această opţiune este preferabilă uneia în care relaţia E-R este reprezentată în
relaţia M-R ANGAJAT prin numele departamentului manageriat, deoarece, pentru
acest atribut, ar putea exista valori NULL.
Să considerăm cazul în care ambele entităţi au participări opţionale.
Să presupunem că în schema din figura anterioară pot exista departamente
fără şef (cardinalitatea minimă a entităţii DEPARTAMENT este 0).
În acest caz se obţine prin translare:
ANGAJAT(Numar, Nume, Salariu)
DEPARTAMENT(Nume, Telefon, Filiala)
MANAGEMENT(Sef, Departament, DataStart)
Se observă că se poate lua drept cheie a relaţiei MANAGEMENT atributul
Departament.
Se impun constrângeri de referinţă între atributele Sef şi Departament ale
relaţiei MANAGEMENT şi relaţiile ANGAJAT şi DEPARTAMENT.
Avantaj - atributele ce implementează relaţia din schema E-R nu pot avea
valori NULL.
Dezavantaj - relaţia nouă introdusă.
Această soluţie este recomandată în cazul în care numărul de apariţii ale
relaţiei este mic în comparaţie cu numărul de apariţii ale entităţilor implicate în
relaţie.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Mit… si realitate
• Oricine poate face programare Web
– Reteta: programator (la nivelul documentelor HTML?)
cu ceva cunostinte de ASP.NET si SQL
– Programarea Web = (mult) mai mult de atat
• Aplicatii desktop vs. Aplicatii web?
• Aplicatii
p precum Photoshop,
p p Word, Excel… in JavaScript?
p … Deja j
se intampla.
• Business-ul are nevoie de Web. Piata de Web a intrecut de mult
piata aplicatiilor (inca) Desktop.
Desktop
• Browserele devin mai puternice, limbajele, tehnologiile, platformele
mai evoluate.
• Programarea Web = mediu challenging
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

• Limbaje de dezvoltare web client


client-side
side
(JavaScript, AJAX, DOM…)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Capitole principale
• Arhitectura unei aplicatii
p Web.
• Servere HTTP: caracteristici, exemple. Limbajul HTML: elemente de
baza tabele
baza, tabele, cadre,
cadre formulare.
formulare Scripturi scrise in limbaje compilate
compilate.

• Folosirea limbajului SQL pentru programarea web.


ODBC.

• Limbaje de scripting server


server-side,
side PHP

• Programare web client-side, jscript


Capitole principale
• Continut si design in programarea web, CSS, DHTML

• Elemente de multimedia pentru programarea web

• Administrarea continutului site-urilor Web: optimizarea


paginilor
p g web p
pentru indexarea de catre motoarele de
cautare, solutii profesionale

• Elemente de securitate si optimizare

• Framework
Framework-uri
uri Web
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Arhitectura unei aplicatii Web


Evolutie
• Arhitectura unei aplicatii
p informatice folosita
intr-o organizatie a trecut prin mai multe
etape:
1.Etapa
p Mainframe
2.Etapa Client-Server
3.Etapa Web Based (aplicatii web sau web-
enabled)
Etapa client
client--server
• In prima perioada a etapei client-server aplicatiile
erau mai ales departamentale:
• In cadrul organizatiei fiecare departament
(productie, financiar, resurse umane, relatii cu
clientii etc
clientii, etc.)) avea propria sa aplicatie accesata in
reteaua locala a departamentului.

vanzari
financiar
Business

managementt marketing
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CERN si Web Wide Web


• 1989: Tim Berners-Lee publica “Information Management: A
proposal” pentru a ajuta viitorul proiect Large Hadron Collider
proposal Collider.
• 1991: Primele sisteme www introduse fizicienilor prin intermediul
bibliotecii de program de la CERN. Primul server web – localizat in
laboratoarele de fizica Europeana.
• 1993: Primul browser Mosaic; web-ul atinge 500 de servere si 1% din
totalul traficului de Internet
Internet.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Etapa web
web--based
• Deosebirea principala in acest caz este
accesarea aplicatiei
– Printr-un client standard (browserul)
– De foarte multe ori din afara locatiei unde se afla
aplicatia
li ti
– Comunicatia se face nu prin canale private / dedicate
ci prin Internet

• O arhitectura tipica este in figura urmatoare:


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Conversația
Conversația cu un server Web
• Conexiune TCP la server pe portul 80 (implicit)
• Browser-ul
B l ttrimite
i it peste
t TCP ceva de
d genul: l

GET /index.html
/index html HTTP/1
HTTP/1.0
0
User-Agent: Mozilla/4.73 [en] (X11; U;
Linux 2.0.35 i686)
Host: www.yahoo.com
Accept: image/gif, image/x-xbitmap,
image/jpeg, image/pjpeg, image/png,
*/*
Accept-Encoding: gzip
Accept Lang age en
Accept-Language:
Accept-Charset: iso-8859-1,*,utf-8
Cookie: B=2vsconq5p0h2n
q p
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Conversația
Conversația cu un server Web
• Serverul răspunde cu:
HTTP/1.0 200 OK
Content-Length: 16018
Content-Type: text/html
<html><head><title>Yahoo!</title><base
href=http://www.yahoo.com/>
…etc.
• Dacă
D ă maii avem șii iimagini
i i embedded
b dd d iimages:
<img width=230 height=33
src="http://us
src= http://us.a1.yimg.com/us.yimg.com
a1 yimg com/us yimg com
/a/an/anchor/icons2.gif">
…și apoi repetă tot acest proces cu noul URL.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Evolutia
Web--ului
Web
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Probleme de rezolvat
• In care locatii trebuie sa existe server (=
(
bani necesari dotarii cu asa ceva) si in care
nu.
nu
• Se analizeaza:
– Numarul de utilizatori dintr-o anumita locatie
– Latimea de banda disponibila intre locatia
respectiva
espec a ssi locatia
oca a pprincipala
c pa a
– Timpul de raspuns necesar de asigurat
utilizatorilor
tili t il
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Probleme de rezolvat
• Rezolvarea problemelor de securizare a
transmisiei de date:
– datele circuland in afara retelei organizatiei trebuie de
exemplu criptate corespunzator.

• Problemele
P bl l legate
l t de
d browser:
b
– aplicatia
p trebuie sa p
poata fi accesata in acelasi mod si
fara pierderi de functionalitate prin oricare din tipurile
principale de browser existente.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Probleme de rezolvat
• Probleme legate de conectivitate:
– din toate locatiile de unde aplicatia e necesar sa fie
accesibila timpul de raspuns trebuie sa fie in parametrii
ceruti.

• De asemenea trebuie apreciat traficul generat de


o aplicatie in contextul in care aceasta ruleaza in
paralel cu alte aplicatii.
aplicatii
– Performantele pot fi afectate in cazul in care traficul
cumulat depaseste anumite praguri.

Programare Web– Curs 1 36


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTTP
• Comenzi text peste TCP/IP
• La bază un protocol cerere-răspuns, cu inițiere din partea
cilentului
• Stateless: fiecare cerere tratată complet independent
– Nu există metode implicite
p de creare de asocieri între cereri
distincte
– Nu se furnizează stări persistente
• În plus, încă din primele zile ale HTTP-ului: cookies
– Header suplimentar
p adăugat
g de server unui răspuns
p HTTP
– Cookies sunt opace pentru client
– Clientul
C e u a ar trebui
ebu să trimită
ă înapoi
apo uun coo
cookie
e în cad
cadrul
u unei
u e cereri
ce e
succesive către același server
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Script CGI
• Scripturile CGI sunt o modalitate de a furniza
pagini dinamice HTML sau de alt tip (imagini,
video, sunet, postscript, etc).
• Acestea nu sunt efectiv stocate ca atare pe
serverul web ci sunt generate pe baza datelor
obtinute de la utilizator (în general conform
datelor completate de catre acesta întrîntr-un
un
formular).
• Di
Din aceasta
t cauza elel nu pott fi servite
it di
directt de
d
serverul web ci trebuiesc create de catre un
program care se numeste t script
i t CGI.
CGI
Programare Web– Curs 1 39
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Script CGI
• Numele de script CGI provine din denumirea
specificatiei interfetei între serverul de web si
astfel de programe, numita Common Gateway
Interface - prescurtat CGI.
• Teoretic orice program executabil care respecta
anumite conventii în ceea ce priveste mediul din
care îsi colecteaza datele initiale si modul în care
scrie rezultatul poate fi un script CGI.

Programare Web– Curs 1 40


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Cel mai simplu exemplu de script este un
program care pentru orice date de intrare
afiseaza un mesaj standard. Iata un exemplu
scris în limbajul C:

#include <stdio.h>
int main()
{
printf("Content-Type: text/html\n\n");
printf("<html>\n");
printf("<body>\n");
printf("Sunt un script CGI\n");
printf("</body>\n);
printf("</html>\n");
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Rezultatul rularii acestui script este urmatorul:

Content Type: text/html


Content-Type:
[Linie goala]
<ht l>
<html>
<body>
Sunt un script CGI
</body>
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Script CGI in pagina web


• Un script CGI este un fisier executabil.
– Poate proveni dintr-un program compilat (C sau alt limbaj) sau

– Poate fi un fisier executabil scris în shell sau alt limbaj interpretat


(cum este Perl).

• Exista si posibilitatea de a include scripturile direct în


fisierele HTML.
– O pagina web va contine atât directive HTML care sunt
interpretate obisnuit de browser cât si programe scrise în anumite
limbaje care vor fi înlocuite cu rezultatul executiei lor.

• Exista doua abordari în acest caz:

Programare Web– Curs 1 43


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Client side
• Abordarea client-side: paginile continând scripturi
sunt trimise de serverul web fara nici o modificare
catre browser, urmând ca executia lor sa aiba loc
acolo.
• Este cazul limbajului Java (applet
(applet-uri,
uri aplicatii
JavaWS, JavaFX) pe care browserele uzuale îl
contin nativ
nativ.
• Op parte a p
procesarilor se transfera de la server
=> micsorarea volumului de activitate pentru
primul.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Server side
• Abordarea server-side: serverul înlocuieste
în pagina ceruta programul cu rezultatul
acestuia.
acestuia
• Pentru aceasta serverul trebuie sa aiba
suport pentru limbajul respectiv.
• Cursul prezinta limbajul de scripting server
side PHP

Programare Web– Curs 1 45


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CGI – date de intrare


• Fiecare formular are asociat o metoda prin care datele
completate
l t t de
d utilizator
tili t suntt transmise
t i ded serverull d
de
web catre scriptul CGI.
• Aceste informatii ssunt
nt împachetate ssub
b forma unui
n i sir de
perechi de forma:

simbol1=valoare1&simbol2=valoare2&…&simbolk=valoarek

unde numele simbolilor este dat de numele câmpurilor


formularului iar valorile sunt cele furnizate de utilizator
prin completare.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CGI – date de intrare


• Metodele care pot fi folosite sunt în numar de doua:
1. Metoda GET
– d
datele
t l suntt stocate
t t într-o
î t variabila
i bil dde mediu
di
(environment) cu nume predefinit (QUERY_STRING)
2. Metoda POST
– datele sunt plasate în fisierul standard de intrare al
scriptului (stdin în cazul scripturilor scrise în limbajul C)
– lungimea sirului care contine datele este stocata într
într-o
o
variabila cu nume predefinit (CONTENT_LENGTH)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CGI – date de intrare


• Pe lânga aceste informatii serverul seteaza o
serie de alte variabile de mediu continând o
multitudine de alte informatii.
• În cazul scrierii de scripturi în limbajul C acestea
se pot obtine folosind functia getenv() iar în cazul
scripturilor care utilizeaza modulul PHP acestea
sunt direct disponibile
disponibile.

Programare Web– Curs 1 48


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Stocarea pe partea de server


• Cum se opt menține persistente datele pentru mai multe
cererii HTTP provenite
it di
din partea
t unuii același
l i utilizator?
tili t ?
– Datele pot fi incluse (embedded) în URL, cookie, sau
variabile/câmpuri ascunse în formulare
– Mai bine: Stocăm datele pe server și includem în cereri doar
handlere (adevărul e cunoscut doar de server, programul devine
d f
defensiv)
i )
• De ce e mai bine să stocăm datele pe server?
– Clienții nu sunt de încredere
încredere, dimensiunea datelor
datelor….
– Handlerul poate fi semnat criptografic, poate avea un termen de
expirare, etc. (un client nu poate falsifica datele)

25.02.2010 Programare Web– Curs 1 49


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Programare Web

Limbajul
j HTML: elemente de baza baza,,
formulare,, tabele,
formulare tabele, cadre

Programare Web – Curs 2 1


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Limbajul HTML
• Serverul Web livrează la cerere fișiere HTML.
• Fişiere text conţinând şi directive care sunt
folosite de browser pentru afişarea pe ecran a
textelor, imaginilor, tabelelor, formularelor,
ferestrelor şi a celorlalte elemente pe care cel
care a compus fişierul le-a utilizat.
• Aceste directive le putem vedea doar dacă
vizualizam sursa documentului şi de regulă
g nu
apar pe ecran.

Programare Web– Curs 2 2


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Generalități
• În HTML p pentru a diferenția
ț directivele de
restul elementelor acestea se pun între
paranteze ascuțite:
<directiva>
• O mare parte a lor au efect asupra unei
întregi
g pporțiuni
ț de fișier,
ș încadrată de
început-sfârșit:
<directiva>
….
</directiva>
/di i
Programare Web– Curs 2 3
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Format general
<html>
<head>
Directive continând informaţii generale
despre pagina
</head>
/h d
<body>
Conţinutul paginii incluzând texte şi
directive
</body>
</html>
/ht l Programare Web– Curs 2

4
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Hello World
<html>
<head>
<title>Hello world title</title>
</head>
<body>
HELLO WORLD!
</body>
</html>

Sau, mai simplu:


HELLO WORLD!

Programare Web– Curs 2 5


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Erori
• Nu putem vorbi de semnalarea erorilor in HTML
• Daca un Browser un recunoaste o directiva pur si simplu
o ignora.

• Exemplu:
<html>
<hed>
<turtle>Hello world title</turtle>
</hed>
<bady>
<h
h 1>HELLO
1 HELLO WORLD!</h
WORLD! /h 1> 1
<mimi>Directiva <upb>necunoscuta</upb></mimi>
</bady>
/bady
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Erori
• Rezultatul va fi:
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Stiluri
În zona de conținut a paginii (între <body> și
</body> putem folosi elemente ca:
• Stiluri ((headings):
g ) Acestea sunt asemănătoare ca
efect selectării în Microsoft Word a stilurilor
Heading g 1,, Heading
g 2,, etc.

Exemplu:
<h1> Titlu principal </h1>,
<h2> Titlu secundar </h2> ...

Programare Web– Curs 2 8


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Liste neordonate
Lista fără numere de ordine ((unordered list))
<ul> … <li> … </ul>:
<ul>l
<li>Primul
m element
m în lista
<li>Al doilea element în lista
.......
<li>Ultimul
li Ultimul element din lista
</ul>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Liste ordonate
Lista cu numere de ordine ((ordered list))
<ol> …
<li> … </ol>:
<ol>
<li>Primul element în lista
<li>Al doilea element în lista
.......
<li>Ultimul element din lista
</ol>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Liste de defini
definițții
Lista de definiţii:
ţ
<dl>
<dt>Primul
m termen</dt>
m
<dd>Definiţia primului termen</dd>
<dt>Al
dt Al doilea termen</dt>
termen /dt
<dd>Definiţia celui de-al doilea termen</dd>
.......
<dt>Ultimul termen</dt>
<dd>Definiţia ultimului termen</dd>
</dl>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte directive de formatare


• Trecere p
pe linia urmatoare ((break):
)
<br>
• Linie
Li i orizontala
i t l (h
(horizontal
i t l ruler):
l )
<hr>
• Paragraf: <p> … </p>. Observaţie:
</p> este facultativ.
• Subliniere: <u>u … </u>
/u
• Italice: <i> … </i>
• Îngroşare
Î (bold): <b> … </b>
Programare Web– Curs 2 13
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
Text <u>subliniat</u>,, <i>caractere
italice</i>, <b>ingrosat</b> sau
Toate cele trei
<u><i><b>combinate</b></i></u>.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
Fiecare p
pereche de directive de formatare își
ș
face efectul independent de celelalte:
Toate cele
T l treii
<u><i><b>combinate</u> dar </i>
intercalate</b>.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ancora (link)
• Acest tip de directivă este esenţial şi este cel care
implementează de fapt conceptul de hipertext
hipertext.
• În cadrul unei pagini HTML unul sau mai multe cuvinte
consecutive pot avea asociată o altă pagină HTML.
• În momentul în care utilizatorul selectează ((click)) zona
respectivă, automat browserul cere documentul asociat şi îl
afişează pe ecran.
• Forma cea mai simpla a unei astfel de directive este:
<a href=”URL-adresa
h f ”URL d s p paginii
i ii asociate”>
s i t ”>
Cuvinte care se pot selecta
</a>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

URL
Adresa specificată
p prin
p href p poate fi:
• Relativă la pagina curentă:

p 1: <a href=”pag1.html”>Pagina
1.Exemplul f p g m g
1</a><br>
2 Exemplul 2: <a
2.Exemplul
href=”documente/pag2.html”>Pagina
2</a><br>
/ b
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

URL
Sau poate fi:
• Absolută, în care caz se specifică o cale
completa pe acelaşi server de web (exemplul 3)
sau o adresă completă (exemplul 4)
3. Exemplul 3: <a
href=”/documente/pag3.html”>Pagina
p g g 3</a><br>
4. Exemplul 4: <a href=
”http://www
http://www.un.server.web/doc/pag4.html
un server web/doc/pag4 html”>Pag
>Pag
ina 4</a><br>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

URL
• În primul caz noua pagină se găseşte pe acelaşi
server şi în acelaşi director cu pagina curentă.
• În al doilea caz
caz, pentru găsirea paginii pag2.html
pag2 html
serverul web porneşte din directorul paginii
curente şi caută în subdirectorul documente.
documente
p g g
1. Exemplul 1: <a href=”pag1.html”>Pagina
1</a><br>
2 Exemplul 2: <a
2.
href=”documente/pag2.html”>Pagina 2</a><br>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

URL
• În al treilea caz, pentru găsirea paginii pag3.html serverul
web porneşte din rădăcina arborelui de documente
(DOCUMENT_ROOT) şi caută în subdirectorul documente.
• În ultimul
ltim l ca
caz no
noua
a pagină se poate găsi pe alt ser
server
er de
web decât cea curentă. Browserul va contacta acest server
care îi va livra pagina aflată în subdirectorul doc
doc.
3. Exemplul 3: <a href=”/documente/pag3.html”>Pagina
3</a><br>
4. Exemplul 4:<a
h f ”h
href=”http://www.alt.server.de.web/doc/pag4.html”>Pagi
// l d b/d / 4 h l” P
na 4</a><br>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Bookmark
Trimiteri în interiorul unui document:
• În acest caz marcarea locului referit se face cu:
<a name=”marcaj-tinta”>. . . </a>
• Referinţa are forma
<a href=”adresa-document#marcaj-tinta> . . . </a>
unde adresa documentului poate fi relativă sau absolută.
• Exemplu cu două documente HTML în care primul
reprezintă cuprinsul (tabla de materii) pentru al doilea.
• Prin selectarea unei ancore care trimite spre o porţiune a
unui document acesta este încărcat în întregime de
browser dar poziţionarea se face nu la începutul său ci în
punctul ţintă marcat.
marcat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu - cuprins
<html>
<head>
h d
<title>Cuprins</title>
</head>
<body>
<h1>Cuprinsul lucrarii</h1>
<hr>
<ul>
<li><a
li h
href=”Continut.html#cap1”>Capitolul
f ”C ti t ht l# 1” C it l l 1</a>
1 /
<li><a href=”Continut.html#cap2”>Capitolul 2</a>
<li><a
li a href=”Continut.html#cap3”>Capitolul
href Continut.html#cap3 Capitolul 3 3</a>
/a
</ul>
</body>
</html>
Programare Web– Curs 2 22
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu - documentul
<html>
<head>
h d
<title>Lucrare</title>
</head>
<body>
<h1><a name=”cap1”>Capitolul 1</a></h1>
. . . Continutul capitolului 1
<h1><a name=”cap2”>Capitolul 2</a></h1>
. . . Continutul
C ti t l capitolului
it l l i 2
<h1><a name=”cap3”>Capitolul 3</a></h1>
. . . Continutul capitolului 3
</body>
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat - cuprins

Programare Web– Curs 2 24


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat - document
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Imagini
• Documentele HTML pot conţine directive de
includere imagini (includerea imaginii în
document se face la afișarea acestuia).
• Sintaxa (simplificată) este:
<img
i src="foto2.jpeg"
"f t 2 j " width="200“
idth "200“ h
height="150"
i ht "150"
alt="Fotografia mea">
• src specifică adresa fişierului conţinând imaginea
((relativa sau absoluta),
) width şşi height
g elemente
de scalare a imaginii şi alt un text alternativ
pentru browserele care nu afișează
p ș imagini.
g

Programare Web– Curs 2 26


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Imagini
• Fiecare tip
p de browser lucrează cu un
anumit set de formate de imagine.
• Formatele JPEG şi GIF sunt cele mai
• folosite dar nu sunt singurele
singurele.
• Subdirectivele width,
width height şi alt sunt
opţionale.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Imaginea Link
• O imagine poate fi folosita ca link:
<body>
<a href="test2.html"><img src="foto2.jpg"
width="100" height="200" border="0"
alt="Fotografia mea"></a>
Fotografia mea
</body>

Border=0 elimină chenarul


plasat de browser automat
în jjurul imaginii-link.
g

Programare Web– Curs 2 29


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Background
• Se poate seta o culoare sau o imagine de fundal:
<html>
<head>
<title>Culori</title>
</head>
/h d
<body bgcolor="#CCFFCC">
Fundal colorat
</body>
</html>

Programare Web– Curs 2 30


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Imagine de fundal
<html>
<head>
<title>Culori</title>
titl C l i /titl
</head>
<body background=
"f
"foto2.jpg">
2j "
<h1>Fundal
h1 Fundal imagine
imagine</h1>
/h1
</body>
</html>
Programare Web– Curs 2 31
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Linii orizontale
• Cu <hr> putem genera linii orizontale:
<BODY>
BODY
Prima parte
<HR>
HR
A doua parte
<HR WIDTH=60% ALIGN="right">
A treia parte
<HR WIDTH=60% size=10
color="blue">
</BODY>
• Alinierea implicita este CENTER
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Culori ancore
• Se pot seta culori pentru ancore (link-uri) funcție de tipul
l pagina,
lor: i pagina
i vizitată,
i it tă pagina
i activă
ti ă – cea selectată
l t tă
(click)

<BODY BGCOLOR="#33FFFF" TEXT="#330033"


LINK="#33CC00" VLINK="#FF00CC"
ALINK="#009900">
<a href="test2.html">
Pagina<br>
ag na r
<a href="test1.html">
Pagina vizitata<br>
<a href="test.html">
h f "t st ht l">
Pagina activa<br>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Font - Face
• Se poate schimba fontul de scriere cu FONT FACE:
<body>
body
<P ALIGN="center">
<FONT FACE="Arial">Arial</FONT>
<br>
<FONT FACE=
FACE="Arial
Arial Black
Black">Arial
>Arial Black</FONT>
<br>
<FONT FACE="Times Rew Roman">Times Rew Roman</FONT>
<br>
<FONT FACE=
FACE="Georgia">Georgia</FONT>
Georgia >Georgia</FONT>
<br>
<FONT FACE="Verdana">Verdana</FONT></body>
<br>
<FONT FACE=
FACE="Garamond">Garamond</FONT>
Garamond >Garamond</FONT>
<br>
<FONT FACE="Comic Sans MS">Comic Sans MS</FONT>
<br>
<FONT
FONT FACE="Courier
FACE "C i New">Courier
N "C i N New</FONT>
/FONT
<br>
<FONT FACE="Impact">Impact</FONT>
<br>
<FONT
FONT FACE="Trebuchet
FACE "T b h MS">Trebuchet
MS" T b h MS</FONT>
MS /FONT
</body>

Programare Web– Curs 2 34


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Font Size
• Se poate dimensiona fontul cu FONT SIZE:

<TABLE BORDER=0><TR>
<TD><FONT SIZE=1>Size 1</FONT></TD>
</TR><TR>
<TD><FONT SIZE=2>Size 2</FONT></TD>
</TR><TR>
<TD><FONT SIZE=3>Size 3</FONT></TD>
</TR><TR>
<TD><FONT SIZE=4>Size 4</FONT></TD>
</TR><TR>
/TR TR
<TD><FONT SIZE=5>Size 5</FONT></TD>
</TR><TR>
<TD><FONT SIZE=6>Size
SIZE 6>Size 6</FONT></TD>
</TR><TR>
<TD><FONT SIZE=7>Size 7</FONT></TD>
</TR></TABLE>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Combinaț
Combinații
• Directivele anterioare se p
pot combina:
<body>
Directive <FONT COLOR="#AA00CC"
FACE="ARIAL" SIZE="7">combinate</FONT>
</body>
/body
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Zona HEAD
• În zona de header a p
paginii
g ((între <head> ș
și
</head>) putem pune o serie de directive
de descriere a documentului.
documentului

Programare Web– Curs 2 37


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HEAD - Title
• TITLE: titlul unei p
pagini.
g Sintaxa este:
<title>titlu</title>
• Titlul
Titl l nu se fformatează,
t ă ell nu apare în
î
fereastra browserului.
• De exemplu:
<title><b>Ceva</b></title>
are efectul alăturat

Programare Web– Curs 2 38


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HEAD - Base
• Directiva <base>: Calea de referinţă pentru paginile referite. Formatul său este:
BASE HREF="adresa
<BASE HREF adresa completa sau cale absoluta / relativa
relativa" >
• Exemplu:
<html>
<head>
h d
<title>Fotografiile mele</title>
<base href=”http://www.un.server/imagini/eu”>
p g
</head>
<body>
<h1>Acesta sunt eu</h1>
<img src="foto1.gif">
<img src="altele/foto2.gif">
<img src="/poze/foto3.gif">
<img src="http://www.alt.server/imagini/foto4.gif">
/body
</body>
</html>
Programare Web– Curs 2 39
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HEAD - Base
• În acest caz imaginile se găsesc în următoarele
locaţii:
http://www un server/imagini/eu/foto1 gif
http://www.un.server/imagini/eu/foto1.gif
http://www.un.server/imagini/eu/altele/foto2.gif
http://www.un.server/poze/foto3.gif
http://www alt server/imagini/foto4 gif
http://www.alt.server/imagini/foto4.gif
• Directiva are efect asupra tuturor referinţelor din
pagina respectiva, inclusiv ancore, adrese ale
scripturilor CGI apelate de formulare, etc.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HEAD - META
• Directiva <meta>: Este folosită pentru a specifica
“meta-informaţii” despre pagina respectivă.
• Formatul acesteia este:
<META [HTTP-EQUIV | NAME]= "ceva“ CONTENT=
"altceva"
altceva >
• În cazul în care serverul face o inspecție a
d
documentelor
t l cerutet se poatet folosi
f l i http-equiv,
htt i
care are efectul de a instrui serverul să trimită un
element
l tdde preambul
b l all paginii
i ii d
definit
fi it d
de di
directiva
ti
respectivă.
• Iată un exemplu:
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<html> <head>
<title> Programul conferintei <title>
<meta http-equiv="Expires“ content="Sat, 30 Dec 2000 10:00:00
GMT">
</head>
<body>
b d
<h1>Program</h1>
......
</body>
</html>
• Serverul va trimite un element de preambul de forma:
Expires: Sat, 30 Dec 2000 10:00:00 GMT
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alt exemplu
• Pentru a specifica
p setul de caractere folosit
– de exemplu UTF-8 - se poate folosi:
<meta http-equiv=
http-equiv="content-type"
content-type
content="text/html; charset=UTF-8">
• ÎÎn felul acesta putem adăuga diacritice în
pagini
p g web
• Documentul sursa trebuie
salvat
l t ca ddocumentt UTF
UTF-8
8
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Formulare
• Majoritatea directivelor HTML servesc pentru
formatarea textului paginii.
• Formularele sunt cele care pot face ca o pagina
să fie interactivă (să intre în dialog cu utilizatorul).
• Un
U fformular
l ttrebuie
b i sa aibă
ibă îîn principiu:
i i i
1. O acţiune
ţ asociată numită scriptp CGI. Datele
completate de utilizator sunt preluate de acest
script
p şi
ş prelucrate.
p Rezultatul scriptului
p este
trimis ca răspuns utilizatorului. Această acţiune
se ggăseşte
ş în directiva <form>

Programare Web– Curs 2 44


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Formulare
2. Unul sau mai multe câmpuri de tip text, buton,
check-box, lista de alegere etc.
Acestea sunt introduse prin directivele <input>
din interiorul formularului.
3 U
3. Un b
buton
t prini selectarea
l t căruia
ă i valorile
l il
completate sunt trimise serverului de web.
El va lansa scriptul CGI şi va trimite rezultatele
către browser. Acest buton se implementează
p tot
prin intermediul unei directive <input>.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Formă generică a unui fişier HTML care conţine un formular este
următoarea:
<html>
<head>
<title>Titlu</title>
</head>
<body>
b d >
<form>
<input.
input. . . >
<select> <option> . . . </select>
<textarea> </textarea>
.......
<input type=submit>
</form>
</body> </html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• <form> şi </form> încadrează elementele
constitutive ale formularului,
• <input>
<input>, <select> și <textarea> introduc câmpurile
formularului
• prin directivele <input type = submit> se definesc
butoane a căror selectare trimite datele
completate în form către serverul de web (pentru
a fi transferate scriptului
p CGI care le
prelucrează).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

FORM
• Sintaxa acestei directive este următoarea:
<FORM ACTION="url" METHOD=[POST | GET]
[ENCTYPE="..." ]>
unde:
• url este adresa relativă sau absolută la care se găseşte
scriptul CGI asociat formularului,
• method arată modul în care scriptul CGI primeşte datele din
formular:
– GET - sunt primite într-o
într o variabila de mediu numita
QUERY_STRING având lungimea CONTENT_LENGTH
– POST - datele sunt primite la intrarea standard (stdin).

Programare Web– Curs 2 48


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

FORM
• Metoda POST este preferabilă atunci când
volumul acestor date este mare.
• Daca metoda nu este specificata
specificata, automat va fi
considerată GET.
• enctype
t arata
t modul
d l îîn care b
browserull codifică
difi ă
informaţia din formular pentru a o trimite
serverului.
l i
• Aceasta opţiune
pţ este în g
general ppuţin
ţ folosita, în
lipsă considerându-se tipul standard
pp
application/x-www-form-urlencoded.

Programare Web– Curs 2 49


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

INPUT
• Sintaxa acestei directive este:
<INPUT TYPE=tip [NAME="nume" ]
[VALUE " l
[VALUE="valoare"
"]
[SIZE=dimensiune
[SIZE dimensiune_afisare
afisare ]
[MAXLENGTH=dimensiune_maxima]
[SRC " l"] [CHECKED]
[SRC="url"] [CHECKED]>
• unde:
• TYPE = tip defineşte numele simbolului asociat
câmpului.
Programare Web– Curs 2 50
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

INPUT
• NAME = “numele” simbolului asociat câmpului.
• VALUE = “valoarea” iniţială afişată de browser
• SIZE = defineşte lungimea câmpului afişat de
browser
• MAXLENGTH = arată lungimea maximă a valorii
care se poate tasta
• SRC = “url” ce defineşte o adresă relativă sau
absolută (ca în cazul imaginilor)
• În funcţie de tipul câmpului avem următoarele
variante
Programare Web– Curs 2 51
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type=TEXT
Type TEXT
• Sintaxa:
<INPUT TYPE=TEXT NAME="nume"
[VALUE="valoare" ]
[MAXLENGTH dimensiune maxima ]
[MAXLENGTH=dimensiune_maxima
[SIZE=dimensiune
[SIZE dimensiune_afisare
afisare ]>
]
• Defineşte un câmp de tip şir de caractere.
• Nu putem tasta mai mult de MAXLENGTH
caractere
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<html>
<head>
h d
<title>Formular</title>
</head>
<BODY>
<form action="unu.php">
Input: <input type="text" name="nume"
value="doi" maxlength="5" size="7">
<input type="submit" value="Haide">
</form>
</BODY>
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type SUBMIT
Type=SUBMIT
• Sintaxa:
<INPUT TYPE=SUBMIT [NAME="nume" ]
[VALUE="valoare" ]>
• Defineşte un buton prin selectarea căruia datele
completate în formular sunt trimise serverului de web.
• Pot
P t exista
i t maii multe
lt astfel
tf l de
d bbutoane,
t d
deosebite
bit prin
i
valoarea dată prin clauza name.
• Clauza value este folosită pentru a defini inscripţionarea
afişată de browser pentru acest buton (în lipsă inscripţia
este dată de browser).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<html>
<head>
<title>Formular</title>
</head>
<BODY>
<form action="unu.php">
Continut formular
<input type="submit" name="buton1">
<input type="submit" name="buton2">
</form>
</BODY>
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type RESET
Type=RESET
• Sintaxa:
<INPUT TYPE=RESET [VALUE="valoare" ]>
• D
Defineşte
fi t un buton
b t prin
i a cărui
ă i selectare
l t valorile
l il
câmpurilor formularului sunt aduse la starea
i iţi lă
iniţială.
• Nu se face nici un schimb de date cu serverul (e
(
interpretat de browser)
• Clauza value este folosită pentru inscripţionarea
butonului.

Programare Web– Curs 2 56


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<html>
<head>
h d
<title>Formular</title>
</head>
<BODY>
<form action="unu.php">
Continut formular<br>
<input type="submit" value="Da mai departe">
<br>
b
<input type="reset" value="Sterge tot">
</form>
/form
</BODY>
</html>

Programare Web– Curs 2 57


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type=PASSWORD
Type PASSWORD
• Sintaxa:
<INPUT TYPE=PASSWORD NAME="nume“
[VALUE="valoare"
[VALUE valoare ]
[MAXLENGTH="dimensiune_maxima" ]
[SIZE="dimensiune_afisare" ]>
• este asimilat tipului text cu deosebirea că ceea ce
se tastează pe un astfel de câmp nu se afişează
în clar pe ecran (în mod obişnuit se afişează în
ecou caracterul asterisc - *) dar se transmite in
clar serverului!
Exemplu
<html>
<head>
h d
<title>Formular</title>
</head>
<BODY>
<form action="unu.php">
Dati parola: <input type="password"
name="nume" value="doi" maxlength="5"
size="7">
i "7"
<input type="submit" value="Autentifica">
</form>
/form
</BODY>
</html>

Programare Web– Curs 2 59


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type=IMAGE
Type IMAGE
• Sintaxa:
<INPUT TYPE=IMAGE NAME="nume“
SRC="url“
SRC url [ALIGN
[ALIGN=TOP|BOTTOM|MIDDLE]>
TOP|BOTTOM|MIDDLE]>
• permite includerea unei imagini şi selectarea unor
anumite
it punctet ale
l sale.
l
• SRC arată adresa fişierului
ş conţinând
ţ imaginea
g
iar align poziţionarea acesteia.
• Nu este necesar buton de submit,
submit click pe
imagine declanșează transmiterea datelor
(coordonate in imagine)
Programare Web– Curs 2 60
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type
Type=HIDDEN
HIDDEN
• Sintaxa:
<INPUT TYPE=HIDDEN NAME="nume“
VALUE="valoare" >
• Câmpurile de tip hidden nu apar pe ecran dar permit
transmiterea de valori într-o succesiune de pagini.
• Astfel de câmpuri apar de exemplu în formularele
generate dinamic şi sunt un mod prin care serverul
setează încă de la transmiterea formularului către
browser anumite perechi (nume_simbol –
valoare simbol) pentru acea formă
valoare_simbol) formă.
• Un alt mod de a face acest lucru - în PHP și alte limbaje
d scripting
de i ti - este
t folosirea
f l i variabilelor
i bil l dde sesiune.
i
Programare Web– Curs 2 61
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type = CHECKBOX
• Sintaxa:
<INPUT TYPE=CHECKBOX NAME="nume“
VALUE="valoare" [CHECKED]>
• Acest tip permite definirea unei casete care poate fi bifată
sau nu (în genul unui comutator pornit/oprit).
• Dacă este prezentă clauza CHECKED caseta este iniţial
bifată, altfel nu.
• Observaţie: Spre deosebire de celelalte tipuri, doar pentru
casetele bifate vor fi transmise de la browser către server
perechi (nume_simbol, valoare_simbol). Dacă nici o
casetă nu a fost bifată nici unul dintre simbolurile asociate
l nu este
lor t prezentt în
î şirul
i l ttransmis.
i
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Type = RADIO
• Sintaxa:
<INPUT TYPE=RADIO NAME="nume" VALUE="valoare“
[CHECKED]>
• Tipul radio este asemănător tipului checkbox,
checkbox cu deosebirea că
numai un singur buton radio dintre cele cu acelaşi nume (dat de
clauza name) poate fi selectat la un moment dat. Daca este prezentă
clauza CHECKED butonul respectiv este iniţial selectat. Doar unul
dintre butoanele radio cu acelaşi nume poate conţine această clauză.
• Observaţie: În cazul tipului checkbox este uzual (dar nu necesar) ca
mai multe casete prezente în formular să aibă aceeaşi valoare şi
nume diferite pe când în cazul radio butoanele au acelaşi nume şi
valori
alori diferite,
diferite pentr
pentru un
n astfel de n
nume
me transmiţând
transmiţându-se
se o sing
singură

pereche (nume_simbol, valoare_simbol) de la browser către server.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Liste SELECT
• Sintaxa acestei directive este:
<SELECT
SELECT NAME
NAME="nume"
nume [SIZE="dimensiune
[SIZE dimensiune_fereastra
fereastra"]>
]
<OPTION [VALUE="valoare_1" ] [SELECTED]> text_afisat_1
<OPTION [[VALUE="valoare_2"
_ ] [[SELECTED]>
] text_afisat_2
_ _
....
</SELECT>
• Cu ajutorul acestei directive se definesc meniuri verticale din care se poate
alege o singura valoare.
• Numele
N l simbolului
i b l l i este cell di
din SELECT iiar lilista d
de valori
l i este iintrodusă
d ă
element cu element cu directiva OPTION.
• Dacă VALUE lipseşte
p ş se consideră automat ca valoare textul corespunzător
p
opţiunii respective (text_afisat_i).
• Observaţie: în fereastra (de dimensiune dată de SIZE) browserul afişează
textele asociate iar selectarea unuia dintre ele asociază simbolului nume
valoarea din clauza VALUE pentru textul respectiv.
Programare Web– Curs 2 64
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

TEXTAREA
• Sintaxa:
<TEXTAREA
TEXTAREA NAME
NAME="nume"
" " [ROWS
[ROWS=numar_linii]
li ii]
[COLS=numar_coloane]
[WRAP="soft"|"hard"|"off"]>
Text initial
</TEXTAREA>
• Această
A tă directivă
di ti ă estet asemănătoare
ă ăt cu <input
i
type=text> cu deosebirea că browserul va permite
tastarea unui text într-o fereastră cu mai multe linii
(nr_linii).
• Dimensiunea pe orizontală a ferestrei este dată de
numar_coloane.
Programare Web– Curs 2 65
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

TEXTAREA
• Clauza WRAP (nerecunoscută în unele cazuri)
arată modul în care browserul afişează textul în
fereastra respectivă şi cum îl transmite serverului:
• în cazul soft tastarea unui text mai mare decât
nr coloane duce la afişarea pe mai multe linii dar
nr_coloane
la transmitere textul e liniarizat.
• îîn cazull hard
h d afişarea
fi se fface ca maii sus d
dar
transmiterea se face sub forma mai multor linii,
aşa cum apar înî fereastră.
f tă
• În cazul off ((care este implicit)
p ) textul e afişat
ş şiş
transmis aşa cum este tastat.
Programare Web– Curs 2 66
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<html><head><title>Date personale</title></head>
<bodyy bgcolor="CCFFF">
g
<h2>Completati datele personale in formular</h2>
<font size = 3 face = "arial">
<form action="inregistrare.cgi"
g g method=POST>
<u><b><i>Nume si prenume:</i></b></u> <input name="nume"
size=50>
<br>
br
<u><b><i>Adresa:</i></b></u><br>
<textarea name="adresa" rows=4 cols=60 wrap="soft">
</textarea>
<u><b><i>Email:</i></b></u> <input type=text name="email"
size=30>
<p>
<u><b><i>Studii:</i></b></u>
<input type=radio name="studii" value="medii" checked>Medii
<input type=radio name="studii"
name= studii value=
value="superioare">Superioare
superioare >Superioare
<input type=radio name="studii" value="doctorat">Doctorat

Programare Web– Curs 2 67


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<p>
<u><b><i>Limbi straine cunoscute:</i></b></u> <br>
<input type=checkbox name="limba" value="engleza">Engleza
<input type=checkbox name="limba" value="franceza">Franceza
<input type=checkbox name="limba" value="germana">Germana
<br>
<input type=checkbox name="limba" value="italiana">Italiana
<input type=checkbox name="limba" value="spaniola">Spaniola
<input type=checkbox name="limba" value="rusa">Rusa
<p>
<u><b><i>Zona geografica preferata:</i></b></u>
<select name="zona">
<option value="muntenia">Muntenia
<option
p value="moldova">Moldova
<option value="transilvania">Transilvania
</select>
<hr>
<u><b><i>Inscrie-ma
u b i Inscrie ma in lista pentru primirea brosurii
prin:</i></b></u><br>
<input type=submit name="tip" value="posta">&nbsp &nbsp
<input type=submit name="tip" value="email"><br>
<input type
type=reset
reset value
value="Stergere
Stergere forma
forma">>
</form>
</body> </html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

TABELE
• Cele 3 directive ((taguri)
g ) de bază pentru
p
lucrul cu tabele sunt:
1 <table>
1. t bl - definește
d fi t începutul
î t l uneii tabele
t b l
2 <tr>
2. tr - începutul unei linii într-o
într o tabelă
3.<td> - o celulă pe o linie dintr-o tabelă.
• Fiecare dintre cele 3 directive anterioare se
încheie cu </directiva>

Programare Web– Curs 2 70


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<table>
<tr><!-- Linia 1 -->
<td><!-- Prima celula -->
Valoarea 1, 1
</td>
<td><!-- A doua celula -->
Valoarea 1, 2
</td>
</tr>
<tr><!-- Linia 2 -->
<td><!-- Prima celula -->
Valoarea 2, 1
</td>
<td><!-- A doua celula -->
Valoarea 2, 2
</td>
</tr>
</table>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

REZULTAT
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

BORDER
• După
p cum se observă din exemplul p
anterior, implicit caroiajul nu este vizibil.
• Pentru a
a-ll vizualiza directiva table poate
primi parametrul BORDER
• Exemplu:
<table border=1>

Programare Web– Curs 2 73


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

BORDER
• Valoarea parametrului poate fi mai mare ca 1:

<table border=10>

<table border=30>

Programare Web– Curs 2 74


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

WIDTH
• Un alt parametru la border este WIDTH.
• Exprimat în procente parametrul arată cât din dimensiunea
disponibilă ocupă tabela.
• Exemplu:
p 50%,, 75%,, 100%:
<table border=1 width=50%>
...
</table>
<table
table border
border=11 width
width=70%>
70%>
...
</table>
<table border=1 width=100%>
...
</table>
Programare Web– Curs 2 75
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

WIDTH:: Rezultat
WIDTH
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HEIGHT
• Similar cu WIDTH, dar pe verticală.
• Se poate exprima în cifre absolute sau în
p
procente.
• Exemplu:
<table border=1 width=50% height=50>
...
</table>
g
<table border=1 width=70% height=50%>
...
</table>
Programare Web– Curs 2 77
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ALIGN
• Poziționarea valorilor în celule se face formatându-le individual.
• E
Exemplu:
l
<table border=1 width=100 height=75>
<tr><!-- Linia 1 -->>
<tr><!
<TD ALIGN="left" VALIGN="bottom">
<!-- Prima celula -->
Valoarea 1, 1
</td>
<td><!--
td ! A douad celula
l l -->
Valoarea 1, 2
</td>
/td
</tr>
</table>

Programare Web– Curs 2 79


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat

Programare Web– Curs 2 80


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Aliniere
• Pentru alinierea pe orizontală putem folosi:
– LEFT,
– RIGHT,
RIGHT
– CENTER
• Pentru alinierea pe verticală putem folosi:
– TOP,,
– BOTTOM,
– MIDDLE
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Conț
Conținut celule
• Celulele unei tabele pot conține un numai text ci orice altceva,
inclusiv imagini
imagini.
• Exemplu:
<table border=1 width=100% height=75%>
<tr><!-- Linia 1 -->
<TD
D ALIGN
ALIGN="left"
left VALIGN
VALIGN="bottom"><!–
bottom ! Prima
r ma celula -->
<IMG SRC="foto2.jpg" WIDTH=32 HEIGHT=32
ALT="Ed">
</td>
/ d
<td><!-- A doua celula -->
Valoarea 1,1 2
</td>
</tr>
</table>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat

Programare Web– Curs 2 83


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Dimensiune celule
• WIDTH ș și HEIGHT,, în cifre absolute sau
procente, se pot pune ca parametri și la
directiva TD.
TD
• În acest fel putem să avem dimensiuni
diferite pentru coloanele și liniile unei
tabele.
• Parametrii de la TABLE arată dimensiunile
t b l i îîn fereastra,
tabelei f t cele
l de
d lla TD pe cele
l
ale celulei în tabelă.

Programare Web– Curs 2 84


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<table border=1 width=100% height=75%>
<tr><!-- Linia 1 -->>
<tr><!
<td width=20% height=25%><!-- Prima celula -->
Valoarea 1, 2
</td>
<td width=80%><!-- A doua celula -->
Valoarea 1, 2
</td>
</tr>
<tr><!-- Linia 2 -->
<td height=60%><!--
height=60%><! Prima celula -->>
Valoarea 1, 2
</td>
<td><!--
td ! A douad celula
l l -->
Valoarea 1, 2
</td>
</tr>
/t
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Celule goale
• Dacă o celulă este goală, browserul o arată deosebit de
cele
l care conțin
ți ceva, iinclusiv
l i d de cele
l care conțin
ți un
spatiu de tip &nbsp;
• Exemplu:
....
<tr><!-- Linia 1 -->
<td width=20% height=25%><!-- nimic --></td>
<td width=80%><!--
width=80%><! A doua celula -->&nbsp;</td>
>&nbsp;</td>
</tr> . . . .

Programare Web– Curs 2 87


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CELLPADDING & CELLSPACING


• Se p
pun la TABLE
• CELLPADDING arată cât spațiu este între
li iil caroiajului
liniile i j l i șii conținutul
ți t l celulei.
l l i
• Implicit este luată o valoare (1 de exemplu)
• CELLSPACING arată spațiul între celule.
• Implicit este luată o valoare (2 de exemplu)

Programare Web– Curs 2 89


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
Tabela1
<table border=5 cellpadding=20>
<tr><!-- Linia 1 --><td><!-- Prima celula -->
Valoarea 1, 1
</td><td><!-- A doua celula -->
Valoarea 1, 2
</td></tr>
</table>
Tabela 2
<table
bl b border=5
d 5 cellspacing=20>
ll i 20
<tr><!-- Linia 1 --><td><!-- Prima celula -->
Valoarea 1, 1
</td><td><!-- A doua celula -->
Valoarea 1, 2
</td></tr>
</table>
Programare Web– Curs 2 90
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Să color
coloră
ăm pu
puțțin
• Celulele unei tabele se p
pot colora ((culoare
fundal celulă).
• P
Putem
t colora
l toată
t tă ttabela,
b l d doar o lilinie
i sau
doar o celulă.
• Pentru asta se pune parametrul BGCOLOR
la TABLE,
TABLE TR respectiv la TD

Programare Web– Curs 2 92


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<table border=1 width=100% height=100%>
<tr BGCOLOR=#BEFADE><!-- Linia 1 -->
<td><!-- Prima celula -->Valoarea 1, 1</td>
<td><!-- A doua celula -->Valoarea 1, 2</td>
</tr>
<tr><!-- Linia 2 -->
<td BGCOLOR=#FACADE><!-- Prima celula -->Valoarea
2, 1</td>
<td BGCOLOR=#AFAD0E><!-- A doua celula -->
Valoarea 2, 2</td>
</tr>
</table>
Programare Web– Curs 2 93
Altă
Alt ă colorare
• Dacă mutăm parametrul de culoare la tabelă, va fi colorat inclusiv
spațiul dintre celule:
<table border=1 cellspacing=20 width=100%
height=100%
g BGCOLOR=#BEFADE>
<tr><!-- Linia 1 -->
<td><!-- Prima celula -->Valoarea 1, 1</td>
<td><!-- A doua celula -->Valoarea 1, 2</td>
</tr>
<tr><! Linia 2 -->>
<tr><!--
<td BGCOLOR=#FACADE><!-- Prima celula -->Valoarea 2,
1</td>
<td BGCOLOR=#AFAD0E><!-- A doua celula -->Valoarea 2,
2</td>
</tr>
</table>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Prioritate
• Prioritate are culoarea de celulă,, dacă
există
• D
Daca nu se colorează
l ă cu culoarea
l d
de lilinie,
i
daca există.
• Daca nu se folosește culoarea de tabelă
(daca există).
există)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

COLSPAN și ROWSPAN
• Daca vrem ca o celulă să ocupe p mai multe
coloane sau mai multe linii, la TD folosim
parametrii COLSPAN,
COLSPAN respectiv
ROWSPAN.
• Valoarea lor spune câte coloane, respectiv
p acea celulă.
linii ocupă

Programare Web– Curs 2 98


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<table border=5>
<tr><! Linia 1 -->>
<tr><!--
<td colspan=2><!-- Prima celula -->
Valoarea 1, 1
</td>
</tr>
<tr><!-- Linia 2 -->>
<tr><!
<td><!-- Prima celula -->
Valoarea 2, 1
</td>
/ d
<td><!-- A doua celula -->
Valoarea 2, 2
</td>
</tr>
</table>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Formatare text celul


celulăă
• Într-o celulă p
poate fi un întreg
g document
HTML, cu toate elementele de formatare
posibile.
posibile
• Pot exista imagini, ancore, directive de
formatare text, etc.

Programare Web– Curs 2 101


Exemplu
<table border=5 width=100% height=100%>
<tr><! Linia 1 -->>
<tr><!--
<td rowspan=2><!-- Prima celula -->
<h1>Intrebarea 1</h1>
<font size=4>Cine a spus "Invatati, invatati, invatati!"?
<ol>
<li>Tatal meu cand imi vedea notele
<li>Dirigintele, saptamanal
<li>Indrumatorul de an, la facultate
</ol>
/ l
Raspunsul <a href="www.google.ro">il gasiti pe aici</a>
</td>
<td>Valoarea 1, 2</td></tr>
<tr><!-- Linia 2 --><td><!-- A doua celula -->Valoarea 2,
2</td>
</tr></table>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CADRE (Frames)
• Cu ajutorul
aju o u lor
o pu
putem
e împărți
pă ț fereastra
e eas a
browserului în mai multe ferestre
distincte.
distincte
• Un exemplu în care avem 2 ferestre
ferestre.
– Avem nevoie de 3 ppagini
g HTML, una
master și două cu conținutul celor 2
ferestre.
ferestre

Programare Web– Curs 2 106


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Pagina principală (lipsește directiva <BODY>!):
<html>
<head>
head
<title>Cadre</title>
</head>
/h d
<FRAMESET COLS="40%,*">
<FRAME SRC="stanga.html">
<FRAME
FRAME SRC="dreapta.html">
SRC dreapta.html
</FRAMESET>
</html>
/ht l
Programare Web– Curs 2 107
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

• Cadrul stanga.html
<html>
<body>
Fereastra stanga.html
Exemplu
</body>
</html>
• Cadrul dreapta.html:
<html>
<body>
<h2>Fereastra dreapta.html</h2>
p
Continut 2
</body>
y
</html>
Programare Web– Curs 2 108
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat

Programare Web– Curs 2 109


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Dimensiuni
Dimensiunea unui cadru se p
poate da:
• Procentual (din mărimea ferestrei, =>
redimensionare
di i od
dată
tă cu fereastra)
f t )
• Absolut (în pixeli).
pixeli) De exemplu
exemplu, dacă în
cazul anterior în loc de 40% foloseam 40
rezultatul era o dimensionare în pixeli
pixeli, fără
redimensionari o dată cu fereastra:
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Observaț
Observații
• Daca folosim valori absolute trebuie ca in lista de
la FRAMESET unul dintre cadre să fie dat
dimensionat cu * (pentru redimensionarea o dată
cu fereastra).
• Se poate folosi și construcția:
<FRAMESET COLS="50,*,2*">
care înseamnă: cadrul 1 50 pixeli, restul pentru
cadrele 2 ș
și 3 dar cadrul 3 de două ori mai mare
decât cadrul 2.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

• Cadrele se pot și imbrica.


• Exemplu:
<html>
<head>
Cadre imbricate
<title>Cadre</title>
</head>
<FRAMESET COLS="90,*,2*">
<FRAME SRC="stanga.html">
<FRAME SRC="mijloc.html">
<FRAMESET
FRAMESET ROWS="50%,50%">
ROWS "50% 50%"
<FRAME SRC="dreapta1.html">
<FRAME SRC=
SRC="dreapta2
dreapta2.html
html">>
</FRAMESET>
</FRAMESET>
</html>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

BORDER
• Zona dintre cadre se poate dimensiona și colora.
• Daca în exemplul anterior linia este:
<FRAMESET
FRAMESET COLS="90,*,2*"
COLS "90 * 2*" BORDER
BORDER=20
20
BORDERCOLOR="#FFOOOO">
obținem rezultatul din slide-ul următor.
• BORDER dă grosimea benzii iar
BORDERCOLOR culoarea.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Legaturi între cadre


• Se p
poate ca un link dintr-un cadru să
deschidă o pagină în alt cadru.
• P
Pentru
t aceasta,
t lal FRAME trebuie
t b i să ă dă
dăm
parametrul NAME pentru a-i aloca un
nume iar la <A HREF> parametrul
TARGET p pentru a indica fereastra în care
se deschide noua pagină.

Programare Web– Curs 2 117


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Pagina
g principala
p p ((avem doar două cadre):
)
<FRAMESET COLS="33%,67%">
<FRAME SRC=“stanga
SRC= stanga.html
html">>
<FRAME SRC=“dreapta.html"
NAME=“FDREAPTA">
</FRAMESET>

Programare Web– Curs 2 118


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• În p
pagina
g din stânga
g pputem avea un link de
forma:
<A HREF=
HREF=“doc
doc.html"
html" TARGET =
“FDREAPTA"> Vezi doc.</A>
• La activarea acestui link pagina doc.html se
va deschide în cadrul din dreapta
dreapta.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

TARGET
• La target se mai pot folosi: și destinatiile predefinite _top,
_blank,
bl k _self lf șii _parent.
t
• _TOP deschide pagina în fereastra întreaga de browser
(fără cadre)
• _BLANK deschide pagina într-o fereastră nouă de
browser (nu cadru!)
• _SELF deschide pagina în aceeași fereastră de browser
sau în același cadru (deci poate lipsi, e acțiunea implicita)
• _PARENT
_ deschide p pagina
g în fereastra tată a cadrului
curent (cea în care este definit prin FRAMESET cadrul
curent, un același lucru cu _TOP!)

Programare Web– Curs 2 120


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ROWS
• Așa
ș cum COLS împarte
p fereastra curentă
(sau cadrul) pe verticală, ROWS face o
împărțire pe orizontală
orizontală.
• Parametrii descriși la COLS se pot folosi și
la ROWS.
• Într
Într-un
un exemplu anterior al doilea frameset
e pe orizontala.

Programare Web– Curs 2 121


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte elemente
• Fiecare cadru poate avea o altă culoare de
background sau imagine (se comportă ca o
fereastră obișnuită de browser).
• Mai exista si alte opțiuni pentru directiva
FRAMESET Pentru aceasta se poate consulta o
FRAMESET.
documentație detaliată de HTML.
• S
Scopull llecției
ți i este
t ddoar o ttrecere îîn revistă
i tă a
limbajului HTML.
XML

eXtensible Markup Language


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML şi XML
XML = eXtensible Markup Language

HTML este t folosit


f l it pentru
t XML estet folosit
f l it pentru
t
formatarea textului a.î. acesta să formatarea datelor a.î. să fie
fie afişat utilizatorilor procesate de calculatoare
HTML descrie atât structura (e.g. XML descrie doar conţinut sau
<p> <h2>,
<p>, <h2> <em>) cât şi aparenţa “ l” textului
“sensul” t t l i
(e.g. <br>, <font>, <i>)

HTML foloseşte un set fix, În XML se folosesc propriile


nemodificabil
difi bil de
d tag-urii tag uri fără constrângeri
tag-uri,

Curs Programare Web, anul 4 C5 – Curs 7 3


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML ş
şi XML
• HTML şi XML arată similar deoarece ambele sunt
limbaje SGML (Standard Generalized Markup
Language)
– Atât HTML cât şi XML folosesc elemente încadrate de
tag-uri (e.g. <body>This is an element</body>)
– În ambele cazuri tag-urile pot avea atribute (e.g.,
<font face="Verdana" size="1" color="red">)
– Ambele folosesc entităţi interpretabile (&lt;, &gt;,
&amp;, &quot;, &apos;)
• Mai
M i exact,
t
– HTML este definit în SGML
– XML este un subset (restrâns) al SGML
Curs Programare Web, anul 4 C5 – Curs 7 4
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML ş
şi XML
• HTML este adresat oamenilor
– HTML descrie pagini web
– Oamenii nu doresc să vadă mesaje de eroare despre
paginile vizitate
vizitate…
• Browserele ignoră şi/sau corectează atâtea erori HTML cât se
poate
• XML este folosit de calculatoare
– XML descrie date
– Regulile sunt stricte şi nu sunt permise erori
• Din acest punct de vedere XML seamană cu un limbaj de
programare
– Versiunile curente ale majorităţii browserelor pot afişa
XML
• Totuşi suportul browserelor pentru XML e destul de redus
Curs Programare Web, anul 4 C5 – Curs 7 5
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tehnologii
e o og înrudite
ud te XML
• DTD (Document Type Definition) şi XML Schemas sunt
folosite pentru definirea tag
tag-urilor
urilor legale XML şi a
atributelor acestora pentru scopuri particulare (meta-
descrieri))

• CSS (Cascading Style Sheets) descrie cum sunt afişate


HTML şi XML în browser

• XSLT (eXtensible Stylesheet Language Transformations)


şi XPath sunt folosite pentru translatarea de la o formă de
XML la o alta

• DOM (Document Object Model), SAX (Simple API for


XML) și JAXP (Java API for XML Processing) sunt API
API-uri
uri
pentru parsare XML
Curs Programare Web, anul 4 C5 – Curs 7 6
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu de document XML

<?xml version="1.0"?>
<weatherReport>
<date>7/14/97</date>
d t 7/14/97 /d t
<city>North Place</city>, <state>NX</state>
<country>USA</country>
High Temp: <high scale="F">103</high>
Low Temp: <low scale="F">70</low>
Morning: <morning>Partly cloudy, Hazy</morning>
Afternoon: <afternoon>Sunny &amp; hot</afternoon>
E
Evening:
i g <evening>Clear
i g Cl anddCCooler</evening>
l / i g
</weatherReport>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Structura
St uctu a
• Un document XML poate începe cu una
sau mai multe instrucţiuni de procesare
((PIs)) sau directive:
<?xml version="1.0"?>
<?xml-stylesheet type="text/css"
href="ss.css"?>
• După
p directivă trebuie să existe exact un
singur tag, numit elementul root, ce conţine
estu docu
restul documentului
e tu u XML:
<weatherReport>
...
</weatherReport>
Curs Programare Web, anul 4 C5 – Curs 7 8
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Elementele
e e te e XML
• Un document XML mai este construit din:
– elemente: high în <high scale="F">103</high>
tag uri în perechi: <high scale=
– tag-uri, scale="F">103</high>
F >103</high>
– atribute: <high scale="F">103</high>
– entităţi: <afternoon>Sunny &amp; hot</afternoon>
– date de tipp caractere ce ppot fi:
• parsate (procesate ca XML)—modalitatea default
• neparsate
p ((toate caractere sunt de sine stătătoare))
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Elemente
Element
e e te
te ş
şi atribute
at bute
• Atributele şi elementele sunt parțial interschimbabile
• Exemplu folosind doar elemente:
<name>
<first>David</first>
<last>Matuszek</last>
</name>
• Exemplu folosind atribute:
<name first="David" last="Matuszek"></name>
• Atributele conţin adesea şi metadate, precum ID-uri unice
• În g
general browserele afişează
ş doar elemente ((valori
închise de tag-uri), nu și tag-uri şi atribute

Curs Programare Web, anul 4 C5 – Curs 7 10


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

XML b
bine
e format
o at
• Orice elemente trebuie să aibă atât un tag de start, cât şi
un tag de terminare e g : <name> ... </name>
terminare, e.g.:
– Dar elementele goale pot fi abreviate: <break />.
– Tag-urile XML sunt case sensitive
– Tag-urile XML nu pot începe cu literele xml
• Elementele trebuie să fie corect imbricate, e.g. nu
<b><i>bold and italic</b></i>
• Orice document XML trebuie să aibă unul şi numai un
element root
• Valorile atributelor trebuie să fie încadrate de ghilimele
sau apostroafe, e.g. <time unit="days">
• Datele
D t l caracter ţi < sau &
t nu pott conţine
Curs Programare Web, anul 4 C5 – Curs 7 11
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
e p u de document
docu e t b
bine
e format
o at
<novel>
<foreword>
<paragraph>
This is the great American novel.
</paragraph>
/ h
</foreword>
<chapter number=
number="1">
1 >
<paragraph>
It was a dark and stormy night.
</paragraph>
<paragraph>
S dd l a shot
Suddenly, h t rang out!
t!
</paragraph>
</chapter>
</novel>
Curs Programare Web, anul 4 C5 – Curs 7 12
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

XML ca un arbore
• Un document XML reprezintă o ierarhie, poate fi
reprezentat
t t ca un arbore:
b

novel

foreword chapter
number="1"

paragraph paragraph paragraph

This is the great It was a dark Suddenly, a shot


American novel. and stormy night. rang out!

Curs Programare Web, anul 4 C5 – Curs 7 13


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

XML Valid
a d
• Puteţi crea propriile tag-uri şi atribute XML, dar...
– ...orice program ce foloseşte XML
XML-ul
ul trebuie să ştie la ce să se
aştepte!
• Un DTD (Document Type Definition) defineşte ce tag-uri
sunt legale şi unde pot acestea apărea în cadrul
documentului XML
– Un document XML nu necesită un DTD
• XML este bine structurat dacă respecta regulile amintite
anterior…
• În
Î plus, un XML este valid dacă specifică un DTD şi este
conform cu respectivul DTD
• Un DTD poate fi inclus în XML,
XML dar tipic se foloseşte ca
document separat
• Erorile dintr-un document XML vor opri
p p programele
g XML
• Alternative la DTD-uri sunt XML Schemas şi RELAX NG
Curs Programare Web, anul 4 C5 – Curs 7 14
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Putem să ne
imaginăm o
modalitate de
reprezentare
t a unor
rețete de bucătărie, pe
baza unor documente
XML:

Curs Programare Web, anul 4 C5 – Curs 7 15


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• O versiune XML a unei colecții de astfel de rețete este formată din:
– Rețetele conțin listă de ingrediente, pașii pentru pregătire, posibil comentarii și o
specificație
p ț a valorilor nutritive
– Un ingredient poate fi simplu sau compus
– Un ingredient simplu are un
<?xml version="1.0" encoding="UTF-8"?>
nume,, o cantitate (p(posibil <collection>
chiar nespecificată) și o <description>
unitate de măsură (totuși Some recipes used for the XML lesson.
</description>
sunt și cazuri când nu se <recipe>
specifică și unitate) <title>Beef Parmesan with Garlic Angel Hair Pasta</title>
<ingredient name="beef cube steak" amount="1.5" unit="pound"/>
– Un ingredient compus este ...
specificat recursiv ca o <preparation>
rețetă având ingrediente și <step>
Preheat oven to 350 degrees F (175 degrees C).
modalitate de pregătire </step>
...
• Un exemplu de document </preparation>
XML ce specifică cinci <comment>
comment
Make the meat ahead of time, and refrigerate over night, the acid in
astfel de rețete: the tomato sauce will tenderize the meat even more. If you do this,
save the mozzarella till the last minute.
</comment>
<nutrition calories="1167"
calories= 1167 fat=
fat="23"
23 carbohydrates=
carbohydrates="45"
45 protein=
protein="32"/>
32 />
</recipe>
...
</collection>
Curs Programare Web, anul 4 C5 – Curs 7 16
Exemplu
• Un exemplu de document <!ELEMENT collection (description,recipe*)>

DTD pentru rețetele <!ELEMENT


!ELE EN description
d ANY>
N

noastre arată astfel: <!ELEMENT recipe


(title,ingredient*,preparation,comment?,nutrition)>
• Prin inserarea:
<!ELEMENT title (#PCDATA)>
<!DOCTYPE collection SYSTEM "recipes.dtd">
<!ELEMENT ingredient (ingredient*,preparation)?>
<!ATTLIST ingredient name CDATA #REQUIRED
specificăm că dorim că amount CDATA #IMPLIED
unit CDATA #IMPLIED>
documentul nostru ce
<!ELEMENT preparation (step*)>
conține rețete trebuie să
<!ELEMENT
!ELEMENT step
t (#PCDATA)
(#PCDATA)>
fie conform cu acest DTD
<!ELEMENT comment (#PCDATA)>
• Putem defini și local <!ELEMENT nutrition EMPTY>
regulile
lil DTD cu: <!ATTLIST nutrition protein CDATA #REQUIRED
carbohydrates CDATA #REQUIRED
<!DOCTYPE collection [ ... ]> fat CDATA #REQUIRED
calories CDATA #REQUIRED
alcohol CDATA #IMPLIED>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Scop XML
• XML este proiectat pentru a fi procesat de către
programele software, nu pentru a afişa date
• Totuşi aproape toate browserele pot afişa
documente XML
– Ele nu vor fi afişate în aceeaşi manieră
– Nu vor fi afişate deloc dacă conţin erori
• Atenție:
HTML este p
proiectat p
pentru a fi vizualizat,,
XML este proiectat pentru a fi folosit
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Standarde
Sta da de e
extinse
t se de docu
documente
e te
• Puteţi să vă definiţi propriile tag-uri XML, dar există
seturi
t id deja
j di
disponibile:
ibil
– XHTML: HTML redefinit pentru XML
– SMIL: Synchronized Multimedia Integration Language
– MathML: Mathematical Markup Language
– SVG: Scalable Vector Graphics
– DrawML: Drawing MetaLanguage
– ICE: Information and Content Exchange
– ebXML: Electronic Business with XML
– cxml: Commerce XML
– CBL: Common Business Library
– …
Curs Programare Web, anul 4 C5 – Curs 7 19
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

XHTML

http://www.w3schools.com/xhtml/
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Cuvânt Înainte: Origini

Curs Programare Web, anul 4 C5 – Curs 7 21


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Origini
• HTML dezvoltat de Tim Berners-Lee în 1989
– O modalitate de accesare a bazei de date ENQUIRE peste Internet
– Rezultatul a devenit World Wide Web
• HTML-ul a fost definit ca o aplicație a SGML,
– standardul ISO oferea suport pentru documente structurate
• Pentru a face din HTML un standard, Berners-Lee avea
nevoie
i dde o iimplementare
l t reală
lă a uneii aplicații
li ții care să
ă
suporte astfel de documente
– S-a
S a oprit la Mosaic – un browser a cărui finanțare era suportată de
congresman-ul Al Gore
• HTML devine suportat de AOL, CompuServe, MSN, etc.
– Open-standard și având în spate investiții critice suportate de
guvernul USA
– Amenințare la adresa supremației Microsoft*
*http://www.roughlydrafted.com/RD/RDM.Tech.Q2.07/12C0979F-82C7-4952-898A-55051A2D3897.html
Curs Programare Web, anul 4 C5 – Curs 7 22
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Origini
g
• Când standardul devine popular, se pune problema
controlului asupra
p acestuia:
– IETF formează HTML Working Group cu scopul de a începe lucrul
la HTML 2.0
– Berners-Lee
B L crează ăWWorldld Wid
Wide W
WebbCConsortium
ti (W3C) – scop:
promovarea tehnologii Web
– IETF reușește
ș ș să scoată standardul HTML 2.0 în 1995,, totușiș în
1996 controlul revine în întregime către W3C
• HTML 2.0
– Integrarea extensiilor pe care dezvoltatorii de browsere le
încorporase ad-hoc pentru diverse funcționalități
• HTML 3
3.0
0
– În 1995, W3C scoate HTML 3.0 ca o modalitate de formalizare a
unor funcții precum suportul pentru documente științifice și
matematice
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Origini
• Războiul dezvoltatorilor de browsere continuă
– Fiecare vendor propune funcții noi
noi, ne-standadizate
ne-standadizate, în încercarea
de a acumula segmente din piața nouă în continuă expansiune:
– Microsoft reușește să scoată 3 versiuni stabile într-un singur an
(1996) a IE, într-o încercare de a lega viitorul Web-ului de platforma
Windows
• IE 3.0 vine cu suport
p p pentru ActiveX,, tehnologia
g de contrucție
ț a unor
controale bogate (dar care rulează doar pe Windows)
– Netscape vine cu propria implementare de ActiveX și adaugă
limbajul de scripting JavaScript
• IE nu se lasă mai prejos și propune Jscript
• În încercarea de a învinge
învinge, apar dispute cu privire la ce
și cum ar trebui standardizat în HTML:
– Netscape propune tag-ul
tag ul BLINK
– Microsoft vine cu MARQUEE
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Origini
• Mediatorul e tot W3C
– În standard nu intră nici BLINK
BLINK, nici MARQUEE
– Suportul pentru prezentare din Netscape e deprecated – în loc se
propune folosirea CSS ca formă de separare a elementelor HTML de
cele de formatare/stil
• HTML 4.0 lansat în 1997 (HTML 4.01 în 1999)
– P
Pe lângă
lâ ă separare conținut
ți t de
d prezentare,
t HTML 4 standadizează
t d di ă șii
elementele de limbaj JavaScript și modalitatea de acces cu
documentul pe baza DOM
• W3C a decis și să conducă HTML 4 într-o nouă direcție:
– În loc să fie o formă de SGML, noua specificație conduce HTML
î
înspre strictețea
t i t ț XML:
XML
• Documentele HTML ar putea fi astfel mai ușor procesate de motoare XML
• HTML-ul devine în același timp deschis, în loc de a complica structura
standardului,
t d d l i utilizatorul
tili t l ar putea
t venii cu ttag-urii d
definite
fi it îîntr-o
t bibli t ă externă
bibliotecă t ă
pentru reprezentări particulare (e.g., pentru matematică se poate folosi MathML)
Curs Programare Web, anul 4 C5 – Curs 7 25
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Dar la noi?
• www.pub.ro – a apărut în 1997, conținea
elemente minimale de HTML 3 3.2
2

Curs Programare Web, anul 4 C5 – Curs 7 27


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML 4
• HTML 4 extinde HTML cu mecanisme adecvate
pentru:*
t *
– Elemente de style sheet,
– Limbaje de scripting,
– Frame-uri,,
– Obiecte embedded,
– Suport îmbunătățit pentru text reprezentat de la
dreapta la stânga
– Elemente mai bogate de prezentare a tabelelor
– Îmbunătățiri pentru reprezentarea formularelor, oferirea
de suport
p p pentru p
persoane cu disabilități.
ț
*http://www.w3.org/TR/1999/REC-html401-19991224/intro/intro.html#h-2.3
Curs Programare Web, anul 4 C5 – Curs 7 28
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ce este XHTML?
• XHTML = Extensible Hypertext Markup
Language
– XHTML urmăreşte
ş să înlocuiască HTML
– XHTML este aproape identic cu HTML 4.01
– XHTML este o versiune mai strictă şi mai
curată a HTML
– XHTML este HTML redefinit ca o aplicaţie XML
– XHTML este o “punte” între HTML şi XML
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Problema
ob e a cu HTML
• HTML a fost conceput ca o modalitate de a
descrie structura unui document, cu tag-uri
pentru a indica headere, paragrafe, etc.
• Apare nevoia de control asupra aparenţei
documentelor motiv pentru care HTML a fost
documentelor,
îmbogăţit cu tag-uri pentru controlul font-urilor,
aliniatelor etc.
aliniatelor, etc

Curs Programare Web, anul 4 C5 – Curs 7 30


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML vs. XML


XML arată mult ca HTML, dar:
HTML foloseşte un set fix de În XML puteţi folosi propriile
tag-uri
g tag-uri
g (şi defini ce reprezintă
(ş p ele
într-un document separat)
HTML este proiectat pentru XML este proiectat pentru
afişarea datelor în formă descrierea datelor pentru
umană computere
p
Browser-ele sunt foarte Documentele XML trebuie să fie
tolerante cu erorile în bine formate ((corect sintactic))
HTML
Toate browserele ppot afişa
ş Toate browserele moderne afişează
ş
HTML XML, dar în diverse moduri
Curs Programare Web, anul 4 C5 – Curs 7 31
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Codificarea
Cod ca ea docu
documentelor
e te o XML
• Un document XML începe cu o declaraţie:
<?xml version='1.0' encoding='utf-8'?>

• Forma arborescentă:
– Există exact un element rădăcină
– Elementele sunt conținute unele în altele, formând o
ierarhie arborescentă
<person>
<firstname>Ion</firstname>
<lastname>Popescu</lastname>
<age>30</age>
<ssn>2711130345678</ssn>
</person>
Curs Programare Web, anul 4 C5 – Curs 7 32
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Documente
ocu e te XML bine
b e formate
o ate
• Reminder: document XML “bine format” = un
document corect din punctul de vedere al regulilor
sintactice generale XML:
– are exact un element rădăcină
– fiecare element are un tag de sfârşit
– elementele sunt imbricate corect
– valorile atributelor sunt între ghilimele
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Documente XML: Valide


XML Schema
S h
• Document XML “Valid”: un document care respectă reguli
impuse structurii
• Metode de specificare formală a structurii unui document
XML:
– XML DTD (Data Type Definition):
– XML Schema (XSD): un limbaj ce impune constrângeri asupra
structurii documentelor XML
• Pentru o clasă de documente XML se pot impune reguli
privitoare la:
p
– Ce tag-uri sunt permise, în ce ordine pot sa apară, de câte ori, ce
atribute pot să aibă, de ce tipuri, etc.
• Parserele XML cu validare verifică respectarea
constrângerilor impuse de o schemă specificată
• XML Schema Tutorial:
http://www.w3schools.com/schema/default.asp
Curs Programare Web, anul 4 C5 – Curs 7 34
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu - XML Schema


• Pentru reprezentarea unui set de puncte în plan se
stabilesc următoarele reguli:
– Elementul rădăcină este dots
<xs:element
l t name="dots">
"d t "
– Acesta poate conţine un număr oarecare de elemente de
tip dot - este un tip complex pentru că el conţine și alte
elemente
<xs:complexType>
– Conţine o secvenţă de alte elemente
<xs:sequence>
– Fiecare element dot are 2 atribute, x şi y, cu valori întregi
<xs:attribute name="x" type="xs:integer" />
Curs Programare Web, anul 4 C5 – Curs 7 35
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu XML Schema


dots.xsd
<?xml
? l version="1.0"?>
i "1 0"?
<xs:schema xmlns:xs=http://www.w3.org/2001/XMLSchema>
<xs:element name="dots">
< s comple T pe>
<xs:complexType>
<xs:sequence>
<xs:element name="dot" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="x" type="xs:integer" use="required"/>
<xs:attribute name="y" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
/xs:complexType
</xs:element>
</xs:schema>

Curs Programare Web, anul 4 C5 – Curs 7


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
Exemplu:: document XML cu schema

dots xml
dots.xml
<?xml version="1.0" encoding="UTF-8" ?>
<dots xmlns:xsi=
xmlns:xsi="http://www
http://www.w3.org/2001/XMLSchema-instance
w3 org/2001/XMLSchema instance"
xsi:noNamespaceSchemaLocation="dots.xsd">>
<dot x="32" y="100" />
<dot x="17"
x= 17 y=
y="14"
14 />
<dot x="18" y="58" > </dot>
</dots>

Curs Programare Web, anul 4 C5 – Curs 7


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

De
e la
a HTML la
a XHTML,, I
• Elementele XHTML trebuie să fie corect imbricate
<b><i>bold and italic</b></i> este greşit
• Documentele XHTML trebuie să fie bine formate
<html>
<head> ... </head>
<body> ... </body>
</html>
• Numele de tag-uri trebuie să fie lowercase
• Toate elementele XHTML trebuie să fie închise
– Dacă un tag HTML nu este un container el se închide:
<br />, <hr />, <img src="smile.gif" />

Curs Programare Web, anul 4 C5 – Curs 7 38


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

De
e la
a HTML la
a XHTML,, II
• Numele de atribute trebuie să fie lower case
– Exemplu: <table width=
width="100%">
100% >
• Valorile atributelor trebuie să fie încadrate de “
– Exemplu: <table width=
width "100%">
100% >
• Minimizarea atributelor este interzisă
– E l <frame
Exemplu: f noresize="noresize">,
i " i "
nu poate fi abreviată prin <frame noresize>
• Atributul id înlocuieşte atributul name
– Greşit: <img src="picture.gif" name="picture1" />
– Corect: <img
img src
src="picture.gif"
picture.gif id
id="picture1"
picture1 //>
– Cel mai bine:
<img
g src="picture.gif"
p g name="picture1"
p id="picture1"
p />

Curs Programare Web, anul 4 C5 – Curs 7 39


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

XHTML ș
și DTD-
DTD-u
uri
• HTML, XHTML, XML şi multe alte limbaje de
markup ce suportă DTD-uri
• DTD ((“Document Type yp Definition”)) descrie
sintaxa ce trebuie folosită pentru un anumit
document,, folosirea unui DTD fiind o regulăg în
cazul documentelor XHTML
• Există trei tipuri diferite de DTD
DTD-uri
uri pentru
XHTML — puteţi lucra cu oricare
– Ele sunt publice pe web
– Documentul XHTML trebuie să înceapă cu o referinţă
la unul dintre aceste DTD
DTD-uri
uri

Curs Programare Web, anul 4 C5 – Curs 7 40


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Declaraţia
ţ DOCTYPE
• Orice document XHTML trebuie să înceapă cu o
d l ţi DOCTYPE (ce
declaraţie ( specifică
ifi ă DTD-ul
DTD l curentt
folosit):

1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"


p g
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN"


p g
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

Curs Programare Web, anul 4 C5 – Curs 7 41


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Declaraţia
ţ DOCTYPE
• Cele trei tipuri de DTD-uri sunt:
– Strict
• Specifică că documentul XHTML e “curat”, el nu conține informaţii
de afişare (precum cele legate de font, culoare sau dimensiune).
• Stilul acesta e folosit în conjuncție cu un CSS dacă se doreşte
definirea totuși a felului în care trebuie să arate reprezentarea
documentului.
documentului
– Transitional
• Folosit cu HTML standard şi/sau cu CSS.
• Permite introducerea de elemente HTML “depricated” (tag-uri
<center>, <embed>, <font>, <i>, <u> sau atribute <align>,
<background> <color>,
<background>, <color> <height>
<height>, <size>
<size>, etc).
etc)
– Frameset
• Folosit dacă documentul include frame-uri HTML

Curs Programare Web, anul 4 C5 – Curs 7 42


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu de document XHTML


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0
Strict//EN" "http://www
Strict//EN http://www.w3.org/TR/xhtml1/DTD/xhtml1-
w3 org/TR/xhtml1/DTD/xhtml1
strict.dtd">
<html>
m
<head>
<title>A
title A simple document
document</title>
/title
</head>
<body>
<p>A simple paragraph.</p>
</body>
</html>

Curs Programare Web, anul 4 C5 – Curs 7 43


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Instrumente
st u e te ut
utile…
e
• Dave Raggett's HTML TIDY
– http://www.w3.org/People/Raggett/tidy/
– este un instrument free UNIX pentru verificarea şi
curăţarea paginilor HTML
• W3C HTML Validation Tool
– http://validator.w3.org/
– este un formular HTML pentru
p verificarea ((dar nu şşi
corectarea) documentelor HTML şi XHTML

Curs Programare Web, anul 4 C5 – Curs 7 44


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

• SGML: Standard Generalized Markup


p
Language
– HTML: Hypertext Markup Language
– XHTML: eXtensible Hypertext Markup Language
– XML: eXtensible Markup Language
• DTD:
DTD Document
D T
Type D fi i i
Definition
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CSS

(Cascading Style Sheet )


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Problema
ob e a cu HTML
• HTML a fost de la început conceput pentru a descrie
conținutul unui document
• Autorii de pagini web nu aveau nevoie să descrie layout-ul --
browserul avea g grijă
j de acest aspect
• Aceasta reprezintă o abordare inginerească corectă, însă
nu satisface nevoile stiliștilor și “artiștilor”
– O
Oameniiii ce aveau nevoie
i sa spună ă maii multe
lt simțeau
i ț nevoia
i unuii
control mai bun al modului de prezentare a propriilor pagini Web
• Ca rezultat,, HTML a început
p să încorporeze
p din ce în ce mai
multe tag-uri folosite pentru controlul afișării
– Conținutul și modul de afișare al informaților au devenit din ce în ce
mai mult interconectate
– Browsere diferite afișează totuși lucrurile în moduri diferite, ceea ce
reprezintă o problemă reală atunci când modul de prezentare al
informațiilor e chiar mai important decât informația propriu
propriu-zisă
zisă

Curs Programare Web, anul 4 C5 – Curs 7 48


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Cascading
g Style
y Sheets
• Cascading Style Sheet (CSS) este o modalitate de
separare a elementelor de prezentare de elementele de
date
– Practic modul de prezentare al unei pagini HTML se poate descrie
mai curat, într-un document separat, rezultând în independență între
formă și conținut
• CSS are câteva avantaje:
– Permite separarea conținutului de prezentare
– Permite definirea prezentării și a layout-ului
layout ului tuturor paginilor dintr-un
dintr un
site Web, într-o manieră unitară, printr-o construcție unică
– Poate fi folosit atât împreună cu pagini HTML, cât și cu cele XML
• În
Î opinia criticilor, totuși CSS are dezavantaje:
– Unele browsere mai vechi nu îl suportă în totalitate
– În
Î funcție
f ți de
d di
dimensiune,
i d
documentele
t l CSS externe
t pott crește
t
timpul de încărcare a paginilor
Curs Programare Web, anul 4 C5 – Curs 7 49
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Sintaxa
S ta a CSS
• Sintaxa CSS este compusă dintr-o listă de selectori (pentru
alegerea tag-urilor)
tag urilor) și descriptori (pentru a specifica ce
dorim să facem cu respectivele tag-uri):
– Exemplu:
p
h1 {color: green; font-family: Verdana} specifică că orice text
inclus în tag-uri h1 (HTML heading level 1) trebuie afișat folosind
font de tip Verdana și colorat în verde
• Un fișier CSS reprezintă o listă de astfel de perechi
se ecto /desc pto
selector/descriptor
– Selectorii pot fi simple tag-uri HTML sau XML
– CSS ppermite de asemenea definirea altor moduri de combinare a
tag-urilor
– Descriptorii sunt definiți chiar în CSS

Curs Programare Web, anul 4 C5 – Curs 7 50


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Sintaxa
S ta a CSS
• Sintaxa generala este:
l t { property:
selector t valuel }
– sau
selector,, ...,, selector {
property: value;
...
property: value
}
– unde
• selector reprezintă tag-ul
tag ul afectat de stil (selectorul este case-
case
sensitive dacă și numai dacă limbajul de descriere a
documentului este case-sensitive).
• property și value descriu modul de afișare al respectivului tag tag.
• Spațiile după virgule și punct si virgule sunt opționale.
• Un punct și virgulă trebuie să fie folosit între perechi
property:value,
t l d d
dar dupăă ultima
lti pereche
h punctt șii virgulă
i lă
devine caracter opțional.
Curs Programare Web, anul 4 C5 – Curs 7 51
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
e p u de CSS
/* Acesta este un comentariu */
h1 h2 h3 {font-family: Arial
h1,h2,h3 Arial, sans-serif;} /
/*folosește
folosește primul font disponibil */
/
p, table, li, address { /* se aplică tuturor acestor tag-uri */
font-family: "Courier New"; /* valoare încadrată între ghilimele ce conţine
spaţii */
/
margin-left: 15pt; /* indentare */
}
p, li, th, td {font-size: 80%;} /* 80% din dimensiunea elemenului ce îl
conţine
ţi */
th {background-color:#FAEBD7} /* culorile pot fi specificate în hexa */
bodyy { background-color:
g #ffffff;}
;}
h1,h2,h3,hr {color:saddlebrown;} /* se adaugă elementelor specificate */
a:link {color:darkred} /* un link ne-vizitat */
a:visited {color:darkred} /* un link vizitat */
a:active {color:red} /* un link deja vizitat */
a:hover {color:red} /* atunci când mouse
/ mouse-ul
ul trece deasupra elementului */
/

Curs Programare Web, anul 4 C5 – Curs 7 52


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Selectori
• Un tag XML sau HTML poate fi folosit ca un simplu
element selector:
body { background-color: #ffffff }
• Putem însă folosi și selectori multipli:
em i {color: red}
em,
Putem repeta selectorii:
h1, h2, h3 {font-family: Verdana; color: red}
h1 h3 {font
h1, {font-weight:
weight: bold; color: pink}
• Atunci când valorile nu coincid, ultima declarație suprascrie
declarațiile anterioare
• Selectorul universal * se aplică oricărui și tuturor
elementelor:
* {color: blue}
• Atunci când valorile nu coincid, selectorii mai specifici suprascriu
comportamentul selectorilor mai generali (deci elementele em vor fi
în continuare roșii)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu de suprascriere

Curs Programare Web, anul 4 C5 – Curs 7 54


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Selectori
• Un selector descendent alege un tag având un element
ancestor corespunzător:
p code { color: brown }
– selectează code doar dacă este folosit în interiorul unui paragraf
• Un selector copil > alege un tag având un părinte
corespunzător:
h3 > em { font-weight:
font weight: bold }
selectează un em doar dacă părintele imediat este h3
• Un selector adiacent alege un element ce imediat urmează
altuia:
b + i { font-size: 8pt }
Exemplu: <b>I
<b>I'm
m bold and</b> <i>I
<i>I'm
m italic</i>
Rezultatul va arata astfel: I'm bold and I'm italic

Curs Programare Web, anul 4 C5 – Curs 7 55


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Selectori
Se ecto
• Un selector simplu de atribut permite alegerea
elementelor
l t l ce au un anumit it atribut,
t ib t iindiferent
dif tdde
valoarea acestuia:
– Sintaxa: element[atribut] { ... }
– Exemplu: table[border] { ... }
• Un selector de atribut valoare permite alegerea
elementelor ce au un anumit atribut având o
anumită valoare:
[
– Sintaxa: element[atribut="valoare"]] { ... }
– Exemplu: table[border="0"] { ... }
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Valori
ao
• Sintaxa unei reguli CSS este:
selector, ..., selector { property: value; . . . property:
selector
value }
• Valoarea este orice apare între două puncte și
punct și virgulă (sau acoladă)
• Exemple:
– * {font-family: Trebuchet, Verdana, sans-serif;}
• Aceasta înseamnă ca trebuie folosit font Trebuchet p pentru orice,, dacă
este disponibil; altfel, se folosește font Verdana, dacă este disponibil;
altfel folosește orice font sans serif pe care browserul îl are instalat.
– sect
section
o {border:
{bo de : thin
t solid
sol d blue;}
• Aceasta înseamnă că trebuie pus un border în jurul elementelor
section; acesta trebuie să fie subțire și solidă și albastră
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Atributul
t butu c class
ass
• Atributul class permite definirea mai multor stiluri
diferite pentru un același element:
– În fișierul de “style sheet”:
p.important {font-size: 24pt; color: red}
p.fineprint {font-size: 8pt}
– În
Î documentul HTML:
<p class="important">The end is nigh!</p>
<p class=
class="fineprint">Offer
fineprint >Offer ends 1/1/97.</p>
1/1/97 </p>
• Pentru definirea unui selector ce se aplică
oricărui element având o anumită clasă se omite
numele tag-ului (dar se păstrează punctul):
.fineprint
fi i t {font-size:
{f t i 8
8pt}
t}
Curs Programare Web, anul 4 C5 – Curs 7 58
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Atributul
t butu idd
• Atributul id este definit similar atributului class,
dar folosește # in loc de .
– În fișierul
ș style
y sheet:
p#important {font-style: italic} sau
# important {font-style: italic}
– În documentul HTML:
<p id="important">
• class și id pot fi ambele folosite și nu e obligatoriu
să aibă nume diferite:
<p class="important" id="important">
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

div și span
• div și span sunt elemente HTML ce au ca scop
introducerea de informații de prezentare a
elementelor pe baza regulilor CSS
• div asigură existența unei linii noi înainte și după
(similar unui paragraf); span nu
• Exemplu:
– CSS:
div {background
{background-color:
color: #66FFFF}
span.color {color: red}
– HTML:
<div>This div is treated like a paragraph, but <span
class="color">this span</span> is not.</div>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultat:
<html xmlns="http://www.w3.org/1999/xhtml">
p g
<head>

<link REL="STYLESHEET" TYPE="text/css"


HREF="stil.css"/>

</head>

<body>

T xt inainte.
Text i i t

<div>This div is treated like a paragraph, but <span


class="color">this span</span> is not.</div>

Text dupa.

</body>

</html>
/html
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alt exemplu
• Elementele <div> sunt cel mai adesea folosite
pentru poziționare:
#container
#c nt in {
position: relative
}

#navigation {
position: absolute;
left: 30px;
top: 5px
}

<div id="container"><div id="navigation">Text</div></div>

Curs Programare Web, anul 4 C5 – Curs 7 62


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Folosirea
o os ea elementelor
e e e te o CSS
Sunt trei moduri de folosire a unui CSS:
1. Style
S sheet extern
– Elementele CSS sunt specificate într-un document
extern
– Se poate folosi atât pentru HTML, cât și pentru XML
– Toate elementele CSS pot fi folosite
2. Style sheet embedded
– Se aplică doar pentru HTML, nu și pentru XML
– Toate elementele CSS pot fi folosite
3. Stiluri inline
– Se aplică doar pentru HTML, nu și pentru XML
– Formă limitată de sintaxă CSS
Curs Programare Web, anul 4 C5 – Curs 7 63
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

External style
y sheet
• Toate elementele CSS se definesc într-un fișier
extern…
t

• Pentru a folosi elementele definite în fișierul


extern, se adaugă în HTML, în interiorul
t l i <head>
elementului
l h d sintaxa:
i t
<link REL="STYLESHEET" TYPE="text/css" HREF="Style
Sheet URL
URL">>

• Sau în p
prologul
g unui document XML se p
poate
adăuga sintaxa:
<?xml-stylesheet href="Style Sheet URL"
t
type="text/css"?>
"t t/ "?
Curs Programare Web, anul 4 C5 – Curs 7 64
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Embedded
bedded sty
style
essheet
eet
• Elementele CSS se definesc în interiorul
documentului HTML, în interiorul elementului
<head>:
<style TYPE="text/css">
<!--
CSS Style Sheet
-->
</style>
/style
• Notă: Încapsularea style sheet-ului într-un
comentariu reprezintă un artificiu de ascundere a
informației de browsere mai vechi ce nu înțeleg
sintaxa CSS
CSS.
Curs Programare Web, anul 4 C5 – Curs 7 65
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Inline
e sty
style
essheet
eet
• Atributul STYLE poate fi adăugat oricărui element
HTML:
<html-tag STYLE="property: value"> sau
<html-tag STYLE="property: value;
property: value; ...; property: value">
• Avantaj:
– Folositor dacă dorim doar o mică modificare de stil
• Dezavantaje:
– Mix de informații de prezentare în cadrul HTML
– Ascunde și îngreunează vizibilitatea codului HTML
– Nu se pot folosi toate elementele CSS

Curs Programare Web, anul 4 C5 – Curs 7 66


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

O
Ordinea
d ea de cascada
cascadare
e
• Stilurile vor fi aplicate unui document HTML în
ordinea
di următoare:
ăt
1. Stilul implicit al browser-ului
2. External style sheet
3. Internal style
y sheet ((în interiorul tag-ului
g <head>))
4. Inline style (în interiorul altor elemente, cele mai din afară
mai întâi)
• Când elementele de stil ajung să fie în conflict, cel
mai “apropiat”
p p ((mai recent aplicat)
p ) stil câștigă
ș g

Curs Programare Web, anul 4 C5 – Curs 7 67


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
e p u de ordine
o d e de cascada
cascadare
e
• External style sheet:
h3 { color: red;
text-align: left;
font-size: 8pt
}
• Internal style sheet:
h3 { text align: right;
text-align:
font-size: 20pt
}
• Atributele rezultante:
color: red;
text-align: right;
f
font-size: 20
20pt
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alt exemplu
• Considerăm documentul HTML:

<p class="pclass" id="pid"><span class="sclass" id="sid">text</span></p>

• Cazurile considerate de CSS:

span#sid { color: red; } Textul va fi afișat verde


#pid span { color: green; }

#pid { color: blue; font-size: 10px; }


#pid
p span
p { color: red !important;}
p Cum va fi afișat textul?
p #sid { color: green; font-size: 150%; }

Răspuns:
Textul va fi afișat roșu cu dimensiunea 15px
((font-size:
o s e 10px,
0p , co
combinat
b a cu font-size:
o s e 150%
50% => 10
0 x 1.5
5 = 15px)
5p )

Curs Programare Web, anul 4 C5 – Curs 7 69


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Un exemplu XML
<?xml version="1.0" standalone="no"?>
<!DOCTYPE novel SYSTEM "novel.dtd">
<?xml-stylesheet
l l h h f
href="styles.css"
l type="text/css"?>
<novel>
<foreword>
<paragraph>This
h Thi iis th
the greatt A
American
i novel.</paragraph>
l / h
</foreword>
<chapter>
<paragraph>It was a dark and stormy night.</paragraph>
night </paragraph>
<paragraph>Suddenly, a shot rang out!</paragraph>
</chapter>
</novel>

chapter {font-family: "Papyrus", fantasy}


foreword > paragraph {border: solid red; padding: 10px}
novel > foreword {font-family: Impact; color: blue}
CSS::
CSS chapter {display: block}
chapter:first-letter
chapter:first letter {font
{font-size:
size: 200%; float: left}
paragraph {display: block}
chapter:before {content: "New chapter: "}
Curs Programare Web, anul 4 C5 – Curs 7 70
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Rezultatul
Rezultat afișat de Firefox 4:

Rezultat afișat de IE
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Câteva
te a p
propriet
proprietăţ
op etăţ
etăţ
ăţii şi valori
a o pentru
pe t u font
o t
• font-family:
– inherit
i h it (la
(l ffell ca ffontul
t l elementului
l t l i parent,
t moștenire)
t i )
– Verdana, "Courier New", ... (dacă fontul este instalat în browser)
– serif | sans-serif
sans serif | cursive | fantasy | monospace
(fonturi generice: browser-ul decide ce font să folosească)
• font-size:
font size:
– inherit | smaller | larger | xx-small | x-small | small | medium |
large | x-large | xx-large | 12pt
• font-weight:
– normal | bold |bolder | lighter | 100 | 200 | ... | 700
• font-style:
– normal | italic | oblique

Curs Programare Web, anul 4 C5 – Curs 7 72


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Forma prescurtată de specificare a


propriet
proprietăţ
ăţilor
ilor
• Adesea mai multe proprietăţi pot fi combinate
combinate,
acest aspect ajutând la o scriere mai rapidă a
specificațiilor de prezentare
• De exemplu, dacă considerăm construcția CSS:
h2 { font-weight: bold; font-variant: small-caps; font-
size: 12pt; line-height: 14pt; font-family: sans-serif }
• Ea poate fi scrisă sub forma prescurtată:
h2 { font: bold small
small-caps
caps 12pt/14pt sans
sans-serif
serif }
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Culori
Cu o și lungimi
u g
• color: și background-color:
– aqua | black | blue | fuchsia | gray | green | lime |
maroon | navy | olive | purple | red | silver | teal |
white
h | #FF0000
# 0000 | ##F00
00 | rgb(255,
b2 0
0, 0
0) | Alte
Al nume
recunoscute de browser (nu se recomandă)
• A
Acestea
t suntt elemente
l t folosite
f l it pentru
t unitățile
itățil dde
măsură:
– em, ex, px, %
• Dimensiunea fontului, înălțimea pe x, pixeli, procent din
dimensiunea moștenită
– in, cm, mm, pt, pc
• inci, centimetri, milimetri, puncte (1/72 dintr
dintr-un
un inch), picas (1
pica = 12 puncte), relative la valoarea moștenită
Curs Programare Web, anul 4 C5 – Curs 7 74
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Câteva
te a p
propriet
proprietăț
op etăț
etăț
ății și valori
a o pentru
pe t u text
te t
• text-align:
– left | right | center | justify
• text-decoration:
– none | underline | overline | line-through
• text
text-transform:
transform:
– none | capitalize | uppercase | lowercase
• text-indent
text indent
– length | 10% (indentarea primei linii a textului)
• white-space:
– normal | pre | nowrap
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Pseudo-
Pseudo
seudo-c
clase
ase
• Pseudo-clasele sunt elemente ale căror stare (și
mod de aparitie) poate varia în timp
• Sintaxa: element:pseudo-class {...}
– :link
• Un link ce nu a fost vizitat
– :visited
• Un link ce a fost vizitat
– :active
• Un
U lilink
k pe care tocmaii se execută
ă un click
li k
– :hover
• Un link peste care este poziționat cursorul mouse-
ului
• Pseudo-clasele sunt p
permise oriunde în cadrul
selectorilor CSS
Curs Programare Web, anul 4 C5 – Curs 7 76
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alegerea
ege ea numelor
u eo
• CSS este proiectat pentru a separa conținut de stil
– Prin urmare, numele ce sunt folosite în HTML sau (mai
ales) în XML trebuie să descrie conținut, nu stil
• Exemplu:
E l
– Să presupunem că definiți span.huge {font-size: 36pt} și
folosiți <span class="huge">
class= huge > în cadrul mai multor
documente
– Ulterior descoperiți
p ț că utilizatorii dezagrează
g stilul acesta,,
deci modificați CSS-ul în span.huge {font-color: red}
– Numele este incorect ales; încercați să îl redenumiți în
toate documentele?
doc mentele?
– Daca ați fi ales de la început span.important {font-size:
36pt} ar fi fost mai ușor de întreținut propriile documente
36pt},

Curs Programare Web, anul 4 C5 – Curs 7 77


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML 5

01.04.2010 Curs Programare Web, anul 4 C5 – Curs 6 78


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML reminder
• HTML 1.0 şi HTML+ 1990, respectiv 1993.
• HTML 2.0 - 1994, a fost prima versiune standardizată, (49
taguri).
• HTML 3 3.00 - 1995.
1995 Versiunea cuprindea extensii importante
importante,
cum ar fi marcaje pentru notaţii matematice, bannere etc.
• HTML 3.2,, - Ianuarie 1997,, este considerat ca succesorul
versiunii 2.0, incorporând o serie de taguri din HTML 3.0.
• HTML 4 - Decembrie 1997 extinde HTML cu mecanisme
pentru stylesheets,
stylesheets script
script-uri
uri, frame
frame-uri
uri, un suport mai mare şi
îmbunătăţit pentru alinierea textului, tabele mai bogate şi
îmbunatăţiri ale formularelor, oferind o accesibilitate mai mare
pentru oamenii cu deficit.
• HTML 4.01 - Decembrie 1999 este o versiune revizuită de
HTML4.0 care corecteaza unele erori si face unele schimbari in
privinta modului de functionare a unor sintaxe.
sintaxe

01.04.2010 Curs Programare Web, anul 4 C5 – Curs 6 79


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML 5
• 2004 Web Hypertext Application Working
Group (WHATWG) au inceput lucrul la noul
standard HTML

• 2004 Consortiul W3C se concentrau asupra


p
dezvoltarii XHTML 2.0 desi HTML 4.01 nu mai
fusese actualizat inca din 2000.

• 2007 Specificatiile HTML 5 ale WHATWG au


fost apoi adoptate de catre W3C ca punct de
start al noului standard HTML
HTML.
01.04.2010 Curs Programare Web, anul 4 C5 – Curs 6 80
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML 5
• HTML5 este ultima versiune HTML si XHTML.
Standardul incearca sa rezolve problemele
intalnite in versiunile anterioare HTML si se
adreseaza nevoii de APLICATII WEB, un
domeniu ce nu a fost acoperit de catre HTML
pana in acest moment.
• Desi
D i ultima
lti versiune
i HTML 5 llansata
t pe d data
t dde
22 Februarie 2012 este o „ciorna” (W3C
Working Draft),
Draft) dezvoltatorii browserelor au
inceput sa implementeze parti din
functionalitatile
u c o a a ep prezente
e e e in sstandardul
a da du HTML5. 5
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

• Performantele JavaScript.
p
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ELEMENTE SIMPLIFICATE IN
HTML5
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

DOCTYPE

<!DOCTYPE • HTML 5
html <!DOCTYPE html>
PUBLIC "-//W3C//DTD
XHTML 1.0
T
Transitional//EN„
iti l//EN
“http://www.w3.org/TR
/xhtml1/DTD/xhtml1
/xhtml1/DTD/xhtml1-
transitional.dtd">
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Radacina HTML

<html
ht l
xmlns=http://www.w3.org/1999/x
• HTML 5
html g
<html lang="en">
lang="en"
xml:lang="en">
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

CHARSET

• <meta http-equiv="Content-Type"
content="text/html; charset=utf-
8">

• HTML 5
<meta charset="utf-8">
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

STYLESHEET

• <link rel="stylesheet" href="style-


original.css" type="text/css" />

• HTML 5
<link rel="stylesheet"
href="style-original.css" />
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

ELEMENTE NOI IN HTML5


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Elementul Base
<head>
<base href=“url”
target="_blank
target blank" />
</head>
-se introduce
i d adresa
d d
de b
baza.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

El
Elemente
t semantice
ti d sectionare
de ti
• HTML 4
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Elemente semantice de
sectionare
• HTML 5
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<HEADER>

HTML 4
<div id="header">
<h1>M W
<h1>My Weblog</h1>
bl </h1>
<p class="tagline">A lot of effort went into
making this effortless.</p>
</div>

HTML 5
<header>
<h1>My Weblog</h1>
<p class="tagline">A lot of effort went
into making this effortless.</p> …
</header>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<HGROUP>
HTML 4
<h1>My Weblog</h1>
<h2>A lot of effort went into making
this effortless.</h2>

HTML 5
<header>
<hgroup>
g p
<h1>My Weblog</h1> <h2>A lot of
effort went into making this
ffortless.</h2>
</hgroup> …
</header>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu

<header>
<hgroup>
<h1><a
h1 href="/">Mini
h f "/" Mi i AApps</a></h1>
/ /h1
<h2>Web applications for iPhone, Android & other mobile platforms</h2>
</hgroup>
</header>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<FOOTER>

HTML 4
<div id="footer">
<p>&#167;</p> <p>&#169; 2001&#8211;9
<a href="#">Mark Pilgrim</a></p>
</div>

HTML 5
<footer>
<p>&#167;</p>
<p>&#169; 2001&#8211;9
<a href=
href="#">Mark
# >Mark Pilgrim</a>
</p>
</footer>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<SECTION>
SECTION
• Sectiune g
generica de aplicatie
p sau
document

<section>
<h1>Level 1</h1> <section> <h1>Level 2</h1>
<section> <h1>Level 3</h1> </section>
</section>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<ARTICLE>

HTML 4
<div class="entry">
<p class="post-date">October 22, 2009</p> <h2>
<a href="#" rel="bookmark" title="link to this
post"> Travel day </a> </h2>
</div>

HTML 5
<article>
<header>
<p class
class="post-date">October
post date >October 22
22, 2009</p>
<h1> <a href="#" rel="bookmark" title="link to
this post"> Travel day </a> </h1> </header> …
</article>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<ASIDE>
ASIDE

HTML5
<aside>
<h1>Archives</h1>
<ul>
<li><a href="/2007/09/">September 2007</a></li>
<li><a href="/2007/08/">August 2007</a></li>
<li>< h
<li><a href="/2007/07/">July
f "/2007/07/">J l 2007</
2007</a></li>
></li>
</ul>
</aside>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<NAV>

HTML 4 HTML 5
<nav>
<div id="nav">
id= nav > <ul>
< l>
<ul> <li><a
<li><a href="#">home</a></li>
<li><a
href="#">home</a></li> href="#">blog</a></li>
<li><a <li><a
href="#">blog</a></li>
# g / / href="#">gallery</a></li>
<li><a <li><a
href="#">gallery</a></li> href="#">about</a></li>
<li><a </ul>
href="#">about</a></li> </nav>
</ul>
</div>
/
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<TIME>
TIME

• <time datetime="2009-10-22"
datetime "2009 10 22" pubdate>October 22
22,
2009</time>
• <time datetime=
datetime="2009
2009-10-22T13:59:47-04:00
10 22T13:59:47 04:00" pubdate>
October 22, 2009 1:59pm EDT </time>
• <article>
<header>
<time datetime="2009-10-22" p
pubdate> October 22,, 2009 </time>
<h1> <a href="#" rel="bookmark" title="link to this post"> Travel day
</a> </h1>
</header>
/h d
<p>Lorem ipsum dolor sit amet…</p>
</article>
/ i l
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

a resolution-dependent bitmap canvas which can be


used for rendering graphs, game graphics, or other
visual images on the fly
fly.

GRAFICA IN HTML5
<CANVAS>
<CANVAS>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS

• Sintaxa:
Si t
<canvas id="a" width="300" height="225"></canvas>
• Utilizare cu JavaScript & DOM
var a_canvas = document.getElementById("a");
• Desenare
function draw_b() {
var b_canvas = document.getElementById("b");
g y ( )
var b_context = b_canvas.getContext("2d");//future 3D
b_context.fillRect(50, 25, 150, 100);

}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
Desenarea in Canvas Context:
Sunt esentiale functiile:
beginPath()
closePath()
stroke()
fill()

Proprietati:
fillStyle = (CSS color
color,pattern,gradient)
pattern gradient)
strokeStyle= (CSS color,pattern,gradient)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
• Alte functii de desenare in canvas context
o Desenare dreptunghiuri
• fillRect(x, y, width, height)
• strokeRect(x, y, width, height)
• clearRect(x, y, width, height)

o Desenare
D liliniiii
o moveTo(x, y)
o lineTo(x,
lineTo(x y)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
o Desenare arce
• arc(x, y, radius, startAngle, endAngle, anticlockwise)
(pentru cerc startAngle=0, endAngle=Math.pi*2)
• quadraticCurveTo(cp1x, cp1y, x, y)
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y)
• x,y coordonatele punctului de sfarsit
• cp1x,cp1y, cp2x,cp2y 
cp1x,cp1y, cp2x,cp2y coordonatele primului si celui de al doilea
de al doilea punct de control.
de control.

Desenarea de text
o Proprietati context:
 Context.font= {font}
 Context.textAlign={start,end,left,right,center};
 Context.textBaseline={top,hanging,middle,alphabetic,ideographic,bottom};
Context textBaseline={top hanging middle alphabetic ideographic bottom};

oFunctia de desenare
o Context.fillText(text,x,y);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
o Crearea unui gradient
g
– createLinearGradient(x0, y0, x1, y1)
– createRadialGradient(x0,
createRadialGradient(x0 y0
y0, r0
r0, x1
x1, y1
y1, r1)
• Exemple gradient:
1. var my_gradient = context.createLinearGradient(0, 0, 300, 0);
my_gradient.addColorStop(0, "black");
my_gradient.addColorStop(1, "white");
context fillStyle = my
context.fillStyle my_gradient;
gradient;
context.fillRect(0, 0, 300, 225);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
2. var my_gradient = context.createLinearGradient(0, 0, 0, 225);
y_g p
my_gradient.addColorStop(0, "black");
my_gradient.addColorStop(1, "white");
context.fillStyle = my_gradient;
context.fillRect(0, 0, 300, 225);

3. var my_gradient
_ = context.createLinearGradient(0, 0, 300, 225);
my_gradient.addColorStop(0, "black");
my_gradient.addColorStop(1, "white");
context.fillStyle = my_gradient;
context.fillRect(0, 0, 300, 225);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
o Desenarea de imagini
g
o drawImage(image, dx, dy)
o drawImage(image, dx, dy, dw, dh)
o drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
• Exemple
p desenare imagini
g
1. <img id="cat" src="images/cat.png" alt="sleeping cat" width="177"
height="113">
<canvas id="e" width="177" height="113"></canvas>
<script>
i
window.onload = function() {
var canvas = document.getElementById("e");
var context = canvas.getContext(
canvas.getContext("2d");
2d );
var cat = document.getElementById("cat"); context.drawImage(cat, 0,
0);
}; </script>
2. <canvas id="e" width="177" height="113"></canvas>
<script>
var canvas = document.getElementById("e");
var context = canvas.getContext(
canvas getContext("2d");
2d );
var cat = new Image();
cat.src = "images/cat.png"; cat.onload = function() { context.drawImage(cat,
0, 0);
}; </script>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
• Transformari
– Pentru a retine si a prelua starile “panzei” :
• Save();
• Restore();
– Starea panzei=transformari,
panzei transformari, valorile proprietatilor
strokeStyle, fillStyle, globalAlpha, lineWidth, lineCap,
lineJoin, miterLimit, shadowOffsetX, shadowOffsetY,
shadowBlur shadowColor
shadowBlur,
– Translatarea: translate(x, y)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

<CANVAS>
CANVAS
– Rotatia: rotate(angle)

– Scalarea: scale(x, y)

• Umbre
– Proprietati context:
• ShadowColor
• ShadowOffsetX
• ShadowOffsetY
• Sh d Bl
ShadowBlur
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple <CANVAS>
CANVAS
• http://html5demos.com/canvas-grad
p g
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple <CANVAS>
CANVAS
• First p
person ggifter
http://htmlfive.appspot.com/static/gifter.html

01.04.2010 Curs Programare Web, anul 4 C5 – Curs 6 114


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API VIDEO & AUDIO


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API VIDEO & AUDIO


• Continut media fara plugin
p g
• Multitudine de formate video:
• MPEG4
• FLASH VIDEO
• OGG
• AUDIO VIDEO INTERLACED
• HTML 4:
<video src="video.ogg">
j
<object data="videoplayer.swf"
p y type="application/x-shockwave-flash">
yp pp /
<param name="movie" value="video.swf"/>
</object>
</video>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API VIDEO & AUDIO


• HTML5
<video src="video.ogg" controls>
Your browser does not support HTML5 video.
</video>
<audio controls
src="johann_sebastian_bach_air.ogg">
An audio clip from Johann Sebastian Bach.
</audio>

• Functii media
<video width="320" height="240" controls>
<source src="pr6.mp4" type='video/mp4;
codecs="avc1.42E01E, mp4a.40.2"'>

– Load()
() <source src="pr6.webm" type='video/webm;
codecs="vp8,
p , vorbis"'>
<source src="pr6.ogv" type='video/ogg;
– Play() codecs="theora, vorbis"'>
</video>

– Pause() <audio controls>

– canPlayType(type)
<source src="johann_sebastian_bach_air.ogg">
<source src="johann_sebastian_bach_air.mp3">
An audio clip from Johann Sebastian Bach.
</audio>
/
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API VIDEO & AUDIO


• Atribute ReadOnly
– Duration
– Paused
– Ended
– startTime
– Error
– currentSrc
• Atribute ce pot fi folosite in Javascript
– Autoplay
A t l
– Loop
– currentTime
– Controls
– Volume (0.0-1.0)
– Muted
– Preload
• Atribute legate de format
– Type=formatul containerului (e.g video/mp4);
– Codecs=“video codec, audio codec”.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API - GEOLOCATIE


O noua pproprietate
p a obiectului g
global
navigator:
– Navigator.geoLocation
Navigator geoLocation
•Detecteaza locatia utilizatorului curent
utilizand urmatoarele informatii:
• -Adresa IP
• -Conexiunile la retele wireless
• -Turnul de comunicatii cu care comunica
telefonul
• -hardware GPS
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API - GEOLOCATIE


• Exemplu
p de implementare:
p
function get_location() { navigator.geolocation.getCurrentPosition(show_map);
}
//determina afisarea unei bare de informatii ce intreaba utilizatorul daca
doreste sa isi dezvaluie locatia sa
sa.
//show_map ->functia de callback
function show_map(position) {
var latitude = position.coords.latitude;
p
var longitude = position.coords.longitude;
// let's show a map or do something interesting! }
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

HTML5 API - GEOLOCATIE


Exemplu de tratarea a erorilor:
navigator.geolocation.getCurrentPosition( show_map,
handle_error)
function handle_error(err)
{ if (err.code == 1) { // user said no! } }
•handle_error este un obiect ce contine urmatoarele p
proprietati:
p
– code short an enumerated value
• PERMISSION_DENIED (1)
• POSITION_UNAVAILABLE (2)
• TIMEOUT (3)
• UNKNOWN_ERROR (0)

– message DOMString not intended for end users


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu Geolocatie
• Google
g Maps p
http://htmlfive.appspot.com/static/where
ami html
ami.html
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

APLICATII OFFLINE
• O aplicatie web este o lista de URL-uri- HTML,CSS,Javascript,
imagini sau orice alta forma de resursa.
resursa
• Homepage-ul unei aplicatii offline ne directioneaza catre aceasta lista
(fisier manifest) ceea ce este doar un fisier text de pe server.
• Un Browser ce implementeaza aplicatii offline HTML5 citeste
aceeasta lista, downloadeaza resursele indicate si le inmagazineaza
local actualizandu-le
actualizandu le doar cand este necesar
necesar.
• Cand veti accesa aplicatia web fara a avea acces la internet,
browserul web va aduce copiile locale. De asemeni exista in DOM un
fl ce va iindica
flag di d daca sunteti
t ti online
li sau offline.
ffli
– var online = navigator.onLine;
• Acest atribut se modifica in timpul
p evenimentelor online si offline ce
sunt manevrate de obiectul Window.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

MANIFESTUL CACHE
• O aplicatie web offline este dependenta de fisierul cache manifest.
• Manifestul CACHE = lista resurselor de care are nevoie aplicatia web cand
este deconectata de la retea.
• Utilizarea fisierului cache manifest
<!DOCTYPE HTML>
<html manifest="/cache.manifest">
<body> ... </body>
</html>
Fisierul manifest se poate regasi oriunde pe server dar trebuie servit clientului avand
Content-Type: text/cache.manifest.
• Exemplu Manifest Cache de pe server:
CACHE MANIFEST
/static/stickies.html
/media/deleteButton.png
/media/deleteButtonPressed png
/media/deleteButtonPressed.png
/css/stickies.css
/js/stickies.js
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Baza de date
• HTML5 asigura un API de baza de date bazat
pe SQL pentru a inmagazina local si structurat
datele.
• API-ul
API ul interactioneaza cu baza de date in mod
asincron ceea ce asigura faptul ca interfata
utilizator nu se va bloca.

Exemplu de implementare
//pentru a crea un obiect baza de date
var db = window.openDatabase("NoteTest", "1.0","Example DB",200000);

function renderNote(row) {
// renders the note somewhere }

function reportError(source, message) {


p
// report error
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Baza de date
function renderNotes() {
db.transaction(function(tx) {
tx executeSql('CREATE
tx.executeSql( CREATE TABLE IF NOT EXISTS Notes(title TEXT
TEXT, body TEXT)
TEXT)',
[]);
tx.executeSql(‘SELECT * FROM Notes’, [], function(tx, rs) {
for(var i = 0; i < rs.rows.length; i++) {
renderNote(rs.rows[i]);
}
});
});
}

function insertNote(title, text) {


db.transaction(function(tx) {
tx.executeSql('INSERT INTO Notes VALUES(?, ?)', [ title, text ],
function(tx, rs) {
// …
},
function(tx, error) {
reportError('sql', error.message);
});
});
})
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

APLICATII OFFLINE
• Pentru depozitarea
p simpla
p si sincrona a
informatiilor pentru utilizare offline HTML
introduce atributul localStorage al obiectului
Windows.
localStorage["status"]
localStorage[ status ] = "Idling
Idling.";
;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

EXEMPLU APLICATII OFFLINE


• Sticky
y notes
http://htmlfive.appspot.com/static/sticki
es html
es.html
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

NU VOI BLOCA BROWSERUL CU JAVASCRIPT!

NU VOI BLOCA BROWSERUL CU JAVASCRIPT!


NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
NU VOI BLOCA BROWSERUL CU JAVASCRIPT!
WEB WORKERS
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

WEB WORKERS
• Javascript ruleaza pe acelasi fir de executie cu browserul
ceea ce poate face ca acesta din urma sa nu mai poata
raspunde la comenzile utilizatorului
utilizatorului.
• „Muncitorii” Web definesc un API ce ruleaza scripturile in
background.
• ! „muncitorii” trebuie sa se afle intr-un script extern.
• Exemplu de implementare
<script>
var worker = new Worker('worker.js');
worker.onmessage = function (event) {
console log('Results:
console.log( Results: ' + event.data);
event data);
};
</script>
Muncitorii:
function findPrimes() {
// ... prime algorithm here
postMessage(nextPrime);
}
findPrimes();
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

EXEMPLU WEB WORKERS


• http://htmlfive.appspot.com/static/tracker1.html Motion tracker
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

EXEMPLU WEB WORKERS


• http://htmlfive.appspot.com/static/primes-good.html
Good Primes

01.04.2010 Curs Programare Web, anul 4 C5 – Curs 6 133


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ce mai ofera HTML5?


• Trasaturi noi formularelor (validare la
nivelul clientului, date pickers, sliders)

• Socket-uri Web
• Web storage
• Alte tag-uri
tag uri noi
• Manipularea istoricului browserului
• Drag and Drop
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Concluzii
• HTML5 stie unde te afli,, stie ce scrii,, unde
esti si unde ai fost.
• HTML5 este viitorul si desi inca nu a ajuns
la un stadiu final (se preconizeaza ca in
j l anului
jurul l i 2022) ell poate
t fi iimplementat
l t t sii
utilizat in cadrul browserelor moderne.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Limbajul PHP

Programare Web – Curs 3 1


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Introducere
• PHP a reprezentat inițial o abreviere pentru “Personal
Home Pages tools
tools” şi a fost creat în 1994 de Rasmus
Lerdorf.
• În p
primele versiuni ((PHP/FI)) el conţinea
ţ suport
p doar p
pentru
pachetul de baze de date mSQL (mini SQL).
• Zeev Suraski șiAndi Gutmans au rescris parserul în 1997,
formând prima versiune matură a PHP (3), redenumit în
‘PHP: Hypertext Processor’
• PHP poate fi folosit în conjuncţie cu o largă listă de SGBD-
uri, atât comerciale cât şi necomerciale (free software)
incluzand MySQL, dBase, Oracle, DB2, PostgreSQL,
S base InterBase
Sybase, InterBase, SQLSer
SQLServer,
er ODBC
ODBC, etc
etc.
• În 2004 a fost prezentat PHP 5, având la bază nucleul
Zend Engine II
• PHP 6 este la ora actuală în curs de dezvoltare.
Programare Web– Curs 3 http://en.wikipedia.org/wikiPHP 3
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Introducere
• Ca ppachet,, PHP poate
p fi instalat atât ca un
interpretor de sine stătător (deci un CGI
separat) cât şi ca un modul pentru serverul
de web (Apache).
• Pachetul poate fi instalat de asemenea sub
p
Windows IIS/PWS si Apache.
• Informaţii complete despre instalare şi
configurare
fi îîn diverse
di variante
i t pott fi găsite
ă it
în manualul care îl însoţeşte.

Programare Web– Curs 3 4


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Inserare cod
• Introducerea de inserturi scrise în PHP în fişierele
HTML poate fi făcută în mai multe moduri (funcţia
echo are acelaşi efect cu printf din limbajul C):
1. <?php echo "Varianta 1 tip XML\n"; ?>
2 <?
2. ? echo
h "V
"Varianta
i t 2 2, cea maii simpla\n";
i l \ " ? ?>
3. <script
script language="php">
language php
echo "Varianta 3, tip limbaj pentru scripturi";
</script>;
4. <% echo "varianta 4, tip ASP"; %>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Inserare cod
• Pentru folosirea unora dintre aceste
variante interpretorul de PHP trebuie
configurat corespunzător (variantele 2 și 4)
• Opțiunile respective se găsesc în fișierul de
configurare php.ini
; Allow the <? tag. Otherwise, only <?php and <script> tags are recognized.
; NOTE: Using short tags should be avoided when developing applications or
; libraries that are meant for redistribution, or deployment on PHP
; servers which are not under your control, because short tags may not
; be supported on the target server.
server For portable
portable, redistributable code
code,
; be sure not to use short tags.
short_open_tag = On

; Allow
All ASP-style
ASP t l <% %> ttags.
asp_tags = Off
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Descriere
• Insertul poate conţine o singură instrucţiune, ca
în exemplele de mai sus, sau mai multe
instrucţiuni.
• Formatul instrucţiunilor este liber, putându-se
continua pe mai multe linii
linii.
• Ca şi în C fiecare instrucţiune este terminată cu
punctt şii virgulă.
i lă
• Directiva de închidere bloc p p țține și
php ș loc de ;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple
• Obișnuit:
<?php
echo
h ‘Hello
‘H ll world';
ld'
?>
• Fără ; în final de bloc:
<?php
h echo
h ‘Hello
‘H ll world'
ld' ?>
ăăd
• Fără directiva
ec a de închidere
c de e la
auultimul
u bbloc
oc (da
(dar cu
; !)
<?php echo ‘Putem
Putem omite directiva in final
final';;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Comentarii
• Comentariile sunt ca ș
și in C / Unix shell:
<?php
echo ‘Test'; // Comentariu pe linie
/* Comentariu pe
/
potential mai multe linii */
echo ‘Ceva'; # Comentariu pe linie
?>

Programare Web– Curs 3 9


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipuri și variabile
• PHP este un limbaj interpretat. În consecință nu este
necesară
ă declararea
d l variabilelor.
i bil l
• O variabilă împrumută tipul valorii stocate în ea la
momentul respectiv.
• O variabilă își poate schimba tipul pe parcursul execuției
scriptului PHP.
• O variabila se creează în momentul în care se depune o
valoare în ea.
• Pentru conversia între tipuri
p ((daca e necesară)) se potp
folosi construcţii de conversie de tip cast similare cu cele
din C sau funcţia settype.

Programare Web– Curs 3 10


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipuri
• Există 8 tipuri de date în PHP: 4 tipuri scalare,
două compuse și două speciale
1. Boolean
2. Integer
3 Float (include double)
3.
4. String
5. Array
j
6. Object
7. Resource
8 Null
8.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile
• Numele oricărei variabile este prefixat cu simbolul $.

• Acesta e un marcaj de variabilă și nu face efectiv parte din nume.

• Pentru aflarea tipului


p unei variabile se p ț g
poate folosi funcția gettype
yp
sau var_dump.

• Instrucţiunea de atribuire este identică cu cea din limbajul C.

• Dacă variabila nu este deja definită, ea se crează automat:

$nume = "Ion";
$adresa = "Bucuresti";
$sir = "1234";;
$
$numar = (int) $sir; // exemplu de cast

Programare Web– Curs 3 12


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Colectarea memoriei
• În PHP memoria este automat colectată –
programul cunoaște când o variabilă nu
mai este folosită și colectează automat
memoria ocupată de aceasta
• Singura excepție: conexiunile cu bazele de
date
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul Boolean
• O variabilă de tip Boolean poate conține valoarea True
sau False.
F l
• În cazul conversiei la Boolean, sunt considerate False
(printre altele):
– Literalul FALSE
– Valoarea întreagă sau reală (float, double) 0 (zero)
– Un șir vid
– Șirul "0"
– Un array cu 0 elemente
– Tipul
Ti l special
i l NULL (i
(incluzând
l â d variabilele
i bil l ne-setate
t t = inexistente)
i i t t )

• Orice altă valoare este considerată True (inclusiv orice


resursă)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul întreg
• Specificarea
p se p
poate face în bazele 10,, 8
și 16:
<?php
h
$a = 1234; // zecimal
$a = -123; // zecimal, negativ
$a = 0123; // octal
$a = 0x1A; // hexazecimal
?>

Programare Web– Curs 3 15


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Numere întregi
• Dacă o cifră este incorectă restul cifrelor se ignoră:
<?php
? h
$a = 123EU4PLECLA5678; // 123
$a = 012389; // octal 0123
$a = 0x1ASPARAGUS; // hexa 0x1A
?>
• Dacă se depășește capacitatea de reprezentare pentru întregi
(~2^31), valoarea devine automat float.
• La conversia de la float la intreg numărul e rotunjit spre 00.
• Dacă se depășește capacitatea de reprezentare pentru întregi
rezultatul este nedefinit (nu se emite nici o atenționare!)
• La conversia de la string la număr se ia prefixul întreg al numărului
(ca mai sus):
$a = 1 + “33 iezi cucuieti
cucuieti”;; // $a devine 4
$a = “3 iezi cucuieti” + 1; // $a devine 4
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul real (float, double)


• Se pot scrie în formatul uzual sau exponențial:
<?php
$a = 1.234;
$b = 1.2e34;
$ = 12E-34;
$c 12E 34
?>
• Valorile limită sunt dependente de platformă, dar uzual
numerele sunt până la ~1.8e308 cu o precizie de 14 cifre.
• Conversia de la șir la float se face similar cu cea a
întregilor (până la primul caracter care nu face parte dintr-
o reprezentare corectă de număr real).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul ARRAY
• Un tablou PHP este o succesiune de
perechi (cheie, valoare).
• Li se maii spune șii ttablouri
bl i asociative.
i ti
• Un tablou poate fi exploatat în modul clasic
(chei pornind de la 0 ca în C) sau ca tablou
asociativ (acces prin cheie
cheie, cheile putând
să nu fie succesive și nici numerice.

Programare Web– Curs 3 18


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple
<?php
$a = array(
array(“pw"
pw => “examen"
examen ,
4 => ”an terminal”,
“succes” =>true);
echo $a[“pw”], $a[4] // examen an terminal
// $b = array cu 2 dimensiuni
$b = array(“medii"
array( medii =>> array(1 =>> 9.45,
9 45 2 =>> 9
9.5,
5 3
=> 8.12, 4 => 9.90, “stat”=>10));
echo $b[“medii"][2]; // 9.5
echo
h $b[“medii"][“stat"];
$b[“ dii"][“ "] // 10
// $c e identic cu $b
$c = array(“medii"
$ y( => array(1
y( => 9.45, 9.5, 8.12,
9.90, “stat”=>10));
echo $c[“medii"][2]; // 9.5
echo $c[“medii"][“stat"];
$c[ medii ][ stat ]; // 10
?>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul Array
• Cheia trebuie să fie scalară ((un alt arrayy
sau obiect)
• Adă
Adăugarea încă
î ă unuii element
l t cu cheie
h i
maximă negativă adaugă o pereche cu
cheia 0 (începând cu v4.3.0)
• Cheia TRUE devine 1
• Cheia FALSE devine 0
• Cheia NULL devine șirul vid
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
$regiune = array(-12 => “Oltenia”);
// o variabila de tip array cu cheia
// maxima -12
12
// Adaugam noi elemente si vom crea noi
// perechi
hi cu chei
h i incepand
i d cu 0:
0
$regiune[] = "Muntenia"; // elementul 0
$regiune[] = "Moldova"; // elementul 1
• În lipsă, cheile pleacă de la 0:
$orase = array(“Bucuresti”, “Ploiesti”,
“C
“Campina”)
i ”) // chei
h i 0,
0 1,
1 2
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Conversii
• La conversia din tipurile întreg, real, string,
boolean și resursă în tipul array se crează un
tablou cu un singur element cu cheia 0 și
valoarea respectivă.
• Dacă se convertește un obiect la array
array, obținem
un array având ca elemente proprietățile
obiectului Mai multe amănunte în documentația
obiectului.
PHP.
• C
Conversiai uneii valori
l i nule
l lla array d
duce lla un
array vid (Atenție: vid nu înseamnă nul!)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Comparațții
Compara
• 2 tablouri se p
pot compara
p astfel:
– Egalitate: $a == $b adevărat daca au aceleași
perechi (cheie
(cheie, valoare)
– Identitate: $a === $b adevărat dacă au
aceleași perechi (cheie, valoare) în aceeași
ordine și cu aceleași tipuri
– Inegalitate: $a <> $b sau $a != $b. Inversa
egalității.
– Nonidentitate: $a !== $b. Inversa identității.

Programare Web– Curs 3 23


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Comparații
• Se pot afla diferențele dintre 2 tablouri folosind funcția
array_dif
dif care returnează
t ă valorile
l il di
dintr-un
t array care nu
se găsesc în al doilea:
<?php
h
$array1 = array(“ion", “vasile", “ion", “elena");
$array2 = array(“vasile", “ion", “mia");
$rezultat = array_diff($array1, $array2);
print_r($rezultat);
// rezultat: [3]=>“elena”
?> Afișează informații despre conținutul unor variabile în format
human-readable.
P t exemplul
Pentru l l nostru
t se afișează:
fi ă
Array ( [3] => elena )
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Reuniune
• Două tablouri se pot reuni folosind operatorul +:
$c = $a + $b
• Rezultatul conține perechile primului array la care se adaugă perechile din al
doilea array cu o cheie care nu există în primul.
• Exemplu:
<?php
$array1 = array(“ion", “vasile", “ion", “elena");
$array2 = array(“vasile", “ion", “mia");
$rezultat = $array2 + $array1;
print_r($rezultat);
?>
• Vom obține un tablou cu 4 elemente: elementele din array2 (chei 0, 1, 2) și
ultimul element din array 1 (cheia 3):
(“vasile", “ion", “mia“, “elena")
Programare Web– Curs 3 25
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Același exemplu, însă altă adunare:
<?php
h
$array1 = array(“ion", “vasile", “ion", “elena");
$
$array2
2 = array(“vasile",
(“ sil " “i“ion",
" ““mia");
i ")
$rezultat = $array1 + $array2;
print r($rezultat);
print_r($rezultat);
?>
• Vom obține un tablou cu 4 elemente: elementele din array1 (chei 0 0, 1
1, 2 si 3)
și nici un element din array 0 (pentru că toate cheile deja există):
(“ion", “vasile", “ion“, “elena")

Programare Web– Curs 3 26


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul Obiect
• Un obiect se declară prin folosirea operatorului
new urmat de un constructor de clasă:
$objectName = new ClassName();
$objectName = new ClassName(97.58, 1);
• Metodele și proprietățile unui obiect se
accesează folosind ->.
$Checking->getBalance();
$Ch kN b = 1022;
$CheckNumber 1022
$Checking->getCheckAmount($CheckNumber);
g g ( )
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Clase
• Pentru crearea unei clase se folosește cuvântul
cheie class:
class ClassName {
// membrii și funcţii membre
}
• Numele claselor poate fi obținut cu get_class:
get class:
$Checking = new BankAccount();
echo 'The $Checking object is instantiated from the ‘.
get_class($Checking) . “class.</p>";

Programare Web– Curs 3 28


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Clase externe
• Clasele p
pot fi declarate în fișiere
ș externe,,
caz în care se pot folosi funcțiile:
– include()
– require()
– include_once()
– require_once()
i ()

Programare Web– Curs 3 29


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Specificatori de acces
• Specificatorii de acces determină drepturile de acces
asupra membrilor unei clase
• În PHP există trei nivele de protecție:
– public
bli
– private
– protected
• Public – oricine are acces la membrii clasei
• Private – se restricționează dreptul de acces asupra
membrilor clasei
class MyClass {
private $id = 18;
public
bli ffunction
ti getId()
tId() { return
t $thi
$this->id;
id }
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
class Person { $judy = new Person();
$judy->setName("Judy");
private $name;
$joe = new Person();
function __construct($name)
construct($name) { $
$joe->setName("Joe");
$this->name = $name;
} print $judy->getName() . "\n";
//print Judy
function setName($name) {
print $joe->getName(). "\n";
$this->name = $name;
//print Joe
}
$judy = new Person("Judy");
function getName() {
return $
$this->name;; $joe = new Person("Joe");
} print $judy->getName();
};
print $joe->getName();
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Proprietăți statice

class
l MyUniqueIdClass
M U i IdCl {

static $idCounter = 0;

public $uniqueId; $obj1 = new MyUniqueIdClass();


print $obj1->uniqueId . "\n";
function __construct()
construct() { // i t 1
//print
self::$idCounter++;
$this->uniqueId = self::$idCounter; $obj2 = new MyUniqueIdClass();
} print
p i t $obj2->uniqueId
$ bj2 > i Id . "\n";
"\ ";
} //print 2

Programare Web– Curs 3 32


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Clonarea obiectelor
class My
MyClass
lass {
public $var = 1;
}
obj1 $obj1 = new MyClass();
object
$obj2 = $obj1;
obj2
$obj2->var = 2;
print $obj1->var;
$obj1 >var; //print 2

obj1 object $obj1 = new MyClass();


$obj2 = clone $obj1;

object $obj2->var = 2;
obj2
j
print $obj1->var;
$ //print 1

Programare Web– Curs 3 33


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Polimorfism
• Mecanism de moștenire
ș a unei singure
g
clase
– Similar Java
• Însă se pot implementa mai multe interfețe

class Child extends Parent { class A implements B, C, ... {


... ...
} }

interface I1 extends I2, I3, ... {


...
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul Obiect
• … mai multe detalii la orele de laborator.
• Dacă o valoare de alt tip este convertită la
ti l obiect,
tipul bi t obținem
bți o iinstanță
t ță a clasei
l i
stdClass.
• Dacă se convertește la obiect o valoare
nulă noua instanță va fi vidă
nulă, vidă.
• Dacă un tablou se convertește
ș la obiect
cheile devin proprietăți.

Programare Web– Curs 3 35


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul Resursă
Resursă
• Tipul resursă este un tip special, variabilele de
acest tip conțin o referință către o resursă
externa.
• Felul resursei se poate obține cu funcția
get resource type (ex: mysql link
get_resource_type link, file
file, domxml
document, etc.).
• C
Conversia i lla titipull resursă
ă nu are sens (di
(din
definiția tipului)
• O resursă care nu mai este referită este detectată
automat de 'garbage
g g collector‘ și
ș eliberată (deci
(
nu e necesară eliberarea manuală).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Tipul NULL
• Tipul NULL are o singură valoare, NULL.
• O variabilă nula nu conține nici o valoare.
• O variabilă este considerată nulă dacă:
1. I-a fost asignată valoarea NULL
2. Nu i-a fost asignată încă nici o valoare (deci eventual ea nu există).
3 A fost dealocată cu funcția unset($variabila)
3.

• O variabilă se poate testa dacă e nulă sau nu cu funcția


_ ($ )
is_null($variabila).
• O variabilă se poate testa dacă există sau nu (cazurile 2 și 3 de mai
sus) cu funcția isset($variabila, …)
• O variabilă se poate testa dacă este goală cu empty($variabila).
Sunt considerate goale variabilele care conțin echivalentul lui FALSE
(inclusiv care conțin valoarea NULL)
NULL).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile
• Numele variabilelor este prefixat cu $ (marcaj de
variabila).
• Numele este case
case-senzitiv
senzitiv (literele mari sunt
considerate diferite de cele mici).
• U
Un nume corectt PHP începe
î cu literă
lit ă sau
underscore și continuă cu litere, cifre și
underscore.
d
• Variabilele p
pot conține
ț referințe
ț către alte
variabile (adresa se prelevează cu &, ca în C).
Exemplu:
p
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile
<?php
$unu = 'Ceva';
$doi = &$unu; // $doi e o referinta la $unu.
$doi = "Altceva"; // Modificam $doi
echo $unu; // Ambele contin acelasi
echo $doi; // sir
?>
• Nu se poate preleva cu & adresa unei expresii (doar a
unei variabile).
• PHP inițializează variabilele cu valori implicite dar nu este
bine să ne bazăm p pe aceste valori ((0 p
pentru numere,
False pentru boolean, etc).
Programare Web– Curs 3 39
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile predefinite
• Există un număr mare de variabile predefinite (de
sistem) pe care scriptul le poate folosi.
• Cele mai utilizate sunt:
– $_GET, $_POST, $_COOKIES, $_REQUEST – conțin valorile
transmise scriptului
p cu metodele GET,, POST,, cookie sau
reuniunea lor
– $_SESSION – conține variabile care se pot folosi de o succesiune
d execuții
de ții d
de scripturi
i t i care fformează
ă o sesiune
i d
de llucru
– $GLOBALS – conține toate variabilele globale ale scriptului

• O descriere a acestor variabile și a altora din


aceeași categorie se găsește în documentația
PHP
Programare Web– Curs 3 40
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Domeniul (scope)
• Variabilele sunt cunoscute în contextul în care au
fost create.
• Cele definite în afara oricărei funcții sunt similare
variabilelor globale din C.
• C
Cele
l definite
d fi it îîn ffuncții
ții ((prin
i asignare)
i ) suntt llocale
l
acelei functii.
• Spre deosebire de limbajul C o variabilă globală
nu este cunoscută în interiorul unei funcții
ț decât
dacă este declarată cu global în acea funcție.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Domeniul (scope)
• Exemplul 1:
$a = 1; /* variabila globala */
function Ecou() {
$a = 2; /* se asigneaza o valoare variabilei locale */
echo
h $$a; /* tiparire
ti i variabila
i bil locala
l l */
}
Ecou();
echo $a; /*
/ tiparire variabila globala */
/
• Rezultat 21

Programare Web– Curs 3 42


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Domeniul (scope)
• Exemplul 2:
$a = 1; /* variabila globala */
function Ecou() {
global $a
$ =2
$a 2;/*
/* se asigneaza
i o valoare
l variabilei
i bil i globale
l b l */
echo $a;/* tiparire variabila globala */
}
Ecou();
echo $a; /* tiparire variabila globala */
• Rezultat
R lt t 22
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Domeniul (scope)
• Un alt mod de a defini variabile globale cunoscute și în interiorul
funcțiilor este folosirea tabloului asociativ predefinit $GLOBALS,
având ca indici numele variabilelor globale:
• Exemplu:
$a = 1; /* variabila globala */
function Ecou() {
$GLOBALS["a"] = 2; /* se asigneaza o valoare
variabilei g
globale */
echo $GLOBALS["a"];/* tiparire variabila globala */
}
Ecou();
echo $a; /
/* tiparire variabila globala */
/
• Rezultat 22
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile statice
• Ca și în C se pot defini variabile locale funcțiilor dar care își păstrează
valoarea de la un apel la altul
altul.
• Aceste variabile se numesc statice.
• Variabilele statice pot fi inițializate cu o valoare care apoi se modifică
și este păstrată pentru apelurile viitoare:
function Increment() {
static $a = 0;
echo $a;
$a++;
}
• Rezultatul apelului repetat al acestei funcții va fi afișarea numerelor 0,
1, 2, . . .
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Macrosubstituț
Macrosubstituție
• Numele unei variabile se poate găsi în altă variabila.
• Acest procedeu, numit macrosubstituție, este întâlnit și în alte limbaje,
cum este Xbase (dBase, Fox, Clipper).
• Instrucțiunile:
$a = "Limbajul";
$$ = " PHP";
$$a PHP"
• definesc două variabile: $a cu valoarea “Limbajul” și $Limbajul cu
valoarea “ PHP
PHP”.
• În acest caz instrucțiunea:
echo "$a
$a ${$a}";
${$a} ;
va afișa Limbajul PHP
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile externe
• În această categorie intră variabilele corespunzătoare simbolurilor primite de la un formular
și variabilele de mediu setate de serverul de web.
• Să presupunem că avem următorul formular:
<form action="actiune.php" method="post">
Nume: <input type=
type="text"
text name=
name="nume"><br>
nume ><br>
Localitate: <input type="text" name="adresa[localitate]"><br>
Strada: <input type="text" name="adresa[strada]"><br>
Num r: <input type="text"
Numar: t p "t xt" name="adresa[numar]"><br>
n m " dr s [num r]"><br>
Optiuni: <br>
<select multiple name="so[]">
<option
ti value="Windows
l "Wi d 95">Windows
95" Wi d 95
<option value="Windows XP">Windows XP
<option value="Windows Vista">Windows Vista
<option
i value="Linux">Linux
l "Li " Li
</select>
<input type="submit">
</form>

Programare Web– Curs 3 47


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Variabile externe
• Scriptul actiune.php care tratează acest formular poate
primi
i i variabilele:
i bil l
– $nume, variabilă simplă
– $adresa, un tablou asociativ cu trei elemente
– $so, un tablou având atâtea elemente câte selecții s-au făcut în
meniul
i l vertical
ti l di
din fformular.
l
• Acest lucru se întâmplă însă doar dacă opțiunea de
configurare a PHP register_globals
register globals e setată pe On
(implicit ea e însă Off, fiind potențial o breșă de
securitate).
• În mod normal valorile celor 3 variabile se găsesc în
$ POST și $
$_POST $_REQUEST.
REQUEST

Programare Web– Curs 3 48


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Constante
• Constantele se definesc similar cu limbajul C, cu define:
<?php
// Constante valide
define("MATERIE", "Programare Web");
define("_EVAL_UARE", "Examen");
define("NOTA10", "10");
// Nume invalid
define("2PAC", "Cantaret");
// Asa arata constantele PHP,
// e bine sa nu avem si noi la fel
(
define("__NOTA__", "10");
)
?>
Programare Web– Curs 3 49
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Constante
• Spre deosebire de variabile:
– Constantele nu au un nume care începe cu $
– Constantele pot fi definite doar cu define() nu prin
atribuire
– Constantele nu au domeniu de valabilitate ca
variabilele (se pot folosi și în funcții de exemplu).
– Nu pot să
să-și
și schimbe valoarea și nu pot fi dealocate
(unset)
– Constantele pot conține doar valori scalare (boolean
(boolean,
intreg, real sau șir)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Constante predefinite
• PHP pune la dispoziție și o serie de constante
predefinite.
• Acestea au forma __Nume__
Nume
• Printre ele sunt:
– __LINE__ numărul liniei curente în sursa PHP
– __FILE__ calea și numele complet al fișierului sursă PHP
– __DIR__ directorul acelui fișier
– __FUNCTION__ numele funcției curente (doar cu litere mici în
PHP4)
– __CLASS__ numele clasei (doar cu litere mici în PHP4)
– __METHOD__ numele metodei din clasă (doar PHP5)

Programare Web– Curs 3 51


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Expresii
• Expresiile în PHP sunt similare celor din limbajul C
• Se pot folosi construcții de tipurile:
– $a++,
$a++ ++$a
– $a--, --$a
– $a += 3; (echivalentă cu $a = $a + 3;), în loc de +
putând fi orice operator valid pentru operația respectivă
– Atribuiri multiple, ca de exemplu:
$a = $b = ++$c;
$c; sau
$a = $b += 10;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Atribuirile întorc o valoare


• Ca ș
și în limbajul
j C atribuirile întorc o
valoare:
if ($
($con = mysql_connect(…))
l t( )) …
• Ca și în limbajul C o expresie logică e
evaluată doar până în momentul în care
valoarea sa este certă:
mysql_connect(…)
y q_ ( ) or die('Conexiune
(
esuata');

Programare Web– Curs 3 53


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Operatori
• Aritmetici: +,, -,, *,, /,, % (modul)
( )
• Logici: ==, ===, !=, !==, <, >, <=, >=
• Conectori logici: and, &&, or, ||, ! (negare),
xor (sau exclusiv)
• Operatori pe șiruri: . (concatenare)
• Operatori pe biți: &, |, ~ (inversare biți)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Structuri de control
• Există o serie de structuri de control care
sunt similare celor din limbajul C.
• V
Vom avea ca șii acolo
l ddecizii,
i ii cicluri,
i l i
alegere
• Se pot defini ca și în C funcții (nu există
decât funcții
funcții, nu și proceduri ca în Pascal).
Pascal)

Programare Web– Curs 3 55


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Decizia
• În PHP aceste instrucțiuni sunt asemănătoare ca sintaxa
cu cele
l similare
i il di
din lilimbajul
b j lCC.
• Sintaxa:
if (conditie_1)
{ instructiuni_1
instructiuni 1 }
elseif (conditie_2)
{ instructiuni_2
i i i 2}
..........
else { instructiuni_N }
• elseif și else sunt opționale (similar cu limbajul C)
C).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Decizia
• Exemplu:
p
if ($a > $b)
{ print "a este mai mare ca b";}
elseif ($a == $b)
{ print "a este egal cu b";}
else
{ print "a
a este mai mic decat b
b";}
;}

Programare Web– Curs 3 57


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ciclul WHILE
• Sintaxa:
while ( conditie )
{ instructiuni
i t ti i }
• Exemplu:
p
$i = 10;
while
hil ($i >= 0)
{ print $i
$i--;; }

Programare Web– Curs 3 58


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ciclul DO
• Sintaxa:
do
{ instructiuni
i t ti i }
while ( conditie );
• Exemplu:
$i = 10;
10
do
{ print $i--;}
while ($i>0);
$
Programare Web– Curs 3 59
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Ciclul FOR
• Sintaxa:
FOR (expr1; expr2; expr3)
instrucţiune

• Execuția unui astfel de ciclu se face astfel:


– Se evaluează expresia expr1
p
– Cât timp expresia expr2 are valoarea adevărat se repetă operațiile:
• Se executa instrucțiunea (instrucţiune)
• Se evaluează expresia expr3

• Exemplu:
for ($i = 1; $i <=10; $i++)
{ print $i;}

• Efectul va fi afișarea valorilor de la 1 la 10.


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

FOREACH
• Sintaxa ((2 variante):
)
foreach (expr_array as $valoare)
statement
foreach (expr_array
(expr array as $cheie => $valoare)
statement
• Se folosește pentru parcurgerea unui
tablou (ciclu după elementele unui tablou)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<?php
// tiparirea unui tablou
$arr = array("one"
array( one , "two"
two , "three");
three );
foreach ($arr as $val) {
echo
h "Value:
"V l $val<br
$ l b />\n";
/\ "
}
foreach ($arr as $k => $val) {
echo "Cheie:
Cheie: $k; Val: $val<br />\n
/>\n";;
}
?>
Programare Web– Curs 3 62
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Break și Continue
• Aceste instrucțiuni se folosesc pentru a ieși dintr-un ciclu,
respectiv
ti pentru
t a se ttrece necondiționat
diți t la
l un nou pas all
ciclului chiar dacă pasul curent nu s-a terminat.
• Exemplu:
Tipărirea numerelor impare dintre 1 și 10
for ($i = 1;;$i++) {
if ($i > 10) { break; }
if ($i % 2) { continue; }
print $i;
$
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alegerea (Switch)
• Sintaxa:
switch (expr)
{
case val1:
instructiuni
case val2:
instructiuni
........
default:
instructiuni
}

Programare Web– Curs 3 64


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alegerea (Switch)
• Efectul este următorul:
– Se evaluează expresia expr
l1 val2,
– Se parcurg etichetele case (val1, l …) una
după alta. În cazul în care se găsește o
egalitate, se executa instrucțiunile de la acea
eticheta până la prima instrucțiune break sau
până se sfârșește întregul switch.h
– Daca nu exista nici o egalitate se execută
instrucțiunile de la default.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alegerea (Switch)
• Exemplu:
switch ($i)
{
case 0:
print "ii egal cu 0
0";;
break;
case 1:
p int "i egall cu 1";
print
break;
case 2:
print
i t "i egall cu 2"
2";
break;
default:
print
i "i nu este egall cu 0,
0 1 sau 2";
2"
}
• De remarcat că dacă instrucțiunile break ar lipsi, în cazul în care $i este egal
cu 0 se tipăresc toate cele patru mesaje iar în cazul în care este egal cu 1
doar ultimele trei.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• Programele PHP pot conține funcții definite de utilizator,
inclusiv functii recursive
recursive.
• Sintaxa definiției unei funcții este următoarea:
f
function nume_functie
f
(lista_parametri)
{
instructiuni
}
• Dacă se dorește ca funcția să întoarcă o valoare, se
folosește instrucțiunea:
return expresie;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• Exemplu:
p
function la_patrat ($numar) {
return $numar * $numar;
}
echo la_patrat(10);
la patrat(10);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• Folosirea unei funcții se poate face doar după definiția
acesteia.
acesteia
• Parametri sunt transmiși prin valoare.
• Dacă se dorește transmiterea prin referință a unui
argument, se poate folosi construcția &variabila:
function la_patrat (&$numar) {
$numar
$ m =$$numar
m *$$numar;
m ;
}
$ = 10;
$a
la_patrat($a);
echo $a; // tipareste 100
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• Se poate transmite prin valoare adresa sa:
function la_patrat ($numar) {
$numar = $numar * $numar;
}
$ = 10;
$a 10
la_patrat($a);
echo $a; // tipareste 10
la patrat(&$a);
la_patrat(&$a);
echo $a; // tipareste 100

Programare Web– Curs 3 70


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• La definirea unei funcții se pot asigna și valori
implicite pentru argumente.
• În cazul în care acestea lipsesc la apel sunt luate
implicit valorile din definiție:
f
function
ti la_patrat
l t t ($numar
($ = 4) {
return $
$numar * $
$numar;
}
echo
h la_patrat(10);
l (10) // tipareste
i 100
echo la_p
patrat();
(); // tipareste
p 16
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții
• Astfel de argumente trebuie să fie ultimele din
listă.
• De exemplu secvența:
function inmultire ($numar1 = 4, $numar2) {
return $numar1 * $numar2;
}
echo inmultire(10);
va semnala o eroare deoarece automat valoarea
10 va fi asignată
g p
primului argument.
g

Programare Web– Curs 3 72


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții PHP
• PHP p pune la dispoziție
p ț un număr foarte
mare de funcții, atât de uz general cât și
funcții specifice accesului la diverse
sisteme de gestiune a bazelor de date.
• ÎÎn continuare sunt prezentate o parte dintre
acestea…

Programare Web– Curs 3 73


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
array array(lista valori);
• Creează un array conținând valorile din listă.
Pentru un array bidimensional se poate folosi
operatorul => pentru asocierea celor doi indici.
• Exemplu:
$note = array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
$calificative = array("S"=>"Satisfacator",
"B"=>"Bine","F"=>"Foarte bine");
• În primul caz s-a definit un array cu o singură
dimensiune iar în cel de-al doilea unul cu două
dimensiuni.
Programare Web– Curs 3 74
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
void list(lista de valori);
• Asignează o lista de variabile ca și când ar fi un
array.
array
• Exemplu:
$rezultat = mysql_query("select nume_s,
grupa
g p from studenti");
)
while (list($n, $g) =
mysql fetch row($rezultat))
mysql_fetch_row($rezultat))
{ print( "Nume: $n<br>Grupa: $g<br>\n"); }

Programare Web– Curs 3 75


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
int count(variabila);
• Întoarce numărul de elemente din variabilă.
• D
Dacăă este
t un array acestt număr
ă poate t fi maii mare
ca 1. Dacă variabila nu este setată întoarce 0.
array each(array array);
• Întoarce următoarea pereche (index
(index, valoare) dintr-
un array sub forma unui tablou având indicii 0 si 1
sau key și value.
value

Programare Web– Curs 3 76


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
• De notat că fiecare variabilă de tip array are
asociat un pointer intern care arată către unul
dintre elementele sale iar funcția each() se poate
folosi pentru parcurgerea sa.
p
• Exemplu:
$calificative = array ("S"=>"Satisfacator",
"B"=>"Bine"
B > Bine ,"F"=>"Foarte
F > Foarte bine");
bine );
list($c, $d) = each($calificative);
• Atunci:
At i
– $c are valoarea "S"
– $d are valoarea "Satisfacator"
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
mixed next(array
( y tablou);)
• Întoarce următorul element al unui array
sau false dacă nu mai sunt elemente
elemente,
avansând deci pointerul intern asociat
t bl l i
tabloului.
• De notat că dacă un tablou are elemente
nule și pentru acestea valoarea întoarsă va
fi false.
false De aceea
aceea, pentru parcurgerea unui
tablou se recomandă folosirea lui each().

Programare Web– Curs 3 78


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții ARRAY
mixed prev(array tablou);
• Întoarce precedentul element al unui array sau false dacă
nu mai sunt elemente, decrementând pointerul intern
asociat tabloului.
• Aceeași observație ca la next (folosire each)
mixed reset(array tablou);
• Setează pointerul intern asociat tabloului la primul
element al acestuia.
• Întoarce valoarea acestui element.
int sizeof(array tablou);
• Întoarce numărul de elemente ale unui tablou. Este
analog cu count().
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții de informare/
informare/setare
int error_reporting(int [level]);
• Setează nivelul de erori care sunt raportate de
PHP Valorile respective pot fi cumulate prin
PHP.
adunare în cazul în care se doresc setate
simultan mai multe tipuri de raportări
raportări.
string getenv(string variabila);
• Întoarce valoarea unei variabile de mediu sau
false în caz de eroare.
$ip = getenv("REMOTE_ADDR"); // prelevare
adresa IP a clientului
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții de informare/
informare/setare
void putenv(string setare);
• Creează o nouă variabilă de mediu. Exemplu:
putenv("USER
putenv( USER = $user
$user");
);
int phpinfo(void);
• ÎÎntoarce
t o suită
ită de
d iinformații
f ții privind
i i d PHP
PHP: opțiuni
ți i dde
compilare, versiune, informații despre serverul de web,
variabile de mediu
mediu, versiunea sistemului de operare
operare, etc
etc.
string phpversion(void);
• Întoarce
Î sub forma unui sir numărul versiunii PHP folosite.

Programare Web– Curs 3 81


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
void eval(string sir);
• Șirul de caractere (care trebuie sa conțină expresii valide
PHP) este evaluat.
• Exemplu:
$nume = 'Ion';
$
$str = ''Ma numesc $$nume<br>';'
echo $str;
eval( "\$str = \"$str\";" );
echo $str;
• Va avea ca efect tipărirea mesajelor:
Ma numesc $nume
Ma numesc Ion
Programare Web– Curs 3 82
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
void die(string mesaj);
• Afișează un mesaj și termină execuția scriptului.
• Exemplu:
E l
$nume_fisier = '/usr/local/date.txt';
$f = fopen($nume_fisier, 'r') or die "Nu se poate
deschide fisierul $filename";
void exit(void);
• Termină
T i ă imediat
i di t execuția
ți scriptului.
i t l i
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
void sleep(int
p( secunde);
)
• Întârzie execuția un număr de secunde.
echo(string arg1, string [argn]...);
sau
echo string arg1, string [argn]...;
• Evaluează și afișează parametrii primiți ca
argument.

Programare Web– Curs 3 84


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
print(string arg);
• Afișează argumentul.
int printf(string format, mixed [argumente]...);
• Afișează argumentele formatate conform șirului format
(asemănător cu limbajul C)
C).
int strcmp(string str1, string str2);
• C
Compara d doua șiruri.
i i ÎÎntoarce o valoare
l <00, egală
lă cu 0
sau >0 după cum str1 este mai mic, egal sau mai mare
decât str2.
str2 Literele mari și mici sunt considerate diferite
diferite.
int strlen(string sir);
• Întoarce
Î lungimea unui șir de caractere.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
string substr(string sir, int start, int [lung]);
• Întoarce un subșir conținând caracterele începând cu cel dat de start
si având lungimea lung. Dacă start este negativ, numărătoarea
pentru stabilirea caracterului inițial este făcută de la sfârșitul șirului.
D ă llung este
Dacă t negativ
ti ultimul
lti l caracter
t all subșirului
b i l i este
t cell aflat
fl t lla
distanța lung de sfârșitul șirului. Întoarce întotdeauna cel puțin un
• caracter cel dat de start
caracter, start.
• Exemple:
$rest = substr("abcdef"
substr( abcdef , 1); // întoarce "bcdef"
bcdef
$rest = substr("abcdef", 1, 3); // întoarce "bcd"
$rest = substr("abcdef"
substr( abcdef , -1);
1); // întoarce "f"
f
$rest = substr("abcdef", -2); // întoarce "ef"
$rest = substr("abcdef"
substr( abcdef , -3,
3 1); // întoarce "d"
d
$rest = substr("abcdef", 1, -1); // întoarce "bcde"
Programare Web– Curs 3 86
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
int is_array(mixed var);
• Întoarce
Î t t
true d ă variabila
dacă i bil este
t un array sii false
f l altfel.
ltf l
int is_double(mixed var);
int is_float(mixed var);
int is_real(mixed
is real(mixed var);
• Întorc true dacă variabila este un număr real și false altfel.
i t iis_int(mixed
int i t( i d var);
)
int is_integer(mixed var);
int is_long(mixed var);
• Întorc true dacă variabila este un număr întreg și false
altfel.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alte func
funcțții
int is_object(mixed var);
• Întoarce
Î t t
true d ă variabila
dacă i bil este
t un obiect
bi t șii false
f l altfel.
ltf l
int is_string(mixed var);
• Întoarce true dacă variabila este un șir de caractere și
false altfel.
int isset(mixed var);
• Întoarce true dacă variabila există și false altfel.
altfel
int unset(mixed var);
• Elimină o variabilă.
string strval(mixed var);
• Convertește la șir de caractere o variabilă scalară.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Acces la baze de date


din PHP
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Obiectiv
• Prezentarea modului în care se p poate face
accesul la baze de date din PHP.
• Vor fi prezentate funcțiile de acces pentru
MySQL și Oracle.
– Funcțiile ODBC sunt similare celor din MySQL
și Oracle.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Caracteristici
• Pachetul PHP p pune la dispoziție
p ț funcțiiț
pentru accesul la o multitudine de SGBD-
uri și pachete de gestiune a datelor
datelor.
• Din păcate aceste funcții nu sunt
standardizate ci de obicei copiază funcții
existente în API-urile p
pachetelor respective.
p
• Din această cauză pentru fiecare tip de
SGBD există
i tă un sett diferit
dif it de
d ffuncții
ții care
permit accesul la datele din baza de date.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Caracteristici
• Pașii în cazul regăsirii datelor sunt în general
următorii:
1 Stabilirea unei conexiuni cu serverul de baze de
1.
date (cine se conectează?)
2 Trimiterea
2. T i it spre execuție
ți a cereriiii d
de titip SELECT
3. Preluarea linie cu linie a datelor din tabela
rezultat și prelucrarea acestora
4 Eliberarea resurselor ocupate de rezultat
4.
5. Închiderea conexiunii, după execuția repetata a
pașilor 2-4
Programare Web– Curs 4 4
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Caracteristici
• În cazul execuției
ț altor tipuri
p de cereri
(insert, update, delete, cereri DDL, etc) se
execută pașii 11, 2 și 5
5, neexistând o tabelă
rezultat.
• ÎÎn toate cazurile, la apariția unei erori se
pot obține
p ț informații
ț despre
p ea folosind
funcții care întorc textul mesajului de
eroare.
eroare
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - conectare
1. Conectare: Pentru conectarea la SGBD există mai multe
f
funcții
ții care pott fi ffolosite
l it alternativ:
lt ti
resource mysql_connect(string [hostname] [:port] , string
[username] , string [password],
d bool
b l [new_link],
l k int
[client_flags] );
• ÎÎntoarce un identificator de conexiune (numeric, pozitiv)
în caz de succes și false în caz de eșec.
• Toate argumentele sunt opționale, valorile implicite fiind
localhost:3306, numele utilizatorului care deține procesul
server și un șir vid pentru parolă
parolă.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - conectare
• new_link forțează returnarea unui nou descriptor de
conexiune
i chiar
hi d dacăă există
i tă deja
d j o conexiune
i (i
(implicit
li it nu))
cu acel server iar client_flags specifică o serie de alte
setări (implicit e ignorat)
• În cazul unui apel cu aceleași argumente cu ale unei
conexiuni deja deschise va întoarce identificatorul
acesteia.
• Pot exista simultan mai multe conexiuni deschise cu unul
sau mai multe servere. Conexiunile se închid cu
mysql close() sau automat la terminarea scriptului.
mysql_close()
• Exemplu:
$
$conexiune
i = mysql_connect("localhost");
l t("l lh t")
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - conectare
resource mysql_pconnect(string [hostname] [:port],
string
t i [username]
[ ] , string
t i [[password]
d] ]], iintt
[client_flags] );
• ÎÎntoarce un identificator de conexiune persistentă sau
false în caz de eșec.
• Se aseamănă cu mysql_connect() cu deosebirea că o
astfel de conexiune nu se închide la terminarea scriptului
și nici la execuția mysql_close().
mysql close()
• Conexiunile persistente rămân deschise urmând să fie
returnate ca rezultat când se încearcă deschiderea de noi
conexiuni cu aceeași parametri.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Functii MySQL
MySQL-- ce BD
2. Specificarea bazei de date:
bool mysql_select_db(string database_name, resource
[id_conexiune] );
• Specifică numele bazei de date care va fi exploatată prin
acea conexiune (serverul MySQL poate gestiona mai
multe baze de date).
• Întoarce true pentru succes și false pentru eșec.
• Toate cererile care vor fi trimise în viitor cu
mysql_query()
y q q y() se vor executa în baza de date
specificată.
• Exemplu:
p
mysql_select_db("test_studenti", $conexiune );
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - cereri
1. Execuția unei cereri SQL:
resource mysql_query(string cerere, resource [id_conexiune] );
• Efectul este trimiterea cererii către server pentru a fi procesată.
• Întoarce: true/resursa în caz de reușită, false în caz de eșec.
• În cazul în care cererea a fost un SELECT rezultatul întors este o
resursa = identificator
id tifi t d de rezultat.
lt t
• Spațiul ocupat de un rezultat poate fi eliberat ulterior cu
mysql free result()
mysql_free_result().
• Exemplu:
$rezultat = mysql
mysql_query(
query("select
select * from studenti"
studenti , $conexiune );

Programare Web– Curs 4 10


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - cereri
• Observație: în afară de funcția mysql_connect
toate celelalte funcții mysql care utilizează un
descriptor de conexiune folosesc în cazul lipsei
acestui parametru ultima conexiune deschisă.
• Deci dacă într-o
într o pagină nu se folosește decât o
singură conexiune MySQL atunci nu este
necesară stocarea și folosirea ei explicită în
funcțiile utilizate.
• Iată
I tă un exemplu:
l
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - cereri
<?php
mysql_connect("localhost",
y "stud", "studpw")
p or die('Conexiune
esuata');
echo "Conectat<br>";
// nu folosim descriptor de conexiune:
mysql_select_db("stud") or die ('Selectie BD esuata');
echo " BD selectata<br>";
// si nici aici:
mysql_query("select * from produse") or
die('cerere esuata');
echo " Cerere OK<br>";
?>

Programare Web– Curs 4 12


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - cereri
• Există și funcția mysql_db_query:
resource mysql_db_query(string
mysql db query(string database,
database string cerere,
cerere resource
[id_conexiune] );
• Folosirea acestei funcții
ț nu este recomandată de situl p
php
p ((deprecated).
p )
• Efectul ei este cel cumulat al mysql_select_db și mysql_query.
• Exemplu:
<?php
mysql_connect("localhost", "stud", "studpw") or die('Conexiune esuata');
echo
h "Conectat<br>";
"C t tb "
mysql_db_query("stud",
"select * from produse")
p
or die('Cerere esuata');
echo " Cerere OK<br>";
?>

Programare Web– Curs 4 13


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - erori
• Detectarea erorii se face cu funcțiile:
ț
int mysql_errno(resource [id_conexiune] );
• Întoarce codul de eroare pentru operația
precedentă pe acea conexiune (implicit ultima
deschisă, ca mai înainte).
string mysql_error(resource [id_conexiune] );
• Întoarce textul mesajului de eroare pentru
operația precedentă pe acea conexiune.

Programare Web– Curs 4 14


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL - erori
• Aceste erori sunt returnate de serverul MySQL.
• Excepție face încercarea unei conexiuni cu un
host unde nu exista server MySQL
MySQL.
• În acest caz mesajul va fi ca mai jos:

Programare Web– Curs 4 15


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple
• Parola g
greșită
ș la conectare:

• Nume bază de date eronat:

Programare Web– Curs 4 16


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple
• Eroare de sintaxa in cerere:
<?php
? h
mysql_connect("localhost", "stud", "studpw") or die('Conexiune
esuata');
)
echo "Conectat...";
mysql_select_db("stud") or die ('Selectie BD esuata:
'
'.mysql_error());
l ())
echo " BD selectata<br>";
mysql query("select
mysql_query( select * form produse
produse")) or die('Cerere
die( Cerere esuata:
'.mysql_error());
echo " Cerere OK<br>";
?>

Programare Web– Curs 4 17


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemple
• Tabelă inexistentă:

• Coloană inexistentă:

Programare Web– Curs 4 18


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
• Încărcarea unei linii din rezultatul întors de o cerere
SELECT se poate t fface folosind
f l i d una didintre
t ffuncțiile
țiil
următoare:
1 mysql_fetch_row()
1. l f h () – Întoarce
Î o linie de rezultat ca tablou
cu indici numerici.
2. mysql_fetch_array() - Întoarce
Î o linie de rezultat ca
tablou ce poate fi folosit atât cu indici numerici cât și ca
tablou asociativ
asociativ.
3. mysql_fetch_assoc() - Întoarce o linie de rezultat ca
tablou asociativ
asociativ.
4. mysql_fetch_object() - Întoarce o linie de rezultat ca
obiect.
bi t
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
array mysql_fetch_row(resource rezultat);
• Întoarce un array (neasociativ, accesat prin indici) cu
valorile următoarei linii din rezultat sau false dacă nu mai
sunt linii.
• Exemplu:
p
while($linie = mysql_fetch_array($rezultat)) {
echo $linie[0];
echo $linie[1];
echo $linie[2];
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
array mysql_fetch_array(resource rezultat, int
[tip_rezultat]);
• Încarcă următoarea linie din rezultat într-un arrayy
asociativ.
• În caz de eroare întoarce false.
• Este asemănătoare cu mysql_fetch_row() dar
elementele liniei pot fi accesate și după numele coloanei
din rezultat.
• În cazul în care mai multe coloane au același nume
(pentru un join de exemplu) ultima coloana cu acel nume
va avea prioritate, celelalte putând fi accesate prin indici.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
• Tipul rezultatului (parametru opțional) poate fi
MYSQL_ASSOC, MYSQL_NUM sau valoarea
implicită MYSQL_BOTH. Se poate astfel ca
tabloul să fie accesat doar ca asociativ sau doar
cu indici numerici.
• Exemplu:
while($linie
hil ($li i = mysql_fetch_array($rezultat))
l f t h ($ lt t))
{ echo $linie["nume"];
[ ] }

Programare Web– Curs 4 22


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
array mysql_fetch_asoc(resource rezultat);
• Încarcă următoarea linie din rezultat într-un array
asociativ.
• În caz de eroare întoarce false.
• Este identic cu mysql_fetch_array
mysql fetch array având parametrul
tip_rezultat egal cu MYSQL_ASSOC.
• Exemplu:
while($linie = mysql_fetch_array($rezultat))
{ echo $linie["nume"]; }
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
array mysql_fetch_object(resource rezultat[,
string nume_clasa [, array $parametri ]] );
• Încarcă următoarea linie din rezultat într-un obiect.
• În caz de eroare întoarce false.
• nume_clasa
n m l s specifică numele
n mele clasei (implicit stdClass)
stdClass).
• Parametrii formează un array care va fi transmis
constructorului
t t l i pentrut clasa
l nume_clasa.
l
• Nu se mai pot în acest caz accesa elementele înregistrării
î ă t prin
încărcate i indici
i di i numerici
i i cii d
doar prin
i numele
l llor.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<?php
mysql connect("localhost"
mysql_connect( localhost , "stud"
stud , "studpw")
studpw )
or die('Conexiune esuata');
echo "Conectat...";
// nu folosim
f l i descriptor
d i t d de conexiune i l select
la l t db
mysql_select_db("stud")
or die (('Selectie BD esuata: '.mysql_error());
y q ())
echo " BD selectata<br>";
// si nici la query
$rezultat = mysql_query(
mysql query("select
select * from produse produse"))
or die('Cerere esuata: '.mysql_error());
echo " Cerere OK<br>";
while($linie=mysql_fetch_object($rezultat))
{ echo $linie->codp;
echo $linie
$linie->nume,
nume, "<br>";
br ;
}
?>
18.03.2010 Programare Web– Curs 4 25
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Fetch


Func
• La încărcarea unei linii de rezultat, pointerul intern în
rezultat avansează cu 1. El se ppoate ‘mișca’
ș șși altfel
folosind funcția
int mysql_data_seek(resource
mysql data seek(resource id_rezultat,
id rezultat int
numar_linie);
• Li
Linia
i specificată
ifi tă devine
d i lilinia
i curentă
tă în
î cadrul
d l rezultatului:
lt t l i
următorul apel mysql_fetch_???() va întoarce această
linie.
linie
• Întoarce: true în caz de reușită, false în caz de eșec.
• Notă:
N tă Pentru
P t prima
i linie
li i ffolosim
l i numărul
ă l 0!
• Exemplu:
int mysql_data_seek($rezultat, $j);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL – Informaț
Informații
int mysql_num_fields(resource rezultat);
• Întoarce numărul de câmpuri (coloane) dintr-un rezultat
de cerere SELECT.
int mysql_num_rows(resource rezultat);
• Întoarce numărul de linii dintr-un
dintr un rezultat de cerere
SELECT.
object mysql_fetch_field(resource
mysql fetch field(resource rezultat
rezultat, int
[offset_camp] );
• Întoarce un obiect conținând informații despre un câmp
(coloana) al rezultatului. Dacă offsetul de câmp nu este
specificat
p este considerat următorul câmp p al rezultatului
(se poate seta cu mysql_field_seek()). Pornește de la 0!
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL – Informa
Informațții
• Proprietățile obiectului întors de mysql_fetch_field sunt:
• name - nume coloană
• table - numele tabelei din care provine acea coloană
• def – valoarea implicită a coloanei
• max_length - lungimea maximă pentru acea coloană
• not_null - 1 dacă acea coloană nu poate conține valori nule.
• primary_key - 1 dacă acea coloană este o cheie primară.
• unique_key - 1 dacă acea coloană este cheie unică
• lti l k - 1 d
multiple_key dacă
ă acea coloană
l ă este
t o cheie
h i neunică
i ă
• numeric - 1 pentru coloana numerică
• blob - 1 pentru coloana de tip BLOB
• type - tipul coloanei
• unsigned - 1 pentru coloane unsigned
• zerofill - 1 pentru coloane zero-filled
Programare Web– Curs 4 28
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL – Informa
Informațții
string mysql_field_name(resource rezultat, int
numar_camp);
p);
• Întoarce numele câmpului cu numărul specificat dintr-un
rezultat (pornește de la 0!).
• Exemplu:
$
$numecamp = mysql_field_name($rezultat,
l fi ld ($ lt t $j)
$j);
string mysql_field_type(resource rezultat, int
offset_camp);
ff t )
• Este similar cu mysql_field_name() întorcând însă tipul
câmpului specificat (pornește de la 0!).
int mysql_field_len(resource rezultat, int offset_camp);
• Întoarce lungimea câmpului specificat (pornește de la 0!).
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Modificare


Func
int mysql_affected_rows(resource [id_conexiune] );
• Întoarce numărul de linii afectate de ultima cerere
INSERT, UPDATE sau DELETE pe conexiunea
specificată sau în lipsa acestui parametru pe ultima
conexiune deschisă.
• Exemplu:
mysql_affected_rows($conexiune);

int mysql_insert_id(resource
mysql insert id(resource [id_conexiune]
[id conexiune] );
• Întoarce valoarea generată de ultimul INSERT executat
pentru o coloană definită cu AUTO
AUTO_INCREMENT.
INCREMENT
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții MySQL - Terminare


Func
int mysql_free_rezultat(resource rezultat);
• Apelul acestei funcții eliberează spațiul ocupat de
rezultatul unei cereri.
int mysql_close(resource [id_conexiune] );
• Închide conexiunea specificată sau în lipsă ultima
conexiune deschisă.
• Întoarce false în caz de eșec
eșec, altfel true.
true
• Nu închide conexiunile deschise cu mysql_pconnect().
• Exemplu:
int mysql_close($conexiune);
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții MySQL
• Pe lângă
g funcțiile
ț p prezentate există și
ș altele
care se pot consulta în documentația PHP.
• U
Unelel di
dintre
t acestea t vor fi prezentate
t t în
î
finalul lecției, în contextul rezolvării
problemelor de securitate (cum este
mysql
my q _real_escape p _string)g)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - conectare
resource oci_connect ( string user , string passw [, string bd
[ string
[, t i setcar
t [,
[ int
i t mod_sesiune
d i ]]] )
• Se realizează conectarea la serverul Oracle local cu
userul și parola specificate.
• Dacă lipsește numele instanței (bd) PHP îl ia din variabila
env. ORACLE_SID.
• Setul de caractere se poate indica începând cu versiunea
9.2 de Oracle.
• mod_sesiune poate fi OCI_DEFAULT, OCI_SYSOPER și
ș
OCI_SYSDBA. Ultimele două stabilesc o sesiune
privilegiată.
• Există și aliasul ocilogon(…) cu aceleași efecte.
Programare Web– Curs 4 33
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - conectare
resource oci_pconnect ( string user , string
passw [, string bd [, string setcar [, int
mod_sesiune]]] )
• Are aceiași parametri ca precedenta.
• F
Funcția
ți stabilește
t bil t o conexiune
i persistentă,
i t tă care
nu se închide la terminarea scriptului ci e
refolosită
f l ită dde scripturile
i t il următoare.
ăt
• În felul acesta se micșorează
ș overhead-ul de
sistem.

Programare Web– Curs 4 34


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - conectare
resource oci_new_connect
_ _ ( string
g user ,
string passw [, string bd [, string setcar
[ int mod_sesiune]]]
[, mod sesiune]]] )
• Deschide o nouă conexiune, chiar daca
există deja una (celelalte 2 funcții nu fac
)
asta).
• Toate 3 returnează un descriptor de
conexiune
i ((echiv.
hi TRUE) sau FALSE înî
caz de eroare.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - Parse
• Al doilea pas dupa conectare este compilarea (parsingul)
cererii.
• Aceasta se face cu funcția:
resource oci_parse
oci parse ( resource conexiune , string cerere )
• Returnează un descriptor de cerere (statement handle)
necesar execuției efective
efective.
• Exemplu:
$c = oci_connect("scott","tiger");
$cerere = "select * from STUD where
cods=".$_REQUEST['cods'];
echo "<h2>Cererea este: $cerere</h2>";
$
$stmt = oci_parse($c, $cerere);
Programare Web– Curs 4 36
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle – Execu
Execuțție
• Execuția efectivă a cererii se face cu:
bool oci_execute ( resource $stmt [, int mod])
• P
Parametrii
t ii sunt:
t un d
descriptor
i t d de cerere returnat
t t
de oci_parse și opțional modul de tratare al
t
tranzacțiilor.
țiil
• Modul p
poate fi:
OCI_COMMIT_ON_SUCCESS (opțiunea
implicită) și OCI
OCI_DEFAULT.
DEFAULT

Programare Web– Curs 4 37


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle – Execu
Execuțție
OCI_DEFAULT:
_
• În al doilea caz, execuția unei cereri DML
d
duce lla d
demararea uneii ttranzacții.
ții
• Această tranzacție va fi revocată automat
la terminarea scriptului sau la închiderea
conexiunii.
conexiunii
• Pentru a controla această tranzacție
ț se
poate folosi oci_commit și oci_rollback.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle – Execu
Execuțție
bool oci_commit
_ ( resource conexiune);
)
bool oci_rollback ( resource conexiune);
• Efectul lor este de a comite, respectiv
revoca tranzacția în curs pe acea
conexiune.
• Această tranzacție poate fi formată din
ț uneia sau mai multor cereri DML.
execuția
• Returnează TRUE / FALSE în caz de
succes/eșec.
/
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - Rezultat
• Pentru a afla dimensiunea rezultatului se pot folosi:
int oci_num_rows ( resource $stmt )
• Întoarce numărul de linii afectate de execuția cererii (câte
linii returnează un select dar și câte linii șterge un delete
de exemplu)
int oci_num_fields ( resource $stmt )
• Returnează numărul de coloane ale rezultatului execuției
unei cereri SELECT.
string oci_field_name
oci field name ( resource stmt , int coloana )
• Returnează numele coloanei cu numărul specificat (prima
coloană are indicele 1)
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
........
$ t t = oci_parse($c,
$stmt i ($ $$cerere);)
// executie
oci execute($stmt OCI DEFAULT);
oci_execute($stmt,OCI_DEFAULT);
// rezultatul va fi prezentat ca tabela
echo "<table border = 1>";
// luam in nc nr. de coloane in rezultat
$nc = oci_num_fields($stmt);
// afisam
fi antet
t t tabel
t b l
echo "<tr>";
for($i 1;$i $nc;$i )
for($i=1;$i<=$nc;$i++)
echo "<td>".oci_field_name($stmt, $i)."</td>";
echo "</tr>";
........
Programare Web– Curs 4 41
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții Oracle - Fetch


Func
• Pentru încărcarea liniilor există 4 funcții
ț
asemănătoare cu cele din MySQL:
array oci_fetch_row
i f t h ( resource stmt
t t)
• Întoarce tablou cu indici numerici
array oci_fetch_assoc ( resource stmt)
• Întoarce tablou asociativ
array oci_fetch_object
f h b ( resource stmt))
• Întoarce obiect
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Funcțții Oracle - Fetch


Func
array oci_fetch_array ( resource stmt [, int mod ] )
• Modul poate fi:
1. OCI_BOTH
OCI BOTH - întoarce array asociativ și cu indici numerici
- valoarea implicită.
2 OCI_ASSOC
2. OCI ASSOC - întoarce array asociativ
3. OCI_NUM - întoarce array cu indici numerici
4 OCI_RETURN_NULLS
4. OCI RETURN NU S - crează
ă elemente
l goale
l pentru
valorile nule
5. OCI_RETURN_LOBS - returnează valoarea LOB-ului
unui descriptor
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<?php
$connection = oci
oci_connect(
connect("stud"
stud , "studpw");
studpw );
$cerere = "SELECT nume, pret, coloana_lob FROM produse";

$stmt = oci_parse ($connection, $cerere);


oci_execute ($stmt);

while ($lin = oci_fetch_array ($stmt, OCI_RETURN_LOBS)) {


echo $lin[0]."<br>";
echo
h $lin[1]."<br>";
$li [1] " b "
echo $lin['COLOANA_LOB']."<br>";
// ultima linie afiseaza continutul col. LOB
}
?>

Programare Web– Curs 4 44


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alt exemplu
• Continuarea exemplelor anterioare:
while ($linie=oci_fetch_row($stmt)) {
// incepe linie date
echo "<tr>";
<tr> ;
for($i=0;$i<$nc;$i++) {
// daca e valoare nula o inlocuim cu sirul NULL
if (!isset($linie[$i]))
$linie[$i] = "NULL";
// afisam efectiv o celula
echo "<td>".$linie[$i]."</td>";
}
// gata linie date
echo "</tr>";
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

PL/SQL
• Prezentăm în continuare un exemplu de execuție
a unui bloc PL/SQL în PHP.
• Se folosește funcția oci_bind_by_name
oci bind by name pentru
punerea în corespondență a variabilelor externe
PL/SQL cu variabile PHP
PHP.
• Sintaxa funcției este (vezi și documentația):
bool oci_bind_by_name ( resource stmt , string
nume_oracle , mixed &var_PHP [[, int
lung_maxima = -1 [, int tip = SQLT_CHR ]] )
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Fetch all
int oci_fetch_all ( resource stmt , array &output [, int skip= 0 [, int maxlinii
= -1 [, int $flags= 0 ]]] )
• Încarcă toate liniile unui rezultat SELECT (sau un număr specificat de linii)
într-un array.
• Î t
Întoarce numărul
ă ld de liliniiii îîncărcate.
ă t
• Exemplu:
$conn = oci_connect(.
oci connect( . . );
$stmt = oci_parse($conn, "select * from emp");
oci execute($stmt);
oci_execute($stmt);
$nrows = oci_fetch_all($stmt, $results);
if ($
($nrows > 0)) {
foreach ($results as $key => $val) {
echo "$key, $val\n";
}
Programare Web– Curs 4 47
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

PL/SQL
$c = oci_connect("stud","studpw");
// variabile: $cati (PHP) si :cati (externa Oracle)
$cerere = "begin
select count(*) into :cati from STUD
where cods=
cods=".$_REQUEST[
$ REQUEST['cods']cods ].";; ".
"exception
when others then
:cati := 0;
end;"; // atentie: ; de dupa end!
$stmt = oci_parse($c,
oci parse($c, $cerere);
// bind by name:
oci_bind_by_name($stmt, ":cati", $cati, 32);
// executie
ti
oci_execute($stmt,OCI_DEFAULT);
// rezultatul va fi in variabila PHP $cati
echo "Numar de studenti: ".$cati;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Alt exemplu
$c = oci_connect("scott","tiger");
$cerere = "begin
begin
select cods, nume into :cods, :nume from STUD
where matr=".$_REQUEST['matr']."; ".
"exception
when others then
:cods ::= 0;
:nume := 'nu avem astfel de student';
end;"; // nu trebuie uitat ; dupa end
$
$stmt = oci_parse($c,
i ($ $
$cerere); )
// bind by name: se asociaza 2 variabile externe cu var. PHP
oci_bind_by_name($stmt,
y ($ ":cods", $
$cods, 32);
)
oci_bind_by_name($stmt, ":nume", $nume, 32);
// executie
oci execute($stmt OCI DEFAULT);
oci_execute($stmt,OCI_DEFAULT);
echo $cods, " ", $nume;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - Erori
• Descrierea erorilor se poate obține cu:
array oci_error ([ resource $sursa ] )
• Pentru
P t erorile
il dde conexiune
i nu se iindică
di ă sursa
• Pentru celelalte se p
pune descriptorul
p cel mai
apropiat
• Array-ul conține elementele:
– code (codul de eroare)
– message (mesajul)
( j l)
– offset (pozitia erorii)
– sqltext
l (t t l cereriiii eronate)
(textul t )
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
if (!($r = oci_execute($stmt))) {
// se intra aici in caz de eroare
$e = oci_error($stmt);
oci error($stmt);
echo htmlentities($e['message']);
echo
h "<pre>";
" "
echo htmlentities($e['sqltext']);
printf("\n%".($e['offset']+1)."s", “ ^"); // o
sageata
g la pozitia
p erorii
echo "</pre>";
}
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Func
Funcțții Oracle - Final
• Închiderea conexiunii se face cu:
bool oci_close ( resource conexiune )
• Pe lângă funcțiile prezentate mai există și
altele (vezi documentația)

Programare Web– Curs 4 52


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Elemente de securitate
• În continuare p
prezentăm doar câteva
elemente de securitate pentru aplicații
scrise în PHP și care accesează o bază de
date.
• Una dintre problemele principale este
p care în mod obișnuit
aceea că unui script ș
este asociat unui formular i se pot transmite
parametri - inclusiv în bara de adresă
(metoda GET) – care nevalidați pot duce la
i j ți SQL
injecție SQL.
Programare Web– Curs 4 53
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Injec
Injecțția SQL
• Injecția
j ț SQL înseamnă execuția ț unei cereri
nedorite inserată într-un șir de caractere
executat de serverul de baze de date
date.
• Ea apare ca urmare a nevalidării datelor de
intrare și a ignorării unor măsuri minime de
securitate.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Comentarii
• Semnul de comentarii poate afecta cererea SQL
executată
t tă cu un parametru
t primit.
i it
• Exemplu: fie o cerere de tipul
SELECT * FROM members WHERE username = 'param1'
AND password = 'param2'
• Dacă pentru param1 se introduce valoarea: admin'--
cererea executată va fi:
SELECT * FROM members WHERE username = 'admin' --
AND p
password = 'param2'
p
• Se observă că partea de verificare parolă din cerere este
acum comentată - deci nu se mai verifică șși p
parola ci doar
username.
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Comentarii
• Variante (SqlServer, MySQL, Oracle):
– admin' –
– admin
admin' #
– admin'/*
– ' or 1=1—
– ' or 1=1#
– ' or 1=1/*
– ')) or '1'='1—
1 = 1—
– ') or ('1'='1--
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Date fă
fără '
• O recomandare general acceptată este aceea de
a pune între apostrofe toate elementele primite
ca intrare de la user.
• Iată un exemplu (bine și mai puțin bine)
$query = "SELECT * FROM ttabela
$ b l where
h
col = '" . $_REQUEST['ceva'] . "'";
$query = "SELECT * FROM tabela where
col = " . $_REQUEST[
$ REQUEST['ceva']
ceva ] ;
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Date fă
fără '
• Ce se poate întâmpla în al doilea caz:
• Input: 1 or (1=1). Cererea devine:
$query = "SELECT
SELECT * FROM tabela where col = 1
or (1=1)"
• Vor fi întoarse deci toate liniile tabelei și nu doar
câteva.
• Input: 1 and (1=0); drop table tabela;
• Cererea de
devine:
ine
$query
q y = "SELECT * FROM tabela where col = 1
and (1=0); drop table tabela; "
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Cereri multiple
• În acest caz ș
șirul de executat conține
ț două
cereri SQL, dintre care a 2-a este
distructivă.
distructivă
• Există sisteme de gestiune care execută
astfel de succesiuni de cereri primite din
PHP (p(postgresql,
g q , mssql)
q)
• Soluția este fie folosirea apostrofelor, fie
f l i
folosirea mecanismului
i l id
de marcare a unor
caractere speciale (inclusiv apostrof).

Programare Web– Curs 4 59


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Escape string
• Dacă parametrul PHP (din PHP.ini)
magic_quotes_gpc este trecut pe On, toate
aceste caractere speciale sunt prefixate cu
backslash.
• După înlăturarea acestuia
acestuia, se poate folosi
mecanismul propriu de escape al SGBD-ului
respectiv.
respectiv
• Iată un exemplu:

Programare Web– Curs 4 60


Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
<?php
if (get_magic_quotes_gpc()) {
$nume = stripslashes($nume);
$descriere = stripslashes($descriere);
// Cererea:
query = sprintf(
"SELECT * FROM users WHERE user='%s'
AND password='%s'",
mysql_real_escape_string($nume),
mysql_real_escape_string($descriere));
.....
?>
Universitatea Politehnica Bucuresti - Facultatea de Automatica si Calculatoare

Exemplu
• Funcția mysql_real_escape_string va prefixa cu
\ caracterele speciale din MySQL: \x00, \n, \r, \, ',
" si \x1a.
• Analog, prin folosirea primei sintaxe (cu '), cele
două cereri anterioare devin:
$query = "SELECT * FROM tabela where col = '1
or (1=1)'"
(1 1)'"
$query
q y = "SELECT * FROM tabela where col = '1
and (1=0); drop table tabela;' "

Programare Web– Curs 4 62

S-ar putea să vă placă și