Fundamente Teoretice Ale Paginilor Web H
Fundamente Teoretice Ale Paginilor Web H
1. INTRODUCERE
3
3.13.13. Sortarea datelor.........................................................................................................................................105
3.13.14. Filtrarea datelor........................................................................................................................................106
3.13.15. Actualizarea datelor..................................................................................................................................106
3.13.16. Funcţii agregate........................................................................................................................................107
3.13.17. Subinterog ri............................................................................................................................................108
3.13.18. Gruparea datelor.......................................................................................................................................109
3.13.19. Uniuni de tabele........................................................................................................................................111
3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP...................................................115
3.13.21. Elementele de bazã ale limbajului SQL*PLUS .......................................................................................118
3.13.22. Crearea unei baze de date prin comenzi SQL ..........................................................................................163
Bibliografie:
Bibliografie Internet :
4
1. INTRODUCERE
Începând cu anii ’95, Internetul, sub aspectul s u cel mai popular, şi anume al paginilor web,
a cunoscut o amploare greu de imaginat.
Dac la început, paginile web aveau un conţinut simplu şi oarecum stângace, în zilele
noastre aspectul acestora s-a schimbat radical. Dup doar 10 ani, în paralel cu evoluţia tehnicii de
calcul, au evoluat şi tehnicile de programare a acestora. Primele pagini permiteau doar navigarea
prin conţinutul lor, pe când în zilele noastre ele au o utilizare foarte larg , de la jocuri şi aplicaţii
grafice dinamice la comerţ pe Internet.
Limbajul PHP este un limbaj de programare destinat în primul rând Internetului, aducând
dinamic unei pagini web. Este unul dintre cele mai importante limbaje de programare web
open-source (codul surs este public, fiind accesibil tuturor) şi server-side (rularea sa nu se face pe
calculatorul celui care vizualizeaz pagina, ci pe server-ul care o conţine).
Este unul dintre cele mai folosite limbaje de programare server-side. Statisticile arat c la 1
mai 2008, suportul PHP este prezent pe 20 de milioane dintr-ul total de 70 de milioane de
website-uri active din lumea întreag .
Popularitatea de care se bucur acest limbaj de programare se datoreaz urm toarelor sale
caracteristici:
• Familiaritatea – sintaxa limbajului este foarte uşoar , fiind foarte la îndemân în
special pentru programatorii care cunosc limbajul C;
• Simplitatea – sintaxa limbajului este destul de liber . Nu este nevoie de includere de
biblioteci sau de directive de compilare, codul PHP inclus într-un document fiind trecut între nişte
marcaje speciale;
• Securitatea – PHP-ul pune la dispoziţia programatorilor un set flexibil şi eficient de
m suri de siguranţ ;
5
• Flexibilitatea – fiind ap rut din necesitatea dezvolt rii web-ului, PHP a fost
modularizat pentru a ţine pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit
server web, PHP-ul a fost integrat pentru numeroasele servere web exitente: Apache, IIS, Zeus, etc.
• Gratuitatea – este, probabil, cea mai important caracteristic a PHP-ului. Dezvoltarea
PHP-ului sub licenţa open-source a determinat adaptarea rapid a sa la nevoile web-ului,
eficientizarea şi securizarea codului.
În capitolul al II-lea al acestei lucr ri (Fundamente teoretice ale paginilor WEB – limbajul
HTML) mi-am propus o parcurgere ceva mai am nunţit , sub forma unui tutorial, a limbajului
HTML standard, descriind tag-urile cele mai importante şi exemplificând aceste descrieri cu mici
aplicaţii. Capitolul se încheie cu o trecere în revist , în care exist câteva exemple comentate, a
tehnicilor de programare dinamice ale unei pagini web, care r mân îns tot pe domeniul HTML.
Acest capitol este mai mult decât necesar, din cauz c PHP nu face altceva decât s ruleze
programe în urma c ruia este generat cod HTML. Nu putem aşadar vorbi de limbajul PHP f r a
cunoaşte HTML
6
7
2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB – LIMBAJUL HTML
2.1. Scurt istoric al apari iei Internetului şi func ionarea sa. Re eaua WWW.
Conceptul de Hipertext.
Istoria Internetului începe cu anul 1968, când guvernul S.U.A. intenţiona s interconecteze
universit ţile, departamentele militare şi de ap rare ale ţ rii, astfel încât ele s coopereze în cadrul
unor proiecte de cercetare comune. Astfel, s-a format o agenţie numit Advanced Research Projects
Agency (ARPA). Una din cheile proiectului punea în discuţie faptul c , stocarea tuturor informaţiilor
pe un singur calculator nu ar fi fost deloc sigur , fie din cauz c acesta ar putea fi ţint vulnerabil
a unui eventual atac, fie pur şi simplu din cauz c acestea ar putea fi pierdute în cazul unei
defecţiuni tehnice majore. O metod de a face faţ unei asemenea situaţii ar fi de a copia şi distribui
informaţiile pe mai multe calculatoare, în întreaga ţar , folosind o reţea.
În 1975, câteva dintre limbajele sau protocoalele pe care calculatoarele le foloseau pentru a
comunica între ele s-au standardizat. Majoritatea universit ţilor importante şi a departamentelor de
ap rare din S.U.A. s-au legat împreun într-o reţea numit DARPANET, toate calculatoarele
folosind acelaşi protocol pe care ast zi îl cunoaştem sub denumirea de TCP/IP. Reţeaua, cu timpul,
a fost înlocuit de mai multe reţele, care ast zi împânzesc globul p mântesc.
Începând cu anul 1980, mai multe colegii şi universit ţi au fost conectate la Internet. Acest
lucru a permis universit ţilor s -şi împart informaţii despre cercet rile lor, programe şi ştiri
recente. În anii ’90 Internetul s-a deschis şi în scopuri comerciale. În curând, multe alte c i de
utilizare a informaţiilor transmise prin intermediul acestei gigantice reţele au fost dezvoltate.
În prezent, este posibil s foloseşti Internetul pentru a trimite scrisori electronice pe întregul
glob în doar câteva secunde. Poţi c uta informaţii despre orice subiect doreşti. Expresia „World
Wide Web” (WWW) defineşte o colecţie de documente care se întinde în câteva sute de milioane de
calculatoare.
Principiul de baz al funcţion rii Internetului const în faptul c dou sau mai multe
calculatoare pot comunica între ele. Pentru ca acest lucru s fie posibil este necesar s existe un
„protocol”, adic un ansamblu de norme care trebuie respectate de calculatoare (deci de programele
care ruleaz pe ele) pentru ca schimbul de date s poat avea loc.
Normele se refer la:
• g sirea calculatorului destinatar al transferului de date;
• transmiterea efectiv a datelor;
• modalit ţi prin care expeditorul comunic faptul c au fost transmise toate datele, iar
destinatarul comunic faptul c le-a recepţionat;
8
• compresia datelor: prin aplicarea anumitor algoritmi matematici, datele care urmeaz s fie
expediate sunt prelucrate de aşa natur , încât s fie memorate prin utilizarea unui spaţiu cât mai mic
de memorie. Prin urmare, transmiterea lor dureaz mai puţin. Invers, la destinaţie sunt
decompresate prin utilizarea aceloraşi algoritmi matematici;
• identificarea erorilor care pot interveni în transmiterea datelor: şi aici exist mai mulţi
algoritmi care permit identificarea şi corectarea erorilor.
Standardul care s-a impus în ceea ce priveşte Internetul, const în protocolul TCP/IP.
Numele este de fapt, numele comun al unei familii de protocoale utilizate pentru transferul datelor
în reţea. Orice calculator conectat la Internet are o adres , numit adres IP (Internet Protocol
Address). O adres IP este alc tuit din 4 numere între 0 şi 255, prin urmare o astfel de adres
ocup 4 octeţi. Cum transmiterea datelor la un moment dat se face între dou calculatoare, datele se
transmit de la o adres IP la alta.
Bazele World Wide Web (WWW) au fost puse în 1989 la Centrul European de Cercet ri
Nucleare (CERN) în Geneva (Elveţia). Propunerea iniţial de creare a unei colecţii de documente
având leg turi între ele a fost f cut de Tim Berners-Lee în martie 1989. Aceast propunere a ap rut
în urma problemelor de comunicare pe care le întâmpinau echipele de cercet tori ce foloseau
centrul, chiar şi folosind poşta electronic .
9
Primul server web folosit de Tim Berners-Lee a ap rut nu mult înainte de decembrie 1991,
când s-a f cut prima lui demonstraţie public . Studiul a fost continuat prin apariţia primei aplicaţii
grafice Mosaic, în februarie 1993, realizat de cercet torul Marc Andreessen de la centrul
universitar National Center for Supercomputing Applications (NCSA) din oraşul Urbana-
Champaign din statul federal Illinois, SUA. Ulterior WWW-ul a evoluat pân la ceea ce este ast zi,
un serviciu integrativ şi multimedial, având ca suport fizic Internetul.
Practic, WWW este un sistem de documente şi informaţii de tip hipertext legate ele între ele,
care pot fi accesate prin reţeaua mondial de Internet. Documentele, care rezid în diferite locaţii pe
diverse calculatoare-server, pot fi reg site cu ajutorul unei adrese unice. Hipertextul este prelucrat
cu un ajutorul unui program de navigare în web numit browser care descarc paginile web de pe un
server web şi le afişeaz pe un terminal.
Noţiunea de website (sau pur şi simplu site, ori „site web”) desemneaz o grup de pagini
web multimediale (conţinând texte, imagini fixe, imagini mişc toare şi chiar sunete), accesibile în
Internet în principiu oricui, de obicei pe o tem anume, şi care sunt conectate între ele prin aşa-
numite hyperlinkuri. Diversele situri web pot fi oferite de c tre o companie, un proiect, o reţea de
utilizatori, o persoan particular , o administraţie public şi multe altele.
10
Pentru crearea paginilor web s-a impus limbajul HTML (HyperText Markup Language) – un
limbaj de marcare, al c rui scop const în prezentarea într-un anumit format a informaţiilor:
paragrafe, tabele, fonturi, culori, ş.a.m.d.
Calculatorul pe care se g seşte site-ul se numeşte „server”, iar calculatoarele care acceseaz
conţinutul site-ului se numesc „client”.
Orice calculator client trebuie s dispun de un program specializat, numit „browser”, cu
ajutorul c ruia s se poat interpreta şi deci vizualiza fişierele HTML.
Pe server trebuie s se g seasc un program care r spunde cererilor browser-ului aflat pe
calculatorul client. Cererea efectuat de c tre browser şi r spunsul server-ului se fac prin
respectarea unui anumit protocol. Acest protocol se numeşte HTTP (HyperText Transfer Protocol).
HTML este un limbaj de marcare orientat c tre prezentarea documentelor text pe o singura
pagin .
Utilizând un software de redare specializat, numit agent utilizator HTML (cel mai bun
exemplu de astfel de software fiind browserul web) HTML furnizeaz mijloacele prin care
conţinutul unui document poate fi adnotat cu diverse tipuri de metadate şi indicaţii de redare.
Indicaţiile de redare pot varia de la decoraţiuni minore ale textului (cum ar fi specificarea faptului
c un anumit cuvânt trebuie subliniat sau c o imagine trebuie introdus ) pân la scripturi
sofisticate, h rţi de imagini şi formulare. Metadatele pot include informaţii despre titlul şi autorul
documentului, informaţii structurale despre cum este împ rţit documentul în diferite segmente,
paragrafe, liste, titluri etc. şi informaţii cruciale care permit ca documentul s poat fi legat de alte
documente pentru a forma astfel hiperlink-uri.
HTML este un format text proiectat pentru a putea fi citit şi editat de oameni utilizând un
editor de text simplu. Totuşi scrierea şi modificarea paginilor în acest fel solicit cunoştinţe solide
de HTML şi este consumatoare de timp. Editoarele grafice cum ar fi Macromedia Dreamweaver sau
Microsoft FrontPage permit ca paginile web sa fie tratate asem n tor cu documentele Word, dar cu
observaţia c aceste programe genereaz un cod HTML care este de multe ori de proast calitate.
HTML se poate genera direct utilizând tehnologii de codare din partea serverului cum ar fi
PHP, JSP sau ASP.
11
2.3.1 Scrierea de cod HTML. Editoare specializate şi validatoare HTML.
Crearea unui fişier HTML este foarte simpl , putând fi f cut cu ajutorul oric rui editor de
text. Totuşi, pentru a avea un control ridicat asupra corectitudinii codului scris, este recomandat s
utiliz m un editor specializat, care s pun în evidenţ diversele elemente de marcare (TAG-uri,
numite şi „elemente” sau „etichete”) sau, mai mult, s poat verifica şi detecta erorile.
Din categoria editoarelor care pun în evidenţ diferitele elemente face parte editorul
Notepad++, iar din categoria validatoarelor face parte CSE HTML Validator Lite, ambele fiind
gratuite şi putând fi desc rcate de pe Internet.
Iat şi modul în care pagina de mai sus este vizualizat în Internet Explorer:
12
• Opţional, antetul poate conţine titlul paginii, cuprins între tag-urile <TITLE> şi </TITLE>. Titlul
apare pe bara de titlu a ferestrei afişate în browser.
• Corpul poate conţine texte şi/sau imagini. În exemplu, pagina conţine textul „Acesta este primul
exemplu de pagina...”
• Comentariile, care nu sunt afişate de c tre browser, pot fi scrise între tag-urile <!-- şi -->.
• Numele tag-urilor nu sunt case sensitive, deci pot fi scrise atât cu litere mici cât şi cu litere mari.
În continuare, pentru a le pune în evidenţ , le vom scrie cu litere mari.
În cazul paragrafului, atributul align controleaz alinierea textului din cadrul paragrafului.
Dac acest atribut nu este prezent, alinierea este f cut în mod implicit la stânga. Acest atribut poate
lua una dintre valorile center, left, right, justify, ca în exemplul de mai jos
(apl002.html):
<HTML>
<HEAD>
<TITLE>Alinierea paragrafelor</TITLE>
</HEAD>
<BODY>
<P align="center">Aliniat in centru</P>
<P align="right">Aliniat la dreapta</P>
<P align="left">Aliniat la stinga</P>
<P align="justify">Paragraful acesta este aliniat la ambele margini</P>
</BODY>
</HTML>
13
Iat pagina al c rei cod tocmai a fost prezentat, vizualizat în Internet Explorer:
• <BR> : Are ca efect forţarea afiş rii a ceea ce urmeaz pe rândul urm tor. Acest tag nu
creeaz un nou paragraf (s ne reamintim c între dou paragrafe este automat l sat o linie vid )
• <B>...</B> : Are rolul de a afişa bold (îngroşat) textul cuprins între cele dou tag-uri ale
sale. Un tag sinonim al lui <B> este: <STRONG>...</STRONG>
• <I>...</I> : Are rolul de a afişa italic (înclinat) textul cuprins între cele dou tag-uri ale
sale. Tag-uri sinonime ale lui <I> sunt: <EM>...</EM>, <DFN>...</DFN>,<CITE>...</CITE>.
• <U>...</U> : Are rolul de a afişa subliniat textul cuprins între cele dou tag-uri ale sale. Un
tag sinonim al lui <U> este: <INS>...</INS>
• <S>...</S> : Are rolul de a afişa t iat (cu o linie orizontal ) textul cuprins între cele dou
tag-uri ale sale. Un tag sinonim al lui <S> este: <DEL>...</DEL>
• <BIG>...</BIG> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai
mare decât textul în care este cuprins.
• <SMALL>...</SMALL> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale
mai mic decât textul în care este cuprins.
• <SUP>...</SUP> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai
sus (ca o putere)
• <SUB>...</SUB> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai
sus (ca un indice)
14
• <TT>...</TT> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai sus
monospaţiat (toate caracterele ocup aceeaşi lungime – practic, se foloseşte fontul Courier New)
În cod-ul HTML de mai jos g siţi toate aceste tag-uri exemplificate (apl003.html):
<HTML>
<HEAD>
<TITLE>Formatarea textului</TITLE>
</HEAD>
<BODY>
<P>
<B>Acest text este afisat folosind tag-ul B</B> <BR>
<STRONG>Acest text este afisat folosind tag-ul STRONG</STRONG> <BR>
<I>Acest text este afisat folosind tag-ul I</I> <BR>
<DFN>Acest text este afisat folosind tag-ul DFN</DFN> <BR>
<EM>Acest text este afisat folosind tag-ul EM</EM> <BR>
<U>Acest text este afisat folosind tag-ul U</U> <BR>
<INS>Acest text este afisat folosind tag-ul INS</INS> <BR>
<S>Acest text este afisat folosind tag-ul S</S> <BR>
<DEL>Acest text este afisat folosind tag-ul DEL</DEL> <BR>
Normal <BIG>Mai mare</BIG> Normal <BR>
Normal <SMALL>Mai mic</SMALL> Normal <BR>
Iata si un <SUP>exponent</SUP> <BR>
iar acum un <SUB>indice</SUB> <BR>
<TT>Acest text este monospatiat</TT>
</P>
</BODY>
</HTML>
15
- color permite specificarea culorii. Aceasta se specific fie prin intermediul
constantelor predefinite ale HTML-ului (numele englezesc al culorii) fie prin componentele sale de
Roşu, Verde şi Albastru exprimate în hexazecimal, de forma #RRGGBB (vom detalia aceste
constante de culoare ceva mai încolo).
Iat un exemplu de utilizare al lor (apl004.html):
<HTML>
<HEAD>
<TITLE>Exemplificare titluri si font</TITLE>
</HEAD>
<BODY>
<P>
<H1>Acesta este un titlu de tip H1</H1>
<H2>Acesta este un titlu de tip H2</H2>
<H3>Iar acesta este un titlu de tip H3</H3>
<FONT face="arial" color="blue" size="4">
Acest text este scris cu fontul Arial, albastru, dimensiune 4
</FONT><BR>
Iar acest text este scris normal<BR>
</P>
<P>
Iata si culorile cucubeului, scrise cu font-ul Comic Sans MS,
bold, dimensiune 7:<br>
<B>
<FONT face="Comic Sans MS" size="7" color="red">R</FONT>
<FONT face="Comic Sans MS" size="7" color="orange">O</FONT>
<FONT face="Comic Sans MS" size="7" color="yellow">G</FONT>
<FONT face="Comic Sans MS" size="7" color="green">V</FONT>
<FONT face="Comic Sans MS" size="7" color="blue">A</FONT>
<FONT face="Comic Sans MS" size="7" color="darkblue">I</FONT>
<FONT face="Comic Sans MS" size="7" color="magenta">V</FONT>
</B>
</P>
</BODY>
</HTML>
Vizualizat în browser:
Aşa cum am v zut, dac în cadrul unui text din cadrul documentului HTML apare un grup de mai
multe spaţii, în browser va fi afişat doar unul singur. Dac dorim forţarea afiş rii unui spaţiu, se
foloseşte identificatorul special (ultimul caracter, ”;”, face parte din identificator)
16
2.3.5. Liste.
Acestea permit ca anumite enunţuri (texte, elemente) s fie numerotate sau marcate într-un
anumit fel. O astfel de organizare poart numele de liste.
În HTML distingem 3 feluri de liste:
• Liste ordonate (Ordered Lists): sunt liste în care elementele sunt numerotate.
Inserarea lor în cadrul documentului HTML se face prin tag-urile <OL>...</OL>, elementele
(itemii) lor fiind introduse între aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfârşit nefiind
obligatoriu). Implicit, numerotarea se face cu numere arabe (1, 2, 3, ...). Ea poate fi modificat prin
folosirea atributului type în cadrul tag-ului OL. Acesta poate lua una dintre valorile:
- a : numerotarea se va face cu litere mici (a, b, c, ...)
- A : numerotarea se va face cu litere mari (A, B, C, ...)
- i : numerotarea se va face cu numere romane mici (i, ii, iii, iv ...)
- I : numerotarea se va face cu numere romane mari (I, II, III. IV, ...)
- 1 : (implicit) numerotarea se va face cu numere arabe obişnuite (1, 2, 3, ...)
Iat un exemplu de cod şi vizualizarea sa în browser (apl005.html):
<HTML>
<HEAD>
<TITLE>Liste</TITLE>
</HEAD>
<BODY>
<P>
Iata o lista ordonata implicita:
<OL>
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</OL>
Iata si o alta lista, cu numere romane
<OL type="i">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</OL>
</P>
</BODY>
</HTML>
• Liste neordonate (Unordered Lists): sunt liste în care elementele nu sunt numerotate, ci în
dreptul fiec ruia este afişat un marcator.
Inserarea lor în cadrul documentului HTML se face prin tag-urile <UL>...</UL>, elementele
(itemii) lor fiind introduse între aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfârşit nefiind
obligatoriu).
Implicit, marcarea lor se face prin cerculeţe pline. Ea poate fi modificat prin folosirea
atributului type în cadrul tag-ului UL. Acesta poate lua una dintre valorile:
17
- disc : marcarea se face cu cerculeţe pline (implicit)
- square : marcarea se face cu p tr ţele
- circle : marcarea se face cu cerculeţe goale
Iat un exemplu de cod şi vizualizarea sa în browser
(apl006.html):
Iata o lista neordonata implicita:
<UL>
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>
Iata si o alta lista, marcata cu patratele
<UL type="square">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>
Si alta, marcata cu cerculete goale
<UL type="circle">
<LI>Primul item</LI>
<LI>Al doilea item</LI>
<LI>Al treilea item</LI>
<LI>Al patrulea item</LI>
</UL>
18
2.3.6. Imagini.
Tag-ul utilizat pentru inserarea unei imagini în documentul HTML este <IMG>. Forma
general a acestui element este <IMG atribute>. Acest tag nu are şi form de închidere.
Atributele sale sunt:
• src identific fişierul efectiv de pe disc, ce conţine imaginea respectiv . Dac imaginea
se afl în directorul curent, se specific doar numele şi extensia sa. Dac se afl într-un subdirector,
acesta se specific înaintea numelui şi extensiei imaginii, separat prin caracterul /. Imaginile
recunoscute de majoritatea browser-elor internet sunt de tip .jpg, .gif, .png
• align specific tipul de aliniere al imaginii în raport cu textul în cadrul c ruia se afl .
Acesta poate lua una dintre valorile urm toare:
- right : imaginea se aliniaz în dreapta, iar textul care urmeaz este scris în locul
r mas liber, în stânga acesteia;
- left : imaginea se aliniaz în stânga, iar textul care urmeaz este scris în locul
r mas liber, în dreapta acesteia;
- top : doar latura de sus a imaginii se aliniaz cu rândul de text în cadrul c ruia se
afl ; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a ecranului;
- middle : rândul de text în cadrul c ruia se afl imaginea se aliniaz la jum tatea
în ţimii acesteia; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a
ecranului;
- bottom : doar latura de jos a imaginii se aliniaz cu rândul de text în cadrul c ruia
se afl ; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a ecranului;
• Dac dorim întreruperea unei alinieri de imagine de tip right sau left înainte ca textul s fi
umplut spaţiul liber din stânga, respectiv dreapta acesteia, putem folosi tag-ul br, c ruia îi ad ug m
unul dintre atributele clear=”left” sau clear=”right” sau clear=”all”, dup caz.
• atributul alt=”text” permite specificarea unui text alternativ ce va fi afişat fie dac
menţinem cursorul de mouse asupra imaginii, fie în locul imaginii propriu-zise, în cazul în care
imaginea nu poate fi înc rcat din cauza unei probleme de conexiune.
Iat câteva exemple, cu tot cu vizualizarea lor în browser:
1) Exemplu la folosirea atributului align=”right” şi a atributului
alt=”text” :(apl008.html)
<P>Acest text este asezat inaintea imaginii<br>
<IMG SRC="dog.jpg" align="right" alt="catelus">
In schimb, acest text este aliniat in stinga imaginii,
deoarece am folosit atributul align="right" in momentul
in care am inserat imaginea in pagina noastra web prin
intermediul tag-ului src.
</P>
19
2) Exemplu la folosirea opţiunii align=”right” împreun cu tag-ul <br clear=”right”>
(apl009.html):
<P>
Acest text este asezat inaintea imaginii<br>
<IMG SRC="dog.jpg" align="right" alt="catelus">
Acest text, aliniat in stinga imaginii, il
intrerupem fortat AICI
<BR clear="right">
In acest fel, restul textului se va alinia
in mod obisnuit, sub imagine, restul spatiului
din stinga raminind liber.
</P>
• atributele height şi width permit specificarea altor dimensiuni pentru imagine, decât
cele reale ale acesteia. Evident, dac dimensiunile nu sunt proporţionale cu cele reale, imaginea va
fi deformat . Totodat , dac specific m dimensiuni mai mari decât cele reale, imaginea se va vedea
mai puţin clar. În realitate, imaginea este transferat de pe server la dimensiunile sale originale,
redimensionarea având loc doar la nivelul calculatorului pe care este vizualizat pagina.
20
Iat un exemplu de folosire al celor dou tag-uri, şi vizualizarea
acestui exemplu în browser (apl013.html):
<P>
Imaginea originala are dimensiunile 200x150:
<BR>
<IMG src="dog.jpg">
<BR>
Iat-o redimensionata proportional la 100x75:
<BR>
<IMG src="dog.jpg" width="100" height="75">
<BR>
Iat-o si deformata:<BR>
<IMG src="dog.jpg" width="50" height="100">
sau
<IMG src="dog.jpg" width="150" height="50">
<BR>
</P>
<P>
Imaginea este inconjurata
de un chenar
de dimenisiune 10<br>
<IMG src="dog.jpg" border="10">
</P>
21
2.3.7. Specificarea culorilor în HTML.
O serie de elemente din HTML permit utilizarea de atribute de culoare. Acestea pot fi
specificate în dou moduri:
• prin constanta HTML ce reprezint numele culorii (în englez , bineînţeles). Exist 216
astfel de constante recunoscute de majoritatea browser-elor. Ne vom limita în a le enumera doar pe
cele 16 care sunt considerate de baz , exemplificându-le pe fiecare:
O serie dintre culori (îns nu toate) au şi constante în variantele „dark” (închis) respectiv
„light” (deschis). De exemplu: darkred sau lightblue.
• prin constanta de tip RGB (Red, Green, Blue):
Principiul de baz al red rii electronice ale unei imagini în culori se bazeaz pe amestecarea
în proporţii diferite ale culorilor Roşu, Verde şi Albastru. În acest mod, se poate obţine orice
culoare se doreşte. În cazul culorilor pe care le poate reda un browser HTML, fiecare dintre aceste
componente de culoare poate avea 256 de st ri posibile: de la 0, care înseamn c respectiva culoare
lipseşte cu des vârşire, pân la 255, care înseamn c respectiva culoare este folosit la intensitatea
maxim . În acest fel, prin amestecuri diferite, putem obţine 2563, deci aproximativ 16 milioane de
nuanţe diferite.
Componentele de culoare în HTML se specific folosind numere hexazecimale. Astfel, fiecare
dintre numerele dintre 0 şi 255 se codific în hexazecimal printr-un num r între 00 şi FF. Constanta
HTML pentru specificarea unei culori are forma general #RRGGBB, în care RR, GG respectiv BB
reprezint câte un num r hexazecimal cuprins între 00 şi FF.
Iat câteva exemple de culori obţinute folosind constante de forma celei de mai sus:
22
2.3.8. Tabele.
Tabelele reprezint un element foarte important al unei pagini web. În foarte multe cazuri,
tabele cu chenare invizibile sunt folosite ca şi „schelet” al paginii, pentru a putea realiza alinieri
complexe ale elementelor acesteia.
Tag-ul pentru descrierea unui tabel este <TABLE>...</TABLE>. În cadrul acestora trebuie
descrise liniile (rândurile) tabelului, în cadrul fiec rui rând trebuind descrise celulele acestuia.
Descrierea unui rând se face între tag-urile <TR>...</TR>. La rândul lor, celulele din cadrul
rândului se descriu între <TD>...</TD>. Atît tag-ul </TR> cât şi tag-ul </TD> pot fi omise.
Conţinutul unei celule poate fi cât se poate de general: de la text şi imagini pân la alte
tabele (se pot deci construi chiar şi tabele imbricate), ca în exemplul urm tor (apl017.html):
23
<TABLE border="1" cellspacing="4" cellpadding="5">
<TR>
<TD>
Poza cu catelus<BR>
<IMG src="dog.jpg">
<TD>
Tabel cu baieti
<TABLE border cellspacing="0">
<TR><TD>Mihai
<TR><TD>Costel
<TR><TD>Alin
</TABLE>
<TD>
Tabel cu fete
<TABLE border cellspacing="0">
<TR><TD>Mihaela
<TR><TD>Costina
<TR><TD>Alina
</TABLE>
</TABLE>
• width=”lăţime” poate stabili cât de lat s fie tabelul. L ţimea poate fi dat în procente,
caz în care se va calcula ca şi procent din l ţimea ferestrei browser-ului (ex: width=”50%”) sau în
pixeli (ex: width=”500”);
• height=”înălţime” poate stabili cât de înalt s fie tabelul. L ţimea poate fi dat , la fel
ca şi în cazul atributului width, în procente sau în pixeli;
• align determin alinierea tabelului în pagin . Poate la una dintre valorile left, right
sau center. Dac , pe lâng tabel, mai scriem şi text, acesta se va poziţiona faţ de tabel în acelaşi
mod în care se poziţioneaz şi faţ de imagini;
• bgcolor=”culoare” permite stabilirea culorii de fundal a tuturor celulelor tabelului;
• bordercolor=”culoare” permite stabilirea culorii chenarului (deopotriv cel interior
cât şi cel exterior)
• width şi height determin , pentru celula respectiv , l ţimea şi în lţimea. Poate fi dat în
procente sau pixeli. Dac e specificat în procente, se va lua din l ţimea, respectiv în lţimea
24
tabelului. Modificarea l ţimii şi a în lţimii unei celule va avea efect şi asupra celorlalte celule,
pentru ca tabelul s fie aliniat;
• align şi valign stabilesc, la fel ca şi în cazul lui <TR>, modul în care este aliniat
conţinutul în interiorul celulei, pe orizontal respectiv pe vertical , fiind prioritare faţ de alinierea
la nivel de linie
• colspan=”n” stabileşte întinderea celulei respective în dreapta cu n coloane
(echivalentul operaţiei Merge Cells din Word, în cazul în care unim celule adiacente pe orizontal );
• rowspan=”n” stabileşte întinderea celulei respective în jos cu n linii (echivalentul
operaţiei Merge Cells din Word, în cazul în care unim celule adiacente pe vertical );
• bgcolor determin , pentru celula respectiv , culoarea de fundal. Evident, este prioritar
faţ de acelaşi atribut la nivel de linie.
Exemplu (apl018.html):
<TABLE border="1" cellspacing="0" cellpadding="5">
<TR bgcolor="#c0c0ff">
<TD>Ziua
<TD>09h00 - 11h00
<TD>11h00 - 13h00
<TD>13h00 - 15h00
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Luni</B>
<TD colspan="2">Mecanica
<TD bgcolor="#ffd0d0">Termodinamica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Marti</B>
<TD>Electrostatica
<TD>Optica
<TD>Atomica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Miercuri</B>
<TD rowspan="2" bgcolor="#ffd0d0">Termodinamica
<TD>Optica
<TD>Electrostatica
<TR bgcolor="yellow" align="center">
<TD align="left"><B>Joi</B>
<TD>Mecanica
<TD>Optica
</TABLE>
25
Exemplu (apl019.html):
<H3>Colegiul National "Andrei Saguna"</H3>
<TABLE border="1" cellspacing="0"
cellpadding="5" align="left">
<CAPTION align="bottom">
Scorul pe echipe</CAPTION>
<TR><TH>Echipa<TH>Punctaj
<TR><TD>clasa a 9-a A<TD align="right">87
<TR><TD>clasa a 10-a B<TD align="right">80
<TR><TD>clasa a 12-a B<TD align="right">91
</TABLE> <FONT color="blue">
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
Colegiul National "Andrei Saguna"
</FONT>
Aşa cum am v zut în partea introductiv a acestui capitol, noţiunea de www este strâns
legat de documentele de tip hipertext.
Tot ceea ce am prezentat din limbajul HTML pân în momentul de faţ , reprezint doar
partea descriptiv a acestuia, cu ajutorul c reia putem crea un conţinut static.
Link-urile reprezint mecanismul prin care:
• putem face ca un vizitator al paginii, prin executarea unui click, s poat accesa o alt
pagin , la care dorim s -i cre m posibilitatea unui acces rapid şi, dac acesta doreşte, s poat
reveni în pagina iniţial prin ap sarea butonului Back al browser-ului de Internet;
• putem face ca un vizitator al paginii noastre s primeasc un anumit fişier, de orice tip,
care se g seşte pe site-ul nostru (download);
• putem face ca un vizitator al paginii noastre s poat asculta un mesaj sonor sau chiar s
poat viziona un film;
• putem ca, printr-un click, s putem vizualiza o pagin (inclusiv cea curent ) doar dintr-un
anumit loc, f r a folosi barele de derulare;
• putem ca, prin accesarea unui click, cel care viziteaz pagina s ne poat trimite un e-mail.
Pentru toate acestea, vom folosi tag-ul <A>...</A>, numit şi Ancor .
26
Ancore de leg tur c tre alte pagini
Acestea permit ca un anumit element din document s conţin leg tura c tre o alt pagin .
Elementul care face leg tura este de obicei un text sau o imagine. De regul , elementul legat îşi
schimb aspectul faţ de cel clasic: textul va fi subliniat şi colorat altfel, iar imaginea va avea un
chenar colorat. În momentul în care ducem cursorul deasupra elementului legat, acesta cap t forma
unei mâini, indicându-ne astfel c este vorba de un link pe care îl putem utiliza. Printr-un simplu
click, acces m pagina c tre care este f cut leg tura.
Acest tip de leg tur se realizeaz practic folosind atributul href, ca în exemplul de mai jos
(a se remarca modul în care, elementul legat, este inclus între tag-urile <A href=...> şi </A> :
apl020.html):
<p> Prin executarea unui click
<A href="http://mail.yahoo.com">
pe acest text </A>
poti accesa direct pagina de mail yahoo.
</p>
Dup cum se observ , atributul href primeşte adresa complet a paginii c tre care dorim s
facem leg tura. Dac e vorba de un fişier local, din acelaşi director cu pagina din care facem
leg tura, la href este suficient s scriem numele şi extensia (de ex: href=”pagina.htm”)
Se realizeaz în mod analog cu cele c tre alte pagini, la atributul href trebuind specificat
adresa fişierului respectiv (dac este în acelaşi director cu pagina din care facem leg tura, e
suficient s -i scriem numele şi extensia).
Ex: în cazul în care fişierul pentru download este local:
Pentru download arhiva executa un click
<A href="arhiva.zip">aici</A>
Leg turile c tre fişiere de tip sunet sau film se fac absolut în aceeaşi manier . În funcţie de extensia
lor (.wav, .mid, .mp3, .avi) în momentul execut rii unui click asupra obiectului care face leg tura
c tre ele, acestea vor fi deschise automat c tre browser cu programul corespunz tor.
27
Leg turi relative la con inutul documentului (paginii)
Sunt acele ancore care permit accesarea direct a unei pagini web într-un anumit loc, f r a
mai folosi barele de derulare pentru a ajunge în acel loc.
Pentru aceasta, locul respectiv trebuie marcat. Acest lucru se face tot cu ajutorul tag-ului
<a>, îns folosind atributul id, care va denumi locul respectiv printr-un identificator, ca în
exemplul de mai jos (a se observa c între tag-ul de deschidere şi cel de închidere putem s nu
punem nici un element):
<A id=”capitolul2”></A>
Accesarea direct a acestui loc cu ajutorul unui link se poate face astfel:
a) Din interiorul aceleişi pagini: specificând la atributul href identificatorul respectiv (cel
de la id) înainte de care se pune de caracterul #, ca în exemplul urm tor:
<A href=”#capitolul2”>Salt direct la capitolul 2</A>
b) Din alt pagin : specificând la atributul href adresa paginii accesate (a fişierului html)
urmat de caracterul #, ca în exemplul urm tor:
<A href=”http://www.myserver.ro/document.html#capitolul2”>Deschide documentul extern,
direct la capitolul 2</A>
Acestea permit ca, atunci când o persoan ne viziteaz site-ul, dac doreşte, s ne poat
trimit un e-mail f când un simplu click pe leg tura respectiv . Totuşi, pentru ca acest lucru s fie
funcţional, cel care viziteaz site-ul trebuie s aib configurat pe calculatorul s u un client de e-mail
(cel mai frecvent este Outlook Express).
Iat un exemplu pentru o astfel de ancor :
<ADDRESS>
Click <A href=”mailto:[email protected]”>aici</A> pentru a trimite un e-mail
</ADDRESS>
(tag-ul <ADDRESS>...</ADDRESS> nu face altceva decât s afişeze textul din cadrul s u italic)
Dup cum se observ , pentru trimiterea unui e-mail, dup atributul href trebuie specificat
mailto: urmat de adresa de e-mail a destinatarului.
28
2.3.10. Elemente de structură (HTML, HEAD, BODY).
Dup cum am v zut în partea introductiv , orice document html este cuprins între tag-urile
<HTML> şi </HTML>. El este alc tuit dintr-un unic antet (HEAD) şi un unic corp (BODY). Aceste 3
elemente au rolul de a defini structura documentului. Din acest motiv ele se mai numesc şi elemente
de structur .
În cadrul acestei secţiuni putem întâlni diverse alte tag-uri. Despre tag-ul <TITLE> am
discutat deja, el permiţând scrierea unui titlu pentru pagin .
În afar de acestea, vom aminti înc alte 3 tag-uri:
• <BASE> permite stabilirea unei adrese de baz pentru resurse. Acest tag se foloseşte în
special atunci când resursele (sau, în fine, o mare parte a acestora) se g sesc în alt director decât cel
în care se afl documentul curent. În acest fel, folosirea fişierelor din directorul specificat în BASE
se poate face direct prin numele şi extensia lor. Specificarea se face prin:
<BASE href=”adresa resurse”>
• <META> este folosit pentru a furniza informaţii motoarelor de c utare. Unele dintre acestea
viziteaz doar antetul pentru a obţine informaţii. Informaţiile conţinute de acest element nu sunt
afişate de browser, îns este important s îl folosim pentru ca informaţiile conţinute în site-ul nostru
s fie accesibile. Locul tag-ului <META> este în antet (<HEAD>).
29
Atributele tag-ului <META> sunt name şi content. Folosirea lor este ceva mai particular ,
rezultând din exemplele urm toare:
- pentru a specifica autorul unui document:
<META name=”Author” content=”Prenume NUME”>
- pentru a specifica titlul unui document:
<META name=”TITLE” content=”Metode de programare”>
- pentru a preciza cuvintele cheie dup care s fie reg sit site-ul:
<META name=”KEYWORDS” content=”backtracking, divide et impera,
greedy, programare dinamica”>
- pentru a specifica limba în care este scris site-ul:
<META name=”LANGUAGE” content=”RO”>
Exist şi alte atribute ale elementului META, îns cele dou deja prezentate sunt suficiente.
• <STYLE> este utilizat pentru introducerea stilurilor. Acestea permit stabilirea mai
am nunţit a modului în care apar, implicit, diferitele elemente din document. Valorile se trec între
<STYLE>...</STYLE>.
Exemplu:
<STYLE>
P {font-family:”Comic Sans MS”; font-size:14pt;}
</STYLE>
Prin specificarea lui P înainte de paranteza acolad , stabilim ca modul implicit de afişare al
paragrafelor (s ne reamintim c <P> este tag-ul pentru paragraf) s fie cel descris între parantezele
acolade, deci, în cazul exemplului de faţ font-ul folosit s fie ”Comic Sans MS”, iar dimensiunea
caracterelor s fie de 14.
Acest exemplu defineşte în antetul paginii o funcţie JavaScript capabil s calculeze suma
numerelor de la 1 la 10 într-o variabil s şi-apoi s afişeze valoarea obţinut prin intermediul unei
ferestre de dialog. Funcţia este apelat automat (atributul onload) la înc rcarea paginii.
30
2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME).
Utilizarea frame-urilor permite ca, în cadrul aceleiaşi ferestre ale browser-ului s fie afişate
simultan mai multe documente HTML (sau alte resurse).
Tag-ul <FRAMESET> are rolul de a împ rţi fereastra în mai multe cadre. În fişierul HTML,
el înlocuieşte tag-ul <BODY>. Iat câteva atribute ale lui FRAMESET:
• rows – descrie liniile în care este împ rţit secţiunea FRAMESET respectiv
• cols – descrie coloanele în care este împ rţit secţiunea FRAMESET respectiv
descrierile pentru rows, respectiv cols, pot fi de forma:
<FRAMESET rows=”30%, 50%, 20%”>
<FRAME ...>
<FRAME ...>
<FRAME ...>
</FRAMESET>
în acest exemplu, se definesc 3 cadre orizontale (linii) de în lţimi 30%, 50% respectiv 20% din
în lţimea ferestrei.
aici se definesc trei frame-uri: unul de în lţime de 100 de pixeli, altul de 200 de pixeli, al treilea
fiind alocat cu spaţiul r mas.
Fiecare tag <FRAMESET>...</FRAMESET> trebuie ca, dup definirea aspectului (cu ajutorul
unuia dintre atributele cols sau rows) s conţin descrierile fiec ruia dintre cadrele definite. Acest
lucru se face cu ajutorul tag-ului <FRAME> prin intermediul atributelor:
• src – adresa fişierului HTML sau a imaginii care se va înc rca iniţial în cadru;
• marginheight – marginile (în pixeli sau procent) faţ de partea de sus şi cea de jos;
• marginwidth – marginile (în pixeli sau procent) faţ de partea din stânga şi din dreapta;
31
• frameborder – poate lua valorile 1 (implicit ), care înseamn c acest cadru este separat
de celelalte printr-un chenar, respectiv 0, care înseamn c acest cadru nu mai este separat de
celelalte printr-un chenar.
• scrolling – trateaz afişarea barei de scroll (derulare). Poate lua trei valori:
auto – valoarea implicit . Bara de scroll este prezent numai dac este cazul
yes – bara de scroll este totdeauna prezent
no – bara de scroll nu va fi niciodat afişat
• noresize – dac atributul acesta este prezent (el se foloseşte f r a i se atribui nici o
valoare) atunci vizitatorului paginii nu i se va permite s redimensioneze cadrul. Prezenţa acestui
atribut pentru un cadru nu permite nici redimensionarea cadrelor vecine.
• name – este un atribut foarte important. Prin intermediul s u va putea fi identificat
frame-ul respectiv. Acest lucru este foarte important, deoarece dintr-un cadru se poate comanda
conţinutul oric rui alt cadru.
Deschiderea unei pagini într-un anumit cadu, prin intermediul ancorelor, se poate specifica
prin folosirea atributului target=”nume cadru” imediat dup folosirea atributului href în
cadrul tag-ului <A href=”...” .. >.
Iat un exemplu prin care definim o pagin cu dou frame-uri verticale. Frame-ul din stânga
va conţine numele a 3 zile ale s pt mânii (pe limba român ). Accesarea fiec ruia va produce
deschiderea în frame-ul drept a unei pagini care va conţine traducerea numelui zilei respective în 4
limbi.
În total vom avea de construit 5 fişiere:
- un fişier pentru pagina iniţial , cea care defineşte scheletul paginii cu frame-uri
- un fişier cu cele 3 zile ale s pt mânii, pe fiecare dintre ele fiind pus câte un hyperlink care va
deschide traducerea numelui s u în cel lalt frame
- 3 fişiere cu traducerilor numelor zilelor în 4 limbi str ine.
32
De remarcat faptul c aceast fişier HTML nu conţine decât scheletul cadrelor, ele urmând a
fi populate iniţial, dup cum remarcaţi din codul surs , cu fişierele apl022zile.html pentru
primul cadru (cel din stânga) respectiv cu fişierul apl022luni.html pentru cel de-al doilea cadru.
Observaţi modul în care au fost definite cadrele în cadrul tag-ului FRAMESET:
cols="30%,*". Acest lucru semnific prezenţa a dou cadre verticale (coloane) dintre care primul
va ocupa 30% din l ţimea ferestrei, iar al doilea restul (lucru semnificat de caracterul * care
închide şirul de definiţie al cadrelor).
De asemenea, atributul noresize în cadrul primului tag FRAME împiedic redimensionarea
cadrelor de c tre utilizator. În cazul în care acest atribut nu ar fi fost prezent, utilizatorul, printr-un
simplu „drag and drop” ar fi putut trage bara care separa cele dou frame-uri, dându-i orice poziţie
ar fi dorit.
Dac înc rc m în browser-ul de internet documentul creat în acest stadiu, f r ca pe disc s
existe vreunul dintre celelalte patru fişiere planificate, am obţine urm torul rezultat:
Iat şi conţinutul celorlalte fişiere, pe care le vom pune în acelaşi director cu documentul de
mai sus (în dreptul fiec ruia vom ar ta şi vizualizarea sa în browser):
Fişierul apl022zile.html:
<HTML>
<HEAD> <TITLE>Zilele</TITLE> </HEAD>
<BODY>
<br>
<A href="apl022luni.html" target="dreapta">Luni</A><br><br>
<A href="apl022marti.html" target="dreapta">Marti</A><br><br>
<A href="apl022miercuri.html" target="dreapta">Miercuri</A><br><br>
</BODY>
</HTML>
De remarcat modul în care am realizat link-urile asupra celor 3 cuvinte: folosind şi atributul
target în cadrul ancorei (<A ...>) am specificat browser-ului ca paginile respective s fie
deschise în cadrul frame-ului al c rui nume apare dup target.
33
Fişierul apl022luni.html: Fişierul apl022marti.html: Fişierul apl022miercuri.html:
<HTML><BODY> <HTML><BODY> <HTML><BODY>
<H2>Luni</H2> <H2>Marti</H2> <H2>Miercuri</H2>
FR: Lundi<BR> FR: Mardi<BR> FR: Mercredi<BR>
IT: Lunedi<BR> IT: Martedi<BR> IT: Mercoledi<BR>
GE: Montag<BR> GE: Dienstag<BR> GE: Mittwoch<BR>
EN: Monday<BR> EN: Tuesday<BR> EN: Wednesday<BR>
</BODY></HTML> </BODY></HTML> </BODY></HTML>
Iat cum arat vizualizarea final în browser (dup crearea celor 4 fişiere de mai sus):
Evident, la efectuarea unui click asupra leg turilor (luni, marti, miercuri) din partea stâng ,
se va produce deschiderea paginii corespunz toare în frame-ul drept.
Tag-ul <IFRAME> este un element care nu a fost prezent în primele versiuni ale limbajului
HTML, ci a ap rut ceva mai nou. Actualmente, folosirea sa este preferat de majoritatea celor care
programeaz pagini web, deoarece se comport ceva mai flexibil decât cadrele clasice. Totodat ,
motoarele de c utare nu indexeaz conţinutul paginilor cu frame-uri obişnuite, pe când cele care
conţin iframe-uri sunt indexate.
Prin intermediul s u, este permis crearea unui cadru în corpul unui documente HTML,
cadrul care se comport asem n tor unei imagini.
Atributele lui IFRAME sunt:
• name – la fel ca şi la FRAME, acest atribut permite identificarea IFRAME-ului (pentru a
putea comanda conţinutul s u din orice link)
• height, width în lţimea, respectiv l ţimea. Pot fi specificate atât în pixeli, cât şi în
procente, relativ la dimensiunile ferestrei browser-ului
• frameborder – poate lua valoarea 0 sau 1, la fel ca la elementul FRAME
• src – adresa resursei care va fi înc rcat iniţial în IFRAME
• marginwidth, marginheight, scrolling – la fel ca şi la FRAME
• align – poate lua una dintre valorile left, right, top, bottom, middle,
comportându-se întocmai ca şi în cazul imaginilor
34
Iat reluarea aceleiaşi idei structurale ca şi la aplicaţia de dinainte (cu frame-uri clasice) îns
folosind un element de tipul IFRAME. Fişierele apl022luni.html, apl022marti.html
respectiv apl022miercuri.html le p str m nemodificate. Practic, mai cre m doar un singur
fişier HTML, cu conţinutul urm tor, şi avem grij s copiem în acelaşi director şi cele 3 fişiere de
mai sus (apl023.html):
<HTML>
<HEAD><TITLE>Elementul IFRAME</TITLE></HEAD>
<BODY>
<IFRAME name="cadru" width="140"
height="160" align="right" src="apl022luni.html">
</IFRAME>
<BR>
<A href="apl022luni.html" target="cadru">
Luni</A><BR><BR>
<A href="apl022marti.html" target="cadru">
Marti</A><BR><BR>
<A href="apl022miercuri.html" target="cadru">
Miercuri</A><BR><BR>
</BODY>
</HTML>
Bara de separare, al c rei tag este <HR> reprezint un element decorativ. De obicei se
foloseşte pentru a separa anumite secţiuni ale paginii web.
Atributele sale sunt:
• width – permite specificarea lungimii sale. Poate fi dat în pixeli sau în procente. Dac
acest atribut lipseşte, atunci lungimea sa va fi maxim (din marginea stâng şi pân marginea
dreapt a ferestrei);
• size – permite specificarea în lţimii barei. Se specific în pixeli;
• color – permite specificarea culorii sale.
Exemplu (apl024.html):
<BODY>
O linie clasica:
<HR>
<CENTER>O linie de lungime 50%</CENTER>
<HR width="50%">
<CENTER>O linie de lungime 200 de pixeli,
grosime 10 pixeli, de culoare rosie</CENTER>
<HR width="200" size="10" color="red">
</BODY>
35
2.3.13. Formulare.
Formularele sunt elemente ale limbajului HTML. Ele reprezint o grupare de componente
care permit trimiterea de date şi de comenzi c tre un server. Acesta trebuie s fie mai mult decât un
clasic server HTTP, trebuind s aib instalat şi o component capabil de a r spunde comenzilor şi
a prelucra datele. Cea mai popular astfel de component , foarte larg utilizat în ultimii 10 ani în
programarea pe Internet este limbajul PHP, de care ne vom ocupa pe larg în capitolul al III-lea al
acestei lucr ri.
Pentru moment ne vom concentra asupra componentelor unui formular şi a aspectului
acestora.
Pe lâng componentele specifice, un formular poate conţine orice fel de alte elemente valide
de HTML – tabele, imagini, text, bare de separare ...
În continuare vom prezenta câteva din componentele unui formulare, prin intermediul c rora
utilizatorul poate introduce date şi trimite apoi aceste date c tre server. Un atribut foarte important
al oric ruia dintre aceste componente este name, deoarece prin intermediul s u, server-ul care va
primi datele va şti despre care dintre controale este vorba.
36
Câmpuri text
Permit utilizatorului s introduc date într-un câmp de tip edit (pe o singur linie).
Aceste se specific prin tag-ul
<INPUT type=”text” ...>
Atributele sale sunt:
• size – specific l ţimea (în num r aprox. de caractere) câmpului text; Dac acest
parametru este omis, este implicit considerat ca fiind 20;
• maxlength – specific num rul maxim de caractere ce pot fi scrise în câmpul text. Acest
atribut poate primi o valoare mai mare decât cea scris la size, caz în care, textul va defila în control
(stânga dreapta) în cazul în care scriem mai multe caractere decât câte încap în porţiunea vizibil .
Omiterea acestui atribut va permite introducerea unui num r foarte mare de caractere (limita difer
de la un browser la altul);
• name – numele câmpului text (prin care server-ul va identifica acest câmp, pentru a prelua
datele din el);
• value – poate specifica o valoare care s fie iniţial (la înc rcarea paginii) deja scris în
cadrul controlului. Dac omitem acest atribut, câmpul text va fi gol.
Aceasta componenta se prezint sub forma unui buton. Prin ap sarea sa are loc trimiterea
tuturor datelor din formular c tre script-ul de pe server-ul care le va prelucra.
Un control de tip submit se specific prin tag-ul:
<INPUT type=”submit” ...>
Atributele sale sunt:
• name – numele de identificare a componentei. Putem omite acest atribut. El se foloseşte în
cazul în care aceluiaşi formular dorim s -i ataş m mai multe butoane de acest tip, iar ap sarea
fiec ruia s produc o acţiune diferit ;
• value – textul care va fi scris pe buton. De altfel, aceasta va fi şi valoarea pe care server-
ul o va primi pentru acest control.
37
Câmpuri de tip password
Se comport identic cu câmpurile de tip text. Singura deosebire este c , la scrierea de text în
ele, acesta nu va fi vizibil, ci în locul caracterelor introduse se vor afişa asterisc-uri. Totodat , textul
dintr-un astfel de control nu poate fi luat cu copy/paste.
Controalele de acest fel se specific prin tag-ul:
<INPUT type=”password” ...>
Atributele sunt identice cu cele de la <INPUT type=”text” ...>
Sunt controalele care permit ca, dintr-o serie de opţiuni posibile, utilizatorul s aleag una
singur . Controalele de acest fel se specific prin tag-ul:
<INPUT type=”radio” ...>
Atributele sale sunt:
• name – numele de identificare al componentei. Este obligatoriu ca toate butoanele care
aparţin aceluiaşi grup (deci seria de opţiuni din care trebuie aleas doar una singur posibil ) s
poarte acelaşi nume de identificare;
• value – valoarea pe care o va întoarce butonul respectiv, dac el a fost cel ales;
• checked – dac acest atribut este prezent, butonul respectiv va fi ales în mod implicit, la
înc rcarea paginii. Este recomandabil ca, dintre toate butoanele care aparţin aceluiaşi grup, exact
unul singur s conţin acest atribut.
Iat şi un exemplu care combin controalele prezentate pân acum (apl025.html):
<FORM action="nefunctional.php" method="post">
Introdu numele tau de familie
<INPUT type="text" size="10" maxlength="20"
name="numele">
<BR><BR>Alege-ti si o parola
<INPUT type="password" size="10" maxlength="20"
name="parola">
<BR><BR>
Alege ce fel de studii ai:<BR><BR>
<INPUT type="radio" name="studii" value="scprim">
Doar scoala primara<BR>
<INPUT type="radio" name="studii" value="8clase">
Scoala primara si cea generala (8 clase)<BR>
<INPUT type="radio" name="studii" value="medii"
checked>
Studii medii (liceul si eventual un curs postliceal)
<BR>
<INPUT type="radio" name="studii" value="univ">
Studii universitare<BR><BR>
<INPUT type="submit" value="Trimite datele">
</FORM>
Evident, acest exemplu este nefuncţional, în sensul c datele din formular nu sunt prelucrate.
Acest lucru va face obiectul capitolului urm tor, şi anume preluarea datelor dintr-un formular prin
intermediul limbajului php.
38
Câmpuri de tip checkbox
Sunt controale care permit bifarea sau ştergerea bif rii unei c suţe. Din punct de vedere
practic, ele permit utilizatorului s marcheze una, nici una, sau mai multe opţiuni.
Controalele de acest fel se specific prin tag-ul:
<INPUT type=”checkbox” ...>
Atributele sale sunt:
• name – numele de identificare al componentei;
• value – valoarea pe care o va întoarce controlul respectiv;
• checked – dac acest atribut este prezent, atunci controlul va fi bifat la înc rcarea paginii.
Exemplu (apl026.html):
<FORM action="nefunctional.php" method="post">
Alege din lista de mai jos limbile
pe care le cunosti:<BR><BR>
<INPUT type="checkbox" name="rom" value="1" checked>
Limba românã<BR>
<INPUT type="checkbox" name="eng" value="2">
Limba engleza<BR>
<INPUT type="checkbox" name="fr" value="3">
Limba franceza<BR>
<INPUT type="checkbox" name="germ" value="4">
Limba germana<BR><BR>
<INPUT type="submit" value="Trimite datele">
</FORM>
Aceste componente permit trimiterea de valori c tre server (o dat ce butonul submit a fost
ap sat) f r ca acestea s fie vizibile în cadrul form-ului. Practic, aceste componente se specific
doar în cadrul codului HTML:
<INPUT type=”hidden” name=”nume” value=”value”>
Aşa cum se observ în tag-ul de mai sus, cu ajutorul atributului name specific m numele
controlului, iar cu ajutorul atributului value specific m valoarea care va fi trimis c tre server.
Este o component care se utilizeaz pentru a introduce un text mai lung, care se poate
întinde pe mai multe linii.
Tag-ul s u este: <TEXTAREA>...</TEXTAREA>.
39
Atributele sale sunt:
• name – numele de identificare al componentei;
• rows – num rul de linii pe care se întinde componenta (implicit 2);
• cols – num rul de coloane pe care se întinde componenta (implicit 20);
Dac dorim ca la înc rcarea paginii s ne apar un text deja scris în cadrul controlului, acest
text se va scrie între tag-ul de deschidere şi cel de închidere al lui TEXTAREA.
Exemplu (apl027.html):
<FORM action="nefunctional.php" method="post">
Scrie-ti parerea despre spectacol:<BR>
<TEXTAREA rows="3" cols="30" name="parerea"></TEXTAREA>
<BR>
<INPUT type="submit" value="Trimite datele">
</FORM>
Acest control este utilizat pentru afişarea unei liste din care utilizatorul poate s aleag unul
sau mai multe opţiuni.
Tag-ul prin care se utilizeaz aceast component este <SELECT>...</SELECT>.
Atributele sale sunt:
• name – numele de identificare al componentei;
• multiple – dac acest atribut este prezent, utilizatorul poate alege mai multe opţiuni din
list , ţinând ap sat tasta control sau shift în timp ce d click pe acestea.
• size – num rul de opţiuni care sunt afişate. Implicit este 1, în cazul listelor care nu sunt
de tip multiple. În acest caz, lista se prezint sub forma unei liste de tip drop-down;
40
Iat un exemplu de folosire al controlului de tip select (apl028.html):
<FORM action="nefunctional.php" method="post">
Alege din lista de mai jos ce fel de studii ai:
<BR>
<SELECT name="studii">
<OPTION value="prim">Scoala primara (4 clase)
<OPTION value="gen">Scoala generala (8 clase)
<OPTION value="lic" selected>Studii medii (12 clase)
<OPTION value="univ">Studii universitare
</SELECT>
<INPUT type="submit" value="Trimite datele">
</FORM>
Deşi HTML-ul clasic permite redactarea unor documente hypertext de un nivel foarte înalt
şi elaborat, o dat cu evoluţia limbajelor de programare vizuale, a început s devin mai puţin
atractiv decât a fost la început.
Din acest motiv, a fost pus la punct ceea ce numim DTHML (Dynamic HTML) – care nu
este un limbaj în sine, ci un termen prin care sunt desemnate tehnicile utilizate pentru a face
paginile web cât mai dinamice şi cât mai interactive.
Pe lâng HTML-ul propriu-zis, noile unelte recunoscute de browser-ele din ultima generaţie
sunt CSS (Cascading Style Sheets), JavaScript şi DOM (Document Object Model).
Scopul acestei lucr ri nu este studiul am nunţit al acestora, de aceea le vom trece doar în
revist , folosind mici exemple comentate pentru fiecare dintre ele.
41
În cadrul tag-ului STYLE vom stabili modul în care dorim s arate elementele paginii.
Fiecare element al HTML-ului pe care l-am studiat este identificat, în cadrul CSS-ului de tag-ul care
îl gestioneaz . Spre exemplu, identificatorul CSS pentru paragrafe este P, pentru table este TABLE,
pentru imagini este IMG, ş.a.m.d.
Folosind aceşti identificatori în cadrul unui <STYLE>...</STYLE>, putem face ca toate
elementele de acelaşi fel din cadrul unui document s arate la fel. Astfel suntem scutiţi de a scrie o
gr mad de cod care s-ar repeta în cazul fiec rui element de acelaşi fel.
De exemplu, dac dorim ca, în cadrul paginii noastre, absolut toate paragrafele s fie scrise
cu fontul Comic Sans MS, caractere de 14, culoare albastr , pe fond galben, în loc de a scrie aceşti
parametri la fiecare paragraf din document, este suficient s definim urm torul STYLE
(apl029.html):
<HTML><HEAD>
<TITLE>Utilizare STYLE in HEAD</TITLE>
<STYLE>
P {
background:yellow;
color:blue;
font-family:"Comic Sans MS";
font-size:14pt;
}
HR {
text-align:left;
width:50%;
height:5px;
color:red;
}
</STYLE>
</HEAD>
<BODY>
<P>Iata un paragraf formatat asa cum am anuntat</P>
<HR>
Acesta este un text care nu se afla in paragraf
<HR>
<P>Acest text este din nou in cadrul unui paragraf</P>
</BODY></HTML>
De remarcat faptul c ambele paragrafe, şi de asemenea ambele linii orizontale (HR) din
cadrul lui BODY nu conţin nici un fel de referinţ de formatare. Cu toate acestea, definirile lui P şi
ale lui HR în cadrul lui STYLE au „predefinit” modul în care vor ar ta toate paragrafele respectiv
toate liniile orizontale ale documentului.
Sintaxa definiţiei este de felul urm tor: Se începe cu identificatorul elementului dorit a fi
formatat (în cazul nostru P – tag-ul pentru paragraf, respectiv HR) între acolade trecându-se
specificatorii de format (aceştia ţin de limbajul CSS) doriţi a fi modificaţi. În cazul de faţ , avem
de-a face cu:
background = culoarea de fundal; color = culoarea scrisului;
font-familiy = numele font-ului; font-size = dimensiunea caracterelor;
text-align = alinierea în cadrul unui text; width = l ţimea;
height = în lţimea.
42
O alt form de utilizarea a CSS-ului const în definirea stilurilor cu ajutorul unor
identificatori proprii, care se pot aplica ulterior unui anumit paragraf. În acest caz, în cadrul unui
style putem defini proprii identificatori, precedându-i de caracterul #. Aplicarea ulterioar a lor
asupra unui element, se face specificând un nou atribut, şi anume id=”identificator” unde
identificator este cel propriu, definit în cadrul lui STYLE (cel precedat de #)
Ex: dac inser m în codul de mai sus secvenţa urm toare (tot în cadrul lui STYLE, dup
definiţia lui HR, adic cea scris cu roşu închis):
#alt_paragraf {
color:green;
font-weight:bold;
}
Remarcaţi faptul c au fost aplicaţi doar cei doi specificatori de format definiţi în noul stil, şi
anume culoarea fontului şi faptul c scrisul este bold. Celelalte caracteristici (font-ul şi culoarea
galben de fundal) au r mas cele definite tot în STYLE, în cadrul lui P.
În loc de a defini stilurile în cadrul antetului (HEAD), aşa cum am ar tat mai sus, ele pot fi
scrise separat, într-un fişier text cu extensia .css, exact în aceeaşi manier în care le-am fi scris între
cele dou tag-uri prezentate, <STYLE>...</STYLE>.
Includerea efectiv a acestui fişier în cadrul HTML-ului se face tot în secţiunea <HEAD>,
prin intermediul urm torului tag:
<LINK rel="stylesheet" type="text/css" href="fisier_stil.css">
43
Iat un exemplu:
1) Conţinutul fişierului css, pe care l-am numit apl30stil.css:
TABLE {
border-width:2px;
border-style:ridge;
border-collapse:collapse;
}
TD {
border-style:ridge;
border-width:2px;
padding:5px;
}
TH {
border-style:ridge;
border-width:2px;
background:#7fffff;
padding:5px;
}
TR {
background:#ffff7f;
}
#TR1 {
background:#00ff00;
}
Dup cum se observ , am definit în cadrul s u formatele implicite pentru un tabel, rândurile
şi celulele sale (TABLE, TR, TD, TH) precum şi un identificator propriu, #TR1.
Iat şi fişierul HTML care va folosi acest .css (apl030.html):
<HTML>
<HEAD>
<TITLE>Utilizare css</TITLE>
<LINK rel="stylesheet" type="text/css" href="apl30stil.css">
</HEAD>
<BODY>
<TABLE>
<TR><TH>Numar<TH>Nume
<TR><TD>1<TD>Ion
<TR><TD>2<TD>Pop
<TR><TD>3<TD>Top
<TR id="TR1"><TD>4<TD>Ivan
</TABLE>
</BODY>
</HTML>
Iat , în continuare, în partea stâng , cum arat HTML-ul, datorit includerii acestui fişier CSS, iar
în partea dreapt cum ar fi ar tat acelaşi HTML, f r a specifica nici un fel de format în CSS:
44
2.4.2. JavaScript.
45
2) Sortarea unui şir de numere (apl032.html):
<SCRIPT language="JavaScript">
v_text=prompt("Introdu un sir de numere pe care le separi prin spatii:","");
x=v_text.split(" ");//functia split, aplicata lui v_text (cu parametrul " ")
//va extrage substringurile din v_text care sunt separate de spatii si va crea
//un sir de string-uri, pe care i-l atribuie variabilei x. Acestea vor fi
//x[0], x[1], ... Numarul total de elemente din sirul x se obtine prin x.length
n=x.length;//obtinem acest numar in variabila n
for(i=0;i<n;i++)
x[i]=parseInt(x[i]);//in acest fel transformam toate componentele sirului
//x din string-uri in intregi. In C acest lucru nu ar fi fost posibil.
//acum sortam sirul obtinut:
for(i=0;i<n-1;i++)
for(j=i+1;j<n;j++)
if(x[i]>x[j])
{ aux=x[i];x[i]=x[j];x[j]=aux;}
//si afisam sirul final. Pentru asta, formam tot mesajul de afisat intr-un string
s="Iata sirul final, sortat:\n";
for(i=0;i<n;i++)
s=s+String(x[i])+" ";
alert(s);
</SCRIPT>
<SCRIPT language="JavaScript">
v_text=prompt("Introdu nr. intreg pe care doresti sa-l descompui in factori primi:","");
s="Iata descompunerea in factori primi:\n";
//pregatim string-ul in care vom afisa rezultatul final, pentru ca la acest string
//vom tot concatena noile date obtinute
n=parseInt(v_text);
f=2;
while(n!=1)
{
p=0;
while(n%f==0)
{
n=parseInt(n/f);
p++;
}
if(p)
s+="Factor="+String(f)+" putere="+String(p)+"\n";
//fiecare nou factor si putere obtinute le concatenam la stringul
//care va fi in final afisat
f++;
}
alert(s);
</SCRIPT>
46
2.4.3. DOM (Document Object Model).
Din punct de vedere dinamiz rii paginilor web, limbajul JavaScript reprezint doar o unealt
de lucru (aţi remarcat în paragraful anterior similitudinea dintre acesta şi limbajul C). Pentru ca
limbajul JavaScript s acţioneze asupra conţinutului paginii, ei bine, acest lucru îl face tocmai prin
intermediul DOM.
Prin intermediul DOM putem accesa orice obiect al paginii web şi îl putem face s se
comporte exact în felul în care dorim noi.
Ca şi în cazul program rii vizuale, DOM permite interceptarea anumitor evenimente (poziţia
mouse-ului, click-uri, etc.) şi tratarea lor diferenţiat .
Vom da în continuare, câteva exemple comentate, în care oper m cu JavaScript + DOM.
1) Schimbarea unei imagini atunci când trecem cu cursorul peste ea: Pentru aceasta aplicaţie
avem nevoie de doua fişiere imagine, care s fie, de preferabil, identice ca şi dimensiuni, şi obţinute
una dintr-alta printr-un procedeu de genul negativ sau trecere la alb-negru.
Iat fişierele imagine pe care am testat script-ul urm tor:
47
apl034.html:
<HTML><HEAD>
<TITLE>Schimbare de imagini</TITLE>
<SCRIPT language="JavaScript">
function schimba_negativ()
{//in momentul apelului, aceasta functie obtine
//in variabila dp o referinta catre obiectul img
//din pagina principala, gratie id-ului sau, si
//anume 'poza'
dp=document.getElementById("poza");
//dupa care imaginea sursa a sa este schimbata,
//folosind imaginea din fisierul dogneg.jpg (cea negativa)
dp.src="dogneg.jpg";
}
function revine_normal()
{//exact la fel ca functia precedenta, insa
//se foloseste alta imagine, si anume cea initiala,
//dog.jpg
dp=document.getElementById("poza");
dp.src="dog.jpg";
}
</SCRIPT>
</HEAD>
<BODY>
<!--elementului img ii stabilim id-ul 'poza'
pentru a-l putea folosi apoi in cadrul script-ului
de asemenea, programam ca elementul img sa reactioneze
la cele doua evenimente:
- onmouseover (cind mouse-ul intra deasupra imaginii)
se va apela functzia care schimba imaginea originala cu
cea pe negativ
- onmouseout (cind mouse-ul iese de deasupra imaginii)
se va apela functzia care pune la loc imaginea originala-->
<IMG src="dog.jpg" id="poza"
onmouseover="schimba_negativ();"
onmouseout="revine_normal();">
</BODY>
</HTML>
function rgb(red,green,blue)
{//aceasta functie genereaza constanta HTML de tip culoare plecind de la valorile lui
//red, green, blue, numere cuprinse intre 0 shi 255.Ea se foloseste de functia de mai sus
return "#"+toHex(red)+toHex(green)+toHex(blue);
}
48
function coloreaza()
{//aceasta functie se apeleaza la apsarea butonului definit in cadrul lui BODY. In primul
//rind testam daca valorile sunt intregi. Observati ca am folosit identificatorii dati la
//atributul id pentru a extrage valorile din cimpurile text. In primul rind, pentru a
//accesa obiectele de tip <input type="text" id="..."> va trebui sa ne folosim de o
//functie speciala DOM, si anume document.getElementById. Aceasta functie ne intoarce
//o variabila prin intermediul careia putem accesa in continuare obiectul cu ID-ul
//respectiv.
//In cazul nostru, obtinem variabilele r, g si b pe baza cimpurilor text cu ID-urile
//rr, gg si bb definite in cadrul sectiunii <body>, mai jos.
//Pe baza variabilelor de tip obiect r, g si b, cimpul "value" ne va intoarce taman
//valoarea scrisa in acestea
r=document.getElementById("rr");
g=document.getElementById("gg");
b=document.getElementById("bb");
nr=parseInt(r.value);ng=parseInt(g.value); nb=parseInt(b.value);
if(nr!=r.value)//daca valoarea convertita la intreg nu coincide
//cu cea neconvertita, inseamna ca nu este inteaga, deci dam un mesaj
{alert("Valoarea lui r nu este corecta!");
return;}//si iesim fortat (ca in C) cu return
//procedam analog pentru celelalte doua
if(ng!=g.value)
{alert("Valoarea lui g nu este corecta!");return;}
if(nb!=b.value)
{alert("Valoarea lui b nu este corecta!");return;}
//acum verificam sa fie cuprinse intre 0 si 255
if(nr<0||nr>255)
{ alert('Valoarea lui r nu este cuprinsa intre 0 si 255');return;}
if(ng<0||ng>255)
{ alert('Valoarea lui g nu este cuprinsa intre 0 si 255');return;}
if(nb<0||nb>255)
{ alert('Valoarea lui b nu este cuprinsa intre 0 si 255');return;}
//in fine, daca am trecut de aceste filtre, valorile lui r, g si b sunt corecte
// si putem, in fine, stabili culoarea de fundal a celuilalt tabel (caruia i-am dat
//id-ul tabel) la cea pe care o obtinem din combinatia r, g, b introdusa.
tbl=document.getElementById("tabel");
//La fel ca mai sus, getElementById ne intoarce o variabila prin intermediul
//careia putem accesa obiectul cu id-ul respectiv
tbl.style.backgroundColor=rgb(nr,ng,nb);
//apoi, prin intermediul variabilei intoarse, si anume tbl,
//stabilim culoarea de fundal a tabelului. Pentru intoarcerea culorii
//in formatul recunoscut de HTML, adica #RRGGBB apelam functia
//rgb scrisa tot de noi, mai sus
}
</SCRIPT>
<BODY>
Introdu componentele de culoare (numere intre 0 si 255):<BR><BR>
<!--In tabelul de mai jos am folosit 3 input type="text" fara a ne afla intr-un form.
Este posibil si asa ceva, deoarece continutul lor il vom prelua cu ajutorul unui script
JavaScript. In cadrul acelui script ne vom folosi de aceste controale prin intermediul
atributului id pe care l-am stabilit, deci rr, gg si bb-->
<TABLE border="1" cellspacing="0" cellpadding="5">
<TR><TD>Rosu<TD>
<INPUT type="text" id="rr" maxlength="3" size="3">
<TR><TD>Verde<TD>
<INPUT type="text" id="gg" maxlength="3" size="3">
<TR><TD>Albastru<TD>
<INPUT type="text" id="bb" maxlength="3" size="3">
</TABLE><BR>
<!--Mai jos am folosit o componenta de tip BUTTON. Aceastei componente i-am folosit
atributul onclick. Acestui atribut ii specificam practic ce functie JavaScript trebuie
apelata in momentul in care se da click pe buton -->
<BUTTON onclick="coloreaza();">Testeaza</BUTTON>
<BR><BR>
<!--acestui tabel i-am utilizat atributul id, pentru a-l putea mai usor accesa
prin modelul DOM in cadrul codului JavaScript-->
<TABLE width="50%" height="50%" id="tabel" border="1">
<TR><TD align="center" valign="middle">TEST AREA
</TABLE>
</BODY></HTML>
49
3) În aplicaţia urm toare, prin intermediul unui control de tip input type=”text” vom
cere utilizatorului s introduc un num r x între 4 si 20. Pe baza acestui num r (pe care-l valid m)
vom genera, într-un element de tipul iframe, un tabel cu x linii şi x coloane, în care punem numerele
de la 1 la x2 şi ale c rui celule le color m alternativ, la fel ca pe o tabl de şah.
Pe lâng codul surs am pus şi o captur a ferestrei, in urma rul rii cu n=7 (apl036.html):
<HTML><HEAD><SCRIPT language="JavaScript">
function genereaza()
{
n=document.getElementById("nn");
nr=parseInt(n.value);
if(nr!=n.value)//verificam daca in n este un numar intreg
{alert('Numarul introdus nu este intreg');return;}
else if(nr<4||nr>20)//verificam si daca este intre 4 si 20
{alert('Numarul trebuie sa fie intre 4 si 20');
return;}
d=document.getElementById("ifr").contentWindow.document;
//obtinem in variabila d referinta DOM catre documentul din iframe
d.open();//deschidem acest document pentru rescriere
d.write('<TABLE border="1" cellspacing="0" cellpadding="5">');
k=0;//si generam, prin script, in cadrul sau, codul HTML
//care creeaza tabelul anuntat
for(i=1;i<=nr;i++)
{
d.write('<TR>');
for(j=1;j<=nr;j++)
{
d.write('<TD align="center" ');
if((i+j)%2)//in functie de paritatea lui i+j
//coloram intr-un fel sau intr-altlul fundalul celulei
d.write('bgcolor="#ffff7f">');
else
d.write('bgcolor="#7fffff">');
++k;
d.write(String(k));
}
}
d.write('</TABLE>');
d.close();
}
</SCRIPT></HEAD><BODY>
Introdu un numar natural cuprins intre 4 si 20:
<!--prin intermediul input type="text" scriem o valoare
care este apoi preluata de JavaScript. Acesta are id-ul
"nn" -->
<INPUT type="text" id="nn" size="2" maxlength="2">
<BR><BR>
<!--prin intermediul metodei "onclick()" a butonului
apelam functia care generaza codul HTML al tabelului
in documentul din iframe-->
<BUTTON onclick="genereaza();">Genereaza tabelul</BUTTON>
<BR><BR>
<IFRAME id="ifr" width="70%" height="500">
</IFRAME><HR></BODY></HTML>
50
3. LIMBAJUL PHP – FACILIT I ALE ACESTUIA
3.1. Introducere – scurt istoric al apari iei limbajului PHP; mod de func ionare.
PHP este un limbaj de programare destinat în primul rând Internetului, aducând dinamic
unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (este
gratuit şi, în plus, utilizatorii pot acţiona liber asupra procesului de dezvoltare) şi server-side (codul
surs nu se ruleaz pe calculatorul celui care vizualizeaz pagina, ci pe serverul web).
Numele s u este un acronim recursiv: „Php este un Hypertext Processor”. Limbajul a fost
început în 1994 ca o extensie a limbajului server-side Perl, şi apoi ca o serie de CGI-uri compilate,
de c tre Rasmus Lerdorf, pentru a genera un curriculum vitae şi pentru a urm ri num rul de
vizitatori ai unui site. A evoluat apoi în PHP/FI 2.0, dar proiectul open-source a început s ia
amploare dup ce Zeev Suraski şi Andi Gutmans au lansat o nou versiune a interpretorului PHP în
vara anului 1998, aceast versiune primind numele de PHP 3.0. Tot ei au schimbat numele în
acronimul recursiv amintit mai sus, pân atunci PHP-ul fiind cunoscut ca „Personal Home Page
tools”. În prezent este utilizat versiunea 6 a acestui limbaj.
Prin CGI (Common Gateway Interface) se înţelege o interfaţ a unui server de web, care
extinde funcţionalit ţile acestuia. CGI nu se refer la un anumit limbaj de programare, ci defineşte
un modul standardizat, prezent în cadrul unui server HTTP. Prin intermediul acestui modul se
stabilesc regulile prin care server-ul va pasa datele primite de la un utilizator c tre o aplicaţie scris
într-un anumit limbaj de programare, pentru ca apoi s întoarc rezultatele acestei aplicaţii înapoi la
utilizator.
Limbajul PHP, în marea majoritate a cazurilor, se foloseşte sub form de secvenţe de cod
inserate în cadrul unui document HTML. Din acest motiv, vom prefera termenul de „script PHP”
celui de program PHP. Structura unui script PHP este foarte asem n toare cu cea a unui cod scris în
limbajul C, mai ales în sensul în care structurile de programare au aceeaşi sintax şi aceeaşi
funcţionalitate.
Rolurile de baz ale unui script PHP constau în aceea c scipt-ul poate prelua date trimise de
c tre o pagin web de la un client (în general, datele pot fi trimise de c tre o pagin web prin
intermediul formularelor) şi de a executa o secvenţ de program în urma c reia va rezulta un cod
HTML, cod pe care clientul îl va primi sub forma unei pagini web. Clientul nu va avea acces la
codul efectiv al script-ului, ci, prin faptul c acesta se afl pe server şi se ruleaz tot pe acesta, va
primi direct HTML-ul generat de script.
51
3.2. Cerin e tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii
asupra instal rii.
52
La momentul scrierii lucr rii de faţ , ultima versiune public a XAMPP-ului este 1.6.7.
Fişierul executabil al installer-ului acestei versiuni este xampp-win32-1.6.7-installer.exe
3. La sfârşitul instal rii, server-ul de web este deja funcţional, având inclus atât suport php cât şi
baza de date MySQL. Prin intermediului panoului de control XAMPP putem vedea care este starea
curent a server-elor instalate, şi le putem de asemenea gestiona.
4. Pentru a testa efectiv funcţionalitatea server-ului web, deschidem un browser de internet, scriind
la adres : http://localhost.
Dac instalarea a fost f cut cu succes, ne apare o pagin din care suntem invitaţi s alegem
limba de operare, dup care suntem duşi în pagina „HOME” a instal rii f cute.
Directorul r d cin al documentelor web este c:\xampp\htdocs.
În vederea test rii aplicaţiilor PHP pe care le vom studia în continuare, vom crea în acest
director un alt subdirector phpapps.
Dup ce l-am creat, putem testa existenţa sa deschizând browser-ul de internet în care
scriem adresa: http://localhost/phpapps
În browser trebuie s ne apar un director gol.
În mod implicit, toate fişierele şi subdirectoarele pe care le punem în acesta vor fi vizibile
prin intermediul server-ului de http. Numele index.htm, index.html respectiv index.php
sunt rezervate: dac denumim vreun fişier în acest mod, la intrarea în directorul care îl conţine, în
loc de a ne ar ta ceea ce se g seşte în acest director, serverul web ne va ar ta direct pagina conţinut
de fişierul respectiv.
Spre deosebire de fişierele .html care o dat create pe discul local cu un editor de texte pot
fi deschise imediat tot local, direct în browser-ul de Internet, pentru a rula codul PHP este absolut
necesar ca fişierele s fie puse în directorul în care rezid documentele serverului web, iar
53
vizualizarea lor s fie f cut prin intermediul acestuia. În mod implicit, un fişier care conţine un
script PHP trebuie s fie salvat cu extensia .php.
S cre m primul nostru script PHP. Vom descrie operaţiile necesare acestui lucru,
bazându-ne pe instalarea pachetului XAMPP descris în capitolul anterior. Astfel, toate scripturile
pe care le vom crea le vom pune în directorul c:\xampp\htdocs\phpapps .
Cu ajutorul unui editor de texte (de exemplu Notepad, Notepad++) creaţi urm torul fişier, pe
care îl salvaţi în directorul de mai sus sub numele apl037.php (codul de mai jos este preluat aşa
cum apare vizualizat în editorul Notepad++. Numele fişierelor aplicaţiilor continu num r toarea
din capitolul precedent):
Observaţi structura absolut identic celei a unui fişier HTML. Noutatea este adus de
scriptul PHP, care este inserat între tag-urile colorate în roşu: „<?php” şi „?>”.
Instrucţiunea „echo” cuprins între acestea este o instrucţiune specific limbajului PHP, ea
având rolul de a scrie în pagina web textul ce urmeaz dup , cel cuprins între ghilimele.
S vizualiz m acum pagina rezultat în urma acestui fişier. Pentru aceasta, deschideţi
browser-ul de Internet, scriind urm toarea adres : http://localhost/phpapps.
Dac XAMPP a fost corect instalat, veţi obţine urm toarea pagin :
54
În pagin v este ar tat conţinutul directorului în care am creat fişierul apl037.php, aşa
cum este vizualizat prin intermediul serverului de web.
În aceast pagin faceţi un click pe fişierul apl037.php, pentru a-l vizualiza prin
intermediul serverului web. Dac totul este în regul , conţinutul afişat în browser trebuie s fie
urm torul:
Remarcaţi c , ceea ce vedem este rezultatul instrucţiunii echo din PHP. Dac se obţine
altceva, înseamn c instalarea nu s-a f cut în mod corect.
Mai mult, s analiz m codul surs generat. Pentru aceasta, în browser, executaţi comanda de
vizualizare a sursei (în cazul lui Internet Explorer, alegeţi din meniul View opţiunea Source). Va
trebui s obţineţi urm torul cod surs :
<HTML><HEAD>
<TITLE>Primul HTML continind script PHP</TITLE>
</HEAD>
<BODY>
<H2>Acesta este un titlu H2 scris normal, in afara scriptului</H2>
Acest text este scris de catre script-ul PHP</BODY>
</HTML>
Aşa cum am anunţat, codul PHP, ba chiar însuşi faptul c în aceast pagin ar exista vreun
script, nu sunt vizibile clientului, ci acesta vede doar rezultatul obţinut în urma rul rii.
55
aceeaşi sintax . Sintaxa lui echo este uşor de asimilat, prin analogie cu cout<< (entit ţile de afişat,
în loc s mai fie separate de << sunt separate de virgule). Remarcaţi, de asemenea, c la fiecare
afişare echo din cadrul repetitivei for, este afişat tag-ul <br>, pentru ca, în pagina vizualizat ,
dup fiecare linie s se treac la rând nou.
Iat rezultatul pe care trebuie s -l obţinem în browser:
Din nou, vizualizând codul primit de c tre browser, vom obţine urm torul HTML:
Remarcaţi din nou c , ceea ce ajunge la client este doar rezultatul execuţiei script-ului PHP.
Observaţi c , deşi tag-ul <BR> produce în browser trecerea la rând nou, în cadrul vizualiz rii sursei
obţinute, codul este dezordonat, deoarece este scris „una-ntr-una”, f r Enter-uri.
Acest lucru, în mod normal, nu deranjeaz , atâta timp cât aspectul paginii vizualizate în
browser are acelaşi aspect.
Totuşi, o aliniere este binevenit în cazul depan rii unui script, pentru c se poate urm ri
mai uşor apariţia unei eventuale erori sau neconcordanţe.
Pentru acest lucru, în cadrul unui echo putem folosi, la afişare, oricâte treceri la rând nou
dorim. Acestea se fac, la fel ca şi în C, prin caracterul special ”\n”. Dup cum ştim din capitolul
precedent, Enter-urile în cadrul unui text din codul HTML nu au efect, deci afişarea de ”\n”-uri o
folosim în special pentru structurarea ordonat a acestuia.
56
În cazul aplicaţiei de faţ (apl038.php) s modific m linia a 8-a a sa (afişarea cu echo)
schimbând-o în urm toarea:
Aspectul s u în browser r mâne absolut nemodificat. Totuşi, vizualizând codul surs , vom
remarca alinierea acestuia:
57
3.4. Constante. Variabile. Operatori. Afişarea datelor.
Constante
Constantele recunoscute de limbajul PHP sunt asem n toare cu cele ale limbajului C:
• constante numerice întregi şi reale: 14, -80, 3.14, -8.25, 1e+2, 314e-2, etc.
• constante de tip caracter şi şir de caractere: ”a”, ”\n”, ”Ana are mere”, ’Cici’,
’Mimi’, etc. Spre deosebire de C, în PHP nu se mai face diferenţa între un singur caracter şi un
întreg şir de caractere din punct de vedere al constantelor. Separatorii pot fi atât ghilimelele cât şi
apostrofurile, rolul lor funcţional fiind puţin diferit – vom vedea acest lucru mai încolo. Caracterele
speciale sunt aceleaşi ca şi în C: \n, \\, \’, \” şi altele.
• constante de tip bool: false şi true. Spre deosebire de C, rezultatul oric rei expresii
relaţionale sau logice este de acest tip special de date. Totuşi, în cazul instrucţiunilor care necesit
expresii relaţionale sau logice, se p streaz convenţia din C, şi anume c orice valoare diferit de 0
este echivalent cu true, iar orice valoare egal cu 0 este echivalent cu false.
Variabile
58
Exemplu de script (apl040.php):
<?php
$a=4+5.5;//La fel ca si in C, mai intii se evalueaza expresia din dreapta.
//Rezultatul 9.5 este real. In urma atribuirii este creata variabila $a, de tip real
echo "Valoarea din variabila a este: ",$a,"<BR>\n";
$b="Ana are mere";//Se creeaza variabila $b, de tip string
$a=$b;//Modificam variabila $a, dindu-i continutul lui $b. Acesta fiind de tip
//string, se modifica si tipul variabilei $a, de la real la string.
//Acest lucru n-ar fi fost posibil in C
echo "Noua valoare din variabila a este: <B><FONT color=\"red\">",$a;
echo "\n</FONT></B>";//in plus, am mai imbogatit afisarea, folosind tag-urile
//pentru scris bold si cel pentru caractere de culoare rosie
?>
Analizaţi leg tura dintre codul surs de mai sus şi alinierea fişierului obţinut în browser
(deci afiş rile de \n din cadrul instrucţiunilor echo) :
Valoarea din variabila a este: 9.5<BR>
Noua valoare din variabila a este: <B><FONT color="red">Ana are mere
</FONT></B>
Remarcaţi de asemenea şi faptul c valoarea atributului color (şi anume red) a trebuit a fi
scris între ghilimele. Textul din cadrul echo-ului în care am afişat acest atribut, fiind deja în
interiorul unor ghilimele, a trebuit s folosim caracterul special \” pentru a face aceast afişare
posibil . Dac am fi folosit, pur şi simplu, ghilimele obişnuite, instrucţiunea echo ar fi considerat
c în acel loc se încheie stringul, iar din acest caz n-ar mai fi putut interpreta caracterele urm toare,
ceea ce s-ar fi terminat cu producerea unei erori.
În PHP este posibil şi adresarea indirect . Acest lucru înseamn c , dac o variabil conţine
o expresie de tip string în care este reţinut numele unei variabile, putem afişa direct valoarea
variabilei reţinut de string. Pentru aceasta se va folosi înc o dat caracterul $ (de forma $$x).
Operatori
Mulţi dintre operatorii limbajului PHP sunt cunoscuţi din C++. Acesta este motivul pentru
care vom prezenta doar anumite particularit ţi specifice limbajului PHP.
59
Pentru început, îi prezent m, în ordine descresc toare a priorit ţilor lor:
1. ! , ++ , -- , (int) , (double) , (string) ;
2. * , % , / ;
3. < , <= , > , >= ;
4. == , != , === , !== ;
5. & ;
6. ^ ;
7. && ;
8. ?: ;
9. = , += , -= , /= , *= , %= , &= , |= , ^= ;
10. And ;
11. Xor ;
12. Or ;
13. , ;
În PHP se pot folosi operatori de conversie explicit , cunoscuţi din C++. Ca şi în C++, ei se
aplic prefixat. Astfel, exist : (int) – conversie c tre o valoare întreag , (string) – conversie
c tre şir, iar (double) – conversie c tre real.
Exemplu de script (apl042.php):
<?php
$a=(int)8.65;//la fel ca si in C, se vor elimina zecimalele
echo "variabila a are valoarea: ",$a,"<BR>";
$b=(double)"3.85copac";//conversia se va face atita cit se poate, deci variabila
//b va contine valoarea 3.85, restul de caractere vor fi ignorate
echo "variabila b are valoarea: ",$b,"<BR>";
$c="1.25mere"+"3.75pere";//ba mai mult, se va face conversia explicita, adica
//limbajul va converti mai intii cele doua stringuri la numere, apoi va face adunarea
echo "variabila c are valoarea: ",$c,"<BR>";
$d=19/5;//spre deosebire de C, operatorul C face impartire reala, chiar daca
//operatorii sai sunt intregi
echo "variabila d are valoarea: ",$d,"<BR>";
//daca dorim impartire intreaga, facem conversia la int:
$e=(int)(19/5);
echo "variabila e are valoarea: ",$e,"<BR>";
?>
60
$b=("3"==3.90);//vom obtine false
echo 'Iata rezultatul comparatiei "3"==3.90 : ';
var_dump($b);echo "<BR>";
$b=("3.90"==3.90);//vom obtine true
echo 'Iata rezultatul comparatiei "3.90"==3.90 : ';
var_dump($b);echo "<BR>";
?>
Afişarea datelor
Dup cum am v zut deja, una dintre cele mai folosite instrucţiuni de afişare în PHP este
echo. Are dou forme:
a) data afişat se scrie între paranteze rotunde (aceast form nu poate fi folosit pentru
afişarea mai multor date): echo(”Ana are mere”);
b) datele afişate sunt scrise dup echo, f r a fi grupate între paranteze şi separate prin
virgule: echo ”Ana are ”, 1+2, ”mere”;
O alt instrucţiune de afişare este print. Dup ea urmeaz o singur dat , care poate fi sau
nu pus între paranteze. Funcţioneaz ca şi echo, în plus, în cazul în care folosim forma cu
paranteze, va întoarce valoarea true dac afişarea a fost f cut cu succes, respectiv false în caz
contrar.
Alte dou instrucţiuni folosite în special pentru cazurile în care dorim s depan m un
program sunt:
61
• var_dump(expresie) – afişeaz tipul expresiei urmat de valoarea sa;
• print_r(variabila) – în cazul unor variabile compuse (şiruri, obiecte) produce o
afişare a tuturor componentelor ale acestora.
Observa ii:
Dup cum am v zut deja prin exemplele date, în loc de ghilimele, se pot folosi şi
apostrofuri. Diferenţa este dat de faptul c , în cazul folosirii ghilimelelor, dac şirul de caractere
conţine numele unor variabile, acestea vor fi evaluate, deci se va afişa conţinutul lor, pe când în
cazul apostrofurilor se va afişa numele variabilei ca atare.
Nu putem folosi ghilimele incluse în cadrul altei perechi de ghilimele, şi nici apostrofuri
incluse între alte perechi de apostrofuri, în schimb, putem include ghilimele într-un şir delimitat de
apostrofuri sau apostrofuri într-un şir delimitat de ghilimele.
Exemplu de script (apl046.php):
<?php
$a=3;$b=4;
echo "Ana are $a mere si $b mere<BR>";//aici se vor evalua atit $a cit si $b
echo 'Ana are $a mere si $b mere<BR>';//pe cind aici nu
?>
Instrucţiunile PHP sunt asem n toare cu cele din C. Din acest motiv, ne vom limita la o
scurt prezentare a lor şi la câteva exemple de utilizare.
62
3.5.3. Instrucţiunea if.
Are aceeaşi form şi funcţionalitate ca şi în C:
if(expresie) instrucţiune1;
[else instrucţiune2;]
Deci, dac expresia este evaluat ca fiind adev rat (sau diferit de 0) se execut
instrucţiune1. Dac este fals (sau 0) iar ramura else este prezent , se va executa
instrucţiune2. La fel ca şi în C, dac în loc de o singur instrucţiune sunt mai multe, se vor
grupa într-un bloc.
Exemplu de script (apl047.php) care conţine un if:
<?php
//urmatorul script ia ca si parametru de intrare variabila a definita mai jos.
//Pentru ca inca nu am prezentat cum se face preluarea de date de catre PHP, ne
//vom limita sa modificam manual variabila $a de mai jos.
//Program formeaza alte doua variabile $b si $c, cu primele doua respectiv
//ultimele doua cifre ale lui $a, daca acesta are exact 4 cifre, sau scrie un
//mesaj corespunzator in caz contrar
$a=1425;
echo 'Valoarea din variabila $a este : ',$a,"<BR>";
if($a>=1000&&$a<=9999)//deci verificam sa aiba exact 4 cifre
{//in caz afirmativ se executa instructiunile din acest bloc
$b=(int)($a/100);
$c=$a%100;
echo "Primele doua cifre ale sale sunt : ",$b,"<BR>";
echo "Ultimele doua cifre ale sale sunt : ",$c,"<BR>";
}
else //iar in caz contrar afisam un mesaj corespunzator
echo "Valoarea din variabila a NU are exact 4 cifre!<BR>";
?>
63
3.5.5. Instrucţiunea do...while.
Are aceeaşi form şi funcţionalitate ca şi în C:
do
instrucţiune;
while(expresie);
64
3.6. Transmiterea datelor prin intermediul formularelor.
Atributul action al tag-ului form se refer la numele fişierului PHP care se va ocupa de
prelucrarea datelor iar atributul method de metoda prin care sunt trimise datele c tre server.
Tag-ul <input type=”text”...> creeaz un câmp de date de tip text. Atributul name al
acestuia specific un identificator prin care PHP-ul va prelua valoarea din acesta.
Tag-ul <input type=”submit”...> creeaz un buton de trimitere a datelor. Practic,
ap sarea pe acest buton permite trimiterea conţinutului întregului formular c tre server.
Preluarea datelor trimise c tre server prin intermediul metodei POST, în cadrul unui script
PHP se face prin intermediul vectorului predefinit $_POST[’nume_câmp_din_formular’].
Atenţie la faptul c $_POST trebuie scris cu majuscule !.
De exemplu, în cazul nostru, putem recupera aceast valoare prin intermediul lui
$_POST[’a’].
Analog, dac datele ar fi trimise c tre server prin intermediul metodei GET (deci în mod
vizibil, în cererea URL, de exemplu http://mypage.html?a=13), în cadrul script-ului PHP
asociat, preluarea lor se face prin intermediul vectorului predefinit
$_GET[’nume_câmp_formular].
În cazul în care un anumit câmp nu exist , în momentul cererii $_POST[...] din cadrul
PHP-ului, acesta s-ar putea sa genereze un mesaj de tip atenţionare (warning) în funcţie de set ri.
Pentru a evita acest lucru, în faţa caracterului $ (de la $_POST[...]) punem caracterul @.
Semnificaţia acestuia este de a ignora mesajele de tip warning.
65
Iat şi codul lui apl052.php, scriptul PHP pe care l-am anunţat în atributul action al
formularului apl051.html, script care va trebui s se afle în acelaşi director cu apl051.html.
Scriptul preia valoarea câmpului text din form şi afişeaz atât valoarea recuperat cât şi p tratul s u:
<?php
$a=$_POST['a'];//deci, in variabila $a preluam valoarea din cimpul cu
//atributul name="a" al form-ului care a trimis datele.
echo "Iata valoarea preluata din formular: ",$a,"<br><br>";
echo "Patratul sau este ",$a*$a;
?>
Vom studia, în continuare, modul în care se preiau datele din toate tipurile de elemente care
pot s apar într-un formular obişnuit:
- în cazul unui input de tip text, am v zut deja cum se face acest lucru. În exact acelaşi
mod se preiau datele dintr-un input de tip password, de tip hidden sau de tip textarea.
- în cazul unui input de tip submit, valoarea (care este de fapt textul scris pe buton) se
poate prelua doar în cazul în care, în cadrul tagului <input type=”submit”...> apare şi
atributul name. Evident, în cazul în care formularul are un singur control de tip submit, e destul de
ilogic sa dorim sa vedem ce valoare are.
Totuşi, în cazul în care un formular are dou sau mai multe butoane de tip sumbit, c rora
vrem s le asign m funcţii diferite, este foarte important s ştim care dintre ele a fost ap sat.
Iat mai jos un astfel de exemplu:
apl053.html + apl054.php – primul fişier conţine un formular cu dou câmpuri text, în care
introducem valori numerice. În funcţie de controlul submit pe care-l ap s m, al doilea fişier va
prelua datele şi va calcula fie produsul fie suma celor dou valori numerice:
apl053.html:
<form action="apl054.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza suma" name="operatia">
<input type="submit" value="Calculeaza produsul" name="operatia">
</table>
</form>
apl054.php:
<?php
$op=$_POST['operatia'];//controlul cu numele 'operatia' este chiar butonul de submit
//preluam valoarea sa in variabila $op, pentru a vedea care dintre butoane a fost apasat
$a=$_POST['cta'];//preluam si cele doua valori numerice
$b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb
//le afisam:
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
//in functie de valoarea lui "op" calculam suma sau produsul
66
if($op=="Calculeaza suma")
echo "Suma celor doua este ",$a+$b;
else
echo "Produsul celor doua este ",$a*$b;
?>
- în cazul unui control de tip radio, s ne amintim mai întâi c toate tag-urile de tipul
<input type=”radio”...> trebuie s aib la atributul name acelaşi nume, iar la atributul
value valori diferite, prin care vom identifica opţiunea aleas . Aceast valoare va fi trimis c tre
PHP.
Iat un exemplu de utilizare al controlul de tip radio: apl055.html + apl056.php. Cu aceast
ocazie vom folosi şi instrucţiunea switch a limbajului PHP, instrucţiune pe care nu am prezentat-o,
îns care are exact aceeaşi sintax şi funcţionalitate ca în C.
apl055.html:
<form action="apl056.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2">
Alege operatia pe care doresti<br>
sa o faci cu cele doua:<br>
<input type="radio" value="1" name="op" checked>Suma<br>
<input type="radio" value="2" name="op">Diferenta<br>
<input type="radio" value="3" name="op">Produsul<br>
<input type="radio" value="4" name="op">Citul
<tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza">
</table>
</form>
apl056.php:
<?php
$op=$_POST['op'];//controlul cu numele 'op' este grupul de butoane radio.
//preluam valoarea sa in variabila $op, pentru a vedea care optiuni a fost aleasa
$a=$_POST['cta'];//preluam si cele doua valori numerice
$b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb
//le afisam:
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
//in functie de valoarea lui "op" calculam suma sau produsul
switch($op)
{
case 1:
echo "Suma celor doua este ",$a+$b;
break;
case 2:
echo "Diferenta celor doua este ",$a-$b;
break;
case 3:
echo "Produsul celor doua este ",$a*$b;
break;
default:
echo "citul celor doua este ",$a/$b;
}
?>
67
- în cazul unui control de tip checkbox, s ne reamintim c fiecare control de acest tip are
un nume separat. Dac este bifat, va trimite c tre PHP valoarea indicat în atributul value a
tag-ului <input type=”checkbox”...> (ca şir de caractere). Dac acest atribut nu este prezent,
valoarea trimis c tre PHP va fi şirul de caractere „on”.
În schimb, dac nu este bifat, pur şi simplu nu va trimite nimic, deci s-ar putea ca cererea
$_POST[...] sa genereze un warning (depinde şi de set rile PHP-ului). Pentru ca acest lucru s nu
se întâmple, indiferent de set ri, aşa cum am anunţat mai înainte, folosim caracterul @ în faţa cererii
$_POST[...].
Iat mai jos un exemplu: apl057.html + apl058.php
apl057.html:
<form action="apl058.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td>Alege, dintre cele de mai jos,<br>
limbile straine pe care le cunosti:
<tr><td>
<input type="checkbox" name="en">Engleza<br>
<input type="checkbox" name="fr">Franceza<br>
<input type="checkbox" name="ge">Germana<br>
<input type="checkbox" name="it">Italiana<br>
<input type="checkbox" name="es">Spaniola<br>
<tr><td align="center">
<input type="submit" value="Trimite date">
</table>
</form>
apl058.php:
<?php
$en=@$_POST['en'];
$fr=@$_POST['fr'];
$ge=@$_POST['ge'];
$it=@$_POST['it'];
$es=@$_POST['es'];
$l=0;//$l este un flag pe care-l facem 1 cind dam de o limba straina bifata
echo "Iata limbile straine pe care le-ai bifat:<br>";
if($en=="on") {echo "Engleza<br>";$l=1;}
if($fr=="on") {echo "Franceza<br>";$l=1;}
if($ge=="on") {echo "Germana<br>";$l=1;}
if($it=="on") {echo "Italiana<br>";$l=1;}
if($es=="on") {echo "Spaniola<br>";$l=1;}
if($l==0)//daca flag-ul a ramas 0, dam utilizatorului
//un mesaj prin carae il informam ca nu a bifat nimic
echo "Nu ai bifat nici una dintre limbile straine!";
?>
- în cazul unui control de tip select simplu, PHP-ul va putea recupera valoarea cu ajutorul
numelui stabilit în atributul name al tag-ului <select ...>, valoarea trimis fiind cea stabilit în
atributul value al tag-urilor option înglobate în cadrul select-ului.
Iat mai jos un exemplu (apl059.html + apl060.php) care reia ideea din apl055.html
cu deosebirea c , în loc de a alege operaţia dorit prin intermediul unui control radio, o alegem cu
ajutorul controlului select. A se remarca faptul c fişierul care prelucreaz datele (apl060.php)
a r mas identic cu cel care prelucra datele din apl055.html.
68
apl059.html:
<form action="apl060.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td align="right">Introdu o valoare numerica:
<td align="center">
<input type="text" name="cta" maxlength="4" size="4">
<tr><td align="right">Introdu o alta valoare numerica:
<td align="center">
<input type="text" name="ctb" maxlength="4" size="4">
<tr><td colspan="2">Alege operatia pe care doresti<br>
sa o faci cu cele doua:
<select name="op">
<option value="1">Suma
<option value="2">Diferenta
<option value="3">Produsul
<option value="4">Citul
</select><tr><td colspan="2" align="center">
<input type="submit" value="Calculeaza"></table></form>
apl060.php:
<?php
$op=$_POST['op'];//controlul cu numele 'op' este cel de tip option
$a=@$_POST['cta'];
$b=@$_POST['ctb'];
echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>";
switch($op)
{
case 1:
echo "Suma celor doua este ",$a+$b;
break;
case 2:
echo "Diferenta celor doua este ",$a-$b;
break;
case 3:
echo "Produsul celor doua este ",$a*$b;
break;
default:
echo "citul celor doua este ",$a/$b;
}
?>
- în cazul unui control de tip select multiplu, form-ul va trimite c tre PHP un şir în care
vom reg si valorile selectate. Este obligatoriu, totuşi, ca atributul name din cadrul tag-ului
<select multiple ...> s specifice faptul c se va trimite un şir. Acest lucru se face punând
un set de paranteze p trate dup numele câmpului, deci de forma name=”nume_sir[]”.
Preluarea în PHP se face în mod normal, prin @variabila=@$_POST[’nume_sir’]
(remarcaţi faptul c nu se mai pun []).
Acest şir va conţine pe post de elemente valorile stabilite prin atributul value ale opţiunilor
selectate. Şirul va începe de la indicele 0, num rul s u total de elemente fiind dat de funcţia
count(nume_şir).
Iat un exemplu care exploateaz o list de tipul <select multiple...> (apl061.html
+ apl062.php)
69
apl061.html:
<form action="apl062.php" method="post">
<table border="1" cellspacing="0" cellpadding="5">
<tr><td>Alege, dintre cele de mai jos,<br>
limbile straine pe care le cunosti.<br>
Poti selecta, evident, mai multe<br>
daca tii apasata tasta Control in<br>
timpul selectarii
<tr><td>
<select name="lang[]" multiple size="5">
<option value="en">Engleza
<option value="fr">Franceza
<option value="ge">Germana
<option value="it">Italiana
<option value="sp">Spaniola
</select>
<tr><td align="center">
<input type="submit" value="Trimite date">
</table>
</form>
apl062.php:
<?php
$lang=$_POST['lang'];//recuperam sirul trimis de catre form prin cimpul lang
$nl=count($lang);//apelam functia count pentru a vedea cite elemente are sirul
if($nl==0)
echo "Nu ai selectat nici o limba straina<br>";
else
{
echo "Ai selectat $nl limbi straine. Acestea sunt:<br>";
for($i=0;$i<$nl;$i++)//parcurgem sirul pe un for, de la 0 la $nl-1
switch($lang[$i])//si vedem ce valoare are fiecare element, in functie de
{ //care afisam:
case "en":echo "Engleza<br>";break;
case "fr":echo "Franceza<br>";break;
case "ge":echo "Germana<br>";break;
case "it":echo "Italiana<br>";break;
default:echo "Spaniola<br>";
}
}
?>
- una dintre facilit ţile transmiterii datelor prin intermediul formularelor const în
posibilitatea trimiterii rezultatului mai multor controale sub forma elementelor unui şir sau chiar
matrice. În acest caz, atributul name al controlului din form trebuie s specifice acel element din şir
(sau matrice) care va primi valoarea sa, deci s fie de forma: name="nume_şir[indice]"
respectiv name="nume_matrice[indice_linie][indice_coloană]". Iat un exemplu în
care cre m un form cu 4 controale de tip input type="text", ale c ror valori vor fi preluate de c tre
un şir cu 4 elemente (apl063.html + apl064.php):
apl063.html:
<form action="apl064.php" method="post">
Introdu 4 valori numerice intregi:<br><br>
prima valoare: <input type="text" name="a[1]"><br><br>
valoarea a 2-a:<input type="text" name="a[2]"><br><br>
valoarea a 3-a:<input type="text" name="a[3]"><br><br>
valoarea a 4-a:<input type="text" name="a[4]"><br><br>
<br>
<input type="submit" value="Trimite valorile spre prelucrare">
</form>
70
apl064.php:
<?php
$a=$_POST['a'];
echo 'Cele 4 valori sunt: ',$a[1],' ',$a[2],' ',$a[3],' ',$a[4],'<br>';
$s=0;
for($i=1;$i<=4;$i++)
$s+=$a[$i];
echo '<br>Suma lor este: ',$s;
?>
În PHP se pot scrie funcţii într-un mod foarte similar faţ de ceea ce ştim din C/C++. S
consider m exemplul urm tor, în care se utilizeaz o funcţie care calculeaz şi întoarce suma unui
num r întreg pe care îl primeşte ca parametru:
apl065.php:
<?php
function suma_c($n)//antetul funcţiei: se remarcă folosirea cuvântului cheie
//„function” fără a se specifica vreun tip (nici măcar void)
{
$s=0;
while($n)
{
$s+=$n%10;
$n=(int)($n/10);//ne reamintim că în PHP operatorul / calculează
//câtul real (deci cu zecimale): din acest motiv folosim conversia
//explicită către int
}
return $s;//la fel ca şi în C++, rezultatul întors de funcţie se specifică
//prin intermediul instrucţiunii return
}
echo suma_c(13254);
?>
Aşadar:
• Pentru a întoarce un rezultat din corpul unei funcţii, se foloseşte, aşa cum suntem deja
obişnuiţi, instrucţiunea return. Forma sa general este: return expresie.
• În cazul unei funcţii care nu întoarce rezultat (deci echivalentul unei funcţii de tip void
din C++), cuvântul cheie function r mâne obligatoriu (f r a specifica nimic suplimentar) putând
s apar oriunde în cadrul funcţiei cuvântul cheie return f r a mai fi urmat de vreo expresie,
având ca efect ieşirea imediat din funcţie. El poate fi, de asemenea, omis, ieşirea din funcţie
producându-se în acest caz în mod natural (dup executarea întregului s u cod).
• Transmiterea parametrilor se poate face atât prin valoare cât şi prin referinţ , în acelaşi
mod în care se face şi în C++ :
1) Parametrii specificaţi în mod direct (folosind doar numele variabilei) sunt cei transmişi prin
valoare. Chiar dac valoarea unui astfel de parametru este schimbat în cadrul funcţiei, ea r mâne
71
totuşi neschimbat dup executarea acesteia. Atunci când apel m funcţia, pe poziţiile acestor
parametri se pot transmite atât valori cât şi conţinutul unor variabile.
Script-ul urm tor afişeaz valoarea variabilei de dinainte de apelul funcţiei (10) chiar dac
în funcţie s-a încercat modificarea valorii transmise (apl066.php):
<?php
function test($x)
{
$x=$x*2;
}
$a=10;
test($a);
echo $a;
?>
2) Parametrii pe care dorim s -i transmitem prin referinţ , trebuie precedaţi de caracterul &
(ampersand) în antetul funcţiei. Dac valoarea unui astfel de parametru este modificat în cadrul
funcţiei, ea r mâne modificat şi dup executarea acesteia. Evident, atunci când apel m funcţia, pe
poziţiile acestor parametrii e obligatoriu s specific m variabile.
Relu m scriptul anterior, punând un & (ampersand) în faţa parametrului $x. În acest fel,
valoarea variabilei dup ce apel m funcţia nu va mai fi cea anterioar (10) ci cea obţinut în urma
modific rii (20) – apl067.php:
<?php
function test(&$x)
{
$x=$x*2;
}
$a=10;
test($a);
echo $a;
şi variabile globale. Cele globale sunt cele definite în afara oric rei funcţii. Implicit, ele nu pot fi
adresate din corpul vreunei funcţii. Totuşi, exist o posibilitate de a face acest lucru: în cadrul
funcţiei în care vrem s utiliz m variabile globale, le specific m pe toate, precedate de cuvântul
cheie global. Puteţi observa acest mecanism în exemplu urm tor:
apl068.php:
<?php
function suma()
{
global $a,$b,$c;
//functia se bazeaza pe cele 3 variabile globale $a, $b si $c
//calculând în $c suma dintre $a si $b
//daca nu am fi pus instructiunea “global”, exemplul nu ar fi functionat deoarece
//cele 3 variabile nu ar fi fost recunoscute in functie.
$c=$a+$b;
}
$a=5;$b=6;
suma();
echo $c;
?>
72
• Variabilele locale sunt variabilele create în corpul unei funcţii sau cele create prin
transmiterea parametrilor formali (din antetul funcţiilor). Ele nu sunt recunoscute în afara funcţiilor.
Şi în PHP funcţiile pot fi recursive.
• Pentru a nu înc rca foarte mult un anumit script, putem îngloba toate definiţiile complete
ale funcţiilor într-un singur fişier de tip text (preferabil cu extensia .php, pentru a nu putea fi
vizualizat accidental prin intermediul server-ului http). Mecanismul includerii este unul asem n tor
cu cel din C/C++ (clauza #include...) cu deosebirea c , putem include codul surs al funcţiilor
în orice loc dorim. Acest lucru se face cu ajutorul funcţiei predefinite PHP:
require(”nume_fisier”); .
Codul surs al funcţiilor trebuie inclus şi el între tag-urile <?php .. ?>.
În exemplul de mai jos, vom crea dou fişiere: apl069.php, ce conţine definiţia corect a
unei funcţii care verific dac un num r este prim, şi un altul apl070.php, ce afişeaz toate numerele
prime dintre 1 şi n, folosind funcţia din apl069.php:
apl069.php:
<?php
//a se remarca folosirea tag-urilor specifice includerii unei secvenţe PHP
function is_prime($x)
{//$x este un parametru prin valoare
for($i=2;$i<=sqrt($x);$i++)//variabila $i este locală
if($x%$i==0) return 0;
if($x<=1) return 0;
return 1;
}
?>
apl070.php:
<?php
require("apl069.php");//prin această funcţie includem codul existent în apl069.php
for($i=2;$i<=100;$i++)
if(is_prime($i)) echo $i," ";
//o dovadă a comportamentului local al variabilei $i din cadrul funcţiei constă în faptul
//că şi în codul principal (mai sus) folosim tot o variabilă $i, iar cele două nu se
//încurcă între ele
?>
• Limbajul PHP este înzestrat cu biblioteci care conţin numeroase alte funcţii. Iat câteva
dintre funcţiile matematice predefinite:
- abs(num r) – întoarce modulul num rului (valoarea absolut );
- sin(x), cos(x), tan(x) – sinusul, cosinusul şi tangenta unui unghi. Argumentul x trebuie
specificat în radiani;
- exp(x) – întoarce ex ;
- pow(x, y) – întoarce xy ;
- log10(x), log(x) – întorc log10(x), respectiv ln(x);
- max(x1, x2, ... , xn) – întoarce maximul (cel mai mare) dintre argumentele sale numerice;
73
- min(x1, x2, ... , xn) – întoarce minimul (cel mai mic) dintre argumentele sale numerice;
- ceil(x) – întoarce cel mai mic nr. întreg care este mai mare sau egal cu x;
- floor(x) – întoarce cel mai mic nr. întreg mai mare sau egal cu x (partea întreag d.p.d.v.
matematic);
- rand(min,max) – întoarce o valoare întreag aleatoare cuprins între valorile întregi min şi max
(inclusiv);
- pi() – întoarce o aproximaţie a num rului π;
- sqrt(x) – calculeaz radicalul (r d cina p trat ) a lui x.
Spre deosebire de C/C++, unde şirurile de caractere sunt privite ca pointeri, în PHP şirurile
de caractere sunt privite mai degrab ca nişte variabile de sine st t toare.
În PHP sunt permise atribuirile directe (prin operatorul =) între dou şiruri de caractere.
Din punct de vedere structural, în PHP şirurile de caractere nu mai respect regulile din
C/C++ (şi în special, NU mai este valabil marca sfârşitului de string prin caracterul de cod ASCII
0), în schimb, limbajul ne pune la dispoziţie o serie de funcţii care fac foarte simpl prelucrarea şi
manipularea stringurilor.
În rest, şirurile se memoreaz ca o succesiune de caractere ASCII. Putem adresa fiecare
caracter al şirului prin indicele s u, la fel ca în C/C++, începând de la 0.
• Funcţia strlen(şir) ne întoarce lungimea şirului (num rul s u de caractere).
Dac dorim s parcurgem şirul de caractere, putem s -l parcurgem, ca în C++, de la 0 la
strlen(...)-1.
• Concatenarea a dou sau mai multe stringuri se face cu operatorul ”.” (punctul). Observaţi
?>
în exemplu de mai jos cum se face acest lucru, şi de asemenea faptul c , în timpul concaten rii,
valoarea numeric a fost convertit implicit c tre şir de caractere:
$x=9;
$s="Ana "."are ".$x." mere";
echo $s;//valoarea finală a stringului este "Ana are 9 mere"
74
• Funcţia strpos(sir1, sir2, [poz_start]) caut dac sir2 este subşir al lui sir1
(eventual începând de la poziţia poz_start, dac aceasta este specificat ). În caz afirmativ,
întoarce poziţia de început a acestuia, altfel întoarce false. În exemplul de mai jos se va afişa
valoarea 3 (pentru c la indicele 3 este g sit secvenţa ”pu” în stringul dat):
$s="computer";
echo strpos($s,"pu");
Funcţia se utilizeaz şi pentru a testa dac un şir include sau nu un anumit subşir. Dac
subşirul este g sit, funcţia întoarce poziţia de început a acestuia iar dac nu, întoarce false. Dup
cum ştim, valoarea lui false este, de fapt, 0. Pentru a diferenţia cazurile în care subşirul nu apare
deloc în şir sau apare chiar de la poziţia 0, folosim operatorul ===, care rezolv corect problema:
$s="ana are mere";
$gasit=strpos($s,"a");
if($gasit===false) echo "Negasit";
else echo "Gasit la indicele ",$gasit;
Valoarea întoars de funcţie este reţinut de variabila $gasit. Pentru a face distincţie între
false şi 0, folosim operatorul ===, care testeaz coincidenţa atât ca valoare, cât şi ca tip. De altfel,
acesta este şi rostul unui astfel de operator. Acest procedeu se poate folosi şi pentru alte funcţii.
• Funcţia strstr(sir1, sir2) returneaz din sir1 secvenţa de caractere din poziţia în
care a fost g sit prima apariţie a lui sir2, dac sir2 este subşir pentru sir1 sau false, în caz
contrar.
• Funcţia strcmp(sir1, sir2) compar lexicografic (alfabetic) sir1 cu sir2. Valoarea
întoars este:
- pozitiv , dac sir1 se g seşte lexicografic dup sir2; (sir1>sir2)
- nul (0), dac sir1 este identic egal cu sir2; (sir1==sir2)
- negativ , dac sir2 se g seşte lexicografic înainte de sir1. (sir1<sir2)
În PHP se pot folosi deopotriv şi pentru stringuri operatorii relaţionali: <, <=, >, >=, ==,
!=, care le compar direct, în sens lexicografic, având ca rezultat true sau false.
Observaţie: Comparaţia face distincţie între literele mari şi cele mici (codul ASCII) !
• Funcţia substr(sir, indice, [lungime]) întoarce subşirul şirului şir, care începe
în poziţia indice şi are lungimea lungime. Dac parametru lungime este absent, se întoarce şirul
care începe în poziţia indice şi ţine pân la sfârşitul şirului şir.
Exemplu: apl072.php
<?php
$s="televiziune";
$s1=substr($s,1,4);
echo $s1,'<br>';//afiseaza "elev";
$s2=substr($s,4);
echo $s2;//afiseaza "viziune";
?>
75
• Funcţia substr_replace(sir1, sir2, ind, [lung]) întoarce şirul rezultat prin
înlocuirea în sir1, a subşirului care începe în poziţia ind şi are lungimea lung, cu sir2. Dac
parametrul lung este absent, sir2 înlocuieşte subşirul care începe cu ind şi ţine pân la sfârşitul
şirului şir1, cu şir2.
Exemplu: apl073.php
<?php
$s="Ana are mere";
echo substr_replace($s,"poseda",4,3); //înlocuieşte subşirul ”are” (care începe la
//indicele 4 şi are 3 litere) cu subşirul ”poseda”, deci afişează ”Ana poseda mere”
• Funcţia strtoupper(sir) întoarce şirul rezultat prin conversia doar a acelor caractere
?>
sunt litere mici, la litere mari, iar funcţia strtolower(sir) întoarce şirul rezultat prin conversia
literelor mari la litere mici.
• Funcţia strtok(...) este utilizat pentru extrage substringuri ale unui string, care în
acesta sunt delimitate de nişte caractere ce aparţin unui şir cu delimitatori, dat. De exemplu, dac
avem stringul ”Ana? Nu, doar tu.” şi consider m stringul cu separatori: ”.? #,” (este şi un caracter
spaţiu printre ele) se vor separa şi obţine substringurile ”Ana”, ”Nu”, ”doar”, ”tu”.
Modelul de aplicare:
- iniţial se apeleaz funcţia strtok(string, şir_cu_separatori). Funcţia va
întoarce fie primul cuvânt obţinut prin separare, fie false dac acest lucru nu a fost posibil.
- apoi se apeleaz funcţia strtok(şir_cu_separatori). Aceasta va tot extrage
câte un cuvânt nou obţinut prin separare, fie false dac s-a ajuns deja la sfârşit, deci dac au fost
separate toate cuvintele.
Este recomandat ca testarea valorii false întoars de funcţie s fie testat cu operatorul
=== deoarece, în caz contrar este posibil s apar erori din cauza conversiilor (de exemplu, funcţia
s întoarc 0, iar acesta s fie interpretat ca şi false).
De remarcat, spre deosebire de limbajul C++, c funcţia strtok NU distruge stringul asupra
c reia este aplicat , ci îl las intact, exact ca înainte de separare.
Exemplu: apl074.php
<?php
$s="Ana? Nu, doar tu.";
//varianta 1: pe un while:
$p=strtok($s,"?,.# ");
echo "Stringul initial este:",$s,'<br>Cuvintele sale sunt:<br><br>';
while($p!==false)
{
echo "cuvintul <b>",$p,"</b> are ",strlen($p),' litere<br>';
$p=strtok("?.#, ");
}
//varianta 2: pe un for "mascat":
echo '<br>Iata acelasi string, separat in acelasi mod, folosind o repetitiva';
echo ' de tip for:<br>';
for($p=strtok($s,"?.,# ");$p!==false;$p=strtok("., ?#"))
echo "Cuvintul curent <b>",$p,"</b> are ",strlen($p)," litere<br>";
?>
76
3.9. Şiruri (masive) în PHP.
În PHP exist mult mai puţine constrângeri decât în C/C++ atunci când lucr m cu şiruri sau
cu matrice. În primul rând, în PHP un şir nu se declar . În momentul în care dorim s cre m un şir
(sau o matrice), pur şi simplu atribuim valori elementelor:
apl075.php:
<?php
for($i=1;$i<=5;$i++)
$x[$i]=$i;
for($i=1;$i<=5;$i++) echo $x[$i]," ";
?>
sau apl076.php:
<?php
$k=1;
for($i=1;$i<=5;$i++)
for($j=1;$j<=5;$j++)
$a[$i][$j]=$k++;
for($i=1;$i<=5;$i++)
{
for($j=1;$j<=5;$j++)
echo $a[$i][$j],' ';
echo '<br>';
}
?>
Dac unui element aflat la un anumit indice nu i-am atribuit nici o valoare, în orice evaluare,
acel element are valoarea NULL. Nu este obligatoriu s folosim indici consecutivi.
Ba mai mult, în PHP şirurile pot primi pe post de indici chiar şi şiruri de caractere. Acest fel
de tablou se numeşte tablou asociativ. De exemplu, putem crea un şir în care s reţinem pe
post de indici denumirile unor produse, iar pe post de indici preţurile acestora:
apl077.php:
<?php
$x['Piine']=1.61;
$x['Vin']=5.99;
$x['Alune']=2.21;
$x['Ciocolata']=2.69;
echo $x['Piine'],' ',$x['Vin'],' ',$x['Alune'],' ',$x['Ciocolata'];
?>
Evident, parcurgerea unui astfel de şir (variabila de ciclare printre indici nu mai respect o
regul clasic , numeric ) nu se mai face dup regulile clasice, ci exist o instrucţiune special de
ciclare ce permite parcurgerea vectorului în ordinea în care elementele au fost create, cu
determinarea, pentru fiecare element, a perechii indice, valoare:
foreach(vector as indice=>valoare)
instrucţiune;
• Funcţia count(vector) întoarce num rul total de elemente (folosite, deci c rora le-am
atribuit valori) ale vectorului.
77
apl078.php:
<?php
$x['Piine']=1.61;
$x['Vin']=5.99;
$x['Alune']=2.21;
$x['Ciocolata']=2.69;
echo "Sirul are in total ",count($x)," elemente.<br>";
echo "Acestea sunt:<hr>";
$s=0;
foreach($x as $indice=>$valoare)
{
echo $indice," in valoare de ",$valoare,"<br>";
$s=$s+$valoare;
}
echo "<hr>Valoarea totala:",$s;
?>
Exist şi alte funcţii care faciliteaz accesul la elementele vectorului. Acestea se bazeaz pe
urm toarea particularitate a implement rii unui vector în PHP: fiecare vector are asociat un pointer
intern, pointer care se afl pe un anumit element al şirului (numit element curent):
78
Exist de asemenea o serie de funcţii cu ajutorul c rora putem sorta elementele unui vector.
Le vom exemplifica pe şirul din exemplul de mai sus ($x['Piine']=1.61; $x['Vin']=5.99;
foreach($x as $i=>$v)
echo $i," => ",$v,"<br>";
• asort(vector) : sorteaz cresc tor vectorul dup valorile Piine => 1.61
Alune => 2.21
reţinute de fiecare element. Indicii se vor interschimba, evident, în mod Ciocolata => 2.69
Vin => 5.99
corespunz tor;
• ksort(vector) : sorteaz cresc tor vectorul dup valorile Alune => 2.21
Ciocolata => 2.69
reţinute de indici. Valorile se vor interschimba, evident, în mod Piine => 1.61
Vin => 5.99
corespunz tor;
• krsort(vector) : sorteaz cresc tor vectorul dup valorile Vin => 5.99
Piine => 1.61
reţinute de indici. Valorile se vor interschimba, evident, în mod Ciocolata => 2.69
Alune => 2.21
corespunz tor;
79
3.10. Programare grafic utilizând PHP.
Una dintre cele mai spectaculoase componente ale multor limbaje de programare, din p cate
l sat de multe ori în umbr în majoritatea cursurilor de programare, const în crearea şi
manipularea imaginilor.
Limbajul PHP nu este limitat doar la crearea de output HTML, ci poate fi folosit şi pentru a
crea respectiv a lucra cu diferite formate de imagini, incluzând gif, png, jpg. Ba mai mult, PHP
poate genera o imagine sub forma unui flux de date (deci f r a o înregistra efectiv sub forma unui
fişier pe server) direct c tre browser.
Pentru a face funcţional suportul grafic al limbajului, este necesar utilizarea bibliotecii gd2.
În cazul pachetului XAMPP, aceasta este instalat şi activat în mod implicit. În cazul altor
distribuţii, acest lucru trebuie f cut manual.
Pentru început, s vedem cum se poate crea în mod dinamic o imagine: vom crea un script
PHP, a c rui deschidere, în browser, va avea ca efect vizualizarea imaginii create de c tre acest
script. Veţi remarca faptul c , o serie de elemente (imaginile, textul, culorile) au nevoie de nişte
variabile numite „variabile resurs ”.
Din p cate, spre deosebire de o serie de alte limbaje de programare, nu exist constante
predefinite pentru culori, ci acestea trebuie s fie create manual, specificând pentru fiecare
componentele de roşu, verde şi albastru, întocmai ca la HTML, cu deosebirea faptului c , de aceast
dat , cele trei componente de culoare se specific în baza 10, deci printr-un num r de la 0 la 255.
Script-ul conţine comentariile necesare înţelegerii codului s u. Dup prezentarea sa vom
relua detaliat fiecare dintre funcţiile folosite.
apl080.php
<?php
header("Content-type: image/png");
/*aceasta instructiune va atasa fluxului de date creat, care la utilizator
va ajunge sub forma de fisier, informatii asupra faptului ca este vorba de un
fisier imagine, si anume de tip png.
Aceasta informatie este esentiala pentru browser pentru a deschide fisierul ca
si pe o imagine. Puteti incerca ce se intimpla daca omiteti apelul acestei functii:
browser-ul va primi datele sub forma de text, deci va afisa o serie de caractere
aparent fara nici un sens*/
$imagine=imagecreatetruecolor(400,250);
/* aceasta instructiune creeaza o resursa de tip imagine, pe 32 de biti (truecolor)
ce va putea fi identificata in continuare prin variabila $imagine. Imaginea va avea
latimea de 400 de pixeli, si inaltimea de 250.
*/
$galben=imagecolorallocate($imagine,255,255,0);
/* prin aceasta instructiune am definit culoarea galben */
imagefilledrectangle($imagine,0,0,399,249,$galben);
/* iar prin aceasta instructiune am desenat un dreptunghi plin, de culoare galbena,
ce se intinde peste toata imaginea: (0,0) respectiv (399,249) sunt doua colturi diaginale
ale dreptunghiului.
Practic am "umplut" toata imaginea cu un fundal galben */
80
$rosu=imagecolorallocate($imagine,255,0,0);
/* prin aceasta cream culoarea rosie */
imagesetthickness($imagine,4);
/* prin aceasta stabilim grosimea implicita a liniilor desenate la 4 pixeli */
imageline($imagine,10,10,389,239,$rosu);
/* si desenam o linie de culoare rosie*/
imageellipse($imagine,200,125,200,200,$rosu);
/* iar apoi desenam un cerc cu centrul in centrul imaginii, de raza 100 */
imagepng($imagine);
/*si, in fine, afisam imaginea respectiva in format png, trimitind-o direct in browser*/
imagedestroy($imagine);
/* dezalocam resursa, pentru a nu ocupa memorie inutila */
?>
Iat câteva dintre cele mai importante funcţii care lucreaz cu imagini:
• header(string) - are ca efect trimiterea unui header HTTP. În cazul nostru, al lucrului
cu imagini, ne intereseaz s trimitem browser-ului informaţii despre mime-type-ul imaginii
create. Astfel, valorile pe care le putem da string-ului, în funcţie de tipul imaginii pe care o cre m,
pot fi:
“Content-type: image/png” – pentru imaginile de tip png
“Content-type: image/jpeg” – pentru imaginile de tip jpg
“Content-type: image/gif” – pentru imaginile de tip gif
Este foarte important (în caz contrar se vor genera erori) ca aceast funcţie s fie apelat
înainte de trimiterea oric rui alt output din cadrul script-ului în care apare;
• imagecreatetruecolor(lăţime, înălţime)- creeaz o resurs de tip imagine, pe
32 de biţi (truecolor) având l ţimea, respectiv în lţimea specificat . Rezultatul întors de aceast
funcţie trebuie obligatoriu atribuit unei variabile, prin intermediul c reia vom accesa în continuare
imaginea.
Imaginea este de fapt o matrice de pixeli. Orice punct din imagine se va putea referi prin
coordonatele sale carteziene (x, y). Originea sistemului de coordonate se g seşte în coţul stânga-sus
al imaginii (0,0) iar axa Oy este îndreptat în jos. Valorile posibile pentru x şi y sunt numere
întregi, cuprinse în intervalul 0..lăţime-1, respectiv 0..înălţime-1
81
De exemplu, iat o reprezentare schematic a imaginii definite prin:
$imagine=imagecreatetruecolor(400,300);
y0 = 150
(200,150)
299
• imageline(resursă_imagine,x0,y0,x1,y1,resursă_culoare) - deseneaz un
segment de dreapt , de culoarea specificat de resursă_culoare, în imaginea specificat de
resursă_imagine, între punctele de coordonate (x0,y0) şi (x1,y1);
• imagedashedline(resursă_imagine,x0,y0,x1,y1,resursă_culoare)
- la fel ca imageline, doar c segmentul de dreapt desenat este punctat. Pentru ca
segmentul punctat s fie vizibil, trebuie ca imagesetthickness s seteze grosimea liniei la cel
puţin 2 pixeli;
• imageellipse(resursă_imagine,x0,y0,diam_x,diam_y,resursă_culoare)
- deseneaz o elips cu axe paralele cu axele de coordonate, având centrul în punctul
de coordonate (x0,y0) şi diametrul orizontal dat de diam_x respectiv cel vertical dat de diam_y;
• imagerectangle(res_imag,x0,y0,x1,y1,res_culoare) – deseneaz un
dreptunghi având colţurile diagonal opuse în punctele de coordonate (x0,y0) respectiv (x1,y1), cu
culoarea dat de resursa res_culoare;
82
• imagefilledrectangle(res_imag,x0,y0,x1,y1,res_culoare) – deseneaz un
dreptunghi plin, cu colţurile diagonal opuse în punctele de coordonate (x0,y0) respectiv (x1,y1),
de culoarea dat de resursa res_culoare;
• imagefilledellipse(res_imag,x0,y0,diam_x,diam_y,res_culoare)
- la fel ca imageellipse, doar c elipsa desenat este plin , având culoarea dat de
res_culoare;
83
• imagefilltoborder(res_imag,x0,y0,culoare_border, res_culoare)
– umple prin algoritmul ”flood fill”, pornind din punctul dat (x0,y0),
schimbând culoarea tuturor punctelor conectate (indiferent ce culoare au) în noua culoare dat de
res_culoare, pân la întâlnirea culorii specificate prin parametrul culoare_border;
• imagecopy(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,width,height)
– copiaz din imag_sursa, porţiunea rectangular care are colţul stânga sus la
coordonatele (xsrc,ysrc) şi lungimea, respectiv în lţimea, date de (width,height)în
imag_dest, începând de la coordonatele (xdest,ydest) în dreapta respectiv în jos;
• imagecopyresized(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,
widthdest,heightdest,widthsrc,heightsrc)
– copiaz din imag_sursa, porţiunea rectangular care are colţul stânga-sus la
coordonatele (xsrc,ysrc) şi lungimea, respectiv în lţimea, date de (widthsrc,heightsrc) în
imag_dest, începând de la coordonatele (xdest,ydest), redimensionând astfel încât noua l ţime
respectiv în lţime s fie (widthdest,heightdest);
• imagerotate(res_imag,unghi,culoare_fundal) – roteşte imaginea din
res_imag cu unghiul unghi (specificat în grade !). Centrul rotaţiei este centrul imaginii, iar
imaginea rotit este redimensionat la scar , astfel încât întreaga imagine rotit s încap : marginile
nu sunt decupate. Porţiunile r mase neacoperite în urma rotaţiei, se vor colora cu
culoare_fundal;
• imagecreatefrompng(’nume_fişier’)respectiv
imagecreatefromjpeg(’nume_fişier’) funcţioneaz analog, pentru imagini de tip
PNG respectiv JPG;
• imagegif(res_imagine), imagepng(res_imagine), imagejpeg(res_imagine)
– produc afişarea în browser (deci trimiterea fluxului de date c tre acesta) a imaginii
specificat de res_imagine. În funcţie de tipul imaginii (GIF, PNG sau JPG) folosim varianta
convenabil a acestei funcţii;
• imagedestroy(res_imag) – produce dezalocarea întregii memorii asociate imaginii
reprezentat de res_imag;
84
• getimagesize(’nume_fişier’) – întoarce un array (şir) ce conţine informaţii despre
imaginea din fişierul ’nume_fişier’. Informaţiile se g sesc structurate astfel:
- la indicele 0 se g seşte l ţimea (width);
- la indicele 1 se g seşte în lţimea (height);
- la indicele 2 se g seşte o constant care ne indic tipul imaginii (posibile valori
pentru acest element sunt: IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, etc.);
- la indicele 3 se g seşte un string de forma height="yyy" width="xxx", pentru
a putea fi folosit direct într-un tag <IMG....>
- la indicele mime se g seşte un string ce conţine tipul MIME corespunz tor
imaginii;
Prin acţiunea de upload, utilizatorul poate înc rca, prin intermediul unei pagini web, un
întreg fişier (indiferent c este un fişier binar sau un fişier text) pe server-ul pe care este stocat şi
pagina respectiv .
La începuturile dezvolt rii internetului, s-a pus desigur aceast problem , a transferului de
fişiere. Rezolvarea a fost g sit atunci prin implementarea unui protocol de transferare de fişiere
între dou calculatoare care sunt legate între ele. Este vorba de FTP (File Transfer Protocol), care
deşi este o metod eficient de transfer, este greoi de folosit de un utilizator nespecializat (necesit
specificarea adresei calculatorului la care ne conect m, un nume de utilizator şi o parol , precum şi
un program specializat).
Avantajul adus de upload-ul prin intermediul unei pagini web const în faptul c este uşor
de folosit de c tre orice utilizator al internetului, cel care face operaţia având nevoie doar de câteva
cunoştinţe minimale de utilizare a calculatorului.
Cea mai frecvent acţiune de upload din parte unui utilizator obişnuit este întâlnit la
ataşarea unui fişier la un e-mail.
Care este principiul de funcţionare ?
În primul rând, trebuie conceput un form special, în care se vor insera unul sau mai multe
elemente de tip <input type=”file”...>. Acestea se prezint sub forma unor textbox-uri în
dreapta c rora este prezent un buton ”Browse”, ca în figura de mai sus. Un click fie în interiorul
textbox-ului, fie pe butonul ”Browse” va permite alegerea unui fişier de pe disc pentru a fi înc rcat.
În etapa urm toare, dup ce utilizatorul apas , tot în acel form, butonul de postare date,
fişierul ales pentru upload va fi trimis c tre server, tot prin intermediul unui script (cel specificat în
85
cadrul atributului ”action=...” al formularului) şi copiat într-o locaţie temporar . Treaba
programatorului PHP este ca el s copieze fişierul la locaţia sa definitiv .
Atenţie ! Pentru ca upload-ul s funcţioneze, atât directorul temporar în care este înc rcat
fişierul, cât şi directorul în care vom muta acest fişier trebuie s aib drepturi de scriere pentru orice
utilizator de pe Internet.
În mod implicit, directorul temporar al instal rii XAMPP-ului are aceste drepturi stabilite de
la instalarea întregului pachet. Dac ele nu sunt corect setate, va trebui s le configuraţi manual. În
tot cazul, pentru directorul în care veţi muta fişierul, va trebui obligatoriu s le configuraţi.
Voi exemplifica modul în care se face acest lucru pentru directorul tmp al instal rii
XAMPP. Pentru directorul destinaţie, veţi proceda analog.
Astfel, deschideţi un Windows Explorer. V asiguraţi c opţiunea ”Use simple file
sharing (Recommended)” NU este bifat (pentru a ajunge la aceast opţiune deschideţi din
meniul Tools submeniul Folder Options şi apoi accesaţi tab-ul View. În cadrul acestuia sunt
mai multe opţiuni printre care şi cea de mai sus), dup care mergeţi pe directorul temporar al
instal rii xampp (în mod implicit C:\xampp\tmp), NU intraţi în director, ci daţi click dreapta pe el,
alegând opţiunea Properties, apoi tab-ul Security. În acest tab, alegeţi ”Add”, scrieţi numele
network, şi apoi alegeţi din lista ce vi se deschide utilizatorul network. Dup ce l-aţi ales,
asiguraţi-v c are drepturi de scriere în directorul tmp (bifaţi, în c suţele de sub el, şi opţiunile
Modify respectiv Write).
În cadrul script-ului PHP care se ocup de preluarea fişierului înc rcat, ne vom folosi de un
masiv predefinit al limbajului, şi anume $_FILES, care ne va furniza date despre fişierul înc rcat, şi
anume (primul parametru al lui $_FILES este dat de numele input-ului de type=”file”):
• $_FILES[nume_input][‘name’] – ne întoarce numele şi extensia fişierului pe care l-
am upload-at;
• $_FILES[nume_input][‘tmp_name’] – ne întoarce numele complet (cu tot cu calea)
fişierului temporar care s-a creat în urma upload-ului. Atenţie ! acest nume poate s fie complet
diferit faţ de cel original.
• $_FILES[nume_input][‘type’] – ne întoarce tipul mime al fişierului (un string, de
exemplu: application/octet-stream sau image/gif. Valoarea sa nu poate fi garantat ca fiind corect ;
• $_FILES[nume_input][‘size’] – ne întoarce dimensiunea (în octeţi) a fişierului
upload-at
• $_FILES[nume_input][‘error’] – ne întoarce codul de eroare al operaţiei de upload
asupra fişierului dat de nume_input. Dac operaţia s-a încheiat cu succes, are valoarea 0.
86
Exemplu: Urm toarele dou script-uri realizeaz o aplicaţie prin care putem upload-a un fişier în
acelaşi director în care se afl şi sursele aplicaţiei.
Primul fişier reprezint un HTML obişnuit, ce conţine doar form-ul prin care se poate face upload-
ul fişierului, iar al doilea fişier reprezint script-ul PHP care preia fişierul upload-at şi îl mut în
directorul curent:
apl082.html
<form enctype="multipart/form-data" action="apl083.php" method="post">
<!—- este obligatoriu sa specificati atributul enctype="multipart/form-data", in caz
contrar nu va fi permisa upload-area de fisiere. De asemenea, remarcati atributul action,
care specifica numele scriptului care se va ocupa de preluarea fisierului upload-at -->
<input type="hidden" name="MAX_FILE_SIZE" value="30000">
<!—- acest control de tip hidden permite stabilirea unei limite maxime a dimensiunii
fisierului care urmeaza a fi uploadat. Din pacate, acest parametru poate fi usor pacalit
din browser -->
Alege un fisier pentru upload (sa aiba sub 30000 bytes):<br>
<!—- cu ajutorul acestui input type=”file” putem defini cimpul de tip upload din form -->
<input type="file" name="fisier_incarcat"><br><br>
<!-- de valoarea atributului sau ’name’, in cazul nostru ”fisier_incarcat” ne vom folosi
pentru a-l manipula din cadrul codului PHP in care il vom prelua, in cazul nostru
apl083.php-->
<input type="submit" value="Incarca fisierul">
</form>
apl083.php
<?php
if($_FILES['fisier_incarcat']['error']!=0)
echo 'Upload nereusit, a aparut o eroare';
else
{
move_uploaded_file($_FILES['fisier_incarcat']['tmp_name'],
$_FILES['fisier_incarcat']['name']);
//cu ajutorul functiei move_uploaded_file mutam fisierul de la locatia sa temporara la
//locatia sa definitiva, care în cazul nostru este directorul curent. Parametrii acestei
//funcţii sunt sursa respectiv destinatia
echo 'Fisierul a fost incarcat<br>';
echo 'Dimensiunea sa este de ',$_FILES['fisier_incarcat']['size'],' octeti';
}
?>
87
setcookie(limba_pref,”romana”,time()+3600);
Observa ii !
1) Nu pot exista mai mult de 20 de variabile cookie. Dac se creeaz vreuna în plus, prima creat
este ştears automat;
2) Pentru a şterge o variabil cookie se creeaz o alta cu acelaşi nume, dar cu data de expirare
înaintea celei curente (de exemplu, time()-1).
• Pentru a citi (recupera) valoarea unei variabile cookie, se utilizeaz conţinutul unui
masiv asociativ special, predefinit, al limbajului PHP, numit $HTTP_COOKIE_VARS[..]. Fiecare
component a sa are ca indice numele unei variabile cookie, iar ca valoare, reţine valoarea
variabilei respective.
Exemplu: instrucţiunea de mai sus afişeaz valoarea variabilei cookie creat prin exemplul
anterior:
echo $HTTP_COOKIE_VARS[”limba_pref”];//afişează ”romana”
Exemplu: Script-ul care urmeaz exemplific modul în care se pot reţine anumite informaţii
pe care utilizatorul le-a tastat o dat . Apelat pentru prima dat , atunci când nu exist variabila
cookie numit ”loc”, se cere tastarea localit ţii în care se afl cel care viziteaz pagina. Dac acel
vizitator reintr pe acel site, reapelând script-ul, acesta va identifica variabila cookie ”loc”, va
prelua direct localitatea memorat şi, în loc ca utilizatorului s i se cear din nou introducerea
acesteia, i se va afişa direct un mesaj:
apl084.php
<?php
$loc=@$_POST['loc'];//testam mai intii daca am primit dintr-un form
//postat tot din cadrul acestei pagini, o variabila numita loc,
//cu valoarea careia trebuie sa cream variabila cookie
if($loc!=NULL)//daca am primit
setcookie("loc",$loc,time()+24*3600);//atunci setam variabila
//cookie cu valoare primita, pentru o durata de 24 de ore
else//pe cind, daca nu am primit, verificam daca variabila cookie este deja creata
$loc=@$HTTP_COOKIE_VARS['loc'];
if($loc!=NULL)//deci daca este creata
{//dam utilizatorului un mesaj:
echo "Localitatea curenta este: ",$loc;
//si ii permitem sa schimbe aceasta localitate, daca doreste
echo '<form action="apl084.php" method="post">';
echo '<p align="right">';
echo 'Schimba localitatea:';
echo '<input type="text" name="loc"><br>';
echo '<input type="submit" value="Schimba localitatea"></p></form>';
}
else//in caz contrar, cream formularul care permite introducerea localitatii
{
echo '<form action="apl084.php" method="post">';
echo 'Introdu localitatea<br><br>';
echo '<input type="text" name="loc"><br><br>';
echo '<input type="submit" value="Salveaza"></form>';
}
?>
88
3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP.
În ultimii ani, utilizarea bazelor de date pe Internet a luat o amploare deosebit . Exist o
mulţime de aplicaţii, extrem de utile, care le utilizeaz , cum ar fi: aplicaţii de contorizare, comerţ
electronic, vot electronic, aplicaţii de comunicare.
De unde SQL ? În domeniul cre rii şi utiliz rii bazelor de date relaţionale s-a impus
necesitatea existenţei unui limbaj standard care s permit efectuarea acestor operaţii. Astfel, a
ap rut SQL – Structured Query Language. Limbajul a fost supervizat de comisia de standardizare
ANSI (American National Standards Institute), motiv pentru care se mai numeşte şi ANSI SQL.
SQL nu este un limbaj de firm , ci el este implementat de o mulţime de SGBD-uri
consacrate, cum ar fi Microsoft Access, Oracle, Microsoft SQL Server şi, bineînţeles, MySQL.
MySQL este un limbaj specializat pentru gestiunea bazelor de date relaţionale pe Internet,
având la baz limbajul SQL. MySQL gestioneaz baze de date care se g sesc pe un server. Baza de
date poate fi foarte lesne exploatat prin intermediul limbajului PHP, dar şi cu alte limbaje (de
exemplu Java).
Dup cum am anunţat în capitolul 3.2., suportul MySQL a fost deja instalat, în cadrul
pachetului XAMPP, deodat cu limbajul PHP.
Tot suportul software al bazei de date MySQL se g seşte în directorul C:\XAMPP\MYSQL.
În subdirectorul BIN al acestuia se g sesc o serie de programe utilizare, care permit configurarea şi
operarea imediat cu serverul de baze de date. Utilitarul pe care o s -l utiliz m cel mai des este
mysql.exe. Pentru a-l putea accesa din orice alt locaţie a calculatorului v-aţi afla, este
recomandat s ad ugaţi calea spre el (C:\XAMPP\MYSQL\BIN) în variabila PATH a sistemului.
Acest lucru se face executând un click dreapta pe My Computer, alegând apoi tab-ul Advanced,
apoi butonul Environment Variabies. Din fereastra care se deschide, derulaţi în partea de jos
(secţiunea System Variables) pân întâlniţi variabila PATH. Daţi dublu click pe ea (sau ap saţi
butonul Edit de dedesubt) şi, la sfârşitul şirului de caractere deja existent acolo, ad ugaţi
caracterul ”;” urmat de calea ”C:\XAMPP\MYSQL\BIN”.
Din acest moment, utilitarul mysql se poate rula din orice locaţie (de exemplu direct din
Start + Run).
89
Vom configura în continuare serverul de baze de date. MySQL fiind un server de baze de
date partajat, accesul se face pe baza unui nume de utilizator (user) şi a unei parole (password).
Pentru moment, este configurat doar utilizatorul root (cu drepturi depline asupra bazei de
date) şi NU are parola.
Pentru a va conecta, lansaţi dintr-un Command Prompt sau din Start + Run urm toarea
comand : mysql –u root –p
Atunci când sunteţi invitaţi s introduceţi parola (prin Enter password:) trebuie s daţi
Enter. În cazul în care conectarea a reuşit, veţi primi un mesaj de întâmpinare, iar prompt-ul se va
schimba în : mysql>... (pentru a v deconecta de la server, în dreptul acestui prompt trebuie s
scrieţi comanda quit dup care daţi Enter).
Din acest sunteţi conectaţi la baza de date. În continuare vom da câteva comenzi pentru a
configura serverul, baza de date asupra c reia vom lucra, şi un utilizator pe care îl vom folosi pentru
a lucra în mod curent (deoarece este complet nerecomandat s folosim utilizatorul root pentru a
lucra în mod curent la baza de date).
În primul rând, vom şterge toţi utilizatorii predefiniţi, în afar de root, iar apoi vom crea o
baz de date în care vom lucra şi un utilizator cu drepturi de utilizare asupra acestei baze de date.
Atenţie s nu uitaţi caracterul ”;” dup fiecare comand executat . De asemenea, dup fiecare
comand daţi un Enter:
mysql>use mysql; prin aceast comand intr m în baza de date administrativ , cu numele mysql
mysql>delete from user where user!=’root’ or host!=’localhost’;
prin aceast comand ştergem toţi utilizatorii predefiniţi, l sând utilizatorul root cu drepturi de conectare de pe
maşina local
mysql>update user set password=password('parolanouă') where user='root';
prin aceast comand schimb m parola utilizatorului root, de la parola vid (pe care o avea de la instalare) cu
noua parol (evident, şirul de caractere parolanouă îl înlocuiţi cu noua parol )
mysql>create database lucru;
prin aceast comand cre m o baz de date cu numele ”lucru”, în care vom lucra în continuare
mysql>grant all on lucru.* to 'utilizator'@'localhost' identified by 'parola';
prin aceast comand cre m utilizatorul cu numele ’utilizator’, cu parola ’parola’ (evident, le veţi schimba
dup bunul plac) ce se poate conecta de pe maşina local , şi are drepturi de lucru doar în baza de date ’lucru’
mysql>flush privileges;
prin aceast comand facem ca toate modific rile efectuate pân în momentul de faţ s devin efective şi
operative.
mysql>quit;
şi ieşim din monitorul mysql
Putem testa imediat instalarea, prin conectarea la serverul mysql cu noul utilizator creat
(lansaţi aceast comand fie din Command Prompt fie din Start+Run) :
90
mysql –u utilizator –p
În momentul în care vi se cere parola, introduceţi, evident, parola definit mai sus.
Dup conectarea la MySQL, pentru a stabili ca punct de lucru baza de date asociat acestui
utilizator, veţi da comanda:
mysql>use lucru;
dup care veţi putea testa toate comenzile ce urmeaz s fie testate în paragrafele urm toare.
3.13.4. Tabele.
Într-o tabel coloanele sunt identificabile prin nume, iar rândurile, prin valorile pe care le
memoreaz . Toate datele dintr-o coloan au acelaşi tip. O tabel are un num r specificat de coloane,
îns are un num r nespecificat de rânduri. Uneori, când ne referim la un rând, folosim şi termenul
de înregistrare, iar atunci când ne referim la data din rând, situat într-o anumit coloan , folosim şi
termenul de câmp.
• Instrucţiunea prin care se poate crea o tabel este prezentat mai jos; ceea ce este trecut
între paranteze drepte reprezint clauze, atribute sau buc ţi de instrucţiune care, din punct de vedere
sintactic (în funcţie de fiecare caz) pot s nu apar :
91
create table nume_tabelă
( nume_coloană1 tip_date [specificatori],
nume_coloană2 tip_date [specificatori],
...
nume_coloanăn tip_date [specificatori]
);
• Ad ugarea unui nou rând într-o tabel se face prin instrucţiunea de mai jos, în care se
introduc, pe rând, valori pentru toate câmpurile unei linii, în ordinea în care au fost declarate
coloanele la crearea tabelei:
insert into nume_tabelă values(valoare1,valoare2,...,valoaren);
Exemplu: pentru a insera dou linii în tabela creat în exemplul anterior:
insert into judete values('CJ','Cluj',702755);
insert into judete values('BV','Brasov',589028);
În practica utiliz rii bazelor de date, instrucţiunea anterioar este considerat ca generatoare
de erori, deoarece fie se poate greşi ordinea de introducere a datelor, fie pe parcursul dezvolt rii se
insereaz coloane noi între cele deja existente, iar efectul ar fi acela c tabela va conţine date
eronate. Din acest motiv este preferat forma urm toare a instrucţiunii, deşi este necesar s scriem
mai mult:
insert into nume_tabelă(nume_coloană1,nume_coloană2,...,nume_coloanăk)
values(valoare1,valoare2,...,valoarek);
Se pot omite coloane (caz în care ele vor primi automat valori NULL) şi bineînţeles c
putem scrie coloanele în orice ordine dorim.
Exemplu: mai ad ug m dou linii la tabela anterioar : una în care nu complet m num rul
de locuitori şi alta în care trecem toate cele 3 valori, îns în alt ordine decât cea în care le-am creat:
insert into judete(nrloc,ind,nume) values(510110,'MM','Maramures');
insert into judete(ind,nume) values('CL','Calarasi');
92
+------+-----------+--------+
Exemplu: pe tabela creat anterior, dac execut m: | ind | nume | nrloc |
+------+-----------+--------+
select * from judete; | CJ | Cluj | 702755 |
| BV | Brasov | 589028 |
se va afişa în urm torul format: | CL | Calarasi | NULL |
| MM | Maramures | 510110 |
+------+-----------+--------+
4 rows in set (0.02 sec)
• Dac dorim s afiş m doar anumite coloane ale tabelei, în ordinea pe care o dorim,
folosim forma de mai jos a instrucţiunii:
select nume_coloana1,...,nume_coloanak from tabelă;
Se observ faptul c , atunci când afiş m tabela, în antetul (capul de tabel) s u se trece
numele coloanelor acesteia. Dac dorim ca în antet s figureze alt nume pentru o coloan , atunci, în
instrucţiunea de mai sus, în loc de a scrie doar numele coloanei, vom scrie numele coloanei urmat
de cuvântul cheie AS şi de numele care dorim s fie afişat în antet. Astfel, prin cuvântul cheie ”AS”,
am definit alias-uri pentru numele coloanelor.
Exemplu: pentru tabela din exemplele anterioare, am putea scrie urm toarea comand :
+-----------+------------+--------------------+
select ind as indicativ, | indicativ | nume judet | numar de locuitori |
+-----------+------------+--------------------+
nume as "nume judet", | BV | Brasov | 589028 |
| CJ | Cluj | 702755 |
nrloc as "numar de locuitori" | CL | Calarasi | NULL |
| MM | Maramures | 510110 |
from judete; +-----------+------------+--------------------+
4 rows in set (0.00 sec)
Rezultatul const în afişarea sub urm torul format:
• Pentru listarea numelor tuturor tabelelor din baza de date, folosim comanda urm toare:
show tables [from nume_bază_date];
Dac nu specific m clauza [from nume_bază_date] se vor afişa toate tabelele din baza
de date curent (cea c tre care am dat use);
• Pentru a afişa o descriere detaliat a unei tabele (numele coloanelor, tipurile lor) se
foloseşte una dintre comenzile (ele fac acelaşi lucru):
describe nume_tabelă;
show columns from nume_tabelă;
93
a) Şiruri de caractere:
• char[(n)] – reţine un şir de caractere de lungime n (fix ). În caz c n nu este precizat,
reţine un singur caracter. Ocup n octeţi;
• varchar[(n)] – reţine un şir de cel mult 255 de caractere. Ocup n+1 octeţi;
• tinytext[(n)] – este echivalent cu varchar[(n)];
• text[(n)] – reţine un şir de cel mult 65535 caractere. Ocup n+2 octeţi;
• mediumtext[(n)] – reţine un şir de cel mult 16.777.215 caractere. Ocup n+3 octeţi;
• longtext[(n)] – reţine un şir de cel mult 4.294.967.295 caractere. Ocup n+4 octeţi;
• enum – un câmp care poate reţine un singur şir de caractere dintr-un vector de şiruri de
caractere predefinit de c tre utilizator la crearea tabelei. De altfel, tabela va memora vectorul de
şiruri de caractere, iar în acest câmp se va reţine doar indicele elementului corespunz tor din vector.
Vezi exemplele de dup ;
• set – la fel ca la enum, doar c un câmp de acest tip poate reţine unul sau mai multe şiruri
de caractere din vectorul predefinit de c tre utilizator. Vezi exemplele de dup .
Exemplu (pentru tipul enum): cre m o tabel în care trecem câţiva pictori şi curentele artistice pe
care le reprezint .
create table pictori(nume text,
curent enum('impresionism','postimpresionism','suprarealism','art nouveau'));
insert into pictori values('Gustave Klimt','art nouveau');
insert into pictori values('Vincent Van Gogh','postimpresionism');
insert into pictori values('Alphonse Mucha','art nouveau');
insert into pictori values('Auguste Renoir','impresionism');
insert into pictori values('Rene Magritte','suprarealism');
insert into pictori values('Tiziano Vecellio','renastere');
A se remarca faptul c dup executarea ultimei comenzi apare o avertizare (warning). Acest
lucru se întâmpl deoarece ultimul curent introdus, +------------------+------------------+
| nume | curent |
’renastere’ nu apare printre stringurile din enum, +------------------+------------------+
| Gustave Klimt | art nouveau |
permise pentru acest câmp. Totuşi, în urma | Vincent Van Gogh | postimpresionism |
| Alphonse Mucha | art nouveau |
execuţiei sale, pictorul cu numele ”Tiziano | Auguste Renoir | impresionism |
| Rene Magritte | suprarealism |
Vecellio” va fi trecut în tabel , îns în dreptul | Tiziano Vecellio | |
+------------------+------------------+
curentului s u va fi trecut şirul vid:
Exemplu (pentru tipul set): cre m o tabel în care trecem numele câtorva persoane şi hobby-urile
lor favorite, dintre muzic , sport şi desen. Vom încerca şi de aceast dat s punem valori invalide.
Efectul este asem n tor celui de la enum: datele respective vor fi ignorate:
create table persoane (nume text, +--------------+--------------+
hobby set('muzica','desen','sport')); | nume | hobby |
insert into persoane values('Ion MARIN','muzica,desen'); +--------------+--------------+
insert into persoane values('Ion TIRIAC','sport,desen'); | Ion MARIN | muzica,desen |
insert into persoane values('Nina CHIRIAC','muzica'); | Ion TIRIAC | desen,sport |
insert into persoane values('Ion BETEA','sport,fumat'); | Nina CHIRIAC | muzica |
| Ion BETEA | sport |
+--------------+--------------+
94
b) Tipuri de date numerice:
• tinyint[(n)] – ocup 1 octet. Reţine nr. întregi cuprinse între -128..127. Dac este
urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..255;
• smallint[(n)] – ocup 2 octeţi. Reţine nr. întregi cuprinse între -32768..32767. Dac
este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..65535;
• mediumint[(n)] – ocup 3 octeţi. Reţine nr. întregi cuprinse între -8388608..8388607.
Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..16777215;
• int[(n)] – ocup 4 octeţi. Reţine nr. întregi cuprinse între -2147843648..2147843647.
Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..4294967295;
• bigint[(n)] – ocup 8 octeţi. Reţine nr. întregi cuprinse între -9223372036854775808
şi 9223372036854775809. Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse
între 0..18446744073709551615;
• float – ocup 4 octeţi – este echivalentul tipului cu acelaşi nume din C/C++;
• double – ocup 8 octeţi – este echivalentul tipului cu acelaşi nume din C/C++;
• decimal(n,d) – num rul este stocat sub form de şir de caractere. Parametrul n
reprezint num rul de cifre nenule aflate înaintea virgulei (cu tot cu semnul ’–’ pentru numerele
negative, dac este cazul) iar d reprezint num rul de zecimale.
c) Tipuri pentru dată şi oră:
• year – un câmp de acest tip reţine un an calendaristic. Aceştia se introduc ca şi şir de
caractere;
• time – un câmp de acest tip reţine o anumit or dintr-o zi. Se introduce sub forma unui
şir de caractere, de forma ’hh:mm:ss’;
• date – un câmp de acest tip reţine o anumit dat calendaristic . Se introduce sub forma
unui şir de caractere, de forma ’yyyy-mm-dd’;
• datetime – un câmp de acest tip reţine o anumit dat calendaristic şi o anumit or . Se
introduce sub forma unui şir de caractere, de forma ’yyyy-mm-dd hh:mm:ss’;
95
4. =, >=, >, <=, <, !=, <>, is, like, in
5. |
6. &
7. <<, >>
8. +, – (operatori binari)
9. *, /, div, %, mod
10. ^
11. +, – (operatori unari)
12. !, not
+-----+
Pentru a testa un anumit operator, puteţi utiliza instrucţiunea select. | 5+7 |
+-----+
De exemplu, dac daţi comanda select 5+7; se va afişa un rezultat ca în | 12 |
+-----+
imaginea al turat :
Observaţie importantă: În MySQL exist o valoare special numit Null.
Semnificaţia ei este de ”valoare necunoscut ”. Reţineţi faptul c , dac Null este un operand al
oric rei expresii, rezultatul oric rei operaţii care se efectueaz cu Null este Null.
Operatorii se împart, la rândul lor, în mai multe grupe. Acestea sunt prezentate în
continuare:
a) Operatori aritmetici:
Acţioneaz asupra tipurilor numerice şi furnizeaz o valoare de tip numeric:
• + – adunare (Ex: 2+3 are ca rezultat valoarea 5);
• - – sc dere (Ex: 2-3 are ca rezultat valoarea -1);
• * – înmulţire (Ex: 2*3 are ca rezultat valoarea 6);
• / – împ rţire cu zecimale (Ex: 5/4 are ca rezultat valoarea 1.25);
• div – împ rţire cu zecimale (Ex: 15 div 4 are ca rezultat valoarea 3);
• mod şi % – împ rţire cu zecimale (Ex: 14 mod 4 sau 14%4 are ca rezultat valoarea 3);
• - şi + – operatorii unari plus şi minus (Ex: --4 are ca rezultat valoarea 4);
b) Operatori de comparare (sau relaţionali):
Permite compararea a dou valori numerice sau a dou şiruri de caractere. Şirurile de
caractere se compar lexicografic şi nu se face distincţie între literele mari şi literele mici.
Rezultatul este 1 pentru adev rat şi 0 pentru fals.
• < – mai mic (Ex: 2<3 are ca rezultat valoarea 1);
• <= – mai mic sau egal (Ex: 3<=3 are ca rezultat valoarea 1);
• > – mai mare (Ex: 2>3 are ca rezultat valoarea 0);
96
• >= – mai mare sau egal (Ex: 2>=3 are ca rezultat valoarea 0);
• = – egalitate (Ex: 2=3 are ca rezultat valoarea 0);
• <> sau != – diferit (Ex: 2<>3 sau 2!=3 are ca rezultat valoarea 1);
Observaţie: se pot compara, de altfel, cu aceşti operatori, şi date de tipul time, date. În fapt, o
astfel de comparare este tot una lexicografic .
c) Operatori logici:
Analog limbajului C/C++, în MySQL se consider dou valori logice: 0 joac rolul lui
false, iar orice valoare diferit de 0 joac rolul lui true.
• || sau or – sau-ul logic (este 0 doar când ambii operanzi sunt 0, în rest este 1);
• && sau and – şi-ul logic (este 1 doar când ambii operanzi sunt nenuli, în rest este 0);
• not – negaţie (negaţia lui 0 este 1, iar negaţia lui 1 este 0);
• xor – sau-ul exclusiv (este 0 când ambii operanzi sunt fie nuli, fie nenuli, şi este 1 în rest);
d) Operatori logici pe biţi:
Se aplic tuturor tipurilor întregi şi acţioneaz asupra tuturor biţilor aflaţi pe poziţii
corespondente.
• | – sau-ul pe biţi;
• & – şi-ul pe biţi;
• ^ – sau-ul exclusiv pe biţi;
• ~ – negaţia pe biţi;
e) Operatori de deplasare pe biţi:
Se aplic tuturor tipurilor întregi, deplasând biţii reprezent rii binare:
• << – deplasare la stânga: a<<b deplaseaz cu b poziţii la stânga biţii lui a;
• >> – deplasare la dreapta: a>>b deplaseaz cu b poziţii la dreapta biţii lui a;
f) Operatori specifici pentru MySQL:
• is null, is not null – testeaz dac o valoare este sau nu null (sunt singurii
operatori care testeaz acest lucru! Atenţie, compararea cu null întoarce, conform unei observaţii
anterioare, TOT TIMPUL valoarea null, indiferent c se compar null-ul tot cu null sau cu alt
valoare);
• in, not in – testeaz dac o valoare aparţine sau nu unei mulţimi
(ex: 1 in (1,2,3,4) are valaorea 1;
5 in (1,2,3,4) are valoarea 0;
’cici’ in (’cici’, ’mimi’, ’lola’) are valoarea 1);
97
• like, not like – testeaz dac un şir de caractere are o anumit form : dac este
prefixat respectiv postfixat sau nu de un anumit subşir, dac acesta conţine un anumit subşir. Forma
sub care se utilizeaz este string like şablon respectiv string not like sablon. Şablon
este tot un string, în care se folosesc urm toarele caractere speciale: ’%’ pentru un num r neprecizat
de caractere necunoscute, respectiv ’_’ pentru un singur caracter neprecizat.
(ex: ’cici’ like ’ci%’ – are valoarea 1;
’lola’ like ’la%’ – are valoarea 0;
’mimi’ not like ’me_i’ – are valoarea 1);
• between min and max – testeaz dac o valoare se g seşte în intervalul închis cu
capetele min, respectiv max. (Ex: 1 between 0 and 4 – are valoarea 1);
• case .. when .. then .. else .. – are dou forme sub care se poate aplica:
- forma 1: case v
when v1 then val1 Se evalueaz v, şi dac se produce
. . . vreuna dintre valorile v1 .. vn se va
întoarce valk corespunz toare, iar
when vn then valn dac nu se va întoarce valn+1
else valn+1
end
- forma 2: case
when cond1 then val1
Se evalueaz condiţiile în ordinea
scrierii. Prima care este adev rat va
. . . întoarce valoarea valk
when condn then valn corespunz toare. Dac nici una nu
este adv rat , se va întoarce valn+1
else valn+1
end
Exemple:
1) case cif
when 1 then ’unu’
when 2 then ’doi’
when 3 then ’trei’
else ’nu stiu sa numar decit pina la 3’
end
2) case
when a<0 then ’valoare negativă’
when a=0 then ’valoare nulă’
else ’valoare strict pozitivă’
end
98
g) Variabile în MySQL:
În MySQL variabilele se specific prin @identificator, unde identificator respect
aceleaşi reguli sintactice ca şi în alte limbaje de programare (s fie format doar din litere, cifre şi '_'
şi s nu înceap cu o cifr ). Atribuirea unei valori c tre o variabil se face cu operatorul ':=' şi, la
fel ca în C++, atribuirea poate juca şi rolul unei expresii, care întoarce valoarea atribuit .
Exemplu:
select @c:=(@a:=4)+(@b:=5); atribuie atât valoarea 4 variabilei @a, valoarea 5
variabilei @b cât şi valoarea 9 variabilei @c
select @a; pentru verificare, afiş m apoi valorile
select @b; celor trei variabile
select @c;
• rtrim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile din dreapta;
99
• ltrim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile din stânga;
• trim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile atât din dreapta cât
şi din stânga;
• upper(x) – întoarce şirul obţinut prin convertirea tuturor literelor mici la litere mari;
• lower(x) – întoarce şirul obţinut prin convertirea tuturor literelor mari la litere mici;
• find_in_set(x,string) – întoarce indicele apariţiei şirului x în şirul de entit ţi
separate prin virgule din cadrul lui string. Ex: find_in_set(’mimi’,’cici,mimi,lola’) va
întoarce valoarea 2.
• format(x,d) – converteşte valoarea real la un string cu d zecimale. Dac este cazul, la
ultima zecimal din string se face rotunjire. Ex: format(5.678,2) va întoarce stringul ’5.68’;
• strcmp(x,y) – compar lexicografic şirurile de caractere x şi y, întorcând -1 dac x<y, 0
dac x=y, 1 dac x>y. Nu face distincţie între literele mari şi cele mici;
100
d) Funcţii specifice MySQL:
• if(exp1,exp2,exp3) – dac exp1 este nenul (adev rat ) funcţia va întoarce exp2, în
caz contrar întorcând exp3.
Observaţie: Dac exp1 este de tip real, va fi convertit la întreg (prin eliminarea
zecimalelor). De exemplu, dac este 0.87, se va converti la 0, deci s-ar putea ca rezultatul s nu fie
cel scontat.
Ex: if(a>=0,”pozitiv nestrict”,”negativ strict”) – va întoarce, dup caz,
una dintre valorile de tip şir de caractere;
• ifnull(exp1,exp2) – dac exp1 este nenul , o întoarce chiar pe ea. Dac nu, o întoarce
pe exp2.
Ex: ifnull(’cici’,’mimi’) – întoarce ’cici’;
ifnull(null,’mimi’) – întoarce ’mimi’;
101
Iat cum vi se va afişa rezultatul acestei interog ri:
+----------+--------+------+--------+----------+
| den | cost_u | cant | cost_u | cost_tot |
+----------+--------+------+--------+----------+
| minge | 3.25 | 4 | 3.25 | 13.00 |
| lopatica | 2.10 | 5 | 2.10 | 10.50 |
| galetusa | 4.50 | 3 | 4.50 | 13.50 |
+----------+--------+------+--------+----------+
102
Exemplu: cre m o tabel studenti în care trecem numele, virsta si starea civil . Ultimelor
dou câmpuri le vom da valorile implicite 19 respectiv ’necasatorit’:
create table studenti(nume text,virsta int default 19,
stare_civ char(20) default ’necasatorit’);
insert into studenti(nume) values(’ANTON Costel’);
insert into studenti(nume,virsta) values(’POP Mihai’,21);
Iat conţinutul tabelei în urma comenzilor de mai sus:
+--------------+--------+-------------+
| nume | virsta | stare_civ |
+--------------+--------+-------------+
| ANTON Costel | 19 | necasatorit |
| POP Mihai | 21 | necasatorit |
+--------------+--------+-------------+
Principalul rol al cheii primare este s asigure accesul foarte rapid la o anumit înregistrare,
atunci când d m cheia. Trebuie s preciz m c , înregistr rile unei tabele se reţin în ordinea
introducerii lor. Atunci când, de exemplu, un câmp este declarat cheie primar , se construieşte o
tabel auxiliar , invizibil pentru utilizator, în care se trec valorile cheilor, în ordine cresc toare,
pentru fiecare cheie reţinându-se poziţia rândului (liniei) din tabel , care are acea cheie.
Practic, pornind de la o anumit cheie, în tabela invizibil se poate identifica foarte rapid
num rul de ordine (poziţia) al rândului cu acea cheie (se foloseşte c utarea binar ). De aici, accesul
la acel rând (înregistrare) este imediat.
Pentru a preciza faptul c o anumit coloan este cheie primar , atunci când definim tabela,
folosim specificatorul primary key, la fel ca în exemplu de mai jos:
create table elev(nr_matricol char(10) primary key,nume text);
103
Pentru a preciza faptul c mai multe coloane particip la formarea cheii primare, atunci când
definim tabela, folosim specificatorul primary key(coloană1,...,coloanăk) dup ce am
terminat descrierea tuturor coloanelor, înainte de a închide paranteza final de la comanda create
table, ca în exemplu de mai jos:
create table elev(nume char(20),prenume char(20),i_tata char(4),
adresa text,primary key(nume,prenume,i_tata));
• Cheia unică este constituit dintr-un singur câmp. Se foloseşte atunci când, într-o
anumit coloan , fie ea participant la cheia primar , dorim s avem doar valori distincte.
La fel ca şi la cheia primar , putem avea cheie unic doar pentru coloanele de lungime fix
(deci nu putem avea, spre exemplu, cheie unic pentru o coloan de tip text).
Dac se încearc inserarea unei linii în tabel , cu o valoare care exist deja în cazul unei
coloane de tip cheie unic , se va semnala eroare şi inserarea nu va fi permis .
Specificatorul de cheie unic este unique key. El se foloseşte ca în exemplul de mai jos:
create table test(nr_matr char(10) primary key,
nume text,cnp char(13) unique key);
104
Iat conţinutul tabelei dup comenzile de mai sus:
+----+------+
| id | nume |
+----+------+
| 1 | cici |
| 2 | mimi |
| 3 | lola |
+----+------+
Afişarea datelor într-o anumit ordine se face tot cu ajutorul interog rilor: într-o interogare
ale c ror date dorim s le sort m, specific m, la sfârşitul comenzii, clauza:
order by expresie1[desc], expresie2[desc],...
specificatorul desc este folosit în cazul în care dorim ca sortarea s fie descresc toare.
Sortarea dup mai multe expresii are urm toare semnificaţie: dac pentru dou linii
expresie1 nu este suficient pentru a determina ordinea (deci pentru ambele, are aceeaşi valoare)
se consider mai departe expresie2. Dac nici expresie2 nu este suficient , se ia în considerare
expresie3, şi aşa mai departe.
Exemple:
select * from tabela order by nume; – se afişeaz toate datele din tabel , îns
sortate dup coloana nume
select * from tabela order by media desc,nume; – se afişeaz toate datele din
tabel , sortate descresc tor dup coloana ’media’. Dac la dou linii alte tabelei, coloana ’media’
are valori egale, ordinea va fi dat de valorile din coloana ’nume’.
• Indiferent de faptul c dorim o sortare sau nu, exist posibilitatea ca o interogare select s
afişeze doar anumite rânduri
Pentru aceasta se foloseşte clauza limit (în cazul în care în comanda select apare şi un
order by, clauza limit se va specifica dup ).
Sintaxa acesteia are una dintre urm toarele dou forme:
- limit n – din ceea ce s-ar afişa în mod normal, se afişeaz doar primele n linii;
- limit m,n – din ceea ce s-ar afişa în mod normal, se afişeaz doar începând de la
a m+1-a linie (prima linie este numerotat cu 0) un num r de n linii.
105
3.13.14. Filtrarea datelor.
Se face tot cu ajutorul interog rii ’select’: prin specificarea clauzei where condiţie se
vor afişa doar acele linii ale tabelei pentru care condiţia este evaluat ca fiind adev rat .
Clauza poate fi utilizat în acelaşi timp cu clauza precendet (order by) care realizeaz
sortarea. În aceast situaţie, trebuie specificat mai întâi clauza where, şi abia apoi clauza order by.
Iat mai jos câteva exemple:
select * from tabela where nume like “a%”; – afişeaz din tabel , doar acele
linii pentru care numele începe cu litera a
select * from tabela where nume like “a%” order by media desc;
– afişeaz din tabel , doar acele linii pentru care numele începe cu litera a, în ordinea
descresc toare a mediilor.
Exemple:
select * from tabela order by nume limit 5; – în urma sort rii dup coloana
nume, se afişeaz doar primele 5 linii;
select * from tabela limit 1,3; – se afişeaz 3 linii din tabel începând de la
linia a 2-a.
Prin actualizare a unei tabele înţelegem operaţia (operaţiile) prin care modific m fie datele
reţinute de aceasta, fie modificarea structurii, fie modificarea numelui tabelei.
a) pentru actualizarea datelor:
• pentru inserarea unei noi linii în tabel , se foloseşte instrucţiunea:
insert into nume_tabelă[(nume_coloană1,...,nume_coloanăn)]
values(expr1,...,exprn)
funcţionalitatea acestei instrucţiuni a fost deja prezentat ;
• pentru inserarea de noi linii în tabel , linii care provin din datele altei tabele, se poate
realiza prin comanda:
insert into [distinct] nume_tabelă[(nume_coloană1,...,nume_coloanăn)]
select ...
specificatorul distinct se foloseşte pentru a insera doar datele distincte (care nu apar deja în
tabela în care inser m) din tabela surs .
106
b) pentru modificarea datelor se utilizeaz urm toarea instrucţiune:
update nume_tabelă set coloană1=exp1,..,coloanăn=expn [where condiţie]
În urma execuţiei sale, pentru fiecare rând din tabel care îndeplineşte clauza where, se
actualizeaz coloanele indicate de set cu expresiile corespunz toare.
Observaţie (!): în absenţa clauzei where vor fi modificate toate rândurile tabelei.
c) pentru ştergerea uneia sau a mai multor linii ale unei tabel se utilizeaz instrucţiunea:
delete from nume_tabelă where [conditie];
Observaţie (!): în absenţa clauzei where vor fi şterse TOATE (!) liniile tabelei;
f) pentru adăugarea (inserarea) unei coloane noi, cu un anumit tip de date, se utilizeaz
instrucţiunea:
alter table nume_tabelă add nume_coloană_nouă tip_coloană nouă
[after coloană_existentă]sau[first]
dac nu este prezent vreuna dintre clauzele after sau first, coloana cea nou se va
ad uga la sfârşit. Dac este prezent cel puţin vreuna, atunci coloana cea nou se va insera dup
coloana identificat de coloană_existentă dac folosim clauza after... respectiv la început
(înainte de toate celelalte coloane) dac folosim clauza first.
107
Iat o trecere în revist a funcţiilor agregate:
• count() – sub forma count(*) determin num rul total de linii ale tabelei. Sub forma
count(nume_coloană) num r câte dintre valorile de pe acea coloan nu sunt null;
• min(nume_coloană) – determin cea mai mic valoare din coloan , ignorând valorile
care sunt egale cu null;
• max(nume_coloană) – determin cea mai mare valoare din coloan , ignorând valorile
care sunt egale cu null;
• sum(nume_coloană) – determin suma tuturor valorilor din coloan , ignorând valorile
care sunt egale cu null;
• avg(nume_coloană) – determin media aritmetic a tuturor valorilor din coloan ,
ignorând valorile care sunt egale cu null;
Exemple:
–select count(*) as numar_elevi from elevi; – afişeaz num rul total de elevi din
tabel ; în cazul nostru va fi 5.
–select count(info) as numar_note_info from elevi; – afişeaz num rul total de
valori nenule din coloana info; în cazul nostru va fi 4.
–select avg(info) as medie_note_info from elevi; – afişeaz media tuturor notelor
nenule din coloana info; în cazul nostru va fi 7.50.
–select count(engl) as nota10 from elevi where engl=10; – afişeaz câte note de
10 sunt în coloana engl;
3.13.17. Subinterogări.
Reprezint mecanismul prin care rezultatul întors de o interogare poate fi folosi mai departe,
pentru a efectua o nou interogare.
Distingem urm toarele dou cazuri:
a) Interogarea subordonată întoarce o singură valoare (deci o coloan cu un singur rând):
Interogarea care întoarce valoarea se scrie inclus între paranteze rotunde – din acest
moment ea se comport ca şi cum, în acel loc, din punct de vedere sintactic, am avea o singur
valoare.
Exemplu: pe tabela anterioar , s afiş m toţi elevii care au nota maxim la englez . În
primul rând, va trebui s determin m printr-o subinterogare, care este nota maxim la englez , iar
pe baza valorii obţinute s filtr m datele din tabela cu toţi elevii. Pentru o mai bun evidenţiere, am
colorat cu verde subinterogarea care întoarce nota maxim de la englez :
select * from elevi where engl=(select max(engl) from elevi);
108
b) Interogarea subordonată întoarce o tabelă şi dorim ca în continuare, s manipul m
datele din aceast tabel : În acest caz, tabela returnat de interogarea subordonat trebuie s
primeasc un nume (un alias). Acesta se specific tot cu ajutorul clauzei as. Trebuie de asemenea
inclus între paranteze rotunde. Câmpurile tabelei întoarse de subinterogare au numele exact ca în
antetul care s-ar afişa pentru aceast subinterogare.
Atunci când sunt folosite de c tre interogarea care o subordoneaz , câmpurile interog rii
subordonate trebuie adresate prin numele alias-ului, urmat de caracterul ’.’ şi apoi de numele
câmpului din subinterogare.
Exemplu: din tabela cu elevii, dorim s afiş m, doar pentru elevii care au note completate
la toate cele 3 materii, o list cu numele şi media celor 3 materii, în ordine descresc toare a
mediilor.
Dac am dori s afiş m o tabel ce conţine numele şi media general doar de la acei elevi
care au trecute toate cele 3 note, am scrie interogarea urm toare (ne reamintim c , dac într-o sum ,
cel puţin un termen este null, atunci toat suma este null):
select nume,(mate+engl+info)/3 as media from elevi
where mate+engl+info is not null;
Aceasta va juca rolul subinterog rii. Coloanele sale sunt nume respectiv media. Remarcaţi
faptul c , în cadrul interog rii pe care ne propunem s-o realiz m aceast tabel va primi alias-ul
medii, iar coloanele sale pot fi accesate prin expresiile medii.nume respectiv medii.media:
select * from (select nume,(mate+engl+info)/3 as media from elevi
where mate+engl+info is not null) as medii
order by medii.media desc;
109
Grup rile se constituie ierarhic dup exp_gr1, exp_gr2, etc. Practic, grupurile mari sunt
date de valorile egale pentru exp_gr1. În cadrul acestora, se fac subgrupurile dup valorile egale
ale lui exp_gr2, etc.
Printre expresiile din select putem avea:
- nume de câmpuri (sau expresii în funcţie de acestea): în acest caz se va folosi valoarea
primei linii din fiecare grup;
- funcţii agregate: acestea vor acţiona asupra tuturor valorilor coloanei din grup asupra
c rora sunt aplicate;
- dac în loc de exp1,exp2,... folosim * se va afişa prima linie din fiecare grup.
Exemple: Consider m urm toarea tabel , numit pers, asupra c reia vom aplica mai multe
interog ri de grupare:
+------+------+--------+
| nume | jud | scoala |
+------+------+--------+
| dora | bv | sc2 |
| bebe | cj | sc2 |
| bubu | cj | sc2 |
| fifi | bv | sc3 |
| lala | bv | sc2 |
| gogu | cj | sc1 |
| fefe | bv | sc2 |
| gigi | bv | sc1 |
| mimi | bv | sc2 |
| dede | cj | sc1 |
| lola | bv | sc1 |
| coco | bv | sc3 |
| calu | cj | sc1 |
| cici | bv | sc1 |
+------+------+--------+
110
Dac din interogarea de mai sus dorim s afiş m doar acele şcoli pentru care num rul de elevi este
de cel puţin 3, ad ug m clauza having interog rii de mai sus:
select jud,scoala,count(scoala) as total_scoala from pers
group by jud,scoala having total_scoala>=3;
Rezultatul afişat va fi urm torul:
+------+--------+--------------+
| jud | scoala | total_scoala |
+------+--------+--------------+
| bv | sc1 | 3 |
| bv | sc2 | 4 |
| cj | sc1 | 3 |
+------+--------+--------------+
a) Uniuni de tip produs cartezian: se realizeaz printr-un select în care se trec toate
câmpurile pe care dorim s le obţinem, din cadrul ambelor tabele, iar la clauza from se trec ambele
tabele, fiecare dintre ele putând avea definit şi un alias. Clauza where poate filtra doar acele perechi
de linii (din ambele tabele) pe care le dorim. În absenţa clauzei where, se vor genera toate
combinaţiile (produs cartezian) de linii din prima tabel , cu linii din a doua tabel .
Comanda poate fi generalizat şi pentru mai mult de dou tabele.
Sintaxa:
select exp1,exp2 ... from tabelă1 [as alias1],tabelă2 [as alias2]
[where condiţie];
Evident, exp1, exp2, ... vor trebui s conţin numele coloanelor, simplu, dac nu exist confuzii
(coloane care au în ambele tabele acelaşi nume) sau numele alias-urilor urmate de punct şi de
numele coloanelor în caz contrar.
111
Exemplu: fie urm toarele dou tabele, una cu numele unor actori, fiecare actor având asociat un
cod, alta cu numele unor filme, fiecare film având trecut în dreptul s u codul actorilor care joac în
acel film:
mysql> select * from actori; mysql> select * from filme;
+------+-----------------+ +-----------------+-----------+
| cod | nume | | titlu | cod_actor |
+------+-----------------+ +-----------------+-----------+
| 101 | Tom Hanks | | Tootsie | 105 |
| 105 | Dustin Hoffman | | Tootsie | 110 |
| 107 | Roberto Benigni | | La vita e bella | 107 |
| 110 | Jessica Lange | +-----------------+-----------+
+------+-----------------+
Dac dorim s se afişeze doar datele care sunt în corespondeţ (acest lucru este f cut,
evident, prin câmpurile numerice cod_actor, respectiv cod) folosim urm toarea interogare:
select f.*,a.* from filme as f,actori as a where f.cod_actor=a.cod;
(sau, şi mai simplu: select * from filme,actori where cod_actor=cod;)
Rezultatul va fi, conform aştept rilor, în forma urm toare:
+-----------------+-----------+------+-----------------+
| titlu | cod_actor | cod | nume |
+-----------------+-----------+------+-----------------+
| Tootsie | 105 | 105 | Dustin Hoffman |
| La vita e bella | 107 | 107 | Roberto Benigni |
| Tootsie | 110 | 110 | Jessica Lange |
+-----------------+-----------+------+-----------------+
112
b) Uniuni de tip inner join:
Se aplic atunci când uniunea se realizeaz doar între dou tabele şi dorim ca din ambele
tabele s fie afişate doar acele linii pentru care condiţia de leg tur este satisf cut . Sintaxa
comenzii:
select exp1,exp2,.. from tabelă1 [as alias1] inner join tabelă2 [as alias2]
on condiţie;
Ca şi mai înainte, dac exist coloane care se numesc la fel în ambele tabele, vom folosi alias-uri.
Exemplu: acelaşi lucru ca în exemplul anterior se poate realiza cu urm toarea interogare:
select * from filme as f inner join actori as a on f.cod_actor=a.cod;
(sau, mai simplu: select * from filme join actori on cod_actor=cod;)
Obs: cuvântul cheie ”inner” poate fi omis: prin specificarea doar a clauzei join se subînţelege
c , de fapt, este vorba de un ”inner join”;
c) Uniuni de tip left outer join:
Se aplic atunci când uniunea se realizeaz între dou tabele şi dorim ca din prima tabel s
fie incluse absolut toate liniile iar din a doua tabel doar acele linii care îndeplinesc condiţia de la
clauza on. La acele linii din prima tabel care nu au corespondent în a doua tabel , în dreptul
câmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabelă1 [as alias1]
left outer join tabelă2 [as alias2] on condiţie;
În exemplu nostru, o astfel de interogare în care prima tabel este cea cu filme iar a doua cu
actori, va afişa toate filmele, inclusiv cele pentru care nu am trecut actorii corespondenţi în cea ce-a
doua tabel . Pentru a face exemplul cât mai ilustrativ, inser m urm toarea linie în tabela cu filme:
insert into filme(titlu) values('Forest Gump');
Dup care lans m urm toarea interogare de tipul left outer join:
select * from filme left outer join actori on cod_actor=cod;
Obs: Cuvântul ”outer” poate fi omis: prezenţa lui ”left” implic o uniune de tip outer.
Iat rezultatul:
+-----------------+-----------+------+-----------------+
| titlu | cod_actor | cod | nume |
+-----------------+-----------+------+-----------------+
| Tootsie | 105 | 105 | Dustin Hoffman |
| Tootsie | 110 | 110 | Jessica Lange |
| La vita e bella | 107 | 107 | Roberto Benigni |
| Forest Gump | NULL | NULL | NULL |
+-----------------+-----------+------+-----------------+
113
doua tabel care nu au corespondent în prima tabel , în dreptul câmpurilor acesteia din urm se va
trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabelă1 [as alias1]
right outer join tabelă2 [as alias2] on condiţie;
În exemplu nostru, o astfel de interogare în care prima tabel este cea cu filme iar a doua cu
actori, va afişa toţi actorii, inclusiv cei pe care nu i-am asociat la vreun film, şi doar acele filme
c tre care exist leg tur din tabela cu actori.
Exemplu:
select * from filme right outer join actori on cod_actor=cod;
Iat rezultatul:
+-----------------+-----------+------+-----------------+
| titlu | cod_actor | cod | nume |
+-----------------+-----------+------+-----------------+
| NULL | NULL | 101 | Tom Hanks |
| Tootsie | 105 | 105 | Dustin Hoffman |
| La vita e bella | 107 | 107 | Roberto Benigni |
| Tootsie | 110 | 110 | Jessica Lange |
+-----------------+-----------+------+-----------------+
Obs: Cuvântul ”outer” poate fi omis: prezenţa lui ”right” implic o uniune de tip outer.
e) Auto-uniuni:
Se pot face uniuni în care ambele tabele sunt, de fapt, unul şi acelaşi, îns au alias-uri
diferite şi se consider unite printr-o coloan .
Exemplu: s consider m urm toarea tabel , cu care am lucrat într-unul din exemplele
paragrafului anterior 3.13.5:
Pentru a afişa toţi pictorii care aparţin aceluiaşi curent c ruia îi aparţine şi Gustav Klimt
putem proceda în felul urm tor (! atenţie, exemplu este doar didactic, din punct de vedere practic
NU se procedeaz în acest fel):
114
3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP.
Pentru a face funcţional suportul de conectivitate a limbajului PHP c tre bazele de date
MySQL, este necesar utilizarea bibliotecii mysql. În cazul pachetului XAMPP, aceasta este
instalat şi activat în mod implicit. În cazul altor distribuţii, acest lucru trebuie f cut manual.
• În primul rând, din interiorul unui script PHP trebuie realizat conectarea la baza de date.
Pentru acest lucru, avem nevoie de adresa IP a server-ului MySQL (în cazul nostru, deoarece
utiliz m o configuraţie standard, server-ul se afl pe calculatorul local, deci aceast adres este
’localhost’), numele unui utilizator şi parola cu care acest utilizator se conecteaz la baza de
date.
În cazul nostru, vom asuma faptul c utilzatorul are numele ’utilizator’ iar parola sa este
’parola’ (aşa cum l-am creat în paragraful 3.3.12).
Conectarea efectiv se face cu ajutorul instrucţiunii:
$resursă=mysql_connect(”localhost”, ”utilizator”, ”parola”);
Variabila $resursă va fi cea prin care, în continuare, ne vom putea referi la conexiunea creat .
Dac aceasta nu reuşeşte din diferite motive (nume utilzator sau parola incorecte, server-ul MySQL
nu este pornit, etc.) variabila $resursă va avea valoarea null.
• Selectarea unei baze de date, o dat ce conexiunea a fost creat , pentru a plasa comenzi în
aceast baz de date, este:
mysql_select_db(nume_bază_date);
Aceasta întoarce o valoare diferit de 0 dac selectarea a reuşit, sau 0 în caz contrar;
• Plasarea unei comenzi (interog ri) asupra bazei de date selectate se face prin instrucţiunea:
$resursă1=mysql_query(string_ce_conţine_comanda_MySQL);
Dac interogarea (comanda) a funcţionat corect, funcţia va întoarce o valoare diferit de 0. În caz
contrar, întoarce valoarea 0.
Variabila $resursă1 este cea care va permite, în continuare, obţinerea rezultatului efectiv
al interog rii.
În cazul oric rei erori, perechea de funcţii mysql_errno(); respectiv mysql_error();
ne întorc codul (num rul) ultimei erori generate, respectiv mesajul asociat acesteia.
115
- mysql_num_rows(resursa) – returneaz num rul de linii (rânduri) ale tabelei rezultate
în urma interog rii;
- mysql_num_fields(resursa) – returneaz num rul de câmpuri (coloane) ale tabelei
rezultate în urma interog rii;
- mysql_field_name(resursa,k) – returneaz numele câmpului (coloanei) al k-lea al
tabelei. Coloanele sunt numerotate de la 0;
Exemplu: urm torul script PHP va realiza o conectare la baza de date MySQL, lansând o
interogare de afişare a tuturor datelor din tabela elevi, din exemplul 3.13.16. În urma acestei
interog ri va afişa datele obţinute cu ajutorul funcţiilor de mai sus:
apl085.php:
<?php
$l=mysql_connect('localhost','utilizator','parola');
mysql_select_db('lucru');
$r=mysql_query('select * from elevi');
$n=mysql_num_rows($r);
$m=mysql_num_fields($r);
echo 'Nr. total de linii intoarse de interogare: ',$n,'<br>';
echo 'Nr. total de coloane intoarse de interogare: ',$n,'<br>';
echo 'Numele coloanelor sunt urmatoarele:<br>';
for($j=0;$j<$m;$j++)
echo 'Coloana de la indicele ',$j,' are numele: <b>',
mysql_field_name($r,$j),'</b><br>';
mysql_close($l);
?>
Iat rezultatul afişat de c tre script:
116
Iat modul în care putem obţine, într-o form prezentabil , toate datele conţinute de tabela
din exemplul anterior, afişând inclusiv o linie de antet cu numele coloanelor tabelei:
apl086.php:
<?php
$l=mysql_connect('localhost','utilizator','parola');
mysql_select_db('lucru');
$r=mysql_query('select * from elevi');
$m=mysql_num_fields($r);
echo '<table border="1" cellspacing="0" cellpadding="10">';
//pregătim afişarea într-un tabel
echo '<tr>';
for($j=0;$j<$m;$j++)//afişăm numele coloanelor în celule de tipul th
echo '<th align="center">',mysql_field_name($r,$j);
while($a=mysql_fetch_row($r))
{
echo '<tr>';
for($j=0;$j<$m;$j++)
{
echo '<td>';
if($a[$j]) echo $a[$j];//în locul valorilor vide afişăm un spaţiu
else echo ' ';//altfel, tabelul HTML va arăta urât
}
}
echo '</table>';
mysql_close($l);
?>
117
3.13.21. ELEMENTELE DE BAZ ALE
LIMBAJULUI SQL*PLUS
1. DESPRE LIMBAJ
2. CONCEPTE UTILIZATE
SELECT SUBSTR('ABCDEFG',-5,4)
"Subşir2"
FROM DUAL;
Subşir2
----
CDEF
TRANSLATE 1. Translatează şirul 'c1' prin SELECT TRANSLATE ('2KRB229',
('c1','c2','c3') intermediul şirului 'c2' la '0123456789ABCDEFGHIJKLMNOPQ
valorile din şirul 'c3' după RSTUV',
regula: fiecare caracter din '9999999999XXXXXXXXXXXXXXXXXX
şirul c1 este căutat în şirul XXXXXXXX') "TRANSLATE 1"
'c2', dacă este găsit valoarea FROM DUAL;
acestuia este înlocuită cu TRANSLATE 1
caracterul din şirul 'c3' a --------
cărui poziţie corespunde cu 9XXX999
poziţia caracterului din şirul
'c2'. SELECT TRANSLATE ('2KRW229',
2. Dacă şirul 'c2' este mai '0123456789ABCDEFGHIJKLMNOPQ
lung decât şirul 'c3' RSTUVWX', '0123456789') "
caracterele ce nu pot fi TRANSLATE 2"
translatate sunt eliminate din FROM DUAL;
şirul 'c1'. TRANSLATE 2
-----------------
2229
UPPER('c1') Returnează şirul 'c1' cu toate SELECT UPPER('Bucureşti')
caracterele transformate în "LITERE MARI"
caractere mari. FROM DUAL;
LITERE MARI
-----
BUCUREŞTI
SELECT
TO_CHAR(ADD_MONTHS(LAST_DAY(data1),
5), 'DD-MON-YYYY') "Cinci luni"
FROM tab1
WHERE nume = 'POPESCU';
Cinci luni
-----------
28-FEB-2006
MONTHS_ Returnează SELECT MONTHS_BETWEEN
BETWEEN (d1, d2) numărul de luni (TO_DATE('02-09-2005','MM-DD-YYYY'),
dintre datele d1 TO_DATE('01-08-2005','MM-DD-YYYY') )
şi d2. Dacă d1 "Luni"
şi d2 sunt FROM DUAL;
aceleşi zile din Luni
lună sau sunt ----------
ultimele zile din 1.03225806
lună rezultatul
este un număr
întreg, altfel
Oracle
calculează
fracţiuni din
lună bazat pe o
lună cu 31 zile.
NEXT_DAY (d, 'c1') Returnează data În exemplul de mai jos se returnează data zilei
primei zile a care urmează zilei de Marţi, după data de 15
săptămânii după martie 1999.
ziua definită de SELECT NEXT_DAY('15-MAR-05','TUESDAY')
şirul 'c1' şi care "ZIUA URM TOARE"
este după data FROM DUAL;
d. ZIUA URM TOARE
---------
22-MAR-05
ROUND (d[,fmt]) Returnează data SELECT ROUND (TO_DATE ('27-SEP-
d rotunjită la 05'),'YEAR') "Noul an"
unitatea de timp FROM DUAL;
specificată de Noul an
către formatul ---------
fmt, conform 01-JAN-06
specificaţiilor
de la sfârşitul
tabelului.
SYSDATE Returnează data SELECT TO_CHAR(SYSDATE,
şi timpul curent. 'MM-DD-YYYY HH24:MI:SS') "Data şi timpul
curent"
FROM DUAL;
Data şi timpul curent
-------------------
27-09-2005 20:27:11
TRUNC (d,[fmt]) Returnează data SELECT TRUNC(TO_DATE
d fără timp ('27-SEP-05','DD-MON-YY'), 'YEAR')
trunchiată la o "Anul nou"
unitate FROM DUAL;
specificată de Anul nou
formatul fmt, iar ---------
dacă este absent 01-JAN-05
se face
trunchierea la
ziua cea mai
apropiată.
SELECT COUNT(DISTINCT
job) "Jobs"
FROM emp;
Jobs
----------
5
MAX([DISTINCT|ALL] Returnează maximul din SELECT MAX(salariu)
expr) expresia expr. "Maximum"
FROM tab1;
Maximum
----------
5000
MIN([DISTINCT|ALL] SELECT MIN(data1) "Minim"
expr) FROM tab1;
Minimum
---------
17-DEC-80
SUM([DISTINCT|ALL] n) SELECT SUM(salariu) "Total"
FROM tab1;
Total
----------
29081
4. EXPRESII SQL
Exemple:
Tab1.numecol_1
'acesta este un şir de caractere'
10
secventa1.CURRVAL
Exemple:
: nume_angajat INDICATOR :indicator_var_nume_angajat
:nume_persoană
3) Forma III este folosită pentru apelul func iilor cu un singur rând şi are
sintaxa:
funcţie (DISTINCT | ALL expresie1, expresie2, … )
Exemple :
LENGTH('BLAKE')
ROUND(1234.567*43)
SYSDATE
4) Forma IV este folosită pentru apelul func iilor de utilizator şi are sintaxa:
nume_schemă . nume_pachet. nume_funcţie
Exemple:
aria_cercului(raza)
calcul_rate(nume_angajat)
5) Forma V este o combina ie de mai multe expresii şi are sintaxa:
( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2
Exemple:
('IONESCU' || ' PETRE')
LENGTH('BUCURESTI') * 57
SQRT(144) + 72
func ie_utilizator(TO_CHAR(sysdate,'DD-MMM-YY')
Exemplu:
B. O listă de expresii este o serie de expresii separate între ele prin virgulă
şi închisă între paranteze rotunde şi poate con ine pînă la maximum 1000 de
expresii.
Exemplu:
(10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)
5. CONDI IILE
Forma III este folosită pentru căutarea unei expresii sau a unei liste
de expresii dacă figurează într-o listă de expresii sau într-o subcerere şi are
sintaxa:
expresie1 NOT IN listă_de_expresii | (subcerere)
sau
listă_de_exp NOT IN ( listă_expr1, listă_expr2, …) |
(subcerere1, subcerere2, …. )
Forma VII este folosită pentru testarea egalită ii unei şir de caractere
cu un format anume, cu un alt şir de caracter şi are sintaxa:
şir_ caracter1 NOT LIKE şir_cacrater2 ESCAPE
'caracter_de_schimbare'
Forma VIII este folosită pentru specificarea unei combina ii de mai
multe condi ii şi poate avea sintaxele:
NOT condiţie
sau
condiţie1 NOT AND | OR condiţie2
SQLPLUS -?
unde:
nume-utilizator şi parolă: sunt numele şi parola unui utilizator cu drept de
acces la baza de date.
@nume-bază-de-date: este numele unei baze de date cu care se lucrează în
re ea (este alt nume decât cel al bazei de date implicite, de pe calculatorul la
care se lucrează).
@nume-fişier: reprezintă numele unui fişier de comenzi SQL care va fi fi
rulat de SQL*Plus.
SILENT: are ca efect inhibarea facilită ii de afişare a tuturor informa iilor şi
mesajelor furnizate de SQL*Plus
/NOLOG: lansează în execu ie SQL*Plus dar nu face conectarea la o bază
de date.
-?: are ca efect afişarea versiunii curente a componentei SQL*Plus, după
care returnează controlul sistemului de operare
Dacă în linia de comandă se specifică parola şi @nume-bază-de-
date atunci între ele nu trebuie să existe spa iu. Parola sau @nume-bază-de-
date vor fi separate printr-un spa iu de @nume-fişier.
unde:
nume-utilizator şi parolă: sunt numele unui utilizator cu drepturi de acces la
baza de date şi parola unui astfel de utilizator. Chiar dacă nu se specifică
parola (în linia de comandă este op ională), ea este cerută de sistem printr-
un mesaj explicit. Parola introdusă la mesajul sistemului va fi invizibilă.
@nume-bază-de-date: se specifică în cazul lucrului în re ea, cînd se doreşte
conectarea la o altă bază de date decât cea aflată pe calculatorul la care se
lucrează.
De remarcat faptul că în timpul unei sesiuni de lucru cu SQL*Plus se poate
realiza conectarea la o bază de date, fără a mai fi necesară închiderea
sesiunii.
Furnizarea parametrilor nume-utilizator şi parolă asigură protec ia bazei de
date împotriva accesului neautorizat.
Deconectarea utilizatorului de la baza de date
Deconectarea utilizatorului de la o bază de date se realizează prin
comanda DISCONNECT.
Sintaxa acestei comenzi este:
DISC[ONNECT];
Comanda are ca efect deconectarea de la baza de date curentă, fără a
închide sesiunea de lucru SQL*Plus.
Închiderea sesiunii de lucru SQL*Plus
Închiderea sesiunii de lucru SQL*PLUS şi predarea controlului
sistemului de operare al calculatorului gazdă se realizează cu una din
comenzile: QUIT, EXIT sau ^Z.
Sintaxa acestor comenzi este:
QUIT;
EXIT:
^Z;
Exemplu:
REMARK comentariu
Exemplu:
Exemplu:
-- comentariu
Terminarea unei comenzi SQL se face cu: punct şi virgulă (;), slash
(/) sau blank. Primele două forme cer SQL*Plus să execute imediat
comanda, a treia formă nu. Comanda curentă poate fi rulată sau rerulată
introducând comenzile RUN sau slash(/).
Se pot introduce şi blocuri PL/SQL care să fie executate. La sfârşitul
blocurilor PL/SQL se vor insera două linii una con inând un punct, iar
cealaltă un slash(/).
Exemplu:
declare
x number := 100;
begin
for i in 1 .. 10 loop
insert into pers100 values
(10, ‘ionel’, ‘marin’, 10,7,1970, ‘ion manolescu’,2, 6, ‘suceava’);
end loop;
end;
/
Zona (aria) în care SQL*Plus memorează comenzile curente se
numeşte buffer-ul SQL.
Pe lângă comenzile SQL şi PL/SQL se pot introduce şi comenzi
SQL*Plus, care pot fi abreviate şi la o literă. Comenzile foarte lungi pot fi
întrerupte şi continuate pe linia următoare. Întreruperea se marchează cu ‘-‘.
Oracle automat afişează semnul > (prompter) după care se introduce restul
comenzii.
Exemplu:
sql> select * from -
>pers100;
Controlul listării rapoartelor lungi se poate face utilizând tasata Cancel sau
setând variabila PAUSE pe ON.
Exemplu:
set pause ‘text de atenţionare’
set pause on
Această setare va determina ca sistemul să oprească afişarea la
fiecare pagină şi să afişeze textul text de aten ionare. Cu SET PAUSE OFF
se revine la starea anterioară.
B. Editarea comenzilor SQL*Plus
Editarea în mod linie se realizează prin comenzile din tabelul 3.10.
Exemplu:
sql> clear buffer
sql> input
select * from pers100
sql> save comand1.sql
8. FORMATAREA REZULTATELOR
9records selected.
B. Tipărirea titlurilor
Pentru afişarea unui titlu la sfîrşitul sau la începutul fiecărei pagini
se utilizează comanda BTITLE, respectiv TTITLE. Comanda BTITLE are
următoarele sintaxe:
BTI[TLE] [COL[UMN] n1 [SKlP [n]] [TAB n] [LEFT | RIGHT |
CENTER] [FORMAT char] [char | var]...;
BTI[TLE] {OFF | ON};
BTI[TLE] text;
BTI[TLE]
unde:
COL[UMN] n determină saltul la coloana n a liniei curente.
Prin SKIP n se determină saltul Ia începutul liniei curente, de n ori. Dacă n
este omis, se sare o singură dată, iar dacă n este zero, se realizează
întorcerea ia începutul liniei curente.
TAB n are a efect saltul a n coloane (prin coloană în elegîndu-se nu o
coloană de tabelă, ci pozi ia cursorului) înainte dacă n este pozitiv sau
înapoi dacă n este negativ.
Clauzele LEFT, RIGHT, CENTER determină alinierea la stânga, la dreapta
respectiv afişarea centrata a datelor din linia curentă. Următoarele date sunt
aliniate ca an grup, de la începutul până la sfârşitul comenzii PRIN sau la
următorul LEFT, CENTER, RIGHT sau COLUMN. CENTER şi RIGHT
folosesc valoarea returnată de comanda SET LINESIZE pentru a calcula
pozi ia următorului articol.
FORMAT char specifică un model de format pentru articolul de date care
urmează; acest format se men ine până la întîlnirea unei alte clauze
FORMAT sau până la sfârşitul comenzii. De re inut că doar un singur model
de format poate fi activ la un moment dat. Dacă nici un format potrivit nu
are efect, atunci valorile sunt tipărite în conformitate cu formatul specificat
în SET NUMFORMAT iar dacă SET UNFORMAT nu a fost utilizat,
valorile vor fi tipărite cu formatul implicit.
Pentru specificarea titlurilor pot fi folosite constante (char) şi
variabile (var), ele fiind pozi ionate şi formatate aşa cum se specifică în
clauzele comenzii.
Existen a unui separator indică începutul unor linii noi, iar doi
separatori pe acelaşi rând introduc o linie vidă. Ini ial, caracterul de separare
este."!", însă el poate fi schimbat cu SET HEADSEP.
SQL*PLUS interpretează comanda BTITLE îh forma nouă dacă
primul cuvânt după numeie comenzii este numele unei clauze valide (LEFT,
SKIP, COL etc.).
Clauzele ON şi OFF au ca efect apari ia (ON) sau nu (OFF) a
titlului.
BTITLE text afişează centrat textul specificat.
Comanda BTITLE fără clauze specifică titlul curent.
Exemple:
1) Să se afişeze la sfârşitul unui raport final cu privire la produsele din
depozitul cu codul 100000, în partea stângă şirul de caractere "Data:" iar în
partea dreaptă "Semnătura:".
SQL> SET PAGESIZE 11
SQL> BTITLE LEFT Data: RIGHT Semnătura:;
SQL> SELECT • FROM PRODUSE
2 WHERE CODD=100000;
CODD CODP DENP STOC DATA CRT UM
100000 D4 SCAUN 36 10-SEP-05 BUC
100000 A3 FOTOLIU 27 15-SEP-05 BUC
100000 A7 MASA 23 05-SEP-05 BUC
Data: Semnatura:
Depozitul MOBILA/100000
SITUATIE
Data: Semnătura:
SITUATIE
SITUATIA SALARIATILOR
PE DEPOZITE / FUNCTII
FUNCT DEP 10 DEP 13 DEP 16 SUM(SALA)
DIRECTOR 45000 0 0 45000
SEF DEP 0 71500 107500 179000
VINZATOR 21200 72850 77700 268500
66200 144350 185200
Data: Semnătura:
3.13.22. CREAREA UNEI BAZE DE DATE PRIN
COMENZI SQL
• Arhivarea datelor;
refacere (recovery) a bazei de date;
• Rol de DBA, care este creat automat la momentul creării unei baze
MANAGER);
de date SQL. Acest rol con ine toate privilegiile bazei de date
SQL.
Datorită faptului că un administrator execută activită i pe care un
utilizator obişnuit nu le poate executa este necesar ca acesta să poată fi
autentificat înainte de a executa activită ile de administrare. Pentru
autentificarea administratorului există două metode: autentificarea folosind
sistemul de operare şi autentificarea folosind fişierul de parole.
Autentificarea folosind sistemul de operare se face utilizând două
conturi de administrator: OSOPER (sub care poate executa STARTUP,
SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER
DATABASE BACKUP, ARCHIVELOG şi RECOVER) şi contul OSDBA
(care con ine toate privilegiile de sistem cu op iunea ADMIN OPTION,
precum şi rolul OSOPER). Sub contul OSDBA se poate executa comanda
CREATE DATABASE.
Autentificarea folosind fişierul de parole permite definirea parolelor
de acces pentru fiecare utilizator. După stabilirea unui utilizator ca
administrator, de exemplu utilizatorul SCOTT cu parola TIGER, acestuia îi
va fi atribuit unul din privilegiile SYSDBA sau SYSOPER, cu comanda
GRANT. După aceasta utilizatorul SCOTT se va conecta la baza de date ca
SYSDBA sau SYSOPER cu comanda CONNECT.
Exemplu:
GRANT SYSDBA TO scott
GRANT SYSOPER TO scott
CONNECT scott/tiger AS SYSDBA
CONNECT scott/tiger AS SYSOPER
Administrarea fişierului cu parole include opera iile de definire a
fişierului cu parole, setarea parametrului de ini ializare a bazei de date
REMOTE_LOGIN_PASSWORDFILE, adăugarea de utilizatori în acest
fişier şi întreţinerea fişierului cu parole.
Crearea fişierului cu parole se execută cu utilitarul ORAPWD, care
are trei parametrii: FILE, PASSWORD şi ENTRIES, dintre care primii doi
sunt obligatorii, iar ultimul este op ional. Aceşti parametrii definesc numele
fişierului cu parole, parola pentru utilizatorul SYS şi respectiv numărul de
utilizatori care pot executa activită i de administrator (DBA). Setarea
parametrului de iniţializare REMOTE_LOGIN_PASSWORDFILE cu una
din valorile NONE, EXCLUSIVE şi SHARED permite utilizarea fişierului
cu parole.Valoarea NONE determină ca baza de date SQL să func ioneze
fără fişier de parole, valoarea EXCLUSIVE determină ca fişierul de parole
să fie folosit exclusiv de către o singură bază de date, iar valoare SHARED
determină ca fişierul de parole să fie folosit de către mai multe baze de date.
Pentru a avea un grad mare de securitate pentru baza de date, va
trebui ca imediat după crearea fişierului cu parole parametrul de ini ializare
REMOTE_LOGIN_PASSWORDFILE să fie setat pe valoarea
EXCLUSIVE.
Adăugarea de utilizatori în fişierul cu parole se face la momentul
atribuirii privilegiilor SYSDBA sau SYSOPER unui anumit utilizator.
Exemplu:
1. Se creează fişierul cu parole conform indicaţiilor de mai sus;
2. Se setează parametrul de iniţializare
REMOTE_LOGIN_PASSWORDFILE cu valoarea EXCLUSIVE;
3. Se conectează utilizatorul SYS, cu parola CHANGE_OF_INSTALL
ca SYSDBA folosind comanda
CONNECT SYS/change_of_install AS SYSDBA
4. Se porneşte o instanţă şi se creează o bază de date, dacă este
necesar, sau se montează şi se deschide o bază de date existentă;
5. Se creează utilizatorii care se doresc a fi administratori şi care să
fie adăugaţi în fişierul cu parole, folosind comanda
CREATE USER user1 IDENTIFIED BY parola1
6. Se atribuie unul din privilegiile SYSDBA sau SYSOPER acestui
utilizator cu una din comenzile:
GRANT SYSDBA TO user1 sau GRANT SYSOPER TO user1
7. Utilizatorul USER1 este adăugat în fişierul cu parole şi se poate
conecta acum ca SYSDBA sau SYSOPER cu acest nume de
utilizator în loc de numele SYS, folosind una din comenzile:
CONNECT USER1/parola1 AS SYSDBA sau
CONNECT USER1/parola1 AS SYSOPER
Listarea membrilor fişierului cu parole se face din viziunea
$PWFILE_USERS folosind comanda
SELECT * FROM V$PWFILE_USERS
Întreţinerea fişierului cu parole se referă la executarea activită ilor
de extindere, relocare, ştergere sau schimbare a stării acestui fişier.
• Parametrii de tip variabilă sunt cei ce pot lua anumite valori care să
mărimea unui bloc de date;
• Parametrii statici sunt cei ale căror valori nu se pot modifica în timpul
performan ele sistemului;
• Parametrii dinamici sunt cei ale căror valori se pot modifica, aşa cum s-
unei sesiuni sau cu baza de date pornită;
•
Exemplu: DB_DOMAIN = BUC.ORG.COM
GLOBAL_NAMES defineşte numele global al bazei de date în cadrul
re elei de calculatoare şi este format din numele bazei de date şi numele
domeniului separate prin punct. Acest parametru mai poate lua şi
valorile: TRUE (caz în care se for ează ca numele global al bazei de
date să fie identic cu cel al bazei de date) sau FALSE (numele global nu
are semnifica ie, nu se utilizează).
•
Exemplu: GLOBAL_NAMES =FALSE
CONTROL_FILES defineşte numele fişierelor de control ce vor fi
create pentru baza de date(se va furniza pentru fiecare fişier calea
completă de acces la acesta). Este recomandat ca să se definească cel
pu in două fişiere de control, care să fie plasate pe două discuri diferite.
•
Exemplu: CONTROL_FILES =diska:cntrl1.ora,diskb:cntrl2.ora
LOG_FILES specifică numărul maxim de grupuri de fişiere de log ce
pot fi utilizate pentru o bază de date. Ia valori de la 2 la 255. Acest
parametru specifică totodată şi numărul minim de fişiere de log ce pot fi
•
deschise pentru o bază de date.
DB_FILE_MULTIBLOCK_READ_COUNT defineşte numărul de
blocuri citite simultan pentru accesarea unei tabele a bazei de date. Este
folosit pentru optimizarea parcurgerii totale a unei tabele atunci când se
•
caută o anumită valoare a unei coloane aferentă unui rând din aceasta.
REMOTE_LOGIN_PASSWORDFILE specifică dacă se foloseşte sau
nu fişierul cu parole pentru identificarea utilizatorilor ce pot executa
activită i de administrator. Poate lua valorile: NONE nu se foloseşte
fişierul de parole iar utilizatorul care va executa activită i de
administrare trebuie să fie autentificat de către sistemul de operare
gazdă; EXCLUSIVE se foloseşte un singur fişier cu parole pentru o
singură bază de date. Pe lângă utilizatorii SYS şi SYSTEM şi al i
utilizatori pot executa sarcini de administrare; SHARED se foloseşte un
singur fişier cu parole pentru mai multe baze de date, caz în care singurii
utilizatori ce pot executa activită i de administrare sunt SYS şi
SYSTEM. În acest caz nu se pot adăuga al i utilizatori în fişierul cu
parole.
• DB_FILES specifică numărul maxim de fişiere de date ce pot fi
deschise de către o bază de date. De fiecare dată când se modifică acest
parametru baza de date se opreşte şi apoi se reporneşte.
• LOG_CHECKPOINT_INTERVAL specifică frecven a punctelor de
conecta simultan la baza de date, iar acest număr trebuie să fie mai mare
decât numărul total de procese background, Job Queue şi Parallel Query;
• ROLLBACK_SEGMENTS defineşte toate segmentele rollback pe
care o instan ă le poate acapara la momentul pornirii. Valoarea acestui
parametru se dă sub forma unei liste de valori.
Exemplu:
• TRANSACTIONS_PER_ROLLBACK_SEGMENT
concuren iali. Dacă se depăşeşte, se emite un mesaj de aten ionare;
specifică
•
DB_BLOCK_SIZE * DB_BLOCK_BUFFERS;
•
LOG_BUFFER determină mărimea în bytes a zonei redo log buffer
SHARED_POOL_SIZE specifică mărimea în bai i a ariei Shared pool.
Acest parametru poate accepta valori numerice urmate de literele "K"
sau "M", unde "K" înseamnă că numărul va fi multiplicat cu 1000, iar
•
"M" înseamnă că numărul va fi multiplicat cu 1000000.
OPEN_CURSORS specifică numărul maxim de cursoare pe care o
sesiune le poate deschide simultan. Valoarea asumată este de 50. Este
bine ca acest număr să fie cît mai mare pentru a nu avea probleme cu
•
rularea unei aplica ii.
TRANSACTIONS specifică numărul maxim de tranzac ii concurente.
O valoare mare a acestui parametru determină mărirea zonei de memorie
SGA.
• pornirea în modul exclusiv sau paralel, care se face atunci când avem
de recuperare.
Oprirea unei baze de date se poate face în două moduri: normal sau
for at.
Modul normal, în care oprirea bazei de date se face ca revers al
opera iei de pornire normală, sens în care se execută închiderea bazei de
date, demontarea bazei de date şi oprirea instan ei SQL. Activitatea se
execută din fereastra de dialog Shutdown Database prin selectarea butonului
radio Normal. Oprirea unei baze de date în condi ii normale presupune
executarea de către SQL a următoarelor activită i: oprirea conectărilor la
baza de date; deconectarea tuturor utilizatorilor; la următoarea pornire a
bazei de date nu se pornesc procedurile de recuperare.
Modul forţată se poate execută în două moduri: imediat sau prin
anularea instan ei.
Oprirea imediată a bazei de date se execută în cazul unui incident
iminent. În cadrul acestei opriri se execută instruc iunea SQL aflată în
lucru şi orice altă tranzac ie nefinalizată este anulată prin procesul de
rollback; to i utilizatorii conecta i sunt deconecta i imediat.
Oprirea se face din fereastra de dialog Shutdown Database prin
selectarea butonului Immediate.
Oprirea prin anularea instan ei se execută dacă baza de date sau
una din aplica iile sale func ionează anormal şi nici una din metodele de
oprire anterioare nu func ionează. Această oprire se execută din fereastra de
dialog Shutdown prin setarea butonului radio Abort.
În timpul acestei opriri se finalizează instruc iunile SQL aflate
în lucru, tranzac iile nefinalizate nu mai sunt aduse la starea anterioară
momentului începerii acestora (nu mai sunt anulate prin procesul de roll
back), iar to i utilizatorii sunt deconecta i imediat.
Unde:
spec-col cuprinde nume-col, format, mărime.
nume-col este numele coloanei din tabelă.
format reprezintă formatul coloanei din tabelă.Formatele acceptate
sunt specificate în tabelul următor:
Exemplu:
Să se creeze tabelele: PRODUSE, CLIEN I, PRETURI SALARIATI,
DEPOZITE, COMENZI ce intră în componen a bazei de date COMBAZA.
SQL> CREATE TABLE PRODUSE
2 (CODD NUMBER(6) NOT NULL,
3 CODP NUMBER(5) NOT NULL,
4 DENP CHAR(11),
5 STOC NUMBER(6),
6 DATACRT DATE,
7 UM CHAR(3));
Table created.
SQL> CREATE TABLE CLIEN I
2 (CODC NUMBER(6) NOT NULL,
3 DENC CHAR(11),
4 LOC CHAR(11),
5 STR CHAR(16),
6 NRCHARC3),
7 CONTNUMBER(11),
8 TEL NUMBER(8),
9 TFAX NUMBER(8))
Table created.
SQL> CREATE TABLE PRETURI
2 CODP NUMBER(5) NOT NULL,
3 PRETMAX NUMBEB(9,2),
4 PRETMIN NUMBER(9,2), 6 DATAI DATE,
6 DATASF DATE);
Table created.
SQL> CREATE TABLE SALARIATI
2 (MARCA NUMBER(4) NOT NULL,
3 NUME CHAR(16),
4 FUNCT CHAR(7),
6 CODD NUMBER(G) NOT NULL, 6 SALA NUMBER(9,2)
7 VENS NUMBER(9.2),
8 CODS NUMBER(4) NOT NULL);
Table created.
SQL> CREATE TABLE DEPOZITE
2 (CODD NUMBER(6) NOT NULL,
3 DEND NUMBER(6) NOT NULL,
4 NRSAL NUMBER(2));
Table created.
SQL> CREATE TABLE COMENZI
2 (NRCOM NUMBER(6) NOT NULL,
3 CODP NUMBER(5) NOT NULL,
4 CODC NUMBEIK6) NOT NULL,
5 DATAL DATE,
6 CANT NUMBER(7),
7 PRE NUMBER(9-2));
Table created.
unde:
ADD adaugă la sfârşitul tabelei noi coloane care ini ial au valori nule;
ulterior, prin actualizare, aceste coloane se vor completa cu date.
MODIFY schimbă definirea unei coloane existente. Modificarea tipului sau
mărimii unei coloane presupune ca aceasta să con ină numai valori nule.
spec-col reprezintă numele, formatul şi mărimea coloanei ce se va adăuga
sau se va modifica.
NULL se referă la faptul că valorile din coloană ce se adaugă/modifică sunt
nule.
NOT NULL specifică faptul că o coloană nu poate avea valori nule (NOT
NULL). Unei coloane deja existente i se poate ataşa parametrul NOT
NULL numai dacă aceasta con ine valori nenule.
Exemple:
1) Să se adauge la tabela DEPOZITE o nouă coloană CANTDEP ce nu a
fost prevăzută ini ial.
SQL> ALTER TABLE DEPOZITE ADD
2 (CANTDEP NUMBER(7));
Table altered.
2) Să se modifice atributele coloanei CANTDEP (respectiv mărirea acesteia
cu două unită i).
SQL> ALTER TABLE DEPOZITE MODIFY
2 (CANTDEP NUMBER(9));
Table altered.
Pentru ştergerea unei tabele într-o bază de date se utilizează
comanda DROP TABLE. Sintaxa ei este:
unde:
nume-vechi şi nume-nou sunt constante de tip şir de caractere (nu se scriu
între ghilimele sau apostrofuri).
unde:
WITH LIST salvează informa iile referitoare la index într-un fişier.
nume-index este numele indexului ce urmează a fi validat. Dacă indexul este
valid, comanda va afişa un mesaj corespunzător (Index validated). Ob inerea
oricărui alt mesaj va determina ştergerea indexului şi recrearea lui.
Ştergerea unui index din baza de date se realizează cu ajutorul comenzii
DROP INDEX, cu sintaxa:
• Se poate realiza o echilibrare a opera iilor de I/O prin maparea parti iilor
altele;
pe discuri diferite.
sau indexului din care provine. Numele unei parti ii poate să apară în
instruc iuni DDL şi DML, precum şi în utilitarele Import/Export şi
SQL*Loader.
Exemplu:
• O tabelă poate fi parti ionată dacă nu este inclusă într-un grup de tabele
Partiţionarea tabelelor se face respectând câteva reguli esen iale, astfel:
• O tabelă parti ionată sau neparti ionată poate avea indecşi şi parti iona i
sau nu con ine tipurile de date LOB, LONG, LONG RAW sau obiect;
• Un index poate fi parti ionat dacă nu este inclus într-un grup de indecşi
Partiţionarea indecşilor se face respectând câteva reguli:
Intreţinerea partiţiilor
Întreţinere a partiţiilor se realizează prin executarea activită ilor de
modificare, mutare, adăugare, distrugere, trunchiere, splitare, reunire a
acestora, precum şi schimbarea partiţiilor şi reconstruirea partiţiilor index.
• Modificarea unei parti ii a unei tabele se face cu comanda ALTER
TABLE cu clauza MODIFY PARTITION. Cu această comandă se
pot modifica atributele fizice ale parti iei sau ale parti iei indexului
tabela spa iu în care rezidă acestea din diverse considerente, dintre care
cele de ob inere a unor performan e în exploatarea sunt cele mai
frecvente. Opera ia se execută cu comanda ALTER TABLE cu
op iunea MOVE PARTITION.
Exemplu:
ALTER TABLE tab10 MOVE PARTITION part1 TABLESPACE
tabsp10 NOLOGGING;
Mutarea parti iei unei tabele care con ine date, determină necesitatea
•
DELETE, apoi distrugem parti ia.
Distrugerea partiţiilor unui index se face după anumite reguli func ie
de situa iile în care se află parti ia, cu ajutorul comenzii ALTER
INDEX cu op iunea DROP PARTITION. O parti ie a unui index local
nu poate fi distrusă, ea se distruge implicit atunci când se distruge
parti ia tabelei căreia îi corespunde. O parti ie fără date a unui index
global poate fi distrusă. Dacă o parti ie a unui index global con ine date,
atunci prin distrugerea acesteia parti ia următoare devine invalidă şi
•
trebuie recreată;
Trunchierea partiţiilor unei tabele se face cu comanda ALTER
TABLE cu op iunea TRUNCATE PARTITION şi are ca efect
ştergerea tuturor rândurilor de date din această parti ie şi a parti iei
corespunzătoare a indexului local asociat, dacă există. Parti iile
indecşilor nu pot fi trunchiate, singură trunchiere posibilă este cea
specificată mai sus. Trunchierea unei parti ii a unei tabele şi a indecşilor
globali asocia i şi/sau a constrângerilor de integritate referen ială se face
după aceleaşi reguli ca şi opera ia de distrugere.
• Splitarea partiţiilor unei tabele sau ale unui index se face cu comanda
ALTER TABLE/INDEX cu op iunea SPLIT PARTITION. O parti ie
a unei tabele ce con ine date, prin splitare to i indecşii asocia i devin
inutilizabili şi ca atare aceştia trebuie recrea i. Numai parti ia fără date
nu invalidează indecşii. Parti ia unui index poate fi splitată numai dacă
indexul este global şi nu con ine date, căci parti ia unui index local se
splitează automat atunci când se splitează parti ia tabelei căreia îi
•
corespunde.
Fuzionarea sau reunirea parti iilor unei tabele sau ale unui index se
face cu ajutorul comenzilor ALTER TABLE/INDEX şi cu una din
op iunile DROP PARTITION sau EXCHANGE PARTITION, pentru
că o op iune explicită de fuzionare nu există. O parti ie a unei tabele
poate fi reunită cu altă parti ie numai dacă nu are indecşi globali sau
constrângeri de integritate referen iale asociate. Fuzionarea unei parti ii
a unei tabele se face totdeauna cu parti ia imediat superioară.
Presupunem că avem tabela TAB10 cu parti iileP1, P2, P3 şi P4 şi vrem
să reunim parti ia P2 cu P3, se vor exporta datele din tabele P2, se
execută comanda ALTER TALE tab10 DROP PARTITION p2 ,
devin invalide.
Distrugerea vederilor se execută cu comanda DROP VIEW .
Vederea partiţionată împarte o tabelă foarte mare în bucă i mai mici
numite parti ii şi le reuneşte pe acestea pentru a se ob ine performan e în
administrare şi regăsirea datelor. Cererile care folosesc anumite intervale de
valori conforme cu cele folosite la crearea parti iilor vor regăsi date numai
din parti iile aferente acestora. O vedere parti ionată se creează folosind
constrângerea de integritate CHECK sau clauza WHERE. Considerăm
tabelele t1, t2 şi t3 cu aceleaşi coloane, deci pot fi considerate parti ii ale
unei tabele care la însumează.
Exemplu:
ALTER TABLE t1 ADD CONSTRAINT c1 CHECK (col1 between
0 and 1000);
ALTER TABLE t2 ADD CONSTRAINT c1 CHECK (col1 between
1000 and 10000);
ALTER TABLE t3 ADD CONSTRAINT c1 CHECK (col1 between
10000 and 100000);
CREATE VIEW v10 AS
SELECT * FROM t1 UNION ALL
SELECT * FROM t2 UNION ALL
SELECT * FROM t3;