Prof. dr. Daniela MARINESCU, Univ. „Transilvania” – Bra șov, Facultatea de Matematic ă și Informatic ă Autor, Prof. de informatic ă, Adrian MODRI… [614248]

UNIVERSITATEA „TRANSILVANIA”, BRA ȘOV

DEPARTAMENTUL PENTRU PREG ĂTIREA
PERSONALULUI DIDACTIC

LUCRARE METODICO- ȘTIINȚIFICĂ
PENTRU OB ȚINEREA
GRADULUI DIDACTIC I

Coordonator,
Prof. dr. Daniela MARINESCU, Univ. „Transilvania” – Bra șov, Facultatea de Matematic ă și Informatic ă

Autor,
Prof. de informatic ă, Adrian MODRI ȘAN,
Colegiul Na țional „Andrei Șaguna”, Bra șov

BRAȘOV, an școlar 2008 – 2009

PROGRAMAREA PAGINILOR WEB
FOLOSIND LIMBAJUL PHP

Coordonator,
Prof. dr. Daniela MARINESCU, Univ. „Transilvania” – Bra șov, Facultatea de Matematic ă și Informatic ă

Autor,
prof. de informatic ă, Adrian MODRI ȘAN,
Colegiul Na țional „Andrei Șaguna”, Bra șov

BRAȘOV, An școlar 2008 – 2009

3 Cuprins:

1. INTRODUCERE
1.1. Justificarea temei alese…………………………………………………………………………………… ……………………….5
1.2. Descrierea capitolelor lucr ării…………………………………………………………………………………………………..6

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 intermediu l 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 My SQL 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 MySQ L…………………………………………………………………………………… ………………………..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

4 3.13.13. Sortarea datelor………………………….. ……………………………………………………………. ……………………………..105
3.13.14. Filtrarea datelo r…………… …………… …………… …………… …………… …………… ……….. ……………………………..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……….. …………… ………….. ………..11 5

4. APLICA ȚII PRACTICE ȘI METODOLOGICE
Reluarea, dintr-o alt ă perspectiv ă, a algoritmilor reprezentativi studia ți la disciplina informatic ă în clasele a
IX-a, a X-a și a XI-a……………………………………………………………………………………………………….. …………..118
4.1. Algoritmi care nu opereaz ă cu șiruri (cifrele unui num ăr, numere prime, factori primi, cmmdc,
șirul lui Fibonacci)……………………………………………………………………………………………… ………………………………..118
4.2. Algoritmi care opereaz ă cu șiruri sau matrice (sort ări, ștergeri, inser ări)………………………………………………………122
4.3. Prelucrarea șirurilor de caractere……………………………………………………………………………………………. ……………….127
4.4. Probleme de Backtracking, Divide et Impera, Aplica ții ale geometriei analitice plane studiate în cadrul disciplinei
matematic ă, Reprezent ări de fractali………………………………………………………………………………………………….. ……129

5. CONSIDERA ȚII METODOLOGICE
5.1. Posibilitatea pred ării limbajului PHP la clasa a XII-a; premise care faciliteaz ă introducerea sa în cadrul
noilor programe școlare. Analiza însu șirii sale de c ătre elevi. Concluzii stabilite………………………..156
5.2. Posibilit ăți de predare cât mai atractive ale informaticii, f ără a se ajunge la banalizare: propunere de
curs opțional „Programare grafic ă într-un limbaj vizual”…………………………………………………………158

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 web.

5 1. INTRODUCERE

1.1. Justificarea temei alese.
Î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 noast re ele au o utilizare foarte larg ă, de la jocuri și aplicații
grafice dinamice la comer ț pe Internet.
Aceste realit ăți au trebuit s ă-și găsească o reflectare și asupra programelor școlare din cadrul
disciplinei „informatic ă”. Astfel, începând cu anul școlar 2007-2008, în cazul claselor cu
specializare „matematic ă-informatic ă”, programa clasei a XII-a la disciplina informatic ă a devenit
mult mai flexibil ă, permițând inițierea elevilor noile tehnici care s-au impus în domeniul
programării paginilor web.
Lucrarea de fa ță își propune în primul rând s ă fie o unealt ă didactică, un manual școlar care
să îi poată ajuta pe elevi în procesul de înv ățare, conținând și câtva detalii mai tehnice, cum ar fi
instalarea suportului software de ca re este nevoie pentru aplicarea no
țiunilor înv ățate.
Limbajul PHP este un limbaj de programare de stinat în primul rând Internetului, aducând
dinamică unei pagini web. Este unul di ntre cele mai importante limbaj e 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-s ide. Statisticile arat ă că la 1
mai 2008, suportul PHP este prezent pe 20 de milioan e 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 programator ii 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 ță;

6 • Flexibilitatea – fiind ap ărut din neces itatea 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.

1.2. Descrierea capitolelor lucr ării.

În capitolul al I I-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 ta g-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.
În prima parte a capitolului al IV-lea (Aplica ții practice și metodologice), am reluat, din
considerente metodice și din perspectiva program ării pe Internet, o serie de algoritmi studia ți la
disciplina informatic ă în clasele a IX-a, a X-a și a XI-a.
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 destinat e î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.

7 În a doua parte a aceluia și capitol mi-am propus a bordarea interdisciplinar ă
matematic ă-informatic ă a geometriei analitice plane, studiate de c ătre elevi în clasa a XI-a.
Tot în aceast ă parte am propus o serie de aplica ții care realizeaz ă reprezent ări grafice de
fractali. Ultimul capitol al lucr ării (Considera ții metodologice) con ține, în prima sa parte, o analiz ă,
din punct de vedere metodic, al modului de adaptare și de reacție al elevilor de clasa a XII-a la noul
conținut al programei școlare.
În ultima parte propune analiza unui curs op țional, care atinge un alt subiect de actualitate al
informaticii, și anume programarea într-un limbaj vizual.
Lucrarea este înso țită și de un CD-rom cu urm ătorul conținut:
A) Pachetul software
xampp , necesar rul ării server-ului http , limbajului php și bazei de
date mysql ;
B) Prezenta lucrare, în format digital (. pdf);
C) Codurile surs ă ale exemplelor utilizate pe parcursul lucr ării (fișiere .html respectiv . php
– fiecare exemplu prezent în cadrul lucr ării va avea o referire la un astfel de fi șier, de exemplu:
apl10.html , sau apl30.php ).

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 an ul 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 com une. 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 respecta te 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;

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 in terveni î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”, protoc olul 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 ca re le întâmpinau echipele de cercet ători ce foloseau
centrul, chiar și folosind po șta electronic ă.

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 fe bruarie 1993, realizat ă de cercet ătorul Marc Andreessen de la centrul
universitar National Center for Supercom puting 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 un ice. 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 hipe rtextului 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, et c. 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 nodu rilor. 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 si turi 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.

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 specializ at, 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 brow ser-ului aflat pe
calculatorul client. Cererea efectuat ă de către browser și răspunsul server-ului se fac prin
respectarea unui anumit protoc ol. Acest protocol se nume ște HTTP ( HyperText Transfer Protocol).

2.3. HTML standard – limbaj de scriptiv al unei pagini WEB.

HTML este un limbaj de marcare orientat c ătre prezentarea documente lor text pe o singura
pagină.
Utilizând un software de redare specializat , numit agent utilizator HTML (cel mai bun
exemplu de astfel de software fi ind 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 textul ui (cum ar fi spec ificarea 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 pr oiectat 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 graf ice cum ar fi Macromedia Dreamweaver sau
Microsoft FrontPage permit ca pagi nile 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 tehnolog ii de codare din partea serverului cum ar fi
PHP, JSP sau ASP.

12 2.3.1 Scrierea de cod HT ML. 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 co rectitudinii 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> ;

13 • Opțional, antetul poate con ține titlul paginii, c uprins î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 sc rise î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 al be (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 para ntezei unghiulare a tag-ului (
>) prin
nume_atribut=”valoare” .

În cazul paragrafului, atributul align controleaz ă alinierea textului di n 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>

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)

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)

16 – color permite specificarea culorii. Aceasta se specific ă fie prin intermediul
constantelor predefinite ale HTML-ului (numele engl ezesc 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 di n cadrul documentului HT ML 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 di n identificator)

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 elem entele sunt numerotate.
Inserarea lor în cadrul document ului 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 document ului 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:

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 documentul ui 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).
– D e f i n i ț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>

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-elo r 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 folo sirea 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>

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 dimens iunile sale originale,
redimensionarea având loc doar la nivelul calculatorului pe ca re este vizualizat ă pagina.

21 Iată un exemplu de folosire al celor dou ă tag-uri, și vizualizarea
acestui exemplu în browser ( apl013.html ):

<P> Imaginea originala are dimensiunile 200×150:
<BR>
<IMG src="dog.jpg"> <BR> Iat-o redimensionata proportional la 100×75: <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>

22 2.3.7. Specificarea culorilor în HTML.

O serie de elemente din HTML permit utilizar ea 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 exem plu: 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 ca re le poate reda un browse r 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:

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, pent ru 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 ți u c a r e v a f i 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 ):

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 f undal a tuturor celu lelor tabelului;
• bordercolor=”culoare” permite stabilirea culor ii 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. Po ate 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

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 ca re 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);

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 pagi nii, 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ă.

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 cu rsorul 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, elementu l legat, este incl us î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 pagi na 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 atribut ul 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 f ilm 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.

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:somebody@someserver.com”>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.

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 docum entului. 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 într egului text cuprins în pagin ă;
• link=”culoare” permite specificarea culo rii 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> ).

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 specifi ca 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 stil urilor. Acestea perm it 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 în ainte 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 in troducerea anumitor secven țe de program în cadrul
paginilor web. Exist ă mai multe limbaje (numite de scri ptare) care permite scrierea acestor
secvențe, cum ar fi JavaScript, VBscript. Specificarea lim bajului î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.

31 2.3.11. Pagini cu cadre (F RAMESET, 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 aspectul ui (cu ajutorul
unuia dintre atributele cols sau rows ) să conțină descrierile fiec ăruia dintre cadrele definite. Acest
lucru se face cu aj utorul 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;

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 (derular e). 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 ni ci redimensionarea cadrelor vecine.
• name – este un atribut foarte important. Prin intermediul s ău va putea fi identificat
frame-ul respectiv. Acest lucru este foarte impor tant, 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 ca re 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 drep t 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>

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 car e acest atribut nu ar fi fost prezent, utilizatorul, printr-un
simplu „drag and drop” ar fi putu t 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 doc umentul 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 lin k-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 .

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 dimensi unile 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

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>

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 poa te 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 com ponentele 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.

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 valoar e mai mare decât cea scris ă la size, caz în care, text ul va defila în control
(stânga dreapta) în cazul în care scriem mai multe caractere d ecâ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 al tfel, aceasta va fi și valoarea pe care server-
ul o va primi pentru acest control.

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 poa te 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 în toarce butonul respectiv, dac ă el a fost cel ales;
• checked – dacă acest atribut este prezent, butonul respec tiv 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.

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 în toarce 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 com ponente 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> .

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 ă v a f i s e l e c t a t ă la
încărcarea paginii
Textul efectiv al op țiunii se scrie între ta g-ul de deschidere și cel de închidere. Tag-ul de
închidere este op țional, el putând fi omis.

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 st andard: HTML dinamic, script-uri.

De și HTML-ul clasic permite redactarea unor do cumente 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 s unt 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 comentat e 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, caracteristic ile de aliniere a textului, form a elementului, culorile de fond și ale
literelor, marginile, pozi ția elementelor, etc.
Pentru a putea gestiona cât mai eficie nt stilurile, a fost pus la dispozi ția programatorilor de
pagini web un limbaj prin care se poate realiza acest lucru. Aces t 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> .

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 es te identificat, în cadrul CSS-ului de tag-ul care
îl gestioneaz ă. Spre exemplu, identificatorul CSS pentru pa ragrafe 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, absolu t 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 di n 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.

43 O alt ă formă de utilizarea a CSS-ului const ă în definirea stilur ilor cu ajutorul unor
identificatori proprii, care se pot aplica ulterior unui anumit paragraf. În acest caz, în cadrul unui
style putem defini proprii identificat ori, 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-ulu i se face tot în sec țiunea <HEAD> ,
prin intermediul urm ătorului tag:
<LINK rel="stylesheet" type="text/css" href=" fisier_stil.css ">

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:

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 po t îngloba în paginile HTML sc ript-uri pentru diverse activit ăți,
cum ar fi verificare datelor introdus e de utilizatori, sau crearea de me niuri 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 comentat e de script-uri JavaSc ript, care nu folosesc
DOM (pentru familiarizarea cu sintax a), î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 scri pt-ul (în cadrul paginii). În exemplele urm ătoare nu
vom mai da tot codul, ci doar secven ța efectivă a script-ului.

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>

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 repe de 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 ante rior similitudinea dintre acesta și limbajul C). Pentru ca
limbajul JavaScript s ă acționeze asupra con ținutului paginii, ei bine, ac est 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 ge nul negativ sau tre cere la alb-negru.
Iată fișierele imagine pe care am testat script-ul urm ător:
dog.jpg:
dogneg.jpg
(negativul)

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); }

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>

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.

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 proces ului de dezvoltare) și server-side (codul
sursă nu se ruleaz ă pe calculatorul ce lui 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 evol uat apoi în PHP/FI 2.0, dar proi ectul 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 serv er HTTP. Prin intermediul acestui modul se
stabilesc regulile prin care server-ul va pasa datele pr imite de la un utilizator c ătre o aplica ție scrisă
într-un anumit limbaj de progr amare, 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 aces t motiv, vom prefera termenul de „script PHP”
celui de program PHP. Structura un ui script PHP este foarte asem ănătoare cu cea a unui cod scris în
limbajul C, mai ales în sensul în car e 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 prel ua date trimise de
către o pagin ă web de la un client (în genera l, 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 form a unei pagini web. Clientul nu va avea acces la
codul efectiv al script-u lui, ci, prin faptul c ă acesta se afl ă pe server și se ruleaz ă tot pe acesta, va
primi direct HTML-ul generat de script.

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 studi a, vom folosi un pachet
gratuit, disponibil pe Internet, numit XAMPP. A cest 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 ca lculator 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 inst aller-ului: derula ți pagina pân ă când da ți de sec țiunea
„Download”, accesând primul link „Insta ller”, ca în figura de mai jos:

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 pe ntru 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, deschide m un browser de in ternet, 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 pune m î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 intrar ea î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, pent ru a rula codul PHP este absolut
necesar ca fi șierele să fie puse în directorul în care rezid ă documentele serverului web, iar

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 pa gina 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 ă:

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 ve de 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

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, deoa rece 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.

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 exem plele 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) limb ajul 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.

58 3.4. Constante. Vari abile. 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 vede re al constantelor. Separatori i 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 ace st 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.

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 limbaj ului PHP sunt cunoscu ți din C++. Acesta este motivul pentru
care vom prezenta doar anumite particularit ăți specifice limbajului PHP.

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>";

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:

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, put em 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:
{ …

}

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 whil e, 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 #
} ?>

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(expresie inițializare;expresie continuare;expresie incrementare ) 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:
expresie inițializare;
while(expresie continuare)
{
instruc țiune;
expresie incrementare ;
}
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 cont or, 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>"; ?>

65
3.6. Transmiterea datelor pr in 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 ia r 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 met odei 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.

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 prei au 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

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;
}
?>

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 rec upera 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 .

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 valo rile 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 )

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 trimiter ii rezultatului mai mu ltor controale sub fo rma 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>

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 rezu ltat 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 poa te 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 num ele variabilei) sunt cei transmi și prin
valoare. Chiar dac ă valoarea unui astfel de parametru este schimbat ă în cadrul func ției, ea rămâne

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 di nainte 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; ?>

73 • Variabilele locale sunt variabilele crea te în corpul unei func ții sau cele create prin
transmiterea parametrilor formali (din antetul func țiilor). Ele nu sunt recu noscute î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-u lui 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 lucr u 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. Ar gumentul x trebuie
specificat în radiani;
– exp( x) – întoarce ex ;
– pow( x, y) – întoarce xy ;
– log10( x), log( x) – întorc log 10(x), respectiv ln(x);
– max( x1, x2, … , x n) – întoarce maximul (cel mai mare) dintre argumentele sale numerice;

74 – min( x1, x2, … , x n) – î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 pr ivite 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"

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 lexic ografic, 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";
?>

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 substringur i 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:
– i n i ț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>"; ?>

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 atribui t 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 produs e, 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 pr intre 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 or dinea î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.

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 elemen tului curent al vectorului;
Ambele func ții (current și key), dacă pointerul a trecut de vr eunul 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;
?>

79 Piine => 1.61
Alune => 2.21 Ciocolata => 2.69
Vin => 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.69
Alune => 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. Indici i 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 numeric i având valori cuprinse între 0 și
nr.elemente-1 .

80 3.10. Programare grafic ă utilizând PHP.

Una dintre cele mai spectaculoase component e 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 crear ea de output HTML, ci poate fi folosit și pentru a
crea respectiv a lucra cu diferi te formate de imagini, incluzâ nd gif, png, jpg. Ba mai mult, PHP
poate genera o imagine sub form a unui flux de date (deci f ără a o înregistra efec tiv 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 di namic 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 culo ri, 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 */

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 cont rar 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 une i 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). Or iginea 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

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, dreptungh iuri, poligoane;
• imageline(resurs ă_imagine,x 0,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,x 0,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,x 0,y0,diam_x,diam_y,resurs ă_culoare)
– deseneaz ă o elipsă cu axe paralele cu axele de c oordonate, 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,x 0,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 x 1= 300
y0 = 150 (300,75) y1 = 75

83
• imagefilledrectangle(res_imag,x 0,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,x 0,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,x 0,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,x 0,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,x 0,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 ;

84 • imagefilltoborder(res_imag,x 0,y0,culoare_border, res_culoare)
– umple prin algoritmul ” flood fill ”, pornind din punctul dat (x0,y0),
schimbând culoarea tuturor punctelor conectate (i ndiferent 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,x dest,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,x dest,ydest,xsrc,ysrc,
width dest,height dest,width src,height src)
– 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 src,height src) în
imag_dest , începând de la coordonatele (xdest,ydest), redimensionând astfel încât noua l ățime
respectiv în ălțime să fie (width dest,height dest);
• 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 ;

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, uti lizatorul poate înc ărca, prin intermediu l 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 (F ile Transfer Protocol), care
deși este o metod ă eficientă de transfer, este greoi de folosit de un utilizator nespecializat (necesit ă
specificarea adresei calcula torului 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 in ternetului, 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 ”Bro wse” 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

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 scri ere 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 de schide 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.

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 ne voit 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ă:

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, predefin it, 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-u l, 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>'; } ?>

89 3.13. Exploatarea bazelor de date MySQ L 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 Instit ute), 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 A ccess, Oracle, Microsoft SQL Server și, bineînțeles, MySQL.
MySQL este un limbaj specializat pent ru 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 foar te lesne exploatat ă prin intermediul limbajului PHP, dar și cu alte limbaje (de
exemplu Java).

3.13.2. Testarea instal ării MySQL. Configurar ea 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 utiliz are, 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 acc esa 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 ).

90 Vom configura în continuare serverul de b aze 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 utilizat orul 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 car e îl vom folosi pentru
a lucra în mod curent (deoar ece 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 ap oi vom crea o
bază de date în care vom lucra și un utilizator cu drepturi de util izare 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 conectar ea la serverul mysql cu noul utilizator creat
(lansați această comandă fie din Command Prompt fie din Start+Run ) :

91 mysql –u utilizator –p
În momentul în care vi se cere parola, introduce ți, evident, parola definit ă mai sus.
Dup ă conectarea la MySQL, pent ru a stabili ca punct de lucr u 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 fa pt 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ă:

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 une i linii, în ordinea în care au fost declarate
coloanele la crearea tabelei:
insert into nume_tabel ă values(valoare 1,valoare 2,…,valoare n);
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 datelo r, fie pe parcursul dezvolt ării se
inserează coloane noi între cele deja existe nte, 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(valoare 1,valoare 2,…,valoare k);
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 to ate 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 ă;

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_coloana 1,…,nume_coloana k 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 nume le 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 tabelelo r 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)

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 vector ul 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 printr e 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');

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 cupr inse î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 cupr inse î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 înaint ea 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 op eratori 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

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 ma i 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 rezulta t 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);

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 es te 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 amb ii operanzi sunt 0, în rest este 1);
• && sau and – și-ul logic (este 1 doar când ambii opera nzi 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 amb ii 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
( e x : 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);

98 • like, not like – testeaz ă dacă un șir de caractere are o anumit ă formă: dacă este
prefixat respectiv postfix at 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 v 1 then val 1
. . .
when v n then val n
else val n+1
end
– forma 2: case
when cond 1 then val 1
. . .
when cond n then val n
else val n+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 v 1 .. v n se va
întoarce val k corespunz ătoare, iar
dacă nu se va întoarce val n+1
Se evalueaz ă condițiile în ordinea
scrierii. Prima care este adev ărată va
întoarce valoarea val k
corespunz ătoare. Dac ă nici una nu
este advărată, se va întoarce val n+1

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
v a r i a b i l e i @ 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) – log bx;
• 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(x 1,×2,…) – 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;

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 l iterelor mici la litere mari;
• lower(x) – întoarce șirul obținut prin convertirea tuturor l iterelor mari la litere mici;
• find_in_set(x,string) – întoarce indicele apari ției șirului x în șirul de entit ăți
separate prin virgule di n 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;

101 d) Func ții specifice MySQL:
• if(exp 1,exp2,exp3) – dacă exp1 este nenul ă (adevărată) funcția va întoarce exp2, în
caz contrar întorcând exp3.
Observa ție: Dacă exp 1 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(exp 1,exp2) – dacă exp 1 este nenul ă, o întoarce chiar pe ea. Dac ă nu, o întoarce
pe exp 2.
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 datelo r unei tabele dintr-o baz ă de
date (mai precis, to t 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 ca drul 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 dint re 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;

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 mo ment 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 existe nte prin-o interogare, constat ăm că s-au trecut urm ătoarele date:
+––––+–––+––-+
| nume | virsta | greut | +––––+–––+––-+ | Copaceanu | 0 | NULL | +––––+–––+––-+

3.13.10. Valori implicite pe ntru coloanele unei tabele.
Un alt specificator pentru coloanele unei ta bele, în cadrul comenzii de creare a tabelei este:
default valoare_implicit ă
Acesta permite ca, la omiterea unei valo ri 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âmpur ilor 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.

103 Exemplu: cre ăm o tabel ă studenti în care trecem numele, virsta si starea civil ă. Ultimelor
două câmpuri le vom da valorile im plicite 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);

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 c a r e 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 da t 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’);

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 expresie 1[desc], expresie 2[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
expresie 1 nu este suficient ă pentru a determina ordinea (d eci pentru ambele, are aceea și valoare)
se consider ă mai departe expresie 2. Dacă nici expresie 2 nu este suficient ă, se ia în considerare
expresie 3, ș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.

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 struct urii, 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(expr 1,…,expr n)
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 di stincte (care nu apar deja în
tabela în care inser ăm) din tabela surs ă.

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 to ate 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 exemplif icare 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 | +––––––+––+––+––+

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) ;

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âmpur ile tabelei întoarse de subint erogare 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 nume le 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 not e, 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 exp 1,exp2,… from tabel ă group by exp_gr 1,exp_gr 2,….
[having condi ție_filtrare];

110 Grup ările se constituie ierarhic dup ă exp_gr 1, exp_gr 2, etc. Practic, grupurile mari sunt
date de valorile egale pentru exp_gr 1. În cadrul acestora, se fac subgrupurile dup ă valorile egale
ale lui exp_gr 2, etc.
Printre expresiile di n 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 valorilo r 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 | +––+–––+–––––+

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 fr om. Alias-urile pot fi utiliz ate î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, ia r la clauza from se trec ambele
tabele, fiecare dintre ele putând avea definit și un alias. Clauza where po ate 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 exp 1,exp2 … from tabel ă1 [as alias 1],tabel ă2 [as alias 2]
[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.

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 actor i, 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 spec ifica 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 |
+––––––+––––+

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 exp 1,exp2,.. from tabel ă1 [as alias 1] inner join tabel ă2 [as alias 2]
on condi ție;
Ca și mai înainte, dac ă există coloane care se numesc la fel în am bele tabele, vom folosi alias-uri.
Exemplu: același lucru ca în exemplul anteri or 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 sp ecificarea 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 lin iile 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 exp 1,exp2,… from tabel ă1 [as alias 1]
left outer join tabel ă2 [as alias 2] 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

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 exp 1,exp2,… from tabel ă1 [as alias 1]
right outer join tabel ă2 [as alias 2] 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 am bele 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';

115 3.13.20. Exploatarea bazelor de date My SQL prin intermediu l limbajului PHP.

Pentru a face func țional suportul de conectiv itate 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 sele ctate 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, întoar ce valoarea 0.
Variabila $resurs ă1 este cea care va perm ite, î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 f ace prin intermediul resursei întoarse de
comanda mysql_query . Iată funcțiile cele mai folosite:

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 conectar e 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…}

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:

118 4. APLICA ȚII PRACTICE ȘI METODOLOGICE
Reluarea, dintr-o alt ă perspectiv ă, a algoritmilor reprezentativi studia ți la disciplina
informatic ă în clasele a IX-a, a X-a și a XI-a.

În cele ce urmeaz ă, voi prezenta nu doar câteva exerci ții și probleme rezolvate ci și câteva
enunțuri de probleme propuse spre rezolvare, care trateaz ă principalele teme studiate la disciplina
informatic ă, din clasa a IX-a pân ă în clasa a XI-a.
În cazul problemelor rezolvate, sunt prezentate enun țul și codul surs ă (cu comentarii, acolo
unde este cazul) al rezolv ării.
Principalele nout ăți sunt aduse de interfa ță, care, prin intermediul limbajului PHP și deci,
implicit, prin func ționalitatea adus ă de o pagin ă web, poate deveni mult mai atractiv ă, în special
prin utilizarea culorilor și elementelor grafice. Astfel, o serie de aplica ții pot genera afi șări mult mai
sugestive ale datelor de ie șire.
Ultimul subcapitol aduce în discu ție și abordarea interdisciplinar ă a câtorva no țiuni de
geometrie analitic ă plană, aplicate în realizarea de reprezent ări grafice. Dintre acestea, cele mai
spectaculoase constau în reprezent ări grafice de fractali.

4.1. Algoritmi care nu opereaz ă cu șiruri (cifrele unui num ăr, numere prime, factori primi,
cmmdc, șirul lui Fibonacci)

1) Problemă rezolvată (apl087.html + apl088.php ):
Se cite ște, prin intermediul unui câmp de tip te xt al unui formular, o valoare natural ă având
cel mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să o
valideze, afi șând apoi cifrele sale în tr-un tabel cu o singur ă linie, în aceea și ordine în care apar ele
în număr, colorând cu fundal verde cifrele de valoare minim ă, cu fundal ro șu cifrele de valoare
maximă și cu fundal galben restul cifrelor.
Dac ă numărul are toate cifrele egale, se va colora fundalul tuturor cifrelor cu culoarea ro șie.

Rezolvare:
apl087.html:
<html><body>
<form action="apl088.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu un numar natural cu cel mult 9 cifre: <td> <input type="text" maxlength="9" size="9" name="nr"> <tr><td colspan="2" align="center">
<input type="submit" value="Trimite date">
</table> </form> </body></html>

119 apl088.php :
<html><body>
<?php $nr=@$_POST['nr']; if(!$nr) //daca este egala cu NULL, atunci inseamna ca nu s-a introdus nimic
echo "Ai uitat sa introduci vreo valoare";
else//functia is_numeric verifica daca valoarea dintr-un string este numerica
if(!is_numeric($nr)) echo "Valoarea introdusa nu este numerica!"; else//daca este numerica, verificam sa nu fie cumva reala:
if($nr!=(int)$nr) echo "Valoarea introdusa nu este intreaga!"; else //daca este intreaga, verificam sa fie pozitiva si sa aiba cel mult 9 cifre
if($nr<0||$nr>999999999) echo "valoarea introdusa trebuie sa fie pozitiva si sa aiba cel mult 9 cifre"; else { //in sfirsit ne putem apuca de rezolvarea problemei: impartim numarul
//in cifrele sale, determinind minimul si maximul si determinind totodata si puterea
//lui 10 care corespunde numarului total de cifre ale numarului. Avem nevoie de aceasta
//pentru a afisa cifrele numarului in acceasi ordine ca si in numar $p=1; $n=(int)$nr; $min=10;$max=-1; do{ $p*=10; if($n%10<$min) $min=$n%10; if($n%10>$max) $max=$n%10; $n=(int)($n/10); }while($n); echo '<table border="1" cellspacing="0" cellpadding="10"><tr>'; $n=(int)$nr;
do{
$p/=10; $cif=(int)($n/$p)%10; if($cif==$max) echo '<td bgcolor="red">',$cif; else if($cif==$min) echo '<td bgcolor="lime">',$cif; else echo '<td bgcolor="yellow">',$cif; }while($p!=1); } ?> </body></html>

Iată un exemplu de rulare:

2) Se cite ște, prin intermediul unui câmp de tip te xt al unui formular, o valoare natural ă având cel
mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să o valideze,
afișând apoi cifrele sale într-un tabel cu o singur ă linie, în aceea și ordine în care apar ele în num ăr,
colorând cu fundal verde cifrele pare și cu fundal ro șu cifrele impare. Afi șați apoi, sub acest tabel,
care este suma cifrelor pare, respec tiv care este suma cifrelor impare.

120
3) Se cite ște, prin intermediul unui câmp de tip te xt al unui formular, o valoare natural ă având cel
mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să o valideze,
afișând apoi cifrele sale într-un tabel cu o singur ă linie, în aceea și ordine în care apar ele în num ăr,
colorând cu fundal verde cifrele pare și cu fundal ro șu cifrele impare. Afi șați apoi, sub acest tabel,
numărul natural format doar cu cifrele pare, respectiv num ărul natural format doar cu cifrele
impare. 4) Se cite ște, prin intermediul unui câmp de tip te xt al unui formular, o valoare natural ă având cel
mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să o valideze,
afișând apoi cifrele sale într-un tabel cu o singur ă linie, în aceea și ordine în care apar ele în num ăr,
colorând cu fundal verde cifrele aflate pe pozi ții pare respectiv cu fundal ro șu cifrele aflate pe
poziții impare. Pozi țiile se consider ă astfel: cifra unit ăților are pozi ția 0, cifra zecilor pozi ția 1, cifra
sutelor pozi ția 2, etc.
Afișați apoi sub tabel suma ci frelor aflate pe pozi țiile pare, respectiv suma cifrelor aflate pe pozi țiile
impare, apoi, sub ele, modulul diferen ței dintre cele dou
ă sume.
Pe baza valorii ob ținute afișați un mesaj corespunz ător faptului c ă numărul introdus este sau nu
divizibil cu 11 (dac ă valoarea ob ținută este divizibil ă cu 11, atunci tot num ărul este divizibil cu 11).

5) Problemă rezolvată (apl089.html + apl090.php ):
Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural având
cel mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să afișeze
primele 10 numere prime mai mari sau egale cu num ărul introdus.
Numerele determinate se vor afi șa într-un tabel cu o singur ă coloană, alternând culorile de
fundal ale celulelor cu bl eu respectiv portocaliu.

apl089.html
<html><body>
<h3>Dindu-se un numar natural, sa se afiseze primele 10 valori prime mai mari sau egale cu el</h3> <form action="apl090.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu numarul natural cu maxim 9 cifre: <td><input type="text" name="n" maxlength="9" size="9"> <tr><td colspan="2" align="center">
<input type="submit" value="Rezolva">
</table></form> </body></html>

121
apl090.php
<html><body>
<?php
$n=$_POST['n']; $k=0; echo '<h3>Numarul primit = ',$n; echo '<br>Iata primele 10 valori prime mai mari sau egale cu el<br>'; echo '<table border="1" cellspacing="0" cellpadding="10">'; while($k<=10) //cit timp nu s-au generat inca toate cele 10 numere
{//testam daca valoarea curenta, adica $n, este numar prim:
$is_prime=1; for($d=2;$d<=sqrt($n);$d++) if($n%$d==0) $is_prime=0; if($n<=1) $is_prime=0; //daca este numar prim, il afisam intr-o noua linie de tabel
if($is_prime)
{ echo '<tr><td align="center" '; //in functie de paritatea lui$k, //alternam culorile de fundal ale celulelor tabelei if($k%2==0) echo 'bgcolor="#88ffff">'; else echo 'bgcolor="#ffaa50">'; echo $n; $k++; //daca $n a fost numar prim, il numaram in contorul $k
} $n++; //si trecem la verificarea urmatorului numar
}
?>
</table></body></html>

6) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural având cel
mult 9 cifre. Scrie ți un program PHP care s ă preia valoarea respectiv ă din formular și să afișeze
toate valorile de cel pu țin două cifre, mai mici sau egale cu num ărul natural introdus, care au
proprietatea c ă sunt în acela și timp și numere prime și palindroame. Valorile se vor afi șa într-un
tabel cu o singur ă coloană, alternând culorile de fundal ale celu lelor cu galben, respectiv mov pal.
7) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural având cel
mult 9 cifre. Scrie ți un program PHP care preia valoarea respectiv ă din formular și afișează
descompunerea num ărului în factori primi. Afi șarea se va face prezentabil, folosind tag-urile <sup>
și </sup> pentru scrierea exponen ților diferi ți de 1 ai factor ilor care apar în descompunere. De
exemplu, dac ă se citește numărul 300, se va afi șa descompunerea în forma:
22 * 3 * 52.

8) Se citesc, prin intermediul a dou ă câmpuri de tip text ale unui formular, dou ă numere naturale
nenule având cel mult 9 cifre. Scrie ți un program PHP care afi șează numerele introduse și totodată
calculează și afișează atât cmmdc-ul cât și cmmmc-ul lor.

122
9) Se cite ște, prin intermediul unu i câmp de tip text al unui formular, un num ăr natural cu cel pu țin
3 cifre. Să se scrie un program PHP care determin ă și afișează cel mai mic num ăr natural, mai mare
sau egal cu num ărul dat, care are proprietatea c ă cele dou ă valori ob ținute prin eliminarea primei
respectiv a ultimei sale cifre, sunt prime între ele. Ex: Dacă se citește 1266 (care NU este un astfel de num ăr, deoarece 126 și 266 NU sunt prime între
ele) se va determina și afișa numărul 1269.
10) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural n cuprins
între 3 și 40. Să se scrie un program PHP care afi șează într-un tabel termenii șirului lui Fibonacci
începând de la cel de indi ce 2 la cel de indice n, pentru fiecare termen afi șând totodat ă și raportul
dintre acest termen și cel de dinainte sa, sub forma unui num ăr real, cu zecimale.
11) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural n având cel
mult 9 cifre. S ă se scrie un program PHP care determin ă și afișează cel mai mare termen al șirului
lui Fibonacci care ar e proprietatea c ă este mai mic sau egal cu num
ărul dat.
12) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural n având cel
mult 9 cifre. S ă se scrie un program PHP care determin ă descompunerea num ărului n în sum ă de
termeni ai șirului lui Fibonacci. Rezultatul se va afi șa prezentabil sub forma urm ătoare:
Exemplu: dac ă se citește numărul n = 2891 vom avea descompunerea:
2891 = 1 + 5 + 13 + 21 + 34 + 89 + 144 +377 + 610 + 1597
4.2. Algoritmi care opereaz ă cu șiruri sau matrice (sort ări, ștergeri, inser ări)
13) Problemă rezolvat ă (
apl091.html + apl092.php + apl093.php ): Se cite ște, prin
intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n, mai mic sau egal cu
40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n elemente numere naturale
(fiecare element al șirului va fi citit într-un textbox). Scrie ți un program PHP care preia valorile
șirului, le sorteaz ă crescător și le afișează într-un tabe l cu o singur ă linie, colorând cu fundal verde
deschis elementele pare, respectiv cu fundal ro șu deschis elementele impare.
apl091.html
<html><body><form action="apl092.php" method="post">
<table border="1" cellspacing="0" cellpadding="10">
<tr><td>
Introdu numarul de elemente din sir (cel mult 40) <td><input type="text" name="n"> <tr><td align="center" colspan="2"> <input type="submit" value="Citeste elementele"> </table></form></body></html>

123
apl092.php
<html><body>
<?php
$n=$_POST['n']; echo '<h3>Introdu cele ',$n,' valori naturale ale sirului:',"\n"; echo '<form action="apl093.php" method="post">',"\n"; echo '<table border="1" cellspacing="0" cellpadding="10">',"\n"; for($i=1;$i<=$n;$i++) echo '<tr bgcolor="yellow"><td>Elem. al ',$i,'-lea: ', '<td><input type="text" name="a[',$i,']">',"\n"; //deci pentru fiecare indice generam un text care se va //numi a[1], a[2], …. echo '<tr><td colspan="2" align="center">',"\n"; echo '<input type="submit" value="Sorteaza sirul">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n";
//deci valoarea lui $n o trimitem mai departe (pentru ca avem
//nevoie de ea la prelucrarea datelor shirului) prin intermediul //unui control de tipul "hidden" echo '</table></form>'; ?> </body></html>
apl093.php
<html><body> <?php $n=$_POST['n']; $a=$_POST['a' ];//in felul asta obtinem
//in variabila $a tot sirul trimis din cadrul form-ului //prin intermediul atributelor name=a[1], name=a[2],… //mai intii sortam elementele sirului, crescator:
for($i=1;$i<=$n-1;$i++) for($j=$i+1;$j<=$n;$j++) if($a[$i]>$a[$j]) { $aux=$a[$i];$a[$i]=$a[$j];$a[$j]=$aux;
}
echo '<h3>Iata elementele sirului sortat:</h3>'; echo '<table border="1" cellspacing="0" cellpadding="10">'; echo '<tr>'; for($i=1;$i<=$n;$i++) if($a[$i]%2==0) echo '<td bgcolor="#80ff80">',$a[$i]; else echo '<td bgcolor="#ff8080">',$a[$i]; ?> </table></body></html>

14) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n,
mai mic sau egal cu 40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n
elemente numere naturale (fiecare element al șirului va fi citit într-un textbox). Scrie ți un program
PHP care preia valorile șirului și le afișează într-un tabel cu o singur ă linie, colorând cu fundal ro șu
deschis acele numere care sunt prime și cu verde deschis acele numere care sunt p ătrate perfecte.
Dacă în șirul dat nu sunt fie numer e prime, fie numere p ătrate perfecte, fie de ambele categorii, s ă
se afișeze un mesaj corespunz ător.
15) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n,
mai mic sau egal cu 40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n
elemente numere naturale (fiecare element al șirului va fi citit într-un textbox). Scrie ți un program

124 PHP care preia valorile șirului și le afișează într-un tabel cu o singur ă linie, colorând cu fundal ro șu
prima valoare din șirul introdus, care are proprietatea c ă este palindrom. S ă se șteargă apoi aceast ă
valoare din șir, reafișând, tot sub forma unui tabel cu o singur ă linie, valorile r ămase. Dac ă printre
valorile introduse nu se afl ă nici un palindrom, se va afi șa un mesaj corespunz ător.
16) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n,
mai mic sau egal cu 40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n
elemente numere naturale (fiecare element al șirului va fi citit într-un textbox). Scrie ți un program
PHP care preia valorile șirului și le afișează într-un tabel cu o singur ă linie, colorând cu fundal
galben prima pereche de elemente vecine (consecutive ca pozi ție) care au proprietatea c ă NU sunt
prime între ele. S ă se insereze apoi, între cele dou ă valori, cmmdc-ul lor. Se va reafi șa, tot sub
forma unui tabel, șirul obținut, în care color ăm tot cu galben elementele perechii, respectiv cu bleu
cmmdc-ul inserat. Dac ă printre valorile introduse nu se afl ă nici o pereche de elemente vecine cu
proprietatea cerut ă, se va afi
șa un mesaj corespunz ător.
17) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n,
mai mic sau egal cu 40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n
elemente numere naturale (fiecare element al șirului va fi citit într-un textbox). Scrie ți un program
PHP care preia valorile șirului și le afișează într-un tabel cu o singur ă linie, colorând cu fundal ro șu
deschis toate numerele care sunt prime. S ă se șteargă apoi din șir toate aceste numere. Se va reafi șa,
tot sub forma unui tabel, șirul obținut. Dacă printre valorile introduse nu se afl ă nici un num ăr prim,
se va afișa un mesaj corespunz ător.

18) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul n,
mai mic sau egal cu 40. Pe baza lui n ve ți genera un alt formular, în care ve ți citi un șir cu n
elemente numere naturale (fiecare element al șirului va fi citit într-un textbox). Scrie ți un program
PHP care preia valorile șirului și le afișează într-un tabel cu o singur ă linie. Să se insereze apoi între
oricare pereche de veci ni consecutivi (ca pozi ție) ai șirului, care au proprietatea c ă au aceea și
paritate, media lor aritmetic ă. Se va reafi șa, tot sub forma unui tabel, șirul obținut, colorând cu
fundal verde deschis elementele care au fost inserate. Dac ă printre valorile introduse nu se afl ă nici
o pereche de vecini care s ă aibă aceeași paritate, se va afi șa un mesaj corespunz ător.

19) Problemă rezolvat ă (apl094.html + apl095.php + apl096.php ): Se citesc, prin
intermediul a dou ă câmpuri de tip text ale unui formular, dou ă numere naturale nenule, n și m, mai
mici sau egale cu 30. Pe baza lor ve ți genera un alt formular, în care ve ți citi elementele unei

125
matrice cu n linii și m coloane, numere întregi. Scrie ți un program PHP care pr eia valorile matricei,
determină minimul (dac ă sunt mai multe, primul dintre ele, în sensul în care se parcurge matricea pe
linii, de la stânga la dreapta) și afișează matricea, colorând acest element cu verde, restul
elementelor de pe linia sa cu galben, iar re stul elementelor de pe coloana sa cu bleu.

apl094.html
<html><body>
<form action="apl095.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td> Introdu numarul de linii ale matricei (cel mult 30) <td><input type="text" name="n"> <tr><td> Introdu numarul de coloane ale matricei (cel mult 30) <td><input type="text" name="m"> <tr>
<td align="center" colspan="2">
<input type="submit" value="Citeste elementele"> </table></form></body></html>

apl095.php

<html><body>
<?php $n=$_POST['n']; $m=$_POST['m']; echo '<h3>Introdu elementele matricei:',"\n"; echo '<form action="apl096.php" method="post">',"\n";
echo '<table border="1" cellspacing="0" cellpadding="10">',"\n";
for($i=1;$i<=$n;$i++) { echo '<tr bgcolor="yellow">'; for($j=1;$j<=$m;$j++) echo '<td><input type="text" size="4" name="a[',$i,'][',$j,']">',"\n"; //deci generam campurile text care se vor //numi a[1][1], a[1][2], …. } echo '</table><br>'; echo '<input type="submit" value="Proceseaza datele">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n"; echo '<input type="hidden" name="m" value="',$m,'">',"\n";
//deci valoarile lui $n si $m le trimitem mai departe
//(pentru ca avem nevoie de ele la prelucrarea datelor //matricei) prin intermediul unor controale de tipul "hidden" echo '</table></form>'; ?> </body></html>

126 apl096.php
<html><body>
<?php $n=$_POST['n'];
$m=$_POST['m'];
$a=$_POST['a' ];//in felul asta obtinem
//in variabila $a toata matricea trimisa din cadrul form-ului //prin intermediul atributelor name=a[1][1], name=a[1][2],… //determinam mai intii minimul, cu tot cu indicii sai: $min=$a[1][1];$imin=1;$jmin=1; for($i=1;$i<=$n;$i++) for($j=1;$j<=$m;$j++) if($a[$i][$j]<$min) { $min=$a[$i][$j]; $imin=$i;$jmin=$j; }
echo 'Minimul este ',$min,' pe linia ',$imin,' si coloana ',$jmin,'<br>';
echo '<table border="1" cellspacing="0" cellpadding="10">'; for($i=1;$i<=$n;$i++) { echo '<tr>'; for($j=1;$j<=$m;$j++) { if($i==$imin&&$j==$jmin) echo '<td bgcolor="#00ff00" align="center">'; else if($i==$imin) echo '<td bgcolor="#ffff00" align="center">';
else
if($j==$jmin) echo '<td bgcolor="#80ffff" align="center">'; else echo '<td align="center">'; echo $a[$i][$j]; } } ?> </table> </body></html>

20) Se citesc, prin intermediul a dou ă câmpuri de tip text ale unui formular, dou ă numere naturale
nenule, n și m, mai mici sau egale cu 30. Pe baza lor ve ți genera un alt formular, în care ve ți citi
elementele unei matrice cu n linii și m coloane, numere întregi. Scrie ți un program PHP care preia
valorile matricei și sortează crescător elementele primei linii ale sale prin inteschimb ări de coloane.
Se vor afi șa atât matricea ini țială, cât și matricea final ă, ambele în câte un tabel, colorând cu fundal
galben elementele primei linii. 21) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul, n
mai mic sau egal cu 30. Pe baza lui ve ți genera un alt form ular, în care ve ți citi elementele unei
matrice p ătratice cu n linii și coloane, numere întregi. Scrie ți un program PHP care preia valorile
matricei, afi șând-o într-un tabel în care:

127
– elementele de pe diagonala principal ă sunt colorate cu fundal galben;
– elementele de pe diagonala secundar ă sunt colorate cu fundal bleu;
– în cazul în care dia gonalele se intersecteaz ă, elementul de la intersec ția lor va fi colorat cu fundal
verde. 22) Se cite ște, prin intermediul unui câmp de tip text al unui formular, un num ăr natural nenul, n
mai mic sau egal cu 30. Pe baza lui ve ți genera un alt form ular, în care ve ți citi elementele unei
matrice p ătratice cu n linii și coloane, numere întregi. Scrie ți un program PHP care preia valorile
matricei, afi șând-o într-un tabel în care coloreaz ă cu fundal galben elementele p ătratului concentric
care conține elementul minim al matricei. În cazul în ca re în matrice sunt mai multe minime, se va
lua în considerare primul pe care îl întâlnim, în sensul în care parcurgem matricea pe linii, fiecare
linie fiind parcurs ă de la stânga la dreapta.
23) Se citesc, prin intermediul a dou ă câmpuri de tip text ale unui formular, dou ă numere naturale
nenule, n și m, mai mici sau egale cu 30. Pe baza lor ve ți genera un alt formular, în care ve ți citi
elementele unei matrice cu n linii și m coloane, numere întregi. Scrie ți un program PHP care preia
valorile matricei și determin ă cele două linii care con țin minimul respectiv maximul din matrice. În
cazul în care sunt mai multe minime, se consider ă prima apari ție, iar în cazul în care sunt mai mult
maxime, se consider ă ultima apari ție (parcurgând matricea pe linii, și în cadrul fiec ărei linii de la
stânga la dreapta). Se vor interschimba cele dou ă linii.
Programul va afi șa într-un tabel elementele matricei înainte și după interschimbare, colorând
cu fundal bleu linia care con ține minimul, respectiv cu f undal portocaliu linia care con
ține maximul.
Dacă atât minimul cât și maximul determinate dup ă procedeul de mai sus se afl ă pe aceeași linie, se
va da un mesaj corespunz ător și se va afi șa doar o singur ă dată matricea.

4.3. Prelucrarea șirurilor de caractere
24) Problemă rezolvat ă (apl097.html + apl098.php ): Se citește, prin intermediul unui câmp
de tip text al unui formular, o fraz ă ale cărei cuvinte pot fi separate prin spa ții, virgule, puncte. S ă se
scrie un program PHP care s ă afișeze toate cuvintele care apar în string, în ordine alfabetic ă,
convertite la litere mici, într-un tabel cu o singur ă coloană.
apl097.html
<html><body>
<form action="apl098.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu o fraza
<tr><td><input type="text" name="s" size="50">
<tr><td align="center"> <input type="submit" value="Proceseaza fraza"> </table> </form></body></html>

128
apl098.php
<html><body>
<?php $s=$_POST['s'];
$n=0;
//separam cuvintele din string cu strtok si le punem //in sirul a: for($p=strtok($s,",. ");$p!==false;$p=strtok(",. ")) $a[++$n]=strtolower($p); //le sortam alfabetic for($i=1;$i<=$n-1;$i++) for($j=$i+1;$j<=$n;$j++) if($a[$i]>$a[$j]) {$aux=$a[$i];$a[$i]=$a[$j];$a[$j]=$aux;} echo '<h3>Iata cuvintele in ordine alfabetica:</h3>'; echo '<table border="1" cellpadding="10" cellspacing="0">'; for($i=1;$i<=$n;$i++)
echo '<tr><td>',$a[$i];
?> </table></body></html>

25) Se cite ște, prin intermediul unui câmp text al unui formular, un șir de caractere ce con ține mai
multe cuvinte, separate prin virgule, spa ții, puncte. S ă se scrie un program PH P care preia string-ul
din acest formular și formeaz ă și afișează un șir ce conține doar cuvintele distincte din șirul dat.
Șirul cu cuvintele di stincte se va afi șa într-un tabel cu o singur ă coloană.
26) Se cite ște, prin intermediul unui câmp text al unui formular, un șir de caractere ce con ține mai
multe cuvinte, separate prin virgule, spa ții, puncte. S ă se scrie un program PHP care preia string-ul
din acest formular și afișează toate cuvintele sale în tr-un tabel cu o singur ă coloană, colorând cu
fundal roșu doar acele cuvinte care sunt palindromice. Daca nici un cuvânt nu este palindromic, se
va afișa un mesaj corespunz ător.
27) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o dat ă calendaristic ă de
forma zz/ll/aaaa (z și l pot avea fie un caracter, iar anul este pozitiv). S ă se scrie un program PHP
care determin ă câte zile au trecut de la începutul acelui an pân ă la data respectiv ă.
28) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă
mai
mică decât 40. S ă se genereze mai întâi, printr-un script PH P, un formular cu n câmpuri de tip text,
în care se permite citirea a n șiruri de caractere. S ă se afișeze apoi, prin intermediul altui program
PHP, toate aceste șiruri de caractere într -un tabel cu o singur ă coloană, colorând cu fundal ro șu șirul
cel mai lung. Dac ă sunt dou ă sau mai multe șiruri de lungime maxim ă, se vor colora fundalul
tuturor cu ro șu.

129
29) Se citesc, prin intermediul a dou ă câmpuri de tip text ale unui formular, dou ă cuvinte. Scrie ți un
program PHP care afi șează cele dou ă cuvinte introduse și verifică dacă sunt angrame, adic ă sunt
formate din exact acelea și litere, fiecare liter ă trebuie s ă apară în fiecare cuvânt de exact acela și
număr de ori, iar ordinea în care apar poate, evident, s ă fie diferit ă.
30) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o fraz ă formată din cuvinte
separate prin puncte, virgule, spa ții. Determina ți care este litera care apar e de cele mai multe ori,
precum și numărul său de apari ții. Dacă o mai multe litere apar de acela și număr maxim de ori, se
vor afișa toate aceste litere. Literele determinate le ve ți afișa într-un tabel cu o singur ă coloană.

4.4. Probleme de Backtracki ng, Divide et Impera, Aplica ții ale geometriei analitice plane
studiate în cadrul disciplinei matematic ă, Reprezent ări de fractali

31) Problemă rezolvat ă (
apl099.html + apl100.php ): Se citește, prin intermediul unui câmp
de tip text al unui fo rmular, o valoare pozitiv ă nenulă n mai mic ă sau egală cu 7. Să se scrie un
program PHP care genereaz ă toate permut ările de n, afi șându-le într-un tabe l. Fiecare linie a
tabelului va con ține elementele unei permut ări.
apl099.html
<html>
<body> <form action="apl100.php" method="post"> <table border="1" cellpadding="10" cellspacing="0"> <tr> <td>Introdu ordinul permutarilor: <td> <input type="text" name="n"> <tr> <td align="center" colspan="2"> <input type="submit" value="Genereaza permutarile">
</table>
</form> </body> </html>
apl100.php
<html><body>
<?php $n=$_POST['n'];

function afis() {//in functia de afisare, variabilele
//$x (sirul de generare si $n = //ordinul permutarilor, le luam globale global $n,$x; echo '<tr>'; //afisam deci elementele permutarii //curente intr-o linie noua a tabelului for($i=1;$i<=$n;$i++) echo '<td align="center">',$x[$i]; }

130 function valid($k)
{//in functia de valid de asemenea $n si $x sunt globale
global $n,$x; //verificam daca elementul curent este diferit de fiecare //dintre cele de dinaintea sa for($i=1;$i<=$k-1;$i++) if($x[$i]==$x[$k])
return 0;
return 1; } function permutari($k) { //de asemenea $n si $x sunt variabile globale
global $n,$x; //implementam sub forma recursiva functia de tip backtracking //ce ne generaza permutarile for($x[$k]=1;$x[$k]<=$n;$x[$k]++) if(valid($k)) if($k==$n) afis();
else permutari($k+1);
} //afisam definitia tabelului "in programul principal" echo '<table border="1" cellpadding="10" cellspacing="0">'; //dupa care, prin apelul recursiv, dam drumul la generarea permutarilor permutari(1); //iar la sfirsit inchidem tag-ul tabelului echo '</table>'; ?> </body></html>

32) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă n
mai mică sau egală cu 10. Să se scrie un program PHP care genereaz ă toate permut ările de n care au
proprietatea c ă pe oricare dou ă poziții vecine (adic ă la indici consecutivi) se afl ă doar valori de
parități diferite, afi șându-le într-un tabel. Fiecare linie a tabelului va con ține elementele unei
permutări.
33) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă n
mai mică sau egală cu 10. Să se scrie un program PHP care genereaz ă toate permut ările de n care au
proprietatea c ă diferența în modul a oricare elemente de pe pozi ții vecine (adic ă la indici
consecutivi) este cel mult 2, afi șându-le într-un tabel. Fiecare linie a tabelului va con ține elementele
unei permut ări.
34) Se citesc, prin intermediul a dou ă câmpuri de tip text ale unui formular, dou ă valori pozitive
nenule n și m, astfel încât m ≤ n. Să se scrie un program PHP care genereaz ă toate combin ările de
elemente ale mul țimii {1, 2, .., n} luate câte m. Combin ările generate se vor afi șa într-un tabel.
Fiecare linie a tabelului va con ține elementele unei combin
ări.

131
35) Problemă rezolvat ă (apl101.html + apl102.php ): Se citește, prin intermediul unui câmp
de tip text al unui form ular, o valoare pozitiv ă nenulă n mai mic ă sau egală cu 8 și mai mare sau
egală cu 4. Să se scrie un program PHP care genereaz ă toate posibilit ățile de a aranja n regine pe-o
tablă de șah n x n astfel încât s ă nu se atace între ele. Fiecare solu ție se va afi șa sub forma unui tabel
cu n linii și n coloane, în care celulele sunt colora te alternativ, ca în cazul tablei de șah iar reginele
sunt reprezentate printr-o imagine reprezentativ ă. Soluțiile se vor numerota.
În implementare vom folosi urm ătoarea imagine, queen.gif:
apl101.html
<html><body>
<form action="apl102.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu dimensiunea tablei de sah: <td><input type="text" name="n"> <tr><td colspan="2" align="center"> <input type="submit" value="Aseaza reginele"> </table> </form></body></html>

apl102.php
<html><body>
<?php $n=$_POST['n']; function afish()
{ global $x,$n,$nrsol;
//sirul de generare, $n si variabila in care numaram //solutiile sunt globale echo '<h3>Solutia numarul ',++$nrsol; echo '<table border="1" cellspacing="0" cellpadding="3">'; //afisam un tabel cu $n linii si coloane for($i=1;$i<=$n;$i++) { echo '<tr>'; for($j=1;$j<=$n;$j++) { //in functie de paritatea lui $i+$j stabilim culoarea //alternam culorile de fundal ale patratelelor, ca pe
//tabla de sah
if(($i+$j)%2==0) echo '<td bgcolor="#ffffaa">'; else echo '<td bgcolor="$aaffaa">'; //iar daca la celula curenta se afla o regina //atunci reprezentam acea regina prin imaginea queen.gif if($x[$i]==$j) echo '<img src="queen.gif">'; //iar in caz ca e goala,punem un spatziu in acea celula else echo '&nbsp;'; } } echo '</table>'; }

function valid($k) { global $x; //in functia de valid verificam faptul ca dama //de la indicele $k sa nu se atace cu vreuna de dinainte for($i=1;$i<=$k-1;$i++) if($x[$i]==$x[$k]||abs($x[$k]-$x[$i])==$k-$i) return 0; return 1; }

132
function dame($k)
{ global $x,$n; //functia dame implementeaza backtracking-ul recursiv for($x[$k]=1;$x[$k]<=$n;$x[$k]++) if(valid($k)) if($k==$n) afish();
else dame($k+1);
} $nrsol=0; dame(1); ?> </body></html>

36) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă n
mai mică sau egală cu 8 și mai mare sau egal ă cu 4. Să se scrie un program PHP care genereaz ă
doar 10 posibilit ăți ce a așeza n ture pe-o tabl ă de șah n x n astfel încât s ă nu se atace între ele.
Fiecare solu ție se va afi șa sub forma unui tabel cu n linii și n coloane, în care celulele sunt colorate
alternativ, ca în cazul tablei de șah iar turele sunt reprezentate printr-o imagine reprezentativ ă.
Soluțiile se vor numerota.
37) Se cite ște, prin intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă n
mai mică sau egală cu 8 și mai mare sau egal ă cu 4. Să se scrie un program PHP care genereaz ă
doar 10 posibilit ăți ce a așeza n regi pe-o tabl ă de șah n x n astfel încât pe fiecare linie de pe tabl ă să
se găsească exact un rege, iar regii s ă nu se atace între ei. Fiecare solu ție se va afi șa sub forma unui
tabel cu n linii și n coloane, în care celulele sunt colora te alternativ, ca în cazul tablei de șah iar
turele sunt reprezentate pr intr-o imagine reprezentativ ă
. Soluțiile se vor numerota.

38) Problemă rezolvat ă (apl103.html + apl104.php + apl105.php ): Se cite ște, prin
intermediul unui câmp de tip text al unui formular, o valoare pozitiv ă nenulă n, cel mult egal ă cu
40. Prin intermediul altui formular cu n câmpuri de tip text se citesc elem entele întregi ale unui șir.
Scrieți un program PHP care afi șează mai întâi elementele citite, le sorteaz ă crescător prin
interclasare (deci folosind metoda divide et impera) și le afișează și după sortare. Elementele se vor
afișa într-un tabel cu o singur ă linie.

133

apl103.html
<html><body>
<form action="apl104.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td> Introdu numarul de elemente din sir (cel mult 40) <td><input type="text" name="n"> <tr> <td align="center" colspan="2"> <input type="submit" value="Citeste elementele"> </table></form></body></html>

apl104.php
<html><body>
<?php $n=$_POST['n']; echo '<h3>Introdu cele ',$n, ' valori naturale ale sirului:',"\n"; echo '<form action="apl105.php" method="post">',"\n"; echo '<table border="1" cellspacing="0" cellpadding="10">',"\n";
for($i=1;$i<=$n;$i++)
echo '<tr bgcolor="yellow"><td>Elem. al ',$i,'-lea: ', '<td><input type="text" name="a[',$i,']">',"\n"; echo '<tr><td colspan="2" align="center">',"\n"; echo '<input type="submit" value="Sorteaza sirul prin interclasare">',"\n"; echo '<input type="hidden" name="n" value="',$n,'">',"\n"; echo '</table></form>'; ?> </body></html>
apl105.php
<html><body> <?php $n=$_POST['n']; $a=$_POST['a']; function afis($a,$n) { echo '<table border="1" cellspacing="0" cellpadding="10">'; echo '<tr bgcolor="yellow">'; for($i=1;$i<=$n;$i++) echo '<td align="center">',$a[$i];
echo '</table>';
} echo '<h3>Iata sirul initial:</h3>'; afis($a,$n); //mai jos este functia care interclaseaza din sirul //$a, bucatile dintre indicii $l..$m respectiv $m+1..$r //punind rezultatul la loc in sirul $a, incepind de la //indicele $l function intercl(&$a,$l,$m,$r) { $k=$l;$i=$l;$j=$m+1;
while($i<=$m&&$j<=$r)
if($a[$i]<$a[$j]) $c[$k++]=$a[$i++]; else $c[$k++]=$a[$j++]; while($i<=$m) $c[$k++]=$a[$i++]; while($j<=$r) $c[$k++]=$a[$j++]; for($i=$l;$i<=$r;$i++) $a[$i]=$c[$i]; }

134
//si in fine, mai jos este functia care
// realizeaza sortarea prin //interclasare: function merge_sort(&$a,$l,$r) { if($l<$r) {
//se calculeaza $m=indicele mijlocului dintre $l si $r
$m=(int)(($l+$r)/2); //se sorteaza recursiv partea dintre $l si $m merge_sort($a,$l,$m); //apoi partea dintre $m+1 si $r merge_sort($a,$m+1,$r); //si, in fine, cele doua se interclaseaza: intercl($a,$l,$m,$r); } } merge_sort($a,1,$n); echo '<h3>Iata sirul final, obtinut dupa sortarea sa prin interclasare:</h3>';
afis($a,$n);
?>
39) Problemă rezolvată (apl106.html + apl107.php ): Se citesc, prin intermediul unor câmpuri
de tip text ale unui formular, coor donatele a trei puncte ce reprezint ă vârfurile unui triunghi.
Abscisele sunt cuprinse între 0 și 639 iar ordonatele între 0 și 479. Să se creeze o imagine de tip
PNG în care reprezenta ți triunghiul și cele trei în ălțimi ale sale.
Suportul matematic necesar rezolv ării:
Fie cele trei vârfuri ale triunghiului A(x a, ya), B(x b, yb), C(x c, yc).
Pentru a scrie ecua ția înălțimii care trece prin vârful A, vom considera ecua ția dreptei care trece
printr-un punct dat și are panta cunoscut ă:
(y – y A) = m⋅(x – x A)
Înălțimea, fiind perpendicular ă pe segmentul BC, are panta egal ă cu -1/m', unde m' = panta dreptei
BC. Așadar:
B CB C
x xy ym−−=' de unde rezult ă că
B CB C
y yx xm−−−= și deci ecua ția înălțimii care trece prin
vârful A este () ()A
B CB C
A xxy yx xyy −−−−=− . După efectuarea calculelor, ob ținem:
() () () ()B C A B C A B C B C x xx y yy x xx y yy −+−=−+− .
Pentru a determina a poi piciorul unei în ălțimi, este suficient s ă rezolvăm sistemul format din ecua ția
înălțimii și ecuația dreptei suport al laturii corespunz ătoare.
Pentru a scrie ecua ția unei laturi a triunghiului (fie, în cazul nostru, latu ra BC) cel mai la îndemân ă
este să ne folosim de formula:
0
111
=
C CB B
y xy xy x
.

135
apl106.html
<html><body>
<form action="apl107.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3>
<table border="1" cellspacing="0" cellpadding="10">
<tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4"> <tr> <td>y<sub>A</sub>= <td><input type="text" name="ya" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B <td>x<sub>B</sub>=
<td><input type="text" name="xb" size="4">
<tr> <td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime"> VARFUL<br>C <td>x<sub>C</sub>= <td><input type="text" name="xc" size="4"> <tr> <td>y<sub>C</sub>= <td><input type="text" name="yc" size="4"> <tr><td colspan="3" align="center">
<input type="submit" value="Deseneaza triunghiul">
</table> </form> </body></html>
apl107.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110);
imagefilledrectangle($im,0,0,639,479,$y);
$xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; imagesetthickness($im,2); $b=imagecolorallocate($im,0,0,255); imageline($im,$xa,$ya,$xb,$yb,$b); imageline($im,$xa,$ya,$xc,$yc,$b); imageline($im,$xc,$yc,$xb,$yb,$b); $r=imagecolorallocate($im,255,0,0); //determinam $a1,$b1,$c1 coeficientii //ecuatiei inaltimii corespunzatoare vf.A $a1=$xc-$xb;$b1=$yc-$yb;
$c1=$xa*($xc-$xb)+$ya*($yc-$yb);
//determinam $a2, $b2, $c2 coeficientii //dreptei suport a segmentului bc: $a2=$yb-$yc; $b2=-$xb+$xc; $c2=$yb*$xc-$xb*$yc; //aflam solutia sistemului format de cele doua: $xha=($c1*$b2-$c2*$b1)/($a1*$b2-$a2*$b1); $yha=($c1*$a2-$c2*$a1)/($b1*$a2-$a1*$b2); //procedam analog si cu celelalte inaltimi: //cea care pleaca din c: $a3=$xb-$xa;$b3=$yb-$ya; $c3=$xc*($xb-$xa)+$yc*($yb-$ya);
$a4=$ya-$yb;
$b4=-$xa+$xb; $c4=$ya*$xb-$xa*$yb; $xhc=($c3*$b4-$c4*$b3)/($a3*$b4-$a4*$b3); $yhc=($c3*$a4-$c4*$a3)/($b3*$a4-$a3*$b4);

136
//si in fine cu cea care pleaca din b:
$a5=$xc-$xa;$b5=$yc-$ya; $c5=$xb*($xc-$xa)+$yb*($yc-$ya); $a6=$ya-$yc; $b6=-$xa+$xc; $c6=$ya*$xc-$xa*$yc; $xhb=($c5*$b6-$c6*$b5)/($a5*$b6-$a6*$b5);
$yhb=($c5*$a6-$c6*$a5)/($b5*$a6-$a5*$b6);
//desenam inaltimile imageline($im,$xa,$ya,$xha,$yha,$b); imageline($im,$xc,$yc,$xhc,$yhc,$b); imageline($im,$xb,$yb,$xhb,$yhb,$b); //si in fine, punem literele //virfurilor triunghiului imagestring($im,5,$xa,$ya,'A',$r); imagestring($im,5,$xb,$yb,'B',$r); imagestring($im,5,$xc,$yc,'C',$r); imagepng($im); imagedestroy($im); ?>

40) Problemă rezolvată (apl108.html + apl109.php ): Se citesc, prin intermediul unor câmpuri
de tip text ale unui formular, coor donatele a trei puncte ce reprezint ă vârfurile unui triunghi.
Abscisele sunt cuprinse între 0 și 639 iar ordonatele între 0 și 479. Să se creeze o imagine de tip
PNG în care reprezenta ți triunghiul, cele trei bisectoare ale sale și cercul înscris în triunghi.
Suportul matematic necesar rezolv ării:
Fie triunghiul de vârfuri A(x A,yA), B(x B,yB), C(x C,yC), în care not ăm cu l a, lb, lc lungimile laturilor
opuse vârfurilor A, B respectiv C. Fie A'(x' A,y'A) piciorul bisectoarei din A pe latura BC.
Aplicând teorema bisectoarei, avem CABA
ACAB
''= .
O dată ce cunoa ștem valoarea raportului, dac ă proiectăm membrul drept al egalit ății pe axele OX
respectiv OY, se p ăstrează proporționalitatea, deci ob ținem urm ătoarele rela ții care ne permit
calcului lui x' A și y'A:
''
A CB A
BC
x xx x
ll
−−= de unde deducem
C BCC BB
Alllxlxx++='. Analog
C BCC BB
Alllylyy++='.
Știind coordonatele picioarelor bise ctoarelor, putem foarte lesne ob ține centrul cercului înscris în
triunghi prin intersec ția a două dintre ele.
apl108.html
<html><body>
<form action="apl109.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4">
<tr>
<td>y<sub>A</sub>= <td><input type="text" name="ya" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B

137 <td>x<sub>B</sub>=
<td><input type="text" name="xb" size="4"> <tr> <td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime">VARFUL<br>C <td>x<sub>C</sub>=
<td><input type="text" name="xc" size="4">
<tr> <td>y<sub>C</sub>= <td><input type="text" name="yc" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Deseneaza triunghiul"> </table> </form> </body></html>
apl109.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; imagesetthickness($im,2); $b=imagecolorallocate($im,0,0,255); imageline($im,$xa,$ya,$xb,$yb,$b);
imageline($im,$xa,$ya,$xc,$yc,$b);
imageline($im,$xc,$yc,$xb,$yb,$b); $r=imagecolorallocate($im,255,0,0); $g=imagecolorallocate($im,0,188,0); //definim o functie care sa ne calculeze distanta dintre //doua puncte de coordonate date function dist($x1,$y1,$x2,$y2) { return sqrt(($x1-$x2)*($x1-$x2)+($y1-$y2)*($y1-$y2)); } //si definim o functie care sa ne calculeze coordonatele //picioarei unei bisectoare:

function coordbis($xa,$ya,$xb,$yb,$xc,$yc,&$x1a,&$y1a) {//vom calcula coordonatele piciorului bisectoarei ce pleaca
//din virful A: $lb=dist($xa,$ya,$xc,$yc); $lc=dist($xa,$ya,$xb,$yb); $x1a=($xb*$lb+$xc*$lc)/($lb+$lc); $y1a=($yb*$lb+$yc*$lc)/($lb+$lc); } //definim si o functie care sa determine ecuatia unei drepte //care trece prin doua puncte de coordonate date: //functia va da coeficientii ecuatiei ax + by + c = 0 //care trece prin punctele ($x1,$y1) si ($x2,$y2)

function ec2puncte($x1,$y1,$x2,$y2,&$a,&$b,&$c) { $a=$y1-$y2; $b=-$x1+$x2; $c=$x1*$y2-$y1*$x2; } //si o functie care, date fiind doua ecuatii de drepte //in forma ax+by+c=0 determina punctul de intersectie function inters($a1,$b1,$c1,$a2,$b2,$c2,&$x,&$y) { $x=($b1*$c2-$b2*$c1)/($a1*$b2-$b1*$a2);
$y=($a1*$c2-$a2*$c1)/($b1*$a2-$a1*$b2);
}

138
//calculam picioarele celor 3 inaltimi si le desenam:
coordbis($xa,$ya,$xb,$yb,$xc,$yc,$x1a,$y1a); coordbis($xb,$yb,$xa,$ya,$xc,$yc,$x1b,$y1b); coordbis($xc,$yc,$xb,$yb,$xa,$ya,$x1c,$y1c); imageline($im,$xa,$ya,$x1a,$y1a,$g); imageline($im,$xb,$yb,$x1b,$y1b,$g); imageline($im,$xc,$yc,$x1c,$y1c,$g);
//calculam ecuatiile a doua inaltimi, de forma ax + by = c
ec2puncte($xa,$ya,$x1a,$y1a,$a1,$b1,$c1); ec2puncte($xb,$yb,$x1b,$y1b,$a2,$b2,$c2); //si determinam originea centrului cercului //inscris intersectindu-le: inters($a1,$b1,$c1,$a2,$b2,$c2,$xo,$yo); //determinam lungimea razei cercului, ca si //inaltime a triunghiului cu virful in //centrul cercului inscris si baza una dintre //laturi $s=0.5*abs($xa*$yb+$xb*$yo+$xo*$ya -$xo*$yb-$xa*$yo-$xb*$ya); $lc=dist($xa,$ya,$xb,$yb);
$raza=2*$s/$lc;$diam=2*$raza;
$mg=imagecolorallocate($im,255,0,140); imageellipse($im,$xo,$yo,$diam,$diam,$mg); //si in fine, punem literele virfurilor //triunghiului imagestring($im,5,$xa,$ya,'A',$r); imagestring($im,5,$xb,$yb,'B',$r); imagestring($im,5,$xc,$yc,'C',$r); imagestring($im,5,$x1a,$y1a,'A1',$r); imagestring($im,5,$x1b,$y1b,'B1',$r); imagestring($im,5,$x1c,$y1c,'C1',$r); imagepng($im);
imagedestroy($im);
?>
41) Se citesc, prin intermediul unor câmpuri de tip text ale unui formular, coordonatele a trei puncte
ce reprezint ă vârfurile unui tri unghi. Abscisele sunt cuprinse între 0 și 639 iar ordon atele între 0 și
479. Să se creeze o imagine de tip PNG în care reprezenta ți triunghiul, cercul s ău circumscris și
segmentele de pe mediatoare care unesc picioarele lor pe laturile triunghiul ui cu centrul cercului
circumscris. 42) Se citesc, prin intermediul unor câmpuri de tip text ale unui formul ar, coordonatele a patru
puncte ce reprezint ă vârfurile unui patrulater convex A BCD. Abscisele sunt cuprinse între 0 și 639
iar ordonatele între 0 și 479, punctele fiind date în ordine (deci AB, BC, CD, AD sunt laturile
poligonului convex). S ă se deseneze triunghiurile ABD, respectiv BCD, precum și cercurile lor
circumscrise, precum și razele care unesc centrele fiec ărui cerc cu vârfurile triunghiului
corespunz ător.
43) Se citesc, prin intermediul unor câmpuri de tip text ale unui formular, coordonatele a trei puncte
ce reprezint ă vârfurile unui tri unghi. Abscisele sunt cuprinse între 0 și 639 iar ordon atele între 0 și
479. Să se creeze o imagine de tip PNG în care reprezenta ți triunghiul, fie el ABC, cele 3 în ălțimi
AA', BB', CC' și cercul circumscris patrulat erului inscriptibil OA'B'C, unde O este ortocentrul
triunghiului.

139 ul l⋅sinu
l⋅cos uy0 y1 x0 x1
44) Problemă rezolvat ă (apl110.html + apl111.php ): Se cite ște, prin intermediul unui câmp
de tip text al unui formular, un num ăr natural n, cel pu țin 3 și cel mult 40. S ă se creeze o imagine
PNG de dimensiuni 640×480, în care reprezenta ți un poligon regulat cu n laturi, având centrul la
coordonatele (320,240) și raza cercului circumscris 200.
Suportul matematic necesar rezolv ării:
Ne vom folosi de coordonatele polar e: Dat fiind un punct de coordonate (x 0,y0) din care pleac ă un
segment de lungime l sub un unghi u, celălalt capăt al segmentului va avea coordonatele
x1=x0+l⋅cos u
y1=y0–l⋅sin u (semnul "–" se datoreaz ă orientării inverse a axei OY):

Să ne reamintim în primul rând c ă funcțiile trigonometrice ale limbajulu i PHP, ca de altfel ale
multor alte limbaje de programare, lucreaz ă în radiani.
În cazul de fa ță, pentru a ob ține coordonatele vârfurilor poligonul ui cu n laturi, vom considera
unghiul la centru
nuπ2=și vom "plimba" un segment de lungime r având un cap ăt fixat în centrul
centrului și celălalt capăt mobil, la unghiurile 0, u, 2 ⋅u, 3⋅u, … (n-1)⋅u. Astfel, coordonatele cap ătului
mobil ne vor da tocmai coor donatele vârfurilor poligonului.
apl110.html
<html><body>
<form action="apl111.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr><td>Introdu numarul de laturi:<br>(intre 3 si 40) <td><input type="text" name="n" size="4"> <tr><td colspan="2" align="center"> <input type="submit" value="Deseneaza poligonul"> </table> </form></body></html>

apl111.php
<?php
header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $n=$_POST['n']; $red=imagecolorallocate($im,255,0,0);
imagesetthickness($im,2);

140
$xc=320;$yc=240;$r=200;
$u=2*pi()/$n;//u=unghiul la centru for($i=0;$i<=$n-1;$i++) {//pe baza xc, yc, r, si unghiuri //variabile i*u calculam coordonatele //a 2 vf. vecine ale poligonului $x1=$xc+$r*cos($i*$u);
$y1=$yc-$r*sin($i*$u);
$x2=$xc+$r*cos(($i+1)*$u); $y2=$yc-$r*sin(($i+1)*$u); imageline($im,$x1,$y1,$x2,$y2,$red); } imagepng($im); imagedestroy($im); ?>

45) Genera ți o imagine PNG de dimensiuni 640 x 480 în care s ă creați un model de tip fagure,
format din hexagoane. Dimensiunea recomandat ă a unui hexagon este de latur ă 40. Pozi ționarea
hexagoanelor în cadrul imaginii r ămâne la latitudinea programatorului.

46) Problemă rezolvat ă (apl112.html + apl113.php ): Se citesc, pr in intermediul unui
formular, coordonatele a dou ă puncte și un număr natural m, cuprins între 2 și 40. Punctele vor avea
abscisa cuprins ă între 0 și 639 iar ordonata între 0 și 479. Împ ărțiți segmentul respectiv în m p ărți
congruente. Desena ți segmentul, marcând totodat ă prin cercule țe punctele ob ținute prin împ ărțirea
în cele m p ărți congruente.
Suportul matematic necesar rezolv ării:
Împărțind segmentul în m p ărți congruente, proiec ția lor pe axele de coordonate va consta de
asemenea în segmente congruente: Fie segmentul dintre punctele de coordonate (x
0,y0) și (x 1,y1). Notăm cu hx respectiv cu hy
lungimile proiec țiilor segmentelor congruente care se ob țin, pe axa OX respectiv pe axa OY. x0 x1
y0
y1 hy hx hx hx hx
hy
hy
hy

141
Avem: mxxhx0 1−= , respectiv myyhy0 1−= .
Pe baza lor, coordonatele punctelor intermediare care se ob țin sunt:
(x0+hx,y 0+hy), (x 0+2⋅hx,y 0+2⋅hy), (x 0+3⋅hx,y 0+3⋅hy), … (x 0+(m-1)⋅hx,y 0+(m-1)⋅hy)
sau, pe scurt: () hyiyhxix ⋅+⋅+0 0 ,, c u m i,0= dacă dorim și capetele, sau doar cu 1,1−=m i dacă
dorim doar punctele intermediare.

apl112.html
<html><body>
<form action="apl113.php" method="post"> <h3>Introdu coordonatele celor doua puncte intre care trasezi segmentul</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> Punctul<br>A
<td>x<sub>0</sub>=
<td><input type="text" name="x0" size="4"> <tr> <td>y<sub>0</sub>= <td><input type="text" name="y0" size="4"> <tr> <th align="center" rowspan="2" bgcolor="yellow"> Punctul<br>B <td>x<sub>1</sub>= <td><input type="text" name="x1" size="4"> <tr> <td>y<sub>1</sub>=
<td><input type="text" name="y1" size="4"><tr>
<th align="center" bgcolor="lime"> Numarul de<br>segmente <td>m= <td><input type="text" name="m" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Imparte segmentul"> </table> </form> </body></html>
apl113.php
<?php header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $m=$_POST['m']; $red=imagecolorallocate($im,255,0,0); imagesetthickness($im,2); $x0=$_POST['x0'];$y0=$_POST['y0']; $x1=$_POST['x1'];$y1=$_POST['y1']; $blue=imagecolorallocate($im,0,0,255);
imageline($im,$x0,$y0,$x1,$y1,$blue);
//calculam lungimile proiectiilor //segmentelor pe cele doua axe: $hx=($x1-$x0)/$m; $hy=($y1-$y0)/$m; //si desenam cerculete in punctele obtinute for($i=0;$i<=$m;$i++) imagefilledellipse($im,$x0+$i*$hx,$y0+$i*$hy,6,6,$red); imagepng($im); imagedestroy($im); ?>

142
46) Problemă rezolvat ă (apl114.html + apl115.php ): Se citesc, prin intermediul unui
formular, coordonatele a trei puncte A, B și C și un număr natural m, cuprins între 2 și 40. Punctele
au abscisa cuprins ă între 0 și 639 iar ordonata între 0 și 479. Împ ărțiți ambele segmente, AB și BC
în m părți congruente, dinspre A c ătre B în cazul primului respectiv dinspre B înspre C în cazul
celui de-al doilea. Uni ți primul punct ob ținut astfel de pe AB cu primul punct ob ținut astfel de pe
BC, al doilea punct de pe AB cu al doilea punct de pe BC, ș.a.m.d.
apl114.html
<html><body>
<form action="apl115.php" method="post"> <h3>Introdu coordonatele a 3 virfuri ale triunghiului</h3> <table border="1" cellspacing="0" cellpadding="10"> <tr> <th align="center" rowspan="2" bgcolor="lightblue"> VARFUL<br>A <td>x<sub>A</sub>= <td><input type="text" name="xa" size="4"> <tr> <td>y<sub>A</sub>=
<td><input type="text" name="ya" size="4">
<tr> <th align="center" rowspan="2" bgcolor="yellow"> VARFUL<br>B <td>x<sub>B</sub>= <td><input type="text" name="xb" size="4"> <tr><td>y<sub>B</sub>= <td><input type="text" name="yb" size="4"><tr> <th align="center" rowspan="2" bgcolor="lime"> VARFUL<br>C <td>x<sub>C</sub>= <td><input type="text" name="xc" size="4"> <tr><td>y<sub>C</sub>=
<td><input type="text" name="yc" size="4">
<tr> <th bgcolor="red">Numarul de segmente<td>m= <td><input type="text" name="m" size="4"> <tr><td colspan="3" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>
apl115.php
<?php
header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $m=$_POST['m']; $red=imagecolorallocate($im,255,0,0); $xa=$_POST['xa'];$ya=$_POST['ya']; $xb=$_POST['xb'];$yb=$_POST['yb']; $xc=$_POST['xc'];$yc=$_POST['yc']; $blue=imagecolorallocate($im,0,0,255);
imageline($im,$x0,$y0,$x1,$y1,$blue);
$hx1=($xb-$xa)/$m; $hy1=($yb-$ya)/$m; $hx2=($xc-$xb)/$m; $hy2=($yc-$yb)/$m; for($i=0;$i<=$m;$i++) imageline($im,$xa+$i*$hx1,$ya+$i*$hy1,$xb+$i*$hx2,$yb+$i*$hy2,$red); imagepng($im); imagedestroy($im); ?>

143 47) Se citesc, prin intermediul unui fo rmular, coordonatele a trei puncte A, B și C și un num ăr
natural m, cuprins între 2 și 40. Punctele au abscisa cuprins ă între 0 și 639 iar ordonata între 0 și
479. Să se împart ă atât latura AB (dinspre A înspre B) cât și latura AC (dinspre A înspre C) în m
părți congruente, și să se uneasc ă punctele ob ținute, formând astfel n segm ente paralele echidistante
la BC. 48) Se citesc, prin intermediul unui fo rmular, coordonatele a trei puncte A, B și C și un num ăr
natural m, cuprins între 2 și 40. Punctele au abscisa cuprins ă între 0 și 639 iar ordonata între 0 și
479. Să se împart ă atât latura BC în m p ărți congruente, și să se uneasc ă vârful A cu fiecare dintre
punctele ob ținute.

49)
Problemă rezolvat ă (apl116.html + apl117.php ): Se citește, prin intermediul unui câmp
text al unui formular, un num ăr natural cuprins între 1 și 15. Să se deseneze fractalul arbore de nivel
n, într-o imagine de dimensiuni 500×500. Segmentul ini țial al fractalului se afl ă între coordonatele
(250,490)-(250,240) (deci are lungi mea de 250). În cadrul fiec ărui nivel, capetele libere se ramific ă
în două segmente de lungime egal ă cu jumătate din lungimea segmentului de la pasul precedent,
orientate cu 4π respectiv cu 4π− față de acesta.
Suportul matematic necesar rezolv ării:
Acest tip de fractal se încadreaz ă unei clase mai largi, și anume a fractalilor care se ob țin
prin repetarea recurent ă a unui procedeu de desenare, la o scar ă mai mică și având alte orient ări. În
acest sens, mersul procedeului de calcul necesar desen ării sale este unul de tip divide et impera.
În cazul de fa ță, vom lucra în coordonate polare, pe care le vom și trimite, de altfel, func ției
recursive care realizeaz ă desenarea propriuzis ă.
Schema recursiv ă este următoarea:
– parametri func ției vor fi: (x 0, y0), l, u, n. Primele dou ă reprezită punctul de plecar e, l = lungimea
segmentului de baz ă pe nivelul curent, u = unghiul pe care-l face segmentul de la pasul curent cu
orizontala, n = pasul curent. – evoluția acestui fractal este urm ătoarea:

nivelul 1 nivelul 2 nivelul 3

144
acest lucru se transpune prin urm ătoarea schem ă recursivă:
()()
()
()
⎪⎪⎪⎪⎪
⎩⎪⎪⎪⎪⎪
⎨⎧
⎪⎪⎪⎪
⎩⎪⎪⎪⎪
⎨⎧

⎠⎞⎜
⎝⎛+ ⎟
⎠⎞⎜
⎝⎛−=
≠=
=
n ulyx fractal n ulyx fractalnulyx fractal
,4,2,, si ,4,2,, :prin desenare, de procedeul recursiv apeleaza se y,x , determinat capatuldin -u unghi l, lungime ,y,x dedat i segmentulu al capat celalalt y,x calculeaza se-
:0n daca0n daca nimic face mai senu
,,,,
1 1 1 11 10 01 1
0 0
π π
apl116.html
<html><body>
<form action="apl117.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 15) <td><input type="text" name="n" size="4"> <tr>
<td colspan="2" align="center">
<input type="submit" value="Deseneaza"> </table> </form> </body></html>
apl117.php
<?php
header("Content-type: image/png");
$im=imagecreatetruecolor(500,500);
$y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,499,499,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255); $l=300; function arbore($x0,$y0,$l,$u,$n) { if($n==0) return; //declaram global atit variabila imagine cit //si cea care defineste culoarea albastru //pentru a le putea accesa din functie:
global $im,$blue;
//calculam coordonatele celuilalt capat //al segmentului: $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); //il desenam: imageline($im,$x0,$y0,$x1,$y1,$blue); //apelam recursiv functia, pentru a ramifica //si pe nivelele urmatoare. Observati cum //sunt trimise mai departe coordonatele //celuilalt capat, din care ramificam, si //unghiuri deviate cu pi()/4 in stinga si //dreapta fata de unghiul segmentului curent
arbore($x1,$y1,$l/2,$u-pi()/4,$n-1);
arbore($x1,$y1,$l/2,$u+pi()/4,$n-1); } arbore(250,490,250,pi()/2,$n); imagepng($im); imagedestroy($im); ?>

145
49) Problemă rezolvat ă (apl118.html + apl119.php ): Se citește, prin intermediul unui câmp
text al unui formular, un num ăr natural cuprins între 1 și 10. Să se deseneze fractalul lui Koch de
nivel n, într-o imagine de di mensiuni 640×210. Segmentul ini țial al fractalului se afl ă între
coordonatele (10,200)-(630,200) (deci are lungimea de 620). Procedeul recurs iv este ilustrat mai
jos: nivelul 1 nivelul 2 nivelul 3 Așadar :
– pe nivelul 1 se deseneaz ă pur și simplu un segment între punctele P
0 și P1
– pe orice alt nivel n, se procedeaz ă astfel:
• se determin ă punctele intermediare P A, PB, PC , ca în figura de mai sus (mijloc) prin
împărțirea segmentului în 3 p ărți egale și construirea unui triunghi echilateral care are ca baz ă
segmentul din mijloc
• se deseneaz ă 4 fractali de dimensiuni l/3 și de nivel cu 1 mai pu țin, după cum urmeaz ă:
– unul ce pleac ă din P 0, sub acela și unghi ca și cel de pe nivelul curent;
– altul ce pleac ă din P A, sub un unghi cu π/3 mai mare decât cel al nivelului curent;
– altul ce pleac ă din P B, sub un unghi cu π/3 mai mic decât cel al nivelului curent;
– în fine, altul ce pleac ă din P C, sub acela și unghi ca și cel de pe nivelul curent.

apl118.html

<html><body>
<form action="apl119.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 10) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl119.php
<?php
header("Content-type: image/png"); $im=imagecreatetruecolor(640,210);
$y=imagecolorallocate($im,255,255,110);
imagefilledrectangle($im,0,0,640,210,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255); P0 P1 P0 P1 PA PB
PC

146
function koch($x0,$y0,$l,$u,$n)
{ //daca nu suntem pe nivelul $n==1 (cel de //baza, cind fractalul se reduce la un segment if($n!=1) { //calculam coordonatele punctelor Pa, Pb, Pc
$xa=$x0+$l/3*cos($u);
$ya=$y0-$l/3*sin($u); $xb=$xa+$l/3*cos($u+pi()/3); $yb=$ya-$l/3*sin($u+pi()/3); $xc=$xb+$l/3*cos($u-pi()/3); $yc=$yb-$l/3*sin($u-pi()/3); //Si apelam recursiv desenarea fractalului //pe nivelele urmatoare: koch($x0,$y0,$l/3,$u,$n-1); koch($xa,$ya,$l/3,$u+pi()/3,$n-1); koch($xb,$yb,$l/3,$u-pi()/3,$n-1); koch($xc,$yc,$l/3,$u,$n-1); }
else
{ //iar daca suntem pe nivelul 1, desenam pur si //simplu segmentul: global $im,$blue; $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); imageline($im,$x0,$y0,$x1,$y1,$blue); } } koch(10,200,620,0,$n);
imagepng($im);
imagedestroy($im); ?>

49) Se cite ște, prin intermediul unui câmp text al unui formular, un num ăr natural cuprins între 1 și
10. Să se deseneze, într-o imagine de dimensiuni 640×480, o variant ă a fractalului lui Koch
(cunoscut ă sub numele de fractalul lui Cesaro) ob ținut după un procedeu similar: fiecare segment se
înlocuiește tot cu 4 segmente congruente, cu deosebirea c ă cele oblice NU mai formeaz ă un triunghi
echilateral, ci un tr iunghi isoscel ale c ărui unghiuri de la baz ă au 85 de grade (în figura de mai jos,
este vorba de triunghiul P APBPC). Segmentul ini țial al fractalului se afl ă între coordonatele (10,470)-
(630,470) (deci are lungimea de 620). Proced eul recursiv este ilustrat mai jos:

nivelul 1 nivelul 2 nivelul 3
Iată și o imagine a acestui fractal, pentru n = 8:
P0 P1 P1 P0 PA PB
PC

147 50) Se cite ște, prin intermediul unui câmp text al unui formular, un num ăr natural cuprins între 1 și
8. Să se deseneze, într-o imagine de dimensiuni 640×480, o variant ă a fractalului lui Koch ob ținut
după procedeul urm ător: fiecare segment se înlocuie ște cu 5 segmente congr uente, între care se
formează unghiuri drepte, ca în schema de mai jos. Segmentul ini țial al fractalului se afl ă între
coordonatele (10,470)-(630,470) (deci are lungimea de 620). Procedeul recurs iv este ilustrat mai
jos:

nivelul 1 nivelul 2 nivelul 3
(am colorat diferit fractalii de pe nivelul
a n t e r i o r , p e n t r u a – i d i f e r e n ția)
Iată și o imagine a acestui fractal, pentru n = 6:

51) Se cite ște, prin intermediul unui câmp text al unui formular, un num ăr natural cuprins între 1 și
8. Să se deseneze, într-o imagine de dimensiuni 640×480, o variant ă a fractalului lui Koch ob ținut
după procedeul urm ător: fiecare segment se înlocuie ște cu 7 segmente, dint re care 6 au lungimea
egală cu 1/4 din lungimea celui ini țial, iar unul are lungimea egal ă cu 1/2 din cel ini țial. Între
segmente se formeaz ă unghiuri drepte, ca în schema de mai jos. Segmentul ini țial al fractalului se
află între coordonatele ( 10,240)-(630,240) (deci are lungimea de 620). Procedeul recursiv este
ilustrat mai jos:

nivelul 1 nivelul 2 nivelul 3
(am colorat diferit fractalii de pe nivelul
anterior, pentru a-i diferen ția)

148
Iată și o imagine a acestui fractal, pentru n = 7:

52) Se cite ște, prin intermediul unui câmp text al unui formular, un num ăr natural cuprins între 1 și
19. Să se deseneze, într-o imagine de dimens iuni 450×650, fractalul "C" al lui Levy, ob ținut după
procedeul urm ător: fiecare segment se înlocuie ște cu alte 2 segmente, care sunt catetele triunghiului
dreptunghic isoscel a c ărui ipotenuz ă ar fi fost segmentul eliminat, ca în schema de mai jos.
Segmentul ini țial al fractalului se afl ă între coordonatele (330,480)-( 330,180) (deci are lungimea de
300). Procedeul recursiv este ilustrat mai jos:

Nivelul 1 Nivelul 2 Nivelul 3 Ni velul 4
Iată și o imagine a acestui fractal, pentru n = 19:

149 53) Problemă rezolvat ă (apl120.html + apl121.php ): Se citește, prin intermediul unui câmp
text al unui formular, un num ăr natural cuprins între 1 și 19. Să se deseneze, într-o imagine de
dimensiuni 640×480, fractalul dragonului. Procedeul s ău de obținere este foarte similar cel al
fractalului precedent (curba "C" a lui Levy) doar c ă orientările vârfurilor triunghi urilor dreptunghice
alternează între segmentele al ăturate. Segmentul ini țial al fractalului se afl ă între coordonatele
(150,170)-(550,170) (deci are lungi mea de 400). Procedeul recursiv este ilustrat mai jos:

Nivelul 1 Nivelul 2 Nivelul 3 Nivelul 4 Nivelul 5
Pentru implementarea optim ă a rezolv ării am mai introdus la subprogr amul recursiv care face desenarea
fractalului, înc ă un parametru, "$sens", în func ție de care la nivelul urm ător fractalul care are ordinul cu 1 mai mic se va
desena "sub" respectiv "deasupra".
apl120.html
<html><body>
<form action="apl121.php" method="post">
<table border="1" cellspacing="0" cellpadding="10">
<tr> <td>Nivelul de ramificare:<br>(Intre 1 si 19) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza"> </table> </form> </body></html>

apl121.php
<?php
header("Content-type: image/png"); $im=imagecreatetruecolor(640,480); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,639,479,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255);
//spre deosebire de programele precedente, am mai introdus un parametru "sens".
//In functie de el desenam "deasupra" respectiv "dedesubtul" liniei curente function dragon($x0,$y0,$l,$u,$sens,$n) { global $im,$blue; if($n!=1) { $l1=$l/sqrt(2); $xa=$x0+$l1*cos($u-$sens*pi()/4); $ya=$y0-$l1*sin($u-$sens*pi()/4); //La apelurile recursive, primul apel va avea sensul identic cu cel al nivelului in care //suntem, in schimb al doilea apel va avea sens contrar: dragon($x0,$y0,$l1,$u-$sens*pi()/4,1,$n-1); dragon($xa,$ya,$l1,$u+$sens*pi()/4,-1,$n-1); }
else
{//iar daca suntem pe nivelul 1, desenam pur si simplu segmentul: $x1=$x0+$l*cos($u); $y1=$y0-$l*sin($u); imageline($im,$x0,$y0,$x1,$y1,$blue);} } dragon(150,170,400,0,1,$n); imagepng($im); imagedestroy($im); ?>

150
Iată și două imagini pentru acest fractal, cu n = 13, respectiv n = 19:

53) Problemă rezolvat ă (apl122.html + apl123.php ): Se citește, prin intermediul unui câmp
text al unui formular, un num ăr natural cuprins între 1 și 6. Să se deseneze, într-o imagine de
dimensiuni 700×700 fractalul covor al lu i Sierpinski. Acest fractal se ob ține plecând de la un p ătrat,
împărțindu-l în nou ă pătrate egale. Se traseaz ă doar conturul celui din mijloc, iar celorlalte 8 p ătrate
li se aplic ă în mod recursiv acela și procedeu. P ătratul inițial va avea dou ă dintre col țurile diagonal
opuse la coordonatele (10,10)-(690,690) (deci latura de 680). Procedeul recursiv este ilustrat mai jos
(segmentele punctate nu se vor desena):

Nivelul 1 Nivelul 2 Nivelul 3 Nivelul 4

apl122.html
<html><body>
<form action="apl123.php" method="post"> <table border="1" cellspacing="0" cellpadding="10"> <tr> <td>Nivelul de ramificare:<br>(Intre 1 si 6) <td><input type="text" name="n" size="4"> <tr> <td colspan="2" align="center"> <input type="submit" value="Deseneaza">
</table>
</form> </body></html>

apl123.php
<?php
header("Content-type: image/png");
$im=imagecreatetruecolor(700,700); $y=imagecolorallocate($im,255,255,110); imagefilledrectangle($im,0,0,699,699,$y); $n=$_POST['n']; $blue=imagecolorallocate($im,0,0,255);

151
//functia recursiva care realizeaza desenarea va primi ca parametri coordonatele coltului
//stinga sus al patratului, lungimea laturii sale precum si nivelul: function covor_sierpinski($x0,$y0,$l,$n) { global $im,$blue; if($n!=0) {
$l1=$l/3;
//desenam patratul din mijloc: imagerectangle($im,$x0+$l1,$y0+$l1,$x0+2*$l1,$y0+2*$l1,$blue); //si apelam recursiv procedeul pentru celelalte 8 patrate: covor_sierpinski($x0,$y0,$l1,$n-1); covor_sierpinski($x0+$l1,$y0,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0,$l1,$n-1); covor_sierpinski($x0,$y0+$l1,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0+$l1,$l1,$n-1); covor_sierpinski($x0,$y0+2*$l1,$l1,$n-1); covor_sierpinski($x0+$l1,$y0+2*$l1,$l1,$n-1); covor_sierpinski($x0+2*$l1,$y0+2*$l1,$l1,$n-1); }
}
imagerectangle($im,10,10,690,690,$blue); covor_sierpinski(10,10,680,$n); imagepng($im); imagedestroy($im); ?>

152 54) Se cite ște, prin intermediul unui câmp text al unui formular, un num ăr natural cuprins între 1 și
11. Să se deseneze, într-o imagine de dimensiuni 700×600 fractalul triunghi al lui Sierpinski. Acest
fractal se ob ține plecând de la un triunghi (de preferin ță echilateral, îns ă procedeul poate fi aplicat
oricărui fel de triunghi) în care tras ăm toate cele 3 linii mijlocii. Triunghiurilor care se formeaz ă, cu
excepția celui care are ca laturi toate cele 3 linii mijlocii, li se aplic ă în mod recursiv exact acela și
procedeu. Triunghiul ini țial va avea vârfurile la coordonatele: (350,10), (10,589), (690,589).
Procedeul recursiv este ilustrat mai jos:

Nivelul 1 Nivelul 2 Nivelul 3 Nivelul 4
Iată și o imagine a acestui fractal, pentru n = 7:

55) Problemă rezolvat ă (apl124.php ): Generarea fractalului de tip ferig ă, al lui Barnsley. De și
acest fractal se poate desena și printr-un procedeu de tipul cel or descrise anterior (prin tras ări de
segmente, conform unui procedeu recurent) vom aborda o alt ă modalitate de descriere a sa, și
anume IFS ( Iterated Function System).
Din punct de vedere matematic, un fractal IFS este definit de o mul țime de transform ări
geometrice elementare (care în matematic ă se mai numesc lineare sau afine) care în limbajul de zi
cu zi se traduc prin rota ții, aplatizări, deform ări (de tipul dreptunghi ⇒ paralelogram), scal ări. Ceea
ce este specific transform ărilor utilizate la un fractal IFS este faptul c ă acestea trebuie s ă fie de tip
contracție, adică distanța dintre dou ă puncte c ărora li se aplic ă transformarea s ă se diminueze (sau
cel puțin, să nu creasc ă).

153 O transformare de tipul celor de mai sus se transcrie prin:
()
()⎩⎨⎧
+⋅+⋅==+⋅+⋅==
fydxcyxfyyeybxayxfxx
, ', ' (*)
unde (x,y) reprezint ă coordonatele punctu lui anterior, iar (x',y') reprezint ă coordonatele punctului
curent. Procedeul fiind iterativ, coordona tele punctului curent vor deveni baz ă de plecare (deci
coordonate anterioare) pe ntru calculul noilor coordonate la pasul urm ător.
Fractalul ferig ă al lui Barnsley se bazeaz ă pe următoarele 4 transform ări (în dreptul fiec ăreia
vom scrie șirul coeficien ților (a,b,c,d,e,f) care o define ște (atenție la ordinea în care am scris
coeficienții, care este cea din ecua țiile (*) de mai sus):
0) ()
()() 0.00 0.00, 0.16, 0.00, 0.00, 0.00, ilor coeficienț șirul cu 16.0 , '0 , '
00
⎩⎨⎧
= == =
y yxfyyyxfxx
1) ()
()() 1.60 0.00, 0.22, 0.23, 0.26,- 0.20, ilor coeficienț șirul cu 60.1 22.0 23.0 , '26.0 20.0 , '
11
⎩⎨⎧
++= =−= =
y x yxfyyy x yxfxx
2) ()
()() 0.44 0.00, 0.24, 0.26, 0.28, 0.15,- ilor coeficienț șirul cu 44.0 24.0 26.0 , '28.0 15.0 , '
22
⎩⎨⎧
++= =+−= =
y x yxfyyy x yxfxx
3) ()
()() 1.60 0.00, 0.85, 0.04,- 0.04, 0.85, ilor coeficienț șirul cu 60.1 85.0 04.0 , '04.0 85.0 , '
33
⎩⎨⎧
++−= =+= =
y x yxfyyy x yxfxx
Procedeul de desenare pleac ă de la punctul de coordonate (0,0) pe care îl itereaz ă într-una
dintre cele 4 ecua ții de mai sus, aleas ă aleator, îns ă cu o anumit ă frecvență, și anume:
– prima dintre ecua ții se va folosi o dat ă din 100, deci probabi litatea sa va fi 0,01;
– a doua dintre ecua ții se va folosi de 7 ori din 100, deci cu probabilitatea de 0,07;
– a treia dintre ecua ții se va folosi tot de 7 ori din 100, deci tot cu probabilitatea de 0,07;
– în fine, ultima dintre ecua ții se folose ște în restul cazurilor, deci de 85 de ori din 100, cu
probabilitatea de 0,85. Punctele astfel ob ținute reprezint ă imaginea fractalului.
Prin urmare, datele necesare reprezent ării pot fi rezumate în urm ătorul tabel:

a = coeficientul
lui x din prima
ecuație a transf. b = coeficientul
lui y din prima
ecuație a transf. c = coeficientul
lui x din a doua
ecuație a transf. d = coeficientul
lui y din a doua
ecuație a transf. e = termenul
liber din prima
ecuație a transf. f = termenul libe r
din a doua
ecuație a transf. p = probabilitatea cu
care trebuie aleas ă
această transformare
transformarea 0 0.00 0.00 0.00 0.16 0.00 0.00 0.01
transformarea 1 0.20 -0.26 0.23 0.22 0.00 1.60 0.07
transformarea 2 -0.15 0.28 0.26 0.24 0.00 0.44 0.07
transformarea 3 0.85 0.04 -0.04 0.85 0.00 1.60 0.85

Pentru o reprezentare grafic ă sugestivă, e necesar s ă efectuăm cel puțin 300.000 de itera ții.

154
În urma calculelor, coordonatele punctelor ce se vor determin a vor fi delimitate de urm ătoarele
margini: x ∈ [-2.18, 2.66] și y ∈ [0.08, 10], deci punctele r ămân în interiorul unui dreptunghi cu
lățimea de 4.84 respectiv cu în ălțimea 9.92.
Pentru a le putea reprezenta pe ecran, vom alege un f actor de scalare egal cu 70, astfel, imaginea pe
care o gener ăm va avea dimensiunile de aproximativ 340 x 700.
Formulele de reprezentare la scar ă vor fi (fie xmin=-2.18, xmax=2.66, ymin=0.08, ymax=10,
scale=70): x
imagine = (x-xmin)*scale
yimagine = 700-(y-ymin)*scale (aceasta din urm ă se datoreaz ă orientării negative a axei OY).
Iată codul surs ă al programului:
apl124.php
<?php
header("Content-type: image/png"); $im=imagecreatetruecolor(340,700); $y=imagecolorallocate($im,255,255,210); imagefilledrectangle($im,0,0,339,699,$y); $gr=imagecolorallocate($im,0,128,0);
//prin variabila de mai jos ne fixam numarul de puncte pe care le vom reprezenta:
$npoints=300000; $f[0]=array( 0.00, 0.00, 0.00,0.16,0.00,0.00,0.01); $f[1]=array( 0.20,-0.26, 0.23,0.22,0.00,1.60,0.07); $f[2]=array(-0.15, 0.28, 0.26,0.24,0.00,0.44,0.07); $f[3]=array( 0.85, 0.04,-0.04,0.85,0.00,1.60,0.85); //calculam intr-un sir "prf" suma probabilitatilor, pentru a ne fi mai usor sa alegem in //mod aleator transformarea corespunzatoare: $s=0; for($i=0;$i<=3;$i++) { $s+=$f[$i][6]; $prf[$i]=$s;} //definim in $xold, $yold coordonatele punctului de plecare: $xold=$yold=0.0; $xmin=-2.18;$xmax=2.66;$ymin=0.08;$ymax=10;$scale=70;
//si ne apucam de iterat:
for($i=1;$i<=$npoints;$i++) {//nu vom folosi functia clasica rand(), deoarece algoritmul implementat de aceasta
//genereaza numere pseudo-aleatoare ce devin periodice foarte repede, fata de nevoile //reprezentarii fractalului de fata. Vom folosi // functia mt_rand() – proprie limbajului //PHP, ce contine o reimplementare imbunatatita a // lui rand(). Folosirea sa este identica //cu a functiei rand(). //Asadar, mai jos calculam un numar aleator //cuprins intre 0 si 99, pe care-l impartim apoi //la 100, ca sa obtinem un numar cuprins intre //0.00 si 0.99, pe baza caruia alegem
//transformarea curenta
$aleat=mt_rand(0,99)/100; //determinam $k = indicele transformarii curente: $k=0; while($prf[$k]<$aleat) $k++; //calculam noile coordonate: $x=$f[$k][0]*$xold+$f[$k][1]*$yold+$f[$k][4]; $y=$f[$k][2]*$xold+$f[$k][3]*$yold+$f[$k][5]; $xold=$x;$yold=$y; //si le reprezentam, dupa ce le aducem la scara //imaginii noastre: $xim=(double)($x-$xmin)*$scale; $yim=700.0-(double)($y-$ymin)*$scale; imagesetpixel($im,$xim,$yim,$gr);
}
imagepng($im); imagedestroy($im); ?>

155 56) În cadrul aplica ției anterioare am v ăzut faptul c ă fractalul ferig ă este perfect definit de tabelul în
care am notat coeficien ții celor 4 transform ări afine precum și probabilitatea cu care trebuie aleas ă
fiecare transformare. Totodat ă pentru fiecare reprezentare mai trebuie s ă precizăm care sunt limitele
coordonatelor care m ărginesc fractalul (xmin, xmax, ymin, ymax) precum și scara la care facem
reprezentarea. Genera ți ferigile și pentru urm ătoarele dou ă seturi de date, într-o imagine de
dimensiuni 340×700: a) setul I:

a = coeficientul
lui x din prima
ecuație a transf. b = coeficientul
lui y din prima
ecuație a transf. c = coeficientul
lui x din a doua
ecuație a transf. d = coeficientul
lui y din a doua
ecuație a transf. e = termenul
liber din prima
ecuație a transf. f = termenul libe r
din a doua
ecuație a transf. p = probabilitatea cu
care trebuie aleas ă
această transformare
transformarea 0 0.00 0.00 0.00 0.25 0.00 -0.14 0.02
transformarea 1 0.09 -0.28 0.30 0.11 0.00 0.60 0.07
transformarea 2 -0.09 0.28 0.30 0.09 0.00 0.70 0.07
transformarea 3 0.85 0.02 -0.02 0.83 0.00 1.00 0.84
cu limitele care îl m ărginesc: xmin = -1.56, xmax = 1.56, ymin = -0.18, ymax = 5.80 și scara = 109
b) setul al II-lea:
a = coeficientul
lui x din prima
ecuație a transf. b = coeficientul
lui y din prima
ecuație a transf. c = coeficientul
lui x din a doua
ecuație a transf. d = coeficientul
lui y din a doua
ecuație a transf. e = termenul
liber din prima
ecuație a transf. f = termenul libe r
din a doua
ecuație a transf. p = probabilitatea cu
care trebuie aleas ă
această transformare
transformarea 0 0.00 0.00 0.00 0.16 0.00 0.00 0.10
transformarea 1 0.20 -0.26 0.23 0.22 0.00 1.60 0.08
transformarea 2 -0.15 0.28 0.26 0.24 0.00 0.44 0.08
transformarea 3 0.75 0.04 -0.04 0.85 0.00 1.60 0.74
cu limitele care îl m ărginesc: xmin = -2.34, xmax = 2.62, ymin = 0, ymax = 10.22 și scara = 68.
Iată și imaginile lor:
a) Setul I: b) Setul II:

156 5. CONSIDERA ȚII METODOLOGICE

5.1. Posibilitatea pred ării limbajului PHP la clasa a XI I-a; premise care faciliteaz ă
introducerea sa în ca drul noilor programe școlare. Analiza însu șirii sale de c ătre elevi.
Concluzii stabilite.

În zilele noastre, prin cuvântul "informatic ă" (termen care în Fran ța a fost consacrat oficial
abia în 1967, reprezentând din punc t de vedere etimologic o contrac ție între "informa ție" și
"automatic ă") desemn ăm una dintre cele mai recent ap ărute științe. Este vorba, mai precis, de
domeniile științific, tehnologic și industrial, raportate la tratarea automat ă a informa ției de către
mașini precum calculatoare, console, terminale, robo ți.
Paradoxal, dac ă stăm să ne gândim la toate îngr ădirile epocii comuniste, în 1971, deci la
doar 5 ani de la intrarea oficial ă a cuvântului "informatic ă" în vocabularul europe nilor, Consiliul de
Miniștri al României de la acea vreme decide înfiin țarea liceelor cu profil informatic. Tot atunci
sunt puse, deci, și bazele studiului informaticii în cadrul înv ățământului preuniversitar românesc.
Dac ă la început informatica a fost considerat ă ca fiind n ăscută din matematic ă, de la apari ția
sa și până în prezent lucrurile au evoluat într-un ritm in imaginabil de alert, în zilele noastre sunt
cunoscute mai multe sub-ramuri ale sale. Ceea ce ne intereseaz ă în mod special, din punct de vedere al analizei de fa ță, este
informatica sub aspectul studiului algoritmilor, a implement ărilor acestora în limbaje de programare
și a transpunerii în practic ă, prin programarea lor pe un calculator.
Din acest punct de vedere, studiul in formaticii în liceu are în prezent urm ătoarea structur ă:
– în clasa a IX-a se studiaz ă algoritmii elementari și implementarea lor într-un limbaj de
programare; – în clasa a X-a se insist ă în special pe chestiuni mai strâns legate de limbajul de programare ( șiruri
de caractere, structuri ce pot îngloba mai multe date (de tip înregistrare), subprograme);
– în clasa a XI-a se introduc câteva dintre metode le principale de program are (Backtracking, Divide
et Impera, Alocare Dinamic ă și Structuri de Date, Teoria Grafurilor)
Pân ă în anul școlar 2006-2007 (inclusiv), în programa școlară a clasei a XII-a era prev ăzut
studiul bazelor de date, limbajul folosit fiind în special FoxPro. Acest limbaj a cunoscut o
popularitate larg ă între anii 1990-2000, îns ă, o dată cu evolu ția tehnicii de calcul și apariția altor
instrumente, a început s ă se deprecieze. De și Microsoft a continuat ( și continuă) să îl mențină,
elaborând și versiuni Visual ale sale, în prezent nu mai este a șa de folosit. Un alt inconvenient al s ău

157 este acela c ă permite manipularea bazelor de date și într-un mod mai pu țin conven țional, folosind
propriul limbaj, deci f ără respectarea standardelor SQL.
Pe de alt ă parte, așa cum am ar ătat în introducerea capitolelor al II-lea și al III-lea, începând
cu 1995, re țeaua Internet a cunoscut o dezvoltare exploziv ă, de unde a ap ărut și necesitatea
dezvoltării unor unelte de programare corespuz ătoare.
Toate acestea au condus la impunerea unei schimb ări, devenit ă efectivă din anul școlar
2007-2008, când structura programei școlare destinat ă claselor a XII-a a fost modificat ă, îngăduind,
din punctul de vedere al profesor ului, o abordare mult mai permisiv ă, deoarece poate alege dintre
modulele pe care le va preda. Unul dintre modulele ce pot fi alese și în sprijinul c ăruia vine lucrarea de fa ță, este cel
denumit "Programare WEB". Dup ă experien ța anului școlar 2007-2008 de predare a acestui limbaj conform noilor
programe și după experiența anului școlar 2006-2007, când am propus studiul unui curs op țional de
PHP, pe care elevii și l-au ales, voi face câteva observa ții și voi încerca s ă trag câteva concluzii.
În primul rând, studiul limbajul ui HTML în vreunul dintre anii școlari preceden ți poate fi de
mare ajutor. În acest caz, în cadrul materiei cap itolului al II-lea profesorul se poate ocupa mai
amănunțit de automatizarea paginilor web cu ajutorul script-urilor Java.
De asemenea, datorit ă similitudinii foarte mari dintre C++ și PHP (și de asemenea și
JavaScript), elevii care au studiat limbajul C++ au un avantaj foarte mare fa ță de cei care au studiat
Pascal. Deoarece elevii mei au studiat în pr ealabil C++, nu m-am confruntat cu aceast ă din urmă
situație.
Un atu extraordinar al limbajului PHP const ă în acela c ă interfața (atât cea de intrare cât și
cea de ieșire) poate fi foarte mult îmbun ătățită față de cea a limbajului studi at în clasele IX-XI prin
introducerea de elemente grafice și de culoare.
Un alt element foarte atractiv al s ău constă în funcțiile de programare grafic ă. Din păcate,
acest capitol foarte spectaculos al informaticii nu este inclus nic ăieri în mod explicit, în nici una
dintre programele școlare, ci este trecut sub t ăcere. Personal, consider c ă includerea sa în cadrul
programei obligatorie ar fi binevenit ă, încă din primul an de liceu, deoarece ar reprezenta în primul
rând un factor de atractivitate, iar în al doilea rând ar familiariza elevii cu lucrul efectiv în coordonate carteziene, cu reprezent ări grafice și cu propriet ăți ale acestora.
Așadar, PHP are toate șansele de a fi un limbaj u șor de învățat de către elevi. În mare parte,
însușirea sa se petrece într-o mare m ă
sură.

158 E necesar ca elevii s ă lucreze cât mai mult din punct de vedere pr actic, deci s ă implementeze
pe calculator cât mai multe exemple, s ă testeze cât mai multe func ții și situații.
De asemenea, este foarte indicat ă reluarea problemelor clasice școlărești (de clasa a IX-a, a
X-a și a XI-a) cu mici preciz ări (acolo unde se poate, evident) care s ă ajute la înfrumuse țarea datelor
de ieșire (gen: numerele s ă fie afișate în tabele, anumite elemente s ă fie colorate, etc.). O serie de
probleme special concepute în acest sens se g ăsesc în capitolul precedent (4).
Avantajul cunoa șterii limbajului PHP la terminarea liceului nu poate fi decât benefic ă,
mergând pân ă într-acolo încât poate chiar s ă constituie o meserie.

5.2. Posibilit ăți de predare cât mai atra ctive ale informaticii, f ără a se ajunge la
banalizare: propunere de curs op țional „Programare grafic ă într-un limbaj vizual”

Unul dintre cel elalte module prev ăzute de programa școlară a clasei a XII-a const ă în
"Programare Vizual ă". Din nou avem de-a face un subiect de actualitate, cu un grad de interes mare
din partea elevilor, datorat ă elementelor vizuale ale interfe ței și modului relativ simplu prin care
acestea se pot programa respectiv corela. Dup ă cum am eviden țiat în paragraful precedent, programarea grafic ă este un capitol trecut
sub tăcere în cadrul programelor școlare actuale. De și în cadrul disciplinei "informatic ă" din clasa a
XII-a este posibil ca acest capitol s ă poată fi atins, profesorul nu dispune, totu și, de prea multe ore
pentru a face acest lucru. Din acest motiv, propunerea cursului op țional de fa ță își propune tratarea
pe larg a acestei problematici. Adesea se face confuzie între "grafica pe calculator" și "programarea grafic ă".
Pentru a realiza "grafic ă pe calculator" este nevoie, în general, de un pachet software
specializat trat ării imaginilor (de exemplu Phtoshop) utilizatorul neavând nevoie câtu și de puțin să
cunoască și să stăpânească vreun limbaj de programare. Un curs op țional care s ă familiarizeze elevii
cu un astfel de produs s-ar preta, poate , claselor care nu sunt de profil matematic ă-informatic ă. Un
astfel de curs ar avea totu și un anumit grad de banalitate, deoarece competen țele pe care elevii le-ar
putea dobândi în urma sa s-ar limita la simpla dobâ ndire de deprinderi de utilizare a unui produs
software.

159 Conceptul de "programare grafic ă", în schimb, se refer ă la manipularea și crearea imaginilor
din cadrul unui limbaj de programar e, utilizând structuri algoritmice și tehnici de programare. Prin
urmare, un curs care s ă abordeze problematica program ării grafice se adreseaz ă exclusiv unui
programator. Cursul op țional pe care l-am propus elevilor clasel or a XII-a cu specializarea
matematic ă-informatic ă va avea ca și suport de programare limbajul Microsoft Visual C++ 2008
Express Eddition (deci o platform ă foarte proasp ăt apărută!) versiune pe care Microsoft o pune în
mod gratuit la dispozi ția celor care doresc s ă o utilizeze în scopuri pur didactice.
Cursul î și propune tratarea program ării grafice în dou ă etape: într-o prim ă parte, cursul este
axat pe familiarizarea elevilor cu obiectele grafice și cu opera țiile de baz ă ce se pot efectua în cadrul
unei imagini: accesarea la nivel de pixeli, atribut e de culoare, coordonate carteziene, trasarea
formelor geometrice de baz ă: segmente, cercuri, dreptunghiuri, elipse, afi șarea unui text în cadrul
unei imagini, afi șarea unei imagini sau a unei por țiuni din aceasta în cadrul altei imagini, opera ții de
decupare / redimensionare. În cea de-a doua parte a sa, cursul este centrat pe conexiunea interdisciplinar ă dintre
informatic ă și matematic ă (mai precis geometrie analitic ă sau computa țională). În aceast ă parte a
cursului se urm ărește exploatarea principale lor resurse matematice care pot conduce la reprezent ări
grafice. Astfel, o serie de formule și rezultate teoretice pot fi verificate vi zual, ajutând elevii s ă
înțeleagă esența fenomenelor și nu doar s ă se limiteze în a opera cu forme f ără fundament.
În aceast ă parte se va urm ări atingerea unor obiective precum ar fi:
• reprezentarea grafic ă a unei figuri geometrice (triunghi, dreptunghi, patrulater, poligon,
regulat) și a principalelor linii din aceasta (în ălțimi, bisectoare, mediane, mediatoare), a cercurilor
înscrise, circumscrise, folo sirea coordonate lor polare;
• reprezentarea grafic ă a unei func ții la o anumit ă scară (cu factori de scalare egali sau
diferiți pe OX respectiv pe OY);
• realizarea unor mici anima ții care să ilustreze locuri geometrice;
• reprezent ări grafice de fractali.

În continuare voi prezenta o posibil ă planificare a materiei pentru acest curs op țional:

160 Semestrul I: 18 s ăptăm â n i
Nr.
crt. Unitatea de înv ățare Competen țe specifice Con ținuturi Nr.
ore Săpt.
1 Mediul de programare
Visual C++ 2008 –
Express Edition – operarea sub mediul de
programare Visual C++
– identificarea
componentelor unei aplica ții
– stabilirea propriet ăților
resurselor, modificarea
aspectului acestora
– asocierea de cod
evenimentelor • Crearea, salvarea și modificarea
unui proiect
• Uneltele și ferestrele de baz ă ale
mediului de programare
• Fereastra de design a unui form,
ferestrele de propriet ăți,
evenimente, cod surs ă 3 1,2,3
2 Structuri avansate de
programare – obiecte și
clase – identificarea elementelor
unui obiect
– adresarea datelor respectiv
funcțiilor membru ale unui
obiect și ale unei clase • Obiectele și clasele predefinite ale
limbajului
• Vizualizarea unui obiect în cadrul
ferestrei "Class Explorer"
• Modificarea membrilor unei clase
• Obiecte statice și obiecte de tip
pointer – adresarea membrilor 3 4,5,6
3 Principalele tipuri de
controale ale limbajului
Visual C++ – identificarea principalelor
tipuri de controale
– modificarea aspectului
unui control (propriet ăți)
– modificarea
comportamentului unui
control (evenimente) • Controale de tip form, label,
textbox, button, textarea,
combobox, listbox, picturebox, progressbar 3 7,8,9
4 Casete de dialog
standard ale limbajului
Visual C++ – identificarea principalelor
tipuri de casete de dialog
– utilizarea casetelor de
dialog în cadru unui program • Casete de dialog de tipul
MessageBox, Open, Save,
FontSelection, ColorBox 3 10,11,
12
5 Obiecte de tip bitmap – familiarizarea cu obiectele
grafice de tip bitmap
– principalele func ții de
manipulare ale unui bitmap • Declararea și inițializarea unui
obiect de tip bitmap
• Încărcarea și salvarea unei
imagini dintr-un fi șier în bitmap
respectiv din bitmap într-un fi șier
• Redimensionarea, t ăierea, rotirea
unei imagini sau a unei por țiuni
rectangulare din aceasta
• Accesarea unui bitmap la nivel de
pixel
• Tratarea evenimentelor generate
de acțiunea mouse-ului 3 13,14,
15
6 Obiecte de tip graphics – familiarizarea cu obiectele
de tip graphics
– familiarizarea cu principalele func ții de
manipulare ale unui obiect
de tip graphics • Inițializarea și declararea unui
obiect de tip graphics pornind de la
un obiect deja existent
• Desenarea principalelor forme:
linii, dreptunghiuri, cercuri, elipse,
puncte
• Afișarea de text 3 16,17,
18

161 Semestrul al II-lea: 17 s ăptăm â n i

Nr.
crt. Unitatea de înv ățare Competen țe specifice Con ținuturi Nr.
ore Săpt.
1 Trecerea de la reperul
cartezian la reprezentarea
grafică într-un bitmap – familiarizarea cu
particularit ățile reprezent ării
grafice pe calculator
– reprezentarea unui interval cartezian – alegerea centrului
reperului
– reprezentarea la scar ă • Formule de trecere de la reperul
cartezian la reprezentarea pe
calculator:
– alegerea centrului reperului
– reprezentarea la scar ă 1 1
2 Reprezentarea grafic ă
folosind coordonate
polare – familiarizarea cu
reprezentarea în
coordonatele polare • Formule de reprezentare în
coordonate polare
• Reprezentarea poligoanelor
regulate 2 2,3
3 Reprezentarea grafic ă a
dreptelor și a
segmentelor – familiarizarea cu tehnicile
de reprezentare ale unei
drepte și ale unui segment
– utilizarea formulelor
matematice adecvate • Reprezentarea acelei por țiuni de
drepte vizibile în intervalul
cartezian fixat
• Intersecția dintre dou ă drepte
• Intersecția dintre dou ă segmente
• Împărțirea unui segment în mai
multe părți egale 2 4,5
4 Reprezentarea grafic ă a
principalilor fractali
recursivi – familiarizarea cu modul de
construcție a principalilor
fractali recursivi • Reprezentarea fractalilor de tip
linie Koch (stea, spirala), de tip
Covor Sierpinski (triunghi, p ătrat),
de tip arbore 3 6,7,8
5 Reprezentarea grafic ă a
unei funcții matematice – familiarizarea cu tehnicile
de reprezentare a unei func ții
matematice • Reprezentarea curbelor din puncte
foarte apropiate sau din segmente
foarte mici interconectate 2 9,10
6 Rezolv ări de triunghiuri
cu reprezentare grafic ă – familiarizarea cu tehnicile
de reprezentare ale unui
triunghi
– utilizarea formulelor matematice adecvate • Linii importante în triunghi
• Cercul înscris într-un triunghi
• Cercul circumscris unui triunghi 2 11,12
7 Realizarea unei anima ții
folosind cadre multiple – utilizarea cadrelor multiple
– proiectarea pa șilor
animației • Crearea cadrelor din care este
compusă animația
• Folosirea obiectului de tip Timer
pentru controlul schimb ării cadrelor
în vederea realiz ării animației 1 13
8 Reprezent ări animate ale
unor locuri geometrice – identificarea pa șilor
reprezentării
– utilizarea formulelor
matematice adecvate • Reprezent ări de locuri geometrice
care implic ă un punct mobil pe o
dreaptă
• Reprezent ări de locuri geometrice
care implic ă un punct mobil pe un
cerc 2 14,15
9 Reprezentarea unui
fractal complex: fractalul
lui Mandelbrot – familiarizarea cu modul de
construcție a fractalului
Mandelbrot – utilizarea formulelor
matematice adecvate • Reprezentarea grafic ă a fractalului
lui Mandelbrot
• Utilizarea unor palete de culori
diverse în reprezentarea fractalului
Mandelbrot
• Realizarea unui "Zoom"
matematic într-o zon ă a fractalului 2 16,17

Similar Posts