Documente Academic
Documente Profesional
Documente Cultură
1. INTRODUCERE
3
3.13.13. Sortarea datelor.........................................................................................................................................105
3.13.14. Filtrarea datelor........................................................................................................................................106
3.13.15. Actualizarea datelor..................................................................................................................................106
3.13.16. Funcii agregate........................................................................................................................................107
3.13.17. Subinterogri............................................................................................................................................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
ncepnd cu anii 95, Internetul, sub aspectul su cel mai popular, i anume al paginilor web,
a cunoscut o amploare greu de imaginat.
Dac la nceput, paginile web aveau un coninut simplu i oarecum stngace, n zilele
noastre aspectul acestora s-a schimbat radical. Dup doar 10 ani, n paralel cu evoluia tehnicii de
calcul, au evoluat i tehnicile de programare a acestora. Primele pagini permiteau doar navigarea
prin coninutul lor, pe cnd n zilele noastre ele au o utilizare foarte larg, de la jocuri i aplicaii
grafice dinamice la comer pe Internet.
Limbajul PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd
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 conine).
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 urmtoarelor sale
caracteristici:
Familiaritatea sintaxa limbajului este foarte uoar, fiind foarte la ndemn 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 nite
marcaje speciale;
Securitatea PHP-ul pune la dispoziia programatorilor un set flexibil i eficient de
msuri de siguran;
5
Flexibilitatea fiind aprut din necesitatea dezvoltrii 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 licena open-source a determinat adaptarea rapid a sa la nevoile web-ului,
eficientizarea i securizarea codului.
n capitolul al II-lea al acestei lucrri (Fundamente teoretice ale paginilor WEB limbajul
HTML) mi-am propus o parcurgere ceva mai amnunit, sub forma unui tutorial, a limbajului
HTML standard, descriind tag-urile cele mai importante i exemplificnd aceste descrieri cu mici
aplicaii. Capitolul se ncheie cu o trecere n revist, n care exist cteva exemple comentate, a
tehnicilor de programare dinamice ale unei pagini web, care rmn ns tot pe domeniul HTML.
Acest capitol este mai mult dect necesar, din cauz c PHP nu face altceva dect s ruleze
programe n urma cruia este generat cod HTML. Nu putem aadar vorbi de limbajul PHP fr a
cunoate HTML
6
7
2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB LIMBAJUL HTML
Istoria Internetului ncepe cu anul 1968, cnd guvernul S.U.A. inteniona s interconecteze
universitile, departamentele militare i de aprare ale rii, astfel nct ele s coopereze n cadrul
unor proiecte de cercetare comune. Astfel, s-a format o agenie numit Advanced Research Projects
Agency (ARPA). Una din cheile proiectului punea n discuie faptul c, stocarea tuturor informaiilor
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
defeciuni tehnice majore. O metod de a face fa unei asemenea situaii ar fi de a copia i distribui
informaiile pe mai multe calculatoare, n ntreaga ar, folosind o reea.
n 1975, cteva dintre limbajele sau protocoalele pe care calculatoarele le foloseau pentru a
comunica ntre ele s-au standardizat. Majoritatea universitilor importante i a departamentelor de
aprare din S.U.A. s-au legat mpreun ntr-o reea numit DARPANET, toate calculatoarele
folosind acelai protocol pe care astzi l cunoatem sub denumirea de TCP/IP. Reeaua, cu timpul,
a fost nlocuit de mai multe reele, care astzi mpnzesc globul pmntesc.
ncepnd cu anul 1980, mai multe colegii i universiti au fost conectate la Internet. Acest
lucru a permis universitilor s-i mpart informaii despre cercetrile lor, programe i tiri
recente. n anii 90 Internetul s-a deschis i n scopuri comerciale. n curnd, multe alte ci de
utilizare a informaiilor transmise prin intermediul acestei gigantice reele au fost dezvoltate.
n prezent, este posibil s foloseti Internetul pentru a trimite scrisori electronice pe ntregul
glob n doar cteva secunde. Poi cuta informaii despre orice subiect doreti. Expresia World
Wide Web (WWW) definete o colecie de documente care se ntinde n cteva sute de milioane de
calculatoare.
Principiul de baz al funcionrii 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:
gsirea calculatorului destinatar al transferului de date;
transmiterea efectiv a datelor;
modaliti prin care expeditorul comunic faptul c au fost transmise toate datele, iar
destinatarul comunic faptul c le-a recepionat;
8
compresia datelor: prin aplicarea anumitor algoritmi matematici, datele care urmeaz s fie
expediate sunt prelucrate de aa natur, nct s fie memorate prin utilizarea unui spaiu ct mai mic
de memorie. Prin urmare, transmiterea lor dureaz mai puin. Invers, la destinaie sunt
decompresate prin utilizarea acelorai algoritmi matematici;
identificarea erorilor care pot interveni n transmiterea datelor: i aici exist mai muli
algoritmi care permit identificarea i corectarea erorilor.
Standardul care s-a impus n ceea ce privete Internetul, const n protocolul TCP/IP.
Numele este de fapt, numele comun al unei familii de protocoale utilizate pentru transferul datelor
n reea. Orice calculator conectat la Internet are o adres, numit adres IP (Internet Protocol
Address). O adres IP este alctuit din 4 numere ntre 0 i 255, prin urmare o astfel de adres
ocup 4 octei. 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 Cercetri
Nucleare (CERN) n Geneva (Elveia). Propunerea iniial de creare a unei colecii de documente
avnd legturi ntre ele a fost fcut de Tim Berners-Lee n martie 1989. Aceast propunere a aprut
n urma problemelor de comunicare pe care le ntmpinau echipele de cercettori ce foloseau
centrul, chiar i folosind pota electronic.
9
Primul server web folosit de Tim Berners-Lee a aprut nu mult nainte de decembrie 1991,
cnd s-a fcut prima lui demonstraie public. Studiul a fost continuat prin apariia primei aplicaii
grafice Mosaic, n februarie 1993, realizat de cercettorul Marc Andreessen de la centrul
universitar National Center for Supercomputing Applications (NCSA) din oraul Urbana-
Champaign din statul federal Illinois, SUA. Ulterior WWW-ul a evoluat pn la ceea ce este astzi,
un serviciu integrativ i multimedial, avnd ca suport fizic Internetul.
Practic, WWW este un sistem de documente i informaii de tip hipertext legate ele ntre ele,
care pot fi accesate prin reeaua mondial de Internet. Documentele, care rezid n diferite locaii pe
diverse calculatoare-server, pot fi regsite 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 afieaz pe un terminal.
Noiunea de website (sau pur i simplu site, ori site web) desemneaz o grup de pagini
web multimediale (coninnd texte, imagini fixe, imagini mictoare i chiar sunete), accesibile n
Internet n principiu oricui, de obicei pe o tem anume, i care sunt conectate ntre ele prin aa-
numite hyperlinkuri. Diversele situri web pot fi oferite de ctre o companie, un proiect, o reea de
utilizatori, o persoan particular, o administraie public i multe altele.
10
Pentru crearea paginilor web s-a impus limbajul HTML (HyperText Markup Language) un
limbaj de marcare, al crui scop const n prezentarea ntr-un anumit format a informaiilor:
paragrafe, tabele, fonturi, culori, .a.m.d.
Calculatorul pe care se gsete site-ul se numete server, iar calculatoarele care acceseaz
coninutul site-ului se numesc client.
Orice calculator client trebuie s dispun de un program specializat, numit browser, cu
ajutorul cruia s se poat interpreta i deci vizualiza fiierele HTML.
Pe server trebuie s se gseasc un program care rspunde cererilor browser-ului aflat pe
calculatorul client. Cererea efectuat de ctre browser i rspunsul server-ului se fac prin
respectarea unui anumit protocol. Acest protocol se numete HTTP (HyperText Transfer Protocol).
HTML este un limbaj de marcare orientat ctre prezentarea documentelor text pe o singura
pagin.
Utiliznd 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
coninutul unui document poate fi adnotat cu diverse tipuri de metadate i indicaii de redare.
Indicaiile de redare pot varia de la decoraiuni minore ale textului (cum ar fi specificarea faptului
c un anumit cuvnt trebuie subliniat sau c o imagine trebuie introdus) pn la scripturi
sofisticate, hri de imagini i formulare. Metadatele pot include informaii despre titlul i autorul
documentului, informaii structurale despre cum este mprit documentul n diferite segmente,
paragrafe, liste, titluri etc. i informaii 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 utiliznd un
editor de text simplu. Totui scrierea i modificarea paginilor n acest fel solicit cunotine 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 asemntor cu documentele Word, dar cu
observaia c aceste programe genereaz un cod HTML care este de multe ori de proast calitate.
HTML se poate genera direct utiliznd 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 fiier HTML este foarte simpl, putnd fi fcut cu ajutorul oricrui editor de
text. Totui, pentru a avea un control ridicat asupra corectitudinii codului scris, este recomandat s
utilizm 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 putnd fi descrcate de pe Internet.
Iat i modul n care pagina de mai sus este vizualizat n Internet Explorer:
12
Opional, antetul poate conine titlul paginii, cuprins ntre tag-urile <TITLE> i </TITLE>. Titlul
apare pe bara de titlu a ferestrei afiate n browser.
Corpul poate conine texte i/sau imagini. n exemplu, pagina conine textul Acesta este primul
exemplu de pagina...
Comentariile, care nu sunt afiate de ctre browser, pot fi scrise ntre tag-urile <!-- i -->.
Numele tag-urilor nu sunt case sensitive, deci pot fi scrise att cu litere mici ct i cu litere mari.
n continuare, pentru a le pune n eviden, le vom scrie cu litere mari.
n general, textele coninute de o pagin se pot gsi n mai multe paragrafe. Un paragraf se
introduce ntre tag-urile <P> ... </P>.
La afiare, dou paragrafe consecutive vor fi separate printr-o linie goal.
Tag-ul </P> poate lipsi; un nou paragraf poate fi detectat prin tag-ul <P>.
n cadrul unui fiier HTML, Enter-ul nu are nici un efect. De asemenea, dac dou cuvinte
ale unui paragraf sunt separate prin mai multe spaii sau alte caractere albe (enter-uri, tab-uri),
browser-ul afieaz doar un singur spaiu.
n cazul paragrafului, atributul align controleaz alinierea textului din cadrul paragrafului.
Dac acest atribut nu este prezent, alinierea este fcut n mod implicit la stnga. 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 crei cod tocmai a fost prezentat, vizualizat n Internet Explorer:
<BR> : Are ca efect forarea afirii a ceea ce urmeaz pe rndul urmtor. Acest tag nu
creeaz un nou paragraf (s ne reamintim c ntre dou paragrafe este automat lsat o linie vid)
<B>...</B> : Are rolul de a afia bold (ngroat) textul cuprins ntre cele dou tag-uri ale
sale. Un tag sinonim al lui <B> este: <STRONG>...</STRONG>
<I>...</I> : Are rolul de a afia 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 afia 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 afia tiat (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 afia textul cuprins ntre cele dou tag-uri ale sale mai
mare dect textul n care este cuprins.
<SMALL>...</SMALL> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale
mai mic dect textul n care este cuprins.
<SUP>...</SUP> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai
sus (ca o putere)
<SUB>...</SUB> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai
sus (ca un indice)
14
<TT>...</TT> : Are rolul de a afia textul cuprins ntre cele dou tag-uri ale sale mai sus
monospaiat (toate caracterele ocup aceeai lungime practic, se folosete fontul Courier New)
n cod-ul HTML de mai jos gsii 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
Rou, 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:
Aa cum am vzut, dac n cadrul unui text din cadrul documentului HTML apare un grup de mai
multe spaii, n browser va fi afiat doar unul singur. Dac dorim forarea afirii unui spaiu, se
folosete identificatorul special (ultimul caracter, ;, face parte din identificator)
16
2.3.5. Liste.
Acestea permit ca anumite enunuri (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 sfrit 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 obinuite (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 fiecruia este afiat 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 sfrit nefiind
obligatoriu).
Implicit, marcarea lor se face prin cerculee 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 cerculee pline (implicit)
- square : marcarea se face cu ptrele
- circle : marcarea se face cu cerculee 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 fiierul efectiv de pe disc, ce conine 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 cruia se afl.
Acesta poate lua una dintre valorile urmtoare:
- right : imaginea se aliniaz n dreapta, iar textul care urmeaz este scris n locul
rmas liber, n stnga acesteia;
- left : imaginea se aliniaz n stnga, iar textul care urmeaz este scris n locul
rmas liber, n dreapta acesteia;
- top : doar latura de sus a imaginii se aliniaz cu rndul de text n cadrul cruia se
afl; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a ecranului;
- middle : rndul de text n cadrul cruia se afl imaginea se aliniaz la jumtatea
nimii acesteia; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a
ecranului;
- bottom : doar latura de jos a imaginii se aliniaz cu rndul de text n cadrul cruia
se afl; urmtorul rnd de text va fi afiat dup imagine, ocupnd ntreaga lime a ecranului;
Dac dorim ntreruperea unei alinieri de imagine de tip right sau left nainte ca textul s fi
umplut spaiul liber din stnga, respectiv dreapta acesteia, putem folosi tag-ul br, cruia i adugm
unul dintre atributele clear=left sau clear=right sau clear=all, dup caz.
atributul alt=text permite specificarea unui text alternativ ce va fi afiat fie dac
meninem cursorul de mouse asupra imaginii, fie n locul imaginii propriu-zise, n cazul n care
imaginea nu poate fi ncrcat din cauza unei probleme de conexiune.
Iat cteva 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 opiunii 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, dect
cele reale ale acesteia. Evident, dac dimensiunile nu sunt proporionale cu cele reale, imaginea va
fi deformat. Totodat, dac specificm dimensiuni mai mari dect cele reale, imaginea se va vedea
mai puin clar. n realitate, imaginea este transferat de pe server la dimensiunile sale originale,
redimensionarea avnd 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, bineneles). 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, exemplificndu-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 redrii electronice ale unei imagini n culori se bazeaz pe amestecarea
n proporii diferite ale culorilor Rou, Verde i Albastru. n acest mod, se poate obine orice
culoare se dorete. n cazul culorilor pe care le poate reda un browser HTML, fiecare dintre aceste
componente de culoare poate avea 256 de stri posibile: de la 0, care nseamn c respectiva culoare
lipsete cu desvrire, pn la 255, care nseamn c respectiva culoare este folosit la intensitatea
maxim. n acest fel, prin amestecuri diferite, putem obine 2563, deci aproximativ 16 milioane de
nuane 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 numr ntre 00 i FF. Constanta
HTML pentru specificarea unei culori are forma general #RRGGBB, n care RR, GG respectiv BB
reprezint cte un numr hexazecimal cuprins ntre 00 i FF.
Iat cteva exemple de culori obinute 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 (rndurile) tabelului, n cadrul fiecrui rnd trebuind descrise celulele acestuia.
Descrierea unui rnd se face ntre tag-urile <TR>...</TR>. La rndul lor, celulele din cadrul
rndului se descriu ntre <TD>...</TD>. Att tag-ul </TR> ct i tag-ul </TD> pot fi omise.
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=lime poate stabili ct de lat s fie tabelul. Limea poate fi dat n procente,
caz n care se va calcula ca i procent din limea ferestrei browser-ului (ex: width=50%) sau n
pixeli (ex: width=500);
height=nlime poate stabili ct de nalt s fie tabelul. Limea 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 lng tabel, mai scriem i text, acesta se va poziiona fa de tabel n acelai
mod n care se poziioneaz i fa de imagini;
bgcolor=culoare permite stabilirea culorii de fundal a tuturor celulelor tabelului;
bordercolor=culoare permite stabilirea culorii chenarului (deopotriv cel interior
ct i cel exterior)
width i height determin, pentru celula respectiv, limea i nlimea. Poate fi dat n
procente sau pixeli. Dac e specificat n procente, se va lua din limea, respectiv nlimea
24
tabelului. Modificarea limii i a nlimii 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
coninutul n interiorul celulei, pe orizontal respectiv pe vertical, fiind prioritare fa de alinierea
la nivel de linie
colspan=n stabilete ntinderea celulei respective n dreapta cu n coloane
(echivalentul operaiei Merge Cells din Word, n cazul n care unim celule adiacente pe orizontal);
rowspan=n stabilete ntinderea celulei respective n jos cu n linii (echivalentul
operaiei 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 acelai 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>
Aa cum am vzut n partea introductiv a acestui capitol, noiunea de www este strns
legat de documentele de tip hipertext.
Tot ceea ce am prezentat din limbajul HTML pn n momentul de fa, reprezint doar
partea descriptiv a acestuia, cu ajutorul creia putem crea un coninut 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 crem posibilitatea unui acces rapid i, dac acesta dorete, s poat
reveni n pagina iniial prin apsarea butonului Back al browser-ului de Internet;
putem face ca un vizitator al paginii noastre s primeasc un anumit fiier, de orice tip,
care se gsete 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, fr 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 legtur ctre alte pagini
Acestea permit ca un anumit element din document s conin legtura ctre o alt pagin.
Elementul care face legtura 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 capt forma
unei mini, indicndu-ne astfel c este vorba de un link pe care l putem utiliza. Printr-un simplu
click, accesm pagina ctre care este fcut legtura.
Acest tip de legtur 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 primete adresa complet a paginii ctre care dorim s
facem legtura. Dac e vorba de un fiier local, din acelai director cu pagina din care facem
legtura, la href este suficient s scriem numele i extensia (de ex: href=pagina.htm)
Se realizeaz n mod analog cu cele ctre alte pagini, la atributul href trebuind specificat
adresa fiierului respectiv (dac este n acelai director cu pagina din care facem legtura, e
suficient s-i scriem numele i extensia).
Ex: n cazul n care fiierul pentru download este local:
Pentru download arhiva executa un click
<A href="arhiva.zip">aici</A>
Legturile ctre fiiere de tip sunet sau film se fac absolut n aceeai manier. n funcie de extensia
lor (.wav, .mid, .mp3, .avi) n momentul executrii unui click asupra obiectului care face legtura
ctre ele, acestea vor fi deschise automat ctre browser cu programul corespunztor.
27
Legturi relative la coninutul documentului (paginii)
Sunt acele ancore care permit accesarea direct a unei pagini web ntr-un anumit loc, fr 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 aceleii pagini: specificnd la atributul href identificatorul respectiv (cel
de la id) nainte de care se pune de caracterul #, ca n exemplul urmtor:
<A href=#capitolul2>Salt direct la capitolul 2</A>
b) Din alt pagin: specificnd la atributul href adresa paginii accesate (a fiierului html)
urmat de caracterul #, ca n exemplul urmtor:
<A href=http://www.myserver.ro/document.html#capitolul2>Deschide documentul extern,
direct la capitolul 2</A>
Acestea permit ca, atunci cnd o persoan ne viziteaz site-ul, dac dorete, s ne poat
trimit un e-mail fcnd un simplu click pe legtura respectiv. Totui, pentru ca acest lucru s fie
funcional, cel care viziteaz site-ul trebuie s aib configurat pe calculatorul su un client de e-mail
(cel mai frecvent este Outlook Express).
Iat un exemplu pentru o astfel de ancor:
<ADDRESS>
Click <A href=mailto:somebody@someserver.com>aici</A> pentru a trimite un e-mail
</ADDRESS>
(tag-ul <ADDRESS>...</ADDRESS> nu face altceva dect s afieze textul din cadrul su 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 vzut n partea introductiv, orice document html este cuprins ntre tag-urile
<HTML> i </HTML>. El este alctuit 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 seciuni putem ntlni diverse alte tag-uri. Despre tag-ul <TITLE> am
discutat deja, el permind 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 folosete n
special atunci cnd resursele (sau, n fine, o mare parte a acestora) se gsesc n alt director dect cel
n care se afl documentul curent. n acest fel, folosirea fiierelor 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 informaii motoarelor de cutare. Unele dintre acestea
viziteaz doar antetul pentru a obine informaii. Informaiile coninute de acest element nu sunt
afiate de browser, ns este important s l folosim pentru ca informaiile coninute 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,
rezultnd din exemplele urmtoare:
- 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 regsit 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
amnunit 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 afiare 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 definete n antetul paginii o funcie JavaScript capabil s calculeze suma
numerelor de la 1 la 10 ntr-o variabil s i-apoi s afieze valoarea obinut prin intermediul unei
ferestre de dialog. Funcia este apelat automat (atributul onload) la ncrcarea paginii.
30
2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME).
Utilizarea frame-urilor permite ca, n cadrul aceleiai ferestre ale browser-ului s fie afiate
simultan mai multe documente HTML (sau alte resurse).
Tag-ul <FRAMESET> are rolul de a mpri fereastra n mai multe cadre. n fiierul HTML,
el nlocuiete tag-ul <BODY>. Iat cteva atribute ale lui FRAMESET:
rows descrie liniile n care este mprit seciunea FRAMESET respectiv
cols descrie coloanele n care este mprit seciunea 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 nlimi 30%, 50% respectiv 20% din
nlimea ferestrei.
aici se definesc trei frame-uri: unul de nlime de 100 de pixeli, altul de 200 de pixeli, al treilea
fiind alocat cu spaiul rmas.
Fiecare tag <FRAMESET>...</FRAMESET> trebuie ca, dup definirea aspectului (cu ajutorul
unuia dintre atributele cols sau rows) s conin descrierile fiecruia dintre cadrele definite. Acest
lucru se face cu ajutorul tag-ului <FRAME> prin intermediul atributelor:
src adresa fiierului HTML sau a imaginii care se va ncrca iniial 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 stnga 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 afiarea 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 afiat
noresize dac atributul acesta este prezent (el se folosete fr a i se atribui nici o
valoare) atunci vizitatorului paginii nu i se va permite s redimensioneze cadrul. Prezena acestui
atribut pentru un cadru nu permite nici redimensionarea cadrelor vecine.
name este un atribut foarte important. Prin intermediul su va putea fi identificat
frame-ul respectiv. Acest lucru este foarte important, deoarece dintr-un cadru se poate comanda
coninutul oricrui 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 stnga
va conine numele a 3 zile ale sptmnii (pe limba romn). Accesarea fiecruia va produce
deschiderea n frame-ul drept a unei pagini care va conine traducerea numelui zilei respective n 4
limbi.
n total vom avea de construit 5 fiiere:
- un fiier pentru pagina iniial, cea care definete scheletul paginii cu frame-uri
- un fiier cu cele 3 zile ale sptmnii, pe fiecare dintre ele fiind pus cte un hyperlink care va
deschide traducerea numelui su n cellalt frame
- 3 fiiere cu traducerilor numelor zilelor n 4 limbi strine.
32
De remarcat faptul c aceast fiier HTML nu conine dect scheletul cadrelor, ele urmnd a
fi populate iniial, dup cum remarcai din codul surs, cu fiierele apl022zile.html pentru
primul cadru (cel din stnga) respectiv cu fiierul apl022luni.html pentru cel de-al doilea cadru.
Observai modul n care au fost definite cadrele n cadrul tag-ului FRAMESET:
cols="30%,*". Acest lucru semnific prezena a dou cadre verticale (coloane) dintre care primul
va ocupa 30% din limea ferestrei, iar al doilea restul (lucru semnificat de caracterul * care
nchide irul de definiie al cadrelor).
De asemenea, atributul noresize n cadrul primului tag FRAME mpiedic redimensionarea
cadrelor de ctre 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, dndu-i orice poziie
ar fi dorit.
Dac ncrcm n browser-ul de internet documentul creat n acest stadiu, fr ca pe disc s
existe vreunul dintre celelalte patru fiiere planificate, am obine urmtorul rezultat:
Iat i coninutul celorlalte fiiere, pe care le vom pune n acelai director cu documentul de
mai sus (n dreptul fiecruia vom arta i vizualizarea sa n browser):
Fiierul 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 crui nume apare dup target.
33
Fiierul apl022luni.html: Fiierul apl022marti.html: Fiierul 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 fiiere de mai sus):
Evident, la efectuarea unui click asupra legturilor (luni, marti, miercuri) din partea stng,
se va produce deschiderea paginii corespunztoare n frame-ul drept.
Tag-ul <IFRAME> este un element care nu a fost prezent n primele versiuni ale limbajului
HTML, ci a aprut ceva mai nou. Actualmente, folosirea sa este preferat de majoritatea celor care
programeaz pagini web, deoarece se comport ceva mai flexibil dect cadrele clasice. Totodat,
motoarele de cutare nu indexeaz coninutul paginilor cu frame-uri obinuite, pe cnd cele care
conin iframe-uri sunt indexate.
Prin intermediul su, este permis crearea unui cadru n corpul unui documente HTML,
cadrul care se comport asemntor unei imagini.
Atributele lui IFRAME sunt:
name la fel ca i la FRAME, acest atribut permite identificarea IFRAME-ului (pentru a
putea comanda coninutul su din orice link)
height, width nlimea, respectiv limea. Pot fi specificate att n pixeli, ct 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 ncrcat iniial n IFRAME
marginwidth, marginheight, scrolling la fel ca i la FRAME
align poate lua una dintre valorile left, right, top, bottom, middle,
comportndu-se ntocmai ca i n cazul imaginilor
34
Iat reluarea aceleiai idei structurale ca i la aplicaia de dinainte (cu frame-uri clasice) ns
folosind un element de tipul IFRAME. Fiierele apl022luni.html, apl022marti.html
respectiv apl022miercuri.html le pstrm nemodificate. Practic, mai crem doar un singur
fiier HTML, cu coninutul urmtor, i avem grij s copiem n acelai director i cele 3 fiiere 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 crei tag este <HR> reprezint un element decorativ. De obicei se
folosete pentru a separa anumite seciuni ale paginii web.
Atributele sale sunt:
width permite specificarea lungimii sale. Poate fi dat n pixeli sau n procente. Dac
acest atribut lipsete, atunci lungimea sa va fi maxim (din marginea stng i pn marginea
dreapt a ferestrei);
size permite specificarea nlimii 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 ctre un server. Acesta trebuie s fie mai mult dect un
clasic server HTTP, trebuind s aib instalat i o component capabil de a rspunde 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 lucrri.
Pentru moment ne vom concentra asupra componentelor unui formular i a aspectului
acestora.
Pe lng componentele specifice, un formular poate conine orice fel de alte elemente valide
de HTML tabele, imagini, text, bare de separare ...
n continuare vom prezenta cteva din componentele unui formulare, prin intermediul crora
utilizatorul poate introduce date i trimite apoi aceste date ctre server. Un atribut foarte important
al oricruia dintre aceste componente este name, deoarece prin intermediul su, server-ul care va
primi datele va ti despre care dintre controale este vorba.
36
Cmpuri text
Permit utilizatorului s introduc date ntr-un cmp de tip edit (pe o singur linie).
Aceste se specific prin tag-ul
<INPUT type=text ...>
Atributele sale sunt:
size specific limea (n numr aprox. de caractere) cmpului text; Dac acest
parametru este omis, este implicit considerat ca fiind 20;
maxlength specific numrul maxim de caractere ce pot fi scrise n cmpul text. Acest
atribut poate primi o valoare mai mare dect cea scris la size, caz n care, textul va defila n control
(stnga dreapta) n cazul n care scriem mai multe caractere dect cte ncap n poriunea vizibil.
Omiterea acestui atribut va permite introducerea unui numr foarte mare de caractere (limita difer
de la un browser la altul);
name numele cmpului text (prin care server-ul va identifica acest cmp, pentru a prelua
datele din el);
value poate specifica o valoare care s fie iniial (la ncrcarea paginii) deja scris n
cadrul controlului. Dac omitem acest atribut, cmpul text va fi gol.
Aceasta componenta se prezint sub forma unui buton. Prin apsarea sa are loc trimiterea
tuturor datelor din formular ctre 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 folosete n
cazul n care aceluiai formular dorim s-i atam mai multe butoane de acest tip, iar apsarea
fiecruia s produc o aciune 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
Cmpuri de tip password
Se comport identic cu cmpurile 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 afia 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 opiuni 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
aparin aceluiai grup (deci seria de opiuni din care trebuie aleas doar una singur posibil) s
poarte acelai 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
ncrcarea paginii. Este recomandabil ca, dintre toate butoanele care aparin aceluiai grup, exact
unul singur s conin acest atribut.
Iat i un exemplu care combin controalele prezentate pn 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 nefuncional, n sensul c datele din formular nu sunt prelucrate.
Acest lucru va face obiectul capitolului urmtor, i anume preluarea datelor dintr-un formular prin
intermediul limbajului php.
38
Cmpuri de tip checkbox
Sunt controale care permit bifarea sau tergerea bifrii unei csue. Din punct de vedere
practic, ele permit utilizatorului s marcheze una, nici una, sau mai multe opiuni.
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 ncrcarea 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 romn<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 ctre server (o dat ce butonul submit a fost
apsat) fr 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>
Aa cum se observ n tag-ul de mai sus, cu ajutorul atributului name specificm numele
controlului, iar cu ajutorul atributului value specificm valoarea care va fi trimis ctre server.
Este o component care se utilizeaz pentru a introduce un text mai lung, care se poate
ntinde pe mai multe linii.
Tag-ul su este: <TEXTAREA>...</TEXTAREA>.
39
Atributele sale sunt:
name numele de identificare al componentei;
rows numrul de linii pe care se ntinde componenta (implicit 2);
cols numrul de coloane pe care se ntinde componenta (implicit 20);
Dac dorim ca la ncrcarea 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 afiarea unei liste din care utilizatorul poate s aleag unul
sau mai multe opiuni.
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 opiuni din
list, innd apsat tasta control sau shift n timp ce d click pe acestea.
size numrul de opiuni care sunt afiate. 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>
Dei HTML-ul clasic permite redactarea unor documente hypertext de un nivel foarte nalt
i elaborat, o dat cu evoluia limbajelor de programare vizuale, a nceput s devin mai puin
atractiv dect 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 ct mai dinamice i ct mai interactive.
Pe lng HTML-ul propriu-zis, noile unelte recunoscute de browser-ele din ultima generaie
sunt CSS (Cascading Style Sheets), JavaScript i DOM (Document Object Model).
Scopul acestei lucrri nu este studiul amnunit 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 aceti identificatori n cadrul unui <STYLE>...</STYLE>, putem face ca toate
elementele de acelai fel din cadrul unui document s arate la fel. Astfel suntem scutii de a scrie o
grmad de cod care s-ar repeta n cazul fiecrui element de acelai 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 aceti
parametri la fiecare paragraf din document, este suficient s definim urmtorul 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 conin 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 arta toate paragrafele respectiv
toate liniile orizontale ale documentului.
Sintaxa definiiei este de felul urmtor: Se ncepe cu identificatorul elementului dorit a fi
formatat (n cazul nostru P tag-ul pentru paragraf, respectiv HR) ntre acolade trecndu-se
specificatorii de format (acetia in de limbajul CSS) dorii a fi modificai. 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 = limea;
height = nlimea.
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, precedndu-i de caracterul #. Aplicarea ulterioar a lor
asupra unui element, se face specificnd un nou atribut, i anume id=identificator unde
identificator este cel propriu, definit n cadrul lui STYLE (cel precedat de #)
Ex: dac inserm n codul de mai sus secvena urmtoare (tot n cadrul lui STYLE, dup
definiia lui HR, adic cea scris cu rou nchis):
#alt_paragraf {
color:green;
font-weight:bold;
}
Remarcai faptul c au fost aplicai doar cei doi specificatori de format definii n noul stil, i
anume culoarea fontului i faptul c scrisul este bold. Celelalte caracteristici (font-ul i culoarea
galben de fundal) au rmas cele definite tot n STYLE, n cadrul lui P.
n loc de a defini stilurile n cadrul antetului (HEAD), aa cum am artat mai sus, ele pot fi
scrise separat, ntr-un fiier text cu extensia .css, exact n aceeai manier n care le-am fi scris ntre
cele dou tag-uri prezentate, <STYLE>...</STYLE>.
Includerea efectiv a acestui fiier n cadrul HTML-ului se face tot n seciunea <HEAD>,
prin intermediul urmtorului tag:
<LINK rel="stylesheet" type="text/css" href="fisier_stil.css">
43
Iat un exemplu:
1) Coninutul fiierului 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 su formatele implicite pentru un tabel, rndurile
i celulele sale (TABLE, TR, TD, TH) precum i un identificator propriu, #TR1.
Iat i fiierul 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 stng, cum arat HTML-ul, datorit includerii acestui fiier CSS, iar
n partea dreapt cum ar fi artat acelai HTML, fr 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 dinamizrii paginilor web, limbajul JavaScript reprezint doar o unealt
de lucru (ai remarcat n paragraful anterior similitudinea dintre acesta i limbajul C). Pentru ca
limbajul JavaScript s acioneze asupra coninutului 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 programrii vizuale, DOM permite interceptarea anumitor evenimente (poziia
mouse-ului, click-uri, etc.) i tratarea lor difereniat.
Vom da n continuare, cteva exemple comentate, n care operm cu JavaScript + DOM.
1) Schimbarea unei imagini atunci cnd trecem cu cursorul peste ea: Pentru aceasta aplicaie
avem nevoie de doua fiiere imagine, care s fie, de preferabil, identice ca i dimensiuni, i obinute
una dintr-alta printr-un procedeu de genul negativ sau trecere la alb-negru.
Iat fiierele imagine pe care am testat script-ul urmtor:
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 aplicaia urmtoare, prin intermediul unui control de tip input type=text vom
cere utilizatorului s introduc un numr x ntre 4 si 20. Pe baza acestui numr (pe care-l validm)
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 crui celule le colorm alternativ, la fel ca pe o tabl de ah.
Pe lng codul surs am pus i o captur a ferestrei, in urma rulrii 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 FACILITI ALE ACESTUIA
PHP este un limbaj de programare destinat n primul rnd Internetului, aducnd dinamic
unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (este
gratuit i, n plus, utilizatorii pot aciona liber asupra procesului de dezvoltare) i server-side (codul
surs nu se ruleaz pe calculatorul celui care vizualizeaz pagina, ci pe serverul web).
Numele su 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 ctre Rasmus Lerdorf, pentru a genera un curriculum vitae i pentru a urmri numrul 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, pn 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 nelege o interfa a unui server de web, care
extinde funcionalitile acestuia. CGI nu se refer la un anumit limbaj de programare, ci definete
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 ctre o aplicaie scris
ntr-un anumit limbaj de programare, pentru ca apoi s ntoarc rezultatele acestei aplicaii napoi la
utilizator.
Limbajul PHP, n marea majoritate a cazurilor, se folosete sub form de secvene 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 asemntoare cu cea a unui cod scris n
limbajul C, mai ales n sensul n care structurile de programare au aceeai sintax i aceeai
funcionalitate.
Rolurile de baz ale unui script PHP constau n aceea c scipt-ul poate prelua date trimise de
ctre o pagin web de la un client (n general, datele pot fi trimise de ctre o pagin web prin
intermediul formularelor) i de a executa o secven de program n urma creia 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. Cerine tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii
asupra instalrii.
52
La momentul scrierii lucrrii de fa, ultima versiune public a XAMPP-ului este 1.6.7.
Fiierul executabil al installer-ului acestei versiuni este xampp-win32-1.6.7-installer.exe
2. Lansai n execuie installer-ul. Vom alege instalarea n limba englez. Lsm nemodificat
directorul propus pentru instalare (c:\xampp). n fereastra urmtoare vom bifa toate cele 3 csue
care ne propun instalarea server-elor Apache, Mysql respectiv Filezilla (acesta din urm fiind de
fapt un server de FTP) ca i servicii.
3. La sfritul instalrii, server-ul de web este deja funcional, avnd inclus att suport php ct 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 funcionalitatea server-ului web, deschidem un browser de internet, scriind
la adres: http://localhost.
Dac instalarea a fost fcut cu succes, ne apare o pagin din care suntem invitai s alegem
limba de operare, dup care suntem dui n pagina HOME a instalrii fcute.
Directorul rdcin al documentelor web este c:\xampp\htdocs.
n vederea testrii aplicaiilor PHP pe care le vom studia n continuare, vom crea n acest
director un alt subdirector phpapps.
Dup ce l-am creat, putem testa existena sa deschiznd browser-ul de internet n care
scriem adresa: http://localhost/phpapps
n browser trebuie s ne apar un director gol.
n mod implicit, toate fiierele 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 fiier n acest mod, la intrarea n directorul care l conine, n
loc de a ne arta ceea ce se gsete n acest director, serverul web ne va arta direct pagina coninut
de fiierul respectiv.
Spre deosebire de fiierele .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 fiierele s fie puse n directorul n care rezid documentele serverului web, iar
53
vizualizarea lor s fie fcut prin intermediul acestuia. n mod implicit, un fiier care conine un
script PHP trebuie s fie salvat cu extensia .php.
S crem primul nostru script PHP. Vom descrie operaiile necesare acestui lucru,
bazndu-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++) creai urmtorul fiier, pe
care l salvai n directorul de mai sus sub numele apl037.php (codul de mai jos este preluat aa
cum apare vizualizat n editorul Notepad++. Numele fiierelor aplicaiilor continu numrtoarea
din capitolul precedent):
Observai structura absolut identic celei a unui fiier HTML. Noutatea este adus de
scriptul PHP, care este inserat ntre tag-urile colorate n rou: <?php i ?>.
Instruciunea echo cuprins ntre acestea este o instruciune specific limbajului PHP, ea
avnd rolul de a scrie n pagina web textul ce urmeaz dup, cel cuprins ntre ghilimele.
S vizualizm acum pagina rezultat n urma acestui fiier. Pentru aceasta, deschidei
browser-ul de Internet, scriind urmtoarea adres: http://localhost/phpapps.
Dac XAMPP a fost corect instalat, vei obine urmtoarea pagin:
54
n pagin v este artat coninutul directorului n care am creat fiierul apl037.php, aa
cum este vizualizat prin intermediul serverului de web.
n aceast pagin facei un click pe fiierul apl037.php, pentru a-l vizualiza prin
intermediul serverului web. Dac totul este n regul, coninutul afiat n browser trebuie s fie
urmtorul:
Remarcai c, ceea ce vedem este rezultatul instruciunii echo din PHP. Dac se obine
altceva, nseamn c instalarea nu s-a fcut n mod corect.
Mai mult, s analizm codul surs generat. Pentru aceasta, n browser, executai comanda de
vizualizare a sursei (n cazul lui Internet Explorer, alegei din meniul View opiunea Source). Va
trebui s obinei urmtorul 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>
Aa cum am anunat, codul PHP, ba chiar nsui faptul c n aceast pagin ar exista vreun
script, nu sunt vizibile clientului, ci acesta vede doar rezultatul obinut n urma rulrii.
55
aceeai sintax. Sintaxa lui echo este uor de asimilat, prin analogie cu cout<< (entitile de afiat,
n loc s mai fie separate de << sunt separate de virgule). Remarcai, de asemenea, c la fiecare
afiare echo din cadrul repetitivei for, este afiat tag-ul <br>, pentru ca, n pagina vizualizat,
dup fiecare linie s se treac la rnd nou.
Iat rezultatul pe care trebuie s-l obinem n browser:
Din nou, vizualiznd codul primit de ctre browser, vom obine urmtorul HTML:
Remarcai din nou c, ceea ce ajunge la client este doar rezultatul execuiei script-ului PHP.
Observai c, dei tag-ul <BR> produce n browser trecerea la rnd nou, n cadrul vizualizrii sursei
obinute, codul este dezordonat, deoarece este scris una-ntr-una, fr Enter-uri.
Acest lucru, n mod normal, nu deranjeaz, atta timp ct aspectul paginii vizualizate n
browser are acelai aspect.
Totui, o aliniere este binevenit n cazul depanrii unui script, pentru c se poate urmri
mai uor apariia unei eventuale erori sau neconcordane.
Pentru acest lucru, n cadrul unui echo putem folosi, la afiare, oricte treceri la rnd 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 afiarea de \n-uri o
folosim n special pentru structurarea ordonat a acestuia.
56
n cazul aplicaiei de fa (apl038.php) s modificm linia a 8-a a sa (afiarea cu echo)
schimbnd-o n urmtoarea:
Aspectul su n browser rmne absolut nemodificat. Totui, vizualiznd codul surs, vom
remarca alinierea acestuia:
57
3.4. Constante. Variabile. Operatori. Afiarea datelor.
Constante
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
?>
Analizai legtura dintre codul surs de mai sus i alinierea fiierului obinut n browser
(deci afirile de \n din cadrul instruciunilor echo) :
Valoarea din variabila a este: 9.5<BR>
Noua valoare din variabila a este: <B><FONT color="red">Ana are mere
</FONT></B>
n PHP este posibil i adresarea indirect. Acest lucru nseamn c, dac o variabil conine
o expresie de tip string n care este reinut numele unei variabile, putem afia direct valoarea
variabilei reinut de string. Pentru aceasta se va folosi nc o dat caracterul $ (de forma $$x).
Operatori
Muli dintre operatorii limbajului PHP sunt cunoscui din C++. Acesta este motivul pentru
care vom prezenta doar anumite particulariti specifice limbajului PHP.
59
Pentru nceput, i prezentm, n ordine descresctoare a prioritilor 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, cunoscui din C++. Ca i n C++, ei se
aplic prefixat. Astfel, exist: (int) conversie ctre o valoare ntreag, (string) conversie
ctre ir, iar (double) conversie ctre 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>";
?>
Afiarea datelor
Dup cum am vzut deja, una dintre cele mai folosite instruciuni de afiare n PHP este
echo. Are dou forme:
a) data afiat se scrie ntre paranteze rotunde (aceast form nu poate fi folosit pentru
afiarea mai multor date): echo(Ana are mere);
b) datele afiate sunt scrise dup echo, fr a fi grupate ntre paranteze i separate prin
virgule: echo Ana are , 1+2, mere;
O alt instruciune de afiare este print. Dup ea urmeaz o singur dat, care poate fi sau
nu pus ntre paranteze. Funcioneaz ca i echo, n plus, n cazul n care folosim forma cu
paranteze, va ntoarce valoarea true dac afiarea a fost fcut cu succes, respectiv false n caz
contrar.
Alte dou instruciuni folosite n special pentru cazurile n care dorim s depanm un
program sunt:
61
var_dump(expresie) afieaz tipul expresiei urmat de valoarea sa;
print_r(variabila) n cazul unor variabile compuse (iruri, obiecte) produce o
afiare a tuturor componentelor ale acestora.
Observaii:
Dup cum am vzut deja prin exemplele date, n loc de ghilimele, se pot folosi i
apostrofuri. Diferena este dat de faptul c, n cazul folosirii ghilimelelor, dac irul de caractere
conine numele unor variabile, acestea vor fi evaluate, deci se va afia coninutul lor, pe cnd n
cazul apostrofurilor se va afia 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
?>
Instruciunile PHP sunt asemntoare cu cele din C. Din acest motiv, ne vom limita la o
scurt prezentare a lor i la cteva exemple de utilizare.
62
3.5.3. Instruciunea if.
Are aceeai form i funcionalitate ca i n C:
if(expresie) instruciune1;
[else instruciune2;]
Deci, dac expresia este evaluat ca fiind adevrat (sau diferit de 0) se execut
instruciune1. Dac este fals (sau 0) iar ramura else este prezent, se va executa
instruciune2. La fel ca i n C, dac n loc de o singur instruciune sunt mai multe, se vor
grupa ntr-un bloc.
Exemplu de script (apl047.php) care conine 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. Instruciunea do...while.
Are aceeai form i funcionalitate ca i n C:
do
instruciune;
while(expresie);
64
3.6. Transmiterea datelor prin intermediul formularelor.
Atributul action al tag-ului form se refer la numele fiierului PHP care se va ocupa de
prelucrarea datelor iar atributul method de metoda prin care sunt trimise datele ctre server.
Tag-ul <input type=text...> creeaz un cmp 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,
apsarea pe acest buton permite trimiterea coninutului ntregului formular ctre server.
Preluarea datelor trimise ctre server prin intermediul metodei POST, n cadrul unui script
PHP se face prin intermediul vectorului predefinit $_POST[nume_cmp_din_formular].
Atenie 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 ctre 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_cmp_formular].
n cazul n care un anumit cmp nu exist, n momentul cererii $_POST[...] din cadrul
PHP-ului, acesta s-ar putea sa genereze un mesaj de tip atenionare (warning) n funcie de setri.
Pentru a evita acest lucru, n faa caracterului $ (de la $_POST[...]) punem caracterul @.
Semnificaia acestuia este de a ignora mesajele de tip warning.
65
Iat i codul lui apl052.php, scriptul PHP pe care l-am anunat n atributul action al
formularului apl051.html, script care va trebui s se afle n acelai director cu apl051.html.
Scriptul preia valoarea cmpului text din form i afieaz att valoarea recuperat ct i ptratul su:
<?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 obinuit:
- n cazul unui input de tip text, am vzut deja cum se face acest lucru. n exact acelai
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.
Totui, n cazul n care un formular are dou sau mai multe butoane de tip sumbit, crora
vrem s le asignm funcii diferite, este foarte important s tim care dintre ele a fost apsat.
Iat mai jos un astfel de exemplu:
apl053.html + apl054.php primul fiier conine un formular cu dou cmpuri text, n care
introducem valori numerice. n funcie de controlul submit pe care-l apsm, al doilea fiier 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 nti c toate tag-urile de tipul
<input type=radio...> trebuie s aib la atributul name acelai nume, iar la atributul
value valori diferite, prin care vom identifica opiunea aleas. Aceast valoare va fi trimis ctre
PHP.
Iat un exemplu de utilizare al controlul de tip radio: apl055.html + apl056.php. Cu aceast
ocazie vom folosi i instruciunea switch a limbajului PHP, instruciune pe care nu am prezentat-o,
ns care are exact aceeai sintax i funcionalitate 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 ctre PHP valoarea indicat n atributul value a
tag-ului <input type=checkbox...> (ca ir de caractere). Dac acest atribut nu este prezent,
valoarea trimis ctre 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 setrile PHP-ului). Pentru ca acest lucru s nu
se ntmple, indiferent de setri, aa cum am anunat mai nainte, folosim caracterul @ n faa 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 operaia dorit prin intermediul unui control radio, o alegem cu
ajutorul controlului select. A se remarca faptul c fiierul care prelucreaz datele (apl060.php)
a rmas 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 ctre PHP un ir n care
vom regsi valorile selectate. Este obligatoriu, totui, ca atributul name din cadrul tag-ului
<select multiple ...> s specifice faptul c se va trimite un ir. Acest lucru se face punnd
un set de paranteze ptrate dup numele cmpului, deci de forma name=nume_sir[].
Preluarea n PHP se face n mod normal, prin @variabila=@$_POST[nume_sir]
(remarcai faptul c nu se mai pun []).
Acest ir va conine pe post de elemente valorile stabilite prin atributul value ale opiunilor
selectate. irul va ncepe de la indicele 0, numrul su total de elemente fiind dat de funcia
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 facilitile 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 crem un form cu 4 controale de tip input type="text", ale cror valori vor fi preluate de ctre
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 funcii ntr-un mod foarte similar fa de ceea ce tim din C/C++. S
considerm exemplul urmtor, n care se utilizeaz o funcie care calculeaz i ntoarce suma unui
numr ntreg pe care l primete ca parametru:
apl065.php:
<?php
function suma_c($n)//antetul funciei: se remarc folosirea cuvntului cheie
//function fr a se specifica vreun tip (nici mcar void)
{
$s=0;
while($n)
{
$s+=$n%10;
$n=(int)($n/10);//ne reamintim c n PHP operatorul / calculeaz
//ctul real (deci cu zecimale): din acest motiv folosim conversia
//explicit ctre int
}
return $s;//la fel ca i n C++, rezultatul ntors de funcie se specific
//prin intermediul instruciunii return
}
echo suma_c(13254);
?>
Aadar:
Pentru a ntoarce un rezultat din corpul unei funcii, se folosete, aa cum suntem deja
obinuii, instruciunea return. Forma sa general este: return expresie.
n cazul unei funcii care nu ntoarce rezultat (deci echivalentul unei funcii de tip void
din C++), cuvntul cheie function rmne obligatoriu (fr a specifica nimic suplimentar) putnd
s apar oriunde n cadrul funciei cuvntul cheie return fr a mai fi urmat de vreo expresie,
avnd ca efect ieirea imediat din funcie. El poate fi, de asemenea, omis, ieirea din funcie
producndu-se n acest caz n mod natural (dup executarea ntregului su cod).
Transmiterea parametrilor se poate face att prin valoare ct i prin referin, n acelai
mod n care se face i n C++ :
1) Parametrii specificai n mod direct (folosind doar numele variabilei) sunt cei transmii prin
valoare. Chiar dac valoarea unui astfel de parametru este schimbat n cadrul funciei, ea rmne
71
totui neschimbat dup executarea acesteia. Atunci cnd apelm funcia, pe poziiile acestor
parametri se pot transmite att valori ct i coninutul unor variabile.
Script-ul urmtor afieaz valoarea variabilei de dinainte de apelul funciei (10) chiar dac
n funcie 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 precedai de caracterul &
(ampersand) n antetul funciei. Dac valoarea unui astfel de parametru este modificat n cadrul
funciei, ea rmne modificat i dup executarea acesteia. Evident, atunci cnd apelm funcia, pe
poziiile acestor parametrii e obligatoriu s specificm variabile.
Relum scriptul anterior, punnd un & (ampersand) n faa parametrului $x. n acest fel,
valoarea variabilei dup ce apelm funcia nu va mai fi cea anterioar (10) ci cea obinut n urma
modificrii (20) apl067.php:
<?php
function test(&$x)
{
$x=$x*2;
}
$a=10;
test($a);
echo $a;
?>
n funcie de domeniul de vizibilitate, i n PHP variabilele se clasific n variabile locale
i variabile globale. Cele globale sunt cele definite n afara oricrei funcii. Implicit, ele nu pot fi
adresate din corpul vreunei funcii. Totui, exist o posibilitate de a face acest lucru: n cadrul
funciei n care vrem s utilizm variabile globale, le specificm pe toate, precedate de cuvntul
cheie global. Putei observa acest mecanism n exemplu urmtor:
apl068.php:
<?php
function suma()
{
global $a,$b,$c;
//functia se bazeaza pe cele 3 variabile globale $a, $b si $c
//calculnd 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 funcii sau cele create prin
transmiterea parametrilor formali (din antetul funciilor). Ele nu sunt recunoscute n afara funciilor.
i n PHP funciile pot fi recursive.
Pentru a nu ncrca foarte mult un anumit script, putem ngloba toate definiiile complete
ale funciilor ntr-un singur fiier de tip text (preferabil cu extensia .php, pentru a nu putea fi
vizualizat accidental prin intermediul server-ului http). Mecanismul includerii este unul asemntor
cu cel din C/C++ (clauza #include...) cu deosebirea c, putem include codul surs al funciilor
n orice loc dorim. Acest lucru se face cu ajutorul funciei predefinite PHP:
require(nume_fisier); .
Codul surs al funciilor trebuie inclus i el ntre tag-urile <?php .. ?>.
n exemplul de mai jos, vom crea dou fiiere: apl069.php, ce conine definiia corect a
unei funcii care verific dac un numr este prim, i un altul apl070.php, ce afieaz toate numerele
prime dintre 1 i n, folosind funcia din apl069.php:
apl069.php:
<?php
//a se remarca folosirea tag-urilor specifice includerii unei secvene 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 funcie 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 funciei 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 conin numeroase alte funcii. Iat cteva
dintre funciile matematice predefinite:
- abs(numr) ntoarce modulul numrului (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 aproximaie a numrului ;
- sqrt(x) calculeaz radicalul (rdcina ptrat) 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 nite variabile de sine stttoare.
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 sfritului de string prin caracterul de cod ASCII
0), n schimb, limbajul ne pune la dispoziie o serie de funcii 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 su, la fel ca n C/C++, ncepnd de la 0.
Funcia strlen(ir) ne ntoarce lungimea irului (numrul su de caractere).
Dac dorim s parcurgem irul de caractere, putem s-l parcurgem, ca n C++, de la 0 la
strlen(...)-1.
74
Funcia strpos(sir1, sir2, [poz_start]) caut dac sir2 este subir al lui sir1
(eventual ncepnd de la poziia poz_start, dac aceasta este specificat). n caz afirmativ,
ntoarce poziia de nceput a acestuia, altfel ntoarce false. n exemplul de mai jos se va afia
valoarea 3 (pentru c la indicele 3 este gsit secvena pu n stringul dat):
$s="computer";
echo strpos($s,"pu");
Funcia se utilizeaz i pentru a testa dac un ir include sau nu un anumit subir. Dac
subirul este gsit, funcia ntoarce poziia de nceput a acestuia iar dac nu, ntoarce false. Dup
cum tim, valoarea lui false este, de fapt, 0. Pentru a diferenia cazurile n care subirul nu apare
deloc n ir sau apare chiar de la poziia 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 funcie este reinut de variabila $gasit. Pentru a face distincie ntre
false i 0, folosim operatorul ===, care testeaz coincidena att ca valoare, ct i ca tip. De altfel,
acesta este i rostul unui astfel de operator. Acest procedeu se poate folosi i pentru alte funcii.
Funcia strstr(sir1, sir2) returneaz din sir1 secvena de caractere din poziia n
care a fost gsit prima apariie a lui sir2, dac sir2 este subir pentru sir1 sau false, n caz
contrar.
Funcia strcmp(sir1, sir2) compar lexicografic (alfabetic) sir1 cu sir2. Valoarea
ntoars este:
- pozitiv, dac sir1 se gsete lexicografic dup sir2; (sir1>sir2)
- nul (0), dac sir1 este identic egal cu sir2; (sir1==sir2)
- negativ, dac sir2 se gsete lexicografic nainte de sir1. (sir1<sir2)
n PHP se pot folosi deopotriv i pentru stringuri operatorii relaionali: <, <=, >, >=, ==,
!=, care le compar direct, n sens lexicografic, avnd ca rezultat true sau false.
Observaie: Comparaia face distincie ntre literele mari i cele mici (codul ASCII) !
Funcia substr(sir, indice, [lungime]) ntoarce subirul irului ir, care ncepe
n poziia indice i are lungimea lungime. Dac parametru lungime este absent, se ntoarce irul
care ncepe n poziia indice i ine pn la sfritul 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
Funcia substr_replace(sir1, sir2, ind, [lung]) ntoarce irul rezultat prin
nlocuirea n sir1, a subirului care ncepe n poziia ind i are lungimea lung, cu sir2. Dac
parametrul lung este absent, sir2 nlocuiete subirul care ncepe cu ind i ine pn la sfritul
irului ir1, cu ir2.
Exemplu: apl073.php
<?php
$s="Ana are mere";
echo substr_replace($s,"poseda",4,3); //nlocuiete subirul are (care ncepe la
//indicele 4 i are 3 litere) cu subirul poseda, deci afieaz Ana poseda mere
?>
Funcia strtoupper(sir) ntoarce irul rezultat prin conversia doar a acelor caractere
sunt litere mici, la litere mari, iar funcia strtolower(sir) ntoarce irul rezultat prin conversia
literelor mari la litere mici.
Funcia strtok(...) este utilizat pentru extrage substringuri ale unui string, care n
acesta sunt delimitate de nite caractere ce aparin unui ir cu delimitatori, dat. De exemplu, dac
avem stringul Ana? Nu, doar tu. i considerm stringul cu separatori: .? #, (este i un caracter
spaiu printre ele) se vor separa i obine substringurile Ana, Nu, doar, tu.
Modelul de aplicare:
- iniial se apeleaz funcia strtok(string, ir_cu_separatori). Funcia va
ntoarce fie primul cuvnt obinut prin separare, fie false dac acest lucru nu a fost posibil.
- apoi se apeleaz funcia strtok(ir_cu_separatori). Aceasta va tot extrage
cte un cuvnt nou obinut prin separare, fie false dac s-a ajuns deja la sfrit, deci dac au fost
separate toate cuvintele.
Este recomandat ca testarea valorii false ntoars de funcie s fie testat cu operatorul
=== deoarece, n caz contrar este posibil s apar erori din cauza conversiilor (de exemplu, funcia
s ntoarc 0, iar acesta s fie interpretat ca i false).
De remarcat, spre deosebire de limbajul C++, c funcia strtok NU distruge stringul asupra
creia 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 puine constrngeri dect n C/C++ atunci cnd lucrm cu iruri sau
cu matrice. n primul rnd, n PHP un ir nu se declar. n momentul n care dorim s crem 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 numete tablou asociativ. De exemplu, putem crea un ir n care s reinem pe
post de indici denumirile unor produse, iar pe post de indici preurile 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 instruciune 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)
instruciune;
Funcia count(vector) ntoarce numrul total de elemente (folosite, deci crora 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 funcii care faciliteaz accesul la elementele vectorului. Acestea se bazeaz pe
urmtoarea particularitate a implementrii 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 funcii cu ajutorul crora 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>";
79
3.10. Programare grafic utiliznd PHP.
Una dintre cele mai spectaculoase componente ale multor limbaje de programare, din pcate
lsat 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, incluznd gif, png, jpg. Ba mai mult, PHP
poate genera o imagine sub forma unui flux de date (deci fr a o nregistra efectiv sub forma unui
fiier pe server) direct ctre browser.
Pentru a face funcional suportul grafic al limbajului, este necesar utilizarea bibliotecii gd2.
n cazul pachetului XAMPP, aceasta este instalat i activat n mod implicit. n cazul altor
distribuii, acest lucru trebuie fcut manual.
Pentru nceput, s vedem cum se poate crea n mod dinamic o imagine: vom crea un script
PHP, a crui deschidere, n browser, va avea ca efect vizualizarea imaginii create de ctre acest
script. Vei remarca faptul c, o serie de elemente (imaginile, textul, culorile) au nevoie de nite
variabile numite variabile resurs.
Din pcate, spre deosebire de o serie de alte limbaje de programare, nu exist constante
predefinite pentru culori, ci acestea trebuie s fie create manual, specificnd pentru fiecare
componentele de rou, 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 numr de la 0 la 255.
Script-ul conine comentariile necesare nelegerii codului su. Dup prezentarea sa vom
relua detaliat fiecare dintre funciile 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 cteva dintre cele mai importante funcii 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 informaii despre mime-type-ul imaginii
create. Astfel, valorile pe care le putem da string-ului, n funcie de tipul imaginii pe care o crem,
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 funcie s fie apelat
nainte de trimiterea oricrui alt output din cadrul script-ului n care apare;
imagecreatetruecolor(lime, nlime)- creeaz o resurs de tip imagine, pe
32 de bii (truecolor) avnd limea, respectiv nlimea specificat. Rezultatul ntors de aceast
funcie trebuie obligatoriu atribuit unei variabile, prin intermediul creia 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 gsete n coul stnga-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..lime-1, respectiv 0..nlime-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
puin 2 pixeli;
imageellipse(resurs_imagine,x0,y0,diam_x,diam_y,resurs_culoare)
- deseneaz o elips cu axe paralele cu axele de coordonate, avnd 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 avnd colurile 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 colurile 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, avnd 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),
schimbnd culoarea tuturor punctelor conectate (indiferent ce culoare au) n noua culoare dat de
res_culoare, pn la ntlnirea culorii specificate prin parametrul culoare_border;
imagecopy(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,width,height)
copiaz din imag_sursa, poriunea rectangular care are colul stnga sus la
coordonatele (xsrc,ysrc) i lungimea, respectiv nlimea, date de (width,height)n
imag_dest, ncepnd 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, poriunea rectangular care are colul stnga-sus la
coordonatele (xsrc,ysrc) i lungimea, respectiv nlimea, date de (widthsrc,heightsrc) n
imag_dest, ncepnd de la coordonatele (xdest,ydest), redimensionnd astfel nct noua lime
respectiv nlime s fie (widthdest,heightdest);
imagerotate(res_imag,unghi,culoare_fundal) rotete imaginea din
res_imag cu unghiul unghi (specificat n grade !). Centrul rotaiei este centrul imaginii, iar
imaginea rotit este redimensionat la scar, astfel nct ntreaga imagine rotit s ncap: marginile
nu sunt decupate. Poriunile rmase neacoperite n urma rotaiei, se vor colora cu
culoare_fundal;
imagecreatefrompng(nume_fiier)respectiv
imagecreatefromjpeg(nume_fiier) funcioneaz analog, pentru imagini de tip
PNG respectiv JPG;
imagegif(res_imagine), imagepng(res_imagine), imagejpeg(res_imagine)
produc afiarea n browser (deci trimiterea fluxului de date ctre acesta) a imaginii
specificat de res_imagine. n funcie de tipul imaginii (GIF, PNG sau JPG) folosim varianta
convenabil a acestei funcii;
imagedestroy(res_imag) produce dezalocarea ntregii memorii asociate imaginii
reprezentat de res_imag;
84
getimagesize(nume_fiier) ntoarce un array (ir) ce conine informaii despre
imaginea din fiierul nume_fiier. Informaiile se gsesc structurate astfel:
- la indicele 0 se gsete limea (width);
- la indicele 1 se gsete nlimea (height);
- la indicele 2 se gsete o constant care ne indic tipul imaginii (posibile valori
pentru acest element sunt: IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, etc.);
- la indicele 3 se gsete un string de forma height="yyy" width="xxx", pentru
a putea fi folosit direct ntr-un tag <IMG....>
- la indicele mime se gsete un string ce conine tipul MIME corespunztor
imaginii;
Prin aciunea de upload, utilizatorul poate ncrca, prin intermediul unei pagini web, un
ntreg fiier (indiferent c este un fiier binar sau un fiier text) pe server-ul pe care este stocat i
pagina respectiv.
La nceputurile dezvoltrii internetului, s-a pus desigur aceast problem, a transferului de
fiiere. Rezolvarea a fost gsit atunci prin implementarea unui protocol de transferare de fiiere
ntre dou calculatoare care sunt legate ntre ele. Este vorba de FTP (File Transfer Protocol), care
dei este o metod eficient de transfer, este greoi de folosit de un utilizator nespecializat (necesit
specificarea adresei calculatorului la care ne conectm, 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 uor
de folosit de ctre orice utilizator al internetului, cel care face operaia avnd nevoie doar de cteva
cunotine minimale de utilizare a calculatorului.
Cea mai frecvent aciune de upload din parte unui utilizator obinuit este ntlnit la
ataarea unui fiier la un e-mail.
Care este principiul de funcionare ?
n primul rnd, 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 crora 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 fiier de pe disc pentru a fi ncrcat.
n etapa urmtoare, dup ce utilizatorul apas, tot n acel form, butonul de postare date,
fiierul ales pentru upload va fi trimis ctre server, tot prin intermediul unui script (cel specificat n
85
cadrul atributului action=... al formularului) i copiat ntr-o locaie temporar. Treaba
programatorului PHP este ca el s copieze fiierul la locaia sa definitiv.
Atenie ! Pentru ca upload-ul s funcioneze, att directorul temporar n care este ncrcat
fiierul, ct i directorul n care vom muta acest fiier trebuie s aib drepturi de scriere pentru orice
utilizator de pe Internet.
n mod implicit, directorul temporar al instalrii XAMPP-ului are aceste drepturi stabilite de
la instalarea ntregului pachet. Dac ele nu sunt corect setate, va trebui s le configurai manual. n
tot cazul, pentru directorul n care vei muta fiierul, va trebui obligatoriu s le configurai.
Voi exemplifica modul n care se face acest lucru pentru directorul tmp al instalrii
XAMPP. Pentru directorul destinaie, vei proceda analog.
Astfel, deschidei un Windows Explorer. V asigurai c opiunea Use simple file
sharing (Recommended) NU este bifat (pentru a ajunge la aceast opiune deschidei din
meniul Tools submeniul Folder Options i apoi accesai tab-ul View. n cadrul acestuia sunt
mai multe opiuni printre care i cea de mai sus), dup care mergei pe directorul temporar al
instalrii xampp (n mod implicit C:\xampp\tmp), NU intrai n director, ci dai click dreapta pe el,
alegnd opiunea Properties, apoi tab-ul Security. n acest tab, alegei Add, scriei numele
network, i apoi alegei din lista ce vi se deschide utilizatorul network. Dup ce l-ai ales,
asigurai-v c are drepturi de scriere n directorul tmp (bifai, n csuele de sub el, i opiunile
Modify respectiv Write).
n cadrul script-ului PHP care se ocup de preluarea fiierului ncrcat, ne vom folosi de un
masiv predefinit al limbajului, i anume $_FILES, care ne va furniza date despre fiierul ncrcat, 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 fiierului pe care l-
am upload-at;
$_FILES[nume_input][tmp_name] ne ntoarce numele complet (cu tot cu calea)
fiierului temporar care s-a creat n urma upload-ului. Atenie ! acest nume poate s fie complet
diferit fa de cel original.
$_FILES[nume_input][type] ne ntoarce tipul mime al fiierului (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 octei) a fiierului
upload-at
$_FILES[nume_input][error] ne ntoarce codul de eroare al operaiei de upload
asupra fiierului dat de nume_input. Dac operaia s-a ncheiat cu succes, are valoarea 0.
86
Exemplu: Urmtoarele dou script-uri realizeaz o aplicaie prin care putem upload-a un fiier n
acelai director n care se afl i sursele aplicaiei.
Primul fiier reprezint un HTML obinuit, ce conine doar form-ul prin care se poate face upload-
ul fiierului, iar al doilea fiier reprezint script-ul PHP care preia fiierul 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
//funcii 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);
Observaii !
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 acelai nume, dar cu data de expirare
naintea celei curente (de exemplu, time()-1).
Pentru a citi (recupera) valoarea unei variabile cookie, se utilizeaz coninutul 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, reine valoarea
variabilei respective.
Exemplu: instruciunea de mai sus afieaz valoarea variabilei cookie creat prin exemplul
anterior:
echo $HTTP_COOKIE_VARS[limba_pref];//afieaz romana
Exemplu: Script-ul care urmeaz exemplific modul n care se pot reine anumite informaii
pe care utilizatorul le-a tastat o dat. Apelat pentru prima dat, atunci cnd nu exist variabila
cookie numit loc, se cere tastarea localitii n care se afl cel care viziteaz pagina. Dac acel
vizitator reintr pe acel site, reapelnd 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 afia 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
mulime de aplicaii, extrem de utile, care le utilizeaz, cum ar fi: aplicaii de contorizare, comer
electronic, vot electronic, aplicaii de comunicare.
De unde SQL ? n domeniul crerii i utilizrii bazelor de date relaionale s-a impus
necesitatea existenei unui limbaj standard care s permit efectuarea acestor operaii. Astfel, a
aprut SQL Structured Query Language. Limbajul a fost supervizat de comisia de standardizare
ANSI (American National Standards Institute), motiv pentru care se mai numete i ANSI SQL.
SQL nu este un limbaj de firm, ci el este implementat de o mulime de SGBD-uri
consacrate, cum ar fi Microsoft Access, Oracle, Microsoft SQL Server i, bineneles, MySQL.
MySQL este un limbaj specializat pentru gestiunea bazelor de date relaionale pe Internet,
avnd la baz limbajul SQL. MySQL gestioneaz baze de date care se gsesc 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 anunat 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 gsete n directorul C:\XAMPP\MYSQL.
n subdirectorul BIN al acestuia se gsesc o serie de programe utilizare, care permit configurarea i
operarea imediat cu serverul de baze de date. Utilitarul pe care o s-l utilizm cel mai des este
mysql.exe. Pentru a-l putea accesa din orice alt locaie a calculatorului v-ai afla, este
recomandat s adugai calea spre el (C:\XAMPP\MYSQL\BIN) n variabila PATH a sistemului.
Acest lucru se face executnd un click dreapta pe My Computer, alegnd apoi tab-ul Advanced,
apoi butonul Environment Variabies. Din fereastra care se deschide, derulai n partea de jos
(seciunea System Variables) pn ntlnii variabila PATH. Dai dublu click pe ea (sau apsai
butonul Edit de dedesubt) i, la sfritul irului de caractere deja existent acolo, adugai
caracterul ; urmat de calea C:\XAMPP\MYSQL\BIN.
Din acest moment, utilitarul mysql se poate rula din orice locaie (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, lansai dintr-un Command Prompt sau din Start + Run urmtoarea
comand: mysql u root p
Atunci cnd suntei invitai s introducei parola (prin Enter password:) trebuie s dai
Enter. n cazul n care conectarea a reuit, vei primi un mesaj de ntmpinare, iar prompt-ul se va
schimba n : mysql>... (pentru a v deconecta de la server, n dreptul acestui prompt trebuie s
scriei comanda quit dup care dai Enter).
Din acest suntei conectai la baza de date. n continuare vom da cteva comenzi pentru a
configura serverul, baza de date asupra creia 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 rnd, vom terge toi utilizatorii predefinii, 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.
Atenie s nu uitai caracterul ; dup fiecare comand executat. De asemenea, dup fiecare
comand dai un Enter:
mysql>use mysql; prin aceast comand intrm n baza de date administrativ, cu numele mysql
mysql>delete from user where user!=root or host!=localhost;
prin aceast comand tergem toi utilizatorii predefinii, lsnd utilizatorul root cu drepturi de conectare de pe
maina local
mysql>update user set password=password('parolanou') where user='root';
prin aceast comand schimbm parola utilizatorului root, de la parola vid (pe care o avea de la instalare) cu
noua parol (evident, irul de caractere parolanou l nlocuii cu noua parol)
mysql>create database lucru;
prin aceast comand crem 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 crem utilizatorul cu numele utilizator, cu parola parola (evident, le vei schimba
dup bunul plac) ce se poate conecta de pe maina local, i are drepturi de lucru doar n baza de date lucru
mysql>flush privileges;
prin aceast comand facem ca toate modificrile efectuate pn n momentul de fa s devin efective i
operative.
mysql>quit;
i ieim din monitorul mysql
Putem testa imediat instalarea, prin conectarea la serverul mysql cu noul utilizator creat
(lansai aceast comand fie din Command Prompt fie din Start+Run) :
90
mysql u utilizator p
n momentul n care vi se cere parola, introducei, evident, parola definit mai sus.
Dup conectarea la MySQL, pentru a stabili ca punct de lucru baza de date asociat acestui
utilizator, vei da comanda:
mysql>use lucru;
dup care vei putea testa toate comenzile ce urmeaz s fie testate n paragrafele urmtoare.
3.13.4. Tabele.
ntr-o tabel coloanele sunt identificabile prin nume, iar rndurile, prin valorile pe care le
memoreaz. Toate datele dintr-o coloan au acelai tip. O tabel are un numr specificat de coloane,
ns are un numr nespecificat de rnduri. Uneori, cnd ne referim la un rnd, folosim i termenul
de nregistrare, iar atunci cnd ne referim la data din rnd, situat ntr-o anumit coloan, folosim i
termenul de cmp.
Instruciunea prin care se poate crea o tabel este prezentat mai jos; ceea ce este trecut
ntre paranteze drepte reprezint clauze, atribute sau buci de instruciune care, din punct de vedere
sintactic (n funcie de fiecare caz) pot s nu apar:
91
create table nume_tabel
( nume_coloan1 tip_date [specificatori],
nume_coloan2 tip_date [specificatori],
...
nume_coloann tip_date [specificatori]
);
Adugarea unui nou rnd ntr-o tabel se face prin instruciunea de mai jos, n care se
introduc, pe rnd, valori pentru toate cmpurile 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 utilizrii bazelor de date, instruciunea anterioar este considerat ca generatoare
de erori, deoarece fie se poate grei ordinea de introducere a datelor, fie pe parcursul dezvoltrii se
insereaz coloane noi ntre cele deja existente, iar efectul ar fi acela c tabela va conine date
eronate. Din acest motiv este preferat forma urmtoare a instruciunii, dei este necesar s scriem
mai mult:
insert into nume_tabel(nume_coloan1,nume_coloan2,...,nume_coloank)
values(valoare1,valoare2,...,valoarek);
Se pot omite coloane (caz n care ele vor primi automat valori NULL) i bineneles c
putem scrie coloanele n orice ordine dorim.
Exemplu: mai adugm dou linii la tabela anterioar: una n care nu completm numrul
de locuitori i alta n care trecem toate cele 3 valori, ns n alt ordine dect 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 executm: | ind | nume | nrloc |
+------+-----------+--------+
select * from judete; | CJ | Cluj | 702755 |
| BV | Brasov | 589028 |
se va afia n urmtorul format: | CL | Calarasi | NULL |
| MM | Maramures | 510110 |
+------+-----------+--------+
4 rows in set (0.02 sec)
Dac dorim s afim doar anumite coloane ale tabelei, n ordinea pe care o dorim,
folosim forma de mai jos a instruciunii:
select nume_coloana1,...,nume_coloanak from tabel;
Se observ faptul c, atunci cnd afim tabela, n antetul (capul de tabel) su se trece
numele coloanelor acesteia. Dac dorim ca n antet s figureze alt nume pentru o coloan, atunci, n
instruciunea de mai sus, n loc de a scrie doar numele coloanei, vom scrie numele coloanei urmat
de cuvntul cheie AS i de numele care dorim s fie afiat n antet. Astfel, prin cuvntul cheie AS,
am definit alias-uri pentru numele coloanelor.
Exemplu: pentru tabela din exemplele anterioare, am putea scrie urmtoarea 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 afiarea sub urmtorul format:
Pentru listarea numelor tuturor tabelelor din baza de date, folosim comanda urmtoare:
show tables [from nume_baz_date];
Dac nu specificm clauza [from nume_baz_date] se vor afia toate tabelele din baza
de date curent (cea ctre care am dat use);
Pentru a afia o descriere detaliat a unei tabele (numele coloanelor, tipurile lor) se
folosete una dintre comenzile (ele fac acelai lucru):
describe nume_tabel;
show columns from nume_tabel;
93
a) iruri de caractere:
char[(n)] reine un ir de caractere de lungime n (fix). n caz c n nu este precizat,
reine un singur caracter. Ocup n octei;
varchar[(n)] reine un ir de cel mult 255 de caractere. Ocup n+1 octei;
tinytext[(n)] este echivalent cu varchar[(n)];
text[(n)] reine un ir de cel mult 65535 caractere. Ocup n+2 octei;
mediumtext[(n)] reine un ir de cel mult 16.777.215 caractere. Ocup n+3 octei;
longtext[(n)] reine un ir de cel mult 4.294.967.295 caractere. Ocup n+4 octei;
enum un cmp care poate reine un singur ir de caractere dintr-un vector de iruri de
caractere predefinit de ctre utilizator la crearea tabelei. De altfel, tabela va memora vectorul de
iruri de caractere, iar n acest cmp se va reine doar indicele elementului corespunztor din vector.
Vezi exemplele de dup;
set la fel ca la enum, doar c un cmp de acest tip poate reine unul sau mai multe iruri
de caractere din vectorul predefinit de ctre utilizator. Vezi exemplele de dup.
Exemplu (pentru tipul enum): crem o tabel n care trecem civa 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 ntmpl deoarece ultimul curent introdus, +------------------+------------------+
| nume | curent |
renastere nu apare printre stringurile din enum, +------------------+------------------+
| Gustave Klimt | art nouveau |
permise pentru acest cmp. Totui, n urma | Vincent Van Gogh | postimpresionism |
| Alphonse Mucha | art nouveau |
execuiei sale, pictorul cu numele Tiziano | Auguste Renoir | impresionism |
| Rene Magritte | suprarealism |
Vecellio va fi trecut n tabel, ns n dreptul | Tiziano Vecellio | |
+------------------+------------------+
curentului su va fi trecut irul vid:
Exemplu (pentru tipul set): crem o tabel n care trecem numele ctorva persoane i hobby-urile
lor favorite, dintre muzic, sport i desen. Vom ncerca i de aceast dat s punem valori invalide.
Efectul este asemntor 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. Reine nr. ntregi cuprinse ntre -128..127. Dac este
urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..255;
smallint[(n)] ocup 2 octei. Reine nr. ntregi cuprinse ntre -32768..32767. Dac
este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..65535;
mediumint[(n)] ocup 3 octei. Reine nr. ntregi cuprinse ntre -8388608..8388607.
Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..16777215;
int[(n)] ocup 4 octei. Reine nr. ntregi cuprinse ntre -2147843648..2147843647.
Dac este urmat de cuvntul unsigned reine numere naturale cuprinse ntre 0..4294967295;
bigint[(n)] ocup 8 octei. Reine nr. ntregi cuprinse ntre -9223372036854775808
i 9223372036854775809. Dac este urmat de cuvntul unsigned reine numere naturale cuprinse
ntre 0..18446744073709551615;
float ocup 4 octei este echivalentul tipului cu acelai nume din C/C++;
double ocup 8 octei este echivalentul tipului cu acelai nume din C/C++;
decimal(n,d) numrul este stocat sub form de ir de caractere. Parametrul n
reprezint numrul de cifre nenule aflate naintea virgulei (cu tot cu semnul pentru numerele
negative, dac este cazul) iar d reprezint numrul de zecimale.
c) Tipuri pentru dat i or:
year un cmp de acest tip reine un an calendaristic. Acetia se introduc ca i ir de
caractere;
time un cmp de acest tip reine o anumit or dintr-o zi. Se introduce sub forma unui
ir de caractere, de forma hh:mm:ss;
date un cmp de acest tip reine o anumit dat calendaristic. Se introduce sub forma
unui ir de caractere, de forma yyyy-mm-dd;
datetime un cmp de acest tip reine 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, putei utiliza instruciunea select. | 5+7 |
+-----+
De exemplu, dac dai comanda select 5+7; se va afia un rezultat ca n | 12 |
+-----+
imaginea alturat:
Observaie important: n MySQL exist o valoare special numit Null.
Semnificaia ei este de valoare necunoscut. Reinei faptul c, dac Null este un operand al
oricrei expresii, rezultatul oricrei operaii care se efectueaz cu Null este Null.
Operatorii se mpart, la rndul lor, n mai multe grupe. Acestea sunt prezentate n
continuare:
a) Operatori aritmetici:
Acioneaz asupra tipurilor numerice i furnizeaz o valoare de tip numeric:
+ adunare (Ex: 2+3 are ca rezultat valoarea 5);
- scdere (Ex: 2-3 are ca rezultat valoarea -1);
* nmulire (Ex: 2*3 are ca rezultat valoarea 6);
/ mprire cu zecimale (Ex: 5/4 are ca rezultat valoarea 1.25);
div mprire cu zecimale (Ex: 15 div 4 are ca rezultat valoarea 3);
mod i % mprire 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 relaionali):
Permite compararea a dou valori numerice sau a dou iruri de caractere. irurile de
caractere se compar lexicografic i nu se face distincie ntre literele mari i literele mici.
Rezultatul este 1 pentru adevrat 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);
Observaie: se pot compara, de altfel, cu aceti 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 cnd ambii operanzi sunt 0, n rest este 1);
&& sau and i-ul logic (este 1 doar cnd ambii operanzi sunt nenuli, n rest este 0);
not negaie (negaia lui 0 este 1, iar negaia lui 1 este 0);
xor sau-ul exclusiv (este 0 cnd ambii operanzi sunt fie nuli, fie nenuli, i este 1 n rest);
d) Operatori logici pe bii:
Se aplic tuturor tipurilor ntregi i acioneaz asupra tuturor biilor aflai pe poziii
corespondente.
| sau-ul pe bii;
& i-ul pe bii;
^ sau-ul exclusiv pe bii;
~ negaia pe bii;
e) Operatori de deplasare pe bii:
Se aplic tuturor tipurilor ntregi, deplasnd biii reprezentrii binare:
<< deplasare la stnga: a<<b deplaseaz cu b poziii la stnga biii lui a;
>> deplasare la dreapta: a>>b deplaseaz cu b poziii la dreapta biii 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! Atenie, compararea cu null ntoarce, conform unei observaii
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 aparine sau nu unei mulimi
(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 subir, dac acesta conine un anumit subir. Forma
sub care se utilizeaz este string like ablon respectiv string not like sablon. ablon
este tot un string, n care se folosesc urmtoarele caractere speciale: % pentru un numr 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 gsete 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 corespunztoare, 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 condiiile n ordinea
scrierii. Prima care este adevrat va
. . . ntoarce valoarea valk
when condn then valn corespunztoare. Dac nici una nu
este advrat, 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
aceleai 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 ctre 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 att valoarea 4 variabilei @a, valoarea 5
variabilei @b ct i valoarea 9 variabilei @c
select @a; pentru verificare, afim apoi valorile
select @b; celor trei variabile
select @c;
rtrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din dreapta;
99
ltrim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile din stnga;
trim(x) ntoarce irul obinut din x prin eliminarea spaiilor inutile att din dreapta ct
i din stnga;
upper(x) ntoarce irul obinut prin convertirea tuturor literelor mici la litere mari;
lower(x) ntoarce irul obinut prin convertirea tuturor literelor mari la litere mici;
find_in_set(x,string) ntoarce indicele apariiei irului x n irul de entiti
separate prin virgule din cadrul lui string. Ex: find_in_set(mimi,cici,mimi,lola) va
ntoarce valoarea 2.
format(x,d) convertete 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, ntorcnd -1 dac x<y, 0
dac x=y, 1 dac x>y. Nu face distincie ntre literele mari i cele mici;
100
d) Funcii specifice MySQL:
if(exp1,exp2,exp3) dac exp1 este nenul (adevrat) funcia va ntoarce exp2, n
caz contrar ntorcnd exp3.
Observaie: 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 afia rezultatul acestei interogri:
+----------+--------+------+--------+----------+
| 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: crem o tabel studenti n care trecem numele, virsta si starea civil. Ultimelor
dou cmpuri 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 coninutul 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 cnd dm cheia. Trebuie s precizm c, nregistrrile unei tabele se rein n ordinea
introducerii lor. Atunci cnd, de exemplu, un cmp este declarat cheie primar, se construiete o
tabel auxiliar, invizibil pentru utilizator, n care se trec valorile cheilor, n ordine cresctoare,
pentru fiecare cheie reinndu-se poziia rndului (liniei) din tabel, care are acea cheie.
Practic, pornind de la o anumit cheie, n tabela invizibil se poate identifica foarte rapid
numrul de ordine (poziia) al rndului cu acea cheie (se folosete cutarea binar). De aici, accesul
la acel rnd (nregistrare) este imediat.
Pentru a preciza faptul c o anumit coloan este cheie primar, atunci cnd 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 cnd
definim tabela, folosim specificatorul primary key(coloan1,...,coloank) 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 cmp. Se folosete atunci cnd, 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 folosete ca n exemplul de mai jos:
create table test(nr_matr char(10) primary key,
nume text,cnp char(13) unique key);
104
Iat coninutul tabelei dup comenzile de mai sus:
+----+------+
| id | nume |
+----+------+
| 1 | cici |
| 2 | mimi |
| 3 | lola |
+----+------+
Afiarea datelor ntr-o anumit ordine se face tot cu ajutorul interogrilor: ntr-o interogare
ale cror date dorim s le sortm, specificm, la sfritul comenzii, clauza:
order by expresie1[desc], expresie2[desc],...
specificatorul desc este folosit n cazul n care dorim ca sortarea s fie descresctoare.
Sortarea dup mai multe expresii are urmtoare semnificaie: dac pentru dou linii
expresie1 nu este suficient pentru a determina ordinea (deci pentru ambele, are aceeai valoare)
se consider mai departe expresie2. Dac nici expresie2 nu este suficient, se ia n considerare
expresie3, i aa mai departe.
Exemple:
select * from tabela order by nume; se afieaz toate datele din tabel, ns
sortate dup coloana nume
select * from tabela order by media desc,nume; se afieaz toate datele din
tabel, sortate descresctor 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
afieze doar anumite rnduri
Pentru aceasta se folosete 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 urmtoarele dou forme:
- limit n din ceea ce s-ar afia n mod normal, se afieaz doar primele n linii;
- limit m,n din ceea ce s-ar afia n mod normal, se afieaz doar ncepnd de la
a m+1-a linie (prima linie este numerotat cu 0) un numr de n linii.
105
3.13.14. Filtrarea datelor.
Se face tot cu ajutorul interogrii select: prin specificarea clauzei where condiie se
vor afia doar acele linii ale tabelei pentru care condiia este evaluat ca fiind adevrat.
Clauza poate fi utilizat n acelai timp cu clauza precendet (order by) care realizeaz
sortarea. n aceast situaie, trebuie specificat mai nti clauza where, i abia apoi clauza order by.
Iat mai jos cteva exemple:
select * from tabela where nume like a%; afieaz din tabel, doar acele
linii pentru care numele ncepe cu litera a
select * from tabela where nume like a% order by media desc;
afieaz din tabel, doar acele linii pentru care numele ncepe cu litera a, n ordinea
descresctoare a mediilor.
Exemple:
select * from tabela order by nume limit 5; n urma sortrii dup coloana
nume, se afieaz doar primele 5 linii;
select * from tabela limit 1,3; se afieaz 3 linii din tabel ncepnd de la
linia a 2-a.
Prin actualizare a unei tabele nelegem operaia (operaiile) prin care modificm fie datele
reinute de aceasta, fie modificarea structurii, fie modificarea numelui tabelei.
a) pentru actualizarea datelor:
pentru inserarea unei noi linii n tabel, se folosete instruciunea:
insert into nume_tabel[(nume_coloan1,...,nume_coloann)]
values(expr1,...,exprn)
funcionalitatea acestei instruciuni 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_coloan1,...,nume_coloann)]
select ...
specificatorul distinct se folosete pentru a insera doar datele distincte (care nu apar deja n
tabela n care inserm) din tabela surs.
106
b) pentru modificarea datelor se utilizeaz urmtoarea instruciune:
update nume_tabel set coloan1=exp1,..,coloann=expn [where condiie]
n urma execuiei sale, pentru fiecare rnd din tabel care ndeplinete clauza where, se
actualizeaz coloanele indicate de set cu expresiile corespunztoare.
Observaie (!): n absena clauzei where vor fi modificate toate rndurile tabelei.
c) pentru tergerea uneia sau a mai multor linii ale unei tabel se utilizeaz instruciunea:
delete from nume_tabel where [conditie];
Observaie (!): n absena clauzei where vor fi terse TOATE (!) liniile tabelei;
f) pentru adugarea (inserarea) unei coloane noi, cu un anumit tip de date, se utilizeaz
instruciunea:
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
aduga la sfrit. Dac este prezent cel puin 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 funciilor agregate:
count() sub forma count(*) determin numrul total de linii ale tabelei. Sub forma
count(nume_coloan) numr cte dintre valorile de pe acea coloan nu sunt null;
min(nume_coloan) determin cea mai mic valoare din coloan, ignornd valorile
care sunt egale cu null;
max(nume_coloan) determin cea mai mare valoare din coloan, ignornd valorile
care sunt egale cu null;
sum(nume_coloan) determin suma tuturor valorilor din coloan, ignornd valorile
care sunt egale cu null;
avg(nume_coloan) determin media aritmetic a tuturor valorilor din coloan,
ignornd valorile care sunt egale cu null;
Exemple:
select count(*) as numar_elevi from elevi; afieaz numrul total de elevi din
tabel; n cazul nostru va fi 5.
select count(info) as numar_note_info from elevi; afieaz numrul total de
valori nenule din coloana info; n cazul nostru va fi 4.
select avg(info) as medie_note_info from elevi; afieaz media tuturor notelor
nenule din coloana info; n cazul nostru va fi 7.50.
select count(engl) as nota10 from elevi where engl=10; afieaz cte note de
10 sunt n coloana engl;
3.13.17. Subinterogri.
Reprezint mecanismul prin care rezultatul ntors de o interogare poate fi folosi mai departe,
pentru a efectua o nou interogare.
Distingem urmtoarele dou cazuri:
a) Interogarea subordonat ntoarce o singur valoare (deci o coloan cu un singur rnd):
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 afim toi elevii care au nota maxim la englez. n
primul rnd, va trebui s determinm printr-o subinterogare, care este nota maxim la englez, iar
pe baza valorii obinute s filtrm datele din tabela cu toi elevii. Pentru o mai bun evideniere, 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 manipulm
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. Cmpurile tabelei ntoarse de subinterogare au numele exact ca n
antetul care s-ar afia pentru aceast subinterogare.
Atunci cnd sunt folosite de ctre interogarea care o subordoneaz, cmpurile interogrii
subordonate trebuie adresate prin numele alias-ului, urmat de caracterul . i apoi de numele
cmpului din subinterogare.
Exemplu: din tabela cu elevii, dorim s afim, doar pentru elevii care au note completate
la toate cele 3 materii, o list cu numele i media celor 3 materii, n ordine descresctoare a
mediilor.
Dac am dori s afim o tabel ce conine numele i media general doar de la acei elevi
care au trecute toate cele 3 note, am scrie interogarea urmtoare (ne reamintim c, dac ntr-o sum,
cel puin 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 subinterogrii. Coloanele sale sunt nume respectiv media. Remarcai
faptul c, n cadrul interogrii pe care ne propunem s-o realizm 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
Gruprile 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 cmpuri (sau expresii n funcie de acestea): n acest caz se va folosi valoarea
primei linii din fiecare grup;
- funcii agregate: acestea vor aciona asupra tuturor valorilor coloanei din grup asupra
crora sunt aplicate;
- dac n loc de exp1,exp2,... folosim * se va afia prima linie din fiecare grup.
Exemple: Considerm urmtoarea tabel, numit pers, asupra creia vom aplica mai multe
interogri 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 afim doar acele coli pentru care numrul de elevi este
de cel puin 3, adugm clauza having interogrii de mai sus:
select jud,scoala,count(scoala) as total_scoala from pers
group by jud,scoala having total_scoala>=3;
Rezultatul afiat va fi urmtorul:
+------+--------+--------------+
| 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
cmpurile pe care dorim s le obinem, din cadrul ambelor tabele, iar la clauza from se trec ambele
tabele, fiecare dintre ele putnd avea definit i un alias. Clauza where poate filtra doar acele perechi
de linii (din ambele tabele) pe care le dorim. n absena clauzei where, se vor genera toate
combinaiile (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 tabel1 [as alias1],tabel2 [as alias2]
[where condiie];
Evident, exp1, exp2, ... vor trebui s conin numele coloanelor, simplu, dac nu exist confuzii
(coloane care au n ambele tabele acelai nume) sau numele alias-urilor urmate de punct i de
numele coloanelor n caz contrar.
111
Exemplu: fie urmtoarele dou tabele, una cu numele unor actori, fiecare actor avnd asociat un
cod, alta cu numele unor filme, fiecare film avnd trecut n dreptul su 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 afieze doar datele care sunt n coresponde (acest lucru este fcut,
evident, prin cmpurile numerice cod_actor, respectiv cod) folosim urmtoarea 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 ateptrilor, n forma urmtoare:
+-----------------+-----------+------+-----------------+
| 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 cnd uniunea se realizeaz doar ntre dou tabele i dorim ca din ambele
tabele s fie afiate doar acele linii pentru care condiia de legtur este satisfcut. Sintaxa
comenzii:
select exp1,exp2,.. from tabel1 [as alias1] inner join tabel2 [as alias2]
on condiie;
Ca i mai nainte, dac exist coloane care se numesc la fel n ambele tabele, vom folosi alias-uri.
Exemplu: acelai lucru ca n exemplul anterior se poate realiza cu urmtoarea 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: cuvntul cheie inner poate fi omis: prin specificarea doar a clauzei join se subnelege
c, de fapt, este vorba de un inner join;
c) Uniuni de tip left outer join:
Se aplic atunci cnd 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 condiia de la
clauza on. La acele linii din prima tabel care nu au corespondent n a doua tabel, n dreptul
cmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1]
left outer join tabel2 [as alias2] on condiie;
n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu
actori, va afia toate filmele, inclusiv cele pentru care nu am trecut actorii corespondeni n cea ce-a
doua tabel. Pentru a face exemplul ct mai ilustrativ, inserm urmtoarea linie n tabela cu filme:
insert into filme(titlu) values('Forest Gump');
Dup care lansm urmtoarea interogare de tipul left outer join:
select * from filme left outer join actori on cod_actor=cod;
Obs: Cuvntul outer poate fi omis: prezena 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 cmpurilor acesteia din urm se va
trece valoarea null. Sintaxa comenzii este:
select exp1,exp2,... from tabel1 [as alias1]
right outer join tabel2 [as alias2] on condiie;
n exemplu nostru, o astfel de interogare n care prima tabel este cea cu filme iar a doua cu
actori, va afia toi actorii, inclusiv cei pe care nu i-am asociat la vreun film, i doar acele filme
ctre care exist legtur 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: Cuvntul outer poate fi omis: prezena lui right implic o uniune de tip outer.
e) Auto-uniuni:
Se pot face uniuni n care ambele tabele sunt, de fapt, unul i acelai, ns au alias-uri
diferite i se consider unite printr-o coloan.
Exemplu: s considerm urmtoarea tabel, cu care am lucrat ntr-unul din exemplele
paragrafului anterior 3.13.5:
Pentru a afia toi pictorii care aparin aceluiai curent cruia i aparine i Gustav Klimt
putem proceda n felul urmtor (! atenie, 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 funcional suportul de conectivitate a limbajului PHP ctre bazele de date
MySQL, este necesar utilizarea bibliotecii mysql. n cazul pachetului XAMPP, aceasta este
instalat i activat n mod implicit. n cazul altor distribuii, acest lucru trebuie fcut manual.
n primul rnd, 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
utilizm o configuraie 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 (aa cum l-am creat n paragraful 3.3.12).
Conectarea efectiv se face cu ajutorul instruciunii:
$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 reuete 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 reuit, sau 0 n caz contrar;
Plasarea unei comenzi (interogri) asupra bazei de date selectate se face prin instruciunea:
$resurs1=mysql_query(string_ce_conine_comanda_MySQL);
Dac interogarea (comanda) a funcionat corect, funcia va ntoarce o valoare diferit de 0. n caz
contrar, ntoarce valoarea 0.
Variabila $resurs1 este cea care va permite, n continuare, obinerea rezultatului efectiv
al interogrii.
n cazul oricrei erori, perechea de funcii mysql_errno(); respectiv mysql_error();
ne ntorc codul (numrul) ultimei erori generate, respectiv mesajul asociat acesteia.
115
- mysql_num_rows(resursa) returneaz numrul de linii (rnduri) ale tabelei rezultate
n urma interogrii;
- mysql_num_fields(resursa) returneaz numrul de cmpuri (coloane) ale tabelei
rezultate n urma interogrii;
- mysql_field_name(resursa,k) returneaz numele cmpului (coloanei) al k-lea al
tabelei. Coloanele sunt numerotate de la 0;
Exemplu: urmtorul script PHP va realiza o conectare la baza de date MySQL, lansnd o
interogare de afiare a tuturor datelor din tabela elevi, din exemplul 3.13.16. n urma acestei
interogri va afia datele obinute cu ajutorul funciilor 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 afiat de ctre script:
116
Iat modul n care putem obine, ntr-o form prezentabil, toate datele coninute de tabela
din exemplul anterior, afind 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">';
//pregtim afiarea ntr-un tabel
echo '<tr>';
for($j=0;$j<$m;$j++)//afim 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 afim un spaiu
else echo ' ';//altfel, tabelul HTML va arta urt
}
}
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)
"Subir2"
FROM DUAL;
Subir2
----
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 cutat n irul XXXXXXXX') "TRANSLATE 1"
'c2', dac este gsit valoarea FROM DUAL;
acestuia este nlocuit cu TRANSLATE 1
caracterul din irul 'c3' a --------
crui poziie corespunde cu 9XXX999
poziia caracterului din irul
'c2'. SELECT TRANSLATE ('2KRW229',
2. Dac irul 'c2' este mai '0123456789ABCDEFGHIJKLMNOPQ
lung dect 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('Bucureti')
caracterele transformate n "LITERE MARI"
caractere mari. FROM DUAL;
LITERE MARI
-----
BUCURETI
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) numrul 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;
acelei zile din Luni
lun sau sunt ----------
ultimele zile din 1.03225806
lun rezultatul
este un numr
ntreg, altfel
Oracle
calculeaz
fraciuni 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 Mari, dup data de 15
sptmnii dup martie 1999.
ziua definit de SELECT NEXT_DAY('15-MAR-05','TUESDAY')
irul 'c1' i care "ZIUA URMTOARE"
este dup data FROM DUAL;
d. ZIUA URMTOARE
---------
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
ctre formatul ---------
fmt, conform 01-JAN-06
specificaiilor
de la sfritul
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 fr 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 funciilor cu un singur rnd i are
sintaxa:
funcie (DISTINCT | ALL expresie1, expresie2, )
Exemple :
LENGTH('BLAKE')
ROUND(1234.567*43)
SYSDATE
Exemple:
aria_cercului(raza)
calcul_rate(nume_angajat)
5) Forma V este o combinaie de mai multe expresii i are sintaxa:
( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2
Exemple:
('IONESCU' || ' PETRE')
LENGTH('BUCURESTI') * 57
SQRT(144) + 72
funcie_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 conine pn la maximum 1000 de
expresii.
Exemplu:
(10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)
5. CONDIIILE
Forma III este folosit pentru cutarea 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, . )
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
reea (este alt nume dect cel al bazei de date implicite, de pe calculatorul la
care se lucreaz).
@nume-fiier: reprezint numele unui fiier de comenzi SQL care va fi fi
rulat de SQL*Plus.
SILENT: are ca efect inhibarea facilitii de afiare a tuturor informaiilor i
mesajelor furnizate de SQL*Plus
/NOLOG: lanseaz n execuie SQL*Plus dar nu face conectarea la o baz
de date.
-?: are ca efect afiarea 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 spaiu. Parola sau @nume-baz-de-
date vor fi separate printr-un spaiu de @nume-fiier.
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 opional), 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 reea, cnd se dorete
conectarea la o alt baz de date dect 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, fr a mai fi necesar nchiderea
sesiunii.
Furnizarea parametrilor nume-utilizator i parol asigur protecia 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, fr 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;
8. FORMATAREA REZULTATELOR
9records selected.
B. Tiprirea titlurilor
Pentru afiarea unui titlu la sfritul sau la nceputul fiecrei pagini
se utilizeaz comanda BTITLE, respectiv TTITLE. Comanda BTITLE are
urmtoarele 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 nelegndu-se nu o
coloan de tabel, ci poziia cursorului) nainte dac n este pozitiv sau
napoi dac n este negativ.
Clauzele LEFT, RIGHT, CENTER determin alinierea la stnga, la dreapta
respectiv afiarea centrata a datelor din linia curent. Urmtoarele date sunt
aliniate ca an grup, de la nceputul pn la sfritul comenzii PRIN sau la
urmtorul LEFT, CENTER, RIGHT sau COLUMN. CENTER i RIGHT
folosesc valoarea returnat de comanda SET LINESIZE pentru a calcula
poziia urmtorului articol.
FORMAT char specific un model de format pentru articolul de date care
urmeaz; acest format se menine pn la ntlnirea unei alte clauze
FORMAT sau pn la sfritul comenzii. De reinut 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 tiprite n conformitate cu formatul specificat
n SET NUMFORMAT iar dac SET UNFORMAT nu a fost utilizat,
valorile vor fi tiprite cu formatul implicit.
Pentru specificarea titlurilor pot fi folosite constante (char) i
variabile (var), ele fiind poziionate i formatate aa cum se specific n
clauzele comenzii.
Existena unui separator indic nceputul unor linii noi, iar doi
separatori pe acelai rnd introduc o linie vid. Iniial, caracterul de separare
este."!", ns el poate fi schimbat cu SET HEADSEP.
SQL*PLUS interpreteaz comanda BTITLE h forma nou dac
primul cuvnt dup numeie comenzii este numele unei clauze valide (LEFT,
SKIP, COL etc.).
Clauzele ON i OFF au ca efect apariia (ON) sau nu (OFF) a
titlului.
BTITLE text afieaz centrat textul specificat.
Comanda BTITLE fr clauze specific titlul curent.
Exemple:
1) S se afieze la sfritul unui raport final cu privire la produsele din
depozitul cu codul 100000, n partea stng irul de caractere "Data:" iar n
partea dreapt "Semntura:".
SQL> SET PAGESIZE 11
SQL> BTITLE LEFT Data: RIGHT Semntura:;
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: Semntura:
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: Semntura:
3.13.22. CREAREA UNEI BAZE DE DATE PRIN
COMENZI SQL
Oprirea unei baze de date se poate face n dou moduri: normal sau
forat.
Modul normal, n care oprirea bazei de date se face ca revers al
operaiei de pornire normal, sens n care se execut nchiderea bazei de
date, demontarea bazei de date i oprirea instanei SQL. Activitatea se
execut din fereastra de dialog Shutdown Database prin selectarea butonului
radio Normal. Oprirea unei baze de date n condiii normale presupune
executarea de ctre SQL a urmtoarelor activiti: oprirea conectrilor la
baza de date; deconectarea tuturor utilizatorilor; la urmtoarea pornire a
bazei de date nu se pornesc procedurile de recuperare.
Modul forat se poate execut n dou moduri: imediat sau prin
anularea instanei.
Oprirea imediat a bazei de date se execut n cazul unui incident
iminent. n cadrul acestei opriri se execut instruciunea SQL aflat n
lucru i orice alt tranzacie nefinalizat este anulat prin procesul de
rollback; toi utilizatorii conectai sunt deconectai imediat.
Oprirea se face din fereastra de dialog Shutdown Database prin
selectarea butonului Immediate.
Oprirea prin anularea instanei se execut dac baza de date sau
una din aplicaiile sale funcioneaz anormal i nici una din metodele de
oprire anterioare nu funcioneaz. Aceast oprire se execut din fereastra de
dialog Shutdown prin setarea butonului radio Abort.
n timpul acestei opriri se finalizeaz instruciunile SQL aflate
n lucru, tranzaciile nefinalizate nu mai sunt aduse la starea anterioar
momentului nceperii acestora (nu mai sunt anulate prin procesul de roll
back), iar toi utilizatorii sunt deconectai imediat.
Unde:
spec-col cuprinde nume-col, format, mrime.
nume-col este numele coloanei din tabel.
format reprezint formatul coloanei din tabel.Formatele acceptate
sunt specificate n tabelul urmtor:
Exemplu:
S se creeze tabelele: PRODUSE, CLIENI, PRETURI SALARIATI,
DEPOZITE, COMENZI ce intr n componena 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 CLIENI
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 sfritul tabelei noi coloane care iniial au valori nule;
ulterior, prin actualizare, aceste coloane se vor completa cu date.
MODIFY schimb definirea unei coloane existente. Modificarea tipului sau
mrimii unei coloane presupune ca aceasta s conin numai valori nule.
spec-col reprezint numele, formatul i mrimea coloanei ce se va aduga
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 ataa parametrul NOT
NULL numai dac aceasta conine valori nenule.
Exemple:
1) S se adauge la tabela DEPOZITE o nou coloan CANTDEP ce nu a
fost prevzut iniial.
SQL> ALTER TABLE DEPOZITE ADD
2 (CANTDEP NUMBER(7));
Table altered.
2) S se modifice atributele coloanei CANTDEP (respectiv mrirea acesteia
cu dou uniti).
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 informaiile referitoare la index ntr-un fiier.
nume-index este numele indexului ce urmeaz a fi validat. Dac indexul este
valid, comanda va afia un mesaj corespunztor (Index validated). Obinerea
oricrui 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:
Intreinerea partiiilor
ntreinere a partiiilor se realizeaz prin executarea activitilor de
modificare, mutare, adugare, distrugere, trunchiere, splitare, reunire a
acestora, precum i schimbarea partiiilor i reconstruirea partiiilor index.
Modificarea unei partiii a unei tabele se face cu comanda ALTER
TABLE cu clauza MODIFY PARTITION. Cu aceast comand se
pot modifica atributele fizice ale partiiei sau ale partiiei indexului
aferent.
Mutarea partiiilor unei tabele sau index se face pentru a schimba
tabela spaiu n care rezid acestea din diverse considerente, dintre care
cele de obinere a unor performane n exploatarea sunt cele mai
frecvente. Operaia se execut cu comanda ALTER TABLE cu
opiunea MOVE PARTITION.
Exemplu:
ALTER TABLE tab10 MOVE PARTITION part1 TABLESPACE
tabsp10 NOLOGGING;
Mutarea partiiei unei tabele care conine date, determin necesitatea
recrerii tuturor indecilor locali sau globali ataai acesteia.
Adugarea unor noi partiii se poate executa doar pentru o tabel
partiionat sau un index local. Operaia se execut cu comanda ALTER
TABLE cu opiunea ADD PARTITION.
Exemplu:
ALTER TABLE tab100 ADD PARTITION part1 VALUES LESS
THAN (935);
O nou partiie poate fi adugat doar dup partiia cu limita
superioar cea mai mare. Dac dorim s adugm o partiie la nceput,
ntre partiiile existente sau dup ultima partiie care are limita
superioar egal cu valoarea MAXVALUE, atunci acest lucru se poate
realiza prin splitarea unei partiii, n cazul de fa prima, una adiacent
cu locul de inserare a noii partiii, i respectiv ultima partiie. Dac
pentru tabela partiionat creia i adugm o nou partiie exist un
index local, atunci SQL creeaz automat o partiie de index pentru
noua partiie adugat.
Distrugerea partiiilor unei tabele se face dup anumite reguli funcie
de situaiile n care se afl partiia, cu ajutorul comenzii ALTER
TABLE cu opiunea DROP PARTITION. Distrugerea partiiei unei
tabele care conine date i a indexului global se poate face lsnd
nealterai indecii globali n timpul distrugerii partiiei, dup care acetia
vor fi recreai sau tergnd toate rndurile partiiei cu comanda
DELETE dup care distrugem partiia. Aceast comand actualizeaz
indecii globali. Distrugerea partiiei unei tabele care conine date i a
constrngerilor refereniale de integritate se poate face dezactivnd
constrngerile de integritate, distrugnd partiia i apoi reactivnd
constrngerile de integritate. tergerea rndurilor partiiei cu comanda
DELETE, apoi distrugem partiia.
Distrugerea partiiilor unui index se face dup anumite reguli funcie
de situaiile n care se afl partiia, cu ajutorul comenzii ALTER
INDEX cu opiunea DROP PARTITION. O partiie a unui index local
nu poate fi distrus, ea se distruge implicit atunci cnd se distruge
partiia tabelei creia i corespunde. O partiie fr date a unui index
global poate fi distrus. Dac o partiie a unui index global conine date,
atunci prin distrugerea acesteia partiia urmtoare devine invalid i
trebuie recreat;
Trunchierea partiiilor unei tabele se face cu comanda ALTER
TABLE cu opiunea TRUNCATE PARTITION i are ca efect
tergerea tuturor rndurilor de date din aceast partiie i a partiiei
corespunztoare a indexului local asociat, dac exist. Partiiile
indecilor nu pot fi trunchiate, singur trunchiere posibil este cea
specificat mai sus. Trunchierea unei partiii a unei tabele i a indecilor
globali asociai i/sau a constrngerilor de integritate referenial se face
dup aceleai reguli ca i operaia de distrugere.
Splitarea partiiilor unei tabele sau ale unui index se face cu comanda
ALTER TABLE/INDEX cu opiunea SPLIT PARTITION. O partiie
a unei tabele ce conine date, prin splitare toi indecii asociai devin
inutilizabili i ca atare acetia trebuie recreai. Numai partiia fr date
nu invalideaz indecii. Partiia unui index poate fi splitat numai dac
indexul este global i nu conine date, cci partiia unui index local se
spliteaz automat atunci cnd se spliteaz partiia tabelei creia i
corespunde.
Fuzionarea sau reunirea partiiilor unei tabele sau ale unui index se
face cu ajutorul comenzilor ALTER TABLE/INDEX i cu una din
opiunile DROP PARTITION sau EXCHANGE PARTITION, pentru
c o opiune explicit de fuzionare nu exist. O partiie a unei tabele
poate fi reunit cu alt partiie numai dac nu are indeci globali sau
constrngeri de integritate refereniale asociate. Fuzionarea unei partiii
a unei tabele se face totdeauna cu partiia imediat superioar.
Presupunem c avem tabela TAB10 cu partiiileP1, P2, P3 i P4 i vrem
s reunim partiia P2 cu P3, se vor exporta datele din tabele P2, se
execut comanda ALTER TALE tab10 DROP PARTITION p2 ,
dup care importm datele exportate n partiia P3.
Fuzionarea sau reunirea partiiilor unui index local se face implicit
cnd se reunesc partiiile corespunztoare ale acestora, iar fuzionarea a
dou partiii P2 i P3, care conin date, ale unui index global, se poate
face astfel:
ALTER INDEX index_global DROP PARTITION p2;
ALTER INDEX index_global REBUILD PARTITION p3;
Schimbarea partiiilor realizeaz transformarea unei partiii a unei
tabele ntr-o tabel nepartiionat sau o tabel nepartiionat ntr-o
partiie a unei tabele partiionate. Operaia se execut cu comanda
ALTER TABLE cu opiunea EXCHANGE PARTITION.