Documente Academic
Documente Profesional
Documente Cultură
1. INTRODUCERE
Bibliografie:
1. Tudor Sorin i Vlad Huanu, Crearea i programarea paginilor WEB,
Bucureti, L&S Infomat, 2004;
2. Vlad Huanu i Carmen Popescu, Manual de Informatic Intensiv pentru clasa a XII-a,
Bucureti, L&S Infomat, 2007;
3. Bogdan Ptru, Internet pentru nceptori,
Bucureti, Teora, 1998;
4. Traian Anghel, Programarea n PHP. Ghid practic,
Iai, Polirom, 2005;
5. Julie C. Meloni, nva singur PHP, MySQL i APACHE,
Bucureti, Corint, 2005;
6. Larry Ulman, PHP i MySQL pentru site-uri web dinamice,
Bucureti, Teora, 2006;
Bibliografie Internet :
7. http://wikipedia.org enciclopedia liber;
8. http://www.php.net pagina oficial a grupului de lucru pentru dezvoltarea limbajului PHP;
9. http://www.w3schools.com set gratuit de tutoriale i documentaii pentru programarea paginilor we.b.
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
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
n capitolul al III-lea (Limbajul PHP faciliti ale acestuia) am fcut, la fel ca i n
capitolul al II-lea, o parcurgere mai amnunit a elementelor limbajului PHP, cu exemple.
Totodat, n acest capitol exist i cteva detalii tehnice despre instalarea pachetelor software
necesare rulrii.
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.
Protocolul IP (Internet Protocol) reglementeaz transmiterea datelor de la o adres IP la alta.
Datele sunt transmise divizate n pachete. n acest fel, se prentmpin monopolizarea transmisiei n
reea doar de ctre un singur utilizator.
Protocolul TCP (Transmission Control Protocol): de la plecare, un program TCP mparte
informaia de transmis n mai multe pachete IP. Acestea sunt transmise la destinaie prin
intermediul reelei. O dat ajunse la destinaie, un alt program TCP asambleaz i aranjeaz n
ordinea corect pachetele IP de date primite. Firete, din cauza unor probleme hardware, unele
pachete se pot pierde pe drum. Protocolul TCP se ocup i de acest lucru. Astfel, cnd mpacheteaz
datele ntr-un plic IP, protocolul TCP al expeditorului adaug i un numr (numit sum de
control) care va permite destinatarului s se asigure de faptul c datele primite sunt corecte.
Receptorul recalculeaz suma de control i o compar cu cea transmis de emitor. Dac ele nu
sunt identice, nseamn c a aprut o eroare n timpul transmisiei, motiv pentru care protocolul TCP
anuleaz acel pachet, cernd retransmiterea sa.
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.
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 UrbanaChampaign 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.
Prin conceptul de hipertext se nelege o form de document electronic, o metod de
organizare a informaiilor n care datele sunt memorate ntr-o reea de noduri i legturi, putnd fi
accesat prin intermediul programelor de navigare interactiv, i manipulat de un editor structural.
Conceptul de baz n definirea hipertextului este "legtura" (link-ul), fie n cadrul aceluiai
document, fie ctre alt document. Legtura de tip link permite organizarea neliniar a informaiilor.
Un sistem hipertext permite autorului su s creeze aa-numite "noduri", s le lege ntre ele, iar unui
cititor navigarea de la un nod la altul. Astfel un nod reprezint un concept putnd conine orice fel
de informaie: text, grafic, imagini, animaii, sunete, etc. Nodul surs al unei legturi se numete
"referin" iar cel destinaie "referent" sau ancor, punctele de legtur din respectivele noduri fiind
marcate. Activarea marcajelor unei legturi duce la vizualizarea nodurilor. Asocierea cu unele
elemente mediale a dus la extinderea noiunii de hipertext ctre "hipermedii".
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).
11
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 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:
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>
fontul de dimensiune maxim, <H6> fontul de dimensiune minim) iar textul care apare ntre tag-uri
este scris ngroat (bold).
Pentru stabilirea font-ului se folosete tag-ul <FONT>...<FONT>. Atributele acestuia sunt:
- face indic numele font-ului
- size indic mrimea (trebuie s fie un numr cuprins ntre 1 i 7. Implicit este 3)
15
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
un
exemplu
de
cod
vizualizarea
sa
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
align=top
(apl010.html):
<P>
Acest text este asezat inaintea imaginii <br>
Se observa ca
<IMG SRC="dog.jpg" align="top" alt="catelus">
doar primul rind al textului este aliniat cu
latura de sus a imaginii, restul textului
fiind afisat dupa imagine
</P>
align=middle
(apl011.html):
<P>
Acest text este asezat inaintea imaginii <br>
Se observa ca
<IMG
SRC="dog.jpg"
align="middle"
alt="catelus">
doar primul rind al textului este aliniat la
jumatatea inaltimii imaginii, restul textului
fiind afisat dupa imagine
</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
21
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.
Un prim atribut al tag-ului <TABLE> este border=grosime_pixeli. Dac acest atribut
este omis, tabelul va avea un chenar invizibil. Dac se specific doar atributul, omind grosimea,
aceasta va fi luat, implicit, ca fiind 1.
Iat un exemplu de cod pentru definirea unui tabel (apl016.html):
<TABLE border>
<TR>
<TD>Rindul
<TD>Rindul
<TR>
<TD>Rindul
<TD>Rindul
</TABLE>
1, celula 1
1, celula 2
2, celula 1
2, celula 2
23
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)
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>
26
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)
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
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>
(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
elemente au rolul de a defini structura documentului. Din acest motiv ele se mai numesc i elemente
de structur.
Tag-ul BODY poate conine urmtoarele atribute:
background=fiier_imagine permite specificarea unei imagini de fundal. Aceasta
se va repeta att pe orizontal ct i pe vertical, pn cnd se acoper ntreaga suprafa necesar
corpului;
bgcolor=culoare permite specificarea unei culori de fond;
text=culoare permite specificarea culorii ntregului text cuprins n pagin;
link=culoare permite specificarea culorii unui link nevizitat;
alink=culoare permite specificarea culorii unui link activ; un link este considerat
activ n timpul vizitrii i imediat dup aceasta;
vlink=culoare permite specificarea culorii unui link vizitat, care nu mai este activ.
<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>
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.
<SCRIPT> este utilizat pentru introducerea anumitor secvene de program n cadrul
paginilor web. Exist mai multe limbaje (numite de scriptare) care permite scrierea acestor
secvene, cum ar fi JavaScript, VBscript. Specificarea limbajului n care este codat scriptul se face
cu ajutorul atributului language, ca n exemplul de mai jos (apl021.html):
<SCRIPT language="JavaScript">
function calcul()
{ s=0; for(i=1;i<=10;i++)
s+=i;
alert("suma nr. de la 1 la 10 este: "+s);}
</SCRIPT>
...
<BODY onload="calcul();"> ... </BODY>
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
n acest exemplu, se definesc 3 cadre orizontale (linii) de nlimi 30%, 50% respectiv 20% din
nlimea ferestrei.
Un alt exemplu, n care nlimea cadrelor este definit proporional:
<FRAMESET rows=3*, 1*, 2*>...
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.
Tag-ul <NOFRAMES>...</NOFRAMES> reprezint coninutul care va fi afiat unui vizitator,
n cazul n care browser-ul su nu poate afia cadre (n prezent, nu prea mai este cazul unor
asemenea browsere).
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.
Pagina iniial (apl022pagframe.html):
<HTML>
<HEAD>
<TITLE>Pagina cu frames</TITLE>
</HEAD>
<FRAMESET cols="30%,*">
<FRAME name="stinga" src="apl022zile.html" noresize>
<FRAME name="dreapta" src="apl022luni.html">
</FRAMESET>
<NOFRAMES>
Browser-ul tau nu este capabil sa afiseze pagini cu frame-uri
</NOFRAMES>
</HTML>
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:
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
Fiierul apl022luni.html:
Fiierul apl022marti.html:
Fiierul apl022miercuri.html:
<HTML><BODY>
<H2>Luni</H2>
FR: Lundi<BR>
IT: Lunedi<BR>
GE: Montag<BR>
EN: Monday<BR>
</BODY></HTML>
<HTML><BODY>
<H2>Marti</H2>
FR: Mardi<BR>
IT: Martedi<BR>
GE: Dienstag<BR>
EN: Tuesday<BR>
</BODY></HTML>
<HTML><BODY>
<H2>Miercuri</H2>
FR: Mercredi<BR>
IT: Mercoledi<BR>
GE: Mittwoch<BR>
EN: Wednesday<BR>
</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>
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.
Un formular este descris prin intermediul tag-ului <FORM>...</FORM>. Atributele acestuia
sunt:
action=adresa acest atribut specific adresa script-ului care se va ocupa de a
rspunde la comenzi i de a prelucra datele.
method acest atribut specific modul n care datele vor fi transmise ctre server.
Distinge, dou valori pe care le poate lua acest atribut, i anume:
- get datele sunt la vedere acest lucru nseamn c, n momentul trimiterii lor
ctre server, ele vor aprea scrise n clar, n bara de adres, ntr-un anumit format standard. De
exemplu, dac formularul trimite ctre pagina test.php o variabil a care este egal cu 5, n bara de
adres a browser-ului ne va aprea http://.../test.php?a=5. Un dezavantaj major al acestei
metode de trimitere a datelor este c volumul acestora este limitat (datorit irului de caractere din
adres, care este limitat n cazul fiecrui browser).
- post datele nu mai apar n mod explicit utilizatorului. Totui, ele nu sunt
criptate practic, un program rufctor le poate intercepta.
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 ...>
37
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
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.
39
40
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;
width = limea;
height = nlimea.
42
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.
JavaScript este un limbaj de programare orientat pe obiecte. n ciuda numelui i a unor
oarecare similariti n sintax, ntre JavaScript i Java nu exist nici o legtur.
JavaScript are o sintax apropiat de cea a C-ului; din acest motiv un programator care
cunoate C poate cu uurin s nvee JavaScript.
Dei acest limbaj are o plaj mai larg de extindere, cel mai des ntlnit este n scriptarea
paginilor web. Programatorii web pot ngloba n paginile HTML script-uri pentru diverse activiti,
cum ar fi verificare datelor introduse de utilizatori, sau crearea de meniuri ori de alte efecte animate.
Browser-ele rein n memorie o reprezentare a paginii web sub forma unui arbore de obiecte,
punnd aceste obiecte la dispoziia JavaScript-ului, care le poate citi i manipula. Acest arbore de
obiecte, de care ne vom ocupa n paragraful urmtor, poart numele de DOM (Document Object
Model).
Pentru moment, vom da cteva exemple comentate de script-uri JavaScript, care nu folosesc
DOM (pentru familiarizarea cu sintaxa), n cadrul unor documente HTML.
1) Calculul sumei cifrelor unui numr natural (apl031.html):
<HTML><HEAD>
<TITLE>JavaScript</TITLE>
</HEAD>
<BODY><HR>
<!--Vom scrie secventa de cod direct in cadrul paginii.
A se remarca faptul ca, va aparea mai intii primul HR,
se va rula codul din tag-ul SCRIPT iar apoi va aparea
cel de-al doilea HR-->
<SCRIPT language="JavaScript">
v_text=prompt("Introdu un numar intreg cu maxim 9 cifre:","");
//functia prompt deschide o fereastra de dialog prin intermediul
//careia utilizatorul poate sa introduca date de tip string. Al doilea parametru
//(irul vid "") reprezint valoarea care se va gsi implicit scris n fereastra
//de dialog. Evident, dac nu dorim nici o valoare implicit, se folosete irul vid ("")
//String-ul obtinut l-am atribuit variabilei v_text
nr=parseInt(v_text);//am facut conversia de la variabila text
//la un numar intreg
s=0;//in s calculam suma cifrelor lui nr
do//procedam intocmai ca in limbajul C:
{
r=nr%10;
s+=r;
nr=parseInt(nr/10);//in JavaScript impartirea NU mai respecta
//regulile din C, deoarece operatorul / face impartire cu
//zecimale. Pentru a obtine citul intreg, am facut conversia la
//intreg cu acelasi parseInt
}while(nr);
alert("Suma cifrelor este "+String(s));
//functia alert(mesaj_de_tip_string) produce afisarea unei ferestre
//de dialog ce contine mesajul respectiv. A se remarca modul in care
//am concatenat mesajul cu valoarea variabilei s, convertita la string
//cu ajutorul functiei String.
</SCRIPT>
<HR>
</BODY></HTML>
46
dog.jpg:
dogneg.jpg
(negativul)
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 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
51
3.2. Cerine tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii
asupra instalrii.
Dup cum am vzut n capitolul precedent, PHP nu este un limbaj de programare de
sine-stttor (cum ar fi C++, spre exemplu) ci se folosete n simbioz n primul rnd cu HTML, i
deci pentru a rula, are nevoie neaprat de un server de web (http server).
Practic, pentru a face ca pe calculatorul nostru s poat rula fiiere php, avem nevoie s
instalm, pe lng limbajul PHP, i un server de web, i de a face legtura dintre cele dou.
Acest lucru se poate face separat, ns sunt necesare o serie de setri foarte minuioase i
greoaie.
Din acest motiv, pentru testarea aplicaiilor pe care le vom studia, vom folosi un pachet
gratuit, disponibil pe Internet, numit XAMPP. Acest pachet, foarte simplu de instalat, conine mai
multe aplicaii. Cele care ne vor interesa pe noi sunt serverul Apache (pentru http), un server de
MySQL, i suport pentru limbajul PHP. Cerinele tehnice pentru rularea n bune condiii sunt
minimale: practic, pe orice calculator care este capabil s ruleze Windows 2000, XP sau Vista,
pachetul XAMPP va rula fr probleme.
Dei instalarea sa poate fi fcut n mai multe feluri, cel mai la ndemn este s folosim o
versiune de tip Installer a sa.
Adresa de unde poate fi descrcat pachetul gratuit este:
http://www.apachefriends.org/en/xampp-windows.html
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.
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
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.
S mai scriem nc un exemplu, nainte de a trece la detalierea limbajului de programare
PHP. n acelai director (c:\xampp\htdocs\phpapps) creai fiierul apl038.php, cu urmtorul
coninut:
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
Aspectul su n browser rmne absolut nemodificat. Totui, vizualiznd codul surs, vom
remarca alinierea acestuia:
57
ntreg ir de caractere din punct de vedere al constantelor. Separatorii pot fi att ghilimelele ct i
apostrofurile, rolul lor funcional fiind puin diferit vom vedea acest lucru mai ncolo. Caracterele
speciale sunt aceleai ca i n C: \n, \\, \, \ i altele.
constante de tip bool: false i true. Spre deosebire de C, rezultatul oricrei expresii
relaionale sau logice este de acest tip special de date. Totui, n cazul instruciunilor care necesit
expresii relaionale sau logice, se pstreaz convenia din C, i anume c orice valoare diferit de 0
este echivalent cu true, iar orice valoare egal cu 0 este echivalent cu false.
Definirea constantelor de ctre utilizator, n sensul c prin anumii identificatori putem
folosi valori constante, se face cu ajutorul funciei define.
Forma general a acesteia este:
define(nume constanta, valoare);
Variabile
n PHP identificatorii rezervai variabilelor ncep cu caracterul $. n continuare, respect
aceleai specificaii din C, deci imediat dup caracterul $ trebuie s fie o liter sau liniua de
subliniere (_), iar n rest pot fi folosite i cifrele.
Spre deosebire de C, variabilele nu se declar la nceput, ci tipul lor este definit (implicit, de
ctre limbaj) atunci cnd sunt folosite. Mai mult, i pot schimba tipul n funcie de valoarea pe care
o rein.
58
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>
Operatori
Muli dintre operatorii limbajului PHP sunt cunoscui din C++. Acesta este motivul pentru
care vom prezenta doar anumite particulariti specifice limbajului PHP.
59
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
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
63
Principiul de executare este uor de neles, datorit faptului c for-ul se poate transcrie n
mod perfect echivalent prin urmtoarea secven de program:
expresieiniializare;
while(expresiecontinuare)
{
instruciune;
expresieincrementare;
}
Dei for-ul este, n limbajul C, deci i n PHP, o instruciune mult mai general dect n alte
limbaje, totui, cel mai utilizat scop al su este de a atribui unui contor, rnd pe rnd, valori (de
regul ntregi) cuprinse ntre dou limite.
Exemplu de script (apl050.php) care conine un for:
<?php
//Programul calculeaza suma primelor $n numere naturale in variabila $s:
$n=10;
$s=0;
echo 'Valoarea din variabila $n este : ',$n,"<BR>";
for($i=1;$i<=$n;$i++)
$s+=$i;
echo "Suma primelor $n numere naturale este $s<BR>";
?>
64
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[...].
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
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>";
}
}
?>
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;
?>
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;
?>
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); .
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.
apl071.php:
<?php
$a="Iepurechin";
echo '<table border="1" cellspacing="0" cellpadding="10"><tr>';
for($i=0;$i<strlen($a);$i++)
echo '<td>',$a[$i];
echo '</table>';
?>
Concatenarea a dou sau mai multe stringuri se face cu operatorul . (punctul). Observai
n exemplu de mai jos cum se face acest lucru, i de asemenea faptul c, n timpul concatenrii,
valoarea numeric a fost convertit implicit ctre ir de caractere:
$x=9;
$s="Ana "."are ".$x." mere";
echo $s;//valoarea final a stringului este "Ana are 9 mere"
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 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
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 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['Alune']=2.21;
$x['Ciocolata']=2.69;)
$x['Vin']=5.99;
foreach($x as $i=>$v)
echo $i," => ",$v,"<br>";
irul $x n urma
unui sort($x):
0 => 1.61
1 => 2.21
2 => 2.69
3 => 5.99
79
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
x0 = 200
399
(300,75)
y1 = 75
y0 = 150
x1= 300
(200,150)
299
y
Am pus n eviden n cadrul imaginii de mai sus punctele de coordonate (200,150)
respectiv (300,75).
imagecolorallocate(resurs_imagine, rou, verde, albastru)- creeaz o
resurs de tip culoare, asociat imaginii specificat prin resursa din primul parametru. Rezultatul
ntors de aceast funcie trebuie atribuit unei variabile, prin intermediul creia vom accesa n
continuare culoarea definit;
imagesetthickness(res_imag,
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;
conectate (din aproape n aproape) care au aceeai culoare cu cea existent iniial la (x0,y0), n
noua culoare 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)
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;
84
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 lam 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 uploadul 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';
}
?>
Exemplu: n instruciunea de mai jos este creat o variabil cookie numit limba_pref.
Variabila reine valoarea romana i expir ntr-o or:
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
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>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.3. Crearea unei baze de date.
Aceast operaie nu poate fi fcut de ctre orice utilizator, ci doar de ctre root sau de
anumii utilizatori cu drepturi speciale.
Comanda pentru crearea unei baze de date este:
create database nume_baz_date;
n urma executrii sale este creat baza de date cu numele indicat. Din moment ce fiecare
baz de date este stocat pe disc, ntr-un anumit director, n fapt se va crea un subdirector cu acelai
nume cu baza de date, n subdirectorul data al folder-ului instalrii MySQL (n cazul XAMPP,
acest folder este C:\XAMPP\MYSQL\DATA. Dac exist deja o baz de date cu numele specificat, se
va refuza crearea uneia noi.
Dac se dorete lucrul cu o anumit baz de date, se va da comanda urmtoare:
use nume_baz_date;
Dac dorim o list a bazelor de date existente (sau, n fine, n funcie de utilizator, a
bazelor de date la care avem acces) se utilizeaz comanda:
show databases;
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
(ca pe plcuele de la maini), numele judeului (un ir de cel mult 30 de caractere) i numrul su
de locuitori (un numr ntreg de cel mult 7 cifre) folosim urmtoarea comand:
create table judete (ind char(2),nume char(30),nrloc int(7));
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);
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
+------+-----------+--------+
| ind | nume
| nrloc |
+------+-----------+--------+
| CJ
| Cluj
| 702755 |
| BV
| Brasov
| 589028 |
| 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,
nume as "nume judet",
nrloc as "numar de locuitori"
from judete;
+-----------+------------+--------------------+
| indicativ | nume judet | numar de locuitori |
+-----------+------------+--------------------+
| BV
| Brasov
|
589028 |
| CJ
| Cluj
|
702755 |
| CL
| Calarasi
|
NULL |
| MM
| Maramures |
510110 |
+-----------+------------+--------------------+
4 rows in set (0.00 sec)
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;
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,
renastere nu apare printre stringurile din enum,
permise pentru acest cmp. Totui, n urma
execuiei sale, pictorul cu numele Tiziano
Vecellio va fi trecut n tabel, ns n dreptul
+------------------+------------------+
| nume
| curent
|
+------------------+------------------+
| Gustave Klimt
| art nouveau
|
| Vincent Van Gogh | postimpresionism |
| Alphonse Mucha
| art nouveau
|
| Auguste Renoir
| impresionism
|
| Rene Magritte
| suprarealism
|
| Tiziano Vecellio |
|
+------------------+------------------+
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'));
insert into persoane values('Ion MARIN','muzica,desen');
insert into persoane values('Ion TIRIAC','sport,desen');
insert into persoane values('Nina CHIRIAC','muzica');
insert into persoane values('Ion BETEA','sport,fumat');
+--------------+--------------+
| nume
| hobby
|
+--------------+--------------+
| Ion MARIN
| muzica,desen |
| Ion TIRIAC
| desen,sport |
| Nina CHIRIAC | muzica
|
| Ion BETEA
| sport
|
+--------------+--------------+
94
95
+-----+
| 5+7 |
+-----+
| 12 |
+-----+
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
|| 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:
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:
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
. . .
when vn then valn
else valn+1
end
- forma 2: case
when cond1 then val1
. . .
when condn then valn
else valn+1
end
Exemple:
1)
2)
case cif
when
when
when
else
end
1 then unu
2 then doi
3 then trei
nu stiu sa numar decit pina la 3
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
select @a;
select @b;
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;
c) Cteva funcii care lucreaz asupra datei i orei:
now() ntoarce data i ora curent sub forma yyyy-mm-dd hh:mm:ss;
day(d) ntoarce numrul zilei din data pe care o primete ca parametru;
month(d) ntoarce numrul lunii din data pe care o primete ca parametru;
year(d) ntoarce numrul anului din data pe care o primete ca parametru;
time(d) ntoarce timpul (sub forma hh:mm:ss) extras din data+timpul pe care o
primete ca parametru;
hour(d) ntoarce ora din parametrul su. Acesta poate fi de tip date sau datetime;
minute(d) ca mai sus, ntoarce minutul din parametrul su;
second(d) ca mai sus, ntoarce secunda din parametrul su;
datediff(x,y) calculeaz diferena, n zile, dintre datele x i y;
date_add(x,interval nr tip) adun la data x un numr nr de zile, luni sau ani,
n funcie de valoarea parametrului tip. Cuvntul interval este un cuvnt rezervat, trebuind
scris ca atare. Parametrul tip poate avea una dintre valorile day, month respectiv year. Dac se
dorete o scdere, fie folosim valori negative pentru x, fie folosim funcia pe care o prezentm
imediat n continuare.
Ex: date_add(2009-01-14,interval 18 day) va ntoarce valoarea 2009-02-01;
date_add(2009-01-14,interval -14 day) va ntoarce valoarea 2008-12-31;
100
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;
La analizarea valorilor existente prin-o interogare, constatm c s-au trecut urmtoarele date:
+-----------+--------+-------+
| nume
| virsta | greut |
+-----------+--------+-------+
| Copaceanu |
0 | NULL |
+-----------+--------+-------+
Acesta permite ca, la omiterea unei valori pentru un anumit cmp, atunci cnd inserm o
nou coloan la tabel, acel cmp s fie automat cu o valoare implicit. Acest specificator nu
funcioneaz dect n cazul cmpurilor cu lungime fix. De exemplu, un cmp declarat char(10)
poate lua o valoare civil, pe cnd unul declarat text nu poate lua o astfel de valoare.
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);
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
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
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).
105
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
linia a 2-a.
3.13.15. Actualizarea datelor.
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)
specificatorul distinct se folosete pentru a insera doar datele distincte (care nu apar deja n
tabela n care inserm) din tabela surs.
106
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.
3.13.16. Funcii agregate.
Toate exemplele de pn acum au avut ca operanzi doar cmpurile unui acelai rnd. n
practic, este foarte adesea necesar s putem efectua calcule i cu valorile (toate sau doar o parte)
reinute de o coloan.
Pentru astfel de calcule se utilizeaz aa-numitele funcii agregate. n cele ce urmeaz
vom prezenta aceste funcii, iar pentru exemplificare vom utiliza urmtoarea tabel (cu numele
"elevi"):
+------------------+------+------+------+
| nume
| mate | engl | info |
+------------------+------+------+------+
| Aura Urziceanu
|
8 |
10 |
7 |
| Gica Petrescu
|
6 |
4 |
9 |
| Angela Similea
|
10 |
10 |
10 |
| Gabriel Cotabita |
8 |
5 |
4 |
| Corina Chiriac
|
7 | NULL | NULL |
+------------------+------+------+------+
107
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
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
|
+------+------+--------+
grupeaz dup jude, afind pentru fiecare jude indicativul su, respectiv numrul total
de persoane provenind din acel jude:
+------+-------------+
| jud | total_judet |
+------+-------------+
| bv
|
9 |
| cj
|
5 |
+------+-------------+
afind pentru fiecare grup obinut numele judeului, numele colii i numrul de elevi din acea
coal:
+------+--------+--------------+
| jud | scoala | total_scoala |
+------+--------+--------------+
| bv
| sc1
|
3 |
| bv
| sc2
|
4 |
| bv
| sc3
|
2 |
| cj
| sc1
|
3 |
| cj
| sc2
|
2 |
+------+--------+--------------+
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;
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;
+------+-----------------+
| cod | nume
|
+------+-----------------+
| 101 | Tom Hanks
|
| 105 | Dustin Hoffman |
| 107 | Roberto Benigni |
| 110 | Jessica Lange
|
+------+-----------------+
2) sau i mai simplu, pentru c nu exist coloane care s se confunde (toate au nume diferite):
select * from filme,actori;
)
Rezultatul este urmtorul (observai cum se ia fiecare film cu fiecare actor):
+-----------------+-----------+------+-----------------+
| titlu
| cod_actor | cod | nume
|
+-----------------+-----------+------+-----------------+
| Tootsie
|
105 | 101 | Tom Hanks
|
| Tootsie
|
110 | 101 | Tom Hanks
|
| La vita e bella |
107 | 101 | Tom Hanks
|
| Tootsie
|
105 | 105 | Dustin Hoffman |
| Tootsie
|
110 | 105 | Dustin Hoffman |
| La vita e bella |
107 | 105 | Dustin Hoffman |
| Tootsie
|
105 | 107 | Roberto Benigni |
| Tootsie
|
110 | 107 | Roberto Benigni |
| La vita e bella |
107 | 107 | Roberto Benigni |
| Tootsie
|
105 | 110 | Jessica Lange
|
| Tootsie
|
110 | 110 | Jessica Lange
|
| 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;
112
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;
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');
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
|
+-----------------+-----------+------+-----------------+
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
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):
select b.nume from pictori as a join pictori as b on a.curent=b.curent
where a.curent='art nouveau' and a.nume='Gustave Klimt';
114
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.
nchiderea conexiunii ctre baza de date MySQL se face prin comanda:
mysql_close(resurs_conexiune);
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
Cheia primar este un atribut care are valori distincte. Deci, fiecare
linie se identific printr-o valoare distinct. Dou sau mai multe atribute
care pot fi chei primare se numesc chei candidate.
Coloana tabelei este format din valorile pe care le ia atributul n
liniile tabelei respective.
Rndul/tuplul/linia este format din valorile coloanelor ce se refer la
o entitate a tabelei.
Baza de date relaional este un ansamblu de tabele normalizate,
grupate n jurul unui subiect, n principiu, bine definit. ntr-o baz de date
relaional, entitile i legturile sunt transpuse n tabele.
Viziunea este o tabela logic i reprezint o fereastr la date, dintruna sau mai multe tabele.
Pentru ca accesul la date sa se fac mai rapid, se utilizeaz
indexarea. Un index reprezint o cheie pe una sau mai multe coloane.
Indexarea este dinamic deoarece se pot adaug sau terge indeci oricnd,
fr ca datele memorate sau aplicaiile scrise s fie afectate.
Pentru realizarea unor operaii sau pentru a utiliza n cereri nume
mai scurte, se pot defini sinonime ale unor nume de tabele sau viziuni.
Un cluster reprezint o anumit modalitate de grupare a rndurilor
uneia sau mai multor tabele. Aceast grupare mrete viteza de execuie a
unor operaii consumatoare de timp.
Comanda este o instruciune emis din SQL*Plus ctre o baz de
date Oracle.
Blocul reprezint un grup de instruciuni SQL i PL/SQL.
Cererea este o comanda SQL (SELECT) care regsete date din
baza de date. Rezultatul cererii l formeaz datele regsite din baza de date.
Raportul este rezultatul cererii formatat cu ajutorul comenzilor
SQL*Plus.
Numele unei baze de date, al unei tabele, coloane sau variabile
utilizator trebuie s aib lungimea ntre 1 i 30 caractere. Un nume nu poate
conine apostrofuri. Cu att mai puin, un nume utilizat ntr-o comand nu va
fi introdus ntre apostrofuri. Literele mici i mari sunt echivalente (nu se
face distincia ntre literele mici i mari). Un nume trebuie s nceap cu o
liter, s conin numai anumite caractere (A-Z, 0-9, $, #, @, -), s nu
duplice numele unui alt obiect de acelai tip i s difere de un cuvnt
rezervat ORACLE.
Cuvintele rezervate nu pot fi utilizate ca nume de tabele, coloane sau
orice alte obiecte definite de utilizator. Ele sunt prezentate n Anexa 1.
3. FUNCII SQL
Funciile se apeleaz prin sintaxa:
Nume_funcie (argument1, argument2, )
Funciile SQL sunt cu un singur rnd sau scalare (returneaz un
singur rezultat pentru fiecare rnd al cererii emise asupra unei tabele sau
vederi) i cu mai multe rnduri numite funcii grup sau agregate (returneaz
un singur rezultat pentru un grup de rnduri regsite dintr-o tabel sau
vedere).
A. Funciile SQL cu un singur rnd (funciile scalare)
Acestea sunt funcii: numerice, caracter, de tip DATE, de conversie
i alte funcii.
1) Funciile numerice accept valori numerice i returneaz
rezultate numerice i sunt prezentate n tabelul 3.1. Tabela DUAL folosit n
exemple, este creat automat de ctre Oracle odat cu crearea dicionarului
de date i se afl n schema utilizatorului SYS, dar cu acest nume este
accesibil tuturor utilizatorilor unei baze de date Oracle. Ea are o singur
coloan numit DUMMY cu tipul de date VARCHAR2(1) i un singur rnd
cu valoarea 'X'. Seleciile din tabela DUAL sunt utile pentru calcularea unor
expresii constante cu comanda SQL SELECT. Din cauz c are un singur
rnd, constanta este returnat o singur dat. Alternativ pentru aceeai
activitate se poate selecta o constant, pseudocoloan sau o expresie din
orice tabel.
Tabelul 3.1 Funciile numerice
Funcia
ABS(n)
Rolul funciei
Returneaz valoarea absolut
a numrului n.
ACOS(n)
ASIN(n)
Arc sinus de n.
ATAN
Arc tangent de n.
Exemple
SELECT ABS(-15) "Absolut"
FROM DUAL;
Absolut
---------15
SELECT COS(.3)"Arc_Cosinus"
FROM DUAL;
Arc cosinus
---------1.26610367
SELECT ASIN(.3) "Arc_Sinus"
FROM DUAL;
Arc_Sinus
---------.304692654
SELECT ATAN(.3) "Arc_Tangent"
FROM DUAL;
ATAN2
CEIL(n)
COS(n)
Cosinus de n.
COSH(n)
Cosinus hiperbolic de n.
EXP(n)
FLOOR(n)
LN(n)
Returneaz logaritmul
natural de n, unde n > 0.
LOG(m,n)
MOD(m,n)
Arc_Tangent
---------.291456794
SELECT ATAN2(.3,.2) Arc_Tangent2"
FROM DUAL;
Arc_Tangent2
-----------.982793723
SELECT CEIL(15.7) "NUMR"
FROM DUAL;
NUMR
---------16
SELECT COS(180 * 3.14/180)
"Cosinus de 180 grade"
FROM DUAL;
Cosinus de 180 grade
---------------------1
SELECT COSH(0) "Cosinus
hiperbolic de 0"
FROM DUAL;
Cosinus hiperbolic de 0
---------------------1
SELECT EXP(4) "e la puterea 4"
FROM DUAL;
e la puterea 4
-----------------54.59815
SELECT FLOOR(15.7) "Floor"
FROM DUAL;
Floor
---------15
SELECT LN(95) "Logaritm natural de
95"
FROM DUAL;
Logaritm natural de 95
----------------4.55387689
SELECT LOG(10,100) "Log n baza
10 de 100"
FROM DUAL;
Log n baza 10 de 100
-----------------2
SELECT MOD(11,4) "Modulo 4"
POWER (n,m)
ROUND
(n[,m])
SIGN(n)
SIN(n)
SINH
Returneaz n rotunjit la un
numr de m yecimale. Dac
m este omis se elimin
zecimalele, iar dac este
negativ se face rotunjirea
numrului din dreapta
virgulei zecimale, dup
regula: m = -1 rotunjire la
nivel de zeci, m = -2 rotunjire
la nivel de sute i aa mai
departe.
FROM DUAL;
Modulo 4
---------3 2.
de n.
SQRT(n)
TAN(n)
Returneaz tangent de n.
TANH(n)
Returneaz tangent
hiperbolic de n.
TRUNC (n,m)
1"
FROM DUAL;
Sinus hiperbolic de 1
-------------------1.17520119
SELECT SQRT(26) "Rdcin ptrat"
FROM DUAL;
Rdcin ptrat
----------5.09901951
SELECT TAN(135 * 3.14/180)
"Tangent de 135 grade"
FROM DUAL;
Tangent de 135 grade
----------------------1
SELECT TANH(.5) " Tangent
hiperbolic de 5"
FROM DUAL;
Tangent hiperbolic de 5
-----------------------.462117157
SELECT TRUNC(15.79,-1) "Trunc"
FROM DUAL;
Trunc
---------10
Rolul funciei
Returneaz caracterul care
are valoarea binar n.
Exemple
SELECT CHR(67)||CHR(65)||CHR(84)
"Caractere"
FROM DUAL;
Caractere
CONCAT
(c1,c2)
INITCAP
('ir')
LOWER ('ir')
LPAD
('c1',n,'c2')
--CAT
SELECT CONCAT( CONCAT (nume, '
este '), funcie) "Funcie"
FROM tab1
WHERE codfuncie = 7000;
Funcie
----------------Popescu este PROGRAMATOR
SELECT INITCAP('cuvnt1 cuvnt2')
"Litere mari"
FROM DUAL;
Litere mari
--------Cuvnt1 Cuvnt2
SELECT LOWER('BUCURETI')
"Liter mic"
FROM DUAL;
Liter mic.
-------------------bucureti
SELECT LPAD('Page.1',10,'*.')
"LPAD exemplu"
FROM DUAL;
LPAD exemplu
--------------*.*.*Pag.1
REPLACE
('c1','c2','c3')
RPAD
('c1',n[,'c2'])
RTRIM
('c1','c2')
SUBSTR
('c1',m[,n])
IONESCU
MARINESCU
POPESCU
OLGA
Not: Numele care ncep cu o liter mai
mare dect 'O' nu se vor afia.
SELECT
RTRIM('BUCURETIyxXxy','xy')
"RTRIM exemplu"
FROM DUAL;
RTRIM exemplu
------------BUCURETIyxX
SELECT SUBSTR
('ABCDEFG',3.1,4) Subir1"
FROM DUAL;
Subir1
---CDEF
SELECT SUBSTR('ABCDEFG',-5,4)
"Subir2"
FROM DUAL;
Subir2
---CDEF
TRANSLATE
('c1','c2','c3')
UPPER('c1')
Rolul funciei
Returneaz
valoarea
zecimal
a
primului
caracter din irul 'c1'.
INSTR ('c1','c2'
[,n[,m]])
LENGTH
Exemple
SELECT ASCII('Q')
FROM DUAL;
ASCII('Q')
---------81
SELECT INSTR ('CORPORATE
FLOOR','OR', 3, 2) "INSTR"
FROM DUAL;
INSTR
---------14
SELECT INSTR ('CORPORATE
FLOOR', 'OR', -3, 2) "INSTR
INVERS" FROM DUAL;
INSTR INVERS
----------------2
SELECT LENGTH('BUCURETI')
caractere
caractere
CHAR.
a irului de
'c1' de tip
"LUNGIME IR"
FROM DUAL;
LUNGIME IR
-------------------9
Rolul funciei
Returneaz data
d plus un numr
de luni egal cu
n.
LAST_DAY (d)
Returneaz data
ultimei zile din
lun.
MONTHS_
BETWEEN (d1, d2)
Returneaz
numrul de luni
dintre datele d1
Exemple
Dac n coloana data1 aferent numelui
'POPESCU' din tabela tab1 avem data 17
septembrie2005 cu comanda de mai jos se va
ob'ine data 17 octombrie 2005.
SELECT TO_CHAR
(ADD_MONTHS(data1,1), 'DD-MON-YYYY')
"Luna urmtoare"
FROM tab1
WHERE nume = 'POPESCU';
Luna urmtoare
----------17-OCT-2005
Cu aceast funcie se poate determina numrul
zilelor rmase din luna curent.
SELECT SYSDATE, LAST_DAY(SYSDATE)
"ULTIMA",LAST_DAY(SYSDATE) - SYSDATE
"ZILE RMASE"
FROM DUAL;
SYSDATE
ULTIMA
ZILE RMASE
-------------------------23-SEP-05 30-SEP-05
7
SELECT
TO_CHAR(ADD_MONTHS(LAST_DAY(data1),
5), 'DD-MON-YYYY') "Cinci luni"
FROM tab1
WHERE nume = 'POPESCU';
Cinci luni
----------28-FEB-2006
SELECT MONTHS_BETWEEN
(TO_DATE('02-09-2005','MM-DD-YYYY'),
TO_DATE('01-08-2005','MM-DD-YYYY') )
ROUND (d[,fmt])
SYSDATE
TRUNC (d,[fmt])
i d2. Dac d1
i d2 sunt
acelei zile din
lun sau sunt
ultimele zile din
lun rezultatul
este un numr
ntreg, altfel
Oracle
calculeaz
fraciuni din
lun bazat pe o
lun cu 31 zile.
Returneaz data
primei zile a
sptmnii dup
ziua definit de
irul 'c1' i care
este dup data
d.
Returneaz data
d rotunjit la
unitatea de timp
specificat de
ctre formatul
fmt, conform
specificaiilor
de la sfritul
tabelului.
Returneaz data
i timpul curent.
Returneaz data
d fr timp
trunchiat la o
unitate
specificat de
formatul fmt, iar
dac este absent
se face
trunchierea la
ziua cea mai
"Luni"
FROM DUAL;
Luni
---------1.03225806
SELECT TO_CHAR(SYSDATE,
'MM-DD-YYYY HH24:MI:SS') "Data i timpul
curent"
FROM DUAL;
Data i timpul curent
------------------27-09-2005 20:27:11
SELECT TRUNC(TO_DATE
('27-SEP-05','DD-MON-YY'), 'YEAR')
"Anul nou"
FROM DUAL;
Anul nou
--------01-JAN-05
apropiat.
Formatul fmt utilizat de funciile ROUND i TRUNC
Formatul fmt
Semnificaia formatului fmt
CC, SCC
Se rotunjete la nivel de secol (primii doi digii ai anului
exprimat pe patru digii + 1)
Exemplu: 1898 se rotujete la 1998.
SYYYY, YYYY, YEAR SYEAR, Se rotunjete la nivelul 01 ianuarie a anului din data care
YYY, YY, Y
se rotunjete.
Exemplu: 27-sep-05 se rotunje;te la 01-jan-05.
Q
Rotunjire la nivel de trimestru (Se routunjete n sus la a
asesprezecea zi a lunii a doua a trimestrului).
MONTH, MON, MM, RM
Rotunjire la nivel de lun (Se routunjete n sus la a
asesprezecea zi a lunii).
HEXTOROW('c1')
RAWTOHEX(raw)
ROWIDTOCHAR
(rowid)
Semnificaia
Convertete un ir de
caractere de la un set
de caractere la alt set
de caractere. Setul
set_surs este setul de
caractere din care fac
parte caracterele
irului 'c1', iar
set_destinaie este setul
de caractere n care se
convertesc caracterele
irului 'c1'.
Convertete irul 'c1'
care conine digii
hexazecimali la tipul de
date RAW.
Convertete digii
hexazecimali de tip
RAW la irul 'c1'.
Convertete valoarea
ROWID la o valoare de
tip VARCHAR".
Rezultatul conversiei
Exemple
SELECT CONVERT('Gro', 'US7ASCII',
'WE8HP') "Conversie"
FROM DUAL;
Conversie
---------Gross
Seturile de caractere cele mai comune
sunt: US7ASCII, WE8DEC, WE8HP,
F7DEC, WE8EBCDIC500 , WE8PC850,
WE8ISO8859P1 .
INSERT INTO tab1 (raw_column)
SELECT HEXTORAW('7D') FROM
DUAL;
SELECT ROWID
FROM tab1
WHERE ROWIDTOCHAR(ROWID)
LIKE '%Br1AAB%';
ROWID
-----------------AAAAZ6AABAAABr1AAB
TO_CHAR pentru
conversie de caractere,
are sintaxa:
TO_CHAR
(d [, fmt])
Convertete data d de
tip DATE la o valoare
de tip VARCHAR2 n
formatul specificat.
TO_CHAR pentru
conversie de numere,
are sintaxa:
TO_CHAR
(n [, fmt])
Convertete numrul n
de tip NUMBER la o
valoare de tip
VARCHAR2.
CHARTOROWID
('c1')
Convertete o valoare
de tip CHAR sau
VARCHAR2 la o
valoare de tip ROWID
TO_DATE
('c1' [, fmt ])
Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare de tip
DATE n conformitate
cu formatul fmt .
Formatul fmt pentru
datele de tip DATE este
prezentat n tabelul 3.7.
Convertete irul de
caractere 'c1' de tip
CHAR sau VARCHAR2
la o valoare numeric
de tip NUMBER n
conformitate cu
formatul fmt. Forma
acestui format este n
tabelul 3.6.
TO_NUMBER
('c1',[,fmt ])
UPDATE tab1
SET salariu = salariu +
TO_NUMBER('100.00', '9G999D99')
WHERE nume = 'ION';
Exemple
9999
0999 9990
$
B
MI
S
$999
B999
999MI
S999
D
G
,
.
RN sau rn
99D99
99G999
99,999,99
999.99
RN sau rn
Se specific
n
TO-DATE
Da
Da
Da
Da
Nu
D
DAY
DD
DDD
HH sau HH12
HH24
J
Da
Da
Da
Da
Da
Da
Da
MI
MM
MON
MONTH
PM sau P.M.
RR sau RRRR
SS
SSSS
Da
Da
Da
Da
Nu
Da
da
Da
WW
W
YYYY,YYY,YY,Y
Nu
Nu
Da
EMPTY_
[B|C]LOB()
BFILENAME
('director',
'nume_fiier')
GREATEST (expr
[,expr] ...)
Rolul funciei
Returneaz o valoare de tip
VARCHAR2 coninnd codul
tipului de date, lungimea n
baii i reprezentarea
intern a expresiei expr
return_format este codul
sistemului de numeraie n
care este reprezentat
valoarea returnat de
funcie pentru irul 'c1';
Dac se furnizeaz ca o
valoare egal cu codul
sistemului de numeraie +
1000 se returneaz i
numele sistemului de
numeraie.
start_position determin
poziia din irul 'c1' de unde
s nceap DUMP-u
length este lungimea
DUMP-ului.
Returneaz un pointer sau
locator care poate fi folosit
pentru iniializare unei
variabile de tip LOB, ntr-un
INSERT, ntr-un UPDATE
pentru iniializarea unei
coloane de tip LOB sau ca
atribut EMPTY, care
nseamn c LOB-ul a fost
iniializat dar nu a fost
populat cu date.
Returneaz un pointer sau
locator asociat cu un LOB
de tipul unui fiier binar de
pe server.
director este numele
directorului unde se afl
fiierul LOB de tip binar.
nume_fiier este numele
fiierului.
Returneaz valoarea cea
mai mare dint-o list de
valori.
Exemple
SELECT DUMP('abc', 1016)
FROM DUAL;
DUMP('ABC',1016)
----------------------------------Typ=96
Len=3 CharacterSet=WE8DEC:
61,62,63
SELECT DUMP(nume, 8, 3, 2)
"OCTAL"
FROM tab1
WHERE nume = 'SCOTT';
OCTAL
---------------------------Type=1 Len=5: 117,124 Sistemele
de numeraie sunt: 8 = sistemul
octal; 10 = sistemul zecimal; 16 =
sistemul hexazecimal; 17 =
rezultatul este returnat sub forma
de caractere singulare.
INSERT INTO lob_tab1
VALUES (EMPTY_BLOB());
UPDATE lob_tab1
SET clob_col = EMPTY_BLOB();
LEAST (expr
[,expr] ...)
UID
USER
USERENV (option)
Returneaz informaii
despre sesiune curent.
VSIZE(expr)
HARRY
SELECT
LEAST('HARRY','HARRIOT','HAR
OLD') "Mic"
FROM DUAL;
Mic
-----HAROLD
SELECT nume,
NVL(TO_CHAR(comision), 'NOT
APPLICABLE') "COMISION"
FROM tab1
WHERE codepart = 30;
NUME COMISION
---------- -----------------ALLEN 300
WARD
500
MARTIN 1400
TURNER 0
JAMES NOT APPLICABLE
Semnificaia
Returnez media celor n
valori
COUNT ({* |
[DISTINCT|ALL] expr})
Returneaz toate
rndurile cererii. Dac
avem argumentul = * se
returneaz toate
rndurile indiferent de
valoarea lor (NULL sau
NOT NULL)
MAX([DISTINCT|ALL]
expr)
MIN([DISTINCT|ALL]
expr)
Exemple
SELECT AVG(salariu) "Medie"
FROM tab1;
Media
---------2077343.21429
SELECT COUNT(*) "Total"
FROM tab1;
Total
---------18
SELECT COUNT(job) "Count"
FROM tab1;
Count
---------14
SELECT COUNT(DISTINCT
job) "Jobs"
FROM emp;
Jobs
---------5
SELECT MAX(salariu)
"Maximum"
FROM tab1;
Maximum
---------5000
SELECT MIN(data1) "Minim"
FROM tab1;
Minimum
--------17-DEC-80
SELECT SUM(salariu) "Total"
FROM tab1;
Total
---------29081
SUM([DISTINCT|ALL] n)
Exemplu:
(10, 20, 40)
('SCOTT', 'BLAKE', 'TAYLOR')
(LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)
5. CONDIIILE
Condiia este o combinaie de una sau mai multe expresii i
operatori logici evaluat cu una din valorile TRUE, FALSE sau
UNKNOWN. Condiiile se pot folosi n clauza WHERE a instruciunilor
SQL DELETE, SELECT i UPDATE sau ntr-una din clauzele WHERE,
START WITH, CONNECT BY sau HAVING ale instruciunii SELECT.
Exemple:
1) Expresia 1=1 este evaluat ca TRUE
2) Expresia NVL(sal, 0) + NVL(comm, 0) > 2500 adun valoarea
sal cu comm i evalueaz rezultatul dac este >= cu 2500000. Dac sal sau
comm sunt NULL se vor nlocui cu valoarea zero.
Condiiile au opt forme de prezentare.
Forma I este folosit pentru compararea unei expresii cu alt
expresie sau cu o subcerere i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= expresi2 | (subcerere)
sau
list_de_expresii = | != | <> (subcerere)
Forma II este folosit pentru compararea unei expresii sau a unei
liste de expresii cu unul sau toi membrii unei liste de xepresii sau ai unei
subcereri i are sintaxa:
expresie1 = | != | <> | > | < | >= | <= ANY | SOME | ALL
list_de_expresii | (subcerere)
sau
list_de_exp = | != | <> ANY | SOME | ALL (list_expr1,
list_expr2, ) | (subcerere1,
subcerere2, . )
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, . )
Forma IV este folosit pentru testarea existenei sau inexistenei
expresiei ntre dou limite i are sintaxa:
expresie1 NOT BETWEEN expr2 AND expr3
Forma V este folosit pentru testarea valorii NULL i are sintaxa:
expresie1 IS NOT NULL
Forma VI este folosit pentru testarea existenei unui rnd nt-o
subcerere i are sintaxa:
EXISTS ( subcerere )
Forma VII este folosit pentru testarea egalitii unei ir de caractere
cu un format anume, cu un alt ir de caracter i are sintaxa:
ir_ caracter1 NOT LIKE ir_cacrater2 ESCAPE
'caracter_de_schimbare'
Forma VIII este folosit pentru specificarea unei combinaii de mai
multe condiii i poate avea sintaxele:
NOT condiie
sau
condiie1 NOT AND | OR condiie2
6. DESCHIDEREA I NCHIDEREA UNEI SESIUNI DE LUCRU
SQL*PLUS
Pentru a avea acces la componentele unei baze de date (tabele, viziuni, clustere etc.), utilizatorul trebuie mai nti s se conecteze la ea. La
sfritul sau n timpul unei sesiuni SQL exist posibilitatea deconectrii de
la baza de date. O prim conectare se face atunci cnd se ncepe lucrul cu
SQL*Plus. Efectul comenzii sau utilizrii meniului sistem l constituie
deschiderea unei sesiuni de lucru sub SQL*Plus.
Comanda are urmtoarele forme sintactice:
SQLPLUS [nume-utilizator[/parol]
[@nume-baz-de-date]
[@nume-fiier]
[-SILENT]
SQLPLUS /NOLOG [-SILENT]
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-dedate atunci ntre ele nu trebuie s existe spaiu. Parola sau @nume-baz-dedate vor fi separate printr-un spaiu de @nume-fiier.
Conectarea utilizatorului la o baz de date
Dac n timpul unei sesiuni de lucru SQL*PLUS se dorete conectarea la o alt baz de date dect cea deschis iniial se poate folosi comanda
CONNECT.
Sintaxa acestei comenzi este:
CONN[ECT] [nume-utilizator[/parol]]
[@nume-baz-de-date];
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 printrun 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.
Abreviaia
A text
C /old/new/
C/text
CL BUFF
Fr abreviaie
I
I text
L
L n sau n
L*
L LAST
Lmn
Funcia
Adaug text la sfritul unei linii
Schimb un text cu altul
terge textul unei linii
Cur bufferul
terge o linie
Adaug una sau mai multe linii
Adaug o linie format dintr-un text
Listeaz toate liniile din buffer
Listeaz linia n
Listeaz linia curent
Listeaz ultima linie
Listeaz liniile de la m la n
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/
/* &v1_col_grup = nume coloan din tabel dup valorile creia se
va face gruparea
/* &v2_tip_calc = tipul calculului: min, max, sum pentru un anumit
grup de valori numerice
/* &v3_col_calc = numele coloanei de tip numeric dup care se va
face calculul
/*&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending)
SELECT &v1_col_grup,
&v2_tip_calc(&v3_col_calc),
&v4_nume_col_calculat
FROM pers100
GROUP BY &v1_col_grup
ORDER BY &v2_tip_calc(&v3_col_calc,) &v5_tip_sort;
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - --*/
Dup apelul fiierului cu comanda @calc& sistemul ne va cere
succesiv s furnizm valorile dorite pentru variabilele definite astfel:
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v4_nume_col_calculat: MINIMUM
Enter value for v1_col_grup: nume
Enter value for v2_tip_calc: min
Enter value for v3_col_calc: salariu
Enter value for v5_tip_sort: desc
Iar rezultatul dup executare comenzii va arta ca mai jos:
NUME
MINIMUM
------------------------------ --------ionescu
3500000
petrescu
2500000
mihai
1500000
b) Substituirea variabilelor prefixate cu dou
&. Pentru
exemplificare vom crea, pornind de la fiierul de comenzi CALC&.SQL,
fiierul de comenzi CALC&&.SQL n care variabilele vor fi prefixate cu
doua caractere &, ca mai jos:
/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - -*/
/* &&v1_col_grup = nume coloan din tabel dup valorile creia
se va face gruparea
/* &&v2_tip_calc = tipul calculului: min, max, sum pentru un
anumit grup de valori numerice
/* &&v3_col_calc = numele coloanei de tip numeric dup care se
va face calculul
/*&&v4_nume_col_calculat = numele coloanei, n list, pe care se
vor afia valorile calculate
/* &&v5_tip_sort = tipul ordonrii(sortrii), desc(descending) sau
asc(ascending) */
SELECT &&v1_col_grup,
&&v2_tip_calc(&&v3_col_calc),
&&v4_nume_col_calculat
FROM pers100
GROUP BY &&v1_col_grup
ORDER BY &&v2_tip_calc(&&v3_col_calc), &&v5_tip_sort
/* - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - - - -*/
La momentul executrii fiierului de comenzi CALC&&.Sql
sistemul va cere s introducem valorile dorite pentru variabilele definite la
fel ca la apelul precedent cu deosebirea c valorile ce le vom furniza vor fi
memorate de fiecare dat astfel c indiferent de cte ori apare o variabil
pentru ea se va furniza valoarea o singur dat. Orice execuie ulterioar a
unui fiier de comenzi n care apare una din variabilele create anterior
(definite implicit ca variabile utilizator) se vor folosi aceste valori. Execuia
acestui fiier de comenzi va produce acelai rezultat ca i execuia fiierului
CALC&.SQL. Rulnd comanda DEFINE vom gsi n sistem pe lng alte
variabile utilizator i variabilele create prin execuia fiierului
CALC&&.SQL.
Exemplu:
SQL> DEFINE
DEFINE _EDITOR
= Notepad (CHAR)
DEFINE _RC
= 1 (CHAR)
DEFINE V1_COL_GRUP = nume (CHAR)
DEFINE V2_TIP_CALC = min (CHAR)
DEFINE V3_COL_CALC = salariu (CHAR)
DEFINE V4_NUME_COL_CALCULAT = minimum (CHAR)
DEFINE V5_TIP_SORT = desc (CHAR)
Dac vom dori rularea procedurii create anterior dar dnd variabilelor alte
valori, va trebui nti s tergem aceste variabile cu comanda UNDEFINE.
8. FORMATAREA REZULTATELOR
Limbajul SQL*PLUS permite proiectarea i formatarea diverselor
situaii de ieire. Aceste operaii sunt posibile prin utilizarea unor comenzi
pentru tratarea ntreruperilor, comenzi pentru definirea titlurilor, definirea
coloanelor, realizarea calculelor i stabilirea diverselor opiuni pentru
poziionarea unor arii de lucru pe ecran.
A. Tratarea ntreruperilor
ntreruperea este un eveniment care se produce n timpul execuiei
unei comenzi SELECT, cum ar fi, de exemplu, apariia sfritului de pagin
sau schimbarea valorii unei expresii.
Pentru a specifica evenimentele care determin o ntrerupere i
aciunea corespunztoare SQL care se execut, se utilizeaz comanda
BREAK. Ea poate specifica mai multe evenimente care genereaz o
ntrerupere. Evenimentele sunt reinute ntr-o ordine numit "ierarhie de
ntrerupere". La un moment dat,"se poate executa doar o singur comand
BREAK.
Comanda BREAK are urmtoarele forme sintactice:
BRE[AK] ON {expr | ROW | PAG[E] | REPORT}
[SKI[P] n | [SKIP]PAGE]
[NODUP[LICATES] | DUP[LICATES]];
BRE[AK];
unde:
ON expr determin o ntrerupere cnd se schimb valoarea expresiei expr;
expr este fie o expresie care implic una sau mai multe coloane dintr-o
tabel, fie o etichet ataat unei coloane declarat in comanda SELECT
sau COLUMN.
Dac ON expr apare de mai multe ori n comand, atunci expresiile respect
"ierarhia de ntrerupere", aceasta fiind chiar ordinea n care sunt specificate
expresiile. Cnd se folosete ON expr, trebuie utilizat i clauza ORDER
BY, pentru a ordona rndurile din "ierarhia de ntrerupere*. Ordinea de
apariie a expresiilor expr n comanda BREAK ON trebuie s rte aceeai cu
cea prezent n SELECT...GRDER BY:
ON ROW determin o ntrerupere cnd se selecteaz un rnd cu SELECT.
Aceast ntrerupere este reinut la sfritul ierarhiei de
ntrerupere;
ON PAGE determin o ntrerupere la sfritul fiecrei pagini;
ON REPORT determin o ntrerupere la sfritul raportului sau cererii,
ntrerupere care este reinut la nceputul ierarhiei de ntrerupere.
SKIP determin saltul peste n linii, nainte de a se tipri linia
asociat ntreruperii respective.
PAGE sau SKIP PAGE determin saltul la o pagin nou nainte de a tipri
linia asociat respectivei ntreruperi.
NODUPLICATES determin tiprirea de spaii cnd valorile de JJS coloana
de ntrerupere sunt identice. DUPLICATES determin tiprirea valoarii
coloanei de ntrerupere n fiecare rnd selectat. Valoarea
NODUPLICATES este implicit.
Comanda BREAK fr clauze indic poziia ntreruperii curente.
Exemple:
1) S fie definit o ntrerupere generat de schimbarea valorilor coloanei
FUNCT. La apariia acestui eveniment s fie afiate dou linii vide.
SQL> BREAK ON FUNCT SKIP 2;
SQL> SELECT MARCA,NUME,CODD,
2 SALA, VENS
3 FROM SALARIAI
4 ORDER BY FUNCT;
MARCANUME
FUNCT
7000
ION ION
DIRECTOR
2550
FRINCU ION SEF DEP
1000
COMAN RADU
2500
VLAD VASILE
4000
PAUL TEFAN
3755
DORU DAN
CODD
100000
160000
130000
160000
160000
130000
SALA
45000
36000
35000
36500
35000
36500
VENS
40000
37000
2500
1500
5600
5500
1111
1680
3700
2553
3760
3770
2554
3759
3500
2650
1222
100000
130000
160000
120000
130000
130000
120000
160000
160000
120000
120000
21200
20750
27500
25000
25600
26500
26000
25700
24500
25060
20750
1000
3000
2500
400
0
2000
350
3500
2000
FUNCT
VINZATOR
VINZATOR
VINZATOR
CODD
100000
120000
120000
SALA
21200
25060
20750
MARCA NUME
2550
FRINCU ION
3500
DAN ION
1680
RADU ION
FUNCT
SEF DEP
VINZATOR
VINZATOR
CODD SALA
160000 36000
160000 24500
130000 20750
VENS CODS
1000
1000
3500
2000
VENS CODS
37000 2500
350
3000
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]...;
CODP
D4
A3
A7
DENP
SCAUN
FOTOLIU
MASA
STOC
36
27
23
DATA CRT
UM
10-SEP-05
BUC
15-SEP-05
BUC
05-SEP-05
BUC
Semnatura:
STOC DATACRT
100
12-JUL-05
36
12-JUL-05
7
27-JUN-05
12
01-JUL-05
6
18-JUL-05
9
29-JUL-05
UM
MP
BUC
BUC
BUC
BUC
BUC
Cod produs
Stoc
Data
UM
100000
100000
100000
100000
100000
100000
PLACAJ 2/2
SCAUN D4
MESE 15/20
FOTOLIU A3
CANAPEA A7
BIROU C6X4
166666
144444
111111
122222
133333
155555
100
36
7
12
6
9
12-JUL-05
12-JUL-05
27-JUN-05
01-JUL-05
18-JUL-05
29-JUL-05
MP
BUC
BUC
BUC
BUC
BUC
Depozitul MOBILA/100000
3 FROM COMENZI
4 WHERE DATAL<='30- SEP-05;
SITUATIA COMENZILOR LA DATA DE 30- SEP-05
NRCOM
211111
255566
166666
27000
CODP
233333
133333
222222
375000
VALOARE
244444
144444
320000
282000
Anularea opiunilor
n vederea anulrii opiunilor se utilizeaz comanda:
CL[EAR] option
Este anulat opiunea specificat prin option, dup cum urmeaz:
BRE[AKS] anuleaz ntreruperea indicat prin comanda BREAK;
BUFF[ER] determin tergerea textului din buffer-ul curent;
COL[UMNS] anuleaz opiunile indicate n comanda COLUMN;
COMP[UTES] anuleaz opiunile indicate prin comanda
COMPUTE;
SCR[EEN] determin tergerea ecranului, iar SQL determin
tergerea buffer-ului SQL;
TIMI[NG] terge toate zonele create cu comanda TIMING.
Exemple:
1) S se anuleze ntreruperile.
SQL> CLEAR BREAKS;
2) S se anuleze definiiile de coloan.
SQL> CLEAR COLUMNS;
Descrierea coloanelor
Pentru specificarea modului de formare a unei coloane i a capului
de coloan ntr-o situaie, se utilizeaz comanda COLUMN. Sintaxa ei este:
COL[UMN] (col | expr) [ALI[AS] sinonim] CLE[AR] |
DEF[AULT]]
[COLOR
{culoare|
variabila-culoare}]
[FORMAT] format] [HEA[DING] text
[JUS[TIFY] {L[EFT | C[ENTER] | R[IGHT]] [LIKE {expr |
etichet}] [LINEAPP {LINE | MARK | BOTH}]
[NEW_VALUE variabila] [NU[LL] char] [NOPRl[NT] |
PRINT]] [OLD_VALUE variabila]
[ON | OFF]
[PATTERN {numr-de-model | variabila-model}
[WRA[PPED]! WOR[D,... WRAPPED] |
TRU[NCATED]]
...;
unde:
col sau expr au rolul de a identifica coloana sau expresia la care se refer
comanda. Comanda COLUMN trebuie s se refere la o coloan sau la o
expresie utilizat-a n comanda SELECT. Dac comanda COLUMN se refer
la o expresie, aceasta trebuie s fie specificat n acelai mod n care a fost
specificat n SELECT. De exemplu, dac n SELECT expresia este 'A.+B',
nu se poate folosi, n COLUMN, T+A'. Dac sunt selectate din tabele
diferite coloane cu acelai nume, atunci comanda COLUMN se va aplica
tuturor tabelelor ce conin acea coloan.
Clauza ALIAS pune n coresponden numele coloanelor cu sinonimul
specificat.
Clauza CLEAR are ca efect tergerea n totalitate a definiiei coloanei.
Clauza FORMAT specific formatul de apariie ai coloanei. Limea
implicit a coloanei este chiar limea coloanei definite n baza de date. Ea
poate fi schimbat cu valoarea n, folosind "FORMAT An". Limea unei
coloane numerice este implicit valoarea data de NUMWIDTH, ea putnd fi
schimbat cu ajutorul clauzei FORMAT.
Clauza HEADING definete capul coloanei, care implicit este col sau expr.
Dac textul din definirea coloanei conine spaii sau semne de punctuaie,
acestea trebuie puse ntre ghilimele. Fiecare semn "I" din text are ca efect
nceperea unei linii noi.
Clauza JUSTIFY aliniaz capul coloanei. Implicit, alinierea se face la
dreapta pentru o coloan numeric i la stnga pentru alte tipuri de coloane.
Clauza LIKE determin copierea specificaiilor altei coloane sau expresii
(specificaii deja definite prin alt comand COLUMN).
Prin folosirea clauzei NEWLINE se trece la o linie nou, nainte de a afia
valorile coloanei.
Clauzele PRINT i NOPRINT au ca efect tiprirea sau nu a coloanei.
Dac se utilizeaz clauza NULL, textul va fi afiat chiar dac conine o
valoare nul. Valoarea implicit este un ir de blancuri.
Clauzele OFF sau ON determin folosirea, respectiv nefolosirea formatului
specificaiei de ieire pentru o coloan, fr a-i afecta coninutul.
Clauza WRAPPED are ca efect scrierea pe linia urmtoare a caracterelor
care nu au ncput pe prima linie.
Clauza WORD_WRAPPED are efect asemntor cu cel al clauzei
WRAPPED, cu deosebirea c determin scrierea ntregului cuvnt pe linia
urmtoare i nu pe dou rnduri ca la WRAPPED.
Clauza TRUNC determin trunchierea valorii.
Clauza COLOR specific culoarea utilizat pentru afiarea valorilor
coloanei, ntr-o reprezentare liniar sau prin benzi. Variabila CLR n (n=l,60)
MARCA
1111
1222
NUME
AVRAM ION
BARBU DAN
2 records selected.
STOC
100
7
36
12
6
9
DATACRT
12-JUL-92
27-JUN-92
12-JUL-92
01-JUL-92
18-JUL-92
29-JUL-92
UM
MP
BUC
BUC
BUC
BUC
BUC
STOC DATACRT
7
27-JUN-05
UM
BUC
D.Realizarea de calcule
SQL*Plus permite realizarea unor calcule cu rndurile selectate din
tabele. Pentru aceasta se utilizeaz comanda COMPUTE, care are
urmtoarea sintax:
COMP[UTE] [AVG | COU[NT] | MAX[IMUM] |
MIN[IMUM] NUMBER) ISDT | SUM | VAR[IANCE}]
OF { expresiei etichet),...
ON [expresiei etichet IPAGE1 REPORT! ROW];
Semnificaia clauzelor este:
Clauza
Semnificaia
AVG
COUNT
MAXIMUM
MINIMUM
NUMBER
STD
SUM
VARIANCE
Valoare medie
Contorizare valori nule
Valoare maxim
Valoare minim
Contorizare rnduri
Abatere standard
Suma valorilor nenule
Dispersia
Dac se specific mai multe funcii, nu trebuie separate ntre ele prin
virgul.
OF precizeaz coloana sau expresia ale cror valori se vor supune
calculului. Acestea trebuie s apar n comanda SELECT, altfel comanda
COMPUTE le va ignora. Dac se dorete ca valoarea calculat s nu fie
afiat pe ecran se va utiliza clauza NON PRINT ataat coloanei
respective cu comanda SELECT.
ON specific un element care va fi utilizat ca generator de ntrerupere. El
poate fi: expresie, etichet, pagin (PAGE), raport (REPORT), linie (ROW).
De cte ori se va schimba valoarea acestuia, se va declana automat
recalcularea funciei definite de COMPUTE.
n cazul n care se d comanda fr nici o funcie, se vor afia
specificaiile de calcul definite.
Secvena de instruciuni care se va utiliza, n general, va fi:
SQL* BREAK ON expresiei
SQL> COMPUTE clauza OF expresie2 ON expresiei;
SQL> SELECT
Exemple:
1) S se editeze situaia final cu urmtorul format:
SITUAIE SUM(SALA) FUNCIE
SQL> SET PAGESIZE 22
SQL>RUN
1 SELECT SUM(SALA),FUNCT FROM SALARIAI
2* GROUP BY FUNCT
SITUAIE
SUM(SALA)
45000
179000
268560
FUNCT
DIRECTOR
SEF DEP
VINZATOR
SITUATIE
FUNCT
DIRECTOR
SEF DEP
VINZATOR
DEP
45000
0
21200
Data:
DEP
0
71500
72850
DEP
0
107500
77700
Semntura:
DEP 10
45000
0
21200
DEP 13
0
71500
72850
DEP 16
0
107500
77700
SUM(SALA)
45000
179000
268500
Data:
Semntura:
Data:
DEP 10
45000
0
21200
66200
DEP 13
0
71500
72850
144350
Semntura:
DEP 16
0
107500
77700
185200
SUM(SALA)
45000
179000
268500
Formatul
Explicaii
CHAR( mrime)
Date
DATE
Long
LONG
LONG VARCHAR
LONG ROW
Numerice NUMBER
NUMBER (mrime)
NUMBER (ntregi
zecimali)
NUMBER(*)
DECIMAL
FLOAT
INTEGER
INTEGER (mrime)
RAW
SMALLINT
RAW(mrimea)
LONGRAW
unde:
UNIQUE se refer la faptul c tabela nu va conine dou rnduri cu aceleai
valori n coloanele index (deci nu vor exista dubluri n coloana index). Dac
se omite, tabela poate conine oricte asemenea rnduri care s aib n
coloana index aceeai valoare.
ASC|DESC precizeaz ordinea n care va fi pstrat indexul: ascendent sau
descendent.
COMPRESS indic faptul c indecii pot fi comprimai, reducndu-se n
acest mod spaiul necesar memorrii acestora i mrindu-se viteza
operaiilor care folosesc indecii. Comprimarea nu permite gsirea ntr-un
index a valorii unui anumit cmp fr s acceseze tabela. NOCOMPRESS
suprim comprimarea indecilor.
SYSSORT specific faptul c procedura standard SQL de sortare este
folosit pentru a crea un index. NOSYSSORT este folosit pentru depanare.
ROWS specific numrul aproximativ de rnduri ce urmeaz a fi indexate.
Acest numr este utilizat pentru a optimiza sortarea n SYSSORT. Clauza
nu are efect n SQL*Plus.
PCTFREE specific, n momentul crerii indexu-lui, procentul din spaiul
pentru index ce trebuie s rmn liber pentru actualizri. Nu are efect
asupra extensiilor alocate dup crearea indexului.
Indexul creat permite creterea vitezei de acces la datele unei tabele
prin intermediul coloanei index datorit faptului c se vor cuta rndurile
corespunztoare valorilor coloanei index, fr a citi ntreaga tabel.
Deoarece indexul i tabela trebuie actualizate, introducerile, tergerile i
modificrile n cmpul de valori ale coloanei index necesit un timp mai
mare. De aceea, se recomand crearea de maxim 3 indeci pentru o tabel.
In funcie de necesiti, se pot creea i terge n mod dinamic indeci.
Indecii creai pentru o singur tabel trebuie s aib nume distincte.
Pentru tabele diferite pot fi creai indeci cu acelai nume. n momentul
tergerii acestor indeci trebuie specificat tabela din care fac parte.
Comanda de validare a unui index este VALIDATE INDEX.
Aceast comand verific integritatea indexului specificat pentru o anumit
tabel. Dac pe tabela respectiv a fost creat un singur index, al crui nume
va fi specificat n comand, atunci numele tabelei poate fi omis. Comanda
VALIDATE INDEX are sintaxa:
VALIDATE INDEX nume-index
[ON nume-tabel] [WITH LIST];
unde:
Index dropped.
5. CREAREA I ACTUALIZAREA TABELELOR I INDECILOR
PARTIIONAI
Partiionarea este procesul de mprire a tabelelor i indecilor
foarte mari n mai multe tabele, i respectiv indeci, mai mici numite partiii
pentru a le putea manipula mai uor.
O dat definite partiiile, instruciunile SQL pot accesa i manipula
aceste partiii n loc de a manipula ntreaga tabel sau ntregul index din care
au provenit.
Toate partiiile au aceleai atribute logice ca i tabela sau indexul din
care au provenit. De exemplu toate partiiile unei tabele au aceleai coloane
cu aceleai constrngeri de integritate ca i tabela, iar partiiile unui index
sunt construite dup aceeai coloan ca i indexul din care au provenit.
Fiecare partiie este memorat ntr-un segment propriu aflat n
aceeai tabel spaiu sau n tabele spaiu diferite. Plasarea partiiilor n tabele
spaiu diferit prezint urmtoarele avantaje semnificative:
Riscul pierderii datelor poate fi diminuat;
Salvarea i restaurarea partiiilor se poate face independent unele fa de
altele;
Se poate realiza o echilibrare a operaiilor de I/O prin maparea partiiilor
pe discuri diferite.
O partiie este definit de urmtoarele:
Numele partiiei identific n mod unic partiia n schema de obiecte a
unui utilizator;
Referirea unei partiii se face n context obligatoriu cu numele tabelei
sau indexului din care provine. Numele unei partiii poate s apar n
instruciuni DDL i DML, precum i n utilitarele Import/Export i
SQL*Loader.
Exemplu:
ALTER TABLE tab10 DROP PARTITION part1;
Aria de cuprindere a partiiei este format din rndurile tabelei sau
indexului, care aparin acesteia bazat pe valorile coloanele ce definesc
partiia. Aria de cuprindere este definit prin clauzele:
PARTITION BY RANGE ( coloana1, colana2, )
i
VALUES LESS THAN (valoare1, valoare2, )
sau
ALTER TABLE MOVE PARTITION
Partiionarea indecilor se face respectnd cteva reguli:
Un index poate fi partiionat dac nu este inclus ntr-un grup de indeci
sau nu este definit pentru o tabel inclus ntr-un grup de tabele;
Indecii pot fi de patru categorii: locali prefixai, locali neprefixai,
globali prefixai i globali neprefixai. Indecii globali pot fi partiionai
sau nepartiionai. Un index este local dac cheile dintr-o partiie
oarecare a acestuia refer rnduri aflate ntr-o singur partiie a tabelei
pentru care a fost creat. Indexul local este prefixat dac este definit pe
un set de coloane dintre care cea mai din stnga este coloana dup care a
fost partiionat att indexul local, ct i tabela pe care a fost creat acesta.
De exemplu, presupunem c avem tabela TAB10 i indexul su
INDEX10, care au fost partiionai dup coloanele COL1 i CIOL2.
Dac indexul INDEX10 este definit pe coloanele (COL1, COL2,
COL3), atunci el este local prefixat pentru c n partea cea mai din
stnga(prefix) a listei coloanelor de indexare se afl coloanele COL1 i
COL2 dup care s-a fcut partajarea tabelei i a indexului su. Dac
indexul INDEX10 ar fi definit pe coloanele (COL1, CO23) atunci
indexul este local neprefixat. Indecii locali nu pot fi partiionai cu
clauza BY RANGE, aceast clauz se aplic numai pentru indecii
globali. Un index este global dac cheile dintr-o partiie oarecare a
acestuia refer rnduri aflate n mai multe partiii ale tabelei pentru care
a fost creat. La fel ca i n cazul indexului local putem avea index global
prefixat i index global neprefixa. Indexul global arat faptul c
partiionarea acestuia este definit de utilizator i nu trebuie s fie
echivalent cu partiionarea tabelei pentru care se creeaz.
Definirea atributelor fizice ale indecilor comport aceleai reguli ca la
definirea atributelor fizice ale partiiilor unei tabele, cu deosebirea c
aici se folosesc pentru crearea unui index comenzile:
CREATE INDEX
sau
ALTER TABLE SPLIT PARTITION,
iar pentru modificarea atributelor fizice comenzile SQL
ALTER INDEX MODIFY PARTITION
sau
ALTER INDEX REBUILD PARTITION.
ntr-un bloc de date al grupului. Dac SIZE este specificat astfel nct ntrun bloc de date s ncap dou chei de grup atunci spaiul acestui bloc este
folosit de ambele chei, iar dac un bloc de date nu poate cuprinde toate
rndurile aferente unei chei de grup, cheia de grup se memoreaz o singur
dat, iar blocurile de date se nlnuiesc de blocul n care se afl cheia de
grup. Dac ntr-un bloc de date ncap mai multe chei de grup, atunci acesta
poate s aparin mai multor lanuri de date.
Specificarea locului (tabelei spaiu) n care s fie plasat grupul de
tabele i grupul index asociat este obligatorie la crearea acestor grupuri.
Crearea grupului de tabele (cluster) se face cu comand SQL
CREATE CLUSTER. Se va crea nti grupul de tabele i apoi tabelele ce vor
face parte din grup. Atributele fizice se furnizeaz o singur dat, doar
pentru grup nu i pentru tabele.
Exemplu:
CREATE CLUSTER grup1 (col1 NUMBER (5))
PCTUSED 75 PCTFREE 10
SIZE 600
TABLESPACE tabsp1
STORAGE (INITIAL 200k
NEXT 290k
MINEXTENTS 3
MAXEXTENTS 25
PCTINCREASE 30);
CREATE TABLE tab1 (col1 NUMBER(5) PRIMARY KEY, col2
NUMBER (10), ) CLUSTER grup1 (col1);
CREATE TABLE tab2 (col3 NUMBER(5) PRIMARY KEY, col4
NUMBER (10), ,
col1 NUMBER (5) REFERENCE tab1(col1)) CLUSTER grup1
(col1);
unde col1 este cheia grupului.
Crearea grupului de indeci (cluster) se face cu comand SQL
CREATE INDEX cu clauza ON CLUSTER. Se va crea nti grupul de tabele
i apoi grupul de indeci asociat.
Exemplu:
CREATE INDEX index1
ON CLUSTER grup1
INITRANS 2
MAXTRANS 5
TABLESPACE tabsp2GR
PCTFREE 10
STORAGE (INITIAL 50k
NEXT 50k
MINEXTENTS 3
MAXEXTENTS 25
PCTINCREASE 30);
Modificarea grupurilor de tabele sau de indeci se face cu
comanda SQL ALTER CLUSTER. Elementele ce pot face obiectul
modificrii sunt atributele fizice ale grupului.