html php mysql pentru incepatori-libre

193
3 Cuprins: 1. INTRODUCERE 2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB – LIMBAJUL HTML 2.1. Scurt istoric al apariţiei Internetului şi funcţionarea sa. Reţeaua WWW. Conceptul de Hipertext..........8 2.2. Despre website-uri...................................................................................................................................10 2.3. HTML standard – limbaj descriptiv al unei pagini WEB........................................................................11 2.3.1 Scrierea de cod HTML. Editoare specializate şi validatoare HTML..............................................................12 2.3.2. Structura de bază a unei pagini.......................................................................................................................12 2.3.3. Paragrafe. Atribute ale unui tag......................................................................................................................13 2.3.4. Elemente care permit formatarea textului.......................................................................................................14 2.3.5. Liste................................................................................................................................................................17 2.3.6. Imagini............................................................................................................................................................19 2.3.7. Specificarea culorilor în HTML.....................................................................................................................22 2.3.8. Tabele.............................................................................................................................................................23 2.3.9. Legături (link-uri)...........................................................................................................................................26 2.3.10. Elemente de structură (HTML, HEAD, BODY)..........................................................................................29 2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME)....................................................................................31 2.3.12. Bare de separare (HR)..................................................................................................................................35 2.3.13. Formulare......................................................................................................................................................36 2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri.....................................................41 2.4.1. CSS (Cascading Style Sheets)........................................................................................................................41 2.4.2. JavaScript........................................................................................................................................................45 2.4.3. DOM (Document Object Model)....................................................................................................................47 3. LIMBAJUL PHP – FACILITĂğI ALE ACESTUIA 3.1. Introducere – scurt istoric al apariţiei limbajului PHP; facilităţi şi mod de funcţionare; similitudini între limbajele PHP şi C++...............................................................................................................................51 3.2. Cerinţe tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii asupra instalării............52 3.3. Testarea instalării. Structura unui fişier PHP...........................................................................................53 3.4. Constante. Variabile. Operatori. Afişarea datelor....................................................................................58 3.5. Instrucţiuni ale limbajului PHP................................................................................................................62 3.5.1. Instrucţiunea expresie.....................................................................................................................................62 3.5.2. Instrucţiunea bloc (se mai numeşte şi compusă)............................................................................................62 3.5.3. Instrucţiunea if................................................................................................................................................63 3.5.4. Instrucţiunea while.........................................................................................................................................63 3.5.5. Instrucţiunea do...while..................................................................................................................................64 3.5.6. Instrucţiunea for.............................................................................................................................................64 3.6. Transmiterea datelor prin intermediul formularelor.................................................................................65 3.7. Funcţii în PHP..........................................................................................................................................71 3.8. Prelucrarea şirurilor de caractere.............................................................................................................74 3.9. Şiruri (masive) în PHP.............................................................................................................................77 3.10. Programare grafică utilizând PHP..........................................................................................................80 3.11. Upload de fişiere via PHP......................................................................................................................85 3.12. Variabile cookie.....................................................................................................................................87 3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP 3.13.1. Introducere în MySQL.................................................................................................................................89 3.13.2. Testarea instalării MySQL. Configurarea bazei de date..............................................................................89 3.13.3. Crearea unei baze de date.............................................................................................................................91 3.13.4. Tabele...........................................................................................................................................................91 3.13.5. Tipuri de date în MySQL.............................................................................................................................93 3.13.6. Operatori utilizaţi în MySQL. Variabile......................................................................................................96 3.13.7. Funcţii predefinite în MySQL......................................................................................................................99 3.13.8. Coloane calculate prin intermediul unei interogări....................................................................................101 3.13.9. Valoarea NULL..........................................................................................................................................102 3.13.10. Valori implicite pentru coloanele unei tabele...........................................................................................102 3.13.11. Cheie primară şi cheie unică.....................................................................................................................103 3.13.12. Coloane cu valori de tip autoincrementare...............................................................................................104

Upload: mircea-dancila

Post on 03-Dec-2015

267 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: HTML Php Mysql Pentru Incepatori-libre

3

Cuprins:

1. INTRODUCERE

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB – LIMBAJUL HTML 2.1. Scurt istoric al apariţiei Internetului şi funcţionarea sa. Reţeaua WWW. Conceptul de Hipertext..........8 2.2. Despre website-uri...................................................................................................................................10 2.3. HTML standard – limbaj descriptiv al unei pagini WEB........................................................................11 2.3.1 Scrierea de cod HTML. Editoare specializate şi validatoare HTML..............................................................12 2.3.2. Structura de baz a unei pagini.......................................................................................................................12 2.3.3. Paragrafe. Atribute ale unui tag......................................................................................................................13 2.3.4. Elemente care permit formatarea textului.......................................................................................................14 2.3.5. Liste................................................................................................................................................................17 2.3.6. Imagini............................................................................................................................................................19 2.3.7. Specificarea culorilor în HTML.....................................................................................................................22 2.3.8. Tabele.............................................................................................................................................................23 2.3.9. Leg turi (link-uri)...........................................................................................................................................26 2.3.10. Elemente de structur (HTML, HEAD, BODY)..........................................................................................29 2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME)....................................................................................31 2.3.12. Bare de separare (HR)..................................................................................................................................35 2.3.13. Formulare......................................................................................................................................................36 2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri.....................................................41 2.4.1. CSS (Cascading Style Sheets)........................................................................................................................41 2.4.2. JavaScript........................................................................................................................................................45 2.4.3. DOM (Document Object Model)....................................................................................................................47

3. LIMBAJUL PHP – FACILIT I ALE ACESTUIA 3.1. Introducere – scurt istoric al apariţiei limbajului PHP; facilit ţi şi mod de funcţionare; similitudini între

limbajele PHP şi C++...............................................................................................................................51 3.2. Cerinţe tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii asupra instal rii............52 3.3. Testarea instal rii. Structura unui fişier PHP...........................................................................................53 3.4. Constante. Variabile. Operatori. Afişarea datelor....................................................................................58 3.5. Instrucţiuni ale limbajului PHP................................................................................................................62

3.5.1. Instrucţiunea expresie.....................................................................................................................................62 3.5.2. Instrucţiunea bloc (se mai numeşte şi compus )............................................................................................62 3.5.3. Instrucţiunea if................................................................................................................................................63 3.5.4. Instrucţiunea while.........................................................................................................................................63 3.5.5. Instrucţiunea do...while..................................................................................................................................64 3.5.6. Instrucţiunea for.............................................................................................................................................64

3.6. Transmiterea datelor prin intermediul formularelor.................................................................................65 3.7. Funcţii în PHP..........................................................................................................................................71 3.8. Prelucrarea şirurilor de caractere.............................................................................................................74 3.9. Şiruri (masive) în PHP.............................................................................................................................77 3.10. Programare grafic utilizând PHP..........................................................................................................80 3.11. Upload de fişiere via PHP......................................................................................................................85 3.12. Variabile cookie.....................................................................................................................................87 3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP

3.13.1. Introducere în MySQL.................................................................................................................................89 3.13.2. Testarea instal rii MySQL. Configurarea bazei de date..............................................................................89 3.13.3. Crearea unei baze de date.............................................................................................................................91 3.13.4. Tabele...........................................................................................................................................................91 3.13.5. Tipuri de date în MySQL.............................................................................................................................93 3.13.6. Operatori utilizaţi în MySQL. Variabile......................................................................................................96 3.13.7. Funcţii predefinite în MySQL......................................................................................................................99 3.13.8. Coloane calculate prin intermediul unei interog ri....................................................................................101 3.13.9. Valoarea NULL..........................................................................................................................................102 3.13.10. Valori implicite pentru coloanele unei tabele...........................................................................................102 3.13.11. Cheie primar şi cheie unic .....................................................................................................................103 3.13.12. Coloane cu valori de tip autoincrementare...............................................................................................104

Page 2: HTML Php Mysql Pentru Incepatori-libre

4

3.13.13. Sortarea datelor.........................................................................................................................................105 3.13.14. Filtrarea datelor........................................................................................................................................106 3.13.15. Actualizarea datelor..................................................................................................................................106 3.13.16. Funcţii agregate........................................................................................................................................107 3.13.17. Subinterog ri............................................................................................................................................108 3.13.18. Gruparea datelor.......................................................................................................................................109 3.13.19. Uniuni de tabele........................................................................................................................................111 3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP...................................................115

Bibliografie:

1. Tudor Sorin şi Vlad Huţanu, Crearea şi programarea paginilor WEB,

Bucureşti, L&S Infomat, 2004;

2. Vlad Huţanu şi Carmen Popescu, Manual de Informatică Intensiv pentru clasa a XII-a,

Bucureşti, L&S Infomat, 2007;

3. Bogdan P truţ, Internet pentru începători,

Bucureşti, Teora, 1998;

4. Traian Anghel, Programarea în PHP. Ghid practic,

Iaşi, Polirom, 2005;

5. Julie C. Meloni, Învaţă singur PHP, MySQL şi APACHE,

Bucureşti, Corint, 2005;

6. Larry Ulman, PHP şi MySQL pentru site-uri web dinamice,

Bucureşti, 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 documentaţii pentru programarea paginilor we.b.

3.13.21. Elementele de bazã ale limbajului SQL*PLUS .......................................................................................118 3.13.22. Crearea unei baze de date prin comenzi SQL ..........................................................................................163

Page 3: HTML Php Mysql Pentru Incepatori-libre

5

1. INTRODUCERE

Începând cu anii ’95, Internetul, sub aspectul s u cel mai popular, şi anume al paginilor web,

a cunoscut o amploare greu de imaginat.

Dac la început, paginile web aveau un conţinut simplu şi oarecum stângace, în zilele

noastre aspectul acestora s-a schimbat radical. Dup doar 10 ani, în paralel cu evoluţia tehnicii de

calcul, au evoluat şi tehnicile de programare a acestora. Primele pagini permiteau doar navigarea

prin conţinutul lor, pe când în zilele noastre ele au o utilizare foarte larg , de la jocuri şi aplicaţii

grafice dinamice la comerţ pe Internet.

Limbajul PHP este un limbaj de programare destinat în primul rând Internetului, aducând

dinamic unei pagini web. Este unul dintre cele mai importante limbaje de programare web

open-source (codul surs este public, fiind accesibil tuturor) şi server-side (rularea sa nu se face pe

calculatorul celui care vizualizeaz pagina, ci pe server-ul care o conţine).

Este unul dintre cele mai folosite limbaje de programare server-side. Statisticile arat c la 1

mai 2008, suportul PHP este prezent pe 20 de milioane dintr-ul total de 70 de milioane de

website-uri active din lumea întreag .

Popularitatea de care se bucur acest limbaj de programare se datoreaz urm toarelor sale

caracteristici:

• Familiaritatea – sintaxa limbajului este foarte uşoar , fiind foarte la îndemân în

special pentru programatorii care cunosc limbajul C;

• Simplitatea – sintaxa limbajului este destul de liber . Nu este nevoie de includere de

biblioteci sau de directive de compilare, codul PHP inclus într-un document fiind trecut între nişte

marcaje speciale;

• Securitatea – PHP-ul pune la dispoziţia programatorilor un set flexibil şi eficient de

m suri de siguranţ ;

Page 4: HTML Php Mysql Pentru Incepatori-libre

6

• Flexibilitatea – fiind ap rut din necesitatea dezvolt rii web-ului, PHP a fost

modularizat pentru a ţine pasul cu dezvoltarea diferitelor tehnologii. Nefiind legat de un anumit

server web, PHP-ul a fost integrat pentru numeroasele servere web exitente: Apache, IIS, Zeus, etc.

• Gratuitatea – este, probabil, cea mai important caracteristic a PHP-ului. Dezvoltarea

PHP-ului sub licenţa open-source a determinat adaptarea rapid a sa la nevoile web-ului,

eficientizarea şi securizarea codului.

În capitolul al II-lea al acestei lucr ri (Fundamente teoretice ale paginilor WEB – limbajul

HTML) mi-am propus o parcurgere ceva mai am nunţit , sub forma unui tutorial, a limbajului

HTML standard, descriind tag-urile cele mai importante şi exemplificând aceste descrieri cu mici

aplicaţii. Capitolul se încheie cu o trecere în revist , în care exist câteva exemple comentate, a

tehnicilor de programare dinamice ale unei pagini web, care r mân îns tot pe domeniul HTML.

Acest capitol este mai mult decât necesar, din cauz c PHP nu face altceva decât s ruleze

programe în urma c ruia este generat cod HTML. Nu putem aşadar vorbi de limbajul PHP f r a

cunoaşte HTML

În capitolul al III-lea (Limbajul PHP – facilit ţi ale acestuia) am f cut, la fel ca şi în

capitolul al II-lea, o parcurgere mai am nunţit a elementelor limbajului PHP, cu exemple.

Totodat , în acest capitol exist şi câteva detalii tehnice despre instalarea pachetelor software

necesare rul rii.

De remarcat faptul c transcrierea algoritmilor propriu-zişi în PHP r mâne foarte similar

limbajului C++. Principalul element care face diferenţa este dat de interfaţa acestora, lucru normal

de altfel, deoarece aplicaţiile PHP sunt destinate în primul rând utiliz rii lor pe Internet, deci de

c tre public foarte larg. Este motivul pentru care interfaţa trebuie s prezinte un grad ridicat de

interactivitate (adesea vorbim de "interfaţ inteligent ") astfel încât s permit o comunicare cât mai

simpl dintre utilizator şi aplicaţie.

Page 5: HTML Php Mysql Pentru Incepatori-libre

7

Page 6: HTML Php Mysql Pentru Incepatori-libre

8

2. FUNDAMENTE TEORETICE ALE PAGINILOR WEB – LIMBAJUL HTML

2.1. Scurt istoric al apari iei Internetului şi func ionarea sa. Re eaua WWW.

Conceptul de Hipertext.

Istoria Internetului începe cu anul 1968, când guvernul S.U.A. intenţiona s interconecteze

universit ţile, departamentele militare şi de ap rare ale ţ rii, astfel încât ele s coopereze în cadrul

unor proiecte de cercetare comune. Astfel, s-a format o agenţie numit Advanced Research Projects

Agency (ARPA). Una din cheile proiectului punea în discuţie faptul c , stocarea tuturor informaţiilor

pe un singur calculator nu ar fi fost deloc sigur , fie din cauz c acesta ar putea fi ţint vulnerabil

a unui eventual atac, fie pur şi simplu din cauz c acestea ar putea fi pierdute în cazul unei

defecţiuni tehnice majore. O metod de a face faţ unei asemenea situaţii ar fi de a copia şi distribui

informaţiile pe mai multe calculatoare, în întreaga ţar , folosind o reţea.

În 1975, câteva dintre limbajele sau protocoalele pe care calculatoarele le foloseau pentru a

comunica între ele s-au standardizat. Majoritatea universit ţilor importante şi a departamentelor de

ap rare din S.U.A. s-au legat împreun într-o reţea numit DARPANET, toate calculatoarele

folosind acelaşi protocol pe care ast zi îl cunoaştem sub denumirea de TCP/IP. Reţeaua, cu timpul,

a fost înlocuit de mai multe reţele, care ast zi împânzesc globul p mântesc.

Începând cu anul 1980, mai multe colegii şi universit ţi au fost conectate la Internet. Acest

lucru a permis universit ţilor s -şi împart informaţii despre cercet rile lor, programe şi ştiri

recente. În anii ’90 Internetul s-a deschis şi în scopuri comerciale. În curând, multe alte c i de

utilizare a informaţiilor transmise prin intermediul acestei gigantice reţele au fost dezvoltate.

În prezent, este posibil s foloseşti Internetul pentru a trimite scrisori electronice pe întregul

glob în doar câteva secunde. Poţi c uta informaţii despre orice subiect doreşti. Expresia „World

Wide Web” (WWW) defineşte o colecţie de documente care se întinde în câteva sute de milioane de

calculatoare.

Principiul de baz al funcţion rii Internetului const în faptul c dou sau mai multe

calculatoare pot comunica între ele. Pentru ca acest lucru s fie posibil este necesar s existe un

„protocol”, adic un ansamblu de norme care trebuie respectate de calculatoare (deci de programele

care ruleaz pe ele) pentru ca schimbul de date s poat avea loc.

Normele se refer la:

• g sirea calculatorului destinatar al transferului de date;

• transmiterea efectiv a datelor;

• modalit ţi prin care expeditorul comunic faptul c au fost transmise toate datele, iar

destinatarul comunic faptul c le-a recepţionat;

Page 7: HTML Php Mysql Pentru Incepatori-libre

9

• compresia datelor: prin aplicarea anumitor algoritmi matematici, datele care urmeaz s fie

expediate sunt prelucrate de aşa natur , încât s fie memorate prin utilizarea unui spaţiu cât mai mic

de memorie. Prin urmare, transmiterea lor dureaz mai puţin. Invers, la destinaţie sunt

decompresate prin utilizarea aceloraşi algoritmi matematici;

• identificarea erorilor care pot interveni în transmiterea datelor: şi aici exist mai mulţi

algoritmi care permit identificarea şi corectarea erorilor.

Standardul care s-a impus în ceea ce priveşte Internetul, const în protocolul TCP/IP.

Numele este de fapt, numele comun al unei familii de protocoale utilizate pentru transferul datelor

în reţea. Orice calculator conectat la Internet are o adres , numit adres IP (Internet Protocol

Address). O adres IP este alc tuit din 4 numere între 0 şi 255, prin urmare o astfel de adres

ocup 4 octeţi. Cum transmiterea datelor la un moment dat se face între dou calculatoare, datele se

transmit de la o adres IP la alta.

Protocolul IP (Internet Protocol) reglementeaz transmiterea datelor de la o adres IP la alta.

Datele sunt transmise divizate în pachete. În acest fel, se preîntâmpin monopolizarea transmisiei în

reţea doar de c tre un singur utilizator.

Protocolul TCP (Transmission Control Protocol): de la plecare, un program TCP împarte

informaţia de transmis în mai multe pachete IP. Acestea sunt transmise la destinaţie prin

intermediul reţelei. O dat ajunse la destinaţie, un alt program TCP asambleaz şi aranjeaz în

ordinea corect pachetele IP de date primite. Fireşte, din cauza unor probleme hardware, unele

pachete se pot pierde pe drum. Protocolul TCP se ocup şi de acest lucru. Astfel, când împacheteaz

datele într-un plic „IP”, protocolul TCP al expeditorului adaug şi un num r (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 emiţ tor. Dac ele nu

sunt identice, înseamn c a ap rut o eroare în timpul transmisiei, motiv pentru care protocolul TCP

anuleaz acel pachet, cerând retransmiterea sa.

Bazele World Wide Web (WWW) au fost puse în 1989 la Centrul European de Cercet ri

Nucleare (CERN) în Geneva (Elveţia). Propunerea iniţial de creare a unei colecţii de documente

având leg turi între ele a fost f cut de Tim Berners-Lee în martie 1989. Aceast propunere a ap rut

în urma problemelor de comunicare pe care le întâmpinau echipele de cercet tori ce foloseau

centrul, chiar şi folosind poşta electronic .

Page 8: HTML Php Mysql Pentru Incepatori-libre

10

Primul server web folosit de Tim Berners-Lee a ap rut nu mult înainte de decembrie 1991,

când s-a f cut prima lui demonstraţie public . Studiul a fost continuat prin apariţia primei aplicaţii

grafice Mosaic, în februarie 1993, realizat de cercet torul Marc Andreessen de la centrul

universitar National Center for Supercomputing Applications (NCSA) din oraşul Urbana-

Champaign din statul federal Illinois, SUA. Ulterior WWW-ul a evoluat pân la ceea ce este ast zi,

un serviciu integrativ şi multimedial, având ca suport fizic Internetul.

Practic, WWW este un sistem de documente şi informaţii de tip hipertext legate ele între ele,

care pot fi accesate prin reţeaua mondial de Internet. Documentele, care rezid în diferite locaţii pe

diverse calculatoare-server, pot fi reg site cu ajutorul unei adrese unice. Hipertextul este prelucrat

cu un ajutorul unui program de navigare în web numit browser care descarc paginile web de pe un

server web şi le afişeaz pe un terminal.

Prin conceptul de hipertext se înţelege o form de document electronic, o metod de

organizare a informaţiilor în care datele sunt memorate într-o reţea de noduri şi leg turi, putând fi

accesat prin intermediul programelor de navigare interactiv , şi manipulat de un editor structural.

Conceptul de baz în definirea hipertextului este "leg tura" (link-ul), fie în cadrul aceluiaşi

document, fie c tre alt document. Leg tura de tip link permite organizarea neliniar a informaţiilor.

Un sistem hipertext permite autorului s u s creeze aşa-numite "noduri", s le lege între ele, iar unui

cititor navigarea de la un nod la altul. Astfel un nod reprezint un concept putând conţine orice fel

de informaţie: text, grafic , imagini, animaţii, sunete, etc. Nodul surs al unei leg turi se numeşte

"referinţ " iar cel destinaţie "referent" sau ancor , punctele de leg tur din respectivele noduri fiind

marcate. Activarea marcajelor unei leg turi duce la vizualizarea nodurilor. Asocierea cu unele

elemente mediale a dus la extinderea noţiunii de hipertext c tre "hipermedii".

2.2. Despre website-uri.

Noţiunea de website (sau pur şi simplu site, ori „site web”) desemneaz o grup de pagini

web multimediale (conţinând texte, imagini fixe, imagini mişc toare şi chiar sunete), accesibile în

Internet în principiu oricui, de obicei pe o tem anume, şi care sunt conectate între ele prin aşa-

numite hyperlinkuri. Diversele situri web pot fi oferite de c tre o companie, un proiect, o reţea de

utilizatori, o persoan particular , o administraţie public şi multe altele.

Page 9: HTML Php Mysql Pentru Incepatori-libre

11

Pentru crearea paginilor web s-a impus limbajul HTML (HyperText Markup Language) – un

limbaj de marcare, al c rui scop const în prezentarea într-un anumit format a informaţiilor:

paragrafe, tabele, fonturi, culori, ş.a.m.d.

Calculatorul pe care se g seşte site-ul se numeşte „server”, iar calculatoarele care acceseaz

conţinutul site-ului se numesc „client”.

Orice calculator client trebuie s dispun de un program specializat, numit „browser”, cu

ajutorul c ruia s se poat interpreta şi deci vizualiza fişierele HTML.

Pe server trebuie s se g seasc un program care r spunde cererilor browser-ului aflat pe

calculatorul client. Cererea efectuat de c tre browser şi r spunsul server-ului se fac prin

respectarea unui anumit protocol. Acest protocol se numeşte HTTP (HyperText Transfer Protocol).

2.3. HTML standard – limbaj descriptiv al unei pagini WEB.

HTML este un limbaj de marcare orientat c tre prezentarea documentelor text pe o singura

pagin .

Utilizând un software de redare specializat, numit agent utilizator HTML (cel mai bun

exemplu de astfel de software fiind browserul web) HTML furnizeaz mijloacele prin care

conţinutul unui document poate fi adnotat cu diverse tipuri de metadate şi indicaţii de redare.

Indicaţiile de redare pot varia de la decoraţiuni minore ale textului (cum ar fi specificarea faptului

c un anumit cuvânt trebuie subliniat sau c o imagine trebuie introdus ) pân la scripturi

sofisticate, h rţi de imagini şi formulare. Metadatele pot include informaţii despre titlul şi autorul

documentului, informaţii structurale despre cum este împ rţit documentul în diferite segmente,

paragrafe, liste, titluri etc. şi informaţii cruciale care permit ca documentul s poat fi legat de alte

documente pentru a forma astfel hiperlink-uri.

HTML este un format text proiectat pentru a putea fi citit şi editat de oameni utilizând un

editor de text simplu. Totuşi scrierea şi modificarea paginilor în acest fel solicit cunoştinţe solide

de HTML şi este consumatoare de timp. Editoarele grafice cum ar fi Macromedia Dreamweaver sau

Microsoft FrontPage permit ca paginile web sa fie tratate asem n tor cu documentele Word, dar cu

observaţia c aceste programe genereaz un cod HTML care este de multe ori de proast calitate.

HTML se poate genera direct utilizând tehnologii de codare din partea serverului cum ar fi

PHP, JSP sau ASP.

Page 10: HTML Php Mysql Pentru Incepatori-libre

12

2.3.1 Scrierea de cod HTML. Editoare specializate şi validatoare HTML.

Crearea unui fişier HTML este foarte simpl , putând fi f cut cu ajutorul oric rui editor de

text. Totuşi, pentru a avea un control ridicat asupra corectitudinii codului scris, este recomandat s

utiliz m un editor specializat, care s pun în evidenţ diversele elemente de marcare (TAG-uri,

numite şi „elemente” sau „etichete”) sau, mai mult, s poat verifica şi detecta erorile.

Din categoria editoarelor care pun în evidenţ diferitele elemente face parte editorul

Notepad++, iar din categoria validatoarelor face parte CSE HTML Validator Lite, ambele fiind

gratuite şi putând fi desc rcate de pe Internet.

2.3.2. Structura de bază a unei pagini.

Structura de baz a unei pagini HTML este urm toarea (apl001.html):

Iat şi modul în care pagina de mai sus este vizualizat în Internet Explorer:

Din analiza exemplului observ m c :

• O pagin începe cu tag-ul <HTML> şi se termin cu tag-ul </HTML>;

• O pagin conţine un antet (HEAD) şi corpul propriu-zis (BODY);

• Antetul este cuprins între etichetele <HEAD> şi </HEAD>;

• Corpul este cuprins între etichetele <BODY> şi </BODY>;

Page 11: HTML Php Mysql Pentru Incepatori-libre

13

• Opţional, antetul poate conţine titlul paginii, cuprins între tag-urile <TITLE> şi </TITLE>. Titlul

apare pe bara de titlu a ferestrei afişate în browser.

• Corpul poate conţine texte şi/sau imagini. În exemplu, pagina conţine textul „Acesta este primul

exemplu de pagina...”

• Comentariile, care nu sunt afişate de c tre browser, pot fi scrise între tag-urile <!-- şi -->.

• Numele tag-urilor nu sunt case sensitive, deci pot fi scrise atât cu litere mici cât şi cu litere mari.

În continuare, pentru a le pune în evidenţ , le vom scrie cu litere mari.

2.3.3. Paragrafe. Atribute ale unui tag.

În general, textele conţinute de o pagin se pot g si în mai multe paragrafe. Un paragraf se

introduce între tag-urile <P> ... </P>.

La afişare, dou paragrafe consecutive vor fi separate printr-o linie goal .

Tag-ul </P> poate lipsi; un nou paragraf poate fi detectat prin tag-ul <P>.

În cadrul unui fişier HTML, Enter-ul nu are nici un efect. De asemenea, dac dou cuvinte

ale unui paragraf sunt separate prin mai multe spaţii sau alte caractere albe (enter-uri, tab-uri),

browser-ul afişeaz doar un singur spaţiu.

Majoritatea tag-urilor li se pot specifica atribute. Acestea determin comportamentul mai

am nunţit al elementului respectiv.

Un atribut se specific înainte de închiderea parantezei unghiulare a tag-ului (>) prin

nume_atribut=”valoare”.

În cazul paragrafului, atributul align controleaz alinierea textului din cadrul paragrafului.

Dac acest atribut nu este prezent, alinierea este f cut în mod implicit la stânga. Acest atribut poate

lua una dintre valorile center, left, right, justify, ca în exemplul de mai jos

(apl002.html):

<HTML> <HEAD> <TITLE>Alinierea paragrafelor</TITLE> </HEAD> <BODY> <P align="center">Aliniat in centru</P> <P align="right">Aliniat la dreapta</P> <P align="left">Aliniat la stinga</P> <P align="justify">Paragraful acesta este aliniat la ambele margini</P> </BODY> </HTML>

Page 12: HTML Php Mysql Pentru Incepatori-libre

14

Iat pagina al c rei cod tocmai a fost prezentat, vizualizat în Internet Explorer:

2.3.4. Elemente care permit formatarea textului.

• <BR> : Are ca efect forţarea afiş rii a ceea ce urmeaz pe rândul urm tor. Acest tag nu

creeaz un nou paragraf (s ne reamintim c între dou paragrafe este automat l sat o linie vid )

• <B>...</B> : Are rolul de a afişa bold (îngroşat) textul cuprins între cele dou tag-uri ale

sale. Un tag sinonim al lui <B> este: <STRONG>...</STRONG>

• <I>...</I> : Are rolul de a afişa italic (înclinat) textul cuprins între cele dou tag-uri ale

sale. Tag-uri sinonime ale lui <I> sunt: <EM>...</EM>, <DFN>...</DFN>,<CITE>...</CITE>.

• <U>...</U> : Are rolul de a afişa subliniat textul cuprins între cele dou tag-uri ale sale. Un

tag sinonim al lui <U> este: <INS>...</INS>

• <S>...</S> : Are rolul de a afişa t iat (cu o linie orizontal ) textul cuprins între cele dou

tag-uri ale sale. Un tag sinonim al lui <S> este: <DEL>...</DEL>

• <BIG>...</BIG> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai

mare decât textul în care este cuprins.

• <SMALL>...</SMALL> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale

mai mic decât textul în care este cuprins.

• <SUP>...</SUP> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai

sus (ca o putere)

• <SUB>...</SUB> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai

sus (ca un indice)

Page 13: HTML Php Mysql Pentru Incepatori-libre

15

• <TT>...</TT> : Are rolul de a afişa textul cuprins între cele dou tag-uri ale sale mai sus

monospaţiat (toate caracterele ocup aceeaşi lungime – practic, se foloseşte fontul Courier New)

În cod-ul HTML de mai jos g siţi toate aceste tag-uri exemplificate (apl003.html):

<HTML> <HEAD> <TITLE>Formatarea textului</TITLE> </HEAD> <BODY> <P> <B>Acest text este afisat folosind tag-ul B</B> <BR> <STRONG>Acest text este afisat folosind tag-ul STRONG</STRONG> <BR> <I>Acest text este afisat folosind tag-ul I</I> <BR> <DFN>Acest text este afisat folosind tag-ul DFN</DFN> <BR> <EM>Acest text este afisat folosind tag-ul EM</EM> <BR> <U>Acest text este afisat folosind tag-ul U</U> <BR> <INS>Acest text este afisat folosind tag-ul INS</INS> <BR> <S>Acest text este afisat folosind tag-ul S</S> <BR> <DEL>Acest text este afisat folosind tag-ul DEL</DEL> <BR> Normal <BIG>Mai mare</BIG> Normal <BR> Normal <SMALL>Mai mic</SMALL> Normal <BR> Iata si un <SUP>exponent</SUP> <BR> iar acum un <SUB>indice</SUB> <BR> <TT>Acest text este monospatiat</TT> </P> </BODY> </HTML>

Acest cod vizualizat în browser arat în felul urm tor:

• Pentru scrierea titlurilor se utilizeaz tag-urile <H1>...<H1>, <H2>...<H2>, . . . ,

<H6>...<H6>. Practic, în funcţie de num rul de dup H m rimea fontului difer (<H1> utilizeaz

fontul de dimensiune maxim , <H6> fontul de dimensiune minim ) iar textul care apare între tag-uri

este scris îngroşat (bold).

• Pentru stabilirea font-ului se foloseşte tag-ul <FONT>...<FONT>. Atributele acestuia sunt:

- face indic numele font-ului

- size indic m rimea (trebuie s fie un num r cuprins între 1 şi 7. Implicit este 3)

Page 14: HTML Php Mysql Pentru Incepatori-libre

16

- color permite specificarea culorii. Aceasta se specific fie prin intermediul

constantelor predefinite ale HTML-ului (numele englezesc al culorii) fie prin componentele sale de

Roşu, Verde şi Albastru exprimate în hexazecimal, de forma #RRGGBB (vom detalia aceste

constante de culoare ceva mai încolo).

Iat un exemplu de utilizare al lor (apl004.html):

<HTML> <HEAD> <TITLE>Exemplificare titluri si font</TITLE> </HEAD> <BODY> <P> <H1>Acesta este un titlu de tip H1</H1> <H2>Acesta este un titlu de tip H2</H2> <H3>Iar acesta este un titlu de tip H3</H3> <FONT face="arial" color="blue" size="4"> Acest text este scris cu fontul Arial, albastru, dimensiune 4 </FONT><BR> Iar acest text este scris normal<BR> </P> <P> Iata si culorile cucubeului, scrise cu font-ul Comic Sans MS, bold, dimensiune 7:<br> <B> <FONT face="Comic Sans MS" size="7" color="red">R</FONT> <FONT face="Comic Sans MS" size="7" color="orange">O</FONT> <FONT face="Comic Sans MS" size="7" color="yellow">G</FONT> <FONT face="Comic Sans MS" size="7" color="green">V</FONT> <FONT face="Comic Sans MS" size="7" color="blue">A</FONT> <FONT face="Comic Sans MS" size="7" color="darkblue">I</FONT> <FONT face="Comic Sans MS" size="7" color="magenta">V</FONT> </B> </P> </BODY> </HTML>

Vizualizat în browser:

Aşa cum am v zut, dac în cadrul unui text din cadrul documentului HTML apare un grup de mai

multe spaţii, în browser va fi afişat doar unul singur. Dac dorim forţarea afiş rii unui spaţiu, se

foloseşte identificatorul special &nbsp; (ultimul caracter, ”;”, face parte din identificator)

Page 15: HTML Php Mysql Pentru Incepatori-libre

17

2.3.5. Liste.

Acestea permit ca anumite enunţuri (texte, elemente) s fie numerotate sau marcate într-un

anumit fel. O astfel de organizare poart numele de liste.

În HTML distingem 3 feluri de liste:

• Liste ordonate (Ordered Lists): sunt liste în care elementele sunt numerotate.

Inserarea lor în cadrul documentului HTML se face prin tag-urile <OL>...</OL>, elementele

(itemii) lor fiind introduse între aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfârşit nefiind

obligatoriu). Implicit, numerotarea se face cu numere arabe (1, 2, 3, ...). Ea poate fi modificat prin

folosirea atributului type în cadrul tag-ului OL. Acesta poate lua una dintre valorile:

- a : numerotarea se va face cu litere mici (a, b, c, ...)

- A : numerotarea se va face cu litere mari (A, B, C, ...)

- i : numerotarea se va face cu numere romane mici (i, ii, iii, iv ...)

- I : numerotarea se va face cu numere romane mari (I, II, III. IV, ...)

- 1 : (implicit) numerotarea se va face cu numere arabe obişnuite (1, 2, 3, ...)

Iat un exemplu de cod şi vizualizarea sa în browser (apl005.html):

<HTML> <HEAD> <TITLE>Liste</TITLE> </HEAD> <BODY> <P> Iata o lista ordonata implicita: <OL> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </OL> Iata si o alta lista, cu numere romane <OL type="i"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </OL> </P> </BODY> </HTML>

• Liste neordonate (Unordered Lists): sunt liste în care elementele nu sunt numerotate, ci în

dreptul fiec ruia este afişat un marcator.

Inserarea lor în cadrul documentului HTML se face prin tag-urile <UL>...</UL>, elementele

(itemii) lor fiind introduse între aceste dou tag-uri prin <LI>...</LI> (tag-ul de sfârşit nefiind

obligatoriu).

Implicit, marcarea lor se face prin cerculeţe pline. Ea poate fi modificat prin folosirea

atributului type în cadrul tag-ului UL. Acesta poate lua una dintre valorile:

Page 16: HTML Php Mysql Pentru Incepatori-libre

18

- disc : marcarea se face cu cerculeţe pline (implicit)

- square : marcarea se face cu p tr ţele

- circle : marcarea se face cu cerculeţe goale

Iat un exemplu de cod şi vizualizarea sa în browser

(apl006.html):

Iata o lista neordonata implicita: <UL> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL> Iata si o alta lista, marcata cu patratele <UL type="square"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL> Si alta, marcata cu cerculete goale <UL type="circle"> <LI>Primul item</LI> <LI>Al doilea item</LI> <LI>Al treilea item</LI> <LI>Al patrulea item</LI> </UL>

• Liste de definiţie (Definition Lists): au rolul de a descrie o list de definiţii.

Inserarea lor în cadrul documentului HTML se face prin tag-urile <DL>...</DL>. Elementele

lor sunt de dou tipuri:

- Termenul care este definit: este introdus între tag-urile <DT>...</DT> (tag-ul de

sfârşit nefiind obligatoriu).

- Definiţia propriu-zis : este introdus între tag-urile <DD>...</DD> (tag-ul de sfârşit

nefiind obligatoriu).

Iat un exemplu de cod şi vizualizarea sa în browser (apl007.html): Iata o lista de definitie: <DL> <DT>Leontopodium Alpinum</DT> <DD>Este numele stiintific al florii de colt. Este o planta ocrotita. Creste la altitudini mari, in locuri stancoase</DD> <DT>Dianthus Callizonus</DT> <DD>Este numele stiintific al Garofitei Pietrei Craiului. Este o planta ocrotita. Fiind un endemism, este o planta unica in lume. Practic, aceasta specie de garofita, in afara de locul sau de origine, si anume masivul Piatra Craiului din apropierea Brasovului, nu se mai intilneste in nici un alt loc de pe planeta</DD> <DT>Aconitum Napellus</DT> <DD>Este numele stiintific al Omagului. Este o planta otravitoare. Totusi, in cantitati foarte mici contine o substanta activa din care este preparat un medicament contra tusei</DD> </DL>

Page 17: HTML Php Mysql Pentru Incepatori-libre

19

2.3.6. Imagini.

Tag-ul utilizat pentru inserarea unei imagini în documentul HTML este <IMG>. Forma

general a acestui element este <IMG atribute>. Acest tag nu are şi form de închidere.

Atributele sale sunt:

• src identific fişierul efectiv de pe disc, ce conţine imaginea respectiv . Dac imaginea

se afl în directorul curent, se specific doar numele şi extensia sa. Dac se afl într-un subdirector,

acesta se specific înaintea numelui şi extensiei imaginii, separat prin caracterul /. Imaginile

recunoscute de majoritatea browser-elor internet sunt de tip .jpg, .gif, .png

• align specific tipul de aliniere al imaginii în raport cu textul în cadrul c ruia se afl .

Acesta poate lua una dintre valorile urm toare:

- right : imaginea se aliniaz în dreapta, iar textul care urmeaz este scris în locul

r mas liber, în stânga acesteia;

- left : imaginea se aliniaz în stânga, iar textul care urmeaz este scris în locul

r mas liber, în dreapta acesteia;

- top : doar latura de sus a imaginii se aliniaz cu rândul de text în cadrul c ruia se

afl ; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a ecranului;

- middle : rândul de text în cadrul c ruia se afl imaginea se aliniaz la jum tatea

în ţimii acesteia; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a

ecranului;

- bottom : doar latura de jos a imaginii se aliniaz cu rândul de text în cadrul c ruia

se afl ; urm torul rând de text va fi afişat dup imagine, ocupând întreaga l ţime a ecranului;

• Dac dorim întreruperea unei alinieri de imagine de tip right sau left înainte ca textul s fi

umplut spaţiul liber din stânga, respectiv dreapta acesteia, putem folosi tag-ul br, c ruia îi ad ug m

unul dintre atributele clear=”left” sau clear=”right” sau clear=”all”, dup caz.

• atributul alt=”text” permite specificarea unui text alternativ ce va fi afişat fie dac

menţinem cursorul de mouse asupra imaginii, fie în locul imaginii propriu-zise, în cazul în care

imaginea nu poate fi înc rcat din cauza unei probleme de conexiune.

Iat câteva exemple, cu tot cu vizualizarea lor în browser:

1) Exemplu la folosirea atributului align=”right” şi a atributului

alt=”text” :(apl008.html)

<P>Acest text este asezat inaintea imaginii<br> <IMG SRC="dog.jpg" align="right" alt="catelus"> In schimb, acest text este aliniat in stinga imaginii, deoarece am folosit atributul align="right" in momentul in care am inserat imaginea in pagina noastra web prin intermediul tag-ului src. </P>

Page 18: HTML Php Mysql Pentru Incepatori-libre

20

2) Exemplu la folosirea opţiunii align=”right” împreun cu tag-ul <br clear=”right”>

(apl009.html):

<P> Acest text este asezat inaintea imaginii<br> <IMG SRC="dog.jpg" align="right" alt="catelus"> Acest text, aliniat in stinga imaginii, il intrerupem fortat AICI <BR clear="right"> In acest fel, restul textului se va alinia in mod obisnuit, sub imagine, restul spatiului din stinga raminind liber. </P>

3) Exemplu la folosirea opţiunii 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>

4) Exemplu la folosirea opţiunii 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>

5) Exemplu la folosirea opţiunii align=”bottom”

(apl012.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 jos a imaginii, restul textului fiind afisat dupa imagine </P>

• atributele height şi width permit specificarea altor dimensiuni pentru imagine, decât

cele reale ale acesteia. Evident, dac dimensiunile nu sunt proporţionale cu cele reale, imaginea va

fi deformat . Totodat , dac specific m dimensiuni mai mari decât cele reale, imaginea se va vedea

mai puţin clar. În realitate, imaginea este transferat de pe server la dimensiunile sale originale,

redimensionarea având loc doar la nivelul calculatorului pe care este vizualizat pagina.

Page 19: HTML Php Mysql Pentru Incepatori-libre

21

Iat un exemplu de folosire al celor dou tag-uri, şi vizualizarea

acestui exemplu în browser (apl013.html):

<P> Imaginea originala are dimensiunile 200x150: <BR> <IMG src="dog.jpg"> <BR> Iat-o redimensionata proportional la 100x75: <BR> <IMG src="dog.jpg" width="100" height="75"> <BR> Iat-o si deformata:<BR> <IMG src="dog.jpg" width="50" height="100"> sau <IMG src="dog.jpg" width="150" height="50"> <BR> </P>

• atributul border permite stabilirea grosimii unui chenar care va înconjura poza. Implicit, valoarea acestui atribut este ”0”, ceea ce înseamn c imaginea nu este înconjurat de chenar (apl014.html): <P> Imaginea este inconjurata de un chenar de dimenisiune 10<br> <IMG src="dog.jpg" border="10"> </P>

• atributele hspace=”nr.pixeli” respectiv vspace=”nr.pixeli” permit stabilirea distantei minime care separa imaginea de celelalte obiecte pe vertical , respectiv pe orizontal (apl015.html): <P> Iata o aliniere a imaginii de tip "right", aliniere <IMG src="dog.jpg" align="right"> in cadrul careia nu am modificat nici unul dintre cele doua atribute care controleaza spatierea dintre imagine si restul elementelor, pe orizontala respeciv pe verticala <BR clear="all"><BR> Iata acum o aliniere a imaginii tot de tip "right", aliniere <IMG src="dog.jpg" align="right" hspace="15" vspace="20"> in cadrul careia am modificat ambele atribute care controleaza spatierea dintre imagine si restul elementelor, stabilind valorile de 20 pe verticala respeciv de 15 pe orizontala <BR clear="all"> </P>

Page 20: HTML Php Mysql Pentru Incepatori-libre

22

2.3.7. Specificarea culorilor în HTML.

O serie de elemente din HTML permit utilizarea de atribute de culoare. Acestea pot fi

specificate în dou moduri:

• prin constanta HTML ce reprezint numele culorii (în englez , bineînţeles). Exist 216

astfel de constante recunoscute de majoritatea browser-elor. Ne vom limita în a le enumera doar pe

cele 16 care sunt considerate de baz , exemplificându-le pe fiecare:

O serie dintre culori (îns nu toate) au şi constante în variantele „dark” (închis) respectiv

„light” (deschis). De exemplu: darkred sau lightblue.

• prin constanta de tip RGB (Red, Green, Blue):

Principiul de baz al red rii electronice ale unei imagini în culori se bazeaz pe amestecarea

în proporţii diferite ale culorilor Roşu, Verde şi Albastru. În acest mod, se poate obţine orice

culoare se doreşte. În cazul culorilor pe care le poate reda un browser HTML, fiecare dintre aceste

componente de culoare poate avea 256 de st ri posibile: de la 0, care înseamn c respectiva culoare

lipseşte cu des vârşire, pân la 255, care înseamn c respectiva culoare este folosit la intensitatea

maxim . În acest fel, prin amestecuri diferite, putem obţine 2563, deci aproximativ 16 milioane de

nuanţe diferite.

Componentele de culoare în HTML se specific folosind numere hexazecimale. Astfel, fiecare

dintre numerele dintre 0 şi 255 se codific în hexazecimal printr-un num r între 00 şi FF. Constanta

HTML pentru specificarea unei culori are forma general #RRGGBB, în care RR, GG respectiv BB

reprezint câte un num r hexazecimal cuprins între 00 şi FF.

Iat câteva exemple de culori obţinute folosind constante de forma celei de mai sus:

Page 21: HTML Php Mysql Pentru Incepatori-libre

23

2.3.8. Tabele.

Tabelele reprezint un element foarte important al unei pagini web. În foarte multe cazuri,

tabele cu chenare invizibile sunt folosite ca şi „schelet” al paginii, pentru a putea realiza alinieri

complexe ale elementelor acesteia.

Tag-ul pentru descrierea unui tabel este <TABLE>...</TABLE>. În cadrul acestora trebuie

descrise liniile (rândurile) tabelului, în cadrul fiec rui rând trebuind descrise celulele acestuia.

Descrierea unui rând se face între tag-urile <TR>...</TR>. La rândul lor, celulele din cadrul

rândului se descriu între <TD>...</TD>. Atît tag-ul </TR> cât şi tag-ul </TD> pot fi omise.

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, omiţând 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 1, celula 1 <TD>Rindul 1, celula 2 <TR> <TD>Rindul 2, celula 1 <TD>Rindul 2, celula 2 </TABLE>

Atribute ale tag-ului <TABLE>

• cellpadding=”nr_pixeli” permite stabilirea unui spaţiu care va fi l sat, în fiecare

celul a tabelului, între conţinutul celulei şi marginile acesteia. Dac nu se specific acest atribut, el

este în mod implicit considerat 0

• cellspacing=”nr_pixeli” permite stabilirea spaţiului care va fi l sat între chenarele

celulelor vecine în tabel (şi inclusiv între ele şi chenarul exterior al tabelului). Dac nu se specific

acest atribut, el este în mod implicit considerat 2.

Conţinutul unei celule poate fi cât se poate de general: de la text şi imagini pân la alte

tabele (se pot deci construi chiar şi tabele imbricate), ca în exemplul urm tor (apl017.html):

Page 22: HTML Php Mysql Pentru Incepatori-libre

24

<TABLE border="1" cellspacing="4" cellpadding="5"> <TR> <TD> Poza cu catelus<BR> <IMG src="dog.jpg"> <TD> Tabel cu baieti <TABLE border cellspacing="0"> <TR><TD>Mihai <TR><TD>Costel <TR><TD>Alin </TABLE> <TD> Tabel cu fete <TABLE border cellspacing="0"> <TR><TD>Mihaela <TR><TD>Costina <TR><TD>Alina </TABLE> </TABLE>

• width=”lăţime” poate stabili cât de lat s fie tabelul. L ţimea poate fi dat în procente,

caz în care se va calcula ca şi procent din l ţimea ferestrei browser-ului (ex: width=”50%”) sau în

pixeli (ex: width=”500”);

• height=”înălţime” poate stabili cât de înalt s fie tabelul. L ţimea poate fi dat , la fel

ca şi în cazul atributului width, în procente sau în pixeli;

• align determin alinierea tabelului în pagin . Poate la una dintre valorile left, right

sau center. Dac , pe lâng tabel, mai scriem şi text, acesta se va poziţiona faţ de tabel în acelaşi

mod în care se poziţioneaz şi faţ de imagini;

• bgcolor=”culoare” permite stabilirea culorii de fundal a tuturor celulelor tabelului;

• bordercolor=”culoare” permite stabilirea culorii chenarului (deopotriv cel interior

cât şi cel exterior)

Atribute ale tag-ului <TR>

• align determin , pentru toate celulele de pe linie, modul alinierii conţinutului pe orizontal , în interiorul celulelor. Poate la una dintre valorile left, right, center sau justify; • valign determin , pentru toate celulele de pe linie, modul alinierii conţinutului pe vertical , în interiorul celulelor. Poate la una dintre valorile top, bottom sau middle; • bgcolor determin , pentru toate celulele de pe linia respectiv , culoarea de fundal.

Atribute ale tag-ului <TD>

• width şi height determin , pentru celula respectiv , l ţimea şi în lţimea. Poate fi dat în

procente sau pixeli. Dac e specificat în procente, se va lua din l ţimea, respectiv în lţimea

Page 23: HTML Php Mysql Pentru Incepatori-libre

25

tabelului. Modificarea l ţimii şi a în lţimii unei celule va avea efect şi asupra celorlalte celule,

pentru ca tabelul s fie aliniat;

• align şi valign stabilesc, la fel ca şi în cazul lui <TR>, modul în care este aliniat

conţinutul în interiorul celulei, pe orizontal respectiv pe vertical , fiind prioritare faţ de alinierea

la nivel de linie

• colspan=”n” stabileşte întinderea celulei respective în dreapta cu n coloane

(echivalentul operaţiei Merge Cells din Word, în cazul în care unim celule adiacente pe orizontal );

• rowspan=”n” stabileşte întinderea celulei respective în jos cu n linii (echivalentul

operaţiei Merge Cells din Word, în cazul în care unim celule adiacente pe vertical );

• bgcolor determin , pentru celula respectiv , culoarea de fundal. Evident, este prioritar

faţ de acelaşi atribut la nivel de linie.

Exemplu (apl018.html):

<TABLE border="1" cellspacing="0" cellpadding="5"> <TR bgcolor="#c0c0ff"> <TD>Ziua <TD>09h00 - 11h00 <TD>11h00 - 13h00 <TD>13h00 - 15h00 <TR bgcolor="yellow" align="center"> <TD align="left"><B>Luni</B> <TD colspan="2">Mecanica <TD bgcolor="#ffd0d0">Termodinamica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Marti</B> <TD>Electrostatica <TD>Optica <TD>Atomica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Miercuri</B> <TD rowspan="2" bgcolor="#ffd0d0">Termodinamica <TD>Optica <TD>Electrostatica <TR bgcolor="yellow" align="center"> <TD align="left"><B>Joi</B> <TD>Mecanica <TD>Optica </TABLE>

• Tag-ul <TH>...</TH> poate înlocui <TD>...</TD>. Atributele sunt aceleaşi. Singura

diferenţ este c textele de dup tag-ul <TH> sunt, în mod implicit, tip rite îngroşat (Bold) iar

alinierea lor se face pe centru;

• Tag-ul <CAPTION>...</CAPTION> permite scrierea unui titlu pentru tabel. Acest tag

trebuie s se g seasc imediat dup </TABLE>. Acest tag suport atributul align. Acesta poate lua

una dintre valorile: left (titlul va fi poziţionat în stânga sus), right (poziţionare dreapta sus), top

(poziţionare pe centru sus), bottom (poziţionare pe centru jos);

Page 24: HTML Php Mysql Pentru Incepatori-libre

26

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>

2.3.9. Legături (link-uri).

Aşa cum am v zut în partea introductiv a acestui capitol, noţiunea de www este strâns

legat de documentele de tip hipertext.

Tot ceea ce am prezentat din limbajul HTML pân în momentul de faţ , reprezint doar

partea descriptiv a acestuia, cu ajutorul c reia putem crea un conţinut static.

Link-urile reprezint mecanismul prin care:

• putem face ca un vizitator al paginii, prin executarea unui click, s poat accesa o alt

pagin , la care dorim s -i cre m posibilitatea unui acces rapid şi, dac acesta doreşte, s poat

reveni în pagina iniţial prin ap sarea butonului Back al browser-ului de Internet;

• putem face ca un vizitator al paginii noastre s primeasc un anumit fişier, de orice tip,

care se g seşte pe site-ul nostru (download);

• putem face ca un vizitator al paginii noastre s poat asculta un mesaj sonor sau chiar s

poat viziona un film;

• putem ca, printr-un click, s putem vizualiza o pagin (inclusiv cea curent ) doar dintr-un

anumit loc, f r a folosi barele de derulare;

• putem ca, prin accesarea unui click, cel care viziteaz pagina s ne poat trimite un e-mail.

Pentru toate acestea, vom folosi tag-ul <A>...</A>, numit şi Ancor .

Page 25: HTML Php Mysql Pentru Incepatori-libre

27

Ancore de leg tur c tre alte pagini

Acestea permit ca un anumit element din document s conţin leg tura c tre o alt pagin .

Elementul care face leg tura este de obicei un text sau o imagine. De regul , elementul legat îşi

schimb aspectul faţ de cel clasic: textul va fi subliniat şi colorat altfel, iar imaginea va avea un

chenar colorat. În momentul în care ducem cursorul deasupra elementului legat, acesta cap t forma

unei mâini, indicându-ne astfel c este vorba de un link pe care îl putem utiliza. Printr-un simplu

click, acces m pagina c tre care este f cut leg tura.

Acest tip de leg tur se realizeaz practic folosind atributul href, ca în exemplul de mai jos

(a se remarca modul în care, elementul legat, este inclus între tag-urile <A href=...> şi </A> :

apl020.html): <p> Prin executarea unui click <A href="http://mail.yahoo.com"> pe acest text </A> poti accesa direct pagina de mail yahoo. </p>

Dup cum se observ , atributul href primeşte adresa complet a paginii c tre care dorim s

facem leg tura. Dac e vorba de un fişier local, din acelaşi director cu pagina din care facem

leg tura, la href este suficient s scriem numele şi extensia (de ex: href=”pagina.htm”)

Ancore de leg tur c tre fişiere (pentru download)

Se realizeaz în mod analog cu cele c tre alte pagini, la atributul href trebuind specificat

adresa fişierului respectiv (dac este în acelaşi director cu pagina din care facem leg tura, e

suficient s -i scriem numele şi extensia).

Ex: în cazul în care fişierul pentru download este local:

Pentru download arhiva executa un click <A href="arhiva.zip">aici</A>

Ex: în cazul în care fişierul pentru download se afl la alt adres :

Pentru a descarca subiectele de bacalaureat la disciplina informatica, da un click

<A href="http://subiecte2008.edu.ro/bacalaureat/subiecte/E_informatica_c.zip">aici</A>

Leg turile c tre fişiere de tip sunet sau film se fac absolut în aceeaşi manier . În funcţie de extensia

lor (.wav, .mid, .mp3, .avi) în momentul execut rii unui click asupra obiectului care face leg tura

c tre ele, acestea vor fi deschise automat c tre browser cu programul corespunz tor.

Page 26: HTML Php Mysql Pentru Incepatori-libre

28

Leg turi relative la con inutul documentului (paginii)

Sunt acele ancore care permit accesarea direct a unei pagini web într-un anumit loc, f r a

mai folosi barele de derulare pentru a ajunge în acel loc.

Pentru aceasta, locul respectiv trebuie marcat. Acest lucru se face tot cu ajutorul tag-ului

<a>, îns folosind atributul id, care va denumi locul respectiv printr-un identificator, ca în

exemplul de mai jos (a se observa c între tag-ul de deschidere şi cel de închidere putem s nu

punem nici un element):

<A id=”capitolul2”></A>

Accesarea direct a acestui loc cu ajutorul unui link se poate face astfel:

a) Din interiorul aceleişi pagini: specificând la atributul href identificatorul respectiv (cel

de la id) înainte de care se pune de caracterul #, ca în exemplul urm tor:

<A href=”#capitolul2”>Salt direct la capitolul 2</A>

b) Din alt pagin : specificând la atributul href adresa paginii accesate (a fişierului html)

urmat de caracterul #, ca în exemplul urm tor:

<A href=”http://www.myserver.ro/document.html#capitolul2”>Deschide documentul extern,

direct la capitolul 2</A>

Ancor de leg tur pentru trimiterea unui e-mail

Acestea permit ca, atunci când o persoan ne viziteaz site-ul, dac doreşte, s ne poat

trimit un e-mail f când un simplu click pe leg tura respectiv . Totuşi, pentru ca acest lucru s fie

funcţional, cel care viziteaz site-ul trebuie s aib configurat pe calculatorul s u un client de e-mail

(cel mai frecvent este Outlook Express).

Iat un exemplu pentru o astfel de ancor :

<ADDRESS>

Click <A href=”mailto:[email protected]”>aici</A> pentru a trimite un e-mail

</ADDRESS>

(tag-ul <ADDRESS>...</ADDRESS> nu face altceva decât s afişeze textul din cadrul s u italic)

Dup cum se observ , pentru trimiterea unui e-mail, dup atributul href trebuie specificat

mailto: urmat de adresa de e-mail a destinatarului.

Page 27: HTML Php Mysql Pentru Incepatori-libre

29

2.3.10. Elemente de structură (HTML, HEAD, BODY).

Dup cum am v zut în partea introductiv , orice document html este cuprins între tag-urile

<HTML> şi </HTML>. El este alc tuit dintr-un unic antet (HEAD) şi un unic corp (BODY). Aceste 3

elemente au rolul de a defini structura documentului. Din acest motiv ele se mai numesc şi elemente

de structur .

Tag-ul BODY poate conţine urm toarele atribute:

• background=”fişier_imagine” permite specificarea unei imagini de fundal. Aceasta

se va repeta atât pe orizontal cât şi pe vertical , pân când 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 vizit rii şi imediat dup aceasta;

• vlink=”culoare” permite specificarea culorii unui link vizitat, care nu mai este activ.

Con inutul sec iunii <HEAD>

În cadrul acestei secţiuni putem întâlni diverse alte tag-uri. Despre tag-ul <TITLE> am

discutat deja, el permiţând scrierea unui titlu pentru pagin .

În afar de acestea, vom aminti înc alte 3 tag-uri:

• <BASE> permite stabilirea unei adrese de baz pentru resurse. Acest tag se foloseşte în

special atunci când resursele (sau, în fine, o mare parte a acestora) se g sesc în alt director decât cel

în care se afl documentul curent. În acest fel, folosirea fişierelor din directorul specificat în BASE

se poate face direct prin numele şi extensia lor. Specificarea se face prin:

<BASE href=”adresa resurse”>

• <META> este folosit pentru a furniza informaţii motoarelor de c utare. Unele dintre acestea

viziteaz doar antetul pentru a obţine informaţii. Informaţiile conţinute de acest element nu sunt

afişate de browser, îns este important s îl folosim pentru ca informaţiile conţinute în site-ul nostru

s fie accesibile. Locul tag-ului <META> este în antet (<HEAD>).

Page 28: HTML Php Mysql Pentru Incepatori-libre

30

Atributele tag-ului <META> sunt name şi content. Folosirea lor este ceva mai particular ,

rezultând din exemplele urm toare:

- pentru a specifica autorul unui document:

<META name=”Author” content=”Prenume NUME”>

- pentru a specifica titlul unui document:

<META name=”TITLE” content=”Metode de programare”>

- pentru a preciza cuvintele cheie dup care s fie reg sit site-ul:

<META name=”KEYWORDS” content=”backtracking, divide et impera,

greedy, programare dinamica”>

- pentru a specifica limba în care este scris site-ul:

<META name=”LANGUAGE” content=”RO”>

Exist şi alte atribute ale elementului META, îns cele dou deja prezentate sunt suficiente.

• <STYLE> este utilizat pentru introducerea stilurilor. Acestea permit stabilirea mai

am nunţit a modului în care apar, implicit, diferitele elemente din document. Valorile se trec între

<STYLE>...</STYLE>.

Exemplu:

<STYLE> P {font-family:”Comic Sans MS”; font-size:14pt;} </STYLE>

Prin specificarea lui P înainte de paranteza acolad , stabilim ca modul implicit de afişare al

paragrafelor (s ne reamintim c <P> este tag-ul pentru paragraf) s fie cel descris între parantezele

acolade, deci, în cazul exemplului de faţ font-ul folosit s fie ”Comic Sans MS”, iar dimensiunea

caracterelor s fie de 14.

• <SCRIPT> este utilizat pentru introducerea anumitor secvenţe de program în cadrul

paginilor web. Exist mai multe limbaje (numite de scriptare) care permite scrierea acestor

secvenţe, 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 defineşte în antetul paginii o funcţie JavaScript capabil s calculeze suma

numerelor de la 1 la 10 într-o variabil s şi-apoi s afişeze valoarea obţinut prin intermediul unei

ferestre de dialog. Funcţia este apelat automat (atributul onload) la înc rcarea paginii.

Page 29: HTML Php Mysql Pentru Incepatori-libre

31

2.3.11. Pagini cu cadre (FRAMESET, FRAME, IFRAME).

Utilizarea frame-urilor permite ca, în cadrul aceleiaşi ferestre ale browser-ului s fie afişate

simultan mai multe documente HTML (sau alte resurse).

Tag-ul <FRAMESET> are rolul de a împ rţi fereastra în mai multe cadre. În fişierul HTML,

el înlocuieşte tag-ul <BODY>. Iat câteva atribute ale lui FRAMESET:

• rows – descrie liniile în care este împ rţit secţiunea FRAMESET respectiv

• cols – descrie coloanele în care este împ rţit secţiunea FRAMESET respectiv

descrierile pentru rows, respectiv cols, pot fi de forma:

<FRAMESET rows=”30%, 50%, 20%”> <FRAME ...> <FRAME ...> <FRAME ...> </FRAMESET>

în acest exemplu, se definesc 3 cadre orizontale (linii) de în lţimi 30%, 50% respectiv 20% din

în lţimea ferestrei.

Un alt exemplu, în care în lţimea cadrelor este definit proporţional:

<FRAMESET rows=”3*, 1*, 2*”>...

aici se definesc 3 cadre orizontale, proporţionale cu 3, 1 şi 2 dintr-o în lţime de 3+2+1=6

(deci cadrele vor fi 3/6, 1/6 respectiv 2/6 din în lţimea ferestrei)

Un alt exemplu, în care în lţimea cadrelor este definit în pixeli:

<FRAMESET rows=”100, 200, *”>...

aici se definesc trei frame-uri: unul de în lţime de 100 de pixeli, altul de 200 de pixeli, al treilea

fiind alocat cu spaţiul r mas.

Tag-ul <NOFRAMES>...</NOFRAMES> reprezint conţinutul care va fi afişat unui vizitator,

în cazul în care browser-ul s u nu poate afişa 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 conţin descrierile fiec ruia dintre cadrele definite. Acest

lucru se face cu ajutorul tag-ului <FRAME> prin intermediul atributelor:

• src – adresa fişierului HTML sau a imaginii care se va înc rca iniţial în cadru;

• marginheight – marginile (în pixeli sau procent) faţ de partea de sus şi cea de jos;

• marginwidth – marginile (în pixeli sau procent) faţ de partea din stânga şi din dreapta;

Page 30: HTML Php Mysql Pentru Incepatori-libre

32

• frameborder – poate lua valorile 1 (implicit ), care înseamn c acest cadru este separat

de celelalte printr-un chenar, respectiv 0, care înseamn c acest cadru nu mai este separat de

celelalte printr-un chenar.

• scrolling – trateaz afişarea barei de scroll (derulare). Poate lua trei valori:

auto – valoarea implicit . Bara de scroll este prezent numai dac este cazul

yes – bara de scroll este totdeauna prezent

no – bara de scroll nu va fi niciodat afişat

• noresize – dac atributul acesta este prezent (el se foloseşte f r a i se atribui nici o

valoare) atunci vizitatorului paginii nu i se va permite s redimensioneze cadrul. Prezenţa acestui

atribut pentru un cadru nu permite nici redimensionarea cadrelor vecine.

• name – este un atribut foarte important. Prin intermediul s u va putea fi identificat

frame-ul respectiv. Acest lucru este foarte important, deoarece dintr-un cadru se poate comanda

conţinutul oric rui alt cadru.

Deschiderea unei pagini într-un anumit cadu, prin intermediul ancorelor, se poate specifica

prin folosirea atributului target=”nume cadru” imediat dup folosirea atributului href în

cadrul tag-ului <A href=”...” .. >.

Iat un exemplu prin care definim o pagin cu dou frame-uri verticale. Frame-ul din stânga

va conţine numele a 3 zile ale s pt mânii (pe limba român ). Accesarea fiec ruia va produce

deschiderea în frame-ul drept a unei pagini care va conţine traducerea numelui zilei respective în 4

limbi.

În total vom avea de construit 5 fişiere:

- un fişier pentru pagina iniţial , cea care defineşte scheletul paginii cu frame-uri

- un fişier cu cele 3 zile ale s pt mânii, pe fiecare dintre ele fiind pus câte un hyperlink care va

deschide traducerea numelui s u în cel lalt frame

- 3 fişiere cu traducerilor numelor zilelor în 4 limbi str ine.

Pagina iniţial (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>

Page 31: HTML Php Mysql Pentru Incepatori-libre

33

De remarcat faptul c aceast fişier HTML nu conţine decât scheletul cadrelor, ele urmând a

fi populate iniţial, dup cum remarcaţi din codul surs , cu fişierele apl022zile.html pentru

primul cadru (cel din stânga) respectiv cu fişierul apl022luni.html pentru cel de-al doilea cadru.

Observaţi modul în care au fost definite cadrele în cadrul tag-ului FRAMESET:

cols="30%,*". Acest lucru semnific prezenţa a dou cadre verticale (coloane) dintre care primul

va ocupa 30% din l ţimea ferestrei, iar al doilea restul (lucru semnificat de caracterul * care

închide şirul de definiţie al cadrelor).

De asemenea, atributul noresize în cadrul primului tag FRAME împiedic redimensionarea

cadrelor de c tre utilizator. În cazul în care acest atribut nu ar fi fost prezent, utilizatorul, printr-un

simplu „drag and drop” ar fi putut trage bara care separa cele dou frame-uri, dându-i orice poziţie

ar fi dorit.

Dac înc rc m în browser-ul de internet documentul creat în acest stadiu, f r ca pe disc s

existe vreunul dintre celelalte patru fişiere planificate, am obţine urm torul rezultat:

Acesta era şi de aşteptat, de altfel, deoarece el demonstreaz existenţa frame-urilor şi lipsa

conţinutului.

Iat şi conţinutul celorlalte fişiere, pe care le vom pune în acelaşi director cu documentul de

mai sus (în dreptul fiec ruia vom ar ta şi vizualizarea sa în browser):

Fişierul apl022zile.html: <HTML> <HEAD> <TITLE>Zilele</TITLE> </HEAD> <BODY> <br> <A href="apl022luni.html" target="dreapta">Luni</A><br><br> <A href="apl022marti.html" target="dreapta">Marti</A><br><br> <A href="apl022miercuri.html" target="dreapta">Miercuri</A><br><br> </BODY> </HTML>

De remarcat modul în care am realizat link-urile asupra celor 3 cuvinte: folosind şi atributul

target în cadrul ancorei (<A ...>) am specificat browser-ului ca paginile respective s fie

deschise în cadrul frame-ului al c rui nume apare dup target.

Page 32: HTML Php Mysql Pentru Incepatori-libre

34

Fişierul apl022luni.html: <HTML><BODY> <H2>Luni</H2> FR: Lundi<BR> IT: Lunedi<BR> GE: Montag<BR> EN: Monday<BR> </BODY></HTML>

Fişierul apl022marti.html: <HTML><BODY> <H2>Marti</H2> FR: Mardi<BR> IT: Martedi<BR> GE: Dienstag<BR> EN: Tuesday<BR> </BODY></HTML>

Fişierul apl022miercuri.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 fişiere de mai sus):

Evident, la efectuarea unui click asupra leg turilor (luni, marti, miercuri) din partea stâng ,

se va produce deschiderea paginii corespunz toare în frame-ul drept.

Tag-ul <IFRAME> este un element care nu a fost prezent în primele versiuni ale limbajului

HTML, ci a ap rut ceva mai nou. Actualmente, folosirea sa este preferat de majoritatea celor care

programeaz pagini web, deoarece se comport ceva mai flexibil decât cadrele clasice. Totodat ,

motoarele de c utare nu indexeaz conţinutul paginilor cu frame-uri obişnuite, pe când cele care

conţin iframe-uri sunt indexate.

Prin intermediul s u, este permis crearea unui cadru în corpul unui documente HTML,

cadrul care se comport asem n tor unei imagini.

Atributele lui IFRAME sunt:

• name – la fel ca şi la FRAME, acest atribut permite identificarea IFRAME-ului (pentru a

putea comanda conţinutul s u din orice link)

• height, width în lţimea, respectiv l ţimea. Pot fi specificate atât în pixeli, cât şi în

procente, relativ la dimensiunile ferestrei browser-ului

• frameborder – poate lua valoarea 0 sau 1, la fel ca la elementul FRAME

• src – adresa resursei care va fi înc rcat iniţial în IFRAME

• marginwidth, marginheight, scrolling – la fel ca şi la FRAME

• align – poate lua una dintre valorile left, right, top, bottom, middle,

comportându-se întocmai ca şi în cazul imaginilor

Page 33: HTML Php Mysql Pentru Incepatori-libre

35

Iat reluarea aceleiaşi idei structurale ca şi la aplicaţia de dinainte (cu frame-uri clasice) îns

folosind un element de tipul IFRAME. Fişierele apl022luni.html, apl022marti.html

respectiv apl022miercuri.html le p str m nemodificate. Practic, mai cre m doar un singur

fişier HTML, cu conţinutul urm tor, şi avem grij s copiem în acelaşi director şi cele 3 fişiere de

mai sus (apl023.html):

<HTML> <HEAD><TITLE>Elementul IFRAME</TITLE></HEAD> <BODY> <IFRAME name="cadru" width="140" height="160" align="right" src="apl022luni.html"> </IFRAME> <BR> <A href="apl022luni.html" target="cadru"> Luni</A><BR><BR> <A href="apl022marti.html" target="cadru"> Marti</A><BR><BR> <A href="apl022miercuri.html" target="cadru"> Miercuri</A><BR><BR> </BODY> </HTML>

2.3.12. Bare de separare (HR).

Bara de separare, al c rei tag este <HR> reprezint un element decorativ. De obicei se

foloseşte pentru a separa anumite secţiuni ale paginii web.

Atributele sale sunt:

• width – permite specificarea lungimii sale. Poate fi dat în pixeli sau în procente. Dac

acest atribut lipseşte, atunci lungimea sa va fi maxim (din marginea stâng şi pân marginea

dreapt a ferestrei);

• size – permite specificarea în lţimii barei. Se specific în pixeli;

• color – permite specificarea culorii sale.

Exemplu (apl024.html):

<BODY> O linie clasica: <HR> <CENTER>O linie de lungime 50%</CENTER> <HR width="50%"> <CENTER>O linie de lungime 200 de pixeli, grosime 10 pixeli, de culoare rosie</CENTER> <HR width="200" size="10" color="red"> </BODY>

Page 34: HTML Php Mysql Pentru Incepatori-libre

36

2.3.13. Formulare.

Formularele sunt elemente ale limbajului HTML. Ele reprezint o grupare de componente

care permit trimiterea de date şi de comenzi c tre un server. Acesta trebuie s fie mai mult decât un

clasic server HTTP, trebuind s aib instalat şi o component capabil de a r spunde comenzilor şi

a prelucra datele. Cea mai popular astfel de component , foarte larg utilizat în ultimii 10 ani în

programarea pe Internet este limbajul PHP, de care ne vom ocupa pe larg în capitolul al III-lea al

acestei lucr ri.

Pentru moment ne vom concentra asupra componentelor unui formular şi a aspectului

acestora.

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

r spunde la comenzi şi de a prelucra datele.

• method – acest atribut specific modul în care datele vor fi transmise c tre 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

c tre server, ele vor ap rea scrise în clar, în bara de adres , într-un anumit format standard. De

exemplu, dac formularul trimite c tre pagina test.php o variabil a care este egal cu 5, în bara de

adres a browser-ului ne va ap rea 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 fiec rui browser).

- post – datele nu mai apar în mod explicit utilizatorului. Totuşi, ele nu sunt

criptate – practic, un program r uf c tor le poate intercepta.

Pe lâng componentele specifice, un formular poate conţine orice fel de alte elemente valide

de HTML – tabele, imagini, text, bare de separare ...

În continuare vom prezenta câteva din componentele unui formulare, prin intermediul c rora

utilizatorul poate introduce date şi trimite apoi aceste date c tre server. Un atribut foarte important

al oric ruia dintre aceste componente este name, deoarece prin intermediul s u, server-ul care va

primi datele va şti despre care dintre controale este vorba.

Page 35: HTML Php Mysql Pentru Incepatori-libre

37

Câmpuri text

Permit utilizatorului s introduc date într-un câmp de tip edit (pe o singur linie).

Aceste se specific prin tag-ul

<INPUT type=”text” ...>

Atributele sale sunt:

• size – specific l ţimea (în num r aprox. de caractere) câmpului text; Dac acest

parametru este omis, este implicit considerat ca fiind 20;

• maxlength – specific num rul maxim de caractere ce pot fi scrise în câmpul text. Acest

atribut poate primi o valoare mai mare decât cea scris la size, caz în care, textul va defila în control

(stânga dreapta) în cazul în care scriem mai multe caractere decât câte încap în porţiunea vizibil .

Omiterea acestui atribut va permite introducerea unui num r foarte mare de caractere (limita difer

de la un browser la altul);

• name – numele câmpului text (prin care server-ul va identifica acest câmp, pentru a prelua

datele din el);

• value – poate specifica o valoare care s fie iniţial (la înc rcarea paginii) deja scris în

cadrul controlului. Dac omitem acest atribut, câmpul text va fi gol.

Butoane de tip „submit”

Aceasta componenta se prezint sub forma unui buton. Prin ap sarea sa are loc trimiterea

tuturor datelor din formular c tre script-ul de pe server-ul care le va prelucra.

Un control de tip submit se specific prin tag-ul:

<INPUT type=”submit” ...>

Atributele sale sunt:

• name – numele de identificare a componentei. Putem omite acest atribut. El se foloseşte în

cazul în care aceluiaşi formular dorim s -i ataş m mai multe butoane de acest tip, iar ap sarea

fiec ruia s produc o acţiune diferit ;

• value – textul care va fi scris pe buton. De altfel, aceasta va fi şi valoarea pe care server-

ul o va primi pentru acest control.

Page 36: HTML Php Mysql Pentru Incepatori-libre

38

Câmpuri de tip password Se comport identic cu câmpurile de tip text. Singura deosebire este c , la scrierea de text în

ele, acesta nu va fi vizibil, ci în locul caracterelor introduse se vor afişa asterisc-uri. Totodat , textul

dintr-un astfel de control nu poate fi luat cu copy/paste.

Controalele de acest fel se specific prin tag-ul:

<INPUT type=”password” ...>

Atributele sunt identice cu cele de la <INPUT type=”text” ...>

Câmpuri de tip butoane radio Sunt controalele care permit ca, dintr-o serie de opţiuni posibile, utilizatorul s aleag una

singur . Controalele de acest fel se specific prin tag-ul:

<INPUT type=”radio” ...>

Atributele sale sunt:

• name – numele de identificare al componentei. Este obligatoriu ca toate butoanele care

aparţin aceluiaşi grup (deci seria de opţiuni din care trebuie aleas doar una singur posibil ) s

poarte acelaşi nume de identificare;

• value – valoarea pe care o va întoarce butonul respectiv, dac el a fost cel ales;

• checked – dac acest atribut este prezent, butonul respectiv va fi ales în mod implicit, la

înc rcarea paginii. Este recomandabil ca, dintre toate butoanele care aparţin aceluiaşi grup, exact

unul singur s conţin acest atribut.

Iat şi un exemplu care combin controalele prezentate pân acum (apl025.html):

<FORM action="nefunctional.php" method="post"> Introdu numele tau de familie <INPUT type="text" size="10" maxlength="20" name="numele"> <BR><BR>Alege-ti si o parola <INPUT type="password" size="10" maxlength="20" name="parola"> <BR><BR> Alege ce fel de studii ai:<BR><BR> <INPUT type="radio" name="studii" value="scprim"> Doar scoala primara<BR> <INPUT type="radio" name="studii" value="8clase"> Scoala primara si cea generala (8 clase)<BR> <INPUT type="radio" name="studii" value="medii" checked> Studii medii (liceul si eventual un curs postliceal) <BR> <INPUT type="radio" name="studii" value="univ"> Studii universitare<BR><BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Evident, acest exemplu este nefuncţional, în sensul c datele din formular nu sunt prelucrate.

Acest lucru va face obiectul capitolului urm tor, şi anume preluarea datelor dintr-un formular prin

intermediul limbajului php.

Page 37: HTML Php Mysql Pentru Incepatori-libre

39

Câmpuri de tip checkbox

Sunt controale care permit bifarea sau ştergerea bif rii unei c suţe. Din punct de vedere

practic, ele permit utilizatorului s marcheze una, nici una, sau mai multe opţiuni.

Controalele de acest fel se specific prin tag-ul:

<INPUT type=”checkbox” ...>

Atributele sale sunt:

• name – numele de identificare al componentei;

• value – valoarea pe care o va întoarce controlul respectiv;

• checked – dac acest atribut este prezent, atunci controlul va fi bifat la înc rcarea paginii.

Exemplu (apl026.html):

<FORM action="nefunctional.php" method="post"> Alege din lista de mai jos limbile pe care le cunosti:<BR><BR> <INPUT type="checkbox" name="rom" value="1" checked> Limba românã<BR> <INPUT type="checkbox" name="eng" value="2"> Limba engleza<BR> <INPUT type="checkbox" name="fr" value="3"> Limba franceza<BR> <INPUT type="checkbox" name="germ" value="4"> Limba germana<BR><BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Câmpuri ascunse (de tip hidden)

Aceste componente permit trimiterea de valori c tre server (o dat ce butonul submit a fost

ap sat) f r ca acestea s fie vizibile în cadrul form-ului. Practic, aceste componente se specific

doar în cadrul codului HTML:

<INPUT type=”hidden” name=”nume” value=”value”>

Aşa cum se observ în tag-ul de mai sus, cu ajutorul atributului name specific m numele

controlului, iar cu ajutorul atributului value specific m valoarea care va fi trimis c tre server.

Controlul de tip TEXTAREA

Este o component care se utilizeaz pentru a introduce un text mai lung, care se poate

întinde pe mai multe linii.

Tag-ul s u este: <TEXTAREA>...</TEXTAREA>.

Page 38: HTML Php Mysql Pentru Incepatori-libre

40

Atributele sale sunt:

• name – numele de identificare al componentei;

• rows – num rul de linii pe care se întinde componenta (implicit 2);

• cols – num rul de coloane pe care se întinde componenta (implicit 20);

Dac dorim ca la înc rcarea paginii s ne apar un text deja scris în cadrul controlului, acest

text se va scrie între tag-ul de deschidere şi cel de închidere al lui TEXTAREA.

Exemplu (apl027.html):

<FORM action="nefunctional.php" method="post"> Scrie-ti parerea despre spectacol:<BR> <TEXTAREA rows="3" cols="30" name="parerea"></TEXTAREA> <BR> <INPUT type="submit" value="Trimite datele"> </FORM>

Controlul de tip SELECT

Acest control este utilizat pentru afişarea unei liste din care utilizatorul poate s aleag unul

sau mai multe opţiuni.

Tag-ul prin care se utilizeaz aceast component este <SELECT>...</SELECT>.

Atributele sale sunt:

• name – numele de identificare al componentei;

• multiple – dac acest atribut este prezent, utilizatorul poate alege mai multe opţiuni din

list , ţinând ap sat tasta control sau shift în timp ce d click pe acestea.

• size – num rul de opţiuni care sunt afişate. Implicit este 1, în cazul listelor care nu sunt

de tip multiple. În acest caz, lista se prezint sub forma unei liste de tip drop-down;

Fiecare opţiune din list se specific printr-un tag <OPTION>...</OPTION>. Acestea, la

rândul lor, au urm toarele atribute:

• value – reprezint valoarea care va fi întoars de controlul SELECT în cazul în care va fi

selectat opţiunea respectiv ;

• selected – dac acest atribut este prezent, opţiunea respectiv va fi selectat la

înc rcarea paginii

Textul efectiv al opţiunii se scrie între tag-ul de deschidere şi cel de închidere. Tag-ul de

închidere este opţional, el putând fi omis.

Page 39: HTML Php Mysql Pentru Incepatori-libre

41

Iat un exemplu de folosire al controlului de tip select (apl028.html):

<FORM action="nefunctional.php" method="post"> Alege din lista de mai jos ce fel de studii ai: <BR> <SELECT name="studii"> <OPTION value="prim">Scoala primara (4 clase) <OPTION value="gen">Scoala generala (8 clase) <OPTION value="lic" selected>Studii medii (12 clase) <OPTION value="univ">Studii universitare </SELECT> <INPUT type="submit" value="Trimite datele"> </FORM>

2.4. Extinderi ale limbajului HTML standard: HTML dinamic, script-uri.

Deşi HTML-ul clasic permite redactarea unor documente hypertext de un nivel foarte înalt

şi elaborat, o dat cu evoluţia limbajelor de programare vizuale, a început s devin mai puţin

atractiv decât a fost la început.

Din acest motiv, a fost pus la punct ceea ce numim DTHML (Dynamic HTML) – care nu

este un limbaj în sine, ci un termen prin care sunt desemnate tehnicile utilizate pentru a face

paginile web cât mai dinamice şi cât mai interactive.

Pe lâng HTML-ul propriu-zis, noile unelte recunoscute de browser-ele din ultima generaţie

sunt CSS (Cascading Style Sheets), JavaScript şi DOM (Document Object Model).

Scopul acestei lucr ri nu este studiul am nunţit al acestora, de aceea le vom trece doar în

revist , folosind mici exemple comentate pentru fiecare dintre ele.

2.4.1. CSS (Cascading Style Sheets).

Noţiunea de stil este, pentru un document HTML, asem n toare cu formatarea

documentului, spre exemplu, pentru un document Word. Exis o mulţime de atribute prin care se

pot stabili font-urile, caracteristicile de aliniere a textului, forma elementului, culorile de fond şi ale

literelor, marginile, poziţia elementelor, etc.

Pentru a putea gestiona cât mai eficient stilurile, a fost pus la dispoziţia programatorilor de

pagini web un limbaj prin care se poate realiza acest lucru. Acest limbaj este cunoscut sub numele

de CSS (actualmente, vorbim de versiunea CSS2).

Leg tura dintre HTML şi CSS se realizeaz prin intermediul tag-ului <STYLE>...</STYLE>

care trebuie aşezat între <HEAD> şi </HEAD>.

Page 40: HTML Php Mysql Pentru Incepatori-libre

42

În cadrul tag-ului STYLE vom stabili modul în care dorim s arate elementele paginii.

Fiecare element al HTML-ului pe care l-am studiat este identificat, în cadrul CSS-ului de tag-ul care

îl gestioneaz . Spre exemplu, identificatorul CSS pentru paragrafe este P, pentru table este TABLE,

pentru imagini este IMG, ş.a.m.d.

Folosind aceşti identificatori în cadrul unui <STYLE>...</STYLE>, putem face ca toate

elementele de acelaşi fel din cadrul unui document s arate la fel. Astfel suntem scutiţi de a scrie o

gr mad de cod care s-ar repeta în cazul fiec rui element de acelaşi fel.

De exemplu, dac dorim ca, în cadrul paginii noastre, absolut toate paragrafele s fie scrise

cu fontul Comic Sans MS, caractere de 14, culoare albastr , pe fond galben, în loc de a scrie aceşti

parametri la fiecare paragraf din document, este suficient s definim urm torul STYLE

(apl029.html):

<HTML><HEAD> <TITLE>Utilizare STYLE in HEAD</TITLE> <STYLE> P { background:yellow; color:blue; font-family:"Comic Sans MS"; font-size:14pt; } HR { text-align:left; width:50%; height:5px; color:red; } </STYLE> </HEAD> <BODY> <P>Iata un paragraf formatat asa cum am anuntat</P> <HR> Acesta este un text care nu se afla in paragraf <HR> <P>Acest text este din nou in cadrul unui paragraf</P> </BODY></HTML>

De remarcat faptul c ambele paragrafe, şi de asemenea ambele linii orizontale (HR) din

cadrul lui BODY nu conţin nici un fel de referinţ de formatare. Cu toate acestea, definirile lui P şi

ale lui HR în cadrul lui STYLE au „predefinit” modul în care vor ar ta toate paragrafele respectiv

toate liniile orizontale ale documentului.

Sintaxa definiţiei este de felul urm tor: Se începe cu identificatorul elementului dorit a fi

formatat (în cazul nostru P – tag-ul pentru paragraf, respectiv HR) între acolade trecându-se

specificatorii de format (aceştia ţin de limbajul CSS) doriţi a fi modificaţi. În cazul de faţ , avem

de-a face cu:

background = culoarea de fundal; color = culoarea scrisului;

font-familiy = numele font-ului; font-size = dimensiunea caracterelor;

text-align = alinierea în cadrul unui text; width = l ţimea;

height = în lţimea.

Page 41: HTML Php Mysql Pentru Incepatori-libre

43

O alt form de utilizarea a CSS-ului const în definirea stilurilor cu ajutorul unor

identificatori proprii, care se pot aplica ulterior unui anumit paragraf. În acest caz, în cadrul unui

style putem defini proprii identificatori, precedându-i de caracterul #. Aplicarea ulterioar a lor

asupra unui element, se face specificând un nou atribut, şi anume id=”identificator” unde

identificator este cel propriu, definit în cadrul lui STYLE (cel precedat de #)

Ex: dac inser m în codul de mai sus secvenţa urm toare (tot în cadrul lui STYLE, dup

definiţia lui HR, adic cea scris cu roşu închis):

#alt_paragraf { color:green; font-weight:bold; }

iar înainte de </BODY> mai inser m urm torul paragraf:

<P id="alt_paragraf">Acesta este un paragraf personalizat</P>

vom obţine urm torul rezultat:

Remarcaţi faptul c au fost aplicaţi doar cei doi specificatori de format definiţi în noul stil, şi

anume culoarea fontului şi faptul c scrisul este bold. Celelalte caracteristici (font-ul şi culoarea

galben de fundal) au r mas cele definite tot în STYLE, în cadrul lui P.

În loc de a defini stilurile în cadrul antetului (HEAD), aşa cum am ar tat mai sus, ele pot fi

scrise separat, într-un fişier text cu extensia .css, exact în aceeaşi manier în care le-am fi scris între

cele dou tag-uri prezentate, <STYLE>...</STYLE>.

Includerea efectiv a acestui fişier în cadrul HTML-ului se face tot în secţiunea <HEAD>,

prin intermediul urm torului tag:

<LINK rel="stylesheet" type="text/css" href="fisier_stil.css">

Page 42: HTML Php Mysql Pentru Incepatori-libre

44

Iat un exemplu:

1) Conţinutul fişierului css, pe care l-am numit apl30stil.css:

TABLE { border-width:2px; border-style:ridge; border-collapse:collapse; } TD { border-style:ridge; border-width:2px; padding:5px; } TH { border-style:ridge; border-width:2px; background:#7fffff; padding:5px; } TR { background:#ffff7f; } #TR1 { background:#00ff00; }

Dup cum se observ , am definit în cadrul s u formatele implicite pentru un tabel, rândurile

şi celulele sale (TABLE, TR, TD, TH) precum şi un identificator propriu, #TR1.

Iat şi fişierul HTML care va folosi acest .css (apl030.html):

<HTML> <HEAD> <TITLE>Utilizare css</TITLE> <LINK rel="stylesheet" type="text/css" href="apl30stil.css"> </HEAD> <BODY> <TABLE> <TR><TH>Numar<TH>Nume <TR><TD>1<TD>Ion <TR><TD>2<TD>Pop <TR><TD>3<TD>Top <TR id="TR1"><TD>4<TD>Ivan </TABLE> </BODY> </HTML>

Iat , în continuare, în partea stâng , cum arat HTML-ul, datorit includerii acestui fişier CSS, iar

în partea dreapt cum ar fi ar tat acelaşi HTML, f r a specifica nici un fel de format în CSS:

Page 43: HTML Php Mysql Pentru Incepatori-libre

45

2.4.2. JavaScript.

JavaScript este un limbaj de programare orientat pe obiecte. În ciuda numelui şi a unor

oarecare similarit ţi în sintax , între JavaScript şi Java nu exist nici o leg tur .

JavaScript are o sintax apropiat de cea a C-ului; din acest motiv un programator care

cunoaşte C poate cu uşurinţ s înveţe JavaScript.

Deşi acest limbaj are o plaj mai larg de extindere, cel mai des întâlnit este în scriptarea

paginilor web. Programatorii web pot îngloba în paginile HTML script-uri pentru diverse activit ţi,

cum ar fi verificare datelor introduse de utilizatori, sau crearea de meniuri ori de alte efecte animate.

Browser-ele reţin în memorie o reprezentare a paginii web sub forma unui arbore de obiecte,

punând aceste obiecte la dispoziţia JavaScript-ului, care le poate citi şi manipula. Acest arbore de

obiecte, de care ne vom ocupa în paragraful urm tor, poart numele de DOM (Document Object

Model).

Pentru moment, vom da câteva exemple comentate de script-uri JavaScript, care nu folosesc

DOM (pentru familiarizarea cu sintaxa), în cadrul unor documente HTML.

1) Calculul sumei cifrelor unui num r 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 găsi implicit scrisă în fereastra //de dialog. Evident, dacă nu dorim nici o valoare implicită, se foloseşte ş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>

A se remarca locul în care am pus script-ul (în cadrul paginii). În exemplele urm toare nu

vom mai da tot codul, ci doar secvenţa efectiv a script-ului.

Page 44: HTML Php Mysql Pentru Incepatori-libre

46

2) Sortarea unui şir de numere (apl032.html):

<SCRIPT language="JavaScript"> v_text=prompt("Introdu un sir de numere pe care le separi prin spatii:",""); x=v_text.split(" ");//functia split, aplicata lui v_text (cu parametrul " ") //va extrage substringurile din v_text care sunt separate de spatii si va crea //un sir de string-uri, pe care i-l atribuie variabilei x. Acestea vor fi //x[0], x[1], ... Numarul total de elemente din sirul x se obtine prin x.length n=x.length;//obtinem acest numar in variabila n for(i=0;i<n;i++) x[i]=parseInt(x[i]);//in acest fel transformam toate componentele sirului //x din string-uri in intregi. In C acest lucru nu ar fi fost posibil. //acum sortam sirul obtinut: for(i=0;i<n-1;i++) for(j=i+1;j<n;j++) if(x[i]>x[j]) { aux=x[i];x[i]=x[j];x[j]=aux;} //si afisam sirul final. Pentru asta, formam tot mesajul de afisat intr-un string s="Iata sirul final, sortat:\n"; for(i=0;i<n;i++) s=s+String(x[i])+" "; alert(s); </SCRIPT>

3) Descompunerea unui num r în factori primi (apl033.html):

<SCRIPT language="JavaScript"> v_text=prompt("Introdu nr. intreg pe care doresti sa-l descompui in factori primi:",""); s="Iata descompunerea in factori primi:\n"; //pregatim string-ul in care vom afisa rezultatul final, pentru ca la acest string //vom tot concatena noile date obtinute n=parseInt(v_text); f=2; while(n!=1) { p=0; while(n%f==0) { n=parseInt(n/f); p++; } if(p) s+="Factor="+String(f)+" putere="+String(p)+"\n"; //fiecare nou factor si putere obtinute le concatenam la stringul //care va fi in final afisat f++; } alert(s); </SCRIPT>

Page 45: HTML Php Mysql Pentru Incepatori-libre

47

2.4.3. DOM (Document Object Model).

DOM reprezint o interfaţ independent faţ de orice limbaj de programare şi platform ,

care permite programelor informatice şi script-urilor s aib acces sau s actualizeze conţinutul,

structura sau stilurile unui document. Documentul poate fi apoi prelucrat, iar rezultatele acestor

prelucr ri pot fi reincorporate în document atunci când acesta este prezentat.

Înainte de standardizarea DOM-ului, fiecare navigator dispunea de propriul s u model. Dac

limbajul de baz destinat manipul rii documentelor web a fost repede standardizat în jurul lui

JavaScript, nu acelaşi lucru se poate spune şi despre funcţiile specifice de utilizat şi maniera de a

parcurge documentul. Cele dou mari browser-e care s-au impus (Netscape Navigator şi Internet

Explorer) denumeau în moduri diferite o serie de componente. În practic , acest lucru obliga

programatorul s scrie cel puţin dou versiuni ale fiec rui script, dac dorea ca site-ul s u s fie

accesibil pentru cât mai mult lume.

Prima încercare de standardizare (DOM 1) a avut loc de-abia în 1998. Ultimul nivel de

standardizare (DOM 3) a avut loc în 2004.

Din punct de vedere dinamiz rii paginilor web, limbajul JavaScript reprezint doar o unealt

de lucru (aţi remarcat în paragraful anterior similitudinea dintre acesta şi limbajul C). Pentru ca

limbajul JavaScript s acţioneze asupra conţinutului paginii, ei bine, acest lucru îl face tocmai prin

intermediul DOM.

Prin intermediul DOM putem accesa orice obiect al paginii web şi îl putem face s se

comporte exact în felul în care dorim noi.

Ca şi în cazul program rii vizuale, DOM permite interceptarea anumitor evenimente (poziţia

mouse-ului, click-uri, etc.) şi tratarea lor diferenţiat .

Vom da în continuare, câteva exemple comentate, în care oper m cu JavaScript + DOM.

1) Schimbarea unei imagini atunci când trecem cu cursorul peste ea: Pentru aceasta aplicaţie

avem nevoie de doua fişiere imagine, care s fie, de preferabil, identice ca şi dimensiuni, şi obţinute

una dintr-alta printr-un procedeu de genul negativ sau trecere la alb-negru.

Iat fişierele imagine pe care am testat script-ul urm tor:

dog.jpg: dogneg.jpg (negativul)

Page 46: HTML Php Mysql Pentru Incepatori-libre

48

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>

2) Schimbarea culorii de fundal a unui tabel, culoare pe care o compunem cu ajutorul a 3

valori pentru componentele R, G, B (între 0 şi 255) pe care le scriem în nişte zone text. Cele 3

valori le vom valida (apl035.html):

<HTML><HEAD><TITLE>Exemplu de JavaScript</TITLE> <SCRIPT laguage="JavaScript"> function toHex(numar) {//aceasta functie converteste numarul parametru din zecimal //in hexazecimal. Ne bazam ca este cuprins intre 0 si 255 c1=parseInt(numar/16); c2=numar%16; //in c1 si c2 am obtinut cele 2 cifre hexazecimale if(c1>9) c1=String.fromCharCode(65+c1-10); //daca c1 este mai mare decit 9, o inlocuim cu litera corespunzatoare (A=10, B=11, ..., // F=15) adunind la codul ASCII al lui A (65) diferenta corespunzatoare. Conversia, in //JavaScript, de la codul ASCII la caracter se face prin //String.fromCharCode(codul ascii al caracterului) if(c2>9) c2=String.fromCharCode(65+c2-10); return String(c1)+String(c2); } function rgb(red,green,blue) {//aceasta functie genereaza constanta HTML de tip culoare plecind de la valorile lui //red, green, blue, numere cuprinse intre 0 shi 255.Ea se foloseste de functia de mai sus return "#"+toHex(red)+toHex(green)+toHex(blue); }

Page 47: HTML Php Mysql Pentru Incepatori-libre

49

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>

Page 48: HTML Php Mysql Pentru Incepatori-libre

50

3) În aplicaţia urm toare, prin intermediul unui control de tip input type=”text” vom

cere utilizatorului s introduc un num r x între 4 si 20. Pe baza acestui num r (pe care-l valid m)

vom genera, într-un element de tipul iframe, un tabel cu x linii şi x coloane, în care punem numerele

de la 1 la x2 şi ale c rui celule le color m alternativ, la fel ca pe o tabl de şah.

Pe lâng codul surs am pus şi o captur a ferestrei, in urma rul rii cu n=7 (apl036.html):

<HTML><HEAD><SCRIPT language="JavaScript"> function genereaza() { n=document.getElementById("nn"); nr=parseInt(n.value); if(nr!=n.value)//verificam daca in n este un numar intreg {alert('Numarul introdus nu este intreg');return;} else if(nr<4||nr>20)//verificam si daca este intre 4 si 20 {alert('Numarul trebuie sa fie intre 4 si 20'); return;} d=document.getElementById("ifr").contentWindow.document; //obtinem in variabila d referinta DOM catre documentul din iframe d.open();//deschidem acest document pentru rescriere d.write('<TABLE border="1" cellspacing="0" cellpadding="5">'); k=0;//si generam, prin script, in cadrul sau, codul HTML //care creeaza tabelul anuntat for(i=1;i<=nr;i++) { d.write('<TR>'); for(j=1;j<=nr;j++) { d.write('<TD align="center" '); if((i+j)%2)//in functie de paritatea lui i+j //coloram intr-un fel sau intr-altlul fundalul celulei d.write('bgcolor="#ffff7f">'); else d.write('bgcolor="#7fffff">'); ++k; d.write(String(k)); } } d.write('</TABLE>'); d.close(); } </SCRIPT></HEAD><BODY> Introdu un numar natural cuprins intre 4 si 20: <!--prin intermediul input type="text" scriem o valoare care este apoi preluata de JavaScript. Acesta are id-ul "nn" --> <INPUT type="text" id="nn" size="2" maxlength="2"> <BR><BR> <!--prin intermediul metodei "onclick()" a butonului apelam functia care generaza codul HTML al tabelului in documentul din iframe--> <BUTTON onclick="genereaza();">Genereaza tabelul</BUTTON> <BR><BR> <IFRAME id="ifr" width="70%" height="500"> </IFRAME><HR></BODY></HTML>

De reţinut din aceast ultim parte, c script-urile, deşi reprezint o automatizare şi

dinamizare foarte important a unei pagini web, nu sunt rulate pe server-ul HTML (de altfel, pân

în momentul de faţ am lucrat cu toate fişiere în mod local, ele fiind deschise automat de c tre

browser-ul de internet) ci ele sunt rulate de c tre browser pe calculatorul clientului care acceseaz

pagina ce le conţine.

Page 49: HTML Php Mysql Pentru Incepatori-libre

51

3. LIMBAJUL PHP – FACILIT I ALE ACESTUIA

3.1. Introducere – scurt istoric al apari iei limbajului PHP; mod de func ionare.

PHP este un limbaj de programare destinat în primul rând Internetului, aducând dinamic

unei pagini web. Este unul dintre cele mai importante limbaje de programare web open-source (este

gratuit şi, în plus, utilizatorii pot acţiona liber asupra procesului de dezvoltare) şi server-side (codul

surs nu se ruleaz pe calculatorul celui care vizualizeaz pagina, ci pe serverul web).

Numele s u este un acronim recursiv: „Php este un Hypertext Processor”. Limbajul a fost

început în 1994 ca o extensie a limbajului server-side Perl, şi apoi ca o serie de CGI-uri compilate,

de c tre Rasmus Lerdorf, pentru a genera un curriculum vitae şi pentru a urm ri num rul de

vizitatori ai unui site. A evoluat apoi în PHP/FI 2.0, dar proiectul open-source a început s ia

amploare dup ce Zeev Suraski şi Andi Gutmans au lansat o nou versiune a interpretorului PHP în

vara anului 1998, aceast versiune primind numele de PHP 3.0. Tot ei au schimbat numele în

acronimul recursiv amintit mai sus, pân atunci PHP-ul fiind cunoscut ca „Personal Home Page

tools”. În prezent este utilizat versiunea 6 a acestui limbaj.

Prin CGI (Common Gateway Interface) se înţelege o interfaţ a unui server de web, care

extinde funcţionalit ţile acestuia. CGI nu se refer la un anumit limbaj de programare, ci defineşte

un modul standardizat, prezent în cadrul unui server HTTP. Prin intermediul acestui modul se

stabilesc regulile prin care server-ul va pasa datele primite de la un utilizator c tre o aplicaţie scris

într-un anumit limbaj de programare, pentru ca apoi s întoarc rezultatele acestei aplicaţii înapoi la

utilizator.

Limbajul PHP, în marea majoritate a cazurilor, se foloseşte sub form de secvenţe de cod

inserate în cadrul unui document HTML. Din acest motiv, vom prefera termenul de „script PHP”

celui de program PHP. Structura unui script PHP este foarte asem n toare cu cea a unui cod scris în

limbajul C, mai ales în sensul în care structurile de programare au aceeaşi sintax şi aceeaşi

funcţionalitate.

Rolurile de baz ale unui script PHP constau în aceea c scipt-ul poate prelua date trimise de

c tre o pagin web de la un client (în general, datele pot fi trimise de c tre o pagin web prin

intermediul formularelor) şi de a executa o secvenţ de program în urma c reia va rezulta un cod

HTML, cod pe care clientul îl va primi sub forma unei pagini web. Clientul nu va avea acces la

codul efectiv al script-ului, ci, prin faptul c acesta se afl pe server şi se ruleaz tot pe acesta, va

primi direct HTML-ul generat de script.

Page 50: HTML Php Mysql Pentru Incepatori-libre

52

3.2. Cerin e tehnice pentru rularea limbajului PHP pe un sistem Windows. Detalii

asupra instal rii.

Dup cum am v zut în capitolul precedent, PHP nu este un limbaj de programare de

sine-st t tor (cum ar fi C++, spre exemplu) ci se foloseşte în simbioz în primul rând cu HTML, şi

deci pentru a rula, are nevoie neap rat de un server de web (http server).

Practic, pentru a face ca pe calculatorul nostru s poat rula fişiere php, avem nevoie s

instal m, pe lâng limbajul PHP, şi un server de web, şi de a face leg tura dintre cele dou .

Acest lucru se poate face separat, îns sunt necesare o serie de set ri foarte minuţioase şi

greoaie.

Din acest motiv, pentru testarea aplicaţiilor pe care le vom studia, vom folosi un pachet

gratuit, disponibil pe Internet, numit XAMPP. Acest pachet, foarte simplu de instalat, conţine mai

multe aplicaţii. Cele care ne vor interesa pe noi sunt serverul Apache (pentru http), un server de

MySQL, şi suport pentru limbajul PHP. Cerinţele tehnice pentru rularea în bune condiţii sunt

minimale: practic, pe orice calculator care este capabil s ruleze Windows 2000, XP sau Vista,

pachetul XAMPP va rula f r probleme.

Deşi instalarea sa poate fi f cut în mai multe feluri, cel mai la îndemân este s folosim o

versiune de tip „Installer” a sa.

Adresa de unde poate fi desc rcat pachetul gratuit este:

http://www.apachefriends.org/en/xampp-windows.html

1. Downloadaţi executabilul installer-ului: derulaţi pagina pân când daţi de secţiunea

„Download”, accesând primul link „Installer”, ca în figura de mai jos:

Page 51: HTML Php Mysql Pentru Incepatori-libre

53

La momentul scrierii lucr rii de faţ , ultima versiune public a XAMPP-ului este 1.6.7.

Fişierul executabil al installer-ului acestei versiuni este xampp-win32-1.6.7-installer.exe

2. Lansaţi în execuţie installer-ul. Vom alege instalarea în limba englez . L s m nemodificat

directorul propus pentru instalare (c:\xampp). În fereastra urm toare vom bifa toate cele 3 c suţe

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 sfârşitul instal rii, server-ul de web este deja funcţional, având inclus atât suport php cât şi

baza de date MySQL. Prin intermediului panoului de control XAMPP putem vedea care este starea

curent a server-elor instalate, şi le putem de asemenea gestiona.

4. Pentru a testa efectiv funcţionalitatea server-ului web, deschidem un browser de internet, scriind

la adres : http://localhost.

Dac instalarea a fost f cut cu succes, ne apare o pagin din care suntem invitaţi s alegem

limba de operare, dup care suntem duşi în pagina „HOME” a instal rii f cute.

Directorul r d cin al documentelor web este c:\xampp\htdocs.

În vederea test rii aplicaţiilor PHP pe care le vom studia în continuare, vom crea în acest

director un alt subdirector phpapps.

Dup ce l-am creat, putem testa existenţa sa deschizând browser-ul de internet în care

scriem adresa: http://localhost/phpapps

În browser trebuie s ne apar un director gol.

În mod implicit, toate fişierele şi subdirectoarele pe care le punem în acesta vor fi vizibile

prin intermediul server-ului de http. Numele index.htm, index.html respectiv index.php

sunt rezervate: dac denumim vreun fişier în acest mod, la intrarea în directorul care îl conţine, în

loc de a ne ar ta ceea ce se g seşte în acest director, serverul web ne va ar ta direct pagina conţinut

de fişierul respectiv.

3.3. Testarea instal rii. Structura unui fişier PHP.

Spre deosebire de fişierele .html care o dat create pe discul local cu un editor de texte pot

fi deschise imediat tot local, direct în browser-ul de Internet, pentru a rula codul PHP este absolut

necesar ca fişierele s fie puse în directorul în care rezid documentele serverului web, iar

Page 52: HTML Php Mysql Pentru Incepatori-libre

54

vizualizarea lor s fie f cut prin intermediul acestuia. În mod implicit, un fişier care conţine un

script PHP trebuie s fie salvat cu extensia .php.

S cre m primul nostru script PHP. Vom descrie operaţiile necesare acestui lucru,

bazându-ne pe instalarea pachetului XAMPP descris în capitolul anterior. Astfel, toate scripturile

pe care le vom crea le vom pune în directorul c:\xampp\htdocs\phpapps .

Cu ajutorul unui editor de texte (de exemplu Notepad, Notepad++) creaţi urm torul fişier, pe

care îl salvaţi în directorul de mai sus sub numele apl037.php (codul de mai jos este preluat aşa

cum apare vizualizat în editorul Notepad++. Numele fişierelor aplicaţiilor continu num r toarea

din capitolul precedent):

Observaţi structura absolut identic celei a unui fişier HTML. Noutatea este adus de

scriptul PHP, care este inserat între tag-urile colorate în roşu: „<?php” şi „?>”.

Instrucţiunea „echo” cuprins între acestea este o instrucţiune specific limbajului PHP, ea

având rolul de a scrie în pagina web textul ce urmeaz dup , cel cuprins între ghilimele.

S vizualiz m acum pagina rezultat în urma acestui fişier. Pentru aceasta, deschideţi

browser-ul de Internet, scriind urm toarea adres : http://localhost/phpapps.

Dac XAMPP a fost corect instalat, veţi obţine urm toarea pagin :

Page 53: HTML Php Mysql Pentru Incepatori-libre

55

În pagin v este ar tat conţinutul directorului în care am creat fişierul apl037.php, aşa

cum este vizualizat prin intermediul serverului de web.

În aceast pagin faceţi un click pe fişierul apl037.php, pentru a-l vizualiza prin

intermediul serverului web. Dac totul este în regul , conţinutul afişat în browser trebuie s fie

urm torul:

Remarcaţi c , ceea ce vedem este rezultatul instrucţiunii echo din PHP. Dac se obţine

altceva, înseamn c instalarea nu s-a f cut în mod corect.

Mai mult, s analiz m codul surs generat. Pentru aceasta, în browser, executaţi comanda de

vizualizare a sursei (în cazul lui Internet Explorer, alegeţi din meniul View opţiunea Source). Va

trebui s obţineţi urm torul cod surs :

<HTML><HEAD> <TITLE>Primul HTML continind script PHP</TITLE> </HEAD> <BODY> <H2>Acesta este un titlu H2 scris normal, in afara scriptului</H2> Acest text este scris de catre script-ul PHP</BODY> </HTML>

Aşa cum am anunţat, codul PHP, ba chiar însuşi faptul c în aceast pagin ar exista vreun

script, nu sunt vizibile clientului, ci acesta vede doar rezultatul obţinut în urma rul rii.

S mai scriem înc un exemplu, înainte de a trece la detalierea limbajului de programare

PHP. În acelaşi director (c:\xampp\htdocs\phpapps) creaţi fişierul apl038.php, cu urm torul

conţinut:

Remarcaţi similitudinea dintre limbajul PHP şi C, în cazul instrucţiunilor din cadrul

scriptului: în afara faptului c variabila, care în C ar fi fost i, aici este $i, instrucţiunea for are

Page 54: HTML Php Mysql Pentru Incepatori-libre

56

aceeaşi sintax . Sintaxa lui echo este uşor de asimilat, prin analogie cu cout<< (entit ţile de afişat,

în loc s mai fie separate de << sunt separate de virgule). Remarcaţi, de asemenea, c la fiecare

afişare echo din cadrul repetitivei for, este afişat tag-ul <br>, pentru ca, în pagina vizualizat ,

dup fiecare linie s se treac la rând nou.

Iat rezultatul pe care trebuie s -l obţinem în browser:

Din nou, vizualizând codul primit de c tre browser, vom obţine urm torul HTML:

Remarcaţi din nou c , ceea ce ajunge la client este doar rezultatul execuţiei script-ului PHP.

Observaţi c , deşi tag-ul <BR> produce în browser trecerea la rând nou, în cadrul vizualiz rii sursei

obţinute, codul este dezordonat, deoarece este scris „una-ntr-una”, f r Enter-uri.

Acest lucru, în mod normal, nu deranjeaz , atâta timp cât aspectul paginii vizualizate în

browser are acelaşi aspect.

Totuşi, o aliniere este binevenit în cazul depan rii unui script, pentru c se poate urm ri

mai uşor apariţia unei eventuale erori sau neconcordanţe.

Pentru acest lucru, în cadrul unui echo putem folosi, la afişare, oricâte treceri la rând nou

dorim. Acestea se fac, la fel ca şi în C, prin caracterul special ”\n”. Dup cum ştim din capitolul

precedent, Enter-urile în cadrul unui text din codul HTML nu au efect, deci afişarea de ”\n”-uri o

folosim în special pentru structurarea ordonat a acestuia.

Page 55: HTML Php Mysql Pentru Incepatori-libre

57

În cazul aplicaţiei de faţ (apl038.php) s modific m linia a 8-a a sa (afişarea cu echo)

schimbând-o în urm toarea:

Aspectul s u în browser r mâne absolut nemodificat. Totuşi, vizualizând codul surs , vom

remarca alinierea acestuia:

De reţinut deci, din exemplele prezentate, c :

• un fişier ce conţine script-uri PHP se salveaz de regul cu exensia .php, fiind localizat în

directorul în care rezid documentele serverului web;

• orice script PHP este cuprins între tag-urile <?php şi ?>;

• instrucţiunea PHP care produce output în pagina HTML este echo;

• rularea unei pagini care conţine script PHP se va face întotdeauna prin intermediul

serverului de web;

• la fel ca şi în C, separatorul dintre instrucţiunile unui script .php este caracterul ”;”.

O ultim observaţie care trebuie f cut este aceea c , în mod implicit (deci f r a modifica

set rile de instalare) limbajul PHP, spre deosebire de C, nu este case-sensitive (deci nu face

diferenţa între literele mari şi cele mici) în ceea ce priveşte cuvintele rezervate ale limbajului

(instrucţiunile) respectiv funcţiile (fie c e vorba de cele predefinite ale limbajului, fie c e vorba de

cele definite de c tre utilizator). În schimb, este case-sensitive în ceea ce priveşte numele de

variabile. Astfel, fie c scriem for fie FOR, limbajul va recunoaşte instrucţiunea repetitiv cu

contor. În schimb, dac folosim identificatorii $a respectiv $A, va fi vorba de dou variabile

distincte.

Page 56: HTML Php Mysql Pentru Incepatori-libre

58

3.4. Constante. Variabile. Operatori. Afişarea datelor.

Constante

Constantele recunoscute de limbajul PHP sunt asem n toare cu cele ale limbajului C:

• constante numerice întregi şi reale: 14, -80, 3.14, -8.25, 1e+2, 314e-2, etc.

• constante de tip caracter şi şir de caractere: ”a”, ”\n”, ”Ana are mere”, ’Cici’,

’Mimi’, etc. Spre deosebire de C, în PHP nu se mai face diferenţa între un singur caracter şi un

întreg şir de caractere din punct de vedere al constantelor. Separatorii pot fi atât ghilimelele cât şi

apostrofurile, rolul lor funcţional fiind puţin diferit – vom vedea acest lucru mai încolo. Caracterele

speciale sunt aceleaşi ca şi în C: \n, \\, \’, \” şi altele.

• constante de tip bool: false şi true. Spre deosebire de C, rezultatul oric rei expresii

relaţionale sau logice este de acest tip special de date. Totuşi, în cazul instrucţiunilor care necesit

expresii relaţionale sau logice, se p streaz convenţia din C, şi anume c orice valoare diferit de 0

este echivalent cu true, iar orice valoare egal cu 0 este echivalent cu false.

Definirea constantelor de c tre utilizator, în sensul c prin anumiţi identificatori putem

folosi valori constante, se face cu ajutorul funcţiei define.

Forma general a acesteia este:

define(”nume constanta”, valoare);

Exemplu de script (apl039.php):

<?php define("pi",314e-2);//aici am definit o constanta numerica reala define("greeting","Buna ziua!");//iar aici o constanta de tip sir de caractere echo greeting,"<br>";//aici afisam constanta sir de caractere echo "Constanta pi, aproximata cu 2 zecimale este ",pi;//iar aici pe cea numerica ?>

Variabile

În PHP identificatorii rezervaţi variabilelor încep cu caracterul ”$”. În continuare, respect

aceleaşi specificaţii din C, deci imediat dup caracterul $ trebuie s fie o liter sau liniuţa 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

c tre limbaj) atunci când sunt folosite. Mai mult, îşi pot schimba tipul în funcţie de valoarea pe care

o reţin.

Page 57: HTML Php Mysql Pentru Incepatori-libre

59

Exemplu de script (apl040.php):

<?php $a=4+5.5;//La fel ca si in C, mai intii se evalueaza expresia din dreapta. //Rezultatul 9.5 este real. In urma atribuirii este creata variabila $a, de tip real echo "Valoarea din variabila a este: ",$a,"<BR>\n"; $b="Ana are mere";//Se creeaza variabila $b, de tip string $a=$b;//Modificam variabila $a, dindu-i continutul lui $b. Acesta fiind de tip //string, se modifica si tipul variabilei $a, de la real la string. //Acest lucru n-ar fi fost posibil in C echo "Noua valoare din variabila a este: <B><FONT color=\"red\">",$a; echo "\n</FONT></B>";//in plus, am mai imbogatit afisarea, folosind tag-urile //pentru scris bold si cel pentru caractere de culoare rosie ?>

Analizaţi leg tura dintre codul surs de mai sus şi alinierea fişierului obţinut în browser

(deci afiş rile de \n din cadrul instrucţiunilor echo) :

Valoarea din variabila a este: 9.5<BR> Noua valoare din variabila a este: <B><FONT color="red">Ana are mere </FONT></B>

Remarcaţi de asemenea şi faptul c valoarea atributului color (şi anume red) a trebuit a fi

scris între ghilimele. Textul din cadrul echo-ului în care am afişat acest atribut, fiind deja în

interiorul unor ghilimele, a trebuit s folosim caracterul special \” pentru a face aceast afişare

posibil . Dac am fi folosit, pur şi simplu, ghilimele obişnuite, instrucţiunea echo ar fi considerat

c în acel loc se încheie stringul, iar din acest caz n-ar mai fi putut interpreta caracterele urm toare,

ceea ce s-ar fi terminat cu producerea unei erori.

În PHP este posibil şi adresarea indirect . Acest lucru înseamn c , dac o variabil conţine

o expresie de tip string în care este reţinut numele unei variabile, putem afişa direct valoarea

variabilei reţinut de string. Pentru aceasta se va folosi înc o dat caracterul $ (de forma $$x).

Exemplu de script (apl041.php):

<?php $a=5; $x="a"; echo "Iata stringul din variabila x: ",$x,"<BR>\n"; echo "Iata valoarea variabilei din stringul x: ",$$x; ?>

Operatori

Mulţi dintre operatorii limbajului PHP sunt cunoscuţi din C++. Acesta este motivul pentru

care vom prezenta doar anumite particularit ţi specifice limbajului PHP.

Page 58: HTML Php Mysql Pentru Incepatori-libre

60

Pentru început, îi prezent m, în ordine descresc toare a priorit ţilor lor:

1. ! , ++ , -- , (int) , (double) , (string) ;

2. * , % , / ;

3. < , <= , > , >= ;

4. == , != , === , !== ;

5. & ;

6. ^ ;

7. && ;

8. ?: ;

9. = , += , -= , /= , *= , %= , &= , |= , ^= ;

10. And ;

11. Xor ;

12. Or ;

13. , ;

În PHP se pot folosi operatori de conversie explicit , cunoscuţi din C++. Ca şi în C++, ei se

aplic prefixat. Astfel, exist : (int) – conversie c tre o valoare întreag , (string) – conversie

c tre şir, iar (double) – conversie c tre real.

Exemplu de script (apl042.php):

<?php $a=(int)8.65;//la fel ca si in C, se vor elimina zecimalele echo "variabila a are valoarea: ",$a,"<BR>"; $b=(double)"3.85copac";//conversia se va face atita cit se poate, deci variabila //b va contine valoarea 3.85, restul de caractere vor fi ignorate echo "variabila b are valoarea: ",$b,"<BR>"; $c="1.25mere"+"3.75pere";//ba mai mult, se va face conversia explicita, adica //limbajul va converti mai intii cele doua stringuri la numere, apoi va face adunarea echo "variabila c are valoarea: ",$c,"<BR>"; $d=19/5;//spre deosebire de C, operatorul C face impartire reala, chiar daca //operatorii sai sunt intregi echo "variabila d are valoarea: ",$d,"<BR>"; //daca dorim impartire intreaga, facem conversia la int: $e=(int)(19/5); echo "variabila e are valoarea: ",$e,"<BR>"; ?>

Exemplu de script (apl043.php):

<?php echo "<TT>"; //operatorul == functioneaza ca si in C. Limbajul PHP fiind ceva mai larg in ceea ce //priveste tipurile de date, verifica doar egalitatea ca valoare. //vom folosi functia var_dump(variabila), care ne afiseaza tipul unei variabile //si valoarea sa. Facem acest lucru, deoarece rezultatele unor comparatii in PHP //au o valoare de tipul bool (true sau false) ce nu poate fi afisata in mod direct $a=("3"==3);//vom obtine true, deoarece in urma conversiei, cele 2 valori sunt egale echo 'Iata rezultatul comparatiei "3"==3 : ';//remarcati cum, de aceasta data, pentru //ca stringul pe care dorim sa-l afisam contine ghilimele, l-am delimitat prin //apostrofuri var_dump($a);echo "<BR>";

Page 59: HTML Php Mysql Pentru Incepatori-libre

61

$b=("3"==3.90);//vom obtine false echo 'Iata rezultatul comparatiei "3"==3.90 : '; var_dump($b);echo "<BR>"; $b=("3.90"==3.90);//vom obtine true echo 'Iata rezultatul comparatiei "3.90"==3.90 : '; var_dump($b);echo "<BR>"; ?>

Exemplu de script (apl044.php):

<?php echo "<TT>"; //operatorul === reprezinta o noutate fata de C. Acest operator verifica egalitatea //atit ca valoare cit ca si tip. Evident, operatorul !== reprezinta negatia sa. $a=("3"==3);//acesta este true, pentru ca valorile sunt egale echo 'Iata rezultatul comparatiei "3"==3 : '; var_dump($a);echo "<BR>"; $b=("3"===3);//acesta este false, pentru ca, desi valorile sunt egale, tipurile nu sunt echo 'Iata rezultatul comparatiei "3"===3 : '; var_dump($b);echo "<BR>"; $c=(1+2===3);//aceasta este true, pentru ca expresiile sunt de acelasi tip echo 'Iata rezultatul comparatiei 1+2===3 : '; var_dump($c);echo "<BR>"; $d=(3.0===3);//aceasta este false, pentru ca tipurile nu sunt egale echo 'Iata rezultatul comparatiei 3.0===3 : '; var_dump($d);echo "<BR>"; ?>

Exemplu de script (apl045.php):

<?php //Operatorul =, de atribuire, functioneaza la fel ca si in C. //Este asadar permisa si atribuirea multipla: $a=$b=$c=5.23; echo "Iata variabilele a, b si c, initializate toate cu aceeasi valoare: "; echo $a,", ",$b,", ",$c; ?>

Afişarea datelor

Dup cum am v zut deja, una dintre cele mai folosite instrucţiuni de afişare în PHP este

echo. Are dou forme:

a) data afişat se scrie între paranteze rotunde (aceast form nu poate fi folosit pentru

afişarea mai multor date): echo(”Ana are mere”);

b) datele afişate sunt scrise dup echo, f r a fi grupate între paranteze şi separate prin

virgule: echo ”Ana are ”, 1+2, ”mere”;

O alt instrucţiune de afişare este print. Dup ea urmeaz o singur dat , care poate fi sau

nu pus între paranteze. Funcţioneaz ca şi echo, în plus, în cazul în care folosim forma cu

paranteze, va întoarce valoarea true dac afişarea a fost f cut cu succes, respectiv false în caz

contrar.

Alte dou instrucţiuni folosite în special pentru cazurile în care dorim s depan m un

program sunt:

Page 60: HTML Php Mysql Pentru Incepatori-libre

62

• var_dump(expresie) – afişeaz tipul expresiei urmat de valoarea sa;

• print_r(variabila) – în cazul unor variabile compuse (şiruri, obiecte) produce o

afişare a tuturor componentelor ale acestora.

Observa ii:

Dup cum am v zut deja prin exemplele date, în loc de ghilimele, se pot folosi şi

apostrofuri. Diferenţa este dat de faptul c , în cazul folosirii ghilimelelor, dac şirul de caractere

conţine numele unor variabile, acestea vor fi evaluate, deci se va afişa conţinutul lor, pe când în

cazul apostrofurilor se va afişa numele variabilei ca atare.

Nu putem folosi ghilimele incluse în cadrul altei perechi de ghilimele, şi nici apostrofuri

incluse între alte perechi de apostrofuri, în schimb, putem include ghilimele într-un şir delimitat de

apostrofuri sau apostrofuri într-un şir delimitat de ghilimele.

Exemplu de script (apl046.php):

<?php $a=3;$b=4; echo "Ana are $a mere si $b mere<BR>";//aici se vor evalua atit $a cit si $b echo 'Ana are $a mere si $b mere<BR>';//pe cind aici nu ?>

3.5. Instruc iuni ale limbajului PHP.

Instrucţiunile PHP sunt asem n toare cu cele din C. Din acest motiv, ne vom limita la o

scurt prezentare a lor şi la câteva exemple de utilizare.

3.5.1. Instrucţiunea expresie.

La fel ca şi în C++ se foloseşte în special pentru calcule şi atribuiri.

Exemplu: $x=$x*10+3;

3.5.2. Instrucţiunea bloc (se mai numeşte şi compusă).

Are aceeaşi sintax şi funcţionalitate ca în C, şi anume de a grupa mai multe instrucţiuni,

astfel încât acestea s joace rolul sintactic al uneia singure.

Instrucţiunile se scriu între paranteze acolade:

{ ... ... }

Page 61: HTML Php Mysql Pentru Incepatori-libre

63

3.5.3. Instrucţiunea if.

Are aceeaşi form şi funcţionalitate ca şi în C:

if(expresie) instrucţiune1; [else instrucţiune2;]

Deci, dac expresia este evaluat ca fiind adev rat (sau diferit de 0) se execut

instrucţiune1. Dac este fals (sau 0) iar ramura else este prezent , se va executa

instrucţiune2. La fel ca şi în C, dac în loc de o singur instrucţiune sunt mai multe, se vor

grupa într-un bloc.

Exemplu de script (apl047.php) care conţine un if:

<?php //urmatorul script ia ca si parametru de intrare variabila a definita mai jos. //Pentru ca inca nu am prezentat cum se face preluarea de date de catre PHP, ne //vom limita sa modificam manual variabila $a de mai jos. //Program formeaza alte doua variabile $b si $c, cu primele doua respectiv //ultimele doua cifre ale lui $a, daca acesta are exact 4 cifre, sau scrie un //mesaj corespunzator in caz contrar $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; if($a>=1000&&$a<=9999)//deci verificam sa aiba exact 4 cifre {//in caz afirmativ se executa instructiunile din acest bloc $b=(int)($a/100); $c=$a%100; echo "Primele doua cifre ale sale sunt : ",$b,"<BR>"; echo "Ultimele doua cifre ale sale sunt : ",$c,"<BR>"; } else //iar in caz contrar afisam un mesaj corespunzator echo "Valoarea din variabila a NU are exact 4 cifre!<BR>"; ?>

3.5.4. Instrucţiunea while.

Are aceeaşi form şi funcţionalitate ca şi în C:

while(expresie) instrucţiune; Principiul de executare este urm torul:

Pasul P1: Se evalueaz expresia;

Pasul P2: Dac aceasta este adev rat (sau diferit de 0) se execut instrucţiunea subordonat , dup

care se revine la Pasul P1. În caz contrar se termin execuţia repetitivei while, trecându-se la

instrucţiunea urm toare în codul surs .

Exemplu de script (apl048.php) care conţine while:

<?php //Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa //fiecare afisind caracterul #: $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; while($a)//deci cit timp valoarea din $a este nenula { $r=$a%10;//determinam ultima sa cifra in variabila $r $a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci //"stergem" ultima sa cifra echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un # } ?>

Page 62: HTML Php Mysql Pentru Incepatori-libre

64

3.5.5. Instrucţiunea do...while.

Are aceeaşi form şi funcţionalitate ca şi în C:

do instrucţiune; while(expresie);

Principiul de executare este urm torul:

Pasul P1: Se execut instrucţiunea subordonat (cea de dup do);

Pasul P2: Se evalueaz expresia. În cazul în care valoarea evaluat este false (sau 0), executarea

instrucţiunii do...while se termin . În cazul în care este adev rat (sau nenul ) se reia executarea

pasului P1.

Exemplu de script (apl049.php) care conţine do...while:

<?php //Programul afiseaza cifrele numarului intreg din variabila a, in ordine inversa, dupa //fiecare afisind caracterul #: $a=1425; echo 'Valoarea din variabila $a este : ',$a,"<BR>"; do { $r=$a%10;//determinam ultima sa cifra in variabila $r $a=(int)($a/10);//inlocuim $a cu citul impartirii sale la 10, deci //"stergem" ultima sa cifra echo $r,"# ";//afisam cifra curenta, obtinuta in variabila $r, urmata de un # }while($a);//deci repetam ciclarea cit timp valoarea din $a este nenula ?>

3.5.6. Instrucţiunea for.

Are aceeaşi form şi funcţionalitate ca şi în C:

for(expresieiniţializare;expresiecontinuare;expresieincrementare) instrucţiune; Principiul de executare este uşor de înţeles, datorit faptului c for-ul se poate transcrie în

mod perfect echivalent prin urm toarea secvenţ de program:

expresieiniţializare; while(expresiecontinuare) { instrucţiune; expresieincrementare; }

Deşi for-ul este, în limbajul C, deci şi în PHP, o instrucţiune mult mai general decât în alte

limbaje, totuşi, cel mai utilizat scop al s u este de a atribui unui contor, rând pe rând, valori (de

regul întregi) cuprinse între dou limite.

Exemplu de script (apl050.php) care conţine 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>"; ?>

Page 63: HTML Php Mysql Pentru Incepatori-libre

65

3.6. Transmiterea datelor prin intermediul formularelor.

În capitolul 2 am amintit de formulare şi de rolul pe care acestea îl joac în dinamizarea

paginilor web.

Formularele reprezint un mecanism prin care se pot trimite date c tre serverul HTML.

Aceste date pot fi preluate de c tre script-urile PHP şi în continuare folosite în cadrul programelor.

S nu uit m c formularele sunt elemente HTML. Fie urm torul unui formular, pe care îl cre m în

fişierul apl051.html :

<form action="apl052.php" method="post"> Introdu o valoare numerica: <input type="text" name="a" maxlength="4"> <br><br> <input type="submit" value="Calculeaza patratul sau"> </form>

Atributul action al tag-ului form se refer la numele fişierului PHP care se va ocupa de

prelucrarea datelor iar atributul method de metoda prin care sunt trimise datele c tre server.

Tag-ul <input type=”text”...> creeaz un câmp de date de tip text. Atributul name al

acestuia specific un identificator prin care PHP-ul va prelua valoarea din acesta.

Tag-ul <input type=”submit”...> creeaz un buton de trimitere a datelor. Practic,

ap sarea pe acest buton permite trimiterea conţinutului întregului formular c tre server.

Preluarea datelor trimise c tre server prin intermediul metodei POST, în cadrul unui script

PHP se face prin intermediul vectorului predefinit $_POST[’nume_câmp_din_formular’].

Atenţie la faptul c $_POST trebuie scris cu majuscule !.

De exemplu, în cazul nostru, putem recupera aceast valoare prin intermediul lui

$_POST[’a’].

Analog, dac datele ar fi trimise c tre server prin intermediul metodei GET (deci în mod

vizibil, în cererea URL, de exemplu http://mypage.html?a=13), în cadrul script-ului PHP

asociat, preluarea lor se face prin intermediul vectorului predefinit

$_GET[’nume_câmp_formular].

În cazul în care un anumit câmp nu exist , în momentul cererii $_POST[...] din cadrul

PHP-ului, acesta s-ar putea sa genereze un mesaj de tip atenţionare (warning) în funcţie de set ri.

Pentru a evita acest lucru, în faţa caracterului $ (de la $_POST[...]) punem caracterul @.

Semnificaţia acestuia este de a ignora mesajele de tip warning.

Page 64: HTML Php Mysql Pentru Incepatori-libre

66

Iat şi codul lui apl052.php, scriptul PHP pe care l-am anunţat în atributul action al

formularului apl051.html, script care va trebui s se afle în acelaşi director cu apl051.html.

Scriptul preia valoarea câmpului text din form şi afişeaz atât valoarea recuperat cât şi p tratul s u:

<?php $a=$_POST['a'];//deci, in variabila $a preluam valoarea din cimpul cu //atributul name="a" al form-ului care a trimis datele. echo "Iata valoarea preluata din formular: ",$a,"<br><br>"; echo "Patratul sau este ",$a*$a; ?>

Vom studia, în continuare, modul în care se preiau datele din toate tipurile de elemente care

pot s apar într-un formular obişnuit:

- în cazul unui input de tip text, am v zut deja cum se face acest lucru. În exact acelaşi

mod se preiau datele dintr-un input de tip password, de tip hidden sau de tip textarea.

- în cazul unui input de tip submit, valoarea (care este de fapt textul scris pe buton) se

poate prelua doar în cazul în care, în cadrul tagului <input type=”submit”...> apare şi

atributul name. Evident, în cazul în care formularul are un singur control de tip submit, e destul de

ilogic sa dorim sa vedem ce valoare are.

Totuşi, în cazul în care un formular are dou sau mai multe butoane de tip sumbit, c rora

vrem s le asign m funcţii diferite, este foarte important s ştim care dintre ele a fost ap sat.

Iat mai jos un astfel de exemplu:

apl053.html + apl054.php – primul fişier conţine un formular cu dou câmpuri text, în care

introducem valori numerice. În funcţie de controlul submit pe care-l ap s m, al doilea fişier va

prelua datele şi va calcula fie produsul fie suma celor dou valori numerice:

apl053.html:

<form action="apl054.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza suma" name="operatia"> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <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

Page 65: HTML Php Mysql Pentru Incepatori-libre

67

if($op=="Calculeaza suma") echo "Suma celor doua este ",$a+$b; else echo "Produsul celor doua este ",$a*$b; ?>

- în cazul unui control de tip radio, s ne amintim mai întâi c toate tag-urile de tipul

<input type=”radio”...> trebuie s aib la atributul name acelaşi nume, iar la atributul

value valori diferite, prin care vom identifica opţiunea aleas . Aceast valoare va fi trimis c tre

PHP.

Iat un exemplu de utilizare al controlul de tip radio: apl055.html + apl056.php. Cu aceast

ocazie vom folosi şi instrucţiunea switch a limbajului PHP, instrucţiune pe care nu am prezentat-o,

îns care are exact aceeaşi sintax şi funcţionalitate ca în C.

apl055.html:

<form action="apl056.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2"> Alege operatia pe care doresti<br> sa o faci cu cele doua:<br> <input type="radio" value="1" name="op" checked>Suma<br> <input type="radio" value="2" name="op">Diferenta<br> <input type="radio" value="3" name="op">Produsul<br> <input type="radio" value="4" name="op">Citul <tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza"> </table> </form>

apl056.php: <?php $op=$_POST['op'];//controlul cu numele 'op' este grupul de butoane radio. //preluam valoarea sa in variabila $op, pentru a vedea care optiuni a fost aleasa $a=$_POST['cta'];//preluam si cele doua valori numerice $b=$_POST['ctb'];//din cimpurile text cu numele cta si ctb //le afisam: echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>"; //in functie de valoarea lui "op" calculam suma sau produsul switch($op) { case 1: echo "Suma celor doua este ",$a+$b; break; case 2: echo "Diferenta celor doua este ",$a-$b; break; case 3: echo "Produsul celor doua este ",$a*$b; break; default: echo "citul celor doua este ",$a/$b; } ?>

Page 66: HTML Php Mysql Pentru Incepatori-libre

68

- în cazul unui control de tip checkbox, s ne reamintim c fiecare control de acest tip are

un nume separat. Dac este bifat, va trimite c tre PHP valoarea indicat în atributul value a

tag-ului <input type=”checkbox”...> (ca şir de caractere). Dac acest atribut nu este prezent,

valoarea trimis c tre PHP va fi şirul de caractere „on”.

În schimb, dac nu este bifat, pur şi simplu nu va trimite nimic, deci s-ar putea ca cererea

$_POST[...] sa genereze un warning (depinde şi de set rile PHP-ului). Pentru ca acest lucru s nu

se întâmple, indiferent de set ri, aşa cum am anunţat mai înainte, folosim caracterul @ în faţa cererii

$_POST[...].

Iat mai jos un exemplu: apl057.html + apl058.php

apl057.html: <form action="apl058.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td>Alege, dintre cele de mai jos,<br> limbile straine pe care le cunosti: <tr><td> <input type="checkbox" name="en">Engleza<br> <input type="checkbox" name="fr">Franceza<br> <input type="checkbox" name="ge">Germana<br> <input type="checkbox" name="it">Italiana<br> <input type="checkbox" name="es">Spaniola<br> <tr><td align="center"> <input type="submit" value="Trimite date"> </table> </form>

apl058.php: <?php $en=@$_POST['en']; $fr=@$_POST['fr']; $ge=@$_POST['ge']; $it=@$_POST['it']; $es=@$_POST['es']; $l=0;//$l este un flag pe care-l facem 1 cind dam de o limba straina bifata echo "Iata limbile straine pe care le-ai bifat:<br>"; if($en=="on") {echo "Engleza<br>";$l=1;} if($fr=="on") {echo "Franceza<br>";$l=1;} if($ge=="on") {echo "Germana<br>";$l=1;} if($it=="on") {echo "Italiana<br>";$l=1;} if($es=="on") {echo "Spaniola<br>";$l=1;} if($l==0)//daca flag-ul a ramas 0, dam utilizatorului //un mesaj prin carae il informam ca nu a bifat nimic echo "Nu ai bifat nici una dintre limbile straine!"; ?>

- în cazul unui control de tip select simplu, PHP-ul va putea recupera valoarea cu ajutorul

numelui stabilit în atributul name al tag-ului <select ...>, valoarea trimis fiind cea stabilit în

atributul value al tag-urilor option înglobate în cadrul select-ului.

Iat mai jos un exemplu (apl059.html + apl060.php) care reia ideea din apl055.html

cu deosebirea c , în loc de a alege operaţia dorit prin intermediul unui control radio, o alegem cu

ajutorul controlului select. A se remarca faptul c fişierul care prelucreaz datele (apl060.php)

a r mas identic cu cel care prelucra datele din apl055.html.

Page 67: HTML Php Mysql Pentru Incepatori-libre

69

apl059.html: <form action="apl060.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td align="right">Introdu o valoare numerica: <td align="center"> <input type="text" name="cta" maxlength="4" size="4"> <tr><td align="right">Introdu o alta valoare numerica: <td align="center"> <input type="text" name="ctb" maxlength="4" size="4"> <tr><td colspan="2">Alege operatia pe care doresti<br> sa o faci cu cele doua: <select name="op"> <option value="1">Suma <option value="2">Diferenta <option value="3">Produsul <option value="4">Citul </select><tr><td colspan="2" align="center"> <input type="submit" value="Calculeaza"></table></form>

apl060.php: <?php $op=$_POST['op'];//controlul cu numele 'op' este cel de tip option $a=@$_POST['cta']; $b=@$_POST['ctb']; echo "S-au preluat valorile urmatoare: a=$a si b=$b<br>"; switch($op) { case 1: echo "Suma celor doua este ",$a+$b; break; case 2: echo "Diferenta celor doua este ",$a-$b; break; case 3: echo "Produsul celor doua este ",$a*$b; break; default: echo "citul celor doua este ",$a/$b; } ?>

- în cazul unui control de tip select multiplu, form-ul va trimite c tre PHP un şir în care

vom reg si valorile selectate. Este obligatoriu, totuşi, ca atributul name din cadrul tag-ului

<select multiple ...> s specifice faptul c se va trimite un şir. Acest lucru se face punând

un set de paranteze p trate dup numele câmpului, deci de forma name=”nume_sir[]”.

Preluarea în PHP se face în mod normal, prin @variabila=@$_POST[’nume_sir’]

(remarcaţi faptul c nu se mai pun []).

Acest şir va conţine pe post de elemente valorile stabilite prin atributul value ale opţiunilor

selectate. Şirul va începe de la indicele 0, num rul s u total de elemente fiind dat de funcţia

count(nume_şir).

Iat un exemplu care exploateaz o list de tipul <select multiple...> (apl061.html

+ apl062.php)

Page 68: HTML Php Mysql Pentru Incepatori-libre

70

apl061.html:

<form action="apl062.php" method="post"> <table border="1" cellspacing="0" cellpadding="5"> <tr><td>Alege, dintre cele de mai jos,<br> limbile straine pe care le cunosti.<br> Poti selecta, evident, mai multe<br> daca tii apasata tasta Control in<br> timpul selectarii <tr><td> <select name="lang[]" multiple size="5"> <option value="en">Engleza <option value="fr">Franceza <option value="ge">Germana <option value="it">Italiana <option value="sp">Spaniola </select> <tr><td align="center"> <input type="submit" value="Trimite date"> </table> </form>

apl062.php:

<?php $lang=$_POST['lang'];//recuperam sirul trimis de catre form prin cimpul lang $nl=count($lang);//apelam functia count pentru a vedea cite elemente are sirul if($nl==0) echo "Nu ai selectat nici o limba straina<br>"; else { echo "Ai selectat $nl limbi straine. Acestea sunt:<br>"; for($i=0;$i<$nl;$i++)//parcurgem sirul pe un for, de la 0 la $nl-1 switch($lang[$i])//si vedem ce valoare are fiecare element, in functie de { //care afisam: case "en":echo "Engleza<br>";break; case "fr":echo "Franceza<br>";break; case "ge":echo "Germana<br>";break; case "it":echo "Italiana<br>";break; default:echo "Spaniola<br>"; } } ?>

- una dintre facilit ţile transmiterii datelor prin intermediul formularelor const în

posibilitatea trimiterii rezultatului mai multor controale sub forma elementelor unui şir sau chiar

matrice. În acest caz, atributul name al controlului din form trebuie s specifice acel element din şir

(sau matrice) care va primi valoarea sa, deci s fie de forma: name="nume_şir[indice]"

respectiv name="nume_matrice[indice_linie][indice_coloană]". Iat un exemplu în

care cre m un form cu 4 controale de tip input type="text", ale c ror valori vor fi preluate de c tre

un şir cu 4 elemente (apl063.html + apl064.php):

apl063.html: <form action="apl064.php" method="post"> Introdu 4 valori numerice intregi:<br><br> prima valoare: <input type="text" name="a[1]"><br><br> valoarea a 2-a:<input type="text" name="a[2]"><br><br> valoarea a 3-a:<input type="text" name="a[3]"><br><br> valoarea a 4-a:<input type="text" name="a[4]"><br><br> <br> <input type="submit" value="Trimite valorile spre prelucrare"> </form>

Page 69: HTML Php Mysql Pentru Incepatori-libre

71

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; ?>

3.7. Func ii în PHP.

În PHP se pot scrie funcţii într-un mod foarte similar faţ de ceea ce ştim din C/C++. S

consider m exemplul urm tor, în care se utilizeaz o funcţie care calculeaz şi întoarce suma unui

num r întreg pe care îl primeşte ca parametru:

apl065.php:

<?php function suma_c($n)//antetul funcţiei: se remarcă folosirea cuvântului cheie //„function” fără a se specifica vreun tip (nici măcar void) { $s=0; while($n) { $s+=$n%10; $n=(int)($n/10);//ne reamintim că în PHP operatorul / calculează //câtul real (deci cu zecimale): din acest motiv folosim conversia //explicită către int } return $s;//la fel ca şi în C++, rezultatul întors de funcţie se specifică //prin intermediul instrucţiunii return } echo suma_c(13254); ?>

Aşadar:

• Pentru a întoarce un rezultat din corpul unei funcţii, se foloseşte, aşa cum suntem deja

obişnuiţi, instrucţiunea return. Forma sa general este: return expresie.

• În cazul unei funcţii care nu întoarce rezultat (deci echivalentul unei funcţii de tip void

din C++), cuvântul cheie function r mâne obligatoriu (f r a specifica nimic suplimentar) putând

s apar oriunde în cadrul funcţiei cuvântul cheie return f r a mai fi urmat de vreo expresie,

având ca efect ieşirea imediat din funcţie. El poate fi, de asemenea, omis, ieşirea din funcţie

producându-se în acest caz în mod natural (dup executarea întregului s u cod).

• Transmiterea parametrilor se poate face atât prin valoare cât şi prin referinţ , în acelaşi

mod în care se face şi în C++ :

1) Parametrii specificaţi în mod direct (folosind doar numele variabilei) sunt cei transmişi prin

valoare. Chiar dac valoarea unui astfel de parametru este schimbat în cadrul funcţiei, ea r mâne

Page 70: HTML Php Mysql Pentru Incepatori-libre

72

totuşi neschimbat dup executarea acesteia. Atunci când apel m funcţia, pe poziţiile acestor

parametri se pot transmite atât valori cât şi conţinutul unor variabile.

Script-ul urm tor afişeaz valoarea variabilei de dinainte de apelul funcţiei (10) chiar dac

în funcţie s-a încercat modificarea valorii transmise (apl066.php):

<?php function test($x) { $x=$x*2; } $a=10; test($a); echo $a; ?>

2) Parametrii pe care dorim s -i transmitem prin referinţ , trebuie precedaţi de caracterul &

(ampersand) în antetul funcţiei. Dac valoarea unui astfel de parametru este modificat în cadrul

funcţiei, ea r mâne modificat şi dup executarea acesteia. Evident, atunci când apel m funcţia, pe

poziţiile acestor parametrii e obligatoriu s specific m variabile.

Relu m scriptul anterior, punând un & (ampersand) în faţa parametrului $x. În acest fel,

valoarea variabilei dup ce apel m funcţia nu va mai fi cea anterioar (10) ci cea obţinut în urma

modific rii (20) – apl067.php:

<?php function test(&$x) { $x=$x*2; } $a=10; test($a); echo $a; ?>

• În funcţie de domeniul de vizibilitate, şi în PHP variabilele se clasific în variabile locale

şi variabile globale. Cele globale sunt cele definite în afara oric rei funcţii. Implicit, ele nu pot fi

adresate din corpul vreunei funcţii. Totuşi, exist o posibilitate de a face acest lucru: în cadrul

funcţiei în care vrem s utiliz m variabile globale, le specific m pe toate, precedate de cuvântul

cheie global. Puteţi observa acest mecanism în exemplu urm tor:

apl068.php:

<?php function suma() { global $a,$b,$c; //functia se bazeaza pe cele 3 variabile globale $a, $b si $c //calculând în $c suma dintre $a si $b //daca nu am fi pus instructiunea “global”, exemplul nu ar fi functionat deoarece //cele 3 variabile nu ar fi fost recunoscute in functie. $c=$a+$b; } $a=5;$b=6; suma(); echo $c; ?>

Page 71: HTML Php Mysql Pentru Incepatori-libre

73

• Variabilele locale sunt variabilele create în corpul unei funcţii sau cele create prin

transmiterea parametrilor formali (din antetul funcţiilor). Ele nu sunt recunoscute în afara funcţiilor.

Şi în PHP funcţiile pot fi recursive.

• Pentru a nu înc rca foarte mult un anumit script, putem îngloba toate definiţiile complete

ale funcţiilor într-un singur fişier de tip text (preferabil cu extensia .php, pentru a nu putea fi

vizualizat accidental prin intermediul server-ului http). Mecanismul includerii este unul asem n tor

cu cel din C/C++ (clauza #include...) cu deosebirea c , putem include codul surs al funcţiilor

în orice loc dorim. Acest lucru se face cu ajutorul funcţiei predefinite PHP:

require(”nume_fisier”); .

Codul surs al funcţiilor trebuie inclus şi el între tag-urile <?php .. ?>.

În exemplul de mai jos, vom crea dou fişiere: apl069.php, ce conţine definiţia corect a

unei funcţii care verific dac un num r este prim, şi un altul apl070.php, ce afişeaz toate numerele

prime dintre 1 şi n, folosind funcţia din apl069.php:

apl069.php:

<?php //a se remarca folosirea tag-urilor specifice includerii unei secvenţe PHP function is_prime($x) {//$x este un parametru prin valoare for($i=2;$i<=sqrt($x);$i++)//variabila $i este locală if($x%$i==0) return 0; if($x<=1) return 0; return 1; } ?>

apl070.php:

<?php require("apl069.php");//prin această funcţie includem codul existent în apl069.php for($i=2;$i<=100;$i++) if(is_prime($i)) echo $i,"&nbsp;&nbsp;&nbsp;"; //o dovadă a comportamentului local al variabilei $i din cadrul funcţiei constă în faptul //că şi în codul principal (mai sus) folosim tot o variabilă $i, iar cele două nu se //încurcă între ele ?>

• Limbajul PHP este înzestrat cu biblioteci care conţin numeroase alte funcţii. Iat câteva

dintre funcţiile matematice predefinite:

- abs(num r) – întoarce modulul num rului (valoarea absolut );

- sin(x), cos(x), tan(x) – sinusul, cosinusul şi tangenta unui unghi. Argumentul x trebuie specificat în radiani; - exp(x) – întoarce ex ;

- pow(x, y) – întoarce xy ;

- log10(x), log(x) – întorc log10(x), respectiv ln(x);

- max(x1, x2, ... , xn) – întoarce maximul (cel mai mare) dintre argumentele sale numerice;

Page 72: HTML Php Mysql Pentru Incepatori-libre

74

- min(x1, x2, ... , xn) – întoarce minimul (cel mai mic) dintre argumentele sale numerice;

- ceil(x) – întoarce cel mai mic nr. întreg care este mai mare sau egal cu x;

- floor(x) – întoarce cel mai mic nr. întreg mai mare sau egal cu x (partea întreag d.p.d.v.

matematic);

- rand(min,max) – întoarce o valoare întreag aleatoare cuprins între valorile întregi min şi max

(inclusiv);

- pi() – întoarce o aproximaţie a num rului π;

- sqrt(x) – calculeaz radicalul (r d cina p trat ) a lui x.

3.8. Prelucrarea şirurilor de caractere.

Spre deosebire de C/C++, unde şirurile de caractere sunt privite ca pointeri, în PHP şirurile

de caractere sunt privite mai degrab ca nişte variabile de sine st t toare.

În PHP sunt permise atribuirile directe (prin operatorul =) între dou şiruri de caractere.

Din punct de vedere structural, în PHP şirurile de caractere nu mai respect regulile din

C/C++ (şi în special, NU mai este valabil marca sfârşitului de string prin caracterul de cod ASCII

0), în schimb, limbajul ne pune la dispoziţie o serie de funcţii care fac foarte simpl prelucrarea şi

manipularea stringurilor.

În rest, şirurile se memoreaz ca o succesiune de caractere ASCII. Putem adresa fiecare

caracter al şirului prin indicele s u, la fel ca în C/C++, începând de la 0.

• Funcţia strlen(şir) ne întoarce lungimea şirului (num rul s u de caractere).

Dac dorim s parcurgem şirul de caractere, putem s -l parcurgem, ca în C++, de la 0 la

strlen(...)-1.

apl071.php: Afiş m caracterele unui string, într-un tabel cu o singur linie: <?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). Observaţi

în exemplu de mai jos cum se face acest lucru, şi de asemenea faptul c , în timpul concaten rii,

valoarea numeric a fost convertit implicit c tre şir de caractere:

$x=9; $s="Ana "."are ".$x." mere"; echo $s;//valoarea finală a stringului este "Ana are 9 mere"

Page 73: HTML Php Mysql Pentru Incepatori-libre

75

• Funcţia strpos(sir1, sir2, [poz_start]) caut dac sir2 este subşir al lui sir1

(eventual începând de la poziţia poz_start, dac aceasta este specificat ). În caz afirmativ,

întoarce poziţia de început a acestuia, altfel întoarce false. În exemplul de mai jos se va afişa

valoarea 3 (pentru c la indicele 3 este g sit secvenţa ”pu” în stringul dat):

$s="computer"; echo strpos($s,"pu");

Funcţia se utilizeaz şi pentru a testa dac un şir include sau nu un anumit subşir. Dac

subşirul este g sit, funcţia întoarce poziţia de început a acestuia iar dac nu, întoarce false. Dup

cum ştim, valoarea lui false este, de fapt, 0. Pentru a diferenţia cazurile în care subşirul nu apare

deloc în şir sau apare chiar de la poziţia 0, folosim operatorul ===, care rezolv corect problema:

$s="ana are mere"; $gasit=strpos($s,"a"); if($gasit===false) echo "Negasit"; else echo "Gasit la indicele ",$gasit;

Valoarea întoars de funcţie este reţinut de variabila $gasit. Pentru a face distincţie între

false şi 0, folosim operatorul ===, care testeaz coincidenţa atât ca valoare, cât şi ca tip. De altfel,

acesta este şi rostul unui astfel de operator. Acest procedeu se poate folosi şi pentru alte funcţii.

• Funcţia strstr(sir1, sir2) returneaz din sir1 secvenţa de caractere din poziţia în

care a fost g sit prima apariţie a lui sir2, dac sir2 este subşir pentru sir1 sau false, în caz

contrar.

• Funcţia strcmp(sir1, sir2) compar lexicografic (alfabetic) sir1 cu sir2. Valoarea

întoars este:

- pozitiv , dac sir1 se g seşte lexicografic dup sir2; (sir1>sir2)

- nul (0), dac sir1 este identic egal cu sir2; (sir1==sir2)

- negativ , dac sir2 se g seşte lexicografic înainte de sir1. (sir1<sir2)

În PHP se pot folosi deopotriv şi pentru stringuri operatorii relaţionali: <, <=, >, >=, ==,

!=, care le compar direct, în sens lexicografic, având ca rezultat true sau false.

Observaţie: Comparaţia face distincţie între literele mari şi cele mici (codul ASCII) !

• Funcţia substr(sir, indice, [lungime]) întoarce subşirul şirului şir, care începe

în poziţia indice şi are lungimea lungime. Dac parametru lungime este absent, se întoarce şirul

care începe în poziţia indice şi ţine pân la sfârşitul şirului şir.

Exemplu: apl072.php

<?php $s="televiziune"; $s1=substr($s,1,4); echo $s1,'<br>';//afiseaza "elev"; $s2=substr($s,4); echo $s2;//afiseaza "viziune"; ?>

Page 74: HTML Php Mysql Pentru Incepatori-libre

76

• Funcţia substr_replace(sir1, sir2, ind, [lung]) întoarce şirul rezultat prin

înlocuirea în sir1, a subşirului care începe în poziţia ind şi are lungimea lung, cu sir2. Dac

parametrul lung este absent, sir2 înlocuieşte subşirul care începe cu ind şi ţine pân la sfârşitul

şirului şir1, cu şir2.

Exemplu: apl073.php

<?php $s="Ana are mere"; echo substr_replace($s,"poseda",4,3); //înlocuieşte subşirul ”are” (care începe la //indicele 4 şi are 3 litere) cu subşirul ”poseda”, deci afişează ”Ana poseda mere” ?>

• Funcţia strtoupper(sir) întoarce şirul rezultat prin conversia doar a acelor caractere

sunt litere mici, la litere mari, iar funcţia strtolower(sir) întoarce şirul rezultat prin conversia

literelor mari la litere mici.

• Funcţia strtok(...) este utilizat pentru extrage substringuri ale unui string, care în

acesta sunt delimitate de nişte caractere ce aparţin unui şir cu delimitatori, dat. De exemplu, dac

avem stringul ”Ana? Nu, doar tu.” şi consider m stringul cu separatori: ”.? #,” (este şi un caracter

spaţiu printre ele) se vor separa şi obţine substringurile ”Ana”, ”Nu”, ”doar”, ”tu”.

Modelul de aplicare:

- iniţial se apeleaz funcţia strtok(string, şir_cu_separatori). Funcţia va

întoarce fie primul cuvânt obţinut prin separare, fie false dac acest lucru nu a fost posibil.

- apoi se apeleaz funcţia strtok(şir_cu_separatori). Aceasta va tot extrage

câte un cuvânt nou obţinut prin separare, fie false dac s-a ajuns deja la sfârşit, deci dac au fost

separate toate cuvintele.

Este recomandat ca testarea valorii false întoars de funcţie s fie testat cu operatorul

=== deoarece, în caz contrar este posibil s apar erori din cauza conversiilor (de exemplu, funcţia

s întoarc 0, iar acesta s fie interpretat ca şi false).

De remarcat, spre deosebire de limbajul C++, c funcţia strtok NU distruge stringul asupra

c reia este aplicat , ci îl las intact, exact ca înainte de separare.

Exemplu: apl074.php

<?php $s="Ana? Nu, doar tu."; //varianta 1: pe un while: $p=strtok($s,"?,.# "); echo "Stringul initial este:",$s,'<br>Cuvintele sale sunt:<br><br>'; while($p!==false) { echo "cuvintul <b>",$p,"</b> are ",strlen($p),' litere<br>'; $p=strtok("?.#, "); } //varianta 2: pe un for "mascat": echo '<br>Iata acelasi string, separat in acelasi mod, folosind o repetitiva'; echo ' de tip for:<br>'; for($p=strtok($s,"?.,# ");$p!==false;$p=strtok("., ?#")) echo "Cuvintul curent <b>",$p,"</b> are ",strlen($p)," litere<br>"; ?>

Page 75: HTML Php Mysql Pentru Incepatori-libre

77

3.9. Şiruri (masive) în PHP.

În PHP exist mult mai puţine constrângeri decât în C/C++ atunci când lucr m cu şiruri sau

cu matrice. În primul rând, în PHP un şir nu se declar . În momentul în care dorim s cre m un şir

(sau o matrice), pur şi simplu atribuim valori elementelor:

apl075.php: <?php for($i=1;$i<=5;$i++) $x[$i]=$i; for($i=1;$i<=5;$i++) echo $x[$i]," "; ?>

sau apl076.php: <?php $k=1; for($i=1;$i<=5;$i++) for($j=1;$j<=5;$j++) $a[$i][$j]=$k++; for($i=1;$i<=5;$i++) { for($j=1;$j<=5;$j++) echo $a[$i][$j],' '; echo '<br>'; } ?> Dac unui element aflat la un anumit indice nu i-am atribuit nici o valoare, în orice evaluare,

acel element are valoarea NULL. Nu este obligatoriu s folosim indici consecutivi.

Ba mai mult, în PHP şirurile pot primi pe post de indici chiar şi şiruri de caractere. Acest fel

de tablou se numeşte tablou asociativ. De exemplu, putem crea un şir în care s reţinem pe

post de indici denumirile unor produse, iar pe post de indici preţurile acestora:

apl077.php: <?php $x['Piine']=1.61; $x['Vin']=5.99; $x['Alune']=2.21; $x['Ciocolata']=2.69; echo $x['Piine'],' ',$x['Vin'],' ',$x['Alune'],' ',$x['Ciocolata']; ?>

Evident, parcurgerea unui astfel de şir (variabila de ciclare printre indici nu mai respect o

regul clasic , numeric ) nu se mai face dup regulile clasice, ci exist o instrucţiune special de

ciclare ce permite parcurgerea vectorului în ordinea în care elementele au fost create, cu

determinarea, pentru fiecare element, a perechii indice, valoare:

foreach(vector as indice=>valoare) instrucţiune;

• Funcţia count(vector) întoarce num rul total de elemente (folosite, deci c rora le-am

atribuit valori) ale vectorului.

Page 76: HTML Php Mysql Pentru Incepatori-libre

78

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; ?>

Dac în cadrul instrucţiunii foreach omitem partea cu ”indice=>” (deci l s m

instrucţiunea în forma foreach(vector as valoare) ..., se vor parcurge doar valorile

vectorului, indicii fiind omişi.

Exist şi alte funcţii care faciliteaz accesul la elementele vectorului. Acestea se bazeaz pe

urm toarea particularitate a implement rii unui vector în PHP: fiecare vector are asociat un pointer

intern, pointer care se afl pe un anumit element al şirului (numit element curent):

• current(vector); - întoarce valoarea reţinut de elementul curent al vectorului;

• key(vector); - întoarce indicele elementului curent al vectorului;

Ambele funcţii (current şi key), dac pointerul a trecut de vreunul din capete, sau dac

şirul este vid, întorc valoarea false. Din cauz c valoarea 0 sau ”” pot fi valori valide pentru şir,

pentru a testa dac funcţia a întors valoarea false, trebuie utilizat operatorul ===

• next(vector); - deplaseaz pointerul pe elementul urm tor al vectorului;

• prev(vector); - deplaseaz pointerul pe elementul anterior al vectorului;

• reset(vector); - deplaseaz pointerul pe primul element al vectorului;

• end(vector); - deplaseaz pointerul pe ultimul element al vectorului;

Exemplu: apl079.php (care realizeaz exact acelaşi lucru ca şi aplicaţia precedent )

<?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; while(($valoare=current($x))!==false) { echo key($x)," in valoare de ",$valoare,"<br>"; next($x); $s=$s+$valoare; } echo "<hr>Valoarea totala:",$s; ?>

Page 77: HTML Php Mysql Pentru Incepatori-libre

79

Piine => 1.61 Alune => 2.21 Ciocolata => 2.69Vin => 5.99

Vin => 5.99 Ciocolata => 2.69Alune => 2.21 Piine => 1.61

Alune => 2.21 Ciocolata => 2.69Piine => 1.61 Vin => 5.99

Vin => 5.99 Piine => 1.61 Ciocolata => 2.69Alune => 2.21

Şirul $x în urma unui sort($x): 0 => 1.61 1 => 2.21 2 => 2.69 3 => 5.99

Exist de asemenea o serie de funcţii cu ajutorul c rora putem sorta elementele unui vector.

Le vom exemplifica pe şirul din exemplul de mai sus ($x['Piine']=1.61; $x['Vin']=5.99;

$x['Alune']=2.21; $x['Ciocolata']=2.69;) în ideea c , dup ce am aplicat funcţia specific de

sortare, afiş m şirul nou cu ajutorul urm toarei secvenţe:

foreach($x as $i=>$v) echo $i," => ",$v,"<br>";

• asort(vector) : sorteaz cresc tor vectorul dup valorile

reţinute de fiecare element. Indicii se vor interschimba, evident, în mod

corespunz tor;

• arsort(vector) : sorteaz descresc tor vectorul dup

valorile reţinute de fiecare element. Indicii se vor interschimba, evident,

în mod corespunz tor;

• ksort(vector) : sorteaz cresc tor vectorul dup valorile

reţinute de indici. Valorile se vor interschimba, evident, în mod

corespunz tor;

• krsort(vector) : sorteaz cresc tor vectorul dup valorile

reţinute de indici. Valorile se vor interschimba, evident, în mod

corespunz tor;

• sort(vector) şi rsort(vector) sorteaz cresc tor, respectiv

descresc tor, valorile elementelor vectorului. Valorile indicilor se pierd,

înlocuindu-se cu indici numerici având valori cuprinse între 0 şi

nr.elemente-1.

Page 78: HTML Php Mysql Pentru Incepatori-libre

80

3.10. Programare grafic utilizând PHP.

Una dintre cele mai spectaculoase componente ale multor limbaje de programare, din p cate

l sat de multe ori în umbr în majoritatea cursurilor de programare, const în crearea şi

manipularea imaginilor.

Limbajul PHP nu este limitat doar la crearea de output HTML, ci poate fi folosit şi pentru a

crea respectiv a lucra cu diferite formate de imagini, incluzând gif, png, jpg. Ba mai mult, PHP

poate genera o imagine sub forma unui flux de date (deci f r a o înregistra efectiv sub forma unui

fişier pe server) direct c tre browser.

Pentru a face funcţional suportul grafic al limbajului, este necesar utilizarea bibliotecii gd2.

În cazul pachetului XAMPP, aceasta este instalat şi activat în mod implicit. În cazul altor

distribuţii, acest lucru trebuie f cut manual.

Pentru început, s vedem cum se poate crea în mod dinamic o imagine: vom crea un script

PHP, a c rui deschidere, în browser, va avea ca efect vizualizarea imaginii create de c tre acest

script. Veţi remarca faptul c , o serie de elemente (imaginile, textul, culorile) au nevoie de nişte

variabile numite „variabile resurs ”.

Din p cate, spre deosebire de o serie de alte limbaje de programare, nu exist constante

predefinite pentru culori, ci acestea trebuie s fie create manual, specificând pentru fiecare

componentele de roşu, verde şi albastru, întocmai ca la HTML, cu deosebirea faptului c , de aceast

dat , cele trei componente de culoare se specific în baza 10, deci printr-un num r de la 0 la 255.

Script-ul conţine comentariile necesare înţelegerii codului s u. Dup prezentarea sa vom

relua detaliat fiecare dintre funcţiile folosite.

apl080.php

<?php header("Content-type: image/png"); /*aceasta instructiune va atasa fluxului de date creat, care la utilizator va ajunge sub forma de fisier, informatii asupra faptului ca este vorba de un fisier imagine, si anume de tip png. Aceasta informatie este esentiala pentru browser pentru a deschide fisierul ca si pe o imagine. Puteti incerca ce se intimpla daca omiteti apelul acestei functii: browser-ul va primi datele sub forma de text, deci va afisa o serie de caractere aparent fara nici un sens*/ $imagine=imagecreatetruecolor(400,250); /* aceasta instructiune creeaza o resursa de tip imagine, pe 32 de biti (truecolor) ce va putea fi identificata in continuare prin variabila $imagine. Imaginea va avea latimea de 400 de pixeli, si inaltimea de 250. */ $galben=imagecolorallocate($imagine,255,255,0); /* prin aceasta instructiune am definit culoarea galben */ imagefilledrectangle($imagine,0,0,399,249,$galben); /* iar prin aceasta instructiune am desenat un dreptunghi plin, de culoare galbena, ce se intinde peste toata imaginea: (0,0) respectiv (399,249) sunt doua colturi diaginale ale dreptunghiului. Practic am "umplut" toata imaginea cu un fundal galben */

Page 79: HTML Php Mysql Pentru Incepatori-libre

81

$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 rezultatul obţinut prin înc rcarea sa în browser:

Iat câteva dintre cele mai importante funcţii care lucreaz cu imagini:

• header(string) - are ca efect trimiterea unui header HTTP. În cazul nostru, al lucrului

cu imagini, ne intereseaz s trimitem browser-ului informaţii despre mime-type-ul imaginii

create. Astfel, valorile pe care le putem da string-ului, în funcţie de tipul imaginii pe care o cre m,

pot fi:

“Content-type: image/png” – pentru imaginile de tip png

“Content-type: image/jpeg” – pentru imaginile de tip jpg

“Content-type: image/gif” – pentru imaginile de tip gif

Este foarte important (în caz contrar se vor genera erori) ca aceast funcţie s fie apelat

înainte de trimiterea oric rui alt output din cadrul script-ului în care apare;

• imagecreatetruecolor(lăţime, înălţime)- creeaz o resurs de tip imagine, pe

32 de biţi (truecolor) având l ţimea, respectiv în lţimea specificat . Rezultatul întors de aceast

funcţie trebuie obligatoriu atribuit unei variabile, prin intermediul c reia vom accesa în continuare

imaginea.

Imaginea este de fapt o matrice de pixeli. Orice punct din imagine se va putea referi prin

coordonatele sale carteziene (x, y). Originea sistemului de coordonate se g seşte în coţul stânga-sus

al imaginii (0,0) iar axa Oy este îndreptat în jos. Valorile posibile pentru x şi y sunt numere

întregi, cuprinse în intervalul 0..lăţime-1, respectiv 0..înălţime-1

Page 80: HTML Php Mysql Pentru Incepatori-libre

82

De exemplu, iat o reprezentare schematic a imaginii definite prin:

$imagine=imagecreatetruecolor(400,300);

Am pus în evidenţ în cadrul imaginii de mai sus punctele de coordonate (200,150)

respectiv (300,75).

• imagecolorallocate(resursă_imagine, roşu, verde, albastru)- creeaz o

resurs de tip culoare, asociat imaginii specificat prin resursa din primul parametru. Rezultatul

întors de aceast funcţie trebuie atribuit unei variabile, prin intermediul c reia vom accesa în

continuare culoarea definit ;

• imagesetthickness(res_imag, thickness) - stabileşte grosimea liniilor la

thickness pixeli, atunci când se deseneaz linii, dreptunghiuri, poligoane;

• imageline(resursă_imagine,x0,y0,x1,y1,resursă_culoare) - deseneaz un

segment de dreapt , de culoarea specificat de resursă_culoare, în imaginea specificat de

resursă_imagine, între punctele de coordonate (x0,y0) şi (x1,y1);

• imagedashedline(resursă_imagine,x0,y0,x1,y1,resursă_culoare)

- la fel ca imageline, doar c segmentul de dreapt desenat este punctat. Pentru ca

segmentul punctat s fie vizibil, trebuie ca imagesetthickness s seteze grosimea liniei la cel

puţin 2 pixeli;

• imageellipse(resursă_imagine,x0,y0,diam_x,diam_y,resursă_culoare)

- deseneaz o elips cu axe paralele cu axele de coordonate, având centrul în punctul

de coordonate (x0,y0) şi diametrul orizontal dat de diam_x respectiv cel vertical dat de diam_y;

• imagerectangle(res_imag,x0,y0,x1,y1,res_culoare) – deseneaz un

dreptunghi având colţurile diagonal opuse în punctele de coordonate (x0,y0) respectiv (x1,y1), cu

culoarea dat de resursa res_culoare;

x

y

O(0,0) 399

299

(200,150)

x0 = 200 x1= 300

y0 = 150

(300,75) y1 = 75

Page 81: HTML Php Mysql Pentru Incepatori-libre

83

• imagefilledrectangle(res_imag,x0,y0,x1,y1,res_culoare) – deseneaz un

dreptunghi plin, cu colţurile diagonal opuse în punctele de coordonate (x0,y0) respectiv (x1,y1),

de culoarea dat de resursa res_culoare;

• imagefilledellipse(res_imag,x0,y0,diam_x,diam_y,res_culoare)

- la fel ca imageellipse, doar c elipsa desenat este plin , având culoarea dat de

res_culoare;

• imagechar(res_imag,font,x0,y0,caracter,res_culoare) – afişeaz în imagine

caracterul caracter, începând de la coordonatele (x0,y0) în dreapta şi în jos, având culoarea dat

de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice resurs de

tip font înc rcat prin imageloadfont();

• imagestring(res_imag,font,x0,y0,caracter,res_culoare) – afişeaz în

imagine string-ul string, începând de la coordonatele (x0,y0) în dreapta şi în jos, având culoarea

dat de res_culoare. font poate fi unul dintre font-urile predefinite 1, 2, 3, 4, 5, sau orice

resurs de tip font înc rcat prin imageloadfont();

Exemplu: apl081.php <?php header("Content-type: image/png"); $imagine=imagecreatetruecolor(250,150); $red=imagecolorallocate($imagine,255,0,0); $green=imagecolorallocate($imagine,0,196,0); $blue=imagecolorallocate($imagine,0,0,255); $magenta=imagecolorallocate($imagine,255,0,255); $orange=imagecolorallocate($imagine,255,128,0); $yellow=imagecolorallocate($imagine,255,255,196); imagefilledrectangle($imagine,0,0,249,149,$yellow); //afisam 5 stringuri, pentru a testa cum arata fiecare dintre cele //5 font-uri predefinite ale PHP-ului: imagestring($imagine,1,10,10,'Text scris cu font-ul 1',$red); imagestring($imagine,2,10,40,'Text scris cu font-ul 2',$green); imagestring($imagine,3,10,70,'Text scris cu font-ul 3',$blue); imagestring($imagine,4,10,100,'Text scris cu font-ul 4',$magenta); imagestring($imagine,5,10,130,'Text scris cu font-ul 5',$orange); imagepng($imagine);imagedestroy($imagine); ?>

Rezultatul afişat în browser arata în felul urm tor:

• imagefill(res_imag,x0,y0,res_culoare) – umple prin algoritmul ”flood

fill”, pornind din punctul dat (x0,y0), schimbând culoarea acestuia şi a tuturor punctelor

conectate (din aproape în aproape) care au aceeaşi culoare cu cea existent iniţial la (x0,y0), în

noua culoare dat de res_culoare;

Page 82: HTML Php Mysql Pentru Incepatori-libre

84

• imagefilltoborder(res_imag,x0,y0,culoare_border, res_culoare)

– umple prin algoritmul ”flood fill”, pornind din punctul dat (x0,y0),

schimbând culoarea tuturor punctelor conectate (indiferent ce culoare au) în noua culoare dat de

res_culoare, pân la întâlnirea culorii specificate prin parametrul culoare_border;

• imagecopy(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc,width,height)

– copiaz din imag_sursa, porţiunea rectangular care are colţul stânga sus la

coordonatele (xsrc,ysrc) şi lungimea, respectiv în lţimea, date de (width,height)în

imag_dest, începând de la coordonatele (xdest,ydest) în dreapta respectiv în jos;

• imagecopyresized(imag_dest,imag_sursa,xdest,ydest,xsrc,ysrc, widthdest,heightdest,widthsrc,heightsrc)

– copiaz din imag_sursa, porţiunea rectangular care are colţul stânga-sus la

coordonatele (xsrc,ysrc) şi lungimea, respectiv în lţimea, date de (widthsrc,heightsrc) în

imag_dest, începând de la coordonatele (xdest,ydest), redimensionând astfel încât noua l ţime

respectiv în lţime s fie (widthdest,heightdest);

• imagerotate(res_imag,unghi,culoare_fundal) – roteşte imaginea din

res_imag cu unghiul unghi (specificat în grade !). Centrul rotaţiei este centrul imaginii, iar

imaginea rotit este redimensionat la scar , astfel încât întreaga imagine rotit s încap : marginile

nu sunt decupate. Porţiunile r mase neacoperite în urma rotaţiei, se vor colora cu

culoare_fundal;

• imagesx(res_imag) – întoarce l ţimea imaginii (width);

• imagesy(res_imag) – întoarce în lţimea imaginii (height);

• imagecreatefromgif(’nume_fişier’) – creeaz şi întoarce o resurs de tip

imagine, în care este înc rcat imaginea de tip GIF din fişierul specificat de ’nume-fişier’;

• imagecreatefrompng(’nume_fişier’)respectiv

imagecreatefromjpeg(’nume_fişier’) funcţioneaz analog, pentru imagini de tip

PNG respectiv JPG;

• imagegif(res_imagine), imagepng(res_imagine), imagejpeg(res_imagine)

– produc afişarea în browser (deci trimiterea fluxului de date c tre acesta) a imaginii

specificat de res_imagine. În funcţie de tipul imaginii (GIF, PNG sau JPG) folosim varianta

convenabil a acestei funcţii;

• imagedestroy(res_imag) – produce dezalocarea întregii memorii asociate imaginii

reprezentat de res_imag;

Page 83: HTML Php Mysql Pentru Incepatori-libre

85

• getimagesize(’nume_fişier’) – întoarce un array (şir) ce conţine informaţii despre

imaginea din fişierul ’nume_fişier’. Informaţiile se g sesc structurate astfel:

- la indicele 0 se g seşte l ţimea (width);

- la indicele 1 se g seşte în lţimea (height);

- la indicele 2 se g seşte o constant care ne indic tipul imaginii (posibile valori

pentru acest element sunt: IMAGETYPE_GIF, IMAGETYPE_JPEG, IMAGETYPE_PNG, etc.);

- la indicele 3 se g seşte un string de forma height="yyy" width="xxx", pentru

a putea fi folosit direct într-un tag <IMG....>

- la indicele mime se g seşte un string ce conţine tipul MIME corespunz tor

imaginii;

3.11. Upload de fişiere via PHP.

Prin acţiunea de upload, utilizatorul poate înc rca, prin intermediul unei pagini web, un

întreg fişier (indiferent c este un fişier binar sau un fişier text) pe server-ul pe care este stocat şi

pagina respectiv .

La începuturile dezvolt rii internetului, s-a pus desigur aceast problem , a transferului de

fişiere. Rezolvarea a fost g sit atunci prin implementarea unui protocol de transferare de fişiere

între dou calculatoare care sunt legate între ele. Este vorba de FTP (File Transfer Protocol), care

deşi este o metod eficient de transfer, este greoi de folosit de un utilizator nespecializat (necesit

specificarea adresei calculatorului la care ne conect m, un nume de utilizator şi o parol , precum şi

un program specializat).

Avantajul adus de upload-ul prin intermediul unei pagini web const în faptul c este uşor

de folosit de c tre orice utilizator al internetului, cel care face operaţia având nevoie doar de câteva

cunoştinţe minimale de utilizare a calculatorului.

Cea mai frecvent acţiune de upload din parte unui utilizator obişnuit este întâlnit la

ataşarea unui fişier la un e-mail.

Care este principiul de funcţionare ?

În primul rând, trebuie conceput un form special, în care se vor insera unul sau mai multe

elemente de tip <input type=”file”...>. Acestea se prezint sub forma unor textbox-uri în

dreapta c rora este prezent un buton ”Browse”, ca în figura de mai sus. Un click fie în interiorul

textbox-ului, fie pe butonul ”Browse” va permite alegerea unui fişier de pe disc pentru a fi înc rcat.

În etapa urm toare, dup ce utilizatorul apas , tot în acel form, butonul de postare date,

fişierul ales pentru upload va fi trimis c tre server, tot prin intermediul unui script (cel specificat în

Page 84: HTML Php Mysql Pentru Incepatori-libre

86

cadrul atributului ”action=...” al formularului) şi copiat într-o locaţie temporar . Treaba

programatorului PHP este ca el s copieze fişierul la locaţia sa definitiv .

Atenţie ! Pentru ca upload-ul s funcţioneze, atât directorul temporar în care este înc rcat

fişierul, cât şi directorul în care vom muta acest fişier trebuie s aib drepturi de scriere pentru orice

utilizator de pe Internet.

În mod implicit, directorul temporar al instal rii XAMPP-ului are aceste drepturi stabilite de

la instalarea întregului pachet. Dac ele nu sunt corect setate, va trebui s le configuraţi manual. În

tot cazul, pentru directorul în care veţi muta fişierul, va trebui obligatoriu s le configuraţi.

Voi exemplifica modul în care se face acest lucru pentru directorul tmp al instal rii

XAMPP. Pentru directorul destinaţie, veţi proceda analog.

Astfel, deschideţi un Windows Explorer. V asiguraţi c opţiunea ”Use simple file

sharing (Recommended)” NU este bifat (pentru a ajunge la aceast opţiune deschideţi din

meniul Tools submeniul Folder Options şi apoi accesaţi tab-ul View. În cadrul acestuia sunt

mai multe opţiuni printre care şi cea de mai sus), dup care mergeţi pe directorul temporar al

instal rii xampp (în mod implicit C:\xampp\tmp), NU intraţi în director, ci daţi click dreapta pe el,

alegând opţiunea Properties, apoi tab-ul Security. În acest tab, alegeţi ”Add”, scrieţi numele

network, şi apoi alegeţi din lista ce vi se deschide utilizatorul network. Dup ce l-aţi ales,

asiguraţi-v c are drepturi de scriere în directorul tmp (bifaţi, în c suţele de sub el, şi opţiunile

Modify respectiv Write).

În cadrul script-ului PHP care se ocup de preluarea fişierului înc rcat, ne vom folosi de un

masiv predefinit al limbajului, şi anume $_FILES, care ne va furniza date despre fişierul înc rcat, şi

anume (primul parametru al lui $_FILES este dat de numele input-ului de type=”file”):

• $_FILES[nume_input][‘name’] – ne întoarce numele şi extensia fişierului pe care l-

am upload-at;

• $_FILES[nume_input][‘tmp_name’] – ne întoarce numele complet (cu tot cu calea)

fişierului temporar care s-a creat în urma upload-ului. Atenţie ! acest nume poate s fie complet

diferit faţ de cel original.

• $_FILES[nume_input][‘type’] – ne întoarce tipul mime al fişierului (un string, de

exemplu: application/octet-stream sau image/gif. Valoarea sa nu poate fi garantat ca fiind corect ;

• $_FILES[nume_input][‘size’] – ne întoarce dimensiunea (în octeţi) a fişierului

upload-at

• $_FILES[nume_input][‘error’] – ne întoarce codul de eroare al operaţiei de upload

asupra fişierului dat de nume_input. Dac operaţia s-a încheiat cu succes, are valoarea 0.

Page 85: HTML Php Mysql Pentru Incepatori-libre

87

Exemplu: Urm toarele dou script-uri realizeaz o aplicaţie prin care putem upload-a un fişier în

acelaşi director în care se afl şi sursele aplicaţiei.

Primul fişier reprezint un HTML obişnuit, ce conţine doar form-ul prin care se poate face upload-

ul fişierului, iar al doilea fişier reprezint script-ul PHP care preia fişierul upload-at şi îl mut în

directorul curent:

apl082.html

<form enctype="multipart/form-data" action="apl083.php" method="post"> <!—- este obligatoriu sa specificati atributul enctype="multipart/form-data", in caz contrar nu va fi permisa upload-area de fisiere. De asemenea, remarcati atributul action, care specifica numele scriptului care se va ocupa de preluarea fisierului upload-at --> <input type="hidden" name="MAX_FILE_SIZE" value="30000"> <!—- acest control de tip hidden permite stabilirea unei limite maxime a dimensiunii fisierului care urmeaza a fi uploadat. Din pacate, acest parametru poate fi usor pacalit din browser --> Alege un fisier pentru upload (sa aiba sub 30000 bytes):<br> <!—- cu ajutorul acestui input type=”file” putem defini cimpul de tip upload din form --> <input type="file" name="fisier_incarcat"><br><br> <!-- de valoarea atributului sau ’name’, in cazul nostru ”fisier_incarcat” ne vom folosi pentru a-l manipula din cadrul codului PHP in care il vom prelua, in cazul nostru apl083.php--> <input type="submit" value="Incarca fisierul"> </form>

apl083.php

<?php if($_FILES['fisier_incarcat']['error']!=0) echo 'Upload nereusit, a aparut o eroare'; else { move_uploaded_file($_FILES['fisier_incarcat']['tmp_name'], $_FILES['fisier_incarcat']['name']); //cu ajutorul functiei move_uploaded_file mutam fisierul de la locatia sa temporara la //locatia sa definitiva, care în cazul nostru este directorul curent. Parametrii acestei //funcţii sunt sursa respectiv destinatia echo 'Fisierul a fost incarcat<br>'; echo 'Dimensiunea sa este de ',$_FILES['fisier_incarcat']['size'],' octeti'; } ?>

3.12. Variabile cookie.

Utilizarea lor a pornit din necesitatea p str rii anumitor set ri (opţiuni) ale utilizatorului

atunci când acesta intr pe un anumit site, pentru a nu mai fi nevoit sa le specifice la fiecare intrare.

Mecanismul care st la baza acestei probleme se bazeaz pe memorarea, pe calculatorul

vizitatorului unui anumit site, a unor informaţii sub forma unor mici fişiere text. Operaţia poate fi

comandat de pe server şi tot de pe server se poate comanda citirea, actualizarea sau ştergerea

acestor mici fişier, numite uzual, prin abuz de limbaj, variabile cookie.

În PHP se poate lucra foarte uşor cu variabilele cookie.

• Pentru a crea o variabil cookie se utilizeaz funcţia:

setcookie(nume_variabilă, valoare, dată_expirare);

Exemplu: în instrucţiunea de mai jos este creat o variabil cookie numit limba_pref.

Variabila reţine valoarea ”romana” şi expir într-o or :

Page 86: HTML Php Mysql Pentru Incepatori-libre

88

setcookie(limba_pref,”romana”,time()+3600);

Observa ii !

1) Nu pot exista mai mult de 20 de variabile cookie. Dac se creeaz vreuna în plus, prima creat

este ştears automat;

2) Pentru a şterge o variabil cookie se creeaz o alta cu acelaşi nume, dar cu data de expirare

înaintea celei curente (de exemplu, time()-1).

• Pentru a citi (recupera) valoarea unei variabile cookie, se utilizeaz conţinutul unui

masiv asociativ special, predefinit, al limbajului PHP, numit $HTTP_COOKIE_VARS[..]. Fiecare

component a sa are ca indice numele unei variabile cookie, iar ca valoare, reţine valoarea

variabilei respective.

Exemplu: instrucţiunea de mai sus afişeaz valoarea variabilei cookie creat prin exemplul

anterior:

echo $HTTP_COOKIE_VARS[”limba_pref”];//afişează ”romana” Exemplu: Script-ul care urmeaz exemplific modul în care se pot reţine anumite informaţii

pe care utilizatorul le-a tastat o dat . Apelat pentru prima dat , atunci când nu exist variabila

cookie numit ”loc”, se cere tastarea localit ţii în care se afl cel care viziteaz pagina. Dac acel

vizitator reintr pe acel site, reapelând script-ul, acesta va identifica variabila cookie ”loc”, va

prelua direct localitatea memorat şi, în loc ca utilizatorului s i se cear din nou introducerea

acesteia, i se va afişa direct un mesaj:

apl084.php

<?php $loc=@$_POST['loc'];//testam mai intii daca am primit dintr-un form //postat tot din cadrul acestei pagini, o variabila numita loc, //cu valoarea careia trebuie sa cream variabila cookie if($loc!=NULL)//daca am primit setcookie("loc",$loc,time()+24*3600);//atunci setam variabila //cookie cu valoare primita, pentru o durata de 24 de ore else//pe cind, daca nu am primit, verificam daca variabila cookie este deja creata $loc=@$HTTP_COOKIE_VARS['loc']; if($loc!=NULL)//deci daca este creata {//dam utilizatorului un mesaj: echo "Localitatea curenta este: ",$loc; //si ii permitem sa schimbe aceasta localitate, daca doreste echo '<form action="apl084.php" method="post">'; echo '<p align="right">'; echo 'Schimba localitatea:'; echo '<input type="text" name="loc"><br>'; echo '<input type="submit" value="Schimba localitatea"></p></form>'; } else//in caz contrar, cream formularul care permite introducerea localitatii { echo '<form action="apl084.php" method="post">'; echo 'Introdu localitatea<br><br>'; echo '<input type="text" name="loc"><br><br>'; echo '<input type="submit" value="Salveaza"></form>'; } ?>

Page 87: HTML Php Mysql Pentru Incepatori-libre

89

3.13. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP. 3.13.1. Introducere în MySQL.

În ultimii ani, utilizarea bazelor de date pe Internet a luat o amploare deosebit . Exist o

mulţime de aplicaţii, extrem de utile, care le utilizeaz , cum ar fi: aplicaţii de contorizare, comerţ

electronic, vot electronic, aplicaţii de comunicare.

De unde SQL ? În domeniul cre rii şi utiliz rii bazelor de date relaţionale s-a impus

necesitatea existenţei unui limbaj standard care s permit efectuarea acestor operaţii. Astfel, a

ap rut SQL – Structured Query Language. Limbajul a fost supervizat de comisia de standardizare

ANSI (American National Standards Institute), motiv pentru care se mai numeşte şi ANSI SQL.

SQL nu este un limbaj de firm , ci el este implementat de o mulţime de SGBD-uri

consacrate, cum ar fi Microsoft Access, Oracle, Microsoft SQL Server şi, bineînţeles, MySQL.

MySQL este un limbaj specializat pentru gestiunea bazelor de date relaţionale pe Internet,

având la baz limbajul SQL. MySQL gestioneaz baze de date care se g sesc pe un server. Baza de

date poate fi foarte lesne exploatat prin intermediul limbajului PHP, dar şi cu alte limbaje (de

exemplu Java).

3.13.2. Testarea instalării MySQL. Configurarea bazei de date.

Dup cum am anunţat în capitolul 3.2., suportul MySQL a fost deja instalat, în cadrul

pachetului XAMPP, deodat cu limbajul PHP.

Tot suportul software al bazei de date MySQL se g seşte în directorul C:\XAMPP\MYSQL.

În subdirectorul BIN al acestuia se g sesc o serie de programe utilizare, care permit configurarea şi

operarea imediat cu serverul de baze de date. Utilitarul pe care o s -l utiliz m cel mai des este

mysql.exe. Pentru a-l putea accesa din orice alt locaţie a calculatorului v-aţi afla, este

recomandat s ad ugaţi calea spre el (C:\XAMPP\MYSQL\BIN) în variabila PATH a sistemului.

Acest lucru se face executând un click dreapta pe My Computer, alegând apoi tab-ul Advanced,

apoi butonul Environment Variabies. Din fereastra care se deschide, derulaţi în partea de jos

(secţiunea System Variables) pân întâlniţi variabila PATH. Daţi dublu click pe ea (sau ap saţi

butonul Edit de dedesubt) şi, la sfârşitul şirului de caractere deja existent acolo, ad ugaţi

caracterul ”;” urmat de calea ”C:\XAMPP\MYSQL\BIN”.

Din acest moment, utilitarul mysql se poate rula din orice locaţie (de exemplu direct din

Start + Run).

Page 88: HTML Php Mysql Pentru Incepatori-libre

90

Vom configura în continuare serverul de baze de date. MySQL fiind un server de baze de

date partajat, accesul se face pe baza unui nume de utilizator (user) şi a unei parole (password).

Pentru moment, este configurat doar utilizatorul root (cu drepturi depline asupra bazei de

date) şi NU are parola.

Pentru a va conecta, lansaţi dintr-un Command Prompt sau din Start + Run urm toarea

comand : mysql –u root –p

Atunci când sunteţi invitaţi s introduceţi parola (prin Enter password:) trebuie s daţi

Enter. În cazul în care conectarea a reuşit, veţi primi un mesaj de întâmpinare, iar prompt-ul se va

schimba în : mysql>... (pentru a v deconecta de la server, în dreptul acestui prompt trebuie s

scrieţi comanda quit dup care daţi Enter).

Din acest sunteţi conectaţi la baza de date. În continuare vom da câteva comenzi pentru a

configura serverul, baza de date asupra c reia vom lucra, şi un utilizator pe care îl vom folosi pentru

a lucra în mod curent (deoarece este complet nerecomandat s folosim utilizatorul root pentru a

lucra în mod curent la baza de date).

În primul rând, vom şterge toţi utilizatorii predefiniţi, în afar de root, iar apoi vom crea o

baz de date în care vom lucra şi un utilizator cu drepturi de utilizare asupra acestei baze de date.

Atenţie s nu uitaţi caracterul ”;” dup fiecare comand executat . De asemenea, dup fiecare

comand daţi un Enter:

mysql>use mysql; prin aceast comand intr m în baza de date administrativ , cu numele mysql

mysql>delete from user where user!=’root’ or host!=’localhost’;

prin aceast comand ştergem toţi utilizatorii predefiniţi, l sând utilizatorul root cu drepturi de conectare de pe

maşina local

mysql>update user set password=password('parolanouă') where user='root'; prin aceast comand schimb m parola utilizatorului root, de la parola vid (pe care o avea de la instalare) cu

noua parol (evident, şirul de caractere parolanouă îl înlocuiţi cu noua parol )

mysql>create database lucru;

prin aceast comand cre m o baz de date cu numele ”lucru”, în care vom lucra în continuare

mysql>grant all on lucru.* to 'utilizator'@'localhost' identified by 'parola';

prin aceast comand cre m utilizatorul cu numele ’utilizator’, cu parola ’parola’ (evident, le veţi schimba

dup bunul plac) ce se poate conecta de pe maşina local , şi are drepturi de lucru doar în baza de date ’lucru’

mysql>flush privileges;

prin aceast comand facem ca toate modific rile efectuate pân în momentul de faţ s devin efective şi

operative.

mysql>quit;

şi ieşim din monitorul mysql

Putem testa imediat instalarea, prin conectarea la serverul mysql cu noul utilizator creat

(lansaţi aceast comand fie din Command Prompt fie din Start+Run) :

Page 89: HTML Php Mysql Pentru Incepatori-libre

91

mysql –u utilizator –p

În momentul în care vi se cere parola, introduceţi, evident, parola definit mai sus.

Dup conectarea la MySQL, pentru a stabili ca punct de lucru baza de date asociat acestui

utilizator, veţi da comanda:

mysql>use lucru;

dup care veţi putea testa toate comenzile ce urmeaz s fie testate în paragrafele urm toare.

3.13.3. Crearea unei baze de date.

Aceast operaţie nu poate fi f cut de c tre orice utilizator, ci doar de c tre root sau de

anumiţi utilizatori cu drepturi speciale.

• Comanda pentru crearea unei baze de date este:

create database nume_bază_date;

În urma execut rii 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 acelaşi

nume cu baza de date, în subdirectorul data al folder-ului instal rii 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 doreşte lucrul cu o anumit baz de date, se va da comanda urm toare:

use nume_bază_date; • Pentru ştergerea unei baze de date se utilizeaz comanda:

drop database nume_bază_date; • Dac dorim o list a bazelor de date existente (sau, în fine, în funcţie 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 rândurile, prin valorile pe care le

memoreaz . Toate datele dintr-o coloan au acelaşi tip. O tabel are un num r specificat de coloane,

îns are un num r nespecificat de rânduri. Uneori, când ne referim la un rând, folosim şi termenul

de înregistrare, iar atunci când ne referim la data din rând, situat într-o anumit coloan , folosim şi

termenul de câmp.

• Instrucţiunea prin care se poate crea o tabel este prezentat mai jos; ceea ce este trecut

între paranteze drepte reprezint clauze, atribute sau buc ţi de instrucţiune care, din punct de vedere

sintactic (în funcţie de fiecare caz) pot s nu apar :

Page 90: HTML Php Mysql Pentru Incepatori-libre

92

create table nume_tabelă ( nume_coloană1 tip_date [specificatori], nume_coloană2 tip_date [specificatori], ... nume_coloanăn tip_date [specificatori] );

Specificatorii se refer la cheia primar , valori distincte, valori implicite, autoincrementare,

dac printre valorile memorate în tabel se poate g si sau nu valoarea NULL. Toate acestea le vom

trata separat, în alt paragraf.

Exemplu: pentru a crea o tabel cu 3 coloane, în care vom reţine indicativul fiec rui judeţ

(ca pe pl cuţele de la maşini), numele judeţului (un şir de cel mult 30 de caractere) şi num rul s u

de locuitori (un num r întreg de cel mult 7 cifre) folosim urm toarea comand :

create table judete (ind char(2),nume char(30),nrloc int(7));

• Ad ugarea unui nou rând într-o tabel se face prin instrucţiunea de mai jos, în care se

introduc, pe rând, valori pentru toate câmpurile unei linii, în ordinea în care au fost declarate

coloanele la crearea tabelei:

insert into nume_tabelă values(valoare1,valoare2,...,valoaren); Exemplu: pentru a insera dou linii în tabela creat în exemplul anterior:

insert into judete values('CJ','Cluj',702755);

insert into judete values('BV','Brasov',589028);

În practica utiliz rii bazelor de date, instrucţiunea anterioar este considerat ca generatoare

de erori, deoarece fie se poate greşi ordinea de introducere a datelor, fie pe parcursul dezvolt rii se

insereaz coloane noi între cele deja existente, iar efectul ar fi acela c tabela va conţine date

eronate. Din acest motiv este preferat forma urm toare a instrucţiunii, deşi este necesar s scriem

mai mult:

insert into nume_tabelă(nume_coloană1,nume_coloană2,...,nume_coloanăk) values(valoare1,valoare2,...,valoarek);

Se pot omite coloane (caz în care ele vor primi automat valori NULL) şi bineînţeles c

putem scrie coloanele în orice ordine dorim.

Exemplu: mai ad ug m dou linii la tabela anterioar : una în care nu complet m num rul

de locuitori şi alta în care trecem toate cele 3 valori, îns în alt ordine decât cea în care le-am creat:

insert into judete(nrloc,ind,nume) values(510110,'MM','Maramures');

insert into judete(ind,nume) values('CL','Calarasi');

• Pentru a afişa întreaga tabel , utiliz m comanda:

select * from nume_tabelă;

Page 91: HTML Php Mysql Pentru Incepatori-libre

93

Exemplu: pe tabela creat anterior, dac execut m:

select * from judete;

se va afişa în urm torul format:

• Dac dorim s afiş m doar anumite coloane ale tabelei, în ordinea pe care o dorim,

folosim forma de mai jos a instrucţiunii:

select nume_coloana1,...,nume_coloanak from tabelă; Se observ faptul c , atunci când afiş m tabela, în antetul (capul de tabel) s u se trece

numele coloanelor acesteia. Dac dorim ca în antet s figureze alt nume pentru o coloan , atunci, în

instrucţiunea de mai sus, în loc de a scrie doar numele coloanei, vom scrie numele coloanei urmat

de cuvântul cheie AS şi de numele care dorim s fie afişat în antet. Astfel, prin cuvântul cheie ”AS”,

am definit alias-uri pentru numele coloanelor.

Exemplu: pentru tabela din exemplele anterioare, am putea scrie urm toarea comand :

select ind as indicativ,

nume as "nume judet",

nrloc as "numar de locuitori"

from judete;

Rezultatul const în afişarea sub urm torul format:

• Pentru listarea numelor tuturor tabelelor din baza de date, folosim comanda urm toare:

show tables [from nume_bază_date]; Dac nu specific m clauza [from nume_bază_date] se vor afişa toate tabelele din baza

de date curent (cea c tre care am dat use);

• Pentru a afişa o descriere detaliat a unei tabele (numele coloanelor, tipurile lor) se

foloseşte una dintre comenzile (ele fac acelaşi lucru):

describe nume_tabelă; show columns from nume_tabelă;

3.13.5. Tipuri de date în MySQL.

Tipurile principale de date ale MySQL sunt:

a) şiruri de caractere;

b) numerice;

c) dat , or

În continuare, vom prezenta fiecare tip de dat în parte:

+------+-----------+--------+ | ind | nume | nrloc | +------+-----------+--------+ | CJ | Cluj | 702755 | | BV | Brasov | 589028 | | CL | Calarasi | NULL | | MM | Maramures | 510110 | +------+-----------+--------+ 4 rows in set (0.02 sec)

+-----------+------------+--------------------+ | 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)

Page 92: HTML Php Mysql Pentru Incepatori-libre

94

+------------------+------------------+| nume | curent |+------------------+------------------+| Gustave Klimt | art nouveau || Vincent Van Gogh | postimpresionism || Alphonse Mucha | art nouveau || Auguste Renoir | impresionism || Rene Magritte | suprarealism || Tiziano Vecellio | |+------------------+------------------+

+--------------+--------------+| nume | hobby |+--------------+--------------+| Ion MARIN | muzica,desen || Ion TIRIAC | desen,sport || Nina CHIRIAC | muzica || Ion BETEA | sport |+--------------+--------------+

a) Şiruri de caractere:

• char[(n)] – reţine un şir de caractere de lungime n (fix ). În caz c n nu este precizat,

reţine un singur caracter. Ocup n octeţi;

• varchar[(n)] – reţine un şir de cel mult 255 de caractere. Ocup n+1 octeţi;

• tinytext[(n)] – este echivalent cu varchar[(n)];

• text[(n)] – reţine un şir de cel mult 65535 caractere. Ocup n+2 octeţi;

• mediumtext[(n)] – reţine un şir de cel mult 16.777.215 caractere. Ocup n+3 octeţi;

• longtext[(n)] – reţine un şir de cel mult 4.294.967.295 caractere. Ocup n+4 octeţi;

• enum – un câmp care poate reţine un singur şir de caractere dintr-un vector de şiruri de

caractere predefinit de c tre utilizator la crearea tabelei. De altfel, tabela va memora vectorul de

şiruri de caractere, iar în acest câmp se va reţine doar indicele elementului corespunz tor din vector.

Vezi exemplele de dup ;

• set – la fel ca la enum, doar c un câmp de acest tip poate reţine unul sau mai multe şiruri

de caractere din vectorul predefinit de c tre utilizator. Vezi exemplele de dup .

Exemplu (pentru tipul enum): cre m o tabel în care trecem câţiva pictori şi curentele artistice pe

care le reprezint .

create table pictori(nume text, curent enum('impresionism','postimpresionism','suprarealism','art nouveau')); insert into pictori values('Gustave Klimt','art nouveau'); insert into pictori values('Vincent Van Gogh','postimpresionism'); insert into pictori values('Alphonse Mucha','art nouveau'); insert into pictori values('Auguste Renoir','impresionism'); insert into pictori values('Rene Magritte','suprarealism'); insert into pictori values('Tiziano Vecellio','renastere');

A se remarca faptul c dup executarea ultimei comenzi apare o avertizare (warning). Acest

lucru se întâmpl deoarece ultimul curent introdus,

’renastere’ nu apare printre stringurile din enum,

permise pentru acest câmp. Totuşi, în urma

execuţiei sale, pictorul cu numele ”Tiziano

Vecellio” va fi trecut în tabel , îns în dreptul

curentului s u va fi trecut şirul vid:

Exemplu (pentru tipul set): cre m o tabel în care trecem numele câtorva persoane şi hobby-urile

lor favorite, dintre muzic , sport şi desen. Vom încerca şi de aceast dat s punem valori invalide.

Efectul este asem n tor celui de la enum: datele respective vor fi ignorate:

create table persoane (nume text, hobby set('muzica','desen','sport')); 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');

Page 93: HTML Php Mysql Pentru Incepatori-libre

95

b) Tipuri de date numerice:

• tinyint[(n)] – ocup 1 octet. Reţine nr. întregi cuprinse între -128..127. Dac este

urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..255;

• smallint[(n)] – ocup 2 octeţi. Reţine nr. întregi cuprinse între -32768..32767. Dac

este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..65535;

• mediumint[(n)] – ocup 3 octeţi. Reţine nr. întregi cuprinse între -8388608..8388607.

Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..16777215;

• int[(n)] – ocup 4 octeţi. Reţine nr. întregi cuprinse între -2147843648..2147843647.

Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse între 0..4294967295;

• bigint[(n)] – ocup 8 octeţi. Reţine nr. întregi cuprinse între -9223372036854775808

şi 9223372036854775809. Dac este urmat de cuvântul unsigned reţine numere naturale cuprinse

între 0..18446744073709551615;

• float – ocup 4 octeţi – este echivalentul tipului cu acelaşi nume din C/C++;

• double – ocup 8 octeţi – este echivalentul tipului cu acelaşi nume din C/C++;

• decimal(n,d) – num rul este stocat sub form de şir de caractere. Parametrul n

reprezint num rul de cifre nenule aflate înaintea virgulei (cu tot cu semnul ’–’ pentru numerele

negative, dac este cazul) iar d reprezint num rul de zecimale.

c) Tipuri pentru dată şi oră:

• year – un câmp de acest tip reţine un an calendaristic. Aceştia se introduc ca şi şir de

caractere;

• time – un câmp de acest tip reţine o anumit or dintr-o zi. Se introduce sub forma unui

şir de caractere, de forma ’hh:mm:ss’;

• date – un câmp de acest tip reţine o anumit dat calendaristic . Se introduce sub forma

unui şir de caractere, de forma ’yyyy-mm-dd’;

• datetime – un câmp de acest tip reţine o anumit dat calendaristic şi o anumit or . Se

introduce sub forma unui şir de caractere, de forma ’yyyy-mm-dd hh:mm:ss’;

3.13.6. Operatori utilizaţi în MySQL. Variabile.

Voi prezenta mai întâi principalii operatori din MySQL, în ordinea cresc toare a priorit ţii

lor. Utilitatea operatorilor şi funcţionalitatea acestora va fi prezentat în paragrafele urm toare:

1. ||, or, xor

2. &&, and

3. between, case when, then, else

Page 94: HTML Php Mysql Pentru Incepatori-libre

96

+-----+| 5+7 |+-----+| 12 |+-----+

4. =, >=, >, <=, <, !=, <>, is, like, in

5. |

6. &

7. <<, >>

8. +, – (operatori binari)

9. *, /, div, %, mod

10. ^

11. +, – (operatori unari)

12. !, not

Pentru a testa un anumit operator, puteţi utiliza instrucţiunea select.

De exemplu, dac daţi comanda select 5+7; se va afişa un rezultat ca în

imaginea al turat :

Observaţie importantă: În MySQL exist o valoare special numit Null.

Semnificaţia ei este de ”valoare necunoscut ”. Reţineţi faptul c , dac Null este un operand al

oric rei expresii, rezultatul oric rei operaţii care se efectueaz cu Null este Null.

Operatorii se împart, la rândul lor, în mai multe grupe. Acestea sunt prezentate în

continuare:

a) Operatori aritmetici:

Acţioneaz asupra tipurilor numerice şi furnizeaz o valoare de tip numeric:

• + – adunare (Ex: 2+3 are ca rezultat valoarea 5);

• - – sc dere (Ex: 2-3 are ca rezultat valoarea -1);

• * – înmulţire (Ex: 2*3 are ca rezultat valoarea 6);

• / – împ rţire cu zecimale (Ex: 5/4 are ca rezultat valoarea 1.25);

• div – împ rţire cu zecimale (Ex: 15 div 4 are ca rezultat valoarea 3);

• mod şi % – împ rţire cu zecimale (Ex: 14 mod 4 sau 14%4 are ca rezultat valoarea 3);

• - şi + – operatorii unari plus şi minus (Ex: --4 are ca rezultat valoarea 4);

b) Operatori de comparare (sau relaţionali):

Permite compararea a dou valori numerice sau a dou şiruri de caractere. Şirurile de

caractere se compar lexicografic şi nu se face distincţie între literele mari şi literele mici.

Rezultatul este 1 pentru adev rat şi 0 pentru fals.

• < – mai mic (Ex: 2<3 are ca rezultat valoarea 1);

• <= – mai mic sau egal (Ex: 3<=3 are ca rezultat valoarea 1);

• > – mai mare (Ex: 2>3 are ca rezultat valoarea 0);

Page 95: HTML Php Mysql Pentru Incepatori-libre

97

• >= – mai mare sau egal (Ex: 2>=3 are ca rezultat valoarea 0);

• = – egalitate (Ex: 2=3 are ca rezultat valoarea 0);

• <> sau != – diferit (Ex: 2<>3 sau 2!=3 are ca rezultat valoarea 1);

Observaţie: se pot compara, de altfel, cu aceşti operatori, şi date de tipul time, date. În fapt, o

astfel de comparare este tot una lexicografic .

c) Operatori logici:

Analog limbajului C/C++, în MySQL se consider dou valori logice: 0 joac rolul lui

false, iar orice valoare diferit de 0 joac rolul lui true.

• || sau or – sau-ul logic (este 0 doar când ambii operanzi sunt 0, în rest este 1);

• && sau and – şi-ul logic (este 1 doar când ambii operanzi sunt nenuli, în rest este 0);

• not – negaţie (negaţia lui 0 este 1, iar negaţia lui 1 este 0);

• xor – sau-ul exclusiv (este 0 când ambii operanzi sunt fie nuli, fie nenuli, şi este 1 în rest);

d) Operatori logici pe biţi:

Se aplic tuturor tipurilor întregi şi acţioneaz asupra tuturor biţilor aflaţi pe poziţii

corespondente.

• | – sau-ul pe biţi;

• & – şi-ul pe biţi;

• ^ – sau-ul exclusiv pe biţi;

• ~ – negaţia pe biţi;

e) Operatori de deplasare pe biţi:

Se aplic tuturor tipurilor întregi, deplasând biţii reprezent rii binare:

• << – deplasare la stânga: a<<b deplaseaz cu b poziţii la stânga biţii lui a;

• >> – deplasare la dreapta: a>>b deplaseaz cu b poziţii la dreapta biţii lui a;

f) Operatori specifici pentru MySQL:

• is null, is not null – testeaz dac o valoare este sau nu null (sunt singurii

operatori care testeaz acest lucru! Atenţie, compararea cu null întoarce, conform unei observaţii

anterioare, TOT TIMPUL valoarea null, indiferent c se compar null-ul tot cu null sau cu alt

valoare);

• in, not in – testeaz dac o valoare aparţine sau nu unei mulţimi

(ex: 1 in (1,2,3,4) are valaorea 1;

5 in (1,2,3,4) are valoarea 0;

’cici’ in (’cici’, ’mimi’, ’lola’) are valoarea 1);

Page 96: HTML Php Mysql Pentru Incepatori-libre

98

• like, not like – testeaz dac un şir de caractere are o anumit form : dac este

prefixat respectiv postfixat sau nu de un anumit subşir, dac acesta conţine un anumit subşir. Forma

sub care se utilizeaz este string like şablon respectiv string not like sablon. Şablon

este tot un string, în care se folosesc urm toarele caractere speciale: ’%’ pentru un num r neprecizat

de caractere necunoscute, respectiv ’_’ pentru un singur caracter neprecizat.

(ex: ’cici’ like ’ci%’ – are valoarea 1;

’lola’ like ’la%’ – are valoarea 0;

’mimi’ not like ’me_i’ – are valoarea 1);

• between min and max – testeaz dac o valoare se g seşte în intervalul închis cu

capetele min, respectiv max. (Ex: 1 between 0 and 4 – are valoarea 1);

• case .. when .. then .. else .. – are dou forme sub care se poate aplica:

- forma 1: case v

when v1 then val1

. . .

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) case cif when 1 then ’unu’ when 2 then ’doi’ when 3 then ’trei’ else ’nu stiu sa numar decit pina la 3’ end

2) case when a<0 then ’valoare negativă’ when a=0 then ’valoare nulă’ else ’valoare strict pozitivă’ end

Se evalueaz v, şi dac se produce vreuna dintre valorile v1 .. vn se va întoarce valk corespunz toare, iar dac nu se va întoarce valn+1

Se evalueaz condiţiile în ordinea scrierii. Prima care este adev rat va întoarce valoarea valk corespunz toare. Dac nici una nu este adv rat , se va întoarce valn+1

Page 97: HTML Php Mysql Pentru Incepatori-libre

99

g) Variabile în MySQL:

În MySQL variabilele se specific prin @identificator, unde identificator respect

aceleaşi reguli sintactice ca şi în alte limbaje de programare (s fie format doar din litere, cifre şi '_'

şi s nu înceap cu o cifr ). Atribuirea unei valori c tre o variabil se face cu operatorul ':=' şi, la

fel ca în C++, atribuirea poate juca şi rolul unei expresii, care întoarce valoarea atribuit .

Exemplu:

select @c:=(@a:=4)+(@b:=5); atribuie atât valoarea 4 variabilei @a, valoarea 5 variabilei @b cât şi valoarea 9 variabilei @c select @a; pentru verificare, afiş m apoi valorile select @b; celor trei variabile select @c;

3.13.7. Funcţii predefinite în MySQL.

a) Câteva funcţii matematice:

• abs(x) – modulul lui x;

• ceil(x) – cel mai mic întreg mai mare sau egal cu x;

• floor(x) – cel mai mare întreg mai mic sau egal cu x (partea întreag matematic );

• exp(x) – ex;

• log(b,x) – logbx;

• ln(x) – ln x;

• pi() – π;

• pow(x,y) – xy;

• round(x) – cel mai apropiat întreg de x (rotunjire la întreg);

• sin(x), cos(x) – sinusul şi cosinusul unghiului x. Unghiul trebuie dat în radiani;

• sign(x) – semnul lui x (-1 pt. nr. negativ, 0 pt. 0, 1 pt. num r pozitiv);

• sqrt(x) – radicalul (r d cina p trat ) lui x;

b) Câteva funcţii care lucrează asupra şirurilor de caractere:

• length(x) – lungimea (nr. de caractere) a şirului x;

• concat(x1,x2,...) – concateneaz şirurile de caractere pe care le primeşte ca

parametri. Atenţie ! în MySQL NU exist un operator de concatenare (ca în PHP, spre exemplu);

• instr(x,y) – Caut dac y este subşir al lui x. Dac este întoarce indicele de început

(primul caracter având indicele 1) iar dac nu este, întoarce 0;

• substring(x,poz,lung) – întoarce subşirul de caractere din x care începe pe poziţia

poz şi are lungimea lung. Dac lung este omis, întoarce de la poziţia poz pân la sfârşit;

• rtrim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile din dreapta;

Page 98: HTML Php Mysql Pentru Incepatori-libre

100

• ltrim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile din stânga;

• trim(x) – întoarce şirul obţinut din x prin eliminarea spaţiilor inutile atât din dreapta cât

şi din stânga;

• upper(x) – întoarce şirul obţinut prin convertirea tuturor literelor mici la litere mari;

• lower(x) – întoarce şirul obţinut prin convertirea tuturor literelor mari la litere mici;

• find_in_set(x,string) – întoarce indicele apariţiei şirului x în şirul de entit ţi

separate prin virgule din cadrul lui string. Ex: find_in_set(’mimi’,’cici,mimi,lola’) va

întoarce valoarea 2.

• format(x,d) – converteşte valoarea real la un string cu d zecimale. Dac este cazul, la

ultima zecimal din string se face rotunjire. Ex: format(5.678,2) va întoarce stringul ’5.68’;

• strcmp(x,y) – compar lexicografic şirurile de caractere x şi y, întorcând -1 dac x<y, 0

dac x=y, 1 dac x>y. Nu face distincţie între literele mari şi cele mici;

c) Câteva funcţii care lucrează asupra datei şi orei:

• now() – întoarce data şi ora curent sub forma yyyy-mm-dd hh:mm:ss;

• day(d) – întoarce num rul zilei din data pe care o primeşte ca parametru;

• month(d) – întoarce num rul lunii din data pe care o primeşte ca parametru;

• year(d) – întoarce num rul anului din data pe care o primeşte ca parametru;

• time(d) – întoarce timpul (sub forma hh:mm:ss) extras din data+timpul pe care o

primeşte ca parametru;

• hour(d) – întoarce ora din parametrul s u. Acesta poate fi de tip date sau datetime;

• minute(d) – ca mai sus, întoarce minutul din parametrul s u;

• second(d) – ca mai sus, întoarce secunda din parametrul s u;

• datediff(x,y) – calculeaz diferenţa, în zile, dintre datele x şi y;

• date_add(x,interval nr tip) – adun la data x un num r nr de zile, luni sau ani,

în funcţie de valoarea parametrului tip. Cuvântul ”interval” este un cuvânt rezervat, trebuind

scris ca atare. Parametrul tip poate avea una dintre valorile day, month respectiv year. Dac se

doreşte o sc dere, fie folosim valori negative pentru x, fie folosim funcţia pe care o prezent m

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’;

• date_sub(x,interval nr tip) – analog, produce o sc dere;

Page 99: HTML Php Mysql Pentru Incepatori-libre

101

d) Funcţii specifice MySQL:

• if(exp1,exp2,exp3) – dac exp1 este nenul (adev rat ) funcţia va întoarce exp2, în

caz contrar întorcând exp3.

Observaţie: Dac exp1 este de tip real, va fi convertit la întreg (prin eliminarea

zecimalelor). De exemplu, dac este 0.87, se va converti la 0, deci s-ar putea ca rezultatul s nu fie

cel scontat.

Ex: if(a>=0,”pozitiv nestrict”,”negativ strict”) – va întoarce, dup caz,

una dintre valorile de tip şir de caractere;

• ifnull(exp1,exp2) – dac exp1 este nenul , o întoarce chiar pe ea. Dac nu, o întoarce

pe exp2.

Ex: ifnull(’cici’,’mimi’) – întoarce ’cici’;

ifnull(null,’mimi’) – întoarce ’mimi’;

3.13.8. Coloane calculate prin intermediul unei interogări.

Am prezentat ceva mai înainte comanda select. Dup cum am v zut, aceast comand

permite vizualizarea informaţiei dintr-o anumit tabel a bazei de date.

Sintaxa general a comenzii este mult mai larg decât cele prezentate în paragraful 3.13.4.

Vom descoperi, pe parcurs, o serie de funcţionalit ţi ale sale.

Pentru moment, reţineţi faptul c operaţia de consultare a datelor unei tabele dintr-o baz de

date (mai precis, tot ceea ce realizeaz comanda select) se numeşte interogare.

O regul elementar în crearea şi exploatarea unei baze de date impune ca aceasta s nu

conţin informaţie redundant , adic informaţie care se poate deduce pe baza datelor deja existente.

Nerespectarea ei ar conduce la baze de date care ocup mult spaţiu, şi în care, din aceast cauz ,

prelucr rile devin mai lente.

Vom înv ţa s afiş m date (coloane) care rezult prin calcule, pe baza celor deja existente.

Acest lucru se realizeaz prin utilizarea unei expresii în cadrul comenzii select. În acest fel,

interogarea va afişa o nou coloan , având ca antet expresia respectiv şi pe post de conţinut

valoarea expresiei, aplicat pentru fiecare dintre liniile tabelei.

Dac numele din antet nu ne convine, am înv ţat deja s -l schimb m, cu ajutorul clauzei as,

care, dup am v zut, creeaz de fapt un alias pentru acea coloan .

Ex: Într-o tabel , cu numele prod, având informaţii despre nişte produse dintr-un magazin,

avem reţinute, pentru fiecare produs, denumirea, costul unitar şi num rul de buc ţi din produsul

respectiv. Coloanele deja existente au numele ’den’, ’cost_u’ şi ’cant’. Pentru a afişa pentru

fiecare produs toate aceste date, plus costul total, vom folosi urm toarea interogare:

select den,cost_u,cant,cost_u,cost_u*cant as cost_tot from prod;

Page 100: HTML Php Mysql Pentru Incepatori-libre

102

Iat cum vi se va afişa rezultatul acestei interog ri:

+----------+--------+------+--------+----------+ | den | cost_u | cant | cost_u | cost_tot | +----------+--------+------+--------+----------+ | minge | 3.25 | 4 | 3.25 | 13.00 | | lopatica | 2.10 | 5 | 2.10 | 10.50 | | galetusa | 4.50 | 3 | 4.50 | 13.50 | +----------+--------+------+--------+----------+

3.13.9. Valoarea NULL.

Dup cum am v zut în sintaxa comenzii care creeaz o tabel , dup fiecare coloan a tabelei

se pot trece nişte specificatori.

Ne vom ocupa pentru moment de specificatorii null respectiv not null. Primul, care

este şi implicit (dac nu-l trecem, se asum automat c acea coloan este de tip null), se refer la

faptul c în coloana respectiv pot s apar şi valori de tip null.

Astfel, dac într-o comand insert omitem o valoare pentru o anumit coloan , în acea

coloan se va trece automat valoarea null.

Al doilea specificator, not null, NU permite valori null în acea coloan . În acest caz,

dac omitem valoarea acelei coloane, în ea se va trece automat:

- 0 dac este de tip numeric;

- şirul vid dac acea coloan este de tip şir de caractere;

- primul element din şirul de stringuri, dac este de tip enum;

- mulţimea vid , dac acea coloan este de tip set.

Exemplu: cre m o tabel , în care punem dou coloane numerice, una în care permite valoarea

null, alta în care nu, si inser m în aceast tabel o linie în care specific m doar numele.

create table pers1(nume text,virsta int not null,greut int);

insert into pers1(nume) values(’Copaceanu’);

La analizarea valorilor existente prin-o interogare, constat m c s-au trecut urm toarele date:

+-----------+--------+-------+ | nume | virsta | greut | +-----------+--------+-------+ | Copaceanu | 0 | NULL | +-----------+--------+-------+

3.13.10. Valori implicite pentru coloanele unei tabele.

Un alt specificator pentru coloanele unei tabele, în cadrul comenzii de creare a tabelei este:

default valoare_implicită Acesta permite ca, la omiterea unei valori pentru un anumit câmp, atunci când inser m o

nou coloan la tabel , acel câmp s fie automat cu o valoare implicit . Acest specificator nu

funcţioneaz decât în cazul câmpurilor cu lungime fix . De exemplu, un câmp declarat char(10)

poate lua o valoare civil , pe când unul declarat text nu poate lua o astfel de valoare.

Page 101: HTML Php Mysql Pentru Incepatori-libre

103

Exemplu: cre m o tabel studenti în care trecem numele, virsta si starea civil . Ultimelor

dou câmpuri le vom da valorile implicite 19 respectiv ’necasatorit’:

create table studenti(nume text,virsta int default 19,

stare_civ char(20) default ’necasatorit’);

insert into studenti(nume) values(’ANTON Costel’);

insert into studenti(nume,virsta) values(’POP Mihai’,21);

Iat conţinutul tabelei în urma comenzilor de mai sus:

+--------------+--------+-------------+ | nume | virsta | stare_civ | +--------------+--------+-------------+ | ANTON Costel | 19 | necasatorit | | POP Mihai | 21 | necasatorit | +--------------+--------+-------------+

3.13.11. Cheie primară şi cheie unică.

• Cheia primară este constituit dintr-unul sau mai multe câmpuri şi trebuie s

îndeplineasc toate condiţiile de mai jos:

- Valorile reţinute de coloana care alc tuieşte cheia primar trebuie s fie distincte. În cazul

în care cheia este alc tuit din mai multe câmpuri, pentru a avea dou chei distincte este necesar ca

acestea (cheile) s fie diferite pentru cel puţin o coloan dintre ele. Tentativa de a ad uga în tabel o

înregistrare care are cheia primar identic cu alt înregistrare se soldeaz cu eroare iar ad ugarea,

evident, nu va mai avea loc;

- Câmpul (câmpurile) care alc tuieşte (alc tuiesc) cheia primar trebuie s aib o lungime

fix . De exemplu, nu putem avea o cheie primar de tip text (sau care s conţin un câmp de tip

text).

Principalul rol al cheii primare este s asigure accesul foarte rapid la o anumit înregistrare,

atunci când d m cheia. Trebuie s preciz m c , înregistr rile unei tabele se reţin în ordinea

introducerii lor. Atunci când, de exemplu, un câmp este declarat cheie primar , se construieşte o

tabel auxiliar , invizibil pentru utilizator, în care se trec valorile cheilor, în ordine cresc toare,

pentru fiecare cheie reţinându-se poziţia rândului (liniei) din tabel , care are acea cheie.

Practic, pornind de la o anumit cheie, în tabela invizibil se poate identifica foarte rapid

num rul de ordine (poziţia) al rândului cu acea cheie (se foloseşte c utarea binar ). De aici, accesul

la acel rând (înregistrare) este imediat.

Pentru a preciza faptul c o anumit coloan este cheie primar , atunci când definim tabela,

folosim specificatorul primary key, la fel ca în exemplu de mai jos:

create table elev(nr_matricol char(10) primary key,nume text);

Page 102: HTML Php Mysql Pentru Incepatori-libre

104

Pentru a preciza faptul c mai multe coloane particip la formarea cheii primare, atunci când

definim tabela, folosim specificatorul primary key(coloană1,...,coloanăk) dup ce am

terminat descrierea tuturor coloanelor, înainte de a închide paranteza final de la comanda create

table, ca în exemplu de mai jos:

create table elev(nume char(20),prenume char(20),i_tata char(4),

adresa text,primary key(nume,prenume,i_tata));

• Cheia unică este constituit dintr-un singur câmp. Se foloseşte atunci când, într-o

anumit coloan , fie ea participant la cheia primar , dorim s avem doar valori distincte.

La fel ca şi la cheia primar , putem avea cheie unic doar pentru coloanele de lungime fix

(deci nu putem avea, spre exemplu, cheie unic pentru o coloan de tip text).

Dac se încearc inserarea unei linii în tabel , cu o valoare care exist deja în cazul unei

coloane de tip cheie unic , se va semnala eroare şi inserarea nu va fi permis .

Specificatorul de cheie unic este unique key. El se foloseşte ca în exemplul de mai jos:

create table test(nr_matr char(10) primary key,

nume text,cnp char(13) unique key);

3.13.12. Coloane cu valori de tip autoincrementare.

De multe ori, în afara datelor deja existente într-o tabel , este util o coloan în care s

putem avea doar valori numerice distincte, de preferabil cu valori numerice cresc toare, începând

de la 1.

Acest lucru se poate rezolva prin specificatorul auto_increment pentru o anumit

coloan . Pentru a putea utiliza acest specificator, este necesar s fie îndeplinite urm toarele condiţii:

- coloana s fie de un tip întreg;

- coloana s fie format doar din valori distincte.

La ştergerea unei linii, numerotarea nu se reia, ci se continu de la ultimul num r atribuit în

tabel . Indiferent dac utilizatorul specific la un moment dat o valoare explicit (pe care o doreşte),

pentru acest câmp, restul numerot rii se va face începând de la cea mai mare valoare pe care a

atins-o vreodat acel câmp (chiar dac între timp, valoarea respectiv a fost ştears ) plus 1.

Exemplu: cre m o tabel în care definim o coloan de tipul auto_increment şi o alt

coloan în care trecem numele unor persoane:

create table test(id int unique key auto_increment,nume text); insert into test(nume) values(’cici’); insert into test(nume) values(’mimi’); insert into test(nume) values(’lola’);

Page 103: HTML Php Mysql Pentru Incepatori-libre

105

Iat conţinutul tabelei dup comenzile de mai sus:

+----+------+ | id | nume | +----+------+ | 1 | cici | | 2 | mimi | | 3 | lola | +----+------+

3.13.13. Sortarea datelor.

Afişarea datelor într-o anumit ordine se face tot cu ajutorul interog rilor: într-o interogare

ale c ror date dorim s le sort m, specific m, la sfârşitul comenzii, clauza:

order by expresie1[desc], expresie2[desc],...

specificatorul desc este folosit în cazul în care dorim ca sortarea s fie descresc toare.

Sortarea dup mai multe expresii are urm toare semnificaţie: dac pentru dou linii

expresie1 nu este suficient pentru a determina ordinea (deci pentru ambele, are aceeaşi valoare)

se consider mai departe expresie2. Dac nici expresie2 nu este suficient , se ia în considerare

expresie3, şi aşa mai departe.

Exemple:

select * from tabela order by nume; – se afişeaz toate datele din tabel , îns

sortate dup coloana nume

select * from tabela order by media desc,nume; – se afişeaz toate datele din

tabel , sortate descresc tor dup coloana ’media’. Dac la dou linii alte tabelei, coloana ’media’

are valori egale, ordinea va fi dat de valorile din coloana ’nume’.

• Indiferent de faptul c dorim o sortare sau nu, exist posibilitatea ca o interogare select s

afişeze doar anumite rânduri

Pentru aceasta se foloseşte clauza limit (în cazul în care în comanda select apare şi un

order by, clauza limit se va specifica dup ).

Sintaxa acesteia are una dintre urm toarele dou forme:

- limit n – din ceea ce s-ar afişa în mod normal, se afişeaz doar primele n linii;

- limit m,n – din ceea ce s-ar afişa în mod normal, se afişeaz doar începând de la

a m+1-a linie (prima linie este numerotat cu 0) un num r de n linii.

Page 104: HTML Php Mysql Pentru Incepatori-libre

106

3.13.14. Filtrarea datelor.

Se face tot cu ajutorul interog rii ’select’: prin specificarea clauzei where condiţie se

vor afişa doar acele linii ale tabelei pentru care condiţia este evaluat ca fiind adev rat .

Clauza poate fi utilizat în acelaşi timp cu clauza precendet (order by) care realizeaz

sortarea. În aceast situaţie, trebuie specificat mai întâi clauza where, şi abia apoi clauza order by.

Iat mai jos câteva exemple:

select * from tabela where nume like “a%”; – afişeaz din tabel , doar acele

linii pentru care numele începe cu litera a

select * from tabela where nume like “a%” order by media desc;

– afişeaz din tabel , doar acele linii pentru care numele începe cu litera a, în ordinea

descresc toare a mediilor.

Exemple:

select * from tabela order by nume limit 5; – în urma sort rii dup coloana

nume, se afişeaz doar primele 5 linii;

select * from tabela limit 1,3; – se afişeaz 3 linii din tabel începând de la

linia a 2-a.

3.13.15. Actualizarea datelor.

Prin actualizare a unei tabele înţelegem operaţia (operaţiile) prin care modific m fie datele

reţinute de aceasta, fie modificarea structurii, fie modificarea numelui tabelei.

a) pentru actualizarea datelor:

• pentru inserarea unei noi linii în tabel , se foloseşte instrucţiunea:

insert into nume_tabelă[(nume_coloană1,...,nume_coloanăn)] values(expr1,...,exprn)

funcţionalitatea acestei instrucţiuni a fost deja prezentat ;

• pentru inserarea de noi linii în tabel , linii care provin din datele altei tabele, se poate

realiza prin comanda:

insert into [distinct] nume_tabelă[(nume_coloană1,...,nume_coloanăn)] select ...

specificatorul distinct se foloseşte pentru a insera doar datele distincte (care nu apar deja în

tabela în care inser m) din tabela surs .

Page 105: HTML Php Mysql Pentru Incepatori-libre

107

b) pentru modificarea datelor se utilizeaz urm toarea instrucţiune:

update nume_tabelă set coloană1=exp1,..,coloanăn=expn [where condiţie] În urma execuţiei sale, pentru fiecare rând din tabel care îndeplineşte clauza where, se

actualizeaz coloanele indicate de set cu expresiile corespunz toare.

Observaţie (!): în absenţa clauzei where vor fi modificate toate rândurile tabelei.

c) pentru ştergerea uneia sau a mai multor linii ale unei tabel se utilizeaz instrucţiunea:

delete from nume_tabelă where [conditie]; Observaţie (!): în absenţa clauzei where vor fi şterse TOATE (!) liniile tabelei;

d) pentru redenumirea unei tabele:

rename table nume_vechi to nume_nou;

e) pentru ştergerea unei coloane, chiar dac aceasta conţine date:

alter table nume_tabelă drop column nume_coloană; f) pentru adăugarea (inserarea) unei coloane noi, cu un anumit tip de date, se utilizeaz

instrucţiunea:

alter table nume_tabelă add nume_coloană_nouă tip_coloană nouă [after coloană_existentă]sau[first]

dac nu este prezent vreuna dintre clauzele after sau first, coloana cea nou se va

ad uga la sfârşit. Dac este prezent cel puţin vreuna, atunci coloana cea nou se va insera dup

coloana identificat de coloană_existentă dac folosim clauza after... respectiv la început

(înainte de toate celelalte coloane) dac folosim clauza first.

3.13.16. Funcţii agregate.

Toate exemplele de pân acum au avut ca operanzi doar câmpurile unui acelaşi rând. În

practic , este foarte adesea necesar s putem efectua calcule şi cu valorile (toate sau doar o parte)

reţinute de o coloan .

Pentru astfel de calcule se utilizeaz aşa-numitele ”funcţii agregate”. În cele ce urmeaz

vom prezenta aceste funcţii, iar pentru exemplificare vom utiliza urm toarea 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 | +------------------+------+------+------+

Page 106: HTML Php Mysql Pentru Incepatori-libre

108

Iat o trecere în revist a funcţiilor agregate:

• count() – sub forma count(*) determin num rul total de linii ale tabelei. Sub forma

count(nume_coloană) num r câte dintre valorile de pe acea coloan nu sunt null;

• min(nume_coloană) – determin cea mai mic valoare din coloan , ignorând valorile

care sunt egale cu null;

• max(nume_coloană) – determin cea mai mare valoare din coloan , ignorând valorile

care sunt egale cu null;

• sum(nume_coloană) – determin suma tuturor valorilor din coloan , ignorând valorile

care sunt egale cu null;

• avg(nume_coloană) – determin media aritmetic a tuturor valorilor din coloan ,

ignorând valorile care sunt egale cu null;

Exemple:

–select count(*) as numar_elevi from elevi; – afişeaz num rul total de elevi din

tabel ; în cazul nostru va fi 5.

–select count(info) as numar_note_info from elevi; – afişeaz num rul total de

valori nenule din coloana info; în cazul nostru va fi 4.

–select avg(info) as medie_note_info from elevi; – afişeaz media tuturor notelor

nenule din coloana info; în cazul nostru va fi 7.50.

–select count(engl) as nota10 from elevi where engl=10; – afişeaz câte note de

10 sunt în coloana engl;

3.13.17. Subinterogări.

Reprezint mecanismul prin care rezultatul întors de o interogare poate fi folosi mai departe,

pentru a efectua o nou interogare.

Distingem urm toarele dou cazuri:

a) Interogarea subordonată întoarce o singură valoare (deci o coloan cu un singur rând):

Interogarea care întoarce valoarea se scrie inclus între paranteze rotunde – din acest

moment ea se comport ca şi cum, în acel loc, din punct de vedere sintactic, am avea o singur

valoare.

Exemplu: pe tabela anterioar , s afiş m toţi elevii care au nota maxim la englez . În

primul rând, va trebui s determin m printr-o subinterogare, care este nota maxim la englez , iar

pe baza valorii obţinute s filtr m datele din tabela cu toţi elevii. Pentru o mai bun evidenţiere, am

colorat cu verde subinterogarea care întoarce nota maxim de la englez :

select * from elevi where engl=(select max(engl) from elevi);

Page 107: HTML Php Mysql Pentru Incepatori-libre

109

b) Interogarea subordonată întoarce o tabelă şi dorim ca în continuare, s manipul m

datele din aceast tabel : În acest caz, tabela returnat de interogarea subordonat trebuie s

primeasc un nume (un alias). Acesta se specific tot cu ajutorul clauzei as. Trebuie de asemenea

inclus între paranteze rotunde. Câmpurile tabelei întoarse de subinterogare au numele exact ca în

antetul care s-ar afişa pentru aceast subinterogare.

Atunci când sunt folosite de c tre interogarea care o subordoneaz , câmpurile interog rii

subordonate trebuie adresate prin numele alias-ului, urmat de caracterul ’.’ şi apoi de numele

câmpului din subinterogare.

Exemplu: din tabela cu elevii, dorim s afiş m, doar pentru elevii care au note completate la toate cele 3 materii, o list cu numele şi media celor 3 materii, în ordine descresc toare a mediilor. Dac am dori s afiş m o tabel ce conţine numele şi media general doar de la acei elevi

care au trecute toate cele 3 note, am scrie interogarea urm toare (ne reamintim c , dac într-o sum ,

cel puţin un termen este null, atunci toat suma este null):

select nume,(mate+engl+info)/3 as media from elevi

where mate+engl+info is not null;

Aceasta va juca rolul subinterog rii. Coloanele sale sunt nume respectiv media. Remarcaţi

faptul c , în cadrul interog rii pe care ne propunem s-o realiz m aceast tabel va primi alias-ul

medii, iar coloanele sale pot fi accesate prin expresiile medii.nume respectiv medii.media:

select * from (select nume,(mate+engl+info)/3 as media from elevi

where mate+engl+info is not null) as medii

order by medii.media desc;

3.13.18. Gruparea datelor.

Datele dintr-o tabel pot fi grupate în funcţie de valorile dintr-o anumit coloan . Astfel,

toate valorile egale dintr-o anumit coloan vor forma un grup. Prelucr rile datelor din cadrul unui

grup se pot face cu ajutorul funcţiilor agregate, aceste acţionând datelor din fiecare grup.

Gruparea efectiv se realizeaz cu clauza group by, aplicat de comenzii select. În cazul

în care dorim filtrarea interog rii rezultate în urma unei grup ri, nu se mai foloseşte clauza where

(va genera eroare!) ci exist o nou clauz , having.

Datele din tabela rezultat în urma grup rii vor fi sortate dup coloana care realizeaz

gruparea.

Sintaxa general a comenzii select în cazul unei grup ri este:

select exp1,exp2,... from tabelă group by exp_gr1,exp_gr2,.... [having condiţie_filtrare];

Page 108: HTML Php Mysql Pentru Incepatori-libre

110

Grup rile se constituie ierarhic dup exp_gr1, exp_gr2, etc. Practic, grupurile mari sunt

date de valorile egale pentru exp_gr1. În cadrul acestora, se fac subgrupurile dup valorile egale

ale lui exp_gr2, etc.

Printre expresiile din select putem avea:

- nume de câmpuri (sau expresii în funcţie de acestea): în acest caz se va folosi valoarea

primei linii din fiecare grup;

- funcţii agregate: acestea vor acţiona asupra tuturor valorilor coloanei din grup asupra

c rora sunt aplicate;

- dac în loc de exp1,exp2,... folosim * se va afişa prima linie din fiecare grup.

Exemple: Consider m urm toarea tabel , numit pers, asupra c reia vom aplica mai multe

interog ri de grupare:

+------+------+--------+ | nume | jud | scoala | +------+------+--------+ | dora | bv | sc2 | | bebe | cj | sc2 | | bubu | cj | sc2 | | fifi | bv | sc3 | | lala | bv | sc2 | | gogu | cj | sc1 | | fefe | bv | sc2 | | gigi | bv | sc1 | | mimi | bv | sc2 | | dede | cj | sc1 | | lola | bv | sc1 | | coco | bv | sc3 | | calu | cj | sc1 | | cici | bv | sc1 | +------+------+--------+

select jud,count(jud) as total_judet from pers group by jud;

– grupeaz dup judeţ, afişând pentru fiecare judeţ indicativul s u, respectiv num rul total

de persoane provenind din acel judeţ: +------+-------------+ | jud | total_judet | +------+-------------+ | bv | 9 | | cj | 5 | +------+-------------+

select jud,scoala,count(scoala) as total_scoala from pers

group by jud,scoala; – grupeaz dup judeţ, în fiecare judeţ apoi dup numele şcolii,

afişând pentru fiecare grup obţinut numele judeţului, numele şcolii şi num rul de elevi din acea

şcoal :

+------+--------+--------------+ | jud | scoala | total_scoala | +------+--------+--------------+ | bv | sc1 | 3 | | bv | sc2 | 4 | | bv | sc3 | 2 | | cj | sc1 | 3 | | cj | sc2 | 2 | +------+--------+--------------+

Page 109: HTML Php Mysql Pentru Incepatori-libre

111

Dac din interogarea de mai sus dorim s afiş m doar acele şcoli pentru care num rul de elevi este

de cel puţin 3, ad ug m clauza having interog rii de mai sus:

select jud,scoala,count(scoala) as total_scoala from pers

group by jud,scoala having total_scoala>=3;

Rezultatul afişat va fi urm torul:

+------+--------+--------------+ | jud | scoala | total_scoala | +------+--------+--------------+ | bv | sc1 | 3 | | bv | sc2 | 4 | | cj | sc1 | 3 | +------+--------+--------------+

3.13.19. Uniuni de tabele.

Un punct de maxim importanţ şi eficienţ în utilizarea bazelor de date este dat de uniunea

de tabele. Uniunea este alc tuit din dou sau mai multe tabele între care exist o leg tur . De cele

mai multe ori, leg tura este dat de valorile existente în câte o coloan a fiec rei tabel din uniune.

Pentru tabelele care alc tuiesc uniunea se pot realiza alias-uri de nume, sub forma nume_tabel as

alias_nume, introduse în clauza from. Alias-urile pot fi utilizate în orice parte a instrucţiunii select.

Ca şi la subinterog ri, adresarea unei coloane a unei tabele se va face sub forma

nume_alias.nume_coloan .

E recomandat s asigur m nume scurte pentru alias-urile tabelelor (a, b, pers, elev,...).

Un alt avantaj al alias-urilor este c putem realiza auto-uniuni, în cadrul c rora aceeaşi

tabel poate avea alias-uri diferite.

a) Uniuni de tip produs cartezian: se realizeaz printr-un select în care se trec toate

câmpurile pe care dorim s le obţinem, din cadrul ambelor tabele, iar la clauza from se trec ambele

tabele, fiecare dintre ele putând avea definit şi un alias. Clauza where poate filtra doar acele perechi

de linii (din ambele tabele) pe care le dorim. În absenţa clauzei where, se vor genera toate

combinaţiile (produs cartezian) de linii din prima tabel , cu linii din a doua tabel .

Comanda poate fi generalizat şi pentru mai mult de dou tabele.

Sintaxa:

select exp1,exp2 ... from tabelă1 [as alias1],tabelă2 [as alias2] [where condiţie]; Evident, exp1, exp2, ... vor trebui s conţin numele coloanelor, simplu, dac nu exist confuzii

(coloane care au în ambele tabele acelaşi nume) sau numele alias-urilor urmate de punct şi de

numele coloanelor în caz contrar.

Page 110: HTML Php Mysql Pentru Incepatori-libre

112

mysql> select * from actori;+------+-----------------+ | cod | nume | +------+-----------------+ | 101 | Tom Hanks | | 105 | Dustin Hoffman | | 107 | Roberto Benigni | | 110 | Jessica Lange | +------+-----------------+

+-----------------+-----------+------+-----------------+ | 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 | +-----------------+-----------+------+-----------------+

+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | Tootsie | 105 | 105 | Dustin Hoffman | | La vita e bella | 107 | 107 | Roberto Benigni | | Tootsie | 110 | 110 | Jessica Lange | +-----------------+-----------+------+-----------------+

Exemplu: fie urm toarele dou tabele, una cu numele unor actori, fiecare actor având asociat un

cod, alta cu numele unor filme, fiecare film având trecut în dreptul s u codul actorilor care joac în

acel film:

Prin urm toarea interogare realiz m un produs cartezian al celor dou :

select f.titlu,f.cod_actor,a.cod,a.nume from filme as f,actori as a;

(putem folosi şi urm toarele forme:

1) folosim operatorul * pentru a specifica toate coloanele din fiecare tabel :

select f.*,a.* from filme as f,actori as a;

2) sau şi mai simplu, pentru c nu exist coloane care s se confunde (toate au nume diferite):

select * from filme,actori;

)

Rezultatul este urm torul (observaţi cum se ia fiecare film cu fiecare actor):

Dac dorim s se afişeze doar datele care sunt în corespondeţ (acest lucru este f cut,

evident, prin câmpurile numerice cod_actor, respectiv cod) folosim urm toarea interogare:

select f.*,a.* from filme as f,actori as a where f.cod_actor=a.cod;

(sau, şi mai simplu: select * from filme,actori where cod_actor=cod;)

Rezultatul va fi, conform aştept rilor, în forma urm toare:

mysql> select * from filme; +-----------------+-----------+ | titlu | cod_actor | +-----------------+-----------+ | Tootsie | 105 | | Tootsie | 110 | | La vita e bella | 107 | +-----------------+-----------+

Page 111: HTML Php Mysql Pentru Incepatori-libre

113

b) Uniuni de tip inner join:

Se aplic atunci când uniunea se realizeaz doar între dou tabele şi dorim ca din ambele

tabele s fie afişate doar acele linii pentru care condiţia de leg tur este satisf cut . Sintaxa

comenzii:

select exp1,exp2,.. from tabelă1 [as alias1] inner join tabelă2 [as alias2] on condiţie; Ca şi mai înainte, dac exist coloane care se numesc la fel în ambele tabele, vom folosi alias-uri.

Exemplu: acelaşi lucru ca în exemplul anterior se poate realiza cu urm toarea interogare:

select * from filme as f inner join actori as a on f.cod_actor=a.cod;

(sau, mai simplu: select * from filme join actori on cod_actor=cod;)

Obs: cuvântul cheie ”inner” poate fi omis: prin specificarea doar a clauzei join se subînţelege

c , de fapt, este vorba de un ”inner join”;

c) Uniuni de tip left outer join:

Se aplic atunci când uniunea se realizeaz între dou tabele şi dorim ca din prima tabel s

fie incluse absolut toate liniile iar din a doua tabel doar acele linii care îndeplinesc condiţia de la

clauza on. La acele linii din prima tabel care nu au corespondent în a doua tabel , în dreptul

câmpurilor acesteia din urm se va trece valoarea null. Sintaxa comenzii este:

select exp1,exp2,... from tabelă1 [as alias1] left outer join tabelă2 [as alias2] on condiţie; În exemplu nostru, o astfel de interogare în care prima tabel este cea cu filme iar a doua cu

actori, va afişa toate filmele, inclusiv cele pentru care nu am trecut actorii corespondenţi în cea ce-a

doua tabel . Pentru a face exemplul cât mai ilustrativ, inser m urm toarea linie în tabela cu filme:

insert into filme(titlu) values('Forest Gump');

Dup care lans m urm toarea interogare de tipul left outer join:

select * from filme left outer join actori on cod_actor=cod;

Obs: Cuvântul ”outer” poate fi omis: prezenţa lui ”left” implic o uniune de tip outer.

Iat rezultatul:

+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | Tootsie | 105 | 105 | Dustin Hoffman | | Tootsie | 110 | 110 | Jessica Lange | | La vita e bella | 107 | 107 | Roberto Benigni | | Forest Gump | NULL | NULL | NULL | +-----------------+-----------+------+-----------------+ d) Uniuni de tip right outer join:

Dup cum e de aşteptat, prin analogie cu situaţia precedent , se aplic atunci când uniunea

se realizeaz între dou tabele şi dorim ca din a doua tabel s fie incluse absolut toate liniile, iar

din prima doar acele linii pentru care condiţia de la clauza on este îndeplinit . La acele linii din a

Page 112: HTML Php Mysql Pentru Incepatori-libre

114

doua tabel care nu au corespondent în prima tabel , în dreptul câmpurilor acesteia din urm se va

trece valoarea null. Sintaxa comenzii este:

select exp1,exp2,... from tabelă1 [as alias1] right outer join tabelă2 [as alias2] on condiţie; În exemplu nostru, o astfel de interogare în care prima tabel este cea cu filme iar a doua cu

actori, va afişa toţi actorii, inclusiv cei pe care nu i-am asociat la vreun film, şi doar acele filme

c tre care exist leg tur din tabela cu actori.

Exemplu:

select * from filme right outer join actori on cod_actor=cod;

Iat rezultatul:

+-----------------+-----------+------+-----------------+ | titlu | cod_actor | cod | nume | +-----------------+-----------+------+-----------------+ | NULL | NULL | 101 | Tom Hanks | | Tootsie | 105 | 105 | Dustin Hoffman | | La vita e bella | 107 | 107 | Roberto Benigni | | Tootsie | 110 | 110 | Jessica Lange | +-----------------+-----------+------+-----------------+

Obs: Cuvântul ”outer” poate fi omis: prezenţa lui ”right” implic o uniune de tip outer.

e) Auto-uniuni:

Se pot face uniuni în care ambele tabele sunt, de fapt, unul şi acelaşi, îns au alias-uri

diferite şi se consider unite printr-o coloan .

Exemplu: s consider m urm toarea tabel , cu care am lucrat într-unul din exemplele

paragrafului anterior 3.13.5:

mysql> select * from pictori; +------------------+------------------+ | nume | curent | +------------------+------------------+ | Gustave Klimt | art nouveau | | Vincent Van Gogh | postimpresionism | | Alphonse Mucha | art nouveau | | Auguste Renoir | impresionism | | Rene Magritte | suprarealism | | Tiziano Vecellio | | +------------------+------------------+

Pentru a afişa toţi pictorii care aparţin aceluiaşi curent c ruia îi aparţine şi Gustav Klimt

putem proceda în felul urm tor (! atenţie, exemplu este doar didactic, din punct de vedere practic

NU se procedeaz în acest fel):

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';

Page 113: HTML Php Mysql Pentru Incepatori-libre

115

3.13.20. Exploatarea bazelor de date MySQL prin intermediul limbajului PHP.

Pentru a face funcţional suportul de conectivitate a limbajului PHP c tre bazele de date

MySQL, este necesar utilizarea bibliotecii mysql. În cazul pachetului XAMPP, aceasta este

instalat şi activat în mod implicit. În cazul altor distribuţii, acest lucru trebuie f cut manual.

• În primul rând, din interiorul unui script PHP trebuie realizat conectarea la baza de date.

Pentru acest lucru, avem nevoie de adresa IP a server-ului MySQL (în cazul nostru, deoarece

utiliz m o configuraţie standard, server-ul se afl pe calculatorul local, deci aceast adres este

’localhost’), numele unui utilizator şi parola cu care acest utilizator se conecteaz la baza de

date.

În cazul nostru, vom asuma faptul c utilzatorul are numele ’utilizator’ iar parola sa este

’parola’ (aşa cum l-am creat în paragraful 3.3.12).

Conectarea efectiv se face cu ajutorul instrucţiunii:

$resursă=mysql_connect(”localhost”, ”utilizator”, ”parola”); Variabila $resursă va fi cea prin care, în continuare, ne vom putea referi la conexiunea creat .

Dac aceasta nu reuşeşte din diferite motive (nume utilzator sau parola incorecte, server-ul MySQL

nu este pornit, etc.) variabila $resursă va avea valoarea null.

• Selectarea unei baze de date, o dat ce conexiunea a fost creat , pentru a plasa comenzi în

aceast baz de date, este:

mysql_select_db(nume_bază_date); Aceasta întoarce o valoare diferit de 0 dac selectarea a reuşit, sau 0 în caz contrar;

• Plasarea unei comenzi (interog ri) asupra bazei de date selectate se face prin instrucţiunea:

$resursă1=mysql_query(string_ce_conţine_comanda_MySQL); Dac interogarea (comanda) a funcţionat corect, funcţia va întoarce o valoare diferit de 0. În caz

contrar, întoarce valoarea 0.

Variabila $resursă1 este cea care va permite, în continuare, obţinerea rezultatului efectiv

al interog rii.

În cazul oric rei erori, perechea de funcţii mysql_errno(); respectiv mysql_error();

ne întorc codul (num rul) ultimei erori generate, respectiv mesajul asociat acesteia.

• Închiderea conexiunii c tre baza de date MySQL se face prin comanda:

mysql_close(resursă_conexiune); E preferabil s închidem conexiunile deschise prin mysql_connect la sfârşitul script-ului.

• Obţinerea datelor întoarse de interogare se face prin intermediul resursei întoarse de

comanda mysql_query. Iat funcţiile cele mai folosite:

Page 114: HTML Php Mysql Pentru Incepatori-libre

116

- mysql_num_rows(resursa) – returneaz num rul de linii (rânduri) ale tabelei rezultate

în urma interog rii;

- mysql_num_fields(resursa) – returneaz num rul de câmpuri (coloane) ale tabelei

rezultate în urma interog rii;

- mysql_field_name(resursa,k) – returneaz numele câmpului (coloanei) al k-lea al

tabelei. Coloanele sunt numerotate de la 0;

Exemplu: urm torul script PHP va realiza o conectare la baza de date MySQL, lansând o

interogare de afişare a tuturor datelor din tabela elevi, din exemplul 3.13.16. În urma acestei

interog ri va afişa datele obţinute cu ajutorul funcţiilor de mai sus:

apl085.php:

<?php $l=mysql_connect('localhost','utilizator','parola'); mysql_select_db('lucru'); $r=mysql_query('select * from elevi'); $n=mysql_num_rows($r); $m=mysql_num_fields($r); echo 'Nr. total de linii intoarse de interogare: ',$n,'<br>'; echo 'Nr. total de coloane intoarse de interogare: ',$n,'<br>'; echo 'Numele coloanelor sunt urmatoarele:<br>'; for($j=0;$j<$m;$j++) echo 'Coloana de la indicele ',$j,' are numele: <b>', mysql_field_name($r,$j),'</b><br>'; mysql_close($l); ?>

Iat rezultatul afişat de c tre script:

- mysql_fetch_array(resursă) – întoarce rândul (linia) curent , sub forma unui şir

(vector) din interogarea specificat de resurs , mutând pointerul intern pe urm toarea linie (rând) al

interog rii. Dac liniile interog rii s-au terminat, va întoarce fals.

În şirul întors, putem folosi pe post de indici atât numele coloanelor, cât şi valori numerice

cuprinse între 0 şi num rul de coloane minus 1.

Modelul general de aplicare al acestei instrucţiuni este pe o repetitiv de tip while, în care

atribuim unui vector valoarea întoars de funcţia mysq_fetch_row direct în condiţia de ciclare a

repetitivei:

while($a=msql_fetch_row($resursa)) {...prelucrăm elementele vectorului $a, care ne dau linia curentă a interogării...}

Page 115: HTML Php Mysql Pentru Incepatori-libre

117

Iat modul în care putem obţine, într-o form prezentabil , toate datele conţinute de tabela

din exemplul anterior, afişând inclusiv o linie de antet cu numele coloanelor tabelei:

apl086.php:

<?php $l=mysql_connect('localhost','utilizator','parola'); mysql_select_db('lucru'); $r=mysql_query('select * from elevi'); $m=mysql_num_fields($r); echo '<table border="1" cellspacing="0" cellpadding="10">'; //pregătim afişarea într-un tabel echo '<tr>'; for($j=0;$j<$m;$j++)//afişăm numele coloanelor în celule de tipul th echo '<th align="center">',mysql_field_name($r,$j); while($a=mysql_fetch_row($r)) { echo '<tr>'; for($j=0;$j<$m;$j++) { echo '<td>'; if($a[$j]) echo $a[$j];//în locul valorilor vide afişăm un spaţiu else echo '&nbsp;';//altfel, tabelul HTML va arăta urât } } echo '</table>'; mysql_close($l); ?>

Iat rezultatul afişat de c tre script în browser:

Page 116: HTML Php Mysql Pentru Incepatori-libre

3.13.21. ELEMENTELE DE BAZ ALE LIMBAJULUI SQL*PLUS

1. DESPRE LIMBAJ

În 1974 a fost lansat proiectul System/R de către firma IBM. Tot în

acest an a apărut limbajul structurat de programare SEQUEL (Structured English as Query Language) autori fiind Chamberlin şi Boyce.

În 1976 apare un nou limbaj SEQUEL 2 care a fost declarat limbajul de interogare al SGBD System/R. Denumirea limbajului este schimbată de Chamberlin în SQL (Structured Query Language) în anul 1980.

Ulterior limbajul a fost perfec ionat fiind considerat cel mai răspândit limbaj de interogare a bazelor de date rela ionale.

Institutul Na ional pentru Standarde în anul 1982 a lansat un proiect de lucru pentru standardizarea limbajelor de interogare care a fost finalizat în 1986 apărând standardul ANSI SQL-86. Acesta defineşte comenzile de bază ale SQL, dar nu con ine partea de actualizare şi acordarea drepturilor de acces la o bază de date.

Prin revizuire acest limbaj apare în 1989 SQL-1 ca fiind limbajul fundamental al SGBD rala ionale.

În 1992 apare versiunea SQL-2 care oferă noi facilită i cum ar fi: jonc iune externă, implementarea restric iei referen iale, modificarea schemei bazei de date, etc.

Cel mai recent standard este SQL-3 care a fost lansat în anul 1999, acesta este considerat un limbaj complet în vederea definirii şi gestiunii obiectelor complexe. Se consideră că prin publicarea standardului propus în acest an a fost depăşită bariera rela ionalului, el fiind mult mai mult decât un instrument de consultare a bazelor de date.

2. CONCEPTE UTILIZATE

SQL*PLUS este un limbaj neprocedural şi operează asupra datelor normalizate. Conceptele necesare a fi cunoscute pentru lucrul cu acest limbaj sunt: tabelă, cheie primară, coloană, rînd, viziune, index, sinonim, cluster, bază de date rela ională, comanda, blocul, cererea,raportul etc.

Tabela sau relaţia este un ansamblu format din n coloane (atribute/subansambluri) şi m rânduri (tupluri/linii) care respectă următoarele condi ii minime: nu con ine date la nivel agregat (valorile aflate la intersec ia liniilor cu coloanele să fie la un nivel elementar); liniile sunt distincte unele fa ă de altele; nu con ine coloane repetitive în descriere.

Page 117: HTML Php Mysql Pentru Incepatori-libre

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.

Rândul/tuplul/linia este format din valorile coloanelor ce se referă la o entitate a tabelei.

Baza de date relaţională este un ansamblu de tabele normalizate, grupate în jurul unui subiect, în principiu, bine definit. Într-o bază de date rela ională, entită ile şi legăturile sunt transpuse în tabele.

Viziunea este o tabela logică şi reprezintă o fereastră la date, dintr-una 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 indecşi oricînd, fără ca datele memorate sau aplica iile scrise să fie afectate.

Pentru realizarea unor opera ii 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 rândurilor uneia sau mai multor tabele. Această grupare măreşte viteza de execu ie a unor opera ii consumatoare de timp.

Comanda este o instruc iune emisă din SQL*Plus către o bază de date Oracle.

Blocul reprezintă un grup de instruc iuni SQL şi PL/SQL. Cererea este o comanda SQL (SELECT) care regăseşte date din

baza de date. Rezultatul cererii îl formează datele regăsite 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 con ine apostrofuri. Cu atît mai pu in, un nume utilizat într-o comandă nu va fi introdus între apostrofuri. Literele mici şi mari sunt echivalente (nu se face distinc ia între literele mici şi mari). Un nume trebuie să înceapă cu o literă, să con ină numai anumite caractere (A-Z, 0-9, $, #, @, -), să nu duplice numele unui alt obiect de acelaşi tip şi să difere de un cuvânt 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.

Page 118: HTML Php Mysql Pentru Incepatori-libre

3. FUNC II SQL

Func iile se apelează prin sintaxa: Nume_funcţie (argument1, argument2, …)

Func iile SQL sunt cu un singur rând sau scalare (returnează un singur rezultat pentru fiecare rând al cererii emise asupra unei tabele sau vederi) şi cu mai multe rânduri numite func ii grup sau agregate (returnează un singur rezultat pentru un grup de rânduri regăsite dintr-o tabelă sau vedere).

A. Funcţiile SQL cu un singur rând (funcţiile scalare) Acestea sunt func ii: numerice, caracter, de tip DATE, de conversie

şi alte func ii. 1) Funcţiile numerice acceptă valori numerice şi returnează

rezultate numerice şi sunt prezentate în tabelul 3.1. Tabela DUAL folosită în exemple, este creată automat de către Oracle odată cu crearea dic ionarului 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 rând cu valoarea 'X'. Selec iile din tabela DUAL sunt utile pentru calcularea unor expresii constante cu comanda SQL SELECT. Din cauză că are un singur rând, constanta este returnată o singură dată. Alternativ pentru aceeaşi activitate se poate selecta o constantă, pseudocoloană sau o expresie din orice tabelă. Tabelul 3.1 Funcţiile numerice Func ia Rolul func iei Exemple ABS(n) Returnează valoarea absolută

a numărului n. SELECT ABS(-15) "Absolut" FROM DUAL; Absolut ---------- 15

ACOS(n) Arc cosinus de n. Rezultatul este exprimat în radiani.

SELECT COS(.3)"Arc_Cosinus" FROM DUAL; Arc cosinus ---------- 1.26610367

ASIN(n) Arc sinus de n. SELECT ASIN(.3) "Arc_Sinus" FROM DUAL; Arc_Sinus ---------- .304692654

ATAN Arc tangentă de n. SELECT ATAN(.3) "Arc_Tangentă" FROM DUAL;

Page 119: HTML Php Mysql Pentru Incepatori-libre

Arc_Tangentă ---------- .291456794

ATAN2 Arc tangentă de n şi m sau arc tangentă de n/m. Deci ATAN2(n,m) este identic cu ATAN2(n/m).

SELECT ATAN2(.3,.2) Arc_Tangentă2" FROM DUAL; Arc_Tangentă2 ------------ .982793723

CEIL(n) Returează numărul întreg cel mai mic care este mai mare sau egal cu n.

SELECT CEIL(15.7) "NUM R" FROM DUAL; NUM R ---------- 16

COS(n) Cosinus de n. SELECT COS(180 * 3.14/180) "Cosinus de 180 grade" FROM DUAL; Cosinus de 180 grade --------------------- -1

COSH(n) Cosinus hiperbolic de n. SELECT COSH(0) "Cosinus hiperbolic de 0" FROM DUAL; Cosinus hiperbolic de 0 ---------------------- 1

EXP(n) Returnează o valoare egală cu e ridicat la puterea n, unde e = 2.71828183.

SELECT EXP(4) "e la puterea 4" FROM DUAL; e la puterea 4 ------------------ 54.59815

FLOOR(n) Returnează numărul cel mai mare care este mai mic sau egal cu n.

SELECT FLOOR(15.7) "Floor" FROM DUAL; Floor ---------- 15

LN(n) Returnează logaritmul natural de n, unde n > 0.

SELECT LN(95) "Logaritm natural de 95" FROM DUAL; Logaritm natural de 95 ----------------- 4.55387689

LOG(m,n) Returnează logaritm în baza m de n.(LOGmn)

SELECT LOG(10,100) "Log în baza 10 de 100" FROM DUAL; Log în baza 10 de 100 ------------------ 2

MOD(m,n) Returnează restul împărţirii SELECT MOD(11,4) "Modulo 4"

Page 120: HTML Php Mysql Pentru Incepatori-libre

lui m la n. Dacă n este 0 returnează valoarea m. Această funcţie se comportă diferit faţă de funcţia modulo clasică din matematică, atunci când m este negativ. Având în vedere semnificaţia funcţiei MOD funcţia modulo clasică din matematică se poate exprima cu formula : m - n * FLOOR(m/n)

FROM DUAL; Modulo 4 ---------- 3 2.

POWER (n,m) Returnează o valoare egală cu m la puterea n.

SELECT POWER(3,2) "Putere" FROM DUAL; Putere ---------- 9

ROUND (n[,m])

Returnează n rotunjit la un număr de m yecimale. Dacă m este omis se elimină zecimalele, iar dacă este negativ se face rotunjirea numărului din dreapta virgulei zecimale, după regula: m = -1 rotunjire la nivel de zeci, m = -2 rotunjire la nivel de sute şi aşa mai departe.

SELECT ROUND(15.193,1) "Rotunjire" FROM DUAL; Rotunjire ---------- 15.2 SELECT ROUND(15.193,-1) "Rotunjire " FROM DUAL; Rotunjire ---------- 20 Aici rotunjirea s-a făcut la nivel de zeci, căci scala negativă înseamnă rotunjirea valorii din drepta semnului zecimal, iar scala pozitivă înseamnă rotunjirea numărului din dreapta semnului zecimal la ordinul de mărime cât este scala.

SIGN(n) Returnează semnul numărului n, după regula: n<0 returnează valoarea -1; n=0 returnează valoarea 0; n>0 returnează valoarea +1.

SELECT SIGN(-15) "Semn" FROM DUAL; Semn ---------- -1

SIN(n) Returnează sinus de n în radiani.

SELECT SIN(30 * 3.14159265359/180) "Sinus de 30 de grade" FROM DUAL; Sinus de 30 de grade ------------------ .5

SINH Returnează sinus hiperbolic SELECT SINH(1) " Sinus hiperbolic de

Page 121: HTML Php Mysql Pentru Incepatori-libre

de n. 1" FROM DUAL; Sinus hiperbolic de 1 -------------------- 1.17520119

SQRT(n) Returnează rădăcină pătrată din n.

SELECT SQRT(26) "Rădăcină pătrată" FROM DUAL; Rădăcină pătrată ----------- 5.09901951

TAN(n) Returnează tangentă de n. SELECT TAN(135 * 3.14/180) "Tangentă de 135 grade" FROM DUAL; Tangentă de 135 grade ---------------------- - 1

TANH(n) Returnează tangentă hiperbolică de n.

SELECT TANH(.5) " Tangentă hiperbolic de 5" FROM DUAL; Tangentă hiperbolic de 5 ------------------------ .462117157

TRUNC (n,m) Returnează valoarea lui n trunchiată la un număr de zecimale egal cu m. Dacă m este omis se elimină valorile zecimale, iar dacă ia o valoare negativă trunchiere se aplică părţii din stânga virgulei zecimale, după regula: m = -1 rotunjire la nivel de zeci, m= -2 rotunjire la nivel de sute şi aşa mai departe.

SELECT TRUNC(15.79,-1) "Trunc" FROM DUAL; Trunc ---------- 10

2) Funcţiile caracter acceptă la intrare valori caracter şi furnizează

valori caracter sau numerice. În tabelul 3.2 sunt prezentate func iile caracter care returnează caractere, iar în tabelul 3.3 func iile caracter care returnează valori numerice. Valorile caracter returnate sunt de tipul VARCHAR2 dacă nu se specifică altfel. Tabelul 3.2 Funcţiile caracter care returnează caractere Func ia Rolul func iei Exemple CHR(n) Returnează caracterul care

are valoarea binară n. SELECT CHR(67)||CHR(65)||CHR(84) "Caractere" FROM DUAL; Caractere

Page 122: HTML Php Mysql Pentru Incepatori-libre

--- CAT

CONCAT (c1,c2)

Returnează o valoare formată din concatenarea caracterului c1 cu caracterul c2.

SELECT CONCAT( CONCAT (nume, ' este '), funcţie) "Funcţie" FROM tab1 WHERE codfuncţie = 7000; Funcţie ----------------- Popescu este PROGRAMATOR

INITCAP ('şir')

Returnează şirul de caractere 'şir' astfel încât fiecare cuvânt al şirului are prima literă în format literă mare.

SELECT INITCAP('cuvânt1 cuvânt2') "Litere mari" FROM DUAL; Litere mari --------- Cuvânt1 Cuvânt2

LOWER ('şir') Returnează şirul de caractere 'şir' astfel încât toate literele şirului sunt de format literă mică.

SELECT LOWER('BUCUREŞTI') "Literă mică" FROM DUAL; Literă mică. -------------------- bucureşti

LPAD ('c1',n,'c2')

Returnează şirul de caractere 'c1', pe lungime de n caractere, astfel încât partea din stânga şirului până la lungimea de n caractere este umplută cu secvenţe de caractere egale cu 'c2'. Dacă şirul 'c1' este mai lung decât valoarea n, atunci se returnează partea dreaptă a şirului pe lungime de n caractere.

SELECT LPAD('Page.1',10,'*.') "LPAD exemplu" FROM DUAL; LPAD exemplu --------------- *.*.*Pag.1

LTRIM ('c1' [,'c2'])

Returnează partea din şirul 'c1' care a mai rămas după ce au fost înlăturate toate caracterele din stânga acestuia care se regăsesc în setul de caractere 'c2'.

SELECT LTRIM('xyxXxyREST ŞIR','xy') "LTRIM exemplu" FROM DUAL; LTRIM exemplu ------------ XxyREST ŞIR

NLSSORT ('c1' [,'nlsparams'])

Returneză un şir de caractere folosite pentru sortarea câmpurilor de tip caracter. Caracterul 'c1' defineşte un marcator de sortare, în sensul că toate valorile dintr-un câmp care sunt mai mari sau mai mici decât acesta vor fi afişate sau nu prin folosirea

SELECT nume FROM tab1 WHERE NLSSORT(nume,'NLS_SORT=romanian')< NLSSORT('O','NLS_SORT=romanian') ORDER BY nume; NUME ----------

Page 123: HTML Php Mysql Pentru Incepatori-libre

clauzei ORDER BY. Parametrul 'nlsparams' defineste valoare lingvistică după care să se facă sortare şi se dă sub forma 'NLS_SORT = sort' în care sort defineşte limba după care dorim să se facă sortarea(germană, română etc).

IONESCU MARINESCU POPESCU OLGA Notă: Numele care încep cu o literă mai mare decât 'O' nu se vor afişa.

REPLACE ('c1','c2','c3')

Returnează şirul 'c1' translatat, astfel încât în şirul 'c1' toate valorile egale cu şirul de căutare 'c2' sunt înlocuite cu şirul de înlocuire 'c3'.

SELECT REPLACE ('MAS şi MUSCA','M','C') "REPLACE" FROM DUAL; REPLACE -------------- CAS şi CUŞC

RPAD ('c1',n[,'c2'])

Returnează şirul de caractere 'c1', pe lungime de n caractere, astfel încât partea din dreapta şirului până la lungimea de n caractere este umplută cu secvenţe de caractere egale cu 'c2'. Dacă şirul 'c1' este mai lung decât valoarea n, atunci se returnează partea stângă a şirului pe lungime de n caractere.

SELECT RPAD('CLUJ',10,'ab') "RPAD exemplu" FROM DUAL; RPAD exemplu ----------------- CLUJababab

RTRIM ('c1','c2')

Returnează partea din şirul 'c1' care a mai rămas după ce au fost înlăturate toate caracterele din dreapta acestuia care se regăsesc în setul de caractere 'c2'.

SELECT RTRIM('BUCUREŞTIyxXxy','xy') "RTRIM exemplu" FROM DUAL; RTRIM exemplu ------------- BUCUREŞTIyxX

SUBSTR ('c1',m[,n])

Returnează porţiunea din şirul 'c1' care începe de la al m-lea caracter pe lungime de n caractere.

SELECT SUBSTR ('ABCDEFG',3.1,4) Subşir1" FROM DUAL; Subşir1 ---- CDEF SELECT SUBSTR('ABCDEFG',-5,4) "Subşir2" FROM DUAL; Subşir2 ---- CDEF

Page 124: HTML Php Mysql Pentru Incepatori-libre

TRANSLATE ('c1','c2','c3')

1. Translatează şirul 'c1' prin intermediul şirului 'c2' la valorile din şirul 'c3' după regula: fiecare caracter din şirul c1 este căutat în şirul 'c2', dacă este găsit valoarea acestuia este înlocuită cu caracterul din şirul 'c3' a cărui poziţie corespunde cu poziţia caracterului din şirul 'c2'. 2. Dacă şirul 'c2' este mai lung decât şirul 'c3' caracterele ce nu pot fi translatate sunt eliminate din şirul 'c1'.

SELECT TRANSLATE ('2KRB229', '0123456789ABCDEFGHIJKLMNOPQRSTUV', '9999999999XXXXXXXXXXXXXXXXXXXXXXXXXX') "TRANSLATE 1" FROM DUAL; TRANSLATE 1 -------- 9XXX999 SELECT TRANSLATE ('2KRW229', '0123456789ABCDEFGHIJKLMNOPQRSTUVWX', '0123456789') " TRANSLATE 2" FROM DUAL; TRANSLATE 2 ----------------- 2229

UPPER('c1') Returnează şirul 'c1' cu toate caracterele transformate în caractere mari.

SELECT UPPER('Bucureşti') "LITERE MARI" FROM DUAL; LITERE MARI ----- BUCUREŞTI

Tabelul 3.3 Func iile caracter care returnează valori numerice Func ia Rolul func iei Exemple ASCII ('c1') Returnează valoarea

zecimală a primului caracter din şirul 'c1'.

SELECT ASCII('Q') FROM DUAL; ASCII('Q') ---------- 81

INSTR ('c1','c2' [,n[,m]])

1.Caută în şirul 'c1' începând cu al n-lea său caracter a m-a apariţie a şirului 'c2' şi returnează poziţia acestuia în şirul 'c1' relativ la începutul şirului. Dacă şirul 'c2' nu este găsit în şirul 'c1' se returnează valoarea 0. Valorile asumate prin lipsă pentru n şi m sunt 1. 2. Dacă n este negativ căutarea se face invers de la sfârşitul şirului.

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

LENGTH Returnează lungimea în SELECT LENGTH('BUCUREŞTI')

Page 125: HTML Php Mysql Pentru Incepatori-libre

caractere a şirului de caractere 'c1' de tip CHAR.

"LUNGIME ŞIR" FROM DUAL; LUNGIME ŞIR -------------------- 9

3) Funcţiile de tip DATE operează cu tipuri de date de tip DATE şi

sunt prezentate în tabelul 3.4. Toate func iile de tip DATE returnează valori de tip DATE, mai pu in func ia MONTH_BETWEEN care furnizează o valoare numerică. Structurile formatului fmt de afişare a datelor pentru func iile de tip DATE sunt prezentate în tabelul 3.7. Tabelul 3.4 Func iile de tip DATE Func ia Rolul func iei Exemple ADD_MONTHS(d,n) Returnează data

d plus un număr de luni egal cu n.

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 următoare" FROM tab1 WHERE nume = 'POPESCU'; Luna următoare ----------- 17-OCT-2005

LAST_DAY (d) Returnează data ultimei zile din lună.

Cu această funcţie se poate determina numărul zilelor rămase din luna curentă. SELECT SYSDATE, LAST_DAY(SYSDATE) "ULTIMA",LAST_DAY(SYSDATE) - SYSDATE "ZILE R MASE" FROM DUAL; SYSDATE ULTIMA ZILE R MASE --------- --------- ---------- 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

MONTHS_ BETWEEN (d1, d2)

Returnează numărul de luni dintre datele d1

SELECT MONTHS_BETWEEN (TO_DATE('02-09-2005','MM-DD-YYYY'), TO_DATE('01-08-2005','MM-DD-YYYY') )

Page 126: HTML Php Mysql Pentru Incepatori-libre

şi d2. Dacă d1 şi d2 sunt aceleşi zile din lună sau sunt ultimele zile din lună rezultatul este un număr întreg, altfel Oracle calculează fracţiuni din lună bazat pe o lună cu 31 zile.

"Luni" FROM DUAL; Luni ---------- 1.03225806

NEXT_DAY (d, 'c1') Returnează data primei zile a săptămânii după ziua definită de şirul 'c1' şi care este după data d.

În exemplul de mai jos se returnează data zilei care urmează zilei de Marţi, după data de 15 martie 1999. SELECT NEXT_DAY('15-MAR-05','TUESDAY') "ZIUA URM TOARE" FROM DUAL; ZIUA URM TOARE --------- 22-MAR-05

ROUND (d[,fmt]) Returnează data d rotunjită la unitatea de timp specificată de către formatul fmt, conform specificaţiilor de la sfârşitul tabelului.

SELECT ROUND (TO_DATE ('27-SEP-05'),'YEAR') "Noul an" FROM DUAL; Noul an --------- 01-JAN-06

SYSDATE Returnează data şi timpul curent.

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

TRUNC (d,[fmt]) Returnează data d fără timp trunchiată la o unitate specificată de formatul fmt, iar dacă este absent se face trunchierea la ziua cea mai

SELECT TRUNC(TO_DATE ('27-SEP-05','DD-MON-YY'), 'YEAR') "Anul nou" FROM DUAL; Anul nou --------- 01-JAN-05

Page 127: HTML Php Mysql Pentru Incepatori-libre

apropiată. Formatul fmt utilizat de funcţiile ROUND şi TRUNC Formatul fmt Semnifica ia formatului fmt CC, SCC Se rotunjeşte la nivel de secol (primii doi digiţi ai anului

exprimat pe patru digiţi + 1) Exemplu: 1898 se rotujeşte la 1998.

SYYYY, YYYY, YEAR SYEAR, YYY, YY, Y

Se rotunjeşte la nivelul 01 ianuarie a anului din data care se rotunjeşte. Exemplu: 27-sep-05 se rotunje;te la 01-jan-05.

Q Rotunjire la nivel de trimestru (Se routunjeşte în sus la a şasesprezecea zi a lunii a doua a trimestrului).

MONTH, MON, MM, RM Rotunjire la nivel de lună (Se routunjeşte în sus la a şasesprezecea zi a lunii).

4) Funcţiile de conversie convertesc o valoare de la un tip de dată la alt tip de dată. Aceste func ii au formatul general de forma tip_de_dată TO tip_de_dată şi sunt prezentate în tabelul 3.5. Tabelul 3.5 Func iile de conversie Func ia Semnifica ia Exemple CONVERT ('c1', set_destinaţie, [,set_sursă] )

Converteşte 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_destinaţie este setul de caractere în care se convertesc caracterele şirului 'c1'.

SELECT CONVERT('Groß', 'US7ASCII', 'WE8HP') "Conversie" FROM DUAL; Conversie ---------- Gross Seturile de caractere cele mai comune sunt: US7ASCII, WE8DEC, WE8HP, F7DEC, WE8EBCDIC500 , WE8PC850, WE8ISO8859P1 .

HEXTOROW('c1') Converteşte şirul 'c1' care conţine digiţi hexazecimali la tipul de date RAW.

INSERT INTO tab1 (raw_column) SELECT HEXTORAW('7D') FROM DUAL;

RAWTOHEX(raw) Converteşte digiţi hexazecimali de tip RAW la şirul 'c1'.

ROWIDTOCHAR (rowid)

Converteşte valoarea ROWID la o valoare de tip VARCHAR". Rezultatul conversiei

SELECT ROWID FROM tab1 WHERE ROWIDTOCHAR(ROWID) LIKE '%Br1AAB%';

Page 128: HTML Php Mysql Pentru Incepatori-libre

este tot impul un şir de 18 caractere.

ROWID ------------------ AAAAZ6AABAAABr1AAB

TO_CHAR pentru conversie de caractere, are sintaxa: TO_CHAR (d [, fmt])

Converteşte data d de tip DATE la o valoare de tip VARCHAR2 în formatul specificat.

SELECT TO_CHAR (data1, 'Month DD, YYYY') "Format nou" FROM tab1 WHERE nume = 'ION'; Format nou ------------------ May 01, 2005

TO_CHAR pentru conversie de numere, are sintaxa: TO_CHAR (n [, fmt])

Converteşte numărul n de tip NUMBER la o valoare de tip VARCHAR2.

SELECT TO_CHAR(-10000,'L99G999D99MI') "Cantitate" FROM DUAL; Cantitate -------------- $10,000.00-

CHARTOROWID ('c1')

Converteşte o valoare de tip CHAR sau VARCHAR2 la o valoare de tip ROWID

SELECT nume FROM tab1 WHERE ROWID = CHARTOROWID ('AAAAfZAABAAACp8AAO'); nume ---------- POPESCU

TO_DATE ('c1' [, fmt ])

Converteşte ş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.

INSERT INTO tab1 (data1) SELECT TO_DATE( 'January 15, 2005, 11:00 A.M.', 'Month dd, YYYY, HH:MI A.M.') FROM DUAL;

TO_NUMBER ('c1',[,fmt ])

Converteşte ş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.

UPDATE tab1 SET salariu = salariu + TO_NUMBER('100.00', '9G999D99') WHERE nume = 'ION';

Tabelul 3.6 Structurile formatului fmt pentru datele de tip NUMBER Elementul fmt

Exemple Semnifica ia elementului fmt

9 9999 Nr. semnificativ de digiţi care vor fi afişaţi 0 0999 9990 Afişează 0 în faţa sau după digiţii semnificativi

Page 129: HTML Php Mysql Pentru Incepatori-libre

$ $999 Afişează semnul $ în faţa numărului B B999 Afişează valorile 0 ca blank-uri MI 999MI Afişează semnul “-“ după numerele negative S S999 Afişează semnul “+” sau “-“ în faţa numerelor

pozitive, respectiv negative D 99D99 Afişează punctul zecimal în această poziţie G 99G999 Separator de grupuri , 99,999,99 Virgula se afişează în poziţiile indicate . 999.99 Afişează punctul zecimal în această poziţie RN sau rn RN sau rn Afişează cifre romane cu majuscule, respectiv cu

caractere mici(minuscule)

Tabelul 3.7 Structurile formatului fmt pentru datele de tip DATE Elementul fmt Se specifică

în TO-DATE

Semnifica ia elementului fmt

- / , . ; : Da Punctuaţii pentru dată "text" Da Text reprodus în rezultat AD sau A.D. Da Specificarea unui an din Era Noastră(E.N.) BC sau B.C. Da Specificarea unui an Înaintea Erei Noastre(Î.E.N.) CC sau SCC Nu Secolul = cu primii doi digiţi ai anului pe patru digiţi

+ 1 D Da Ziua din săptămână(de la 1 la 7) DAY Da Numele zilei DD Da Ziua din lună(de la 1 la 31) DDD Da Ziua din an(1 la 366) HH sau HH12 Da Ora din zi din intervalul 1 - 12 HH24 Da Ora din zi din intervalul 1 - 24 J Da Ziua din calendarul Iulian cu valori începând cu 1

ianuarie 4712 BC. Trebuie să fi întreg. MI Da Minute (0 la 59) MM Da Luna (01 la 12) MON Da Numele prescurtat al lunii MONTH Da Numele întreg al lunii PM sau P.M. Nu Indicator de meridian RR sau RRRR Da Rotunjirea anului pe doi digiţi sau patru digiţi SS da Secundele în cadrul minutului(0 la 59) SSSS Da Secundele de la miezul nopţii în cadrul zilei(0 la

86399) WW Nu Săptămâna din an (1 la 53) W Nu Săptămâna în cadrul lunii(1 la 5) YYYY,YYY,YY,Y Da Anul cu 4 , 3, 2, 1 digiţi. Alte func ii cu un singur rând sunt prezentate în tabelul 3.8.

Page 130: HTML Php Mysql Pentru Incepatori-libre

Tabelul 3.8 Alte funcţii cu un singur rând Func ia Rolul func iei Exemple DUMP ('c1' [,return_format [,start_position [,length]]])

Returnează o valoare de tip VARCHAR2 conţinând codul tipului de date, lungimea în baiţi şi reprezentarea internă a expresiei expr return_format este codul sistemului de numeraţie în care este reprezentată valoarea returnată de funcţie pentru şirul 'c1'; Dacă se furnizează ca o valoare egală cu codul sistemului de numeraţie + 1000 se returnează şi numele sistemului de numeraţie. start_position determină poziţia din şirul 'c1' de unde să înceapă DUMP-u length este lungimea DUMP-ului.

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 numeraţie sunt: 8 = sistemul octal; 10 = sistemul zecimal; 16 = sistemul hexazecimal; 17 = rezultatul este returnat sub forma de caractere singulare.

EMPTY_ [B|C]LOB()

Returnează un pointer sau locator care poate fi folosit pentru iniţializare unei variabile de tip LOB, într-un INSERT, într-un UPDATE pentru iniţializarea unei coloane de tip LOB sau ca atribut EMPTY, care înseamnă că LOB-ul a fost iniţializat dar nu a fost populat cu date.

INSERT INTO lob_tab1 VALUES (EMPTY_BLOB()); UPDATE lob_tab1 SET clob_col = EMPTY_BLOB();

BFILENAME ('director', 'nume_fişier')

Returnează un pointer sau locator asociat cu un LOB de tipul unui fişier binar de pe server. director este numele directorului unde se află fişierul LOB de tip binar. nume_fişier este numele fişierului.

INSERT INTO tab1 VALUES (BFILENAME('lob_dir1',foto1.gif'));

GREATEST (expr [,expr] ...)

Returnează valoarea cea mai mare dint-o listă de valori.

SELECT GREATEST ('HARRY', 'HARRIOT', 'HAROLD') "Mare" FROM DUAL; Mare -----

Page 131: HTML Php Mysql Pentru Incepatori-libre

HARRY LEAST (expr [,expr] ...)

Returnează valoarea cea mai mică dint-o listă de valori.

SELECT LEAST('HARRY','HARRIOT','HAROLD') "Mică" FROM DUAL; Mică ------ HAROLD

NVL (expr1, expr2) Dacă expr1 este NULL returnează expresia expr2, iar dacă expr1 nu este NULL returnează expr1. Argumentele expr1 şi expr2 pot avea orice tip de date. Dacă sunt de tipuri diferite Oracle converteşte expr2 la tipul expr1 înainte de a executa comparaţiile. Valoarea returnată este totdeauna de tipul expr1, execpţie făcând situaţia când expr1 este de tip caracter, caz în care rezultatul este VARCHAR2.

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

UID Returneză un întreg care identifică în mod unic utilizatorul curent.

USER Returnează identificatorul utilizatorului curent în format VARCHAR2.

SELECT USER, UID FROM DUAL; USER UID ---------------------------- SCOTT 19

USERENV (option) Returnează informaţii despre sesiune curentă.

SELECT USERENV('LANGUAGE') "Limbajul" FROM DUAL; Limbajul ----------------------------------- AMERICAN_AMERICA.WE8DEC

VSIZE(expr) Returnează lungimea în baiţi a expresiei expr.

SELECT nume, VSIZE (nume) "BYTES" FROM tab1 WHERE codepart = 10; NUME BYTES ---------------------------- CLARK 5 KING 4 MILLER 6

Page 132: HTML Php Mysql Pentru Incepatori-libre

B.Funcţiile cu mai multe randuri (de grup)

Furnizează un rezultat bazat pe prelucrarea mai multor rânduri. Toate func iile de grup, mai pu in COUNT(*) ignoră valorile NULL.

Majoritatea func iilor de grup acceptă op iunile:DISTINCT (determină luarea în calcul numai a valorilor distincte ale rândurilor din cadrul grupului) şi ALL ( determină luarea în calcul a tuturor valorilor grupului de rânduri). Func iile de grup sunt prezentate în tabelul 3.9. Tabelul 3.9 Func iile de grup Func ia Semnifica ia Exemple AVG([DISTINCT|ALL] n) Returneză media celor n

valori SELECT AVG(salariu) "Medie" FROM tab1; Media ---------- 2077343.21429

COUNT ({* | [DISTINCT|ALL] expr})

Returnează toate rândurile cererii. Dacă avem argumentul = * se returnează toate rândurile indiferent de valoarea lor (NULL sau NOT NULL)

SELECT COUNT(*) "Total" FROM tab1; Total ---------- 18 SELECT COUNT(job) "Count" FROM tab1; Count ---------- 14 SELECT COUNT(DISTINCT job) "Jobs" FROM emp; Jobs ---------- 5

MAX([DISTINCT|ALL] expr)

Returnează maximul din expresia expr.

SELECT MAX(salariu) "Maximum" FROM tab1; Maximum ---------- 5000

MIN([DISTINCT|ALL] expr)

SELECT MIN(data1) "Minim" FROM tab1; Minimum

Page 133: HTML Php Mysql Pentru Incepatori-libre

--------- 17-DEC-80

SUM([DISTINCT|ALL] n) SELECT SUM(salariu) "Total" FROM tab1; Total ---------- 29081

Utilizatorii pot să-şi scrie propriile func ii în PL/SQL pentru a executa activită i neacoperite de către func iile SQL. Aceste func ii pot fi folosite în comenzile SQL la fel ca şi cele standard. De exemplu, func iile utilizator pot fi folosite în: lista de selec ie a comenzii SELECT; condi ia din clauza WHERE; clauzele CONNECT BY, START WITH, ORDER BY ŞI GROUP BY ; clauza VALUES a comenzii INSERT; clauza SET a comenzii UPDATE.

Func iile utilizator nu pot fi folosite în clauzele CONSTRAINT sau DEFAULT ale comenzilor C REATE TABLE sau ALTER TABLE şi nici pentru actualizarea bazei de date. În func iile utilizator nu este permisă utilizarea parametrilor OUT sau IN OUT.

4. EXPRESII SQL

Expresia este o combina ie de unul sau mai mul i operatori, operanzi (variabile, literali, coloane, func ii SQL) care se evaluează la o singură valoare.

Operatorii utiliza i în comenzile SQL sunt: operatori SQL*PLUS; operatori SQL; operatori aritmetici; operatori logici; operatori specifici în expresiile de cereri. Ei sunt prezenta i în Anexa 2, în ordinea descrescătoare a priorită ii, cei de aceeaşi importan ă fiind grupa i între perechi de linii orizontale. Operatorii sunt evalua i de la stînga spre dreapta.

O expresie are în general acelaşi tip de date ca şi componentele sale. Expresiile sunt folosite pentru construirea instruc iunilor SQL şi a unor liste de expresii.

A. Există cinci forme de furnizarea a expresiilor pentru construirea instrucţiunilor SQL.

1) Forma I este formată din coloană, pseudocoloană, constantă, secven ă sau NULL şi are sintaxa:

nume_schemă.tabelă | vedere. coloană | pseudocoloană | ROWLABEL sau

text | număr | nume_secvenţă | nume secvenţă. CURRVAL | NEXTVAL | NULL

Page 134: HTML Php Mysql Pentru Incepatori-libre

Pentru nume_schemă se poate folosi pe lângă numele schemei utilizatorului şi valoarea "PUBLIC", care califică sinonimele publice pentru o tabelă sau o vedere, calificare care este suportată doar în instruc iunile SQL pentru manipularea datelor de tip (DDL), nu şi în cele de definire a datelor de tip DDL.

Pseudocoloană poate fi doar LEVEL, ROWID sau ROWNUM. Exemple:

Tab1.numecol_1 'acesta este un şir de caractere' 10 secventa1.CURRVAL

2) Forma II este folosită pentru definirea unei variabile gazdă (host

variable) cu sau fără indicator de variabilă. Expresiile din această formă se vor folosi doar în instruc iunile SQL incluse în limbajele de programere gazdă sau în instruc iunile prelucrate de programele OCI(Oracle Call Interface). Sintaxa este de forma:

: variabilă_gazdă INDICATOR :variabilă_indicator Exemple:

: nume_angajat INDICATOR :indicator_var_nume_angajat :nume_persoană

3) Forma III este folosită pentru apelul func iilor cu un singur rând şi are sintaxa:

funcţie (DISTINCT | ALL expresie1, expresie2, … ) Exemple :

LENGTH('BLAKE') ROUND(1234.567*43) SYSDATE

4) Forma IV este folosită pentru apelul func iilor de utilizator şi are sintaxa:

nume_schemă . nume_pachet. nume_funcţie Exemple:

aria_cercului(raza) calcul_rate(nume_angajat)

Page 135: HTML Php Mysql Pentru Incepatori-libre

5) Forma V este o combina ie de mai multe expresii şi are sintaxa: ( expresie ) | + | - | PRIOR expresie | expresie1 * | / | - | || expresie2 Exemple:

('IONESCU' || ' PETRE') LENGTH('BUCURESTI') * 57 SQRT(144) + 72 func ie_utilizator(TO_CHAR(sysdate,'DD-MMM-YY')

Expresiile pentru decodificarea unor valori folosesc sintaxa specială

de tip DECODE de forma: DECODE ( expr, val1, rezultat1, val2, rezultat2, …. , valoare_asumată)

expr va fi evaluată şi apoi valoarea rezultată va fi comparată cu fiecarea dintre valorile val1, val2, .… . Dacă valoarea expresiei este egală cu una din valorile de compara ie se va furniza valoarea rezultat (rezultat1, rezultat2, …) care corespunde valorii de compara ie. Dacă valoarea expresiei expr1 nu este egală cu nici una din valorule de compara ie se furnizează valoarea valoare_asumată. Dacă valoarea asumată este omisă atunci se furnizează valoarea NULL. Exemplu:

DECODE (cod_func ie,10, 'programator', 20, 'cercetător', 30, 'vânzător', 40, 'operatorr', 'lipsă_func ie') Exemplul de mai sus decodifică valoarea expresiei cod_funcţie.

Astfel dacă valoarea expresiei cod_funcţie = 10 se furnizează func ia programator, dacă este = 20 se furnizează func ia cercetător şi aşa mai departe. În caz că expresia cod_func ie are a valoare care nu este egală cu nici una din valorile 10, 20, 30 sau 40 se furnizează ca rezultat valoarea lipsă_funcţie. B. O listă de expresii este o serie de expresii separate între ele prin virgulă şi închisă între paranteze rotunde şi poate con ine pînă la maximum 1000 de expresii.

Page 136: HTML Php Mysql Pentru Incepatori-libre

Exemplu: (10, 20, 40) ('SCOTT', 'BLAKE', 'TAYLOR') (LENGTH('MOOSE') * 57, -SQRT(144) + 72, 69)

5. CONDI IILE

Condiţia este o combina ie de una sau mai multe expresii şi operatori logici evaluată cu una din valorile TRUE, FALSE sau UNKNOWN. Condi iile se pot folosi în clauza WHERE a instruc iunilor SQL DELETE, SELECT şi UPDATE sau într-una din clauzele WHERE, START WITH, CONNECT BY sau HAVING ale instruc iunii 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. Condi iile 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 to i 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 căutarea unei expresii sau a unei liste

de expresii dacă figurează într-o listă de expresii sau într-o subcerere şi are sintaxa:

expresie1 NOT IN listă_de_expresii | (subcerere)

Page 137: HTML Php Mysql Pentru Incepatori-libre

sau listă_de_exp NOT IN ( listă_expr1, listă_expr2, …) | (subcerere1, subcerere2, …. )

Forma IV este folosită pentru testarea existen ei sau inexisten ei

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 existen ei unui rând înt-o

subcerere şi are sintaxa: EXISTS ( subcerere )

Forma VII este folosită pentru testarea egalită ii unei şir de caractere

cu un format anume, cu un alt şir de caracter şi are sintaxa: şir_ caracter1 NOT LIKE şir_cacrater2 ESCAPE 'caracter_de_schimbare'

Forma VIII este folosită pentru specificarea unei combina ii de mai

multe condi ii şi poate avea sintaxele: NOT condiţie sau condiţie1 NOT AND | OR condiţie2

6. DESCHIDEREA ŞI ÎNCHIDEREA UNEI SESIUNI DE LUCRU SQL*PLUS

Pentru a avea acces la componentele unei baze de date (tabele, vizi-

uni, clustere etc.), utilizatorul trebuie mai întîi să se conecteze la ea. La sfârşitul sau în timpul unei sesiuni SQL există posibilitatea deconectării de la baza de date. O primă conectare se face atunci cînd se începe lucrul cu SQL*Plus. Efectul comenzii sau utilizării meniului sistem îl constituie deschiderea unei sesiuni de lucru sub SQL*Plus.

Comanda are următoarele forme sintactice: SQLPLUS [nume-utilizator[/parolă] [@nume-bază-de-date] [@nume-fişier]

Page 138: HTML Php Mysql Pentru Incepatori-libre

[-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 re ea (este alt nume decât cel al bazei de date implicite, de pe calculatorul la care se lucrează). @nume-fişier: reprezintă numele unui fişier de comenzi SQL care va fi fi rulat de SQL*Plus. SILENT: are ca efect inhibarea facilită ii de afişare a tuturor informa iilor şi mesajelor furnizate de SQL*Plus /NOLOG: lansează în execu ie SQL*Plus dar nu face conectarea la o bază de date. -?: are ca efect afişarea versiunii curente a componentei SQL*Plus, după care returnează controlul sistemului de operare

Dacă în linia de comandă se specifică parola şi @nume-bază-de-date atunci între ele nu trebuie să existe spa iu. Parola sau @nume-bază-de-date vor fi separate printr-un spa iu de @nume-fişier. Conectarea utilizatorului la o bază de date

Dacă în timpul unei sesiuni de lucru SQL*PLUS se doreşte conecta-rea la o altă bază de date decât cea deschisă ini ial 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 op ională), ea este cerută de sistem printr-un mesaj explicit. Parola introdusă la mesajul sistemului va fi invizibilă. @nume-bază-de-date: se specifică în cazul lucrului în re ea, cînd se doreşte conectarea la o altă bază de date decât cea aflată pe calculatorul la care se lucrează.

Page 139: HTML Php Mysql Pentru Incepatori-libre

De remarcat faptul că în timpul unei sesiuni de lucru cu SQL*Plus se poate realiza conectarea la o bază de date, fără a mai fi necesară închiderea sesiunii. Furnizarea parametrilor nume-utilizator şi parolă asigură protec ia bazei de date împotriva accesului neautorizat. Deconectarea utilizatorului de la baza de date

Deconectarea utilizatorului de la o bază de date se realizează prin comanda DISCONNECT.

Sintaxa acestei comenzi este: DISC[ONNECT]; Comanda are ca efect deconectarea de la baza de date curentă, fără a

închide sesiunea de lucru SQL*Plus. Închiderea sesiunii de lucru SQL*Plus

Închiderea sesiunii de lucru SQL*PLUS şi predarea controlului sistemului de operare al calculatorului gazdă se realizează cu una din comenzile: QUIT, EXIT sau ^Z.

Sintaxa acestor comenzi este: QUIT; EXIT: ^Z;

7. ELEMENTE DE LUCRU CU SQL*PLUS

A. Încărcarea şi executarea comenzilor

În exemplele ce se vor prezenta, referitor la utilizarea comenzilor SQL*Plus, se va folosi tabela Oracle pers100 cu structura de mai jos:

CREATE TABLE pers100

(CODPERS NUMBER(5), NUME VARCHAR2(30), PRENUME VARCHAR2(30), ZINAST NUMBER(2), LUNAST NUMBER(2), ANAST NUMBER(4), STRADA VARCHAR2(40), NRSTR NUMBER(2), SECTOR NUMBER(1), LOCNAST VARCHAR(20), FUNCTIA VARCHAR(15), SALARIU NUMBER(8), NUMAR_ACTIUNI NUMBER (6))

Page 140: HTML Php Mysql Pentru Incepatori-libre

PCTFREE 5 PCTUSED 75;

Comenzile se pot introduce pe una sau mai multe linii. Exemplu:

Comanda sql> select * from pers100; este echivalentă cu: sql> select 2 * from 3 pers100;

Introducerea comentariilor se poate realiza folosind: • Comanda REMARK din SQL*Plus

Exemplu: REMARK comentariu

Nu se vor introduce comentarii intre liniile aceleaşi comenzi SQL. • Delimitatorii de comentariu din SQL /* … */ Exemplu: /* comentariu */ • comentariile tip PL/SQL prefixate cu ‘- -‘ Exemplu: -- comentariu

Terminarea unei comenzi SQL se face cu: punct şi virgulă (;), slash (/) sau blank. Primele două forme cer SQL*Plus să execute imediat comanda, a treia formă nu. Comanda curentă poate fi rulată sau rerulată introducând comenzile RUN sau slash(/).

Se pot introduce şi blocuri PL/SQL care să fie executate. La sfârşitul blocurilor PL/SQL se vor insera două linii una con inând un punct, iar cealaltă un slash(/). Exemplu:

declare x number := 100; begin for i in 1 .. 10 loop insert into pers100 values (10, ‘ionel’, ‘marin’, 10,7,1970, ‘ion manolescu’,2, 6, ‘suceava’); end loop; end; /

Page 141: HTML Php Mysql Pentru Incepatori-libre

Zona (aria) în care SQL*Plus memorează comenzile curente se numeşte buffer-ul SQL.

Pe lângă comenzile SQL şi PL/SQL se pot introduce şi comenzi SQL*Plus, care pot fi abreviate şi la o literă. Comenzile foarte lungi pot fi întrerupte şi continuate pe linia următoare. Întreruperea se marchează cu ‘-‘. Oracle automat afişează semnul > (prompter) după care se introduce restul comenzii. Exemplu:

sql> select * from - >pers100;

Controlul listării rapoartelor lungi se poate face utilizând tasata Cancel sau setând variabila PAUSE pe ON. Exemplu:

set pause ‘text de atenţionare’ set pause on Această setare va determina ca sistemul să oprească afişarea la

fiecare pagină şi să afişeze textul text de aten ionare. Cu SET PAUSE OFF se revine la starea anterioară. B. Editarea comenzilor SQL*Plus Editarea în mod linie se realizează prin comenzile din tabelul 3.10. Tabelul 3.10. Comenzile de editare a comenzilor SQL*Plus Comanda Abreviaţia Funcţia APPEND text A text Adaugă text la sfârşitul unei linii CHANGE /old/new/ C /old/new/ Schimbă un text cu altul CHANGE /text C/text Şterge textul unei linii CLEAR BUFFER CL BUFF Curăţă bufferul DEL Fără abreviaţie Şterge o linie INPUT I Adaugă una sau mai multe linii INPUT text I text Adaugă o linie formată dintr-un text LIST L Listează toate liniile din buffer LIST n L n sau n Listează linia n LIST * L * Listează linia curentă LIST LAST L LAST Listează ultima linie LIST m n L m n Listează liniile de la m la n

Editarea comenzilor cu editorul sistemului se realizează cu comanda

EDIT. Apare fereastra Editorului, în care se vor tasta instruc iunile SQL dorite. Se salvează fişierul cu nume.SQL şi se execută cu comanda @nume. C. Crearea, regăsirea, rularea şi modificaea fişierelor de comenzi. Crearea fişierelor de comenzi se pot realiza prin:

Page 142: HTML Php Mysql Pentru Incepatori-libre

• Salvarea con inutului bufferului cu comanda SAVE. Exemplu:

SAVE nume_ fişier.SQL Înainte de salvare se va lista bufferul cu comanda LIST pentru a verifica

dacă instruc iunile ce vor fi salvate sunt corecte. • Utilizarea comenzii INPUT în corela ie cu SAVE Exemplu:

sql> clear buffer sql> input select * from pers100 sql> save comand1.sql sql> @comand1 • Utilizarea editorului de sistem

SQL> EDIT nume_fişier Regăsirea (citirea) fişierelor de comenzi se face cu comanda GET. Exemplu:

SQL> GET edit3 SELECT * FROM PERS100;

Rularea fişierelor de comenzi se execută folosind comenzile:

START nume_fişier @nume_fişier Dacă avem mai multe fişiere de comenzi pe care vrem să le

executăm secven ial, vom creea un fişier de comenzi con inând comenzile START corespunzătoare, după care pentru rulare vom activa acest ultim fişier. Exemplu:

În fişierul FILE2 introducem comenzile: START fiş1 START fiş2 START fiş3 Apoi cu una din comenzile START FILE2 sau @FILE2 vom activa

aceste comenzi. Modificarea fişierelor de comenzi se poate realiza folosind comanda

EDIT nume_fişier sau comanda GET urmată de SAVE nume_fişier REPLACE.

D. Facilităţi pentru setarea fişierelor de comenzi Următoarele facilită i fac posibilă setarea unor fişiere de comenzi

care să permită utilizatorilor să-şi introducă propriile valori pentru controlul

Page 143: HTML Php Mysql Pentru Incepatori-libre

execu iei comenzilor: definirea variabilelor de utilizator; ştergerea variabilelor de utilizator; substituirea valorilor în comenzi; folosirea comenzii START pentru furnizarea de valori în comenzi; crearea unor prompteri pentru introducerea valorilor.

1) Definirea variabilelor de utilizator se face explicit cu comanda DEFINE sau implicit prin utilizarea prefixării variabilelor cu două ‘&’.

Definirea, listarea şi ştergerea unei variabile utilizator în mod explicit se fac cu comenzile:

DEFINE nume_variabilă = “valoare variabila“ Exemplu: SQL > DEFINE variabila1 = “mihai” 2) Ştergerea variabilelor de utilizator se realizează prin utilizarea

comenzii UNDEFINE nume_varaiabilă. Exemplu: SQL> UNDEFINE varaiabila1 3) Substituirea variabilelor este o tehnică prin care putem creea

proceduri de lucru astfel încât să folosim acelaşi script (grup de instruc iuni) pentru efectuarea unor func ii diferite pornind de la structura procedurii. Variabilele ce se substituie pot exista la momentul substituirii dacă anterior au fost create explicit cu comanda DEFINE sau implicit prin prefixare cu &. Există patru modalită i de substituire a variabilelor: substituirea variabilelor prefixate cu un ‘&’; substituirea variabilelor prefixate cu două ‘&’; substituirea variabilelor de tip &n cu ajutorul comenzii START; substituirea variabilelor folosind comenzile PROMPT, ACCEPT şi PAUSE

a) Substituirea variabilelor prefixate cu un ‘&’. Vom crea o procedură generalizată pentru calculul unor subgrupe statistice pe o coloană numerică. Exemplu:

Să se execute selec ia din baza de date a valorilor salariilor apar inând aceleaşi func ii, iar din aceste grupe afişarea celor care sunt cele mai mici din grupă, ordonate descrescător.

select func ia , min(salariu) minimum from pers100 group by func ia order by min(salariu) desc; În fraza SELECT de mai sus funcţia, min, salariu şi desc pot fi

definite ca variabile, ceea ce va permite ca să putem utiliza pentru grupare şi altă coloană, pentru calcul şi valorile max sau sum, iar pentru ordonare vom putea folosi şi valoarea ascendent. Pentru executarea acestei comenzi vom crea fişierul de comenzi CALC&.SQL, cu structura de mai jos:

Page 144: HTML Php Mysql Pentru Incepatori-libre

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --*/ /* &v1_col_grup = nume coloană din tabelă după valorile căreia 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 afişa valorile calculate /* &v5_tip_sort = tipul ordonării(sortării), 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 fişierului cu comanda @calc& sistemul ne va cere

succesiv să furnizăm 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 arăta ca mai jos: NUME MINIMUM ------------------------------ --------- ionescu 3500000 petrescu 2500000 mihai 1500000

b) Substituirea variabilelor prefixate cu două ‘&’. Pentru exemplificare vom crea, pornind de la fişierul de comenzi CALC&.SQL, fişierul de comenzi CALC&&.SQL în care variabilele vor fi prefixate cu doua caractere &, ca mai jos:

Page 145: HTML Php Mysql Pentru Incepatori-libre

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - -*/ /* &&v1_col_grup = nume coloană din tabelă după valorile căreia 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 afişa valorile calculate /* &&v5_tip_sort = tipul ordonării(sortării), 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 executării fişierului 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 câte ori apare o variabilă pentru ea se va furniza valoarea o singură dată. Orice execu ie ulterioară a unui fişier de comenzi în care apare una din variabilele create anterior (definite implicit ca variabile utilizator) se vor folosi aceste valori. Execu ia acestui fişier de comenzi va produce acelaşi rezultat ca şi execu ia fişierului CALC&.SQL. Rulând comanda DEFINE vom găsi în sistem pe lângă alte variabile utilizator şi variabilele create prin execu ia fişierului 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 dând variabilelor alte valori, va trebui întâi să ştergem aceste variabile cu comanda UNDEFINE.

Page 146: HTML Php Mysql Pentru Incepatori-libre

c) Substituirea variabilelor de tip &n cu ajutorul comenzii START. Pentru a nu mai furniza interactiv valori pentru variabilele utilizator la momentul execu iei, le putem defini pe acestea sub forma &n , în care n ia valori începând cu 1, iar valorile lor vor fi furnizate ca parametrii de apel ai instrucţiunii START. Astfel vom crea fişierul de comenzi CALCSTART.SQL de forma:

/* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -- -- - - - - - - - - - - - -- - - /* &1 = nume coloană din tabelei după care se face gruparea /* &2 = tipul calculului: min, max, sum pentru un anumit grup /* &3 = numele coloanei de tip numeric după care se va face calculul /* &4 = numele coloanei pe care se vor afişa valorile calculate /* &5 = tipul ordonării(sortării), descending sau ascending*/ select &1, &2(&3) &4 from pers100 group by &1 order by &2(&3) &5; /* - - - - - - - - - - - - -- - - -- -- - - - - - - - - - - - -- - -*/ Pentru execu ie vom apela fişierul de comenzi CALCSTART.SQL

cu comanda START în care vom furniza ca parametrii valorile dorite pentru cele 5 variabile de tip &n definite. Exemplu:

SQL> START CALCSTART nume min salariu MINIMUM desc Această execu ie va produce acelaşi rezultat ca şi execu iile fişierelor

de comenzi CALC&.SQL şi CALC&&.SQL. Deosebirea este că nu se mai creează variabilele utilizator astfel că

putem executa în mod generalizat procedura CALCSTART dând variabilelor orice alte valori logic acceptabile.

d) Crearea unor modalităţi interactive de comunicare cu calculatorul se realizează cu comenzile PROMPT, ACCEPT şi PAUSE, care sunt de fapt opera ii de intrare/ieşire standard. PROMPT permite trimiterea (scrierea) de mesaje la utilizator. ACCEPT permite preluarea (citirea) răspunsurilor de la utilizator. PAUSE permite introducerea unui moment de pauză pentru ca utilizatorul să citească mesajul şi să-şi formuleze răspunsul.

Aceste comenzi se folosesc în conjunc ie cu INPUT şi SAVE, pentru a introduce valorile dorite cu comenzile de mai sus, şi respectiv pentru a le salva într-un fişier de comenzi, care să fie ulterior executat. Exemplu:

SQL> Clear buffer SQL> INPUT

Page 147: HTML Php Mysql Pentru Incepatori-libre

PROMPT Introduce i un titlu format din maxim 30 caractere PAUSE urmează introducerea titlului, apăsa i RETURN ACCEPT TITLUL_MEU PROMPT ‘TITLUL: ‘ PAUSE urmează comanda de centrare a titlului, apăsa i RETURN TTITLE CENTER TITLUL_MEU SKIP 2 PAUSE urmează selectarea din baza de date, apăsa i RETURN SELECT codpers, nume , prenume from pers100; SQL> SAVE cmdprompt SQL> @cmdprompt

Rezultatul este: Introduce i un titlu format din maxim 30 caractere urmează introducerea titlului, apăsa i RETURN titlu:-----SELECTARE DIN BAZA DE DATE codpers, nume şi prenume ---- urmează comanda de centrare a titlului, apăsa i RETURN urmează selectarea din baza de date, apăsa i RETURN -----SELECTARE DIN BAZA DE DATE codpers, nume şi prenume ---- CODPERS NUME PRENUME --------- ------------------------------ ---------- 1 petrescu ion 2 petrescu florea 3 ionescu ion 4 ionescu dumitru 5 mihai florea 6 mihai ion 6 rows selected.

e) Utilizarea comenzilor PROMPT şi ACCEPT în conjuncţie cu

substituirea variabilelor În exemplele anterioare când s-au utilizat fişierele de comenzi

CALC&.SQL şi CALC&&.SQL s-a văzut că sistemul pentru fiecare variabilă a creat câte un prompter de forma:

Enter value for nume_variabilă : Ca atare se poate înlocui prompter-ul sistemului cu propriu prompter

utilizând pentru aceasta comenzile PROMPT şi ACCEPT în fişierul de comenzi unde vrem să introducem o variabilă pentru care vom construi alt prompter decât cel de sistem. Exemplu:

SQL> Clear buffer SQL> INPUT PROMPT Introduce i o valoare numerică pentru salariu PROMPT De exemplu: 1500000, 2500000 ACCEPT var_salariu NUMBER PROMPT ‘valoare salariu: ‘

Page 148: HTML Php Mysql Pentru Incepatori-libre

SELECT codpers, nume, salariu from pers100 WHERE salariu = &var_salariu SQL> save cmd2prompt SQL> @cmd2prompt

Rezultatul este: Introduce i o valoare numerică pentru salariu De exemplu: 1500000, 2500000 valoare salariu: aaaa “aaaa” is not a valid number valoare salariu: 3500000 old 1: SELECT codpers, nume, salariu from pers100 WHERE salariu = &var_salariu new 1: SELECT codpers, nume, salariu from pers100 WHERE salariu = 3500000 CODPERS NUME SALARIU --------- ------------------------------ --------- 4 ionescu 3500000

8. FORMATAREA REZULTATELOR

Limbajul SQL*PLUS permite proiectarea şi formatarea diverselor situa ii de ieşire. Aceste opera ii sunt posibile prin utilizarea unor comenzi pentru tratarea întreruperilor, comenzi pentru definirea titlurilor, definirea coloanelor, realizarea calculelor şi stabilirea diverselor op iuni pentru pozi ionarea unor arii de lucru pe ecran. A. Tratarea întreruperilor

Întreruperea este un eveniment care se produce în timpul execu iei unei comenzi SELECT, cum ar fi, de exemplu, apari ia sfîrşitului de pagină sau schimbarea valorii unei expresii.

Pentru a specifica evenimentele care determină o întrerupere şi ac iunea corespunzătoare SQL care se execută, se utilizează comanda BREAK. Ea poate specifica mai multe evenimente care generează o întrerupere. Evenimentele sunt re inute într-o ordine numită "ierarhie de întrerupere". La un moment dat,"se poate executa doar o singură comandă BREAK. Comanda BREAK are următoarele forme sintactice:

BRE[AK] ON {expr | ROW | PAG[E] | REPORT} [SKI[P] n | [SKIP]PAGE] [NODUP[LICATES] | DUP[LICATES]]; BRE[AK];

Page 149: HTML Php Mysql Pentru Incepatori-libre

unde: ON expr determină o întrerupere cînd se schimbă valoarea expresiei expr; expr este fie o expresie care implică una sau mai multe coloane dintr-o tabelă, fie o etichetă ataşată 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. Cînd se foloseşte ON expr, trebuie utilizată şi clauza ORDER BY, pentru a ordona rândurile din "ierarhia de întrerupere*. Ordinea de apari ie a expresiilor expr în comanda BREAK ON trebuie să rte aceeaşi cu cea prezentă în SELECT...GRDER BY: ON ROW determină o întrerupere cînd se selectează un rând cu SELECT. Această întrerupere este re inută la sfîrşitul ierarhiei de întrerupere; ON PAGE determină o întrerupere la sfârşitul fiecărei pagini; ON REPORT determină o întrerupere la sfârşitul raportului sau cererii, întrerupere care este re inută la începutul ierarhiei de întrerupere. SKIP determină saltul peste n linii, înainte de a se tipări linia asociată întreruperii respective. PAGE sau SKIP PAGE determină saltul la o pagină nouă înainte de a tipări linia asociată respectivei întreruperi. NODUPLICATES determină tipărirea de spa ii cînd valorile de JJS coloana de întrerupere sunt identice. DUPLICATES determină tipărirea valoarii coloanei de întrerupere în fiecare rând selectat. Valoarea NODUPLICATES este implicită. Comanda BREAK fără clauze indică pozi ia întreruperii curente. Exemple: 1) Să fie definită o întrerupere generată de schimbarea valorilor coloanei FUNCT. La apari ia acestui eveniment să fie afişate două linii vide.

SQL> BREAK ON FUNCT SKIP 2; SQL> SELECT MARCA,NUME,CODD, 2 SALA, VENS 3 FROM SALARIA I 4 ORDER BY FUNCT;

MARCANUME FUNCT CODD SALA VENS 7000 ION ION DIRECTOR 100000 45000 40000 2550 FRINCU ION SEF DEP 160000 36000 37000 1000 COMAN RADU 130000 35000 2500 2500 VLAD VASILE 160000 36500 1500 4000 PAUL ŞTEFAN 160000 35000 5600 3755 DORU DAN 130000 36500 5500

Page 150: HTML Php Mysql Pentru Incepatori-libre

1111 AVRAM ION VINZATOR 100000 21200 1000 1680 RADU ION 130000 20750 3000 3700 MÂNU DAN 160000 27500 2500 2553 AILENEI FLORIN 120000 25000 400 3760 SANDU ION 130000 25600 0 3770 CARMEN ANA 130000 26500 2554 DARIAN GEO 120000 26000 2000 3759 ALEXE IOAN 160000 25700 3500 DAN ION 160000 24500 350 2650 VLAD ION 120000 25060 3500 1222 BARBU DAN 120000 20750 2000 2) Să fie definită o întrerupere la apari ia unei schimbări a valorii coloanei ODS din tabela SALARIA I. În momentul realizării evenimentului să se realizeze salt la pagină nouă.

SQL> SET PAGESIZE 11 SQL> BREAK ON CODS SKIP PAGE; SQL> SELECT * FROM SALARIAT 2 ORDER BY CODS;

MARCA NUME FUNCT CODD SALA VENS CODS 1111 AVRAM ION VINZATOR 100000 21200 1000 1000 2650 VLAP ION VINZATOR 120000 25060 3500 1222 BARBU DAN VINZATOR 120000 20750 2000 MARCA NUME FUNCT CODD SALA VENS CODS 2550 FRINCU ION SEF DEP 160000 36000 37000 2500 3500 DAN ION VINZATOR 160000 24500 350 1680 RADU ION VINZATOR 130000 20750 3000 MARCA NUME FUNCT CODD SALA VENS CODS VENS CODS 2553 AILENEI FLOR VINZATOR 120000 120000 250000 2000 2554 DARIAN GEO VINZATOR 260000 4000 MARCA NUME FUNCT CODD SALA VENS CODS 7000 ION ION DIRECTOR 100000 45000 40000 8000 9records selected.

B. Tipărirea titlurilor

Pentru afişarea unui titlu la sfîrşitul sau la începutul fiecărei pagini se utilizează comanda BTITLE, respectiv TTITLE. Comanda BTITLE are următoarele sintaxe:

BTI[TLE] [COL[UMN] n1 [SKlP [n]] [TAB n] [LEFT | RIGHT | CENTER] [FORMAT char] [char | var]...;

Page 151: HTML Php Mysql Pentru Incepatori-libre

BTI[TLE] {OFF | ON}; BTI[TLE] text; BTI[TLE]

unde: COL[UMN] n determină saltul la coloana n a liniei curente. Prin SKIP n se determină saltul Ia începutul liniei curente, de n ori. Dacă n este omis, se sare o singură dată, iar dacă n este zero, se realizează întorcerea ia începutul liniei curente. TAB n are a efect saltul a n coloane (prin coloană în elegîndu-se nu o coloană de tabelă, ci pozi ia cursorului) înainte dacă n este pozitiv sau înapoi dacă n este negativ. Clauzele LEFT, RIGHT, CENTER determină alinierea la stânga, la dreapta respectiv afişarea centrata a datelor din linia curentă. Următoarele date sunt aliniate ca an grup, de la începutul până la sfârşitul comenzii PRIN sau la următorul LEFT, CENTER, RIGHT sau COLUMN. CENTER şi RIGHT folosesc valoarea returnată de comanda SET LINESIZE pentru a calcula pozi ia următorului articol. FORMAT char specifică un model de format pentru articolul de date care urmează; acest format se men ine până la întîlnirea unei alte clauze FORMAT sau până la sfârşitul comenzii. De re inut că doar un singur model de format poate fi activ la un moment dat. Dacă nici un format potrivit nu are efect, atunci valorile sunt tipărite în conformitate cu formatul specificat în SET NUMFORMAT iar dacă SET UNFORMAT nu a fost utilizat, valorile vor fi tipărite cu formatul implicit.

Pentru specificarea titlurilor pot fi folosite constante (char) şi variabile (var), ele fiind pozi ionate şi formatate aşa cum se specifică în clauzele comenzii.

Existen a unui separator indică începutul unor linii noi, iar doi separatori pe acelaşi rând introduc o linie vidă. Ini ial, caracterul de separare este."!", însă el poate fi schimbat cu SET HEADSEP.

SQL*PLUS interpretează comanda BTITLE îh forma nouă dacă primul cuvânt după numeie comenzii este numele unei clauze valide (LEFT, SKIP, COL etc.).

Clauzele ON şi OFF au ca efect apari ia (ON) sau nu (OFF) a titlului. BTITLE text afişează centrat textul specificat. Comanda BTITLE fără clauze specifică titlul curent. Exemple:

Page 152: HTML Php Mysql Pentru Incepatori-libre

1) Să se afişeze la sfârşitul unui raport final cu privire la produsele din depozitul cu codul 100000, în partea stângă şirul de caractere "Data:" iar în partea dreaptă "Semnătura:".

SQL> SET PAGESIZE 11 SQL> BTITLE LEFT Data: RIGHT Semnătura:; SQL> SELECT � FROM PRODUSE 2 WHERE CODD=100000;

CODD CODP DENP STOC DATA CRT UM 100000 D4 SCAUN 36 10-SEP-05 BUC 100000 A3 FOTOLIU 27 15-SEP-05 BUC 100000 A7 MASA 23 05-SEP-05 BUC Data: Semnatura: 2) Să se afişeze la sfârşitul unui raport privind situa ia produselor din depozitul 100000, începând din coloana 11, şirul de caractere "OBSERVATIT.

SQL> BTITLE COL 11 OBSERVA II; SQL> SELECT * FROM PRODUSE 2 WHERE CODD-100000;

CODD CODP DENP STOC DATACRT UM 100000 166666 PLACAJ 2/2 100 12-JUL-05 MP 100000 144444 SCAUN D4 36 12-JUL-05 BUC 100000 111111 MESE 15/20 7 27-JUN-05 BUC 100000 122222 FOTOLIU A3 12 01-JUL-05 BUC 100000 133333 CANAPEA A7 6 18-JUL-05 BUC 100000 155555 BIROU C6X4 9 29-JUL-05 BUC OBSERVA II 3) Să se afişeze centrat, la sfîrşitul unui raport privind produsele din depozitul cu codul 100000, şirul de caractere"Depozitul_MOBILA/100000".

SQL> BTITLE CENTER Depozitul_MOBILA/100000 SQL> SELECT CODD "Cod depozit", 2 DENP "Denumire", 3 CODP "Cod produs", 4 STOC "Stoc",DATACRT "Data", 5 UM 6 FROM PRODUSE 7 WHERE CODD=100000;

Cod dep Denumire Cod produs Stoc Data UM

Page 153: HTML Php Mysql Pentru Incepatori-libre

100000 PLACAJ 2/2 166666 100 12-JUL-05 MP 100000 SCAUN D4 144444 36 12-JUL-05 BUC 100000 MESE 15/20 111111 7 27-JUN-05 BUC 100000 FOTOLIU A3 122222 12 01-JUL-05 BUC 100000 CANAPEA A7 133333 6 18-JUL-05 BUC 100000 BIROU C6X4 155555 9 29-JUL-05 BUC

Depozitul MOBILA/100000 4) Să se afişeze specifica iile curente pentru BTITLE. Ultima comandă primită în sistem se prezintă astfel:

SQL> BTITLE COL 40 Total RIGHT Semnătura; SQL> BTITLE;

btitle ON and is the following 28 characters: COL 40 Total RIGHT Semnătura

Comanda TTITLE determină afişarea unui titlu la începutul paginii şi are următoarele sintaxe:

TTI[TLE] [COL[UMN] n] [SKIP [1 | n] [TAB n] [LEFT | RIGHT | CENTER] [FORMAT char] [char | var] TTI[TLEI text; TTI[TLE];

Clauzele comenzii TTITLE au aceeaşi semnifica ie ca la BTITLE. Comanda TTITLE fără clauze determină afişarea titlului curent. Exemplu: Să se afişeze la începutul unui raport privind comenzile cu date mai mică de 30 septembrie 2005, următoarele şiruri de caractere: "SITUA IA COMENZILOR" şi "LA DATA DE 30-SEP-05". Cele două şiruri se vor afişa centrat, pe două linii.

SQL> SET PAGESIZE 11 SQL> SET LIN 45 SQL> COLUMN NRCOM FORMAT 99999999 SQL> COLUMN NRCOM JUSTIFY CENTER SQL> COLUMN CODP FORMAT 99999999 SQL> COLUMN CODP JUSTIFY CENTER SQL> COLUMN VALOARE FORMAT 99999999999 SQL> COLUMN VALOARE JUSTIFY CENTER SQL> SET SPACE 7 SQL> TTITLE 'SITUA IA COMENZILOR LA DATA DE 30-SEP-05" SQL> SELECT 2 NRCOM,CODP,CANT*PRET VALOARE

Page 154: HTML Php Mysql Pentru Incepatori-libre

3 FROM COMENZI 4 WHERE DATAL<='30- SEP-05;

SITUATIA COMENZILOR LA DATA DE 30- SEP-05 NRCOM CODP VALOARE 211111 233333 244444 255566 133333 144444 166666 222222 320000 27000 375000 282000 Anularea op iunilor în vederea anulării op iunilor se utilizează comanda:

CL[EAR] option Este anulată op iunea 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ă op iunile indicate în comanda COLUMN; COMP[UTES] anulează op iunile 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 defini iile de coloană.

SQL> CLEAR COLUMNS; Descrierea coloanelor

Pentru specificarea modului de formare a unei coloane şi a capului de coloană într-o situa ie, 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 {număr-de-model | variabila-model} [WRA[PPED]! WOR[D,... WRAPPED] | TRU[NCATED]] ...;

Page 155: HTML Php Mysql Pentru Incepatori-libre

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 acelaşi 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 acelaşi nume, atunci comanda COLUMN se va aplica tuturor tabelelor ce con in acea coloană. Clauza ALIAS pune în coresponden ă numele coloanelor cu sinonimul specificat. Clauza CLEAR are ca efect ştergerea în totalitate a defini iei coloanei. Clauza FORMAT specifică formatul de apari ie ai coloanei. Lă imea implicită a coloanei este chiar lă imea coloanei definite în baza de date. Ea poate fi schimbată cu valoarea n, folosind "FORMAT An". Lă imea unei coloane numerice este implicit valoarea data de NUMWIDTH, ea putând fi schimbată cu ajutorul clauzei FORMAT. Clauza HEADING defineşte capul coloanei, care implicit este col sau expr. Dacă textul din definirea coloanei con ine spa ii sau semne de punctua ie, 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 stînga pentru alte tipuri de coloane. Clauza LIKE determină copierea specifica iilor altei coloane sau expresii (specifica ii deja definite prin altă comandă COLUMN). Prin folosirea clauzei NEWLINE se trece la o linie nouă, înainte de a afişa valorile coloanei. Clauzele PRINT şi NOPRINT au ca efect tipărirea sau nu a coloanei. Dacă se utilizează clauza NULL, textul va fi afişat chiar dacă con ine o valoare nulă. Valoarea implicită este un şir de blancuri. Clauzele OFF sau ON determină folosirea, respectiv nefolosirea formatului specifica iei de ieşire pentru o coloană, fără a-i afecta con inutul. Clauza WRAPPED are ca efect scrierea pe linia următoare a caracterelor care nu au încăput pe prima linie. Clauza WORD_WRAPPED are efect asemănător cu cel al clauzei WRAPPED, cu deosebirea că determină scrierea întregului cuvânt pe linia următoare şi nu pe două rânduri ca la WRAPPED. Clauza TRUNC determină trunchierea valorii. Clauza COLOR specifică culoarea utilizată pentru afişarea valorilor coloanei, într-o reprezentare liniară sau prin benzi. Variabila CLR n (n=l,60)

Page 156: HTML Php Mysql Pentru Incepatori-libre

se referă la valoarea curentă a culorii. Setarea se face prin comanda SET CLR n. Clauza LINEAPP stabileşte modul de subliniere a coloanei. Utilizând LINE dreapta apare continuă. Folosind MARK se schi ează doar puncte, iar BOTH realizează ambele modalită i: linie şi puncte. Clauza PATTERN specifică modelul pe care-1 va avea dreptunghiul/banda într-un grafic de tip benzi sau sectorul într-un grafic de tip cerc. număr-de-model este cuprins între 1 şi 16 şi reprezintă un model. Variabila PAT n, unde ns[l,30] se referă la pozi ia curentă a modelului. Semnifica ia valorilor din număr-de-model şi a valorilor PAT n sunt precizate în documenta ie.

Numărul de comenzi COLUMN folosite indică faptul că se lucrează cu diverse coloane sau expresii utilizate în comanda SELECT. Pentru o coloană sau expresie pot exista mai multe comenzi COLUMN. În cazul în care mai multe comenzi COLUMN folosesc aceeaşi clauză pentru aceeaşi coloană, se va lua în considerare doar ultima comandă.

Comanda COLUMN fără clauze are ca efect tipărirea defini iilor coloanei curente. Dacă această comandă are doar clauzele col şi expr, efectul ei constă în indicarea definirii coloanei existente.

Trebuie precizat că în prima comanda COLUMN, expresia trebuie să aibă aceeaşi formă ca şi în SELECT. În caz contrar, SQL*Plus nu va putea executa comanda COLUMN pentru coloana respectivă. Exemple: 1) Să se definească coloana NUME pe o lă ime de 25 de caractere iar capul de coloană să fie scris pe două rânduri, astfel: NUME PRODUS

SQL> COLUMN NUME FORMAT A25 HEADING 'NUME PRODUS'; 5QL> SELECT DISTINCT(DENP) NUME 2 FROM PRODUSE;

NUME PRODUS MESE 15/20 FOTOLIU 2 records selected. 2) Să se afişeze sinonimul SALARIU pentru coloana definită de expresie aritmetică SALA+VENS. Coloana va fi scrisă cu formatul $99,999.99.

SQL> COLUMN SALA+VENS ALIAS SALARIU SQL> COLUMN SALARIU FORMAT $99,999.99 SQL> SELECT SALA+VENS SALARIU, 2 MARCA, NUME 3 FROM SALARIA I;

SALARIU MARCA NUME $22,200.00 1111 AVRAM ION $22,750.00 1222 BARBU DAN

Page 157: HTML Php Mysql Pentru Incepatori-libre

2 records selected. 3) Să se definească coloana DENP de 16 caractere alfanumerice, pentru care se specifică sinonimul DENUMIRE . In capul de coloană se va afişa textul "Denumire produs".

SQL> COLUMN DENP FORMAT A16 SQL> COLUMN DENP ALIAS DENUMIRE SQL> COLUMN DENUMIRE HEADING "Denumire produs" SQL> SELECT * FROM PRODUSE;

CODD CODP Denumire produs STOC DATACRT UM 100000 166666 PLACAJ 2/2 100 12-JUL-92 MP 100000 122222 FOTOLIU A3 7 27-JUN-92 BUC 100000 133333 CANAPEA A7 36 12-JUL-92 BUC 100000 155555 BIROU C6X4 12 01-JUL-92 BUC 100000 144444 SCAUN D4 6 18-JUL-92 BUC 100000 111111 MESE 15/20 9 29-JUL-92 BUC 6 records selected. 4) Să se definească coloana DENUM2 cu un format alfanumeric de trei caractere. Specifica iile pentru această coloană sunt copiate pentru coloana DENP.

SQL> COLUMN DENUM2 FORMAT A3 SQL> COLUMN DENP LME DENUM2 SQL> SELECT * FROM PRODUSE 2 WHERE CODP<138333;

CODD CODP DEN STOC DATACRT UM 100000 111111 MES 7 27-JUN-05 BUC 5) Să se definească coloana ADRESA pe 21 de caractere, utilizând clauza WRAPPED.

SQL> COLUMN FORMAT A21 ADRESA WRAPPED SQL> SELECT STR11 '-' 11NR11 '-' 11 LOC ADRESA 2 FROM CLIEN I;

ADRESA MOŞILOR- 104-BUCURESTI DOROBAN I- 18-BUCURESTI GOLENTINA-221-BUCURESTI EMINESCU-44-BUCURESTI 4 records selected.

Page 158: HTML Php Mysql Pentru Incepatori-libre

SQL*Plus permite realizarea unor calcule cu rândurile selectate din tabele. Pentru aceasta se utilizează comanda COMPUTE, care are următoarea sintaxă:

COMP[UTE] [AVG | COU[NT] | MAX[IMUM] | MIN[IMUM] NUMBER) ISDT | SUM | VAR[IANCE}] OF { expresiei etichetă),... ON [expresiei etichetă IPAGE1 REPORT! ROW];

Semnifica ia clauzelor este: Clauza Semnifica ia Tipul coloanei Tipuri de

date AVG Valoare medie Numeric COUNT Contorizare valori nule Toate tipurile MAXIMUM Valoare maximă Numeric şi caracter MINIMUM Valoare minimă Numeric şi caracter NUMBER Contorizare rânduri Toate tipurile STD Abatere standard Numeric SUM Suma valorilor nenule Numeric VARIANCE Dispersia Numeric

Dacă se specifică mai multe func ii, nu trebuie separate între ele prin virgulă. OF precizează coloana sau expresia ale căror valori se vor supune calculului. Acestea trebuie să apară în comanda SELECT, altfel comanda COMPUTE le va ignora. Dacă se doreşte ca valoarea calculată să nu fie afişată pe ecran se va utiliza clauza NON PRINT ataşată 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 câte ori se va schimba valoarea acestuia, se va declanşa automat recalcularea func iei definite de COMPUTE.

În cazul în care se dă comanda fără nici o func ie, se vor afişa specifica iile de calcul definite. Secven a de instruc iuni 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 situa ia finală cu următorul format: SITUA IE SUM(SALA) FUNC IE

SQL> SET PAGESIZE 22 SQL>RUN 1 SELECT SUM(SALA),FUNCT FROM SALARIA I

D.Realizarea de calcule

Page 159: HTML Php Mysql Pentru Incepatori-libre

2* GROUP BY FUNCT SITUA IE SUM(SALA) FUNCT 45000 DIRECTOR 179000 SEF DEP 268560 VINZATOR 2) Să se editeze o situa ie finală cu salariile grupate pe func ii şi depozite.

SQL> RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16" 5 FROM SALARIA I 6 GROUP BY FUNCT;

SITUATIE FUNCT DEP DEP DEP DIRECTOR 45000 0 0 SEF DEP 0 71500 107500 VINZATOR 21200 72850 77700 Data: Semnătura: 3) Să se afişeze o situa ie finală cu salariile grupate pe func ii şi depozite. De asemenea, să se introducă o coloană cu suma salariilor pe fiecare func ie.

SQL>RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODD,100000,SALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16", 5 SUM(SALA) 6 FROM SALARIA I 7 GROUP BY FUNCT;

SITUATIE FUNCT DEP 10 DEP 13 DEP 16 SUM(SALA)

DIRECTOR 45000 0 0 45000

SEF DEP 0 71500 107500 179000

VINZATOR 21200 72850 77700 268500

Page 160: HTML Php Mysql Pentru Incepatori-libre

Data: Semnătura: 4) Să se afişeze o situa ie finală cu salariile grupate pe func ii şi depozite. De asemenea, să se facă totalul salariilor pe fiecare depozit şi fiecare func ie.

SQL> BREAK ON DUMMY; SQL> COMPUTE SUM OF "DEP 100000" ON DUMMY; SQI> COMPUTE SUM OF "DEP 130000" ON DUMMY; SQL> COMPUTE SUM OF "DEP 160000* ON DUMMY; SQL> COMPUTE SUM OF "TOTAL" ON DUMMY; SQI> COLUMN DUMMY NOPRINT; SQL> TTITLE CENTER "SITUA IA SALARATILOR" SKIP CENTER "PE DEPOZITE /FUNC II" SKIP CENTER " " SQL> RUN 1 SELECT FUNCT, 2 SUM(DECODE(CODB,lG0000îSALA,0)) "DEP 10", 3 SUM(DECODE(CODD,130000,SALA,0)) "DEP 13", 4 SUM(DECODE(CODD,160000,SALA,0)) "DEP 16", 5 SUM(SALA,) 6 SUM(0) DUMMY 7 FROM SALARIA I 8 GROUP BY FUNCT

SITUATIA SALARIATILOR PE DEPOZITE / FUNCTII FUNCT DEP 10 DEP 13 DEP 16 SUM(SALA)

DIRECTOR 45000 0 0 45000

SEF DEP 0 71500 107500 179000

VINZATOR 21200 72850 77700 268500

66200 144350 185200

Data: Semnătura:

Page 161: HTML Php Mysql Pentru Incepatori-libre

3.13.22. CREAREA UNEI BAZE DE DATE PRIN COMENZI SQL

1. TIPURI DE UTILIZATORI AI BAZELOR DE DATE SQL

În func ie de volumul activită ilor implicate de administrarea unei

baze de date SQL, sarcinile de administrare pot fi repartizate pe mai multe categorii de utilizatori ai bazei de date. Administratorul bazei de date (DBA) este, în func ie de complexitatea şi mărimea unei baze de date, o persoană sau mai multe persoane, care să execute următoarele sarcini administrative: • Instalarea şi dezvoltarea sever-ului SQL; • Alocarea memoriei sistemului şi planificarea cerin elor viitoare de

memorie ale acestuia; • Crearea bazei de date şi a obiectelor acesteia (tabele, viziuni, indecşi); • Modificarea structurii bazei de date în func ie de cerin ele dezvoltatorilor de aplica ii; • Definirea utilizatorilor bazei de date şi între inerea sistemului de securitate; • Controlul şi monitorizarea accesului utilizatorilor la baza de date; • Monitorizarea şi optimizarea performan elor bazei de date; • Definirea şi asigurarea politicii de salvarea sau copiere (backup) şi refacere (recovery) a bazei de date; • Arhivarea datelor; • Asigurarea legăturii cu firma pentru suportul tehnic şi licen a de utilizare a produselor SQL.

Dezvoltatorii de aplicaţii proiectează şi implementează aplica ii cu baze de date SQL, executând următoarele sarcini: • Proiectarea şi dezvoltarea unei aplica ii, precum şi a structurilor de

date ale acesteia; • Estimarea cerin elor de memorie pentru aplica ie; • Definirea modificărilor structurilor de date ale unei aplica ii; • Transmiterea tuturor informa iilor despre activită ile de mai sus către administratorul bazei de date; • Stabilirea măsurilor de securitate pentru aplica ie.

Administratorul de aplicaţii se ocupă cu administrarea unei aplica ii;

Page 162: HTML Php Mysql Pentru Incepatori-libre

Utilizatorii finali ai bazei de date au acces la baza de date prin intermediul unei aplica ii sau a instrumentelor SQL, executând în special următoarele activită i: • Adăugarea, modificarea şi ştergerea datelor din baza de date în

concordan ă cu drepturile de acces pe care le are; • Generarea unor rapoarte cu datele din baza de date. Administratorul de reţea este responsabil cu administrarea produselor SQL de re ea. Pentru a putea executa sarcinile de administrare a unei baze de date o persoană trebuie să aibă privilegii (drepturi) atât la nivelul bazei de date SQL, cât şi la nivelul sistemului de operare al serverului pe care se află baza de date. Prin urmare un administrator trebuie să aibă: • Cont de administrator pentru sistemul de operare, care să-i permită

să execute comenzile sistemului de operare; • Cont de administrator SQL definit de două conturi de utilizator (SYS şi SYSTEM cu parolele CHANGE_OF_INSTALL şi respectiv MANAGER); • Rol de DBA, care este creat automat la momentul creării unei baze de date SQL. Acest rol con ine toate privilegiile bazei de date SQL.

Datorită faptului că un administrator execută activită i pe care un utilizator obişnuit nu le poate executa este necesar ca acesta să poată fi autentificat înainte de a executa activită ile de administrare. Pentru autentificarea administratorului există două metode: autentificarea folosind sistemul de operare şi autentificarea folosind fişierul de parole.

Autentificarea folosind sistemul de operare se face utilizând două conturi de administrator: OSOPER (sub care poate executa STARTUP, SHUTDOWN, ALTER DATABASE OPEN/MOUNT, ALTER DATABASE BACKUP, ARCHIVELOG şi RECOVER) şi contul OSDBA (care con ine toate privilegiile de sistem cu op iunea ADMIN OPTION, precum şi rolul OSOPER). Sub contul OSDBA se poate executa comanda CREATE DATABASE.

Autentificarea folosind fişierul de parole permite definirea parolelor de acces pentru fiecare utilizator. După stabilirea unui utilizator ca administrator, de exemplu utilizatorul SCOTT cu parola TIGER, acestuia îi va fi atribuit unul din privilegiile SYSDBA sau SYSOPER, cu comanda GRANT. După aceasta utilizatorul SCOTT se va conecta la baza de date ca SYSDBA sau SYSOPER cu comanda CONNECT. Exemplu:

GRANT SYSDBA TO scott

Page 163: HTML Php Mysql Pentru Incepatori-libre

GRANT SYSOPER TO scott CONNECT scott/tiger AS SYSDBA CONNECT scott/tiger AS SYSOPER

Administrarea fişierului cu parole include opera iile de definire a fişierului cu parole, setarea parametrului de ini ializare a bazei de date REMOTE_LOGIN_PASSWORDFILE, adăugarea de utilizatori în acest fişier şi întreţinerea fişierului cu parole. Crearea fişierului cu parole se execută cu utilitarul ORAPWD, care are trei parametrii: FILE, PASSWORD şi ENTRIES, dintre care primii doi sunt obligatorii, iar ultimul este op ional. Aceşti parametrii definesc numele fişierului cu parole, parola pentru utilizatorul SYS şi respectiv numărul de utilizatori care pot executa activită i de administrator (DBA). Setarea parametrului de iniţializare REMOTE_LOGIN_PASSWORDFILE cu una din valorile NONE, EXCLUSIVE şi SHARED permite utilizarea fişierului cu parole.Valoarea NONE determină ca baza de date SQL să func ioneze fără fişier de parole, valoarea EXCLUSIVE determină ca fişierul de parole să fie folosit exclusiv de către o singură bază de date, iar valoare SHARED determină ca fişierul de parole să fie folosit de către mai multe baze de date.

Pentru a avea un grad mare de securitate pentru baza de date, va trebui ca imediat după crearea fişierului cu parole parametrul de ini ializare REMOTE_LOGIN_PASSWORDFILE să fie setat pe valoarea EXCLUSIVE.

Adăugarea de utilizatori în fişierul cu parole se face la momentul atribuirii privilegiilor SYSDBA sau SYSOPER unui anumit utilizator.

Exemplu: 1. Se creează fişierul cu parole conform indicaţiilor de mai sus; 2. Se setează parametrul de iniţializare

REMOTE_LOGIN_PASSWORDFILE cu valoarea EXCLUSIVE; 3. Se conectează utilizatorul SYS, cu parola CHANGE_OF_INSTALL

ca SYSDBA folosind comanda CONNECT SYS/change_of_install AS SYSDBA 4. Se porneşte o instanţă şi se creează o bază de date, dacă este

necesar, sau se montează şi se deschide o bază de date existentă; 5. Se creează utilizatorii care se doresc a fi administratori şi care să

fie adăugaţi în fişierul cu parole, folosind comanda CREATE USER user1 IDENTIFIED BY parola1 6. Se atribuie unul din privilegiile SYSDBA sau SYSOPER acestui

utilizator cu una din comenzile: GRANT SYSDBA TO user1 sau GRANT SYSOPER TO user1

Page 164: HTML Php Mysql Pentru Incepatori-libre

7. Utilizatorul USER1 este adăugat în fişierul cu parole şi se poate conecta acum ca SYSDBA sau SYSOPER cu acest nume de utilizator în loc de numele SYS, folosind una din comenzile:

CONNECT USER1/parola1 AS SYSDBA sau CONNECT USER1/parola1 AS SYSOPER

Listarea membrilor fişierului cu parole se face din viziunea $PWFILE_USERS folosind comanda SELECT * FROM V$PWFILE_USERS Întreţinerea fişierului cu parole se referă la executarea activită ilor de extindere, relocare, ştergere sau schimbare a stării acestui fişier.

2. CREAREA, PORNIREA ŞI OPRIREA UNEI BAZE DE DATE SQL

Configurarea serverului SQL presupune următoarele activită i: • Instalarea sistemului SQL, care constă în instalarea nucleului SQL pe server, a instrumentelor (tools-urilor) de aplica ie pe sta ii; • Evaluarea resurselor fizice ale calculatorului pe care se va instala serverul SQL şi baza de date; • Definirea structurii logice a bazei de date şi a strategiei de salvare (backup); • Crearea şi deschiderea bazei de date; • Implementarea bazei de date proiectate, prin definirea segmentelor de revenire (rollback), a tabelelor spa iu şi a obiectelor bazei de date; • Salvarea bazei de date şi definirea utilizatorilor bazei de date, în concordan ă cu licen a SQL. Pentru a crea o bază de date SQL trebuie să avem suficientă

memorie pentru pornirea unei instan e SQL şi pentru crearea tuturor obiectelor proiectate ale bazei de date. Dacă la momentul instalării s-a creat şi o bază de date ini ială atunci aceasta poate fi dezvoltată astfel încât să cuprindă, în final, toate obiectele bazei de date proiectate. De asemenea această bază de date ini ială poate fi ştearsă şi în locul ei să se creeze o nouă bază de date. Dacă am folosit o versiune anterioară SQL se poate crea o bază de date nouă în întregime, dacă nu ne mai interesează vechea bază de date, altfel putem migra această bază de date la noua versiune SQL.

Crearea unei baze de date se face în următorii paşi: • Salvarea completă a bazei de date existente; • Crearea fişierului cu parametrii folosit la pornirea bazei de date. • Editarea noului fişier cu parametrii, astfel încât parametrii acestuia să corespundă cerin elor noii baze de date.

Page 165: HTML Php Mysql Pentru Incepatori-libre

• Controlul identificatorului instan ei SQL, care trebuie să fie identic cu numele bazei de date setat în parametrul DB_NAME; • Pornirea utilitarul Entreprice Manager şi conectarea la SQL ca administrator. • Pornirea unei instanţe SQL (System Global Area şi procesele background) cu op iunea Startup Nomount. • Crearea noii bazei de date folosind comanda SQL CREATE DATABASE, prin intermediul căreia SQL execută: crearea fişierelor de date (data files), fişierelor de control (control files) şi a fişierelor de refacere (redo log) ale bazei de date; crearea tabelei spa iu SYSTEM şi a segmentului rollback SYSTEM; crearea dic ionarului de date; crearea utilizatorilor SYS şi SYSTEM; specifică setul de caractere care va fi folosit la memorarea datelor în baza de date; montează şi deschide baza de date pentru utilizare. • Salvarea integrală a bazei de date. Parametrii de ini ializare a bazei de date furnizează valorile necesare

pentru func ionarea acesteia sub o anumită instan ă SQL. Aceştia se personalizează prin intermediul unui fişier text, numit fişierul cu parametrii de ini ializare. Acesta este citit la momentul pornirii bazei de date de către serverul SQL. Pentru a face eventuale modificări, baza de date trebuie oprită complet şi repornită după ce s-au efectuat astfel de modificări. Mul i parametrii de ini ializare se folosesc pentru ajustarea şi creşterea performan elor bazei de date. Specificarea parametrilor se realizează după următoarele reguli: • To i parametrii sunt op ionali; • În fişierul cu parametrii se vor fi introduce numai parametrii şi

comentarii; • Semnul (#) marchează începutul unui comentariu, restul liniei fiind ignorat; • Serverul SQL are valori asumate pentru fiecare parametru; • Parametrii pot fi specifica i în orice ordine; • Fişierul de parametrii nu este „case-sensitive” ; • Pentru a introduce mai mul i parametrii pe o linie aceştia se vor separa prin spa iu:

PROCESSES = 100 SAVEPOINTS = 5 OPEN_CURSORS = 10 • Unii parametrii, ca de exemplu ROLLBACK_SEGMENTS, acceptă valori multiple, acestea putându-se specifica între paranteze şi separate prin virgulă, sau fără paranteze şi virgule, ambele sintaxe fiind valide, astfel: ROLLBACK_SEGMENTS = (SEG1, SEG2, SEG3, SEG4, SEG5)

Page 166: HTML Php Mysql Pentru Incepatori-libre

ROLLBACK_SEGMENTS = SEG1 SEG2 SEG3 SEG4 SEG5 • Caracterul (/) foloseşte pentru marcarea întreruperii scrierii unui parametru pe o linie şi continuarea lui pe linia următoare, imediat fără nici un spa iu în fa ă, astfel: ROLLBACK_SEGMENTS = (SEG1, SEG2, \

SEG3, SEG4, SEG5) • Parametrul IFILE se poate introduce într-un fişier cu parametrii alt fişier cu parametrii, astfel:

IFILE = COMMON1.ORA Se pot folosi trei niveluri de imbricare. În exemplu de mai sus

fişierul COMMON1.ORA poate con ine un al doilea parametru IFILE pentru fişierul COMMON2.ORA, care la rândul său poate con ine un al treilea parametru IFILE pentru fişierul COMMON3.ORA. De asemenea, se pot utiliza mai mul i parametrii IFILE în acelaşi fişier, astfel:

IFILE = DBPARMS.ORA IFILE = GCPARMS.ORA IFILE = LOGPARMS.ORA Dacă valoarea unui parametru con ine caractere speciale, atunci

caracterul special trebuie precedat de caracterul de comutare (\) sau întreaga valoare este inclusă între caracterele (“ ”), ca în exemplul de mai jos:

DB_DOMAIN = JAPAN.ACME\#.COM sau DB_DOMAIN = "JAPAN.ACME#.COM" Pentru schimbarea valorii unui parametru, aceasta se editează în

fişierul cu parametrii. Când instan a SQL este repornită aceasta va folosi noua valoare a parametrului.

Câ iva parametrii de ini ializare sunt dinamici, în sensul că valorile acestora se pot modifica prin procedeul de mai sus sau în timp ce o instan ă rulează, folosind comenzile SQL: ALTER SESSION, ALTER SYSTEM sau ALTER SYSTEM DEFERRED cu sintaxele:

ALTER SESSION SET nume_parametru = valoare ALTER SYSTEM SET nume_parametru = valoare ALTER SYSTEM SET nume_parametru = valoare DEFERRED

Comanda ALTER SESSION schimbă valoarea unui parametru numai la nivelul sesiunii care a lansat-o, după repornirea bazei de date se va utiliza iarăşi valoarea din fişierul cu parametrii.

Comanda ALTER SYSTEM modifică valoarea globală a parametrului, la nivelul întregului sistem, deci pentru toate sesiunile active, după repornirea bazei de date se va utiliza iarăşi valoarea din fişierul cu parametrii.

Page 167: HTML Php Mysql Pentru Incepatori-libre

Comanda ALTER SYSTEM DEFERRED modifică valoarea globală a parametrului nu pentru sesiunile active, ci pentru sesiunile viitoare, care vor fi active după repornirea bazei de date.

Afişarea valorilor curente ale parametrilor de ini ializare ai bazei de date se face cu comanda SHOW PARAMETERS, afişarea făcându-se în ordinea alfabetică a parametrilor. Listarea la imprimantă a parametrilor afişa i se face cu comanda SPOOL.

Parametrii de ini ializare se pot grupa în: • Parametrii derivaţi sunt cei ale căror valori se calculează pornind de la valorile altor parametrii. Normal valorile acestora nu trebuie modificate; • Parametrii globali prefixaţi cu GC sunt folosi i pe sistemele care suportă SQL Parallel Server; • Parametrii dependenţi de sistemul de operare sunt cei ale căror valori sunt dependente de specificul sistemului de operare gazdă. Exemplu: DB_BLOCK_BUFFERS care indică numărul ariilor de date (data buffers) din memoria principală sau DB_BLOCK_SIZE care indică mărimea unui bloc de date; • Parametrii de tip variabilă sunt cei ce pot lua anumite valori care să determine performan ele sistemului sau anumite limite de func ionare. Exemplu: OPEN_CURSORS dacă i se dă valoarea 10 se vor putea deschide maxim 10 cursoare, iar DB_BLOCK_BUFFERS prin valorile pe care le va lua nu va impune anumite limite dar va modifica performan ele sistemului; • Parametrii statici sunt cei ale căror valori nu se pot modifica în timpul unei sesiuni sau cu baza de date pornită; • Parametrii dinamici sunt cei ale căror valori se pot modifica, aşa cum s-a arătat mai sus cu comenzile ALTER SESSION, ALTER SYSTEM sau ALTER SYSTEM DEFERRED;

Aşa cum s-a prezentat mai sus compania SQL furnizează un fişier ini ial cu parametrii cu ajutorul căruia putem să pornim o bază de date Pentru a personaliza baza de date conform cerin elor beneficiarului, administratorul va trebui să seteze valori noi pentru anumi i parametrii specifica i mai jos, astfel: • DB_NAME defineşte numele bazei de date. Se formează dintr-un şir de

maximum opt caractere. Dacă nu se furnizează, SQL atribuie bazei de date un nume standard. Acesta se găseşte în fişierul cu parametrii furnizat o dată cu software-ul SQL. În timpul creerii bazei de date numele acesteia este scris în fişierele de date, de control şi de log.

Exemplu: DB_NAME = BAZA1

Page 168: HTML Php Mysql Pentru Incepatori-libre

• DB_DOMAIN este format dintr-un şir de caractere şi defineşte domeniul din re ea căruia apar ine baza de date, de obicei este definit de numele organiza iei căreia apar ine baza de date. Dacă se utilizează numele domeniului din Internet, atunci partea adresei de e-mail care urmează după caracterul ”@” este foarte bună pentru a fi folosită ca valoare pentru acest parametru. Exemplu: DB_DOMAIN = BUC.ORG.COM • GLOBAL_NAMES defineşte numele global al bazei de date în cadrul re elei de calculatoare şi este format din numele bazei de date şi numele domeniului separate prin punct. Acest parametru mai poate lua şi valorile: TRUE (caz în care se for ează ca numele global al bazei de date să fie identic cu cel al bazei de date) sau FALSE (numele global nu are semnifica ie, nu se utilizează).

Exemplu: GLOBAL_NAMES =FALSE • CONTROL_FILES defineşte numele fişierelor de control ce vor fi create pentru baza de date(se va furniza pentru fiecare fişier calea completă de acces la acesta). Este recomandat ca să se definească cel pu in două fişiere de control, care să fie plasate pe două discuri diferite.

Exemplu: CONTROL_FILES =diska:cntrl1.ora,diskb:cntrl2.ora • LOG_FILES specifică numărul maxim de grupuri de fişiere de log ce pot fi utilizate pentru o bază de date. Ia valori de la 2 la 255. Acest parametru specifică totodată şi numărul minim de fişiere de log ce pot fi deschise pentru o bază de date. • DB_FILE_MULTIBLOCK_READ_COUNT defineşte numărul de blocuri citite simultan pentru accesarea unei tabele a bazei de date. Este folosit pentru optimizarea parcurgerii totale a unei tabele atunci când se caută o anumită valoare a unei coloane aferentă unui rând din aceasta. • REMOTE_LOGIN_PASSWORDFILE specifică dacă se foloseşte sau nu fişierul cu parole pentru identificarea utilizatorilor ce pot executa activită i de administrator. Poate lua valorile: NONE nu se foloseşte fişierul de parole iar utilizatorul care va executa activită i de administrare trebuie să fie autentificat de către sistemul de operare gazdă; EXCLUSIVE se foloseşte un singur fişier cu parole pentru o singură bază de date. Pe lângă utilizatorii SYS şi SYSTEM şi al i utilizatori pot executa sarcini de administrare; SHARED se foloseşte un singur fişier cu parole pentru mai multe baze de date, caz în care singurii utilizatori ce pot executa activită i de administrare sunt SYS şi SYSTEM. În acest caz nu se pot adăuga al i utilizatori în fişierul cu parole.

Page 169: HTML Php Mysql Pentru Incepatori-libre

• DB_FILES specifică numărul maxim de fişiere de date ce pot fi deschise de către o bază de date. De fiecare dată când se modifică acest parametru baza de date se opreşte şi apoi se reporneşte. • LOG_CHECKPOINT_INTERVAL specifică frecven a punctelor de control (checkpoites) ; • LOG_CHECKPOINT_TIMEOUT specifică timpul maxim dintre două puncte de control în secunde; • PROCESSES specifică numărul maxim de utilizatori care se pot conecta simultan la baza de date, iar acest număr trebuie să fie mai mare decât numărul total de procese background, Job Queue şi Parallel Query; • ROLLBACK_SEGMENTS defineşte toate segmentele rollback pe care o instan ă le poate acapara la momentul pornirii. Valoarea acestui parametru se dă sub forma unei liste de valori. Exemplu: ROLLBACK_SEGMENTS = (rbseg1, rbseg2, rbseg3, rbseg4) • LICENSE_MAX_SESSIONS specifică numărul maxim de utilizatori concuren iali ce pot fi admişi în timpul unei sesiuni; • LICENSE_MAX_USERS specifică numărul maxim de utilizatori ce pot fi crea i pentru o bază de date. LICENSE_MAX_SESSIONS şi LICENSE_MAX_USERS nu pot avea simultan valori diferite de zero, deci unul din aceşti parametrii trebuie să fie setat pe zero; • LICENSE_SESSIONS_WARNING specifică numărul de utilizatori concuren iali. Dacă se depăşeşte, se emite un mesaj de aten ionare; • TRANSACTIONS_PER_ROLLBACK_SEGMENT specifică numărul tranzac iilor concurente permise pe un segment rollback; • AUDIT_TRAIL activează sau dezactivează scrierea rândurilor în fişierul de audit. Înregistrările de audit nu se scriu dacă parametrul are valoarea NONE sau lipseşte. Zona de memorie SGA (System Global Area) con ine următoarele

structuri de memorie: database buffer cache, redo log buffer şi shared pool. Database Buffer Cache este por iunea din SGA ce con ine blocurile de date citite din fişierele de date ale bazei de date. Redo log buffer este zona în care se păstrează informa ii despre modificările efectuate în baza de date. Shared pool este o zonă care con ine la rândul său trei structuri de memorie: library cache, dictionary cache şi control structures. Dic ionarul de date al bazei de date este citit în zonele library cache şi dictionary cache.

Mărimea SGA este influen ată de valorile parametrilor următori: • DB_BLOCK_SIZE defineşte, în bytes, mărimea unui singur bloc de date. Valorile tipice pentru acest parametru sunt 2048 şi 4096;

Page 170: HTML Php Mysql Pentru Incepatori-libre

• DB_BLOCK_BUFFERS specifică numărul de buffere ale bazei de date disponibile în zona database buffer cache, a cărei mărime este egală cu DB_BLOCK_SIZE * DB_BLOCK_BUFFERS; • LOG_BUFFER determină mărimea în bytes a zonei redo log buffer • SHARED_POOL_SIZE specifică mărimea în bai i a ariei Shared pool. Acest parametru poate accepta valori numerice urmate de literele "K" sau "M", unde "K" înseamnă că numărul va fi multiplicat cu 1000, iar "M" înseamnă că numărul va fi multiplicat cu 1000000. • OPEN_CURSORS specifică numărul maxim de cursoare pe care o sesiune le poate deschide simultan. Valoarea asumată este de 50. Este bine ca acest număr să fie cît mai mare pentru a nu avea probleme cu rularea unei aplica ii. • TRANSACTIONS specifică numărul maxim de tranzac ii concurente. O valoare mare a acestui parametru determină mărirea zonei de memorie SGA.

Exemple de creare a unei baze de date 1) CREATE DATABASE; În acest caz se crează o bază de date SQL în care to i parametrii comenzii CREATE DATABASE iau valorile standard. 2) CREATE DATABASE baza1 LOGFILE GROUP 1 ('diskb:log1.log', 'diskc:log1.log') SIZE 50K, GROUP 2 ('diskb:log2.log', 'diskc:log2.log') SIZE 50K MAXLOGFILES 5 MAXLOGHISTORY 100 MAXDATAFILES 10 ARCHIVELOG CHARACTER SET US7ASCII DATAFILE 'diska:datfile1.dat' SIZE 2M DATAFILE 'disk1:datfile2.dbf' AUTOEXTEND ON

'disk2:datfile3.dbf' AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;

După crearea unei baze de date, instan a SQL poate fi lăsată să

ruleze, iar baza de date este deschisă şi montată pentru utilizare normală. Pentru opririle şi pornirile ulterioare se poate utiliza SQL Enterprise Manager. Pornirea şi oprirea bazei de date

Page 171: HTML Php Mysql Pentru Incepatori-libre

O bază de date şi instan a SQL se poate porni cu utilitarul SQL Enterprise Manager folosind fereastra de dialog Startup Database. O instanţă şi o bază de date asociată se pot porni în mai multe moduri. Pornirea instan ei fără montarea bazei de date se face atunci când dorim să creăm o bază de date. Activitatea se execută din fereastra de dialog Startup Database prin selectarea butonului radio Startup Nomount; Pornirea instan ei şi montarea bazei de date, aceasta rămânând închisă se execută atunci când dorim să executăm anumite activită i de între inere: redenumirea fişierelor de date; adăugarea, ştergerea sau redenumirea fişierelor redo log; recuperarea integrală a bazei de date; Această pornire se execută din fereastra de dialog Startup Database prin selectarea butonului radio Startup Mount. Montarea bazei de date se poate execută şi după pornirea unei instan e fără bază de date montată, cu ajutorul comenzii SQL ALTER DATABASE cu op iunea MOUNT. Exemplu: SQL> ALTER DATABASE baza1 MOUNT; Pornirea instan ei, montarea bazei de date şi deschiderea acesteia se face în mod nerestricţionat (accesibilă tuturor utilizatorilor care au cu privilegiul CREATE SESSION) sau restricţionat (accesibilă doar utilizatorilor de tip DBA, utilizatorilor cu privilegiile CREATE SESSION şi RESTRICTED SESSION). În modul de pornire restric ionat se pot executa activită i ca: recrearea indecşilor; exportul sau importul datelor bazei de date; încărcarea datelor cu utilitarul SQL*Loader; blocarea temporară a accesului utilizatorilor obişnui i la baza de date. Pornirea în mod nerestricţionat se face din fereastra de dialog Startup Database prin selectarea butonului radio Startup Open. Pornirea în mod restricţionat se face din fereastra de dialog Startup Database prin selectarea butonului radio Restrict Deschiderea unei baze de date se poate face după ce instan ă a fost pornită, baza de date montată dar închisă, cu ajutorul comenzii SQL ALTER DATABASE cu op iunea OPEN. Exemplu: SQL> ALTER DATABASE baza1 OPEN; Transformarea modului de pornire normală a unei baze de date în modul restric ionat se poate face şi cu comanda SQL ALTER SYSTEM cu op iunea ENABLE RESTRICTED SESSION , iar revenirea la situa ia ini ială se face cu aceeaşi comandă dar cu op iunea DISABLE RESTRICTED SESSION Exemplu: SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;

SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

Page 172: HTML Php Mysql Pentru Incepatori-libre

În anumite circumstan e este posibil ca activită ile de pornire a bazei de date şi instan ei SQL să se execute altfel decât în mod uzual. Astfel putem avea: • pornirea forţată a unei instanţe, care se poate realiza atunci când

instan a curentă nu poate fi oprită cu succes prin folosirea butoanelor radio Normal sau Immediate din fereastra de dialog Startup. În acest caz se poate for a pornirea unei noi instan e SQL, care va determina oprirea instan ei anterioare aflată în situa ia de mai sus. • pornirea unei instanţe, montarea bazei de date şi pornirea procesului de recuperare a bazei de date, a tabelelor spaţiu sau a fişierelor de date, care se execută atunci când ştim că mediul bazei de date are nevoie de recuperare. • pornirea în modul exclusiv sau paralel, care se face atunci când avem un server SQL care permite accesul mai multor instan e la aceeaşi bază de date. • pornirea automată a bazei de date la momentul pornirii sistemului de operare, se face dacă dorim acest lucru. • pornirea unei instanţe şi a unei baze de date la distanţă, se face atunci când serverul SQL este o parte a unui sistem de baze de date distribuite. Oprirea unei baze de date se poate face în două moduri: normal sau

for at. Modul normal, în care oprirea bazei de date se face ca revers al

opera iei de pornire normală, sens în care se execută închiderea bazei de date, demontarea bazei de date şi oprirea instan ei SQL. Activitatea se execută din fereastra de dialog Shutdown Database prin selectarea butonului radio Normal. Oprirea unei baze de date în condi ii normale presupune executarea de către SQL a următoarelor activită i: oprirea conectărilor la baza de date; deconectarea tuturor utilizatorilor; la următoarea pornire a bazei de date nu se pornesc procedurile de recuperare. Modul forţată se poate execută în două moduri: imediat sau prin anularea instan ei. Oprirea imediată a bazei de date se execută în cazul unui incident iminent. În cadrul acestei opriri se execută instruc iunea SQL aflată în lucru şi orice altă tranzac ie nefinalizată este anulată prin procesul de rollback; to i utilizatorii conecta i sunt deconecta i imediat.

Oprirea se face din fereastra de dialog Shutdown Database prin selectarea butonului Immediate.

Page 173: HTML Php Mysql Pentru Incepatori-libre

Oprirea prin anularea instan ei se execută dacă baza de date sau una din aplica iile sale func ionează anormal şi nici una din metodele de oprire anterioare nu func ionează. Această oprire se execută din fereastra de dialog Shutdown prin setarea butonului radio Abort. În timpul acestei opriri se finalizează instruc iunile SQL aflate în lucru, tranzac iile nefinalizate nu mai sunt aduse la starea anterioară momentului începerii acestora (nu mai sunt anulate prin procesul de roll back), iar to i utilizatorii sunt deconecta i imediat.

3. CREAREA ŞI ACTUALIZAREA TABELELOR

Comanda de creare a unei tabele, CREATE TABLE, realizează fie definirea unei tabele, urmând ca introducerea de date să se efectueze ulterior, fie definirea şi încărcarea cu date a unei tabele, chiar în momentul creerii ei, folosind sintaxele:

CREATE TABLE nume-tabelă (spec-col [NOT NULL],...) SPACE definire-spaţiu [PCTFREE n] | CLUSTER nume-cluster (nume-col,...)]; CREATE TABLE nume-tabelă [(nume-col [NOT NULL],...)] [SPACE definire-spatiu [PCTFREE n] CLUSTER nume-cluster (nume-col,...)] [AS cerere] Unde: spec-col cuprinde nume-col, format, mărime. nume-col este numele coloanei din tabelă. format reprezintă formatul coloanei din tabelă.Formatele acceptate sunt specificate în tabelul următor: Tipul datelor

Formatul Explica ii

Char CHAR( mărime) Date alfanumerice. Marimea maximă a coloanei este de 240 caractere.

Date DATE Permit introducerea câmpurilor de tip dată. Exemplu: January 1, 4712 BC to December 31, 4712 AD

Page 174: HTML Php Mysql Pentru Incepatori-libre

Long LONG Date caracter de mărime variabilă, într-o tabelă trebuie să fie definită doar o coloană de tip LONG.

LONG VARCHAR La fel ca LONG. LONG ROW Date binare RAW. Numerice NUMBER Date numerice de mărime implicită. NUMBER (mărime) Date numerice de mărime specificată. NUMBER (întregi

zecimali) Date numerice în baza zece.

NUMBER(*) La fel ca datele de tip NUMBER. DECIMAL La fel ca datele de tip NUMBER. FLOAT Nu acceptă descrierea mărimii coloanei. INTEGER La fel ca datele de tip NUMBER. INTEGER (mărime) Nu acceptă descrierea mărimii zecimalelor. SMALLINT La fel ca date de tip INTEGER RAW RAW(mărimea) Date binare RAW. Mărimea maximă este 240 octe i. LONGRAW Date de tip LONG.

În cazul celei de-a doua sintaxe, tipul şi mărimea coloanelor vor fi copiate din rezultatul ob inut în urma specificării AS cerere. În ambele sintaxe se utilizează alte cuvinte cheie sau parametrii, care au următoarea semnifica ie: NULL sau NOT NULL se referă la câmpurile din coloane care pot avea sau nu valori nule. Clauzele nume-col [NOT NULL] se pot repeta pentru maximum 254 de coloane. SPACES desemnează modelul de alocare a spa iului pentru tabela ce se crează. Modelul este creat în prealabil cu CREATE SPACES. Dacă parametrul SPACE este omis, pentru to i parametrii de spa iu vor fi utilizate valorile implicite din comanda CREATE SPACE. PCTFREE permite specificarea unei alte valori dectt cea implicită de 20% pentru spa iul lăsat liber. Are aceeaşi func ie ca şi în comanda CREATE SPACE. CLUSTER este parametrul care indică faptul câ tabela va fi inclusă în clusterul cu numele nume-cluster. Introducerea datelor în tabela va declanşa memorarea lor în ordinea indicelui de cluster. Nume-col se referă la numele coloanelor din tabelă care corespund coloanelor din cluster. Exemplu:

Page 175: HTML Php Mysql Pentru Incepatori-libre

Să se creeze tabelele: PRODUSE, CLIEN I, PRETURI SALARIATI, DEPOZITE, COMENZI ce intră în componen a bazei de date COMBAZA.

SQL> CREATE TABLE PRODUSE 2 (CODD NUMBER(6) NOT NULL, 3 CODP NUMBER(5) NOT NULL, 4 DENP CHAR(11), 5 STOC NUMBER(6), 6 DATACRT DATE, 7 UM CHAR(3)); Table created. SQL> CREATE TABLE CLIEN I 2 (CODC NUMBER(6) NOT NULL, 3 DENC CHAR(11), 4 LOC CHAR(11), 5 STR CHAR(16), 6 NRCHARC3), 7 CONTNUMBER(11), 8 TEL NUMBER(8), 9 TFAX NUMBER(8)) Table created. SQL> CREATE TABLE PRETURI 2 CODP NUMBER(5) NOT NULL, 3 PRETMAX NUMBEB(9,2), 4 PRETMIN NUMBER(9,2), 6 DATAI DATE, 6 DATASF DATE); Table created. SQL> CREATE TABLE SALARIATI 2 (MARCA NUMBER(4) NOT NULL, 3 NUME CHAR(16), 4 FUNCT CHAR(7), 6 CODD NUMBER(G) NOT NULL, 6 SALA NUMBER(9,2) 7 VENS NUMBER(9.2), 8 CODS NUMBER(4) NOT NULL); Table created. SQL> CREATE TABLE DEPOZITE 2 (CODD NUMBER(6) NOT NULL, 3 DEND NUMBER(6) NOT NULL, 4 NRSAL NUMBER(2)); Table created. SQL> CREATE TABLE COMENZI 2 (NRCOM NUMBER(6) NOT NULL,

Page 176: HTML Php Mysql Pentru Incepatori-libre

3 CODP NUMBER(5) NOT NULL, 4 CODC NUMBEIK6) NOT NULL, 5 DATAL DATE, 6 CANT NUMBER(7), 7 PRE NUMBER(9-2)); Table created. Modificarea unei tabele presupune adăugarea de noi coloane la

sfîrşitul acesteia sau modificarea tipurilor unor coloane deja existente. Comanda care realizează aceste opera ii este ALTER TABLE. Sintaxa ei este: ALTER TABLE table {ADD | MODIFY} (spec-col [NULL | NOT NULL,...]) unde: ADD adaugă la sfârşitul tabelei noi coloane care ini ial au valori nule; ulterior, prin actualizare, aceste coloane se vor completa cu date. MODIFY schimbă definirea unei coloane existente. Modificarea tipului sau mărimii unei coloane presupune ca aceasta să con ină numai valori nule. spec-col reprezintă numele, formatul şi mărimea coloanei ce se va adăuga sau se va modifica. NULL se referă la faptul că valorile din coloană ce se adaugă/modifică sunt nule. NOT NULL specifică faptul că o coloană nu poate avea valori nule (NOT NULL). Unei coloane deja existente i se poate ataşa parametrul NOT NULL numai dacă aceasta con ine valori nenule. Exemple: 1) Să se adauge la tabela DEPOZITE o nouă coloană CANTDEP ce nu a fost prevăzută ini ial.

SQL> ALTER TABLE DEPOZITE ADD 2 (CANTDEP NUMBER(7)); Table altered.

2) Să se modifice atributele coloanei CANTDEP (respectiv mărirea acesteia cu două unită i).

SQL> ALTER TABLE DEPOZITE MODIFY 2 (CANTDEP NUMBER(9)); Table altered.

Page 177: HTML Php Mysql Pentru Incepatori-libre

Pentru ştergerea unei tabele într-o bază de date se utilizează comanda DROP TABLE. Sintaxa ei este:

DROP TABLE nume-tabelă:

În general, nu se pot şterge tabelele create de al i utilizatori. La ştergerea unei tabele. se şterg automat indecşii corespunzători (create fie de către proprietarul tabelei, fiu de către al i utilizatori) şi privilegiile conferite în legătură cu ea. Rămân, însă, viziunile şi sinonimele referitoare la tabela ştearsă, care vor deveni invalide. Va trebui fie ca acestea să fie şterse, fie să se definească sau să se redefinească tabela în aşa fel incât viziunile şi sinonimele să devină valide. Exemplu: Să se steargă tabela DEPOZITE.

SQL> DROP TABLE DEPOZITE; Table dropped.

Se pot modifica numele atribuite tabelelor, sau sinonimelor utilizând comanda RENAME. Sintaxa ei este:

RENAME nume-vechi TO nume-nou; unde: nume-vechi şi nume-nou sunt constante de tip şir de caractere (nu se scriu între ghilimele sau apostrofuri).

4. CREAREA ŞI ACTUALIZAREA INDECŞILOR

În vederea ob inerii de performan e superioare privind accesul la tabelele unei baze de date se pot construi indecşi folosind comanda CREATE INDEX.

Comanda are ca efect crearea unui index la o tabelă, index care va con ine câte o intrare pentru fiecare valoare care apare în coloana specificată pentru tabela respectivă. Această coloană se numeşte coloana de index. Sintaxa comenzii CREATE INDEX este: CREATE [UNIQUE] INDEX nume-index ON nume-tabela (nume-col [ASC | DESC], nume-col [ASC | DESC],...) [COMPRESS | NOCOMPRESS] [SYSSORT | NOSYSSORT] [ROWS =n][PCTFREE = {20 | n}];

Page 178: HTML Php Mysql Pentru Incepatori-libre

unde: UNIQUE se referă la faptul că tabela nu va con ine două rânduri cu aceleaşi valori în coloanele index (deci nu vor exista dubluri în coloana index). Dacă se omite, tabela poate con ine oricâte asemenea rânduri care să aibă în coloana index aceeaşi valoare. ASC|DESC precizează ordinea în care va fi păstrat indexul: ascendentă sau descendentă. COMPRESS indică faptul că indecşii pot fi comprima i, reducându-se în acest mod spa iul necesar memorării acestora şi mărindu-se viteza opera iilor care folosesc indecşii. Comprimarea nu permite găsirea într-un index a valorii unui anumit câmp fără să acceseze tabela. NOCOMPRESS suprimă comprimarea indecşilor. SYSSORT specifică faptul că procedura standard SQL de sortare este folosită pentru a crea un index. NOSYSSORT este folosit pentru depanare. ROWS specifică numărul aproximativ de rânduri ce urmează a fi indexate. Acest număr este utilizat pentru a optimiza sortarea în SYSSORT. Clauza nu are efect în SQL*Plus. PCTFREE specifică, în momentul creării indexu-lui, procentul din spa iul pentru index ce trebuie să rămînă liber pentru actualizări. Nu are efect asupra extensiilor alocate după crearea indexului.

Indexul creat permite creşterea vitezei de acces la datele unei tabele prin intermediul coloanei index datorită faptului că se vor căuta rândurile corespunzătoare valorilor coloanei index, fără a citi întreaga tabelă. Deoarece indexul şi tabela trebuie actualizate, introducerile, ştergerile şi modificările în câmpul de valori ale coloanei index necesită un timp mai mare. De aceea, se recomandă crearea de maxim 3 indecşi pentru o tabelă. In func ie de necesită i, se pot creea şi şterge în mod dinamic indecşi.

Indecşii crea i pentru o singură tabelă trebuie să aibă nume distincte. Pentru tabele diferite pot fi crea i indecşi cu acelaşi nume. În momentul ştergerii acestor indecşi 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 cărui 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:

Page 179: HTML Php Mysql Pentru Incepatori-libre

WITH LIST salvează informa iile referitoare la index într-un fişier. nume-index este numele indexului ce urmează a fi validat. Dacă indexul este valid, comanda va afişa un mesaj corespunzător (Index validated). Ob inerea oricărui alt mesaj va determina ştergerea indexului şi recrearea lui. Ştergerea unui index din baza de date se realizează cu ajutorul comenzii DROP INDEX, cu sintaxa: DROP INDEX nume-index [ON nume-tabelă];

Dacă pe o anumită tabelă a fost creat un singur index, numele tabelei respective poate fi omis în linia de comandă. Este posibil ca doi indecşi crea i pe tabele diferite să aibă acelaşi nume. În acest caz, în linia de comandă vor apărea atît numele indexului cât şi al tabelei pentru care a fost creat. Se recomandă numai ştergerea indecşilor proprii. Exemple: 1) Să se creeze un index cu numele SUMAR pentru coloana FUNCT din tabela SALARIA I.

SQL> CREATE INDEX SUMAR 2 ON SALARIATI(FUNCT); Index created

2) Să se creeze un index cu numele MARCA pentru coloana MARCA din tabela SALARIA I.

SQL> CREATE INDEX MARCA 2 ON SALARIAT(MARCA); Index created.

3) Să se creeze un index cu numele MARCA din pentru coloana MARCA clia tabela SALARIA I cu suprimarea comprimării lui.

SQL> CREATE INDEX MARCA 2 ON SALARIATI(MARCA) NOCOMPRESS; Index created.

4) Să se verifice integritatea indexului SUMAR. SQL> VALIDATE INDEX SUMAR; Index validated.

6) Să se verifice integritatea indexului MARCA pentru tabela SALARIA I. SQL> VALIDATE INDEX MARCA ON SALARIA I; Index validated.

7) Să se şteargă indexul SUMAR. SQL> DROP INDEX SUMAR; Index dropped.

8) Să se şteargă indexul MARCA din tabela SALARIA I. SQL> DROP INDEX MARCA ON SALARIA I;

Page 180: HTML Php Mysql Pentru Incepatori-libre

Index dropped.

5. CREAREA ŞI ACTUALIZAREA TABELELOR ŞI INDECŞILOR PARTI IONA I

Parti ionarea este procesul de împăr ire a tabelelor şi indecşilor

foarte mari în mai multe tabele, şi respectiv indecşi, mai mici numite parti ii pentru a le putea manipula mai uşor.

O dată definite parti iile, instruc iunile SQL pot accesa şi manipula aceste parti ii în loc de a manipula întreaga tabelă sau întregul index din care au provenit.

Toate parti iile au aceleaşi atribute logice ca şi tabela sau indexul din care au provenit. De exemplu toate parti iile unei tabele au aceleaşi coloane cu aceleaşi constrângeri de integritate ca şi tabela, iar parti iile unui index sunt construite după aceeaşi coloană ca şi indexul din care au provenit.

Fiecare parti ie este memorată într-un segment propriu aflat în aceeaşi tabelă spa iu sau în tabele spa iu diferite. Plasarea parti iilor în tabele spa iu diferită prezintă următoarele avantaje semnificative: • Riscul pierderii datelor poate fi diminuat; • Salvarea şi restaurarea parti iilor se poate face independent unele fa ă de

altele; • Se poate realiza o echilibrare a opera iilor de I/O prin maparea parti iilor pe discuri diferite.

O parti ie este definită de următoarele: • Numele partiţiei identifică în mod unic parti ia în schema de obiecte a unui utilizator; • Referirea unei partiţii se face în context obligatoriu cu numele tabelei sau indexului din care provine. Numele unei parti ii poate să apară în instruc iuni DDL şi DML, precum şi în utilitarele Import/Export şi SQL*Loader.

Exemplu: ALTER TABLE tab10 DROP PARTITION part1; • Aria de cuprindere a partiţiei este formată din rândurile tabelei sau

indexului, care apar in acesteia bazat pe valorile coloanele ce definesc parti ia. Aria de cuprindere este definită prin clauzele:

PARTITION BY RANGE ( coloana1, colana2, …) şi VALUES LESS THAN (valoare1, valoare2, …)

Page 181: HTML Php Mysql Pentru Incepatori-libre

unde coloana1, coloana2, … formează lista coloanelor. În func ie de valorile acestora se stabilesc rândurile din tabelă sau index care apar in parti iei. Coloanele după care se face parti ionarea nu trebuie să con ină valori de tip NULL, iar numărul lor nu poate fi mai mare de cât 16; valoare1, valoare2, … formează lista valorilor coloanelor. În func ie ele se selectează rândurile pentru a fi incluse în parti ie. Aceste valori formează limita superioară a parti iei. Limitele partiţiei definesc mul imea rândurilor tabelei sau indexului ce vor fi incluse în aceasta. Orice parti ie are două limite, limita inferioară a cărei valoare este definită de valoarea LESS THAN din definirea parti iei precedente şi care este inclusă în partiţie, şi limita superioară este definită de valoarea LESS THAN din definirea parti iei curente, valoare care nu este inclusă în partiţie. De la această regulă face excep ie prima parti ie care nu are limită inferioară. Parti ionarea nu se poate face după pseudocoloanele LEVEL, ROWID sau MISLABEL. Ca valoare în clauza LESS THAN a ultimei parti ii se poate specifica şi MAXVALUE, care reprezintă o valoare virtuală egală cu infinit. Cheia de partiţionare este un set de valori format din valorile coloanelor de parti ionare aferente unui rând al parti iei. Specificarea unei valorii alta decât MAXVALUE pentru parametrul LESS THAN impune o constrângere implicită de tip CHECK la nivel de tabelă, cu această valoare.

Reguli de partiţionare a tabelelor si a indecşilor Partiţionarea tabelelor se face respectând câteva reguli esen iale, astfel: • O tabelă poate fi parti ionată dacă nu este inclusă într-un grup de tabele

sau nu con ine tipurile de date LOB, LONG, LONG RAW sau obiect; • O tabelă parti ionată sau neparti ionată poate avea indecşi şi parti iona i şi/sau neparti iona i; • Atributele fizice ale unei parti ii pot fi specificate ini ial prin comanda CREATE TABLE pentru crearea parti iei implicit sau explicit. Specificarea implicită se face prin furnizarea atributelor fizice pentru tabelă şi nespecificarea acestora pentru parti ie în clauza PARTITION. Atributele fizice implicite pot fi ulterior modificate cu comanda ALTER TABLE MODIFY DEFAULT ATTRIBUTES. Specificarea explicită se face prin furnizarea acestora în clauza PARTITION, caz în care valorile atributelor fizice ale parti iei vor suprascrie valorile atributelor fizice implicite ale tabelei. Atributele fizice explicite pot fi ulterior modificate cu comenzile ALTER TABLE MODIFY PARTITION

Page 182: HTML Php Mysql Pentru Incepatori-libre

sau ALTER TABLE MOVE PARTITION

Partiţionarea indecşilor se face respectând câteva reguli: • Un index poate fi parti ionat dacă nu este inclus într-un grup de indecşi sau nu este definit pentru o tabelă inclusă într-un grup de tabele; • Indecşii pot fi de patru categorii: locali prefixaţi, locali neprefixaţi, globali prefixaţi şi globali neprefixaţi. Indecşii globali pot fi parti iona i sau neparti iona i. Un index este local dacă cheile dintr-o parti ie oarecare a acestuia referă rânduri aflate într-o singură parti ie a tabelei pentru care a fost creat. Indexul local este prefixat dacă este definit pe un set de coloane dintre care cea mai din stânga este coloana după care a fost parti ionat atât indexul local, cât şi tabela pe care a fost creat acesta. De exemplu, presupunem că avem tabela TAB10 şi indexul său INDEX10, care au fost parti iona i 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 stânga(prefix) a listei coloanelor de indexare se află coloanele COL1 şi COL2 după care s-a făcut partajarea tabelei şi a indexului său. Dacă indexul INDEX10 ar fi definit pe coloanele (COL1, CO23) atunci indexul este local neprefixat. Indecşii locali nu pot fi parti iona i cu clauza BY RANGE, această clauză se aplică numai pentru indecşii globali. Un index este global dacă cheile dintr-o parti ie oarecare a acestuia referă rânduri aflate în mai multe parti ii 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ă partiţionarea acestuia este definită de utilizator şi nu trebuie să fie echivalentă cu parti ionarea tabelei pentru care se creează. • Definirea atributelor fizice ale indecşilor comportă aceleaşi reguli ca la definirea atributelor fizice ale parti iilor 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.

Page 183: HTML Php Mysql Pentru Incepatori-libre

Crearea partiţiilor unei tabele şi ale unui index Crearea parti iilor este similară cu cea a creării tabelelor sau

indecşilor. Crearea partiţiilor unei tabele se face cu comanda CREATE TABLE folosind şi clauza PARTITION. Exemplu: Avem tabela FACTURI ce cuprinde documente din anii 1999 - 2002. Tabela are printre alte coloane si coloanele AN, LUNA, ZI şi dorim să parti ionăm tabela în trei parti ii, astfel încât parti ia 1 să con ină date din anii 1999 şi 2000, parti ia 2 date din anul 2001, iar parti ia 3 date din anul 2001. Cu comanda de mai jos vom crea cele 3 parti ii, astfel: CREATE TABLE facturi (numar_factura NUMBER (12), nume_furnizor VARCHAR(25), an NUMBER(4), luna NUMBER(2), zi NUMBER(2)) STORAGE (INITIAL 100K NEXT 50K) LOGGING PARTITION BY RANGE (an, luna, zi) (PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_1 NOLOGGING, PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION p1_2002 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING);

Crearea partiţiilor unui index se face cu comanda CREATE INDEX folosind şi clauza PARTITION. Activitatea comportă unele diferen e de la un tip de index la altul, conform exemplelor de mai jos: Exemple: 1) Crearea unui index local prefixat pentru tabela de mai sus cu

specificarea parti iilor: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, număr_factură)

LOCAL (PARTITION p1 TABLESPACE tabsp1, PARTITION p2 TABLESPACE tabsp1, PARTITION p3 TABLESPACE tabsp1);

2) Crearea unui index local prefixat pentru tabela de mai sus fără specificarea parti iilor: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, număr_factură) LOCAL;

Page 184: HTML Php Mysql Pentru Incepatori-libre

3) Crearea unui index local neprefixat pentru tabela de mai sus cu specificarea parti iilor:

CREATE INDEX index_loc_prefix ON facturi LOCAL (PARTITION p1 TABLESPACE tabsp1,

PARTITION p2 TABLESPACE tabsp1, PARTITION p3 TABLESPACE tabsp1);

4) Crearea unui index local neprefixat pentru tabela de mai sus fără specificarea parti iilor:

CREATE INDEX index_loc_prefix ON facturi (an, lună, zi) LOCAL; 5) Crearea unui index global prefixat pentru tabela de mai sus cu

specificarea numelui parti iilor şi a parametrului GLOBAL: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi, număr_factură) GLOBAL PARTITION BY RANGE (an, luna, zi) (PARTITION p1_1999_2000 VALUES LESS THAN (2001, 13, 32)

TABLESPACE tabsp_1 NOLOGGING, PARTITION p1_2001 VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION p1_2002 VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING);

6) Crearea unui index global prefixat pentru tabela de mai sus fără specificarea numelui parti iilor şi a parametrului GLOBAL: CREATE INDEX index_loc_prefix ON facturi (an, luna, zi,

număr_factură) PARTITION BY RANGE (an, luna, zi) (PARTITION VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_1 NOLOGGING, PARTITION VALUES LESS THAN (2002, 13, 32) TABLESPACE tabsp_2 NOLOGGING, PARTITION VALUES LESS THAN (2001, 13, 32) TABLESPACE tabsp_3 NOLOGGING);

7) Crearea unui index global prefixat pentru tabela de mai sus cu specificarea numelui parti iilor şi a parametrului GLOBAL, cu un număr de parti ii diferit de cel al parti iilor tabelei pe care se crează şi cu alte coloane de parti ionare decât cele după care s-a parti ionat tabela: CREATE INDEX index_loc_prefix ON facturi (an,lună,

număr_factură) GLOBAL PARTITION BY RANGE (an, lună) (PARTITION p1_1999_2001 VALUES LESS THAN (2002, 13) TABLESPACE tabsp_1 NOLOGGING,

Page 185: HTML Php Mysql Pentru Incepatori-libre

PARTITION p1_2001 VALUES LESS THAN (2003, 13) TABLESPACE tabsp_2 NOLOGGING);

Intreţinerea partiţiilor

Întreţinere a partiţiilor se realizează prin executarea activită ilor de modificare, mutare, adăugare, distrugere, trunchiere, splitare, reunire a acestora, precum şi schimbarea partiţiilor şi reconstruirea partiţiilor index. • Modificarea unei parti ii a unei tabele se face cu comanda ALTER

TABLE cu clauza MODIFY PARTITION. Cu această comandă se pot modifica atributele fizice ale parti iei sau ale parti iei indexului aferent. • Mutarea partiţiilor unei tabele sau index se face pentru a schimba tabela spa iu în care rezidă acestea din diverse considerente, dintre care cele de ob inere a unor performan e în exploatarea sunt cele mai frecvente. Opera ia se execută cu comanda ALTER TABLE cu op iunea MOVE PARTITION. Exemplu: ALTER TABLE tab10 MOVE PARTITION part1 TABLESPACE tabsp10 NOLOGGING; Mutarea parti iei unei tabele care con ine date, determină necesitatea recreării tuturor indecşilor locali sau globali ataşa i acesteia. • Adăugarea unor noi parti ii se poate executa doar pentru o tabelă

parti ionată sau un index local. Opera ia se execută cu comanda ALTER TABLE cu op iunea ADD PARTITION.

Exemplu: ALTER TABLE tab100 ADD PARTITION part1 VALUES LESS THAN (935); O nouă parti ie poate fi adăugată doar după parti ia cu limita superioară cea mai mare. Dacă dorim să adăugăm o parti ie la început, între parti iile existente sau după ultima parti ie care are limita superioară egală cu valoarea MAXVALUE, atunci acest lucru se poate realiza prin splitarea unei parti ii, în cazul de fa ă prima, una adiacentă cu locul de inserare a noii parti ii, şi respectiv ultima parti ie. Dacă pentru tabela parti ionată căreia îi adăugăm o nouă parti ie există un index local, atunci SQL creează automat o parti ie de index pentru noua parti ie adăugată. • Distrugerea partiţiilor unei tabele se face după anumite reguli func ie de situa iile în care se află parti ia, cu ajutorul comenzii ALTER TABLE cu op iunea DROP PARTITION. Distrugerea partiţiei unei tabele care conţine date şi a indexului global se poate face lăsând

Page 186: HTML Php Mysql Pentru Incepatori-libre

nealtera i indecşii globali în timpul distrugerii parti iei, după care aceştia vor fi recrea i sau ştergând toate rândurile parti iei cu comanda DELETE după care distrugem parti ia. Această comandă actualizează indecşii globali. Distrugerea partiţiei unei tabele care conţine date şi a constrângerilor referenţiale de integritate se poate face dezactivând constrângerile de integritate, distrugând parti ia şi apoi reactivând constrângerile de integritate. Ştergerea rândurilor parti iei cu comanda DELETE, apoi distrugem parti ia. • Distrugerea partiţiilor unui index se face după anumite reguli func ie de situa iile în care se află parti ia, cu ajutorul comenzii ALTER INDEX cu op iunea DROP PARTITION. O parti ie a unui index local nu poate fi distrusă, ea se distruge implicit atunci când se distruge parti ia tabelei căreia îi corespunde. O parti ie fără date a unui index global poate fi distrusă. Dacă o parti ie a unui index global con ine date, atunci prin distrugerea acesteia parti ia următoare devine invalidă şi trebuie recreată; • Trunchierea partiţiilor unei tabele se face cu comanda ALTER TABLE cu op iunea TRUNCATE PARTITION şi are ca efect ştergerea tuturor rândurilor de date din această parti ie şi a parti iei corespunzătoare a indexului local asociat, dacă există. Parti iile indecşilor nu pot fi trunchiate, singură trunchiere posibilă este cea specificată mai sus. Trunchierea unei parti ii a unei tabele şi a indecşilor globali asocia i şi/sau a constrângerilor de integritate referen ială se face după aceleaşi reguli ca şi opera ia de distrugere. • Splitarea partiţiilor unei tabele sau ale unui index se face cu comanda ALTER TABLE/INDEX cu op iunea SPLIT PARTITION. O parti ie a unei tabele ce con ine date, prin splitare to i indecşii asocia i devin inutilizabili şi ca atare aceştia trebuie recrea i. Numai parti ia fără date nu invalidează indecşii. Parti ia unui index poate fi splitată numai dacă indexul este global şi nu con ine date, căci parti ia unui index local se splitează automat atunci când se splitează parti ia tabelei căreia îi corespunde. • Fuzionarea sau reunirea parti iilor unei tabele sau ale unui index se face cu ajutorul comenzilor ALTER TABLE/INDEX şi cu una din op iunile DROP PARTITION sau EXCHANGE PARTITION, pentru că o op iune explicită de fuzionare nu există. O parti ie a unei tabele poate fi reunită cu altă parti ie numai dacă nu are indecşi globali sau constrângeri de integritate referen iale asociate. Fuzionarea unei parti ii a unei tabele se face totdeauna cu parti ia imediat superioară. Presupunem că avem tabela TAB10 cu parti iileP1, P2, P3 şi P4 şi vrem

Page 187: HTML Php Mysql Pentru Incepatori-libre

să reunim parti ia P2 cu P3, se vor exporta datele din tabele P2, se execută comanda ALTER TALE tab10 DROP PARTITION p2 , după care importăm datele exportate în parti ia P3. • Fuzionarea sau reunirea partiţiilor unui index local se face implicit când se reunesc parti iile corespunzătoare ale acestora, iar fuzionarea a două parti ii P2 şi P3, care con in date, ale unui index global, se poate face astfel: ALTER INDEX index_global DROP PARTITION p2; ALTER INDEX index_global REBUILD PARTITION p3;

Schimbarea partiţiilor realizează transformarea unei parti ii a unei tabele într-o tabelă neparti ionată sau o tabelă neparti ionată într-o parti ie a unei tabele parti ionate. Opera ia se execută cu comanda ALTER TABLE cu op iunea EXCHANGE PARTITION.

6. CREAREA ŞI ACTUALIZAREA VEDERILOR

O viziune (vedere sau tabelă virtuală) este o formă de prezentare a datelor din una sau mai multe tabele sau viziuni pentru un utilizator, ob inută prin executarea unei cereri. O viziune este tratată ca o tabelă şi se mai numeşte şi tabelă virtuală.

Utilizatorul care creează viziunea trebuie să aibă privilegiul CREATE VIEW sau CREATE ANY VIEW. Proprietarul viziunii trebuie să aibă, în mod explicit, acordate privilegiile de acces la toate obiectele referite de către viziune, privilegii ce nu pot fi ob inute prin intermediul rolului. De asemenea, func ionalitatea unei viziuni depinde de privilegiile proprietarului acesteia. De exemplu, dacă proprietarul viziunii are privilegiul SELECT pentru tabela din care s-a creat viziunea (numită şi tabelă de bază), atunci acesta poate executa prin intermediul viziunii doar opera ii de SELECT din tabelă. Opera ia se execută cu comanda SQL CREATE VIEW, astfel: 1) CREATE VIEW v10 AS

SELECT col1, col2, col4 FROM tab2 WHERE col1 = 20; Crearea unei viziuni v10, cu coloanele col1, col2 şi col4, ca un

subset de date din tabela tab2, care are coloanele col1,col2,col3,col4,col5 2) CREATE VIEW v11 AS

SELECT col1, col2, col4, col7 FROM tab2, tab3 WHERE tab2.col1 = tab3.col1;

Page 188: HTML Php Mysql Pentru Incepatori-libre

Crearea viziunii v11ca reuniune a unor date din tabelele tab2 (col1,col2,col3,col4,col5) şi tab3 (col1, col8, col9):

Dacă în timpul creării unei viziuni SQL detectează anumite erori acestea sunt semnalate, iar dacă se foloseşte op iunea FORCE viziunea este totuşi creată cu starea INVALID. Cu această op iune o vedere poate fi creată chiar dacă tabela sau tabelele de bază nu există. Viziunea astfel creată va fi validă, deci va pute fi utilizată, abia după ce se va crea tabela de bază, iar proprietarul viziunii va primi drepturile necesare de utilizare a acestora.

Vederea de tip reuniune (vedere join) este definită ca vederea care cumulează rânduri din mai multe tabele. Modificarea unei astfel de vederi se face respectându-se condi ia de cheie rezervată. O tabelă se numeşte tabelă cu cheie rezervată dacă orice cheie a acesteia poate fi cheie în vederea tip reuniune a cărei tabelă de bază este. Altfel spus, o tabelă cu cheie rezervată are cheile rezervate în cadrul vederii join. Prin intermediul unei astfel de vederi se pot actualiza date (UPDATE, DELETE sau INSERT) numai în tabela de baza care con ine cheia sau cheile rezervate, cu condi ia obligatorie ca op iunea SELECT de creare a vederii să nu conţină una din clauzele DISTINCT, GROUP BY, START WITH, CONNECT BY, ROWNUM şi nici o operaţie de setare de tip UNION, UNION ALL, INTERSECT sau MINUS. Deci prin intermediul unei vederi de tip reuniune se pot modifica date numai asupra coloanelor care se mapează pe tabela de bază care con ine cheia sau cheile rezervate. Cu ajutorul vederilor ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS şi USER_UPDATABLE_COLUMNS din dic ionarul de date se pot ob ine informa ii despre coloanele vederii de tip reuniune ce pot fi modificate.

Inlocuirea unei vederi este opera ia de recrearea acesteia şi se execută prin distrugerea vederii şi recrearea acesteia si redefinirea vederii cu clauza OR REPLACE.

Exemplu: CREATE OR REPLACE VIEW v10 AS SELECT col1, col2 FROM tab2 WHERE col1 = 30;

Înainte de a înlocui o vedere, trebuie avute în vedere următoarele efecte: • Înlocuirea unei vederi determină înlocuirea defini iei acesteia din

dic ionarul de date; • Dacă în vedere înlocuită a existat clauza CHECK OPTION, iar în defini ia noii vederi nu mai este inclusă, această clauză este distrusă; • Toate vederile şi programele PL/SQL dependente de vedere înlocuită devin invalide.

Page 189: HTML Php Mysql Pentru Incepatori-libre

Distrugerea vederilor se execută cu comanda DROP VIEW . Vederea partiţionată împarte o tabelă foarte mare în bucă i mai mici numite parti ii şi le reuneşte pe acestea pentru a se ob ine performan e în administrare şi regăsirea datelor. Cererile care folosesc anumite intervale de valori conforme cu cele folosite la crearea parti iilor vor regăsi date numai din parti iile aferente acestora. O vedere parti ionată se creează folosind constrângerea de integritate CHECK sau clauza WHERE. Considerăm tabelele t1, t2 şi t3 cu aceleaşi coloane, deci pot fi considerate parti ii ale unei tabele care la însumează. Exemplu:

ALTER TABLE t1 ADD CONSTRAINT c1 CHECK (col1 between 0 and 1000); ALTER TABLE t2 ADD CONSTRAINT c1 CHECK (col1 between 1000 and 10000); ALTER TABLE t3 ADD CONSTRAINT c1 CHECK (col1 between 10000 and 100000); CREATE VIEW v10 AS SELECT * FROM t1 UNION ALL SELECT * FROM t2 UNION ALL SELECT * FROM t3;

CREATE VIEW v10 AS SELECT * FROM t1 WHERE col1 between 0 and 1000 UNION ALL SELECT * FROM t2 WHERE col1 between 1000 and 10000 UNION ALL SELECT * FROM t3 WHERE col1 between 10000 and 100000);

7. CREAREA ŞI ACTUALIZAREA SECVEN ELOR

Secvenţele sunt numere unice de identificare a coloanelor unei

tabele şi pot fi utilizate la efectuarea diferitelor opera ii într-o aplica ie. Crearea unei secven e se execută cu comanda CREATE

SEQUENCE, astfel: CREATE SEQUENCE secv_1 INCREMENT BY 1 START WITH 1 NOMAXVALUE CACHE 10;

unde: INCREMENT BY arată valoare cu care se incrementează o secven ă curentă pentru a se ob ine secven a următoare,

Page 190: HTML Php Mysql Pentru Incepatori-libre

START WITH este valoarea de pornire a secven ei(prima valoare), NOMAXVALUE arată că nu avem o limită superioară până unde se pot genera secven e, CACHE defineşte numărul de secven e viitoare care se păstrează anticipat în memorie pentru ob inerea unor performan e superioare. Când această valoare se epuizează SQL încarcă în memorie următorul se de secven e.

Modificarea unei secven e se face cu comanda SQL ALTER SEQUENCE şi poate opera asupra parametrilor ini iali ai comenzii de creare a secven ei.

Parametrul de ini ializare SEQUENCE_CACHE_ENTRIES determină numărul secven elor care pot fi inute în memorie de SQL.

Distrugerea secven elor se face cu comanda SQL DROP SEQUENCE.

Referirea secven elor se face cu pseudocoloanele NEXTVAL şi CURRVAL , în care: NEXTVAL generează următoarea valoare a secven ei. Referirea se face prin nume_secvenţă.NEXTVAL. Exemple: 1) CREATE SEQUENCE secv1;

INSERT INTO tab1 (COL1, COL2) VALUES (secv1.NEXTVAL, 300); CURRVAL defineşte valoarea curentă a secven ei şi se referă prin nume_

2) INSERT INTO tab10 (COL4, COL5) VALUES (secv1.CURRVAL, 1300); INSERT INTO tab10 (COL4, COL5) VALUES (secv1.CURRVAL, 2 300); Valoarea NEXTVAL poate fi referită o singură dată, iar valoarea

CURRVAL de mai multe ori, cu condi ia ca valoarea NEXTVAL să fi fost referită, deci secven a curentă să fi fost creată.

8. CREAREA ŞI ACTUALIZAREA SINONIMELOR

Sinonimul este un alt nume (alias) pentru o tabelă, o vedere, secven ă, procedură, func ie sau pachet. Sinonimul poate fi public sau privat. Sinonimul public este inclus în schema unui grup de utilizatori numit PUBLIC şi este accesibil tuturor utilizatorilor, iar cel privat apar ine numai unui anumit utilizator.

Crearea sinonimului se face cu comanda CREATE SYNONYM şi se distruge cu comanda DROP SYNONYM. Exemple:

Page 191: HTML Php Mysql Pentru Incepatori-libre

Crearea unui sinonim privat: CREATE SYNONYM sin1 FOR tab10; Crearea unui sinonim public: CREATE PUBLIC SYNONYM sin10 FOR tab10; Distrugerea unui sinonim: DROP SYNONYM sin1; DROP PUBLIC SYNONYM sin10;

9. CREAREA ŞI ACTUALIZAREA GRUPURILOR DE TABELE ŞI A

GRUPURILOR DE INDECŞI

Grupul de tabele (cluster) este o metodă de memorare comprimată a unor tabele de date care au coloane comune şi care sunt foarte des folosite împreună.

Cheia grupului (key cluster) este coloana sau grupul de coloane pe care tabelele grupate le au comune. Cheia grupului se va specifica atunci când se creează acesta şi atunci când se creează tabelele ce vor fi incluse în grup. Fiecare valoare a cheii de grup se va memora o singură în cadrul grupului de tabele sau al grupului de indecşi indiferent de câte ori apare aceasta în tabelele grupului.

Coloanele care se aleg pentru a fi definite cheile de grup sunt cele folosite cel mai mult pentru a reuni tabelele atunci când se execută o anumită cerere. Cea mai bună cheie de grup este aceea care are suficiente valori unice, astfel încât rândurile care se grupează după aceasta să poată fi incluse într-un singur bloc de date. Astfel dacă avem prea puţine rânduri pe o cheie de grup ob inem o pierdere a spa iului de memorie şi performan e neglijabile, iar dacă avem prea multe timpul de căutare suplimentar, căutare în mai multe blocuri de date, va duce la degradarea performan elor.

Setarea parametrilor de memorie PCTFREE şi PCTUSED trebuie făcută cu mare grijă, astfel încât să nu afectăm spa iul utilizat pentru inserarea rândurilor şi nici pe cel ce va fi folosi pentru actualizarea datelor aferente rândurilor inserate în bloc. Valorile acestor parametrii folosite la definirea grupului sunt automat utilizate şi pentru tabelele ce vor fi grupate. Chiar dacă vom specifica aceşti parametrii la crearea unei tabele în cadrul grupului ei vor fi ignora i.

Specificarea spaţiului necesar pentru memorarea rândurilor aferente unei chei de grup se face prin intermediul clauzei SIZE a comenzii SQL CREATE CLUSTER. Valoarea acestui parametru este specificată în bytes şi reprezintă spa iul ce trebuie rezervat în cadrul blocului de date aferent grupului pentru memorarea valorii sau valorilor cheii de grup. Prin intermediul acestuia, SQL determină numărul rândurilor de date ce încap

Page 192: HTML Php Mysql Pentru Incepatori-libre

într-un bloc de date al grupului. Dacă SIZE este specificat astfel încât într-un bloc de date să încapă două chei de grup atunci spa iul acestui bloc este folosit de ambele chei, iar dacă un bloc de date nu poate cuprinde toate rândurile aferente unei chei de grup, cheia de grup se memorează o singură dată, iar blocurile de date se înlăn uiesc 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ă apar ină mai multor lan uri de date.

Specificarea locului (tabelei spaţiu) î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 întâi 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 indecşi (cluster) se face cu comand SQL CREATE INDEX cu clauza ON CLUSTER. Se va crea întâi grupul de tabele şi apoi grupul de indecşi asociat. Exemplu:

CREATE INDEX index1 ON CLUSTER grup1 INITRANS 2 MAXTRANS 5 TABLESPACE tabsp2GR

Page 193: HTML Php Mysql Pentru Incepatori-libre

PCTFREE 10 STORAGE (INITIAL 50k NEXT 50k MINEXTENTS 3 MAXEXTENTS 25 PCTINCREASE 30);

Modificarea grupurilor de tabele sau de indecşi se face cu

comanda SQL ALTER CLUSTER. Elementele ce pot face obiectul modificării sunt atributele fizice ale grupului.