Sunteți pe pagina 1din 360

Tehnologii WEB

Cursul 1
Informatii:
Structura cursului:
2 ore curs titular curs: Giorgian Neculoiu
2 ore laborator titulari aplicaii practice: Oana-Ramona Flangea si
Mihaela Puianu

Forme de examinare:
Examen final 60%
Evaluare pe parcursul semestrului a activitii de laborator 40%
Proiect final 30%
Punctaj teste practice 10%
Informatii:
Bibliografia necesara cursului:
Mihaela Brut, Sabin Buraga, Prezentri multimedia pe Web, Polirom,
Iasi, 2003;
Sabin Buraga, Aplicaii Web la cheie. Studii de caz
implementate n PHP, Polirom, 2003;
Sabin Buraga, Proiectarea siturilor Web ediia a doua,
Polirom, Iasi, 2005;
Traian Anghel, Programare Web, Editura Polirom, Iasi, 2007;
Luke Welling, Laura Thomson, Dezvoltarea aplicatiilor Web cu
PHP si MySQL, Editura Teora, Bucuresti, 2005;
Larry Ullman, PHP si MySQL pentru site-uri dinamice, Editura
Teora, Bucuresti, 2006.
Informatii:
Referinte electronice:

***, http://www.bayes.co.uk/xml/index.xml?/xml/main.xml
***, http://www.rophp.net/
***, http://www.microsoft.com
***, http://www.sun.com
***, http://www.w3schools.com
***, http://www.w3.org
Planul lectiei:
Introducere in WEB (internet, www, uri, url, urn, )
Siteuri si aplicatii WEB (siteuri, aplicatii, browser, server, )
Generarea dinamica a continutului Web
Limbaje si platforme de programare pentru server
Serverul de baze de date
Sistemul de gestiune a bazelor de date relationale MySQL
Instrumente pentru dezvoltarea aplicatiilor
editoare de text
sisteme de management al continutului
cadre de lucru
medii de dezvoltare integrate
Introducere in Web
Termenul Internet provine din impreunarea artificiala si partiala a doua cuvinte englezesti:
interconnected = interconectat si network = retea.

Internet - desemneaza o retea mondiala unitara de calculatoare si alte aparate cu adrese


computerizate, interconectate conform protocoalelor (regulilor) de comunicare Transmission Control
Protocol si Internet Protocol, numite impreuna stiva TCP/IP.

Termenul Internet nu trebuie confundat cu serviciul internetic World Wide Web (www).
Acesta este doar unul din multele servicii oferite pe Internet.

Internet-ul ofera utilizatorilor o serie de servicii, dintre care amintim:


posta electronica (e-mail)
transferul de fisiere (FTP File Transfer Protocol)
conectarea la distanta (telnet)
World Wide Web-ul (cunoscut si sub numele de WWW sau WEB)

Serviciul World Wide Web - sistem de distributie locala sau globala a informatiilor
hypermedia.
Introducere in Web

World Wide Web, prescurtat WWW, deseori numit numai "web", este la loc
de varf, deoarece este o aplicatie multimedia integrativa, cu o interfata de utilizator
(Graphic User Interface, GUI) foarte atragatoare din punct de vedere grafic, practica si
simplu de folosit. WWW a fost inventat de ctre Tim Berners-Lee n anul 1993.

Web-ul reprezinta un spatiu informational alcatuit din resurse situate in locatii


cunoscute sub numele de noduri, utilizate prin intermediul unui sistem hypertext,
folosind modul de identificare denumit URI (Uniform Resource Identifier). Este
bazat pe modelul client/server si pe hipertext. Resursele sunt identificate prin adresa
lor identificator uniform de resurse (URI). URI = URL + URN
Introducere in Web
URL (Uniform Resource Locator) - identifica resursele prin reprezentarea
mecanismului de accesare (adresa de retea, domeniu simbolic).
http://www.infoiasi.ro/~busaco/teach/
mailto:tux@pinguin.info
ftp://ftp.funet.fi/pub/README.txt
tel:+40232201090
URN (Uniform Resource Name) - identifica resursele prin nume, intr-o forma
persistenta, chiar daca resursa este inaccesibila sau a disparut.
urn:infoiasi.ro:BookInfo
urn:mozilla:package:communicator
urn:schemas-microsoft-com:datatypes

Pentru accesul la continutul resurselor exista un protocol (HTTP).


Resursele Web-ului sunt organizate in pagini Web si livrate utilizatorilor de
catre un program denumit server Web.

Hipertext - material scris sau grafic interconectat intr-o maniera complexa


care in mod conventional nu poate fi reprezentat pe hartie.
Situri si aplicatii Web
Sit Web = sistem pe care ruleaza un server Web gazduind o serie de pagini
(documente) WWW inrudite ale unei organizatii, companii sau persoane.
Ofera informatii unitare (scopuri comune);
Are asociata o adresa publica (vizibila), bazata pe un domeniu Internet;
Serverul Web poate gestiona simultan mai multe situri gazduire virtuala;
Poate fi disponibil in intranet sau extranet.

O colectie de pagini Web inrudite si interconectate aflate in proprietatea


unui institutii, organizatii, companii sau persoane gazduite pe unul sau mai multe
calculatoare pe care ruleaza un server web, avand asociata o adresa vizibila
utilizatorilor din Internet, se numeste sit (site sau website, n limba engleza).

Un site web poate fi disponibil si in cadrul unui intranet, adica intr-o retea
privata a unei organizatii, care utilizeaza tehnologiile Internet.
De asemenea, un site Web poate fi disponibil si intr-un extranet, acesta
reprezentand o retea privat folosita in scopul partajarii informatiilor sau operatiunilor
unei organizatii cu parteneri de afaceri.
Situri si aplicatii Web
Aplicaie Web = o colectie interconectata de pagini Web avand un continut
generat dinamic (determinat partial de optiunile utilizatorului), creat cu scopul de a
oferi o functionalitate specifica:
magazin virtual;
motor de cautare;
client de e-mail;
client pentru accesarea bazelor de date;

Utilizatorii folosesc pentru vizualizarea paginilor Web un program-client


cunoscut sub numele de browser sau navigator Web.

Tim Bernes-Lee a scris primul browser (cunoscut sub numele de


WorldWideWeb) si primul server Web (denumit httpd, fiind acronimul pentru Hyper
Text Transfer Protocol Daemon), elaborand totodata si specificatiile initiale pentru
URL-uri, HTTP si HTML.

Primul sit Web a fost realizat la CERN si plasat online in data de 6 august
1991.
Situri si aplicatii Web
O aplicatie Web rezidenta pe un server, fiind accesata prin intermediul unei
retele (Internet sau intranet) de catre utilizatori, care folosesc un client Web
(browser), functioneaza in mod obisnuit pe trei niveluri:
1. Nivelul I - browserul Web;
2. Nivelul II (sau nivelul intermediar) tehnologia utilizata pentru generarea dinamica a
continutului (server de aplicatii);
3. Nivelul III surse de date, reprezentate de baze de date (BD) si/sau fisiere XML.

Pentru a implementa, depana si extinde aplicatiile Web este necesar un


ansamblu de instrumente software, cunoscut sub numele de mediu de lucru.
Excluzand software-ul de sistem (sistemul de operare), mediul de lucru utilizat pentru
crearea si utilizarea aplicatiilor Web are urmatoarele componente:
1. un browser Web folosit pentru afisarea interfetei cu utilizatorul a aplicatiei
2. un server Web livreaza continutul (static sau dinamic) browserului
3. un server de aplicatii utilizat (printre altele) pentru generarea dinamica a continutului
si pentru interactiunea cu sursele de date
4. un server de baze de date folosit pentru stocarea si gestionarea unor date folosite de
aplicatie
5. un instrument software utilizat pentru facilitarea dezvoltarii aplicatiei
Situri si aplicatii Web
Browser-ul Web (sau navigator-ul) Web este un program care ruleaza pe
calculatorul clientului, fiind utilizat in principal pentru afisarea interfetei cu utilizatorul a
aplicatiei Web.
Exista un numar mare de navigatoare, ruland pe diverse platforme (Windows,
UNIX/Linux, Mac OS). Alaturi de Internet Explorer, Firefox, Safari, Netscape
Communicator, Opera Mozilla si Google Chrome mai sunt utilizate si alte navigatoare
dintre care enumeram Maxthon, Konqueror, Amaya, SeaMonkey si Lynx (ruleaza in mod
text).

Caracteristici ale navigatoarelor Web actuale:


asigura suport:
pentru limbajele de marcare (HTML, XHTML)
pentru unele limbaje de programare utilizate in paginile Web (JavaScript, VBScript)
si pentru foi de stiluri folosite in scopul obtinerii, unor modalitati de afisare a continutului
unitare (CSS, XSLT)
ofera posibilitatea realizarii listelor de adrese ale siturilor favorite (numite in functie de browser,
Bookmarks sau Favorites), precum si accesul la istoricul navigarii (History)
asigura suport pentru aplicatii care extind functionalitatile principale. O astfel de aplicatie este
cunoscuta sub numele de plugin, fiind utilizata in scopul accesarii unor
tipuri speciale de date (continut grafic vectorial in cunoscutele formate Flash si SVG)
asigura securitatea transmiterii datelor confidentiale
ofera utilizatorului posibilitatea de a configura si controla unele caracteristici ale modului de
afisare si navigare
Situri si aplicatii Web
Serverul Web - In Web sunt utilizate un numar mai mare de servere pentru
servirea continutului. Cele mai cunoscute sunt (in ordinea descrescatoare a
popularitatii), conform statisticilor oferite de Netcraft Inc. (http://www.netcraft.com/):
Apache
Microsoft IIS (Internet Information Server)
nginx
Google
Zeus
Sun ONE Web Server
Conform acelorasi date, in februarie 2011, Apache era utilizat de circa 60.10% din
totalul siturilor, urmat, la distanta, de Microsoft IIS (20,04%).

Continutul servit browserului de catre serverul Web poate fi:


1. static - stocat in fisiere de pe calculatorul -server
2. dinamic - generat de programe/scripturi sau API-uri apelate de serverul Web

Este de remarcat ca livrarea continutului static este mai rapida decat cea a
continutului dinamic, mai ales in situatia in care in cazul ultimului tip datele sunt
extrase din baze de date.
Situri si aplicatii Web
Principalele caracteristici ale server-elor Web:

1. utilizarea modulelor (legate sau ncrcate dinamic) care ofera posibilitatea


extinderii capabilitatilor de baza oferite
2. asigurarea suportului pentru conexiuni securizate prin criptarea fluxului de date
3.gestionarea simultana a mai multor site-uri Web, asigurand asa-numita gazduire
virtuala (virtual hosting), folosind aceeasi adresa IP (modalitate utilizata de toti furnizorii de
servicii Internet Internet Service Provider)
4. asigurarea compresiei continutului (folosind codificarea gzip), pentru reducerea
marimii raspunsului
5. posibilitatea de a fi codificate prin intermediul unui fisier text sau al unei
interfete grafice (serverul Web Apache poate fi configurat prin intermediul fisierului text
denumit httpd.conf)
Situri si aplicatii Web
Serverul de aplicatii - Exista tehnologii care permit serverului Web sa
realizeze mult mai mult decat trimiterea fisierelor (X)HTML cerute de client. Acestea
(numite tehnologii Web pentru server server-side Web tehnologies) ofera
posibilitatea generarii dinamice a continutului Web oferit utilizatorului folosind
diverse surse de date (baze de date, fisiere text, documente XML, stream-uri
multimedia) - dar si efectuarea unor calcule si procesari complexe.

Unul dintre motivele succesului inregistrat astazi de serviciul World Wide


Web, consta in posibilitatea personalizarii interactiunii utilizatorului cu aplicatiile
Web, care inseamna generarea unui anumit continut, in functie de datele de
intrare/optiunile furnizate de acesta. Tipul de interactiune amintit nu ar fi putut fi
implementat fara folosirea tehnologiilor Web pentru server.
Generarea dinamica a continutului Web
Din punct de vedere istoric, prima metoda de generare dinamica pe server a
continutului Web este reprezentata de standardul de facto CGI(Common Gateway Interface).
Metoda permite serverului Web sa transfere unei aplicatii externe (numit script CGI) o cerere
venita de la un client Web (browser) si sa ii trimita acestuia continutul generat in urma executiei
aplicatiei. Aplicatiile externe utilizate prin intermediul interfetei CGI sunt numite si programe
gateway, deoarece se comporta ca o poarta intre serverul Web si sursele de date existente pe
server.

Din punct de vedere cronologic, etapa urmatoare in evolutia metodelor de generare


dinamica a continutului Web a fost utilizarea interfetelor de programare NSAPI(Netscape Server
API) si ISAPI (Microsoft Internet Services API), acestea functionand conform modelului CGI.

Astazi, cel mai des utilizate sunt limbajele/platformele de programare pentru server
denumite servere de aplicatii, functionand de obicei ca extensii ale serverului Web. In raport cu
CGI, serverele de aplicatii prezinta o serie de dezavantaje dintre care le mentionam pe
urmatoarele:
suportul pentru sesiuni
utilizarea unor conexiuni persistente cu bazele de date
asigurarea load-balancing-ului
cresterea securitatii aplicatiilor create
Limbaje si platforme de programare pentru server
Cele mai utilizate limbaje/platforme de programare pentru server sunt:
1. PHP (initial, acronimul pentru Personal Home Page, ulterior pentru PHP:
Hypertext Preprocessor) este un limbaj (combinatie de C, Perl si Java) ale carui baze au fost
puse de Rasmus Lerdorf in 1994. PHP este utilizat de cele mai multe ori impreuna cu
serverul Web Apache;
2. Perl (Practical Extraction and Report Language) este un limbaj de programare
creat de Larry Wall, care se bazeaza pe C, precum si pe cateva utilitare UNIX. Perl este cea mai
populara alternativa la PHP. Are avantajul de a fi foarte flexibil, in plus existand numeroase
module/scripturi (biblioteci) scrise pentru/in Perl (e.g., CPAN Comprehensive Perl Archive
Nertwork, http://www.cpan.org/);
3. JSP (Java Script Pages) este o platforma de programare Web creata la inceputul
anului 1998 de Sun Microsystems, Inc., care face parte din specificatia J2EE (Java 2 Enterprise
Edition). Platforma JSP utilizeaza sintaxa XML si o serie de clase si functii Java;
4. ASP (Active Server Pages) este o platforma de programare Web creata de
Microsoft, permitrand utilizarea unor scripturi scrise in limbajele VBScript (Microsoft Visual
Basic Script), JScript si PerlScript, fiind utilizata curent cu serverul Web Microsoft IIS;
5. ColdFusion este un cadru de lucru utilizat pentru dezvoltarea software-ului, in
general, si a site-urilor dinamice, in particular. Cea mai importanta caracteristica a ColdFusion
consta in utilizarea limbajului de scripting: CFML (ColdFusion Markup Language).

In urma interpretarii script-urilor, serverul de aplicatii genereaza date la iesirea


standard. Serverul Web intercepteaza aceasta iesire si trimite datele browserului.
Serverul de baze de date
Baza de date reprezinta una sau mai multe colectii de date aflate in interdependenta,
impreuna cu descrierea datelor si a relatiilor dintre ele. Colectia de date reprezinta un ansamblu
de date organizat dupa anumite criterii.
Descrierea datelor se intalneste sub denumirile de catalog de sistem, dictionar de date
sau metadata (adica date despre date).
Sistemul de programare care permite construirea bazelor de date, introducerea
informatiilor in bazele de date si dezvoltarea unor aplicatii care le exploateaza se numeste sistem
de gestiune a bazelor de date (SGBD).
Un SGBD ofera posibilitatea utilizatorului de a avea acces la date folosind un limbaj de nivel inalt,
apropiat de cel natural, pentru a obtine informatii, utilizatorul facand abstractie de algoritmii aplicati privind
selectionarea datelor implicate si a modului de memorare a lor.

Principalele functii SGBD sunt:


1. functia de descriere - folosind un model de structura a unei baze de date, SGBD-ul realizeaza
definirea entitatilor, a caracteristicilor si legaturilor dintre acestea, prin intermediul unui limbaj de descriere a
bazelor de date
2. functia de manipulare - introducerea datelor in baza de date se realizeaza prin intermediul
unui limbaj de manipulare care dispune de anumite instructiuni. De asemenea, limbajul de manipulare permite
consultarea si actualizarea bazei de date
3. functia de utilizare - este realizata, in general, in cadrul limbajului de manipulare, care permite
scrierea unor algoritmi de prelucrare a datelor
Serverul de baze de date

Pentru organizarea bazelor de date sunt utilizate o serie de modele conceptuale (sau
structurale), cele mai cunoscute fiind cele numite:
retea
ierarhic
relational
obiectual
si modele hibride (obiectual-relational)

Pentru implementarea sistemelor de gestiune a bazelor de date sunt utilizate


urmatoarele modele arhitecturale:
mainframe
integrat
file-server
client-server

Cel mai des utilizat model conceptual este cel relational.


Serverul de baze de date

Sistemul software care implementeaza modelul rational se numeste SGBDR (sistem de


gestiune a bazelor de date relationale). Pentru implementarea SGBDR-urilor este utilizata
arhitectura client-server.

Utilizarea majoritatii serviciilor internetului se desfasoara in regim client/server, astfel


ca devine naturala folosirea SGBD-urilor in aplicatii Internet (e-business, e-commerce). In ceea
ce priveste costurile, SGBD-urile se pot clasifica in doua categorii:
1. comerciale (proprietare)
2. open source (gratuite)

Sistemele comerciale - dintre care amintim Oracle, SQL SERVER (Microsoft), DB2
(IBM), sunt scumpe, motiv pentru care sunt practic inaccesibile unor companii/organizatii mici,
institutii de invatamant sau persoane particulare.

In schimb, MySQL, de exemplu, este gratuit.


Serverul de baze de date
Cele mai multe sisteme incluse in ultima categorie sunt folosite ca backend pentru
aplicatiile Web dinamice. Procesul de creare si exploatare a bazelor de date necesita existenta
unor utilizatori avand diverse functii.

Principalele tipuri de utilizatori ai bazelor de date sunt:


administratorul bazei de date persoana care stabileste si descrie modelul bazei de date,
dupa ce, in prealabil, realizeaza o analiza detaliata a sistemului informatic caruia ii este
destinata. Acesta va descrie toate entitatile, structura lor si legaturile dinte ele.
administratorul aplicatiei persoana care, pe modelul bazei de date si a structurii acesteia,
analizeaza cerintele concrete ale unei aplicatii, stabilind un submodel al bazei de date care
va fi utilizat ( include o parte a bazei de date, vazuta din punctual de vedere al aplicatiei )
de catre toti programatorii de aplicatii .
programatorii de aplicatii persoanele care scriu programe pentru exploatarea bazei de
date, folosind descrierea data de administratorul aplicatiei.

In acest scop, vor folosi limbajul de manipulare al sistemului de gestiune a bazei de


date utilizatorii bazei de date persoane care utilizeaza baza de date prin intermediul aplicatiilor
realizate de programatorii de aplicatii.
Sistemul de gestiune a bazelor de date relationale MySQL

MySQL, dezvoltat de MySQL AB, este cel mai popular sistem de gestiune a bazelor de
date relationale open source utilizat in Internet, avand versiuni pentru majoritatea platfomelor.

Serverul MySQL este multifir si multiutilizator.

Dintre caracteristicile sale, pot fi mentionate stabilitatea si rapiditatea.

Adresa MySQL este http://www.mysql.com/.

Clientul Mysql lucreaza in modul text, fara interfata grafica. Daca se doreste utilizarea
unor clienti cu interfata grafica, ei trebuie procurati separat. Dintre acestia amintim SQL-Front.

Distributiile MySQL sunt de doua tipuri:


distributii client nu contin nici un server, dar contin programele de tip client necesare pentru
transmiterea comenzilor catre un server MySQL instalat pe un alt calculator.
distributii server contin atat programele-server, cat si programele-client si utilitare.
Sistemul de gestiune a bazelor de date relationale MySQL

Distributii MySQL

O distributie MySQL contine numai o parte sau toate componentele urmatoare:


serverul mysqld (sau diverse variante; distributia standard client-server pentru Windows
ofera urmatoarele servere: mysqld, mysqld-opt, mysqald-nt) indeplineste urmatoarele
functii principale:
gestioneaza bazele de date si conturile de acces
primeste cererile clientilor
obtine accesul de date
furnizeaza clientilor informatiile solicitate
programe-client (mysql) sunt utilizate in principal pentru conectarea la server, transmiterea
comenzilor si afisarea rezultatelor primate
programe utilitare (mysqladmin, mysqldump, myiscamchk) sunt folosite pentru
administrarea sistemului MySQL
fisiere de tip antet si fisiere de tip biblioteca
documentatie sub forma unui manual MySQL
baza de date mysql contine, printre altele, tabelele de acordare a privilegiilor pentru
utilizatori
Instrumente pentru dezvoltarea aplicatiilor

Pentru dezvoltarea aplicatiilor Web sunt puse la dispozitia programatorilor un numar


foarte mare de instrumente, atat in regim open source, cat si comercial.

Aceste instrumente sunt:


editoare de text
sisteme de management al continutului
cadre de lucru
medii de dezvoltare integrate
Instrumente pentru dezvoltarea aplicatiilor
Editoarele sunt instrumente utilizate pentru editarea codului-sursa. Pentru scrierea/editarea
scripturilor PHP pot fi utilizate un numar mare de editoare, incepand cu cel mai simplu, si anume
banalul Notepad.
Alte editoare au facilitate suplimentare, dintre care cea mai importanta este asa-numita syntax
highlighting, care consta in colorarea cuvintelor rezervate ale limbajului de marcare/programare utilizat
in scrierea scriptului.
Din multitudinea de programe care pot fi utilizate pentru editarea scripturilor PHP
mentionam cateva:
EditPlus editor comecial pentru HTML, CSS, PHP, ASP, Perl, C/C++, Java, JavaScript si VBScript
(http://www.editplus.com/)
jEdit editor gratuit, scris in Java, avand versiuni pentru cele mai multe platforme. Suporta evidentierea sintaxei pentru circa
130 de tipuri de fisiere (e.g. JavaScript, Perl, PHP, HTML, XML, XSL).
Maguma Studio Light for PHP este un editor open source, care suporta:
evidentierea sintaxei HTML si PHP
operatii nelimitate copy-paste-undoredo
autocompletare pentru numele functiilor si parametrilor
suport FTP
macro-uri, etc.(http://www.maguma.com)
Notepad++ - este un editor gratuit, care suporta evidentierea sintaxei pentru un numar mare de limbaje. Alte facilitate oferite
de Notepad++ sunt:
stiluri personalizate
editarea simultana a mai multor fisiere
autocompletare
suport pentru editarea simultana a mai multor documente
cautarea si inlocuirea sirurilor folosind expresii regulate
drag & drop
zoom in si zoom out
PSPad este un editor gratuit, suportand evidentierea sintaxei pentru un numar de peste 120 de tipuri de fisiere (CSS, HTML,
XHTML, Java, etc). Editorul incorporeaza diverse tipuri de instrumente, dintre care mentionam un editor hexazecimal si un
client FTP (http://www.pspad.com)
Instrumente pentru dezvoltarea aplicatiilor
Sisteme de management al continutului

Un CMS (CONTENT MANAGEMENT SYSTEM) reprezinta un sistem software


folosit pentru asistenta utilizatorilor in administrarea continutului unui site Web sau pentru
stocarea, modificarea si publicarea unor documente specifice, articolele noi, manualele tehnice,
ofertele de munca, informatiile despre angajati, imaginile cu produse, etc.

Dintre CMS-urile cele mai cunoscute amintim:


Drupal un CMS open source care poate sustine o varietate de site-uri Web, de la bloguri, brosuri
colective, pana la site-uri ale unor comunitati largi (http://drupal.org)
eZ Publish un CMS si un mediu de dezvoltare, avand ca functionalitate dezvoltarea siturilor de
comert electronic. Poate fi utilizat sub licenta profesionala (eZ Publish Pro, Enterprise sau in
regim open source GPL (http://ez.no//expublish)
Joomla folosind acest cadru de lucru open source, pot fi dezvoltate solutii integrale de comert
electronic, sisteme de control al inventarului, instrumente de raportare a datelor, cataloage
personalizate cu produse, sisteme de rezervari, etc. (http://www/joomla.org)
PHP - Fusion este un CMS open source de categorie usoara. Foloseste o singura baza de date
pentru stocarea intregului continut al sitului (http://phpfusion.co.uk/news.php)
PHP Nuke este un CMS si un portal open source. Este flexibil in exploatare, dispune de
instrumente de actualizare a continutului, fiind una dintre cele mai accesibile solutii de tip portal gasite
pe Internet (http://phpnuke.org/ )
Instrumente pentru dezvoltarea aplicatiilor
Sisteme de management al continutului

Dintre CMS-urile cele mai cunoscute amintim:


PostNuke este un CMS open source, reprezentand un sistem de administrare colaborativ, pentru comunitati si
continuturi (http://www.postnuke.com/)
Plone este unul dintre cele mai avansate CMS-uri, identificat de CMSReport si eWeek drept una dintre cele
trei variante open source din gama sistemelor CMS enterprise (http://plone.org/)
Mambo este un CMS open source foarte popular, bazat pe PHP si MySQL, folosit pentru a crea si administra
stiluri printr-o interfata grafica simpla, oferind o multime de facilitati dintre care amintim:
salvarea paginilor in cache (pentru a imbunatati performantele site-urilor cu trafic ridicat)
tehnici avansate de realizare a sabloanelor (templates)
versiuni pentru tiparire ale paginilor
forumuri
stiri
calendare
feed-uri RSS (http://www.mamboserver.com/)
osCommerce este cea mai des utilizata solutie open source pentru dezvoltarea siturilor de comert electronic,
fiind bazata pe PHP si MySQL si avand versiuni pentru un numar mare de platforme: Windows, Linux, Solaris,
BSD, Mac OS (http://www.oscommerce.com/).

Dintre solutiile CMS open source pentru comertul electronic, bazate pe PHP si MySQL, mai
amintim:
Zend Cart (http://zen-cart.com/)
phpShop (http://www.phpshop.org/)
OpenCart (http://www.opencart.com/)
Instrumente pentru dezvoltarea aplicatiilor
Cadre de lucru. Modelul MVC

Un cadru de lucru software (software framework) este un proiect reutilizabil pentru


dezvoltarea aplicatiilor si poate include programe, biblioteci, un limbaj de scripting, precum si
un alt software menit sa ajute la dezvoltarea si conectarea diverselor componente ale unui proiect
software.

Diversele parti ale unui cadru de lucru pot fi expuse (si accesate) prin intermediul unor
API-uri (Application Programming Interface).

Majoritatea cadrelor de lucru utilizeaza arhitectura MVC (Model-View-Controller),


scopul acesteia fiind de a separa modulul de date de interfata cu utilizatorul (view), astfel incat
schimbarile de interfata sa nu afecteze datele, iar acestea sa poata fii reorganizate fara schimbari
de interfata.

Arhitectura MVC rezolva aceasta problema prin decuplarea accesului la date si a


logicii aplicatiei de prezentarea datelor si interactiunea cu utilizatorul, introducand o componenta
intermediara, numita Controller.
Instrumente pentru dezvoltarea aplicatiilor
Cadre de lucru. Modelul MVC

Arhitectura MVC este constituita din trei componente principale:


componenta Model constituie o reprezentare specifica (sub forma de date) a informatiilor cu care opereaza
aplicatia. Mai multe aplicatii utilizeaza stocarea permanenta a datelor (baze de date).
componenta View (vedere) interpreteaza modelul intr-o forma potrivita pentru interactiune (in mod obisnuit
intr-un element de interfata). Pentru un singur model, pot fi dezvoltate mai multe vederi, in diverse scopuri.
componenta Controller (controlor) reprezinta clasele care realizeaza comunicarea intre cele doua
componente anterioare:
proceseaza evenimentele din interfata (in mod obisnuit, actiunile utilizatorilor) si raspunde la acestea
poate invoca schimbari in model

Dintre numeroasele cadre de lucru open source avand PHP ca limbaj de scripting, se remarca
urmatoarele:
Smarty este unul dintre primele cadre de lucru (din punct de vedere cronologic) care au implementat
modelul MVC, fiind preferat de un numar mare de programatori (http://smarty.php.net/)
Symfony este un cadru de lucru pentru proiectele PHP 5. Invatarea acestuia este relativ simpla
pentru programatorii PHP care cunosc sabloanele de proiectare ale aplicatiilor Web
(http://www.symfony-project.org/)
Zend Framework este un cadru de lucru pentru PHP 5, dezvoltata de firma Zend Software din
Israel. Acesta a fost proiectat cu scopul de a elimina detaliile plictisitoare legate de scrierea efectiva a
codului, lasand programatorul sa-si concentreze atentia asupra intregului proiect pe care il dezvolta
(http://framework.zend.com/)
Instrumente pentru dezvoltarea aplicatiilor
Medii integrate de dezvoltare

Un IDE (Integrated Development Environment), adica un mediu integrat de


dezvoltare este un software complex, care ofera posibilitatea dezvoltarii altor programe
conducand programatorul prin toate etapele necesare (editarea codului-sursa, compilarea,
depanarea, testarea, generarea documentatiei).
De obicei, un mediu de dezvoltare este specific unui limbaj de programare, dar exista
si medii care suporta mai multe limbaje.

Dintre IDE-urile care folosesc limbajul PHP mentionam:


Dreamweaver este un IDE commercial larg raspandit, produs de Macromedia, acum in proprietatea
Adobe Systems. Produsul poate fi rulat pe programe software variate (Mac OS, Windows).
PhpEd este un IDE/editor commercial complet personalizabil, care stie HTML, PHP, Perl, Python,
oferit de NuSphere (http://www.nusphere.com/).
PHPEdit este un IDE PHP commercial pentru profesionisti, incluzand o serie de instrumente
puternice, ca de exemplu un debugger depanator (http://www.waterproof.fr).
Quanta Plus este un IDE (pentru platforma Linux) stabil, foarte bogat in facilitati, eficient si
extensibil (http://quanta.kdewbdev.org/)
Zend Studio este un IDE commercial, produs de Zend Software. Pe langa o multime de alte
functionalitati (profiler, analizator de cod, suport CVS, inspectoare, suport FTP), ofera si un debugger
Depanarea codului se poate face inclusive de la distanta, in acest caz folosindu-se componenta Zend
Studio Server, inclusa in pachet (http://www.zend.com ).
Intrebari
???
Tehnologii WEB

Cursul 2
Planul lectiei:
Notiuni introductive despre Tehnologiile Web
Limbajul HTML
Structura unui document HTML
Antetul documentului
Corpul documentului atributele tagului <body>
Comentarii in HTML
Formatarea textului si a paragrafelor
Utilizarea paragrafelor titlu
Formatarea la nivel de caracter
Inserarea imaginilor in HTML atribute folosite
Inserarea legaturilor in documentele HTML
Elementul A
Elementul LINK
Elementul BASE
Notiuni introductive despre Tehnologiile Web
Tehnologiile utilizate n aplicaiile Web reprezint n general, acele limbaje de
programare utilizate la crearea de site-uri web complexe, interactive, al cror concept
presupune stpnirea ct mai detaliat a unor limbaje de scripting sau de programare i
baze de date.
In categoria tehnologii Web se pot include:
o multitudine de limbaje de programare, cum ar fi PHP, JavaScript, ASP, etc.
ca baze de date pot fi utilizate MySQL, MsSQL, Access, ORACLE, etc.

Aplicaii Web ntalnite mai des:


portal-uri
forum-uri
magazine virtuale
formulare de nscriere
licitaii on-line, etc.

Acum cativa ani, tehnologiile Web erau folosite doar de marile companii
datorita costurilor ridicate ale licentelor programelor de dezvoltare.

In prezent, datorita dezvoltarii tot mai accentuate a solutiilor Open Source,


oricine isi poate permite realizarea de aplicatii web.
Notiuni introductive despre Tehnologiile Web
Tehnologii folosite mai des n programarea aplicaiilor web dinamice:

html - aparut la inceputul anilor '90, datorita lipsei unui limbaj universal care sa permita
publicarea informatiei la nivel global, html a determinat dezvoltarea spectaculoasa a
Internetului.

xhtml - reprezinta prescurtarea de la EXtensible HyperText Markup Language (denumirea


oficiala a standardului). Practic este un inlocuitor modern al mai vechiului limbaj html.

css - cascading style sheet - foi de stil in cascada. Un fiier CSS este un fisier text cu
extensia ".css, definind stiluri pentru paginile html. Fiierele CSS permit stilizarea in bloc a
documentelor html cu un efort semnificativ mai mic decat in cazul stilizarii elementelor de
pagina in cadrul fiecarui document html in parte, prin intermediul atributelor tagurilor.

javascript - este un limbaj de scripting dezvoltat la origine de Netscape, permitand


scrierea de secvente de program care se executa la aparitia unui eveniment utilizator.

flash - este un mediu de lucru dezvoltat de compania Macromedia; cu ajutorul FLASH-ului


se poate realiza un design de calitate, continut interactiv, animatii profesionale.

mysql - este un sistem de gestiune a bazelor de date relaionale, fiind o componenta cheie
a limbajului PHP.
Notiuni introductive despre Tehnologiile Web
Tehnologii folosite mai des n programarea aplicaiilor web dinamice:

cgi - Common Gateway Interface --- sunt script-uri scrise in orice limbaj de programare
indiferent daca sunt compilate sau interpretate, script-uri care sunt executate pe server.

isapi Internet Server API --- reprezinta alternativa celor de la Microsoft la CGI (Common
Gateway Interface), rulabila bineinteles pe platforme Windows.

php si asp aparute n 1994, respectiv 1996, sunt doua limbaje puternice care au adus o
schimbare in design-ul aplicatiilor web. Acestea, desi sunt diferite, au totusi o serie de
similaritati: ambele sunt interpretate, ambele genereaza scripturi (.php respectiv .asp),
care pot fi combinate cu html, date de tip text, etc. Limbajele ofera suport si pentru lucrul
cu baze de date (MySQL, MsSQL, PostgreSQL, Oracle) - de fapt sunt intens folosite in acest
sens. Limbajul ASP nu este un concept nou, ci se bazeaza pe limbajele VBScript si JScript.
Principalul dezavantaj al acestor doua limbaje este viteza. Acestea sunt lente deoarece
fiecare accesare presupune procesarea si interpretarea lor si nu pot construi controale
reutilizabile.

jsp Java Server Pages --- reprezinta o tehnologie de design al aplicatiilor web ce permite
crearea acestor aplicatii independente de platforma.

asp.net - este o noua tehnologie pentru aplicatii web elaborata de Microsoft, dar despre
care nu se poate spune daca este o urmare a ASP-ului, cu toate ca pstreaza
compatibilitatea cu acesta.
Limbajul HTML
HTML este prescurtarea de la HyperText Markup Language, limbajul utilizat
n World Wide Web pentru descrierea hipertextelor; nu este un limbaj de programare
propriu-zis, ci doar un limbaj de descriere, continand elemente ce permit construirea
paginilor Web.

Documentele HTML sunt exclusiv de tip text (ASCII); prin urmare ele pot fi
editate direct, prin comenzi specifice sistemului de operare folosit. De exemplu, pentru
crearea unui document HTML n Windows XP se pot utiliza unul din editoarele de texte
incluse n sistemul de operare (Notepad, Wordpad) sau orice alt editor de texte.

Documentele descrise n HTML pot fi vizualizate cu ajutorul unor aplicaii


speciale denumite browser-e, care lucreaz pe diferite tipuri de sisteme de calcul; prin
urmare, documentele html sunt independente de platforma de lucru.

HTML utilizeaza pentru descrierea documentelor Web etichete (denumite si


tag-uri) specifice pentru fiecare element descris; etichetele stabilesc atat structura
documentului, cat si aspectul acestuia.

O eticheta (tag) este un identificator care furnizeaza browser-ului


instructiuni de formatare a documentului. Pentru a fi delimitate, etichetele html sunt
incadrate intre paranteze unghiulare (< >).
Structura unui document HTML
Un document html este delimitat de perechea de etichetele <html> si
</html> si este constituit din:

Antetul documentului, delimitat de etichetele <head> si </head>, care contine


informatii generale referitoare la document, cum ar fi titlul documentului, autorul acestuia
etc.

Corpul documentului, delimitat de etichetele <body> si </body> sau (in cazul in care
este descrisa structura cadrelor din document) de etichetele pereche <frameset> si
</frameset>, care contine textul propriu-zis al documentului, precum si elementele
specifice de descriere a formatului acestuia.

In antet este recomandat sa precizati titlul documentului, care va fi afisat in


bara de titlu a ferestrei browser-ului. Pentru a preciza titlul documentului, care nu poate
depasi 64 de caractere, se utilizeaza in seciunea antet etichetele pereche <title> si
</title>, intre care se scrie titlul documentului.
Structura unui document HTML
Capul documentului Atributele tagului <body>
<head> BACKGROUND=URL
BGCOLOR=culoare
</head> TEXT = culoare
LINK = culoare
Corpul documentului VLINK = culoare
<body> ALINK = culoare

</body> Comentarii in HTML

Exemplu: <! ->


<html>
Formatarea textului
<head>
<title> Prima mea pagina Web
La nivel de bloc
</title>
La nivel de caracter
</head>
<body bgcolor=GREEN text=RED> Formatarea paragrafelor
<i> <b>Scriu in fereastra browser-
ului un text rosu pe fond verde...</i> </b> Atributul ALIGN:
</body> Left
</html> Right
Center
Justify
Structura unui document HTML
BACKGROUND=URL
URL este un sir de caractere ce reprezinta adresa Web a unei imagini care va fi utilizata de catre browser
ca fundal (background) pentru document. Daca imaginea nu ocupa intreaga zona din fereastra browser-
ului destinata vizualizarii paginii respective, ea va fi multiplicata, ca intr-un mozaic.

BGCOLOR=culoare
BGCOLOR (BackGround COLOR) stabileste culoarea fundalului (culoarea zonei din fereastra
browser-ului in care este vizualizat documentul). In html culorile se pot specifica in doua moduri:
utilizand denumiri predefinite asociate unor culori (de exemplu RED semnificand rou, GREEN verde,
BLUE albastru etc.) sau "construind" culori proprii prin combinarea a trei culori de baza - rosu, verde si
albastru (modelul RGB). In acest caz, specificarea unei culori se face indicand in ordinea rosu, verde,
albastru trei valori hexazecimale cuprinse intre 00 i FF, cate una pentru fiecare culoare de baza, astfel:
#rrggbb.

TEXT = culoare
Atributul TEXT stabileste culoarea textului.

LINK = culoare
Atributul LINK stabileste culoarea cu care vor fi marcate in text link-urile nevizitate.

VLINK = culoare
Atributul VLINK stabileste culoarea cu care vor fi marcate in text link-urile vizitate.

ALINK = culoare
Atributul ALINK stabileste culoarea cu care va fi marcat in text link-ul activ (cel asupra caruia este plasat
cursorul mouse-ului).
Formatarea textului
Formatarea textului care apare in corpul unui document html se poate face
la:
nivel de bloc (block-level)
sau la nivel de caracter (text-level sau inline)

Diferentele principale dintre cele doua tipuri de formatare sunt:


elementele de formatare la nivel de bloc pot contine alte elemente de formatare (la nivel de
bloc sau la nivel de caracter), in timp ce elementele de formatare la nivel de caracter contin
doar text sau alte elemente de formatare la nivel de caracter;
elementele de formatare la nivel de bloc incep de obicei de la linie noua.

Gruparea mai multor elemente html la nivel de bloc se realizeaza cu ajutorul


etichetelor <div> i </div>.

Pentru gruparea mai multor elemente dintr-un bloc la nivel de caracter (inline)
se utilizeaza perechea de etichete <span> i </span>.

Gruparea mai multor elemente prin <div> sau <span> va fi deosebit de utila
daca veti apela la facilitile oferite de stilurile de formatare text (stilurile CSS),
deoarece veti putea aplica acelasi stil simultan tuturor elementelor din grup.
Formatarea paragrafelor
In tehnoredactare, prin paragraf se inelege o zona de text cuprinsa intre doua
caractere de trecere la linie noua (denumite NewLine sau Enter).
In html, delimitarea paragrafelor se realizeaza cu ajutorul etichetei <p>,
eticheta de sfarsit </p> fiind opionala.
Cel mai utilizat atribut admis de eticheta <p> este align, care stabileste
modul de aliniere stanga - dreapta a textului paragrafului.
align = LEFT | CENTER | RIGHT | JUSTIFY
Se observa ca atributul align admite patru valori predefinite :
LEFT - textul este aliniat la marginea din stanga
RIGHT - textul este aliniat la marginea din dreapta
CENTER - textul este centrat (plasat la egala distanta de marginea din stanga si cea din
dreapta)
JUSTIFY - textul este aliniat si la stanga si la dreapta (prin marirea spaiului intre cuvinte)

Valoarea implicita a modului de aliniere a textului depinde de direcia acestuia:


dac textul este scris de la stanga la dreapta, valoarea implicita a modului de aliniere
este LEFT; dac textul este scris de la dreapta la stanga, valoarea implicit a modului de
aliniere este RIGHT.
Utilizarea paragrafelor titlu
Documentele html pot fi structurate pe sase niveluri, existand sase etichete
care definesc nivelul paragrafului titlu in structura documentului:
<h1>, <h2>, <h3>, <h4>, <h5>, <h6>.

In cazul etichetarii paragrafelor, etichetele de sfarsit sunt obligatorii.

Nivelul delimitat de etichetele <h1> i </h1> este cel mai important, iar
nivelul delimitat de etichetele <h6> i </h6> cel mai putin important.

Browser-ul vizualizeaza de obicei paragrafele titlu mai importante cu litere mai


mari decat cele mai putn importante.
Formatarea la nivel de caracter
Un font este caracterizat de urmatoarele atribute:
culoare (stabilita prin atributul color)
tipul sau stilul (stabilit prin atributul face)
marimea (definita prin atributul size)
marimea in puncte tipografice (stabilita prin atributul point-size)
grosime (definita prin atributul weight)

Toate aceste atribute apartin etichetei font, care permite inserarea de blocuri
de texte personalizate.

Precizarea informaiilor referitoare la fontul utilizat de browser pentru


vizualizarea textului se realizeaz cu ajutorul etichetelor pereche <font> i </font>.

Daca in document nu sunt precizate nici un fel de informatii referitoare la font,


browser-ul va utiliza fontul sau implicit.
Formatarea la nivel de caracter
Atributele admise de eticheta <font> sunt:

SIZE = valoare stabileste dimensiunea caracterelor.


Valoarea dimensiunii fontului poate fi specificata:
in mod absolut (un numr natural cuprins intre 1 i 7)
sau relativ la dimensiunea curenta a caracterelor:
dac valoarea este +n, caracterele vor fi cu n marimi mai mari
dac valoarea este -n, caracterele vor fi cu n marimi mai mici
dimensiunea efectiva cu care sunt vizualizate caracterele depinde de
browser.

COLOR = culoare stabileste culoarea textului.

FACE = list_fonturi defineste o lista de fonturi separate prin virgula,


dintre care browser-ul il va alege pe primul disponibil in ordinea preferintelor.
Daca nici unul din fonturile din lista nu este instalat pe calculatorul
utilizatorului, browser-ul va utiliza fontul implicit.
Aplicarea unor efecte asupra textului
Pentru a aplica unei zone un anumit efect, se incadreaza textul intre eticheta de
inceput si cea de sfarsit, corespunzatoare efectului respectiv.
Cele mai utilizate efecte ce se pot aplica asupra textului in html sunt:
<I> Textul este scris cursiv </I>
<U> Textul este scris subliniat </U>
<B> Textul este scris ingrosat </B>
<BIG> Textul este scris mai mare </BIG>
<SMALL> Textul este scris mai mic </SMALL>
<STRIKE> Textul este scris taiat </STRIKE>

Grosimea unui font


Grosimea unui caracter poate fi definita cu ajutorul atributului weight al
etichetei. Valorile posibile pentru acest atribut sunt 100, 200, 300, 400, 500, 600, 700,
800 si 900 (100 pentru fontul cel mai subtire si 900 pentru cel mai gros).
Inserarea imaginilor
Imaginile sunt stocate in fisiere cu diverse formate. Formatele acceptate de
browsere pentru fisierele imagine sunt:
GIF (Graphics Interchange Format) cu extensia .gif
JPEG (Joint photographic Experts Group) cu extensia .jpeg sau .jpg
XPM (X pixMap) cu extensia .xmp
XBM (X BitMap) cu extensia .xbm
BMP (BitMap) cu extensia .bmp (numai cu Internet Explorer)
TIFF (Tagged Image File Format) cu extensia .tif sau .tiff
PNG (Portable Network Graphic) cu extensia .png

Cele mai raspandite formate sunt:


GIF (8 biti pentru o culoare, 256 culori posibile)
JPEG (24 biti pentru o culoare, 16777216 de culori posibile).

Adresa URL a unei imagini


URL ("Uniform Resourse Locator) = identificator unic al resursei este
un standard folosit in identificarea unica a unei resurse in Internet.
Toate imaginile cu care vom lucra vor avea adresa URL exprimata in functie de
directorul ce contine documentul HTML care face referire la imagine.
Inserarea imaginilor
Elementul img se utilizeaza pentru a atasa unei pagini o imagine.

Forma generala a acestui element este: <img atribute>

Atributele sunt:
SRC identifica fisierul care contine imaginea respectiva (de tip .jpg, .gif etc.).
Fisierul care conine imaginea se va gasi intr-un folder oarecare (in exemplul urmator el se
gsseste in acelasi folder in care gasim si fisierul cu extensia .html (cel care contine pagina).
Din acest motiv, sursa nu conine si calea, dar, daca este cazul, calea poate fi continuta.
ALIGN - tipul de aliniere - retine una din valorile de mai jos si specifica browser-ului
modul in care va alinia imaginea in raport cu textul: Right, Left, Top, Middle, Bottom

Fie fiierul text de mai jos (scris in Notepad):


<p> Un paragraf asezat inaintea imaginii</p>
<p> <img src=mihai24.jpg align=right>
Se observ cum se alinieaz imaginea n al doilea paragraf </p>
<p> alt text este scris pentru a evidentia alinierea !!</p>
Inserarea imaginilor
Observam ca am scris un prim paragraf care nu contine nici o imagine. Apoi,
am scris un paragraf care, la inceput, contine o imagine, apoi text. In final, avem un
paragraf numai cu text.
Right daca ALIGN retine aceasta valoare, imaginea se aliniaza in dreapta, iar textul
care urmeaza este scris in locul ramas.
Top numai primul rand al textului este scris in dreapta imaginii, in partea de sus.
Apoi, textul continua dupa imagine, ocupand intreaga latime a ecranului.
Left daca ALIGN retine aceasta valoare, imaginea se aliniaza in stanga, iar textul
care urmeaza este scris in locul ramas.
Middle numai primul rand al textului este scris in dreapta imaginii, la jumatatea
inalimii ei. Apoi, textul continua dupa imagine, ocupand intreaga latime a ecranului.
Bottom numai primul rand al textului este scris in dreapta imaginii, in partea de jos.
Apoi, textul continua dupa imagine, ocupand intreaga latime a ecranului.
alt="nume" - exista posibilitatea ca imaginea sa nu se poata incarca. Pentru astfel de
situatii este folosit parametrul ALT, unde numele contine un text (alternativ) care va fi
afisat in locul imaginii.
height="numar pixeli" - inltimea imaginii.
width="numar pixeli" - latimea imaginii.
border ="nr_pixeli" - Optional, imaginea poate fi inconjurata de un chenar.
hspace="nr_pixeli"- determina distanta minima care separa imaginea de celelalte
obiecte pe orizontala.
vspace="nr_pixeli"- determina distanta minima care separa imaginea de celelalte
obiecte pe verticala.
Inserarea legaturilor in documente HTML
Principala caracteristica a hipertextelor o constituie utilizarea legaturilor
(links).
Un link este o conexiune catre o alta resursa Web (un alt hipertext sau o
imagine, o secventa video sau audio, un program etc.), resursa care poate fi accesata din
fereastra browser-ului printr-un simplu clic.
Limbajul HTML contine multiple elemente prin intermediul carora se poate
crea o legatura catre resursele Web:
img (creeaza o legatura catre o imagine)
LINK (specifica legaturi catre resurse utile)
A (creeaza o legatura catre o resursa Web intr-un document HTML)
Applet (creeaza o legatura catre un program executabil pe calculatorul
utilizatorului)

Elementul A
Pentru a insera un link intr-un document HTML se utilizeaza elementul A
(anchor - ancora). Textul cuprins intre eticheta de inceput <A> si cea de sfarsit
</A> va aparea evidentiat in fereastra browser-ului subliniat, colorat in functie de
valorile atributelor LINK, VLINK, ALINK sau in functie de modul de configurare a
browser-ului.
Inserarea legaturilor in documente HTML
Atributele specifice elementului A sunt:
href = URL specifica adresa resursei la care se face legatura.
name = sir-de-caractere asociaza un nume ancorei curente, astfel
incat sa poata constitui tinta unui alt link. Numele trebuie sa fie unic in
cadrul documentului.
title = sir-de-caractere asociaz un nume resursei la care se face
legatura. Browser-ul va putea afisa titlul resursei cand utilizatorul
deplaseaza mouse-ul deasupra legaturii.

<A NAME="nceput"></A>
....
<A HREF="#Inceput">Ia-o de la nceput!</A>
In exemplul de mai sus am definit o ancora vid, pe care am denumit-o inceput. La
sfarsitul documentului am inserat o legatura catre ancora inceput, care permite utilizatorul sa revina
in pozitia acestei ancore. Observati ca in acest ultim caz, pentru specificarea adresei am utilizat
caracterul #, urmat de numele ancorei.

<A HREF="Curs.htm#Link"> Curs Retele de calculatoare. Cap. Legaturi in documente HTML.</A>


In acest exemplu am definit o legatura catre documentul HTML Curs.htm. Prin activarea
acestei legaturi se va deschide in fereastra browser-ului documentul Curs.htm, la ancora denumita
Link. Observati ca pentru a specifica drept tinta o ancora dintr-un alt document se utilizeaza notatia:
adresa#nume-ancora.
Inserarea legaturilor in documente HTML
Atributele specifice elementului A sunt:
href = URL specifica adresa resursei la care se face legatura.
name = sir-de-caractere asociaza un nume ancorei curente, astfel
incat sa poata constitui tinta unui alt link. Numele trebuie sa fie unic in
cadrul documentului.
title = sir-de-caractere asociaz un nume resursei la care se face
legatura. Browser-ul va putea afisa titlul resursei cand utilizatorul
deplaseaza mouse-ul deasupra legaturii.

<A NAME="nceput"></A>
....
<A HREF="#Inceput">Ia-o de la nceput!</A>
In exemplul de mai sus am definit o ancora vid, pe care am denumit-o inceput. La
sfarsitul documentului am inserat o legatura catre ancora inceput, care permite utilizatorul sa revina
in pozitia acestei ancore. Observati ca in acest ultim caz, pentru specificarea adresei am utilizat
caracterul #, urmat de numele ancorei.

<A HREF="Curs.htm#Link"> Curs Retele de calculatoare. Cap. Legaturi in documente HTML.</A>


In acest exemplu am definit o legatura catre documentul HTML Curs.htm. Prin activarea
acestei legaturi se va deschide in fereastra browser-ului documentul Curs.htm, la ancora denumita
Link. Observati ca pentru a specifica drept tinta o ancora dintr-un alt document se utilizeaza notatia:
adresa#nume-ancora.
Lectia propriu-zisa:
Elementul LINK
Ca i elementul A, elementul LINK permite specificarea unor legaturi catre
alte documente. Spre deosebire de A, elementul LINK poate fi plasat numai in antetul
documentului (in sectiunea HEAD), deci prin urmare corespunzator acestui element nu
se afiseaza nimic in pagina vizualizata de ctre browser.
<LINK TITLE = "Author" HREF = utcb.ro/ing>

Din punct de vedere sintactic, elementul LINK admite aceleasi atribute ca si


elementul A, dar nu admite eticheta de sfarsit. Prin utilizarea elementului LINK pot fi
furnizate diferite informatii, cum ar fi informatii despre autor, informatii despre
versiunile anterioare ale documentului sau versiuni in alte limbi etc.

Elementul BASE
Specificarea adreselor resurselor Web la care se creeaza legaturi in documente
HTML se poate face atat n mod absolut, cat si in mod relativ. In cazul specificarii
relative a adreselor, se considera implicit ca adresa de baza este locatia curenta. Prin
intermediul elementului BASE exista posibilitatea de a specifica explicit adresa de baza
a URL-urilor specificate in mod relativ.
<BASE HREF="http://www.utcb.ro/ing">
Daca apare, elementul BASE trebuie plasat in antetul documentului HTML.
Intrebari
???
Tehnologii WEB

Cursul 3
Planul lectiei:
Liste in HTML
Liste ordonate
Liste neordonate
Liste de tip definitie
Tabele in HTML
Atributele elementului TABLE
Atributele elementului TR
Atributele elementului TD
Elementele TH si CAPTION
Cadre in HTML
Exemple
Liste in HTML
In HTML exista posibilitatea ca anumite enunturi sa fie numerotate sau
marcate intr-un anumit fel. O astfel de organizare poarta numele de lista.
In HTML se pot descrie trei tipuri de liste:
liste ordonate, in care elementele sunt numerotate
liste neordonate, in care elementele sunt marcate de asa natura incat nu
se sugereaza o anumita ordine a lor
liste de tip definitie

Mai jos putei observa cele trei tipuri de liste:


Liste ordonate
Elementul OL (Ordered Lists) creeaza o lista ordonata. Elementele listei
sunt trecute intre tag-urile <OL> si </OL>.
Elementul LI (List Item) descrie un element al listei. Tag-ul obligatoriu este
cel de nceput <LI>, iar cel de sfarsit este facultativ: </LI>.
Elementul OL are atributul type. Valorile pe care le poate lua acest atribut,
sunt:
<OL type = a>
<OL type = i>
<OL type = A>
<OL type = I>
<OL type = 1>

Exemplu:
Liste neordonate
Elementul UL (Unordered Lists) descrie o lista neordonata. Elementele
listei sunt cuprinse intre tag-urile <UL> si </UL>.
Elementul UL are atributul type .Valorile pe care le poate lua acest atribut,
sunt:
<UL type = cyrcle>
<UL type = disc>
<UL type = square>

Exemplu:
Liste neordonate
Se pot construi si liste imbricate, dupa cum urmeaza din exemplul urmator:
Exemplu:

Efect:
Liste de tip definitie
Elementul DL (Definition Lists) are rolul de a descrie o lista de definitii. El
foloseste tag-urile <DL> si </DL>.
Elementul DT (Definition Term) defineste termenul din lista care trebuie
descris. El utilizeaza tag-ul <DT>.
Elementul DD (Definition Description) are rolul de a retine descrierea
termenului. El utilizeaza tag-ul <DD>.

Exemplu:

Efect:
Tabele in HTML
Paginile pot contine tabele. Elementul TABLE descrie un tabel. Tabelul
utilizeaza tag-urile <TABLE> si </TABLE>.
Elementul TR(table row) descrie o linie a tabelului. O linie a tabelului incepe
cu <TR> si se termin atunci cand este intalnit un nou <TR>. Optional, se poate folosi
</TR>.
Elemenul TD(table data) descrie o celula a tabelului. Se utilizeaza tag-urile
<TD> si, optional, </TD>.

Exemplu:

Efect:
Atributele elementului TABLE

Border defineste grosimea liniilor (in pixeli) care inconjoara tabelul.


O celula a tabelului poate contine si imagine si text. De asemenea, tot ce am invatat in
lectiile anterioare se poate aplica si aici. De exemplu, textul poate fi organizat in
paragrafe, apoi se pot folosi diverse stiluri de scriere, bold, italic, etc.

width - latimea tabelului


Poate fi data in procent fata de latimea ferestrei browser-ului (width="50%")
sau in pixeli (width="500").

height - inaltimea tabelului


Poate fi data in procent fata de inaltimea ferestrei browserului (height="75%")
sau in pixeli (height="200").

align - determina alinierea tabelului in pagina


Poate lua una din valorile: left (stanga), right (dreapta) sau center (in centru).
Daca, pe langa tabel, mai scriem si text, acesta se pozitioneaza fata de tabel la fel cum se
poziioneaza fata de imagini.
Atributele elementului TR

align pentru toate celulele aliniaza continutul pe orizontala in cadrul celulei.


Poate lua valorile:
Left (aliniat stanga)
Right (aliniat dreapta)
Center (aliniat la centru)
Justify (aliniat n ambele parti)

valign - aliniaza continutul pe verticala in cadrul celulei. Poate lua valorile:


Top (sus)
Bottom (jos)
Middle (la mijloc)

bgcolor culoare de fond

Exemplu:

Efect:
Atributele elementului TD

width, height - latimea si inaltimea celulei (in procente din latimea, respectiv
inalimea tabelului.), in plus, au efecte si pentru celelalte celule, pentru ca tabelul sa fie
aliniat.

Exemplu:

Efect:
Elementele TH si CAPTION

Elementul TH
In loc de <TD> </TD> se poate folosi <TH> </TH>. Parametrii sunt aceiasi,
doar ca textele, implicit, sunt tiparite bold.

Elementul CAPTION are rolul de a permite scrierea titlului unui tabel. Titlul
se scrie intre cele doua tag-uri <CAPTION> ai </CAPTION>. Cele doua tag-uri
trebuie sa se gaseasca imediat dup <TABLE>.
Elementul CAPTION are atributul align.

Exemplu: <CAPTION> Un titlu </CAPTION>


Gruparea liniilor i a coloanelor unui tabel
Liniile unui tabel pot fi mpartite in trei categorii:
linii de antet (primele linii ale tabelului)
linii de corp
liniile finale ale tabelului

Elementul THEAD are rolul de a marca liniile din antet. Se foloseste tag-ul
<THEAD> si, optional </THEAD>.
Elementul TBODY are rolul de a marca liniile din corpul tabelului. Se
foloseste tag-ul <TBODY> si, optional </TBODY>.
Elementul TFOOT are rolul de a marca liniile de sfarsitul tabelului. Se
foloseste tag-ul <TFOOT> si, optional </TFOOT>.
In continuare, prezentam cateva atribute pe care le intalnim la oricare din
aceste trei elemente:
align - aliniere orizontala (poate lua valorile pe care le-am intalnit deja).
valign - aliniere verticala (se pot grupa si coloanele unui tabel, nu numai
liniile).
Elementul COLGROUP permite gruparea coloanelor unui tabel. Se utilizeaza
tag-urile <COLGROUP atribute> si, optional </COLGROUP>.
Gruparea liniilor i a coloanelor unui tabel
Privii tabelul urmator. El are trei coloane. Alinierea continutului coloanelor si
spatiul ocupat de ele a fost determinat cu ajutorul a doua elemente COLGROUP.
Primul element stabileste caracteristicile de afisare ale primei coloane, al doilea
stabileste caracteristicile de afisare a urmatoarelor doua coloane.
Observati, mai jos, cum s-a obtinut acest tabel.

Exemplu:

Efect:
Cadre in HTML

Cadrele permit impartirea unei ferestre in sectiuni independente intre ele, in


fiecare dintre acestea fiind posibila incarcarea unui document HTML. Astfel, utilizatorul
poate vizualiza simultan mai multe documente.

De exemplu, putem imparti documentul in doua cadre. In primul cadru va fi


afisata o bara de navigatie. Selectarea unui meniu al barei de navigatie va determina
incarcarea paginii corespunzatoare in cel de-al doilea cadru. Astfel, bara de meniuri va fi
vizibila in orice moment al navigarii site-ului.

Pentru structurarea unui document HTML in cadre sunt utilizate tagurile:


<frameset>
<frame>
<noframe>
<iframe>
Cadre in HTML
Organizarea documentului in cadre Tagul <frameset>

Un document cu cadre se realizeaza similar unui document HTML oarecare, in


care tagurile <body>, respectiv </body> sunt inlocuite cu tagurile <frameset>,
respectiv </frameset>:
<html>
<head>
...
</head>
<frameset>

</frameset>
</html>

Asadar, tagul <frameset> permite structurarea documentului principal in


cadre. In interiorul perechii <frameset> </frameset> nu pot exista decat elemente:
<frameset>
<frame>
<noframe>
Cadre in HTML
Organizarea documentului in cadre Tagul <frameset>

Tagul <frameset> accepta urmatoarele atribute:


rows primeste ca parametru o lista de valori, separate prin virgula, ce reprezinta inaltimea
cadrelor orizontale ale documentului principal. Numarul de cadre orizontale este dat de
numarul de valori din lista.

Valorile sunt exprimate:


fie prin numere intregi pozitive (inaltime absoluta exprimata in pixeli)
fie prin procente din inaltimea cadrului parinte (inaltime relativa)
fie prin caracterul de puncuatie *, care semnifica o inaltime relativa

Observatii:
Nu se recomanda ca toate valorile sa fie absolute, deoarece browserele pot utiliza
rezolutii diferite, ceea ce poate duce la distorsiuni ale afisarii;
In cazul utilizrii procentelor, suma acestora nu poate sa depaseasca 100%, in caz
contrar, browserul va trunchia toate valorile pana ce suma va fi 100.

cols permite impartirea cadrului curent in sectoare verticale. Parametrii acceptati respecta
aceleasi reguli ca si in cazul atributului rows, numai ca se refera la lungimea cadrului.
Cadre in HTML
Organizarea documentului in cadre Tagul <frameset>

Tagul <frameset> accepta urmatoarele atribute:


border primeste o valoare intreaga nenegativa, reprezentand grosimea, exprimata in pixeli,
a chenarului cadrelor. Implicit, grosimea chenarului este de 5 pixeli. Valoarea 0 a atributului
border inhiba afisarea chenarelor tuturor cadrelor.

bordercolor permite setarea culorii chenarelor cadrelor. Culoarea poate fi specificata fie
printr-un triplet hexa de forma #rrggbb, fie printr-un nume predefinit de culoare.

frameborder controleaza afisarea/ascunderea chenarelor tuturor cadrelor. Atributul


poate primi valorile:
yes sau 1 (se forteaza afisarea chenarelor)
no sau 0 ( se forteaza ascunderea chenarelor)

framespacing permite specificarea distantei, in pixeli, de spatiu liber in jurul tuturor


cadrelor.

Observatie:
Ascunderea unui chenar, prin utilizarea perechii frameborder=no sau border=0, face
ca acesta sa nu mai fie vizibil pentru utilizator. Totusi, in Internet Explorer, utilizatorul poate opta
pentru redimensionarea cadrului, prin operatia Drag and Drop asupra marginii invizibile. Pentru
a inhiba aceasta posibilitate, ascunderea chenarului trebuie insotita de secventa:
framespacing=0.
Cadre in HTML
Definirea cadrelor - Tagul <frame>

Tagul <frame> permite definirea unui cadru in interiorul unui set de cadre.
El are sens numai atunci cand apare in interiorul perechii <frameset> </frameset>.

Atribute acceptate:
src specifica adresa URL a documentului ce va fi incarcat in cadrul respectiv;

name specifica numele cadrului, nume ce va fi utilizat pentru referirea cadrului respectiv
atunci cand se va incarca in el un alt document HTML, prin intermediul unei hiperlegaturi
aflate in alt cadru. Numele este o combinatie de caractere alfanumerice;

marginwidth, marginheight controleaza distanta, exprimata in pixeli, intre continutul


cadrului si chenarul sau;

scrolling atributul controleaza afisarea/ascunderea barelor de defilare (orizontala sau


verticala).

Poate primi valorile:


yes se forteaza afisarea barelor de defilare;
no - se forteaza ascunderea barelor de defilare;
auto - barele de defilare vor fi afisate numai atunci cand este necesar (cand continutul cadrului depaseste
lungimea si/sau inaltimea cadrului va fi afisata bara de defilare orizontala si/sau cea verticala);
Cadre in HTML
Definirea cadrelor - Tagul <frame>

Tagul <frame> permite definirea unui cadru in interiorul unui set de cadre.
El are sens numai atunci cand apare in interiorul perechii <frameset> </frameset>.

Atribute acceptate:
border permite setarea grosimii chenarului cadrului curent. Valoarea atributului border
aflat in interiorul tagului frame este prioritara fata de valoarea aceluiasi atribut aflat in tagul
frameset.

noresize se inhiba utilizatorului posibilitatea de a redimensiona cadrele. Altfel, el are


aceasta posibilitate, prin operaia Drag and Drop asupra marginilor cadrelor.

frameborder controleaza afiarea/ascunderea chenarului cadrului curent. Atributul poate


primi valorile: yes sau 1(se afiseaza chenarul), no sau 0 (se ascunde chenarul);

framespacing permite specificarea distantei, in pixeli, de spatiu liber in jurul cadrului.

bordercolor permite specificarea culorii chenarului cadrului respectiv.


Cadre in HTML
Browserele vechi - Tagul <noframe>

Tagul <noframe> este utilizat in cazul in care se navigheaza cu un browser


mai vechi, care nu suporta cadrele. In aceasta situatie, browserul va afisa continutul
inclus in interiorul perechii <noframe> </noframe>. Daca insa, browserul
recunoaste cadrele, el va ignora coninutul perechii <noframe> </noframe>.

De regula, atunci cand un browser nu recunoaste un tag, nu il interpreteaza.


Acest lucru se poate intampla si in cazul tagurilor <frameset>, <frame>. Este
evident ca daca un browser nu recunoaste tagurile <frameset> si <frame> el nu va
recunoaste nici <noframe>. Insa, va interpreta tagurile pe care le recunoaste, adica, in
acest caz, cele cuprinse intre <noframe> si </noframe>. De fapt, efectul tagului
<noframe> este, in cazul browserelor care recunosc cadre, acela de a ignora continutul
inclus in interiorul perechii <noframe> </noframe>.
Cadre in HTML
Cadre in-line - Tagul <iframe> (in-line frame)

Tagurile <iframe> sunt similare tagurilor <frame>, cu deosebirea ca se


includ in documente HTML obisnuite (nu in documente HTML cu cadre), adica in
interiorul perechii <body> </body>.
Daca un browser nu recunoaste cadre, el va afisa continutul cuprins intre
<iframe> si </iframe>.
Tagul <iframe> accepta aceleasi atribute ca si tagul <frame>, in plus
accepta atribute preluate de la tagul <img>, care controleaza modul de afisare al
cadrului in interiorul documentului.

Atribute acceptate:
A. preluate de la tagul <frame>:
src, name, scrolling, border, bordercolor, frameborder, framespacing, noresize,
marginwidth, marginheight

B. preluate de la tagul <img>:


align, width, height, vspace, hspace
EXEMPLE: Realizarea cadrelor orizontale
<!--index.html--> <!--continut.html-->
<html> <html>
<head> <head>
<title>UTCB</title> </head>
</head> <body>
<frameset rows="150,*,20%"> <p>Specializarile Facultatii de Hidrotehnica sunt: </p>
<frame src="antet.html"> <p>Automatica si Informatica Aplicata; IME; ISPM;
<frame src="continut.html"> ACH.</p>
<frame src="adresa.html"> </body>
</frameset> </html>
</html>

<!--antet.html--> <!--adresa.html-->
<html> <html>
<head> <head>
</head> </head>
<body> <body>
<center> <p align="center"><b>Lacul Tei, nr. 122-124, Telefon:
<h3>UTCB</h3> 021.111.111.</b></p>
<h3>Facultatea de Hidrotehnica</h3> </body>
<h3>Automatica si Informatica Aplicata</h3> </html>
</center>
</body>
</html>
EXEMPLE: Imbricarea cadrelor

<!--index.html-->

<html>
<head>
<title>UTCB</title>
</head>

<frameset rows="120,*,20%">
<frame src="antet.html">

<frameset cols="100,*">
<frame src="meniu.html">
<frame src="desprenoi.html">
</frameset>

<frame src="adresa.html">
</frameset>
</html>
EXEMPLE: Cadre in-line
<html>

<head>
<title>Formate de Imagini</title>
</head>

<body>
<iframe name="cadru" src="Generalitati.html" width="200" height="100"
border="3" align="right">Site realizat cu cadre in-line. Browserul dvs. nu
suporta!</iframe>
<b>Formate de Imagini:
<ul>
<li><a href="bmp.html" target="cadru">BMP</a></li>
<li><a href="jpeg.html" target="cadru">JPEG</a></li>
<li><a href="tiff.html" target="cadru">TIFF</a></li>
</ul>
</b>
</body>

</html>
Intrebari
???
Tehnologii WEB

Cursul 4
Planul lectiei:

Formulare in HTML
Descriere atribute
Elemente de formular
Campuri de editare multilinie
Liste de selectie
Etichetele
Harti de imagini
Exemple
Formulare in HTML
Descriere atribute
Atributul action primeste ca valoare adresa URL a scenariului CGI ce
va primi datele furnizate de utilizator si le va prelucra, generand un raspuns.
Daca atributul action lipseste, datele vor fi trimise la adresa
documentului curent.
Este posibila expedierea datelor furnizate de catre utilizator la o
adresa postala, caz in care atributul action va primi ca valoare adresa de e-
mail respectiva, insotita de prefixul mailto:
Atributul method specifica modul in care va fi trimisa informatia
catre server.
Atributul method poate primi doua valori:
get
post

Datele furnizate de utilizator in formular sunt adaugate la adresa URL


a scriptului CGI, sub forma de perechi de tipul:

<cmp>=<valoare>
Formulare in HTML
Descriere atribute
In cazul valorii get a atributului method, aceste perechi de date sunt
adaugate la sfarsitul adresei URL a scriptului, dupa semnul ?, separate prin
&. Atunci cand trimit un formular catre server, majoritatea browser-elor
afiseaza acest sir.
Exemplu:
Tagul <form action = http://www.utcb.ro/registration
method=get> ce va contine doua campuri de tip text:
campul nume, in care utilizatorul a introdus valoarea Costica
Popescu
si campul email, in care utilizatorul a introdus valoarea
costica@gmail.com va determina transmiterea catre server a
cererii: http://www.utcb.ro/registration ? nume =
PopescuCostica & email = costica@gmail.com

Daca se doreste evitarea afisarii lui, va fi utilizata valoarea post a


atributului method, caz in care sirul este transmis serverului printr-o secventa
HTTP speciala.
Formulare in HTML
Descriere atribute
Atributul name primeste ca valoare numele formularului, in situatia
in care sunt mai multe formulare in document. De asemenea, numele
formularului este util si atunci cand scriptul este scris in JavaScript, pentru a
putea fi referit.
Atributul target primeste ca valoare numele ferestrei in care se va
face afisarea raspunsului emis de server. Daca numele transmis ca parametru
atributului target nu a fost definit anterior, atunci browserul va crea o ferestra
noua cu acest nume. Implicit, browser-ul va afia raspunsul in pagina curenta.
Exista cateva cuvinte cheie ce pot fi transmise ca valoare atributului
target:
_self rspunsul scriptului va fi afiat n fereastra ce conine formularul
_parent rspunsul scriptului va fi afiat n fereastra printe a ferestrei ce conine
formularul
_top - rspunsul va fi afiat n fereastra din vrful ierarhiei de ferestre
_blank - va fi creat o fereastr nou n care va fi afiat rspunsul.
Efectul este similar situaiei in care atributul target a primit valoare
un nume de fereastra ce nu a fost definit anterior.
Atributul title ofera posibilitatea afisarii unui text explicativ de ndata
ce mouse-ul se opreste deasupra formularului.
Formulare in HTML
Elemente de formular
Intre perechea de taguri <form> si </form> sunt definite o serie de
elemente de formular, destinate receptionarii datelor furnizate de utilizator.
Cea mai mare parte a acestora se definesc cu ajutorul tagului
<input>.
Sintaxa generala a tagului input este:
<input type=text/password/hidden/radio/checkbox/submit/reset/button/file/image
name= value= checked size= maxlenght=>

Descriere atribute:
type defineste tipul de element de formular, care poate fi :
text - defineste un camp de editare pentru un cuvant sau o linie de text.
Campurile de editare accepta parametrii:
value
size
maxlength

password defineste un camp de editare a unei parole.


Caracterele introduse de utilizator sunt ascunse, campul de editare
afisand semnul * in locul fiecarui caracter.
Formulare in HTML
Descriere atribute:
Atribute acceptate pentru password(ca si campurile de editare):
value
size
maxlength

radio butoanele radio permit selectarea unei optiuni dintre mai


multe existente.
O optiune este definita printr-un camp radio. Intr-un set de butoane
radio, la un moment dat, o singura optiune poate fi selectata. Pe un formular
pot exista mai multe seturi de butoane radio, gruparea lor intr-un anumit set
realizandu-se prin precizarea unui nume comun (numele este dat de valoarea
atributului name).
Atribute acceptate:
name
value - precizeaza ce valoare va fi trimisa catre server, alaturi de valoarea atributului name,
atunci cand a fost selectata optiunea respectiva. Daca insa nu aceasta este optiunea aleasa
din setul respectiv, atunci informatia oferita de buton nu este trimisa catre server
checked
Formulare in HTML
Descriere atribute:
checkbox defineste un camp de validare. Un asemenea camp are
doua stri: selectat sau neselectat.
Atribute acceptate:
name
value implicit are valoarea on (camp de validare selectat)
checked

submit defineste un buton cu efect predefinit de expediere catre


server a informaiei din formular.
Atribute acceptate:
name
value precizeaza textul afisat pe suprafata butonului. Implicit, titlul butonului este
Submit Query

reset - defineste un buton cu efect predefinit de anulare a informatiei


din formular. Continutul tuturor campurilor vor fi resetate la valoarea
implicita.
Atribute acceptate:
name
value precizeaza titlul butonului. Implicit, acesta este Reset
Formulare in HTML
Descriere atribute:
button defineste un buton de comanda. Actiunea lui este descrisa
printr-un script (JavaScript, Java, VBScript amd.).
Atribute acceptate:
name
value precizeaza titlul butonului
Cu ajutorul acestui element se pot defini butoane cu imagini, caz in
care tagul img, ce defineste imaginea, va fi inclus in interiorul perechii <input
type=button> </input>.

file defineste un element de tip caseta de fisiere, ce contine un camp


de editare unde va fi afisata calea fisierului selectat si un buton de comanda
Browse.
Atribute acceptate:
name
value precizeaza URL-ul fisierului selectat
Formulare in HTML
Descriere atribute:
hidden defineste un camp ascuns (care nu este afisat in formular).
Campurile ascunse sunt utilizate pentru a trimite catre server informatii
suplimentare, ce nu pot fi modificate de utilizator.
Atribute acceptate:
name
value

image plaseaza o imagine activa a carei adresa este introdusa


printr-un atribut src. Apasand pe imagine, formularul va fi trimis, inclusiv
coordonatele pointerului de mouse.
image poate primi atributele:
align ( pentru pozitionarea imaginii relativ la textul inconjurator )
name
src
Formulare in HTML
Descriere atribute:
name defineste numele campului creat. Numele va fi trimis catre
server, alaturi de valoarea sa, pentru a permite executia scriptului.

value precizeaza valoarea implicita a campului. Aceasta valoare va


fi afisata la prima activare a formularului. Utilizatorul o poate modifica sau
poate opta pentru pastrarea ei pentru a fi trimisa serverului.

checked atribut utilizat in cazul casetelor de validare sau a


butoanelor radio. Prezenta lui determina selectarea campului in cauza.

size determina lungimea campului (exprimata in caractere). Atribut


utilizat de campurile de editare.

maxlength fixeaza numarul maxim de caractere ce vor fi acceptate


de catre campurile de editare. Depasirea acestui numar va fi semnalata printr-
un mesaj sonor. Daca valoarea atributului maxlength este mai mare decat
valoarea atributului size, textul introdus in campul de editare va defila catre
stanga.
Formulare in HTML
Exemplu: Formular cu 2 campuri, buton Trimite si buton Sterge
<form action="script.php" method="post">
Nume:<input type="text" name="nume">
Prenume:<input type="text" name="prenume"><br>
<input type="submit" value="Trimite">
<input type="reset value="Sterge">
</form>
Formulare in HTML
Exemplu: Daca se doreste se pot particulariza butoanele din
formular folosind atributul type=image in cadrul etichetei input
si indicand fisierul imagine.
<form action="script.php" method="post">
<input type="image" src="trimite.gif" alt="Trimite">
</form>
Formulare in HTML
Campuri de editare multilinie:
Campurile de editare multilinie se realizeaza cu ajutorul tagului
textarea. Ele permit introducerea si afisarea unui text pe mai multe linii.
Daca lungimea textului depaseste lungimea campului, atunci se va ancora o
bara de defilare orizontala. Daca numarul de linii ale textului depasesc
inaltimea campului, atunci se va ancora o bara de defilare verticala. Textul
introdus intre tagurile textarea va fi afisat in fereastra corespunzatoare din
browser.
Atribute acceptate:
name defineste numele campului
readonly atribut a carui existenta inhiba utilizatorului dreptul de scriere in camp
cols primeste ca valoare un numar intreg pozitiv reprezentand numarul de caractere ce
vor fi afisate pe linie
rows - precizeaza numarul de linii ale campului multilinie
wrap defineste modalitatea de spargere a textului in linii in interiorul campului.
Atributul poate lua valorile:
off (valoarea implicita) Textul este afisat pe un singur rand. Utilizatorul poate trece pe linia
urmatoare apasand tasta ENTER. Textul trimis serverului va contine caracterele de sfarsit de linie
hard Textul se asaza automat pe randuri, lungimea acestora fiind determinata de lungimea
campului. Deasemenea, textul trimis serverului va contine caracterele de sfarsit de linie
soft Textul se asaza automat pe randuri, lungimea acestora fiind determinata de lungimea campului,
insa textul trimis serverului nu va mai contine caracterele de sfarsit de linie
Formulare in HTML
Exemplu: Campuri de editare multilinie.
Formulare in HTML
Liste de selectie:
Listele de selectie permit selectarea uneia sau a mai multe optiuni
dintr-o lista. Ele reprezinta o combinatie intre butoanele radio (selectie
singulara) si campurile de validare (selectie multipla). Deosebirea este aceea
ca utilizarea listelor de selectie nu necesita afisarea tuturor optiunilor, ci
numai a unora dintre ele, deplasarea printre alternative realizandu-se cu
ajutorul unei bare de defilare verticala.
Listele de selecie sunt realizate cu ajutorul tagului <select>.
Atribute acceptate:
name defineste numele campului de selectie.
size stabileste cate elemente ale listei sunt vizibile la un moment dat, restul
optiunilor fiind accesibile prin utilizarea barei de defilare vertical. Implicit,
valoarea atributului size este 1.
multiple prezenta atributului multiple permite selectarea mai multor elemente
ale listei (echivalent campurilor de selectie), altfel, in cazul selectiei singulare, un
singur element al listei poate fi selectat la un moment dat (echivalent butoanelor
de optiune). Atributul multiple nu are efectul dorit in cazul listelor de selectie ce
au valoarea size egala cu 1.
Formulare in HTML
Liste de selectie:
Introducerea opiunilor n lista se realizeaza cu tagul <option>,
pozitionat in interiorul perechii <select> </select>.

Acesta accepta atributele:


name precizeaza numele optiunii
selected prezenta atributului selected in interiorul tagului <option> face ca
optiunea respectiva sa fie selectata la incarcarea formularului. Daca valoarea
atributului size a tagului select este 1, atunci, implicit va fi afisata prima optiune a
listei de selectii (in cazul in care nici o optiune nu are prezent parametrul
selected).
value precizeaza valoarea trimisa catre server la activarea optiunii submit a
formularului; in cazul in care atributul value lipseste, catre server se va trimite ca
valoare chiar textul care urmeaza tagului <option>
Formulare in HTML
Exemplu: Liste de selectie.
Formulare in HTML
Etichetele:
Etichetele reprezinta un element de formular care, atasat butoanelor
radio sau campurilor de validare, face ca selectarea/deselectarea unei optiuni
sa se realizeze si prin apasarea etichetei optiunii respective.

Acest lucru se realizeaza plasand tagul <input type = radio>,


respectiv <input type=checkbox> in interiorul perechii <label
for=identificator> </label>, unde identificator va fi definit in tagul input, ca
valoare a atributului id.
Exemplu: Formular complex -- Rezervarea unei
camere de hotel
<html> <br> <hr align="center">
<input type="checkbox" </td>
<head> name="VederePlaja" value="ON" </tr>
checked>Vedere catre plaja
<title>Rezervare camere hotel</title> </table>
</td>
</head>
</tr>
<p><u>2. Informatii Contact</u></p>
<tr>
<body>
<td><b>Ce modalitate de plata alegeti
<table border="0">
?</b></td>
<form method="POST" <tr>
<td><input type="radio"
action="rezervari.asp" > <td><b>Nume si prenume :</b></td>
name="ModalitatePlata"
<h3><u>Hotel Costica - Formular de value="Numerar" checked>Numerar<br> <input type="text" size="35"
rezervare</u></h3> maxlength="256" name="Nume">
<input type="radio"
<p><u>1. Informatii Generale</u></p> name="ModalitatePlata" </tr>
value="CarteCredit">Carte credit<br> <tr>
<table border="0"> <input type="radio" <td><b>Telefon :</b></td>
<tr> name="ModalitatePlata"
<input type="text" size="35" name="Tel">
value="TransferBancar">Transfer bancar
<td><b>Ce fel de camere doriti </tr>
?</b></td> </td>
</table>
<td><select size="1" name="Camera"> </tr>
<option>Single</option> <tr>
<p><input type="submit"
<option>Double</option> <td><b>Alte observatii</b></td>
value="Rezerva"> <input type="reset"
<option>Apartament</option> </tr>
value="Anuleaza"></p>
</select></font> <tr>
</td> <td>
</form>
</tr> <p align="center"><textarea
name="Observatii" rows="5"
<tr> </body>
cols="39">Introduceti aici optiunile
<td><b>Optiuni camera:</b></td>
dvs.
<td><input type="checkbox" </html>
daca nu este disponibila nici o camera
name="Televizor" value="ON"
conform cererii exprimate
checked>Televizor
!</textarea></p>
Exemplu: Formular complex -- Rezervarea unei
camere de hotel
Formulare in HTML
Harti de imagini:

Sintaxa folosita pentru crearea hartilor de imagini este urmatoarea:


<map name=nume>
<area [shape=forma] coords=x,y, [href=url] [nohref]
</map>
Marcajul <map> este de tip container; harta poate fi ulterior referita
prin numele ei.
<img src=poza.gif usemap=#nume>

Atributele marcajului <area> sunt:


shape - defineste forma regiunii; poate avea valoarea: default(intreaga imagine),
rect, poly, circle (implicit: rect; daca 2 regiuni se suprapun, browser-ul o
considera pe prima din lista).
coords - o lista de perechi de coordonate, despartite prin virgula.
href=url - resursa care va fi apelata cand e dat click pe regiune.
nohref - nu apelez nici o resursa la click.
Formulare in HTML
Harti de imagini:

Coordonatele necesare pentru definirea ariei hartii:


circle - centrul cercului si raza (3 puncte)
poly - lista nodurilor poliliniei, cel mult 100
rect - coordonatele colturilor stanga-sus, dreapta-jos

Imaginea de mai jos are dimensiunea x=100 pixeli, y=50 pixeli.


Formulare in HTML
Harti de imagini:

Codul folosit pentru definirea hartii retea este urmatorul:

<map name=retea">
<area shape="rect" coords="1,1,50,25" href="leg1.html">
<area shape="rect" coords="50,1,100,25" href="leg2.html">
<area shape="rect" coords="1,25,50,50" href="leg3.html">
<area shape="rect" coords="50,25,100,50" href="leg4.html">
</map>

<img src="auto1.gif" usemap="#retea">


Intrebari
???
Tehnologii WEB

Cursul 5
Planul lectiei:
URI Uniform Resource Identifier
URL (Uniform Resource Locator)
URN (Uniform Resource Name)
IRI (Internationalized Resource Identifier)
Arhitectura Web-ului
Situri & aplicatii Web
Serverele de aplicatii
Platforme Web
Medii de dezvoltare
Cookie-uri
Arhitectura orientata spre servicii
Securitatea aplicatiilor WEB
Tag-urile DIV i SPAN
Tag-ul DIV
Tag-ul SPAN
Diferenta dintre DIV si SPAN
URI Uniform Resource Identifier
URI = URL + URN
Identificatorul uniform al resurselor este format din
combinarea localizatorului ce identifica resursele prin reprezentarea
mecanismului de accesare si numele prin care sunt identificate resursele.
Resursa poate fi definita ca si un lucru care poseda o identitate;
Identificator poate fi reprezentat ca si un obiect care joaca rolul
unei resurse (secventa de caractere avand o sintaxa precisa);
Uniformitate calitate prin care se permite o interpretare
semantica uniforma a mai multor conventii sintactice comune, desemnand
identificatori ai unor resurse eterogene.

URL (Uniform Resource Locator) identifica resursele prin


reprezentarea mecanismului de accesare (adresa de retea, domeniu simbolic).

Exemplu:
http://www.utcb.ro/~hidro/aia/
mailto:contact@urcb.ro
ftp://ftp.utcb.ro/doc/fis.txt
tel:+40212121070
URI Uniform Resource Identifier
URI = URL + URN
URN (Uniform Resource Name) identifica resursele prin nume,
intr-o forma persistenta, chiar daca resursa este inaccesibila sau a disparut.
Exemplu:
urn:utcb.ro:Info
urn:mozilla:package:communicator
urn:schemas-microsoft-com:datatypes

URL-urile pot fi absolute sau relative.


Exemplu:
URL absolut: http://www.utcb.ro/~hidro/cv.html
URL relativ: ../../cvb.css

Fragmente dintr-un continut pot fi referite prin URIref (referinte,


fragment identifiers).
Exemplu:
URI#URIref: web.html#laborator

In schimb, o resursa Web poate fi identificata de unul sau mai multe


URI-uri, cu conditia ca utilizarea URI-urilor sa fie consistenta.
URI Uniform Resource Identifier
URI = URL + URN

IRI (Internationalized Resource Identifier) este complementar


URI-ului, diferenta constand in faptul ca IRI permite folosirea unor caractere
din seturi de caractere mai largi decit ASCII (de exemplu, Unicode).

Exemplu:
http://culoare.ro/ros&#xE9 este identic cu URI-ul
http://culoare.ro/ros&#233 (in HTML/XML) sau
http://culoare.ro/ros&#xE9 (in XML) si poate fi reprezentat vizual prin
http://culoare.ro/ros
HTTP (HyperText Transfer Protocol)
HTTP (HyperText Transfer Protocol) este un protocol fiabil de
tip cerere/raspuns, bazat pe protocolul TCP/IP. Portul standard de acces este
80.
Arhitectura protocolului este de tipul Server Web (Apache, MS
Internet Information Services etc.) si Client Web (navigator, browser, robot ---
Netscape, Mozilla (Firefox), Internet Explorer, Opera, Teleport, RSS Reader,
iTunes).
HTTP (HyperText Transfer Protocol)
HTTP (HyperText Transfer Protocol)

Mesaj reprezinta unitatea de baza a unei comunicatii HTTP (cerere sau


raspuns);
Intermediar:
Proxy cu rol atat de server, cat si de client;
Exemplu: squid (Linux) portul folosit: 8080
Poarta intermediar care ascunde serverul de origine, clientul nestiind acest lucru;
Tunel cu rol de retransmitere (eventual criptata) a mesajului.
Cache depozit local de stocare (in memorie, pe disc) a mesajelor (datelor) la
nivel de server/client.
HTTP (HyperText Transfer Protocol)
HTTP (HyperText Transfer Protocol)

Metode HTTP
GET cerere de acces la reprezentarea unei resurse (e.g., cod HTML, CSS, SVG, PDF,);
HEAD similara cu GET, dar in mod uzual se doresc doar meta-informatii;
POST utilizata pentru trimiterea unor entitati (date, actiuni) spre server (e.g., datele dintr-
un formular);
PUT plaseaza reprezentarea unei resurse pe server;
OPTIONS furnizeaza optiunile dialogului intre client & server (e.g., negocierea
reprezentarii);
DELETE sterge o resursa (reprezentarea ei) de pe server.

Codificarea setului de caractere (encoding) este realizata respectand


standardele ISO-8859-1 (implicit) si ISO-8859-2. Formatul reprezentarii caracterelor
poate fi: text (HTML, text obisnuit, XML) sau binar.
Arhitectura Web-ului
Arhitectura Web-ului
Web-ul este spatiu informational compus din elemente de interes, numite
resurse, desemnate de identificatori globali URI (Uniform Resource Identifiers)
Identificarea
Interactiunea
Reprezentarea prin formate de date

Identificarea resurselor
Fiecare resursa trebuie sa fie adresabila
Fiecarei resurse i se asigneaza un URI distinct (reducerea coliziunilor)
Un URI va avea un proprietar (persoana, organizatie, specificatie,...)
De incurajat utilizarea consistenta a URI-urilor
Opacitatea URI natura unei resurse nu este data de adresa (URI), ci de reprezentare
Identificatorii de fragment duc la identificarea indirecta a unei resurse secundare legata de resursa
initiala

Reprezentarea prin formate de date


Arhitectura Web-ului nu impune utilizarea unor formate de date, dar incurajeaza refolosirea celor
existente
Aspecte importante: formate binare vs. textuale, controlul versiunilor, extensibilitatea, compunerea
formatelor, separarea continutului, prezentarii & interactiunii
Arhitectura Web-ului
Arhitectura Web-ului
Web-ul este spatiu informational compus din elemente de interes, numite
resurse, desemnate de identificatori globali URI (Uniform Resource Identifiers)
Identificarea
Interactiunea
Reprezentarea prin formate de date

Interactiunea
Agentul Web este reprezentat de persoane sau software ce actioneaza pe Web
Agentul utilizator este reprezentat de software ce actioneaza in numele unui utilizator (uman)
Agent software este reprezentat de servere, proxy-uri, roboti, navigatoare, player-e multimedia etc.
Comunicarea intre agenti implica URI-uri, mesaje si date, via protocoale (HTTP, FTP, SOAP, SMTP)
Un mesaj poate fi compus din date & meta-date (date descriind date)
Accesul la o resursa se realizeaza prin URI (dereferentiere), eventual implicind mai multi pasi, rezultand o
reprezentare a resursei
O reprezentare reprezinta datele care codifica informatia despre starea unei resurse
Creatorilor resurselor trebuie sa li se permita controlul asupra metadatelor atasate reprezentarilor
resurselor
Preluarea unei resurse (retrieval) trebuie sa fie sigura
Managementul reprezentarii proprietarul unui URI ar trebui sa ofere reprezentari ale resursei
desemnate, intr-un mod consistent si predictibil
Arhitectura Web-ului
Situri & aplicatii Web
Situl Web este reprezentat de un sistem pe care ruleaza un server
Web gazduind o serie de pagini (documente) WWW inrudite ale unei
organizatii, companii sau persoane.
Ofera informatii unitare (scopuri comune)
Are asociata o adresa publica (vizibila), bazata pe un domeniu Internet
Serverul Web poate gestiona simultan mai multe situri gazduire
virtuala
Poate fi disponibil in intranet sau extranet
Aplicatia Web este reprezentata de o colectie interconectata de
pagini Web cu continut generat dinamic, menita a oferi utilizatorilor o
functionalitate specifica.
Interactiunea dintre aplicatie si utilizatori are loc printr-o interfata Web
Uzual, sit Web = aplicatie Web

Exemple: Amazon, Expedia, Flickr, GESCO, GMail, Kartoo,


PHPMyAdmin, webmin, Wikipedia etc.
Arhitectura Web-ului
Arhitectura generala a unei aplicatii Web
Arhitectura Web-ului
Arhitectura generala a unei aplicatii Web
Serverele de aplicatii ofera posibilitatea de a include cod (script)
direct in cadrul documentelor Web, cod invocat pe server ce conduce la
generarea de continut dinamic pe partea de server.
Maniera de includere depinde de serverul de aplicatii Web:
<% ... %> pentru ASP / ASP.NET
<% ... %> pentru JSP (Java Server Pages)
<?php ... ?> pentru PHP

Mai general: <script language=...>...</script>

Facilitati oferite de cadrul de lucru pus la dispozitie de serverul de


aplicatii:
Limbaj(e) de programare
Suport pentru baze de date
Suport pentru interactiunea Web
Suport pentru cookie-uri & sesiuni
Suport pentru procesari XML
Medii de dezvoltare
Alte facilitati particulare
Arhitectura Web-ului
Arhitectura generala a unei aplicatii Web
Limbaj(e) de programare
VBScript & JScript (ASP)
limbajele .NET (ASP.NET) ASP.NET este independent de limbaj, fiind parte a .NET
Framework
Java (servlet-uri, JSP)
Python (Zope)
Ruby (Ruby on Rails)
Altele

Platforme Web
Arhitectura Web-ului
Arhitectura generala a unei aplicatii Web
Medii de dezvoltare

Suport acordat inginerilor software


Aplicatii N-tier
Se incurajeaza folosirea sabloanelor de proiectare (design patterns): Container, MVC
(Model-View-Controller), Proxy, Configuration Parameters, Invocation Context,
Unitati de testare automata cadrul general dat de XUnit (JUnit, PHP Unit, NUnit,...)
Generarea automata de documentatii, in diverse formate
Suport pentru source control code review, versioning (CVS, Subversion,)
Pot folosi o paradigma (e.g., agile programming)
Arhitectura Web-ului
Arhitectura generala a unei aplicatii Web
Ingineria Web
Arhitectura Web-ului
Cookie-uri
Cookie-ul este un mecanism standard care permite ca un server Web
sa trimita anumite informatii pe calculatorul unui client (utilizator), prin
intermediul browser-ului, sa ceara clientului sa stocheze aceste informatii
pentru ca, ulterior, navigatorul sa returneze informatiile spre serverul WWW.
Este un mijloc persistent de stocare a datelor pe masina clientului
Web cu scopul de a fi accesate ulterior de pe server.

Utilizari:
memorarea preferintelor utilizatorilor
stocarea informatiilor de autentificare
tranzactii in cadrul comertului electronic
completarea automata a formularelor
managementul sesiunilor Web
si multe altele

Tipuri:
Cookie-uri persistente
nu vor fi distruse la inchiderea navigatorului, ci vor fi memorate intr-un fisier, perioada lor
de viata fiind stabilita de creatorul cookie-urilor
Cookie-uri nepersistente
dispar la inchiderea browser-ului
Arhitectura Web-ului
Cookie-uri
Un cookie consta dintr-o pereche nume=valoare. Valoarea este un
sir de caractere codificat in maniera URL-urilor.
Datele referitoare la un cookie vor fi receptionate de navigator care
mentine o lista de cookie-uri apartinind serverului care le-a trimis. Un cookie
este trimis unui client incluzind campul-antet Set-Cookie intr-un raspuns
HTTP.

Exemplu:
Set-Cookie: nume=valoare; expires=data; path=cale; domain=domeniu; secure
expires data si timpul cand cookie-ul va expira si va fi sters de pe disc
domain numele simbolic al serverului care a generat cookie-ul
path specifica un subset de URL-uri din domeniul corespunzator unui cookie
secure cookie-ul este transmis doar daca tranzactia este sigura (via HTTPS)

Un cookie e transmis doar daca intruneste toate conditiile de


validitate (se potrivesc domeniul, calea de directoare, timpul de expirare si
securitatea canalului de comunicatie). Serverul va primi de la client, in antetul
HTTP, o linie de forma: Cookie: nume1=valoare1; nume2=valoare2.
Arhitectura Web-ului
Sesiuni
HTTP este un protocol stateless, neputand oferi informatii daca cereri
succesive provin de la acelasi client (eventual, de la aceeasi instanta a
navigatorului). Apare necesitatea de a prezerva anumite date de-a lungul mai
multor accesari inrudite.

Exemple: starea cosului de cumparaturi, formulare Web completate in


mai multi pasi, paginarea continutului, starea autentificarii etc.

Orice vizitator al sitului va avea asociat un identificator unic session


ID (SID), stocat intr-un cookie ori propagat prin URL.
Unele servere de aplicatii garanteaza integritatea sesiunii si dupa o
restartare (a serverului ori a aplicatiei). Unei sesiuni i se pot asocia diverse
variabile sa fie mentinute intre accesari consecutive.

O sesiune se poate inregistra (initia) implicit sau explicit, in functie de


serverul de aplicatii sau de configuratia stabilita.
Arhitectura Web-ului
Sesiuni -- Exemplu:

ASP.NET vezi HttpSession (System.Web)


Exemplul1:
nume = Session["Nume"].ToString ();
Ofera suport si pentru evenimente de sesiune

PHP functiile session_start(), session_register(), session_id(),


session_unregister(), session_destroy()
Exemplul2:

<?php
session_start();
if (!isset($_SESSION['accesari'])) {
$_SESSION['accesari'] = 0; } else {
$_SESSION['accesari']++; }
?>
Arhitectura Web-ului
Arhitectura orientata spre servicii
SOA Service Oriented Architecture este un stil arhitectural de
dezvoltare de aplicatii considerate drept servicii ce vor fi invocate de alte aplicatii.
Arhitectura orientata spre servicii este arhitectura software ce defineste
utilizarea de servicii, oferind functionalitati solicitate de utilizatori. Resursele sunt
disponibile pentru o suita de servicii independente ale caror implementari nu
trebuie sa fie cunoscute.
Componentele sistemului in ansamblu au un grad mare de independenta
(de-coupling). Serviciile pot fi recompuse/orchestrate conform cerintelor.

Principii de baza:
serviciile sa partajeze un contract specificat riguros (formal)
serviciile sa fie slab conectate (loosely coupled)
serviciile sa ascunda detaliile de implementare
serviciile sa ofere suport pentru compunerea cu alte servicii (composability)
serviciile sa poata fi reutilizate
serviciile sa se execute ntr-un mod autonom
serviciile sa nu depinda de starea comunicarii (statelessness), cantitatea de informaie
specifica unei activitati ce trebuie retinuta fiind minimala
serviciile sa poata fi facil descoperite (discoverability)
Arhitectura Web-ului
Securitatea aplicatiilor WEB
Confidentialitatea - imposibilitatea unei terte entitati sa aiba acces la datele
vehiculate intre doi receptori
Solutii:
conexiuni private intre cele 2 puncte terminale ale canalului de comunicatie; datele circula printr-
un tunel oferit de o retea privata virtuala (VPN Virtual Private Network)
criptarea datelor prin diverse tehnici (biblioteci specializate si/sau oferite de mediile de
dezvoltare)

Autentificarea - mecanism ce permite utilizatorilor sa acceseze un serviciu dupa


verificarea identitatii utilizatorului (uzual, pe baza de nume + parola)
Solutii:
serverul Web ofera suport pentru autentificari de baza sau bazate pe algoritmi de tip digest
(e.g.,MD5)
folosirea/implementarea serviciilor de autentificare (SAML - Security Assertion Markup
Language)

Autorizarea - specifica actiunile (rolurile) pe care un utilizator le poate realiza,


asociata autentificarii; se permite administratorului definirea politicilor de control al
accesului la servicii
Solutii:
drepturi de acces (permisiuni) + liste de control al accesului (ACL Access Control List)
controlul accesului bazat pe roluri (RBAC Role-Based Access Control)
tehnici de tip SSO (Single Sign-On)
Arhitectura Web-ului
Securitatea aplicatiilor WEB
Integritatea - in acest context, implica detectarea incercarilor de modificare
neautorizata a datelor transmise
Solutii:
algoritmi de tip digest
semnaturi digitale (stocate, eventual, in format XML XML Signature); pot fi vehiculate si
prin mesaje SOAP

Nerepudierea - expeditorul mesajului nu poate afirma ca nu l-a trimis


Solutii:
certificate digitale:
stocheaza datele privind identitatea unei entitati detinatoare a unui secret (parola, serie a cartii de
credit, certif. digital)
emise de o autoritate de certificare (CA Certification Authority)
verificate de o autoritate de inregistrare (RA Registration Authority)
servicii PKI via XKMS (XML Key Management Specification)

Disponibilitatea - o anumita resursa sa poata fi accesata la momentul oportun


Cauze ale indisponibilitatii:
atacuri de refuz al serviciilor DoS (Denial Of Service)
atacuri distribuite de tip DDoS (Distributed DoS)
Arhitectura Web-ului
Securitatea aplicatiilor WEB
Intimitatea - confundata, deseori, cu confidentialitatea, vizeaza drepturile ce
trebuie respectate privind caracterul (subiectul) datelor vehiculate
Brese:
stocarea necorespunzatoare a datelor la nivel de server (information disclosure)
atacuri de tip XSS (Cross-Site Scripting)
atacuri de tip phishing
configurarea necorespunzatoare a sistemelor
Tag-urile DIV i SPAN
Tag-urile DIV i SPAN
DIV si SPAN sunt elemente HTML utlizate exclusiv pentru a pastra
informatia CSS. In timp ce DIV asigura o linie noua inainte si dupa continut
(similar cu paragraf), SPAN nu asigura acest rezultat.
Sintax:
<div> ...</div>
<span> ... </span>

Tag-ul DIV creaza sectiuni de blocuri in pagina, a caror forma si


grafica de continut pot fi manipulate pentru fiecare separat. Are doar un
singur atribut HTML - align (pt. aliniere pe orizontala) care poate avea
urmatoarele valori: left (stanga), right (dreapta), center (centru), justify
(distanta textului fata de margini egala).

Tag-ul SPAN creaza posibilitatea modificarii separate a unei portiunii


dintr-un context, putand fi folosit si ca o "clasa" cu CSS. Singur nu are nici un
efect vizual propriu si nu foloseste nici un atribut HTML special.
Tag-urile DIV i SPAN
Tag-urile DIV i SPAN
Chiar daca folosite singure, DIV si SPAN nu au nici un efect major, in
combinatie cu CSS pot crea aspecte grafice importante. Pentru aceasta,
ambele pot folosi atributul style (cu proprietati CSS) ori atributele id sau
class ca identificator pentru stiluri CSS.

Exemplu:
CSS:
div {background-color: #66FFFF}
span.color {color: red}

HTML:
<div>Acest div este tratat similar cu un paragraf,dar
<span class="color">acest span</span> nu este tratat ca un
paragraf.</div>
Tag-urile DIV i SPAN
Tag-ul DIV
Tag-ul <div> ... </div> este unul din cele mai folosite elemente HTML,
aceasta deoarece in combinatie cu proprietati CSS poate crea efecte grafice
deosebite, iar in interiorul lui pot fi incluse oricare elemente HTML: tabele,
formulare, marcatori, linii sau alte DIV-uri. Cadrul in care acestea sunt adaugate
poate avea propriul fundal (background), lungime, inaltime si margini cu diferite
linii.
Iata un exemplu in care avem 2 div-uri, unul contine un formular iar
celalalt o lista "<ul> ... </ul>", fiecare DIV cu proria culoare de fundal, dimensiuni
stabilite si margini diferite.
<div style="width:250px; Alt DIV
background:#aaee88; border:1px solid <div style="width:180px;
blue;"> background:#88aafe; border:5px outset
<form action="" method="post"> #888888;">
Nume: <input <ul>
type="text"></input><br> <li>Linie 1</li>
E-mail:<input <li>Linie 2</li>
type="text"></input><br> <li>Linie 3</li>
<input type="submit" </ul>
value="Trimite"></input> </div>
</form>
</div>
Tag-urile DIV i SPAN
Tag-ul DIV
In atributul "style" sunt specificate proprietatile CSS care stabilesc
aspectul grafic al fiecarui DIV (lungime in pixeli, fundal si bordura).
Codul va afisa intr-o pagina web urmatorul rezultat:

Un alt aspect important este si faptul ca putem pozitiona continutul


din interiorul tag-ului <div> ... </div> oriunde in pagina, folosind
proprietati CSS precum:
position - care poate lua valorile: static, relative, fixed sau absolute.
margin - care stabileste distanta dintre marginea cadrului sectiunii (blocul) DIV si
elementele din jurul lui.
Tag-urile DIV i SPAN
Tag-ul DIV
Iata un exemplu in care, prin folosirea mai multor DIV-uri pozitionate
suprapus, putem afisa in pagina un titlu cu aspect grafic deosebit. Codul este
urmatorul:

<div style="position:relative; font-size:21px;">


<div style="position:absolute; margin-top:-1; margin-left:-2;
color:white;">Titlu - Exemplu</div>
<div style="position:absolute; margin-top:1; margin-left:2;
color:black;">Titlu - Exemplu</div>
<div style="position:absolute; margin-top:0; margin-left:0;
color:silver;">Titlu - Exemplu</div>
</div>

In acest exemplu avem un prim DIV cu atributul "style" in care avem o


proprietate de pozitionare relativa (pt. a pozitiona toate celelalte elemente pe care
el le incadreaza dupa contextul scris anterior) si o alta proprietate pentru marimea
textului. In interiorul acestui DIV avem alte 3 div-uri, pozitionate absolut si care
incadreaza fiecare cate un text identic.
Tag-urile DIV i SPAN
Tag-ul DIV
Prin pozitionarea absoluta div-urile se suprapun, la o distanta stabilita
de proprietatile "margin-top" si "margin-left", iar prin culoare diferita (cu
proprietatea "color") data textului din fiecare "div" va apare in pagina web
urmatorul rezultat:

Pentru a folosi tag-urile DIV eficient si cu rezultate deosebite este


necesar sa cunoasteti proprietatile CSS de baza (pentru fonturi, pozitionare,
margini, borduri, background).
Tag-urile DIV i SPAN
Tag-ul SPAN
Cu tag-ul <span> .. </span> puteti adauga stiluri grafice unei
anumite portiuni dintr-un context. Pentru aceasta trebuie folosit impreuna cu
proprietati CSS care pot fi adaugate printr-un atribut "style" in interiorul
etichetei "<span>" (sau in foi de stil).
Pentru a intelege mai bine, iata un exemplu in care se scoate in
evidenta anumite cuvinte dintr-un text. Pentru aceasta incadram cuvintele
respective intr-un tag SPAN caruia ii adaugam proprietatile dorite, ca in
exemplul urmator:
Aceasta este o lectie din <span style="background:#88fe88; font-
weight:bold;">Cursul Tehnologii WEB</span> de la UTCB.

am adaugat portiunea din context intr-un tag SPAN pentru a-i putea aplica proprietatile
grafice dorite si care nu afecteaza restul continutului.
astfel, prin proprietatile adaugate in "style" (background:#88fe88; si font-
weight:bold;), sunt modificate numai 3 cuvinte din propozitie.
Tag-urile DIV i SPAN
Tag-ul SPAN
Tag-ul SPAN poate fi folosit si ca o clasa pentru CSS. Astfel, proprietatile
adaugate elementului "span" intr-o foaie de stil vor fi transferate tuturor
elementelor din pagina care sunt incadrate in tag-uri "<span> ... </span>".
Iata un exemplu:

<html> SPAN</span> in interiorul frazei.</h4>


<head> <ul>
<title>Titlul</title> <li>Linia 1</li>
<style type="text/css"> <li><span> Linie 2, in span
span { </span></li>
border:2px solid red; <li>Linia 3</li>
padding:1px; <li><span> Linie 4, in span
color:#1111fe; </span></li>
} <li>Linia 5</li>
</style> </ul>
</head> </body>
<body> </html>
<h4>Exemplu de <span>text cu eticheta
Tag-urile DIV i SPAN
Tag-ul SPAN
Tag-ul SPAN poate fi folosit si ca o clasa pentru CSS. Astfel, proprietatile
adaugate elementului "span" intr-o foaie de stil vor fi transferate tuturor
elementelor din pagina care sunt incadrate in tag-uri "<span> ... </span>".

observati cum a fost adaugat elementul "span" in tag-ul "<style> ... </style>" din
sectiunea HEAD a codului HTML. Acest element face referire la toate tag-urile
"<span>...</span>" din document si le transmite aceleasi proprietati.
acest cod va afisa intr-o pagina web urmatorul rezultat:
Tag-urile DIV i SPAN
Diferenta dintre DIV si SPAN
Diferenta dintre DIV si SPAN este faptul ca DIV incadreaza o sectiune
din document sub forma unui bloc, iar SPAN incadreaza o portiune din context
sub forma de linii.
Iata un exemplu din care se poate intelege mai bine: atribuim aceeasi
proprietate grafica (bordura rosie) unui tag DIV si unui tag SPAN.

<div style="border:1px solid #fe1111;">


Fraza pe mai multe linii, <br>
continua cu linia a doua, <br>
se termina cu linia a treia.
</div>
<br>
- Acum cu SPAN:<br><br>
<span style="border:1px solid #fe1111;">
Fraza pe mai multe linii, <br>
continua cu linia a doua, <br>
se termina cu linia a treia.
</span>
Tag-urile DIV i SPAN
Diferenta dintre DIV si SPAN

Observati diferenta prin modul in care este afisata bordura. Pentru


DIV aceasta incadreaza exteriorul sectiunii (blocul) div-ului, iar pentru SPAN
bordura este afisata pe fiecare linie. De aceea este indicata folosirea tag-ului
"<span></span>" pentru continut din interiorul unei linii.

Cand aveti mai multe elemente <div></div> si <span></span> in


pagina, este indicat folosirea atributului "id" sau "class". Acestora le acordati
proprietati CSS o singura data in sectiunea HEAD sau intr-un fisier CSS
extern. Este mai eficient decat sa scrieti in fiecare "<div>" si "<span>" cate un
atribut "style".
Intrebari
???
Tehnologii WEB

Cursul 6
Planul lectiei:
CSS - Cascading Style Sheets
Beneficiile sintaxei
Structura CSS
Nivelul 1 sau inline
Nivelul 2 sau embedded
Nivelul 3 sau fisier extern
Comenzile id si class
Stiluri pentru fonturi
Atribute pentru fonturi
Stiluri pentru legaturi
Stiluri pentru fundal
Pozitionarea prin CSS
CSS - Cascading Style Sheets
Descriere
CSS, prescurtarea de la Cascading Style Sheets, sunt etichete
folosite pentru formatarea paginilor web (de exemplu formatare text,
background sau aranjare in pagina, etc.).
CSS (Cascading Style Sheets) este un standard pentru formatarea
elementelor unui document HTML. Stilurile pot fi declarate in interiorul unui
document HTML prin intermediu tagului <style> i/sau atributului style sau
se pot ataa elementelor HTML prin intermediul unor fiiere externe. CSS se
poate utiliza i pentru formatarea elementelor XHTML, XML i SVGL

Beneficiile sintaxei CSS sunt:


formatarea este introdusa intr-un singur loc pentru tot documentul;
editarea rapida a etichetelor;
datorita introducerii intr-un singur loc a etichetelor se obtine o micsorare a
codului paginii, implicit incarcarea mai rapida a acesteia.

Sintaxa CSS este structurata pe trei nivele:


nivelul 1 fiind proprietatile etichetelor din documentul HTML - tip inline
nivelul 2 este informatia introdusa in blocul HEAD - tip embedded
nivelul 3 este reprezentat de comenzile aflate in pagini separate - tip externe
CSS - Cascading Style Sheets
Sintaxa CSS
Cea mai mare importanta (suprascrie orice alt parametru) o are
sintaxa de nivelul 1 iar cea mai mica importanta o are cea de nivelul 3.
Comenzile CSS de nivel 1 sau inline sunt cele mai folosite, ele
suprascriind orice alte comenzi CSS. Sunt amplasate in interiorul etichetelor
HTML aflate in zona BODY si au sintaxa:
<eticheta style="codul CSS dorit">
...textul sau obiectul asupra caruia este aplicat codul CSS...
</eticheta>

Comenzile de nivel 2 sau embedded sunt cele gazduite oriunde


intre perechea de etichete <head> si </head> conform sintaxei:
<style type="text/css">
<!
... comenzi CSS ... (selector {propr1:val1; propr2:val2;})
-->
</style>

,unde style - specifica unde incepe si unde se termina blocul CSS iar
type, impreuna cu <!-- ... --> sunt folosite pentru a ascunde de browserele
vechi, care nu cunosc sintaxa CSS, continutul blocului style.
CSS - Cascading Style Sheets
Exemplu CSS de nivel 2:
<html>
<head>
<title>Exemplu</title>
<style type="text/css">
<!--
p{
font-family: arial;
font-size: 20px;
font-style: italic;
font-weight: 800;
}
-->
</style>
</head>
<body>
<p>Text scris cu Arial, 20px, italic, 800</p>
Text negru
</body>
</html>
CSS - Cascading Style Sheets

Folosirea unui fisier extern sau nivel 3 care sa contina comenzi


CSS este foarte practica deoarece poate fi utilizat in mai multe cazuri (mai
multe fisiere HTML pot folosi acelasi fisier extern CSS) eliminand timpul
necesar introducerii codului corespunzator in fiecare pagina si totodata
editarea lor intr-un singur loc pentru mai multe fisiere. Extensia acestor fisiere
este .css.

Legatura paginilor HTML cu fisierele extene CSS se face prin


introducerea urmatoarei linii: <link rel="stylesheet" type="text/css"
href="fisier_css.css">

Atributele indica urmatoarele:


rel - fisierul este tip styleshhet
type - tip text ce contine comenzi CSS
href - fisierul sau adresa fisierului CSS.
CSS - Cascading Style Sheets

Pentru a utiliza un stil definit intr-un fisier extern se procedeaza


astfel:
se creaza un fisier care sa contina numai descrierea stilurilor si se salveaza
cu extensia .css. Continutul acestui fisier coincide cu continutul unui bloc
<style>...</style> , fara ca acesti delimitatori sa fie inclusi;
in fisierul HTML care utilizeaza stilurile definite in fisierul creat la pasul
anterior , se include in blocul <head>...</head> o eticheta <link>, conform
cu linia de cod prezentata anterior, avand trei atribute:
atributul rel cu valoarea "stylesheet";
atributul href avand ca valoare adresa URL a fisierului creat la primul pas ;
atributul type cu valoarea "text/css".

Se utilizeaza titlurile definite in fisierul extern ca si cum ar fi definite


in fisierul HTML curent intr-un bloc <style>...</style>.
CSS - Cascading Style Sheets
Exemplul 1: CSS de nivel 3:
Pentru exemplul de mai jos, s-a construit un stil definit intr-un fisier
extern, denumit ex1.css .
<html>
<head>
<link rel="stylesheet" type="text/css" href="ex1.css" />
</head>
<body>
<h1>This header is 36 pt</h1>
<h2>This header is blue</h2>
<p>This paragraph has a left margin of 50 pixels</p>
</body>
</html>

Observatii: Fundalul documentului creat va fi galben, pentru h1 se va utiliza un font


cu marimea de 36pt, pentru h2 textul va avea culoarea albastra, iar pentru editarea
paragrafului se va utiliza aliniat stanga, cu marginea de 50 de pixeli.

Fisierul extern care contine stilul de nivelul 3 este salvat cu numele


ex1.css si are urmatorul continut:
body {background-color: yellow}
h1 {font-size: 36pt}
h2 {color: blue}
p {margin-left: 50px}
CSS - Cascading Style Sheets
Exemplul 2: CSS de nivel 3:
Pentru exemplul de mai jos, s-a construit un stil definit intr-un fisier
extern, denumit ex2.css.
<html>
<head>
<link rel="stylesheet" type="text/css" href="ex2.css" />
</head>
<body>
<h1>This is a header 1</h1>
<hr />
<p>You can see that the style sheet formats the text</p>
<p><a href="http://www.w3schools.com" target="_blank">This is a
link</a></p>
</body>
</html>

Observatii: Fundalul documentului creat va fi de culoarea bronzului (tan), pentru h1


se va utiliza un font cu marimea de 20pt si culoarea maroon, iar pentru hr se va folosi
culoarea navy; Pentru editarea paragrafului se va utiliza aliniat stanga, cu marginea
de 15 de pixeli si marimea fontului de 11pt. De asemenea, link-ul va ave urmatoarea
caracteristica: culoarea generala verde, culoarea dupa vizitare galbena, culoarea la
activare albastra si culoarea la planare (hover) va fi neagra.
CSS - Cascading Style Sheets
Exemplul 2: CSS de nivel 3:

Fisierul extern care contine stilul de nivelul 3 este salvat cu numele


ex2.css si are urmatorul continut:
body {background-color: tan}
h1 {color:maroon; font-size:20pt}
hr {color:navy}
p {font-size:11pt; margin-left: 15px}
a:link {color:green}
a:visited {color:yellow}
a:hover {color:black}
a:active {color:blue}

Este permisa folosirea comentariilor in CSS ca si in HTML:


/* Acesta este un comentariu in CSS */
CSS - Cascading Style Sheets
id si class sunt comenzi care dau unei formatari CSS un nume. Se
folosesc atunci cand dorim sa aplicam un style de formatare unei anume zone.
Pentru compatibilitate cu versiunile anterioare de browsere, numele asociate
zonelor nu vor contine caracterul _ .
Elementul id se aplica unui style de format o singura data sau la o
singura eticheta HTML, plasandu-se un nume acelui style. Acest element
necesita existenta comezilor CSS in zona HEAD sau intr-un fisier extern.

Exemplu: folosirea elementului id


<html>
<head>
<title>Exemplu 2_1</title>
<style type="text/css">
<!-- #albastru{color: #0000FF;}-->
</style>
</head>
<body>
<p id="albastru">Text albastru introdus prin id "albastru"</p>
Text negru
</body>
</html>
CSS - Cascading Style Sheets
Elementul class este similar cu id dar spre deosebire de acesta poate
fi folosit de mai multe ori sau pentru zone mai mari. Ca si la id necesita
existenta comezilor CSS in zona HEAD sau intr-un fisier extern.

Exemplu: folosirea elementului class


<html>
<head>
<title>Exemplu 2_2</title>
<style type="text/css">
<!-- .rosu{color: #FF0000;}-->
</style>
</head>
<body>
<p class="rosu">Primul text rosu introdus prin class "rosu"</p>
Text negru
<p class="rosu">Al doilea text rosu introdus prin class "rosu"</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

Aceste elemente specifica argumentul fontului care se asociaza unui


element HTML, fiind incluse ori in zona HEAD ori in interiorul etichetei dorite.
In cazul de fata se remarca asemanarea cu eticheta font din HTML care accepta
argumentele type, style, size si weight.

font-family este de fapt o lista de fonturi din care browserul va folosi in


ordinea in care le recunoaste (primul folosit va fi primul din lista, daca nu
este recunoscut il foloseste pe al doilea si tot asa mai departe). Este
recomandat ca ultima pozitie din lista sa fie un font generic (de exemplu
serif, sans-serif sau monospace).

In situatia in care numele fontului este format din doua cuvinte se incadreaza
intre ghilimele duble pentru ca browserul sa le interpreteze impreuna.
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

Exemplu: CSS introdus in HEAD, aplicat etichetei p. Browserul nu


recunoaste primele doua fonturi din lista, folosindu-l pe al treilea
<html>
<head>
<title>Exemplu 3_1</title>
<style type="text/css">
<!-- p{font-family: font1,font2,arial;}-->
</style>
</head>
<body>
<p>Text scris cu cu fontul Arial</p>
Text negru
<p>Text scris cu cu fontul Arial</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

Exemplu: acelasi exemplu, dar CSS introdus in eticheta p din HTML

<html>
<head>
<title>Exemplu 3_2</title>
</head>
<body>
<p style="font-family: font1,font2,arial;">Text scris cu cu fontul Arial</p>
Text negru
<p style="font-family: font1,font2,arial;">Text scris cu cu fontul Arial</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

font-size este parametrul prin care stabilim dimesiunea fontului,


exprimat in pixeli (px), puncte (pt), keywords sau procente. Are o
functionare asemanatoare cu eticheta <font>.

Exemplu: CSS introdus in HEAD, aplicat etichetei p, dimensiunea


exprimata in pixeli
<html>
<head>
<title>Exemplu 3_3</title>
<style type="text/css">
<!-- p{font-size: 20px;}-->
</style>
</head>
<body>
<p>Text scris cu font de 20px</p>
Text negru
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

Pentru dimensiunea exprimata in puncte folosim acelasi exemplu


inlocuid px cu pt.
Dimensiunea exprimata prin keywords foloseste cuvinte in loc de
cifre. Sapte cuvinte inlocuiesc dimensiunile de la 1 la 7 de la vechea eticheta
FONT FACE din HTML.
CSS keyword numar FONT size
xx-small 1
x-small 2
small 3
medium 4
large 5
x-large 6
xx-large 7
Pentru verificare se poate folosi exemplul anterior in care se
inlocuieste 20px cu unul din cuvintele de mai sus.
Procentele sunt o alta valoare pe care o poate lua font-size. Aceasta
modalitate poate fi vizualizata diferit de browsere diferite. Ca verificare,
folositi acelasi exemplu schimband 20px cu 200%.
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

font-style este folosit pentru a adauga caracteristica italica fontului.


Poate lua valorile normal si italic.
<style type="text/css">
<!-- p{font-style: italic;}-->
</style>

font-weight este parametrul care stabileste grosimea caracterului


putand lua valorile numerice de la 100 la 900 sau BOLD, BOLDER,
LIGHTER.
<style type="text/css">
<!-- p{font-weight: 700;}-->
</style>

compunerea stilurilor
Stilurile prezentate anterior pot fi folosite simultan in interiorul
aceeasi etichete, fiind despartite de caracterul ; (punct si virgula).
CSS - Cascading Style Sheets
Stiluri pentru fonturi:

Exemplu: folosirea unui stil compus aplicat etichetei p.


<html>
<head>
<title>Exemplu 3_4</title>
<style type="text/css">
<!-- Atribute pentru fonturi:
p{ font-weight: normal, bold;
font-family: arial; font-size: 10pt, 15pt,20pt;
font-size: 20px; font-family: serif, sans-serif, cursive, monospace
font-style: italic; font-style: normal, italic;
font-weight: 800;}
-->
</style>
</head>
<body>
<p>Text scris cu Arial, 20px, italic, 800</p>
Text negru
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru text:
aliniere
text-align pozitioneaza pe orizontala obiecte (de exemplu text sau
imagini) si admite valorile left, right si center ca si eticheta align din HTML.
In continuare este prezentat ca exemplu codul folosit in HEAD, aplicat
etichetei p:
<style type="text/CSS">
<!--
p{text-align: center;}
-->
</style>
Exemplu: prin intermediul lui div aplicam stilul pe centru imaginii si
textului
<html> <body>
<head> <div class="pecentru"><img
<title>Exemplu 4_1</title> src="poza.jpg"></div>
<style type="text/css"> Text neformatat
<!-- <div class="pecentru">Text
.pecentru{text-align: center;} formatat</div>
--> </body>
</style> </html>
</head>
CSS - Cascading Style Sheets
Stiluri pentru text:
vertical-align este folosit pentru alinierea pe verticala a obiectelor dintr-un tabel
si poate lua valorile: top, middle si bottom.
In exemplul de mai jos este creata clasa sus care va putea fi aplicat elementelor
<td> ale tabelului
<style type="text/css">
<!--
.sus{vertical-align: top;}
-->
</style>
float este folosit pentru alinierea textului cu imaginile si poate avea valorile: left si
right. In functie de valoarea aleasa imaginea va fi aliniata in partea opusa a paginii.
Exemplu: cream clasa auto si o aplicam imaginii
<html> <body>
<head> <img src="poza.jpg" class="auto">
<title>Exemplu 4_2</title> Textul se aliniaza la dreapta, iar
<style type="text/css"> poza la stanga datorita clasei "auto".
<!-- </body>
.auto{float: left;} </html>
-->
</style>
</head>
CSS - Cascading Style Sheets
Stiluri pentru text:
tabulare
text-indent este folosit pentru alinierea textului in interior avand valori exprimate in
inci (in), centimetri (cm) sau pixeli (px). In exemplul de mai jos text-indent este
aplicat etichetei p deplasand textul cu 10 pixeli in interior
<style type="text/css">
<!--
p{text-indent: 10px;}
-->
</style>

decorare
text-decoration adauga sublinierea sau taierea blocului text asociat si poate avea
valorile underline, line-through sau none.
Exemplu: stilul asociat etichetei p este prezentat in HEAD
<html> </head>
<head> <body>
<title>Exemplu 4_3</title> Text normal
<style type="text/css"> <p>Text subliniat</p>
<!-- </body>
p{text-decoration: underline;} </html>
-->
</style>
CSS - Cascading Style Sheets
Stiluri pentru text:
culoare
color defineste culoarea textului dintr-o zona sau intraga pagina.

Exemplu: stilul asociat etichetei p este prezentat in HEAD


<html>
<head>
<title>Exemplu 4_4</title>
<style type="text/css">
<!--
p{color: #0000FF;}
-->
</style>
</head>
<body>
Text normal
<p>Text albastru</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru legaturi:

In HTML culoarea legaturilor poate fi stabilita prin atributele LINK,


ALINK si VLINK declarate in interiorul etichetei BODY. Acelasi lucru si
chiar mai mult poate fi realizat folosind sintaxa CSS.

a defineste stilul general pentru legatura


a:link defineste stilul legaturii nevizitate
a:visited defineste stilul legaturii vizitate
a:active defineste stilul legaturii active (nu prea se foloseste)
a:hover defineste stilul cand mouse-ul este deasupra legaturii

Atribute pentru text


1. text-align: right, center, left, justify;
2. text-indent:1cm; (pentru primul rand din paragraf)
3. line-height: distanta dintre randurile unui paragraf
CSS - Cascading Style Sheets
Stiluri pentru legaturi:

Exemplu:
<html>
<head>
<title>Exemplu 4_5</title>
<style type="text/css">
<!--
a{font-family: arial; font-size: 20px;}
a:link {color: #0000FF;}
a:visited {color: #00FF00;}
a:active {color: #FF0000;}
a:hover {color: #000000;}
-->
</style>
</head>
<body>
Text normal
<a href="exemplu4_4.html">link</a> catre exemplul 4_4
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fundal:
Background ca si culoare sau imagine poate fi definita pentru intreaga pagina,
o celula a tabelului sau pentru text.
culoare de fond
background-color defineste culoarea de fond si poate fi asociat oricarei
etichete HTML.
Exemplu: definim un stil pentru intreg BODY si un altul pentru eticheta p
<html>
<head>
<title>Exemplu 5_1</title>
<style type="text/css">
<!--
body {background-color: #FFFF00;}
p {background-color: #FF0000;}
-->
</style>
</head>
<body>
Text normal
<p>Text cu background rosu</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fundal:
imagine de fond
Imaginile pot fi folosite ca fundal in spatele intregii pagini, a unui obiect sau a
textului. background-image asociaza o imagine ca fundal unui obiect.
Exemplu: definim un stil pentru eticheta p
<html>
<head>
<title>Exemplu 5_2</title>
<style type="text/css">
<!--
p {background-image: url(poza.jpg);}
-->
</style>
</head>
<body>
Text normal
<p>Text cu imagine de fond</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fundal:
repetare
Functie de dimensiunile obiectului caruia ii sunt asociate, imaginile de fond se
repeta pe orizontala si verticala. Repetarea poate fi controlata prin parametrul
background-repeat care poate lua valorile:
repeat-x imaginea se repeta pe orizontala;
repeat-y imaginea se repeta pe verticala;
no-repeat imaginea nu se repeta.
Exemplu: imaginea nu se repeta sub eticheta p
<html>
<head>
<title>Exemplu 5_3</title>
<style type="text/css">
<!--
p {background-image: url(poza.jpg);
background-repeat: no-repeat;}
-->
</style>
</head>
<body>
Text normal
<p>Text cu imagine de fond</p>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru fundal:

pozitia
In mod normal imaginea de fundal incepe din coltul stanga sus al obiectului
asociat, dar acest lucru poate fi controlat prin comanda CSS background-position.
Sunt acceptate doua valori:
in prima pozitie poate fi: top, center, bottom, percentage sau pixel;
in a doua pozitie poate fi: right, center, left, percentage sau pixel.

Atribute pentru fundal:


background-color:red;
background-image:url(cale_fisier);
background-repeat (sau repeat-x, repeat-y);
background-attachment: fixed|scroll;
background-position: 20% 50%; (la 1/5 de marginea din stanga si de sus)
sau: 2cm 3cm sau: 2cm 50% sau: left right top bottom
background: le include pe toate
CSS - Cascading Style Sheets
Stiluri pentru fundal:
Exemplu: imaginea de fundal este asociata etichetei BODY fiind amplasata
top si center, fara repetare
<html>
<head>
<title>Exemplu 5_4</title>
<style type="text/css">
<!--
body {background-image: url(poza.jpg);
background-repeat: no-repeat;
background-position: top center;}
-->
</style>
</head>
<body>
Text normal
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru liste:
list-style-type
Folosind eticheta ol din HTML cream liste ordonate sau numerotate. Adaugand
comenzi CSS in zona HEAD putem adauga pe langa numere si cifre alte simboluri.
Browserul Netscape nu permite asocierea comenzilor CSS decat pentru eticheta li.
Sintaxa este:
<style type="text/css">
<!--
li {list-style-type: valoare;}
-->
</style>
valoarea poate fi:
disc disc
circle cerc
square patrat
decimal numere intregi
lower-roman numere romane, caractere mici (i, ii, iii, iv)
upper-roman numere romane, caractere mari (I, II, III, IV)
upper-alpha litere mari (A, B, C, D)
lower-alpha litere mici (a, b, c, d)
none nimic
CSS - Cascading Style Sheets
Stiluri pentru liste:
Exemplu: lista ordonata folosind marcaje cu litere mici
<html>
<head>
<title>Exemplu 6_1</title>
<style type="text/css">
<!--
li {list-style-type: lower-alpha;}
-->
</style>
</head>
<body>
Necesar materiale:
<ol>
<li>caramida</li>
<li>ciment</li>
<li>ipsos</li>
</ol>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru liste:
list-style-image
In afara simbolurilor de marcaj prestabilite, cunoscute de browser, pot fi
folosite si imagini prin comansa CSS list-style-image. Imaginile sunt introduse prin
adresa url().

Exemplu: lista ordonata folosind ca marcaj imaginea punct.gif


<html>
<head>
<title>Exemplu 6_2</title>
<style type="text/css">
<!--
li {list-style-image: url(punct.gif);}
-->
</style>
</head>
<body>
Necesar materiale:
<ul>
<li>caramida</li>
<li>ciment</li>
<li>ipsos</li>
</ul>
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru chenare si margini:
Fiecare element este incadrat intr-o caseta care este compusa din urmatoarele
elemente:
marginea (margin) este spatiul exterior chenarului pana la celelalte elemente
chenarul (border) este o bordura care inconjoara elementul
completarea (padding) stabileste distanta dintre continut si chenar
Continutul include informatia utila (text, tabele, imagini, formulare, etc.). Originea
elementului este considerat coltul din dreapta sus fata de care se vor raporta toate
dimensiunile prezentate in continuare.

width si height
Latimea si inaltimea unui element sunt stabilite in HTML prin atributele width
si height. Aceste atribute pot fi adaugate sau suprascrise prin comenzi CSS.
CSS - Cascading Style Sheets
Stiluri pentru chenare si margini:

Exemplu: folosind comenzi CSS modificam dimensiunile originale ale


imaginii

<html>
<head>
<title>Exemplu 7_1</title>
<style type="text/css">
<!--
img {width: 50px; height: 100px;}
-->
</style>
</head>
<body>
<img src="margini.gif">
</body>
</html>
CSS - Cascading Style Sheets
Stiluri pentru chenare si margini:

border
Netscape si Internet Explorer afiseaza diferit chenarele. Comanda CSS
pentru definirea chenarului este border avand proprietatile asociate width,
style si color. Pentru a fi siguri ca aceste proprietati functioneaza atat in
Internet Explorer cat si in Netscape trebuie sa declaram pentru border cel putin
width si style.

border-width stabileste grosimea chenarului si poate fi exprimata in


px (pixeli), pt (puncte), cm (centimetri) sau in (inci).
border-style stabileste tipul chenarului si poate fi dotted, dashed,
solid, double, groove, ridge, inset si outset.
border-color stabileste culoarea chenarului si poate fi exprimata
prin valoare hexazecimala sau in cuvinte.
CSS - Cascading Style Sheets
Stiluri pentru chenare si margini:
Exemplu: definim noua clase utilizand proprietatile border-width border-
style si border-color
<html>
<head>
<title>Exemplu 7_3</title>
<style type="text/css">
<!--
.clasa1 {border-width: 2px; border-style: dotted; border-color: red;}
.clasa2 {border-width: 3px; border-style: dashed; border-color: blue;}
.clasa3 {border-width: 2px; border-style: solid; border-color: green;}
.clasa4 {border-width: 3px; border-style: double; border-color: black;}
.clasa5 {border-width: 2px; border-style: groove; border-color: silver;}
.clasa6 {border-width: 3px; border-style: ridge; border-color: lime;}
.clasa7 {border-width: 2px; border-style: inset; border-color: yellow;}
.clasa8 {border-width: 3px; border-style: outset; border-color: aqua;}
.clasa9 {border-width: 2px; border-style: hidden; border-color: olive;}
-->
</style>
</head>
CSS - Cascading Style Sheets
Stiluri pentru chenare si margini:
Exemplu: definim noua clase utilizand proprietatile border-width border-style si
border-color
<body>
<div class="clasa1">border-width: 2px; border-style: dotted; border-color:
red;</div><br>
<div class="clasa2">border-width: 3px; border-style: dashed; border-color:
blue;</div><br>
<div class="clasa3">border-width: 2px; border-style: solid; border-color:
green;</div><br>
<div class="clasa4">border-width: 3px; border-style: double; border-color:
black;</div><br>
<div class="clasa5">border-width: 2px; border-style: groove; border-color:
silver;</div><br>
<div class="clasa6">border-width: 3px; border-style: ridge; border-color:
lime;</div><br>
<div class="clasa7">border-width: 2px; border-style: inset; border-color:
yellow;</div><br>
<div class="clasa8">border-width: 3px; border-style: outset; border-color:
aqua;</div><br>
<div class="clasa9">border-width: 2px; border-style: hidden; border-color: olive;</div>
</body>
</html>
CSS - Cascading Style Sheets
Pozitionarea prin CSS:
Pozitionarea permite asezarea unui obiect intr-un anume loc folosind
coordonatele. Totodata obiectele pot fi pozitionate pe straturi diferite, unul
deasupra celuilalt. Atat pozitionarea absoluta (ASOLUTE) cat si cea relativa
(RELATIVE) folosesc proprietatile LEFT si TOP exprimate in px (pixeli), in
(inci), pt (puncte), ems, procentaje sau cm (centimetri).
Pozitionare absoluta plaseaza obiectul in pagina exact in locatia data de
left si top. Astfel poate fi creat un element liber fata de celelalte din pagina.
Obiectul poate fi orice, de exemplu text sau imagine.
Exemplu: am aplicat pozitionarea absoluta etichetei h4
<html>
<head>
<title>Exemplu 8_1</title>
</head>
<body>
<h4 style="position: absolute; left: 50px; top: 50px">Text 1</h4>
<h4 style="position: absolute; left: 100px; top: 200px">Text 2</h4>
</body>
</html>
CSS - Cascading Style Sheets
Pozitionarea prin CSS:
Pozitionare relativa este pozitia normala pe care o ocupa un element,
dupa elementele anterioare si inaintea celor urmatoare. Poate fi deplasat
fata de aceasta pozitie folosind proprietatile left si top.
Exemplu: am folosit doua obiecte unul pozitionat absolut celalalt relativ
<html>
<head>
<title>Exemplu 8_2</title>
<style type="text/css">
<!--
.absolut {position: absolute; left: 200px; top: 150px;}
.relativ {position: relative; left: 50px; top: 50px;}
-->
</style>
</head>
<body>
<div class="absolut">Pozitionare absoluta, independent de celelate obiecte
din pagina</div>
Text
<div class="relativ">Pozitionare relativa, dupa "Text"</div>
</body>
</html>
CSS - Cascading Style Sheets
Pozitionarea prin CSS:
Pozitionarea tridimensionala
Elementele sunt pozitionate pe ecran pe o suprafata bidimensionala dar pot fi
asezate si unul deasupra celuilalt, intr-o stiva utilizand un indicativ (index-z) incepand cu
0, urmatorul 1 si tot asa in continuare. Elementul cu indexul cel mai mare este asezat
deasupra.

Exemplu: am folosit doua obiecte unul pozitionat absolut celalalt relativ


<html>
<head>
<title>Exemplu 8_3</title>
<style type="text/css">
<!--
.element1 {position: absolute; left: 30px; top: 30px; z-index: 3}
.element2 {position: absolute; left: 50px; top: 50px; z-index: 2}
.element3 {position: absolute; left: 70px; top: 70px; z-index: 1}
-->
</style>
</head>
<body>
<div class="element1"><img src="poza.jpg"></div>
<div class="element2"><img src="poza.jpg"></div>
<div class="element3"><img src="poza.jpg"></div>
</body>
</html>
Intrebari
???
Tehnologii WEB

Cursul 7
Planul lectiei:
CSS3 - Cascading Style SheetsSituri & aplicatii Web
Introducere
Modulele CSS3
Bordurile in CSS3
Fundalul in CSS3
Efecte de text in CSS3
Fonturile in CSS3
JavaScript
Includerea fisierelor externe
Variabile in JavaScript
Instructiuni si operatori in JavaScript
Functii in JavaScript
CSS3 - Cascading Style Sheets
Introducere
CSS este prescurtarea de la Cascading Style Sheets si este utilizat
pentru controulul stilului si aspectului unei pagini web.
CSS3 este noul standard pentru CSS.
Exemplu:
div
{
transform:rotate(30deg);
}
Modulele CSS3
CSS3 a fost impartit in "module". Specificatiile vechi au fost separate
in parti mai mici iar noile specificatii au fost de asemenea adaugate.
Cele mai importante module CSS3 sunt:
Selectoarele (Selectors)
Model caseta (Box Model)
Fundaluri si Borduri (Backgrounds and Borders)
Efecte Text (Text Effects)
Transformari 2D/3D (2D/3D Transformations)
Animatii (Animations)
Aspect Multi-Colaoana (Multiple Column Layout)
Interfata Utilizator (User Interface)
CSS3 - Cascading Style Sheets
Specificatiile CSS3 sunt inca in dezvoltare la W3C. Totusi, ultimele versiuni ale
browserelor includ propietatile CSS3.

Bordurile in CSS3
In CSS3 se pot crea borduri cu colturi rotunjite, se pot adauga umbre
la casete sau se pot utiliza imagini ca si borduri fara a mai fi nevoie de
Photoshop.
border-radius
box-shadow
border-image
Colturi rotunjite in CSS3
Spre deosebire de CSS2 in care trebuia sa utilizam mai multe imagini
pentru a avea colturi rotunjite la casete, in CSS3 putem face acest lucru foarte
usor si fara sa mai fie nevoie de imagini.
Propietatea CSS3 care ne ajuta in acest caz este border-radius.
div
{border:2px solid;
-moz-border-radius:25px; /* Firefox */
border-radius:25px;}
CSS3 - Cascading Style Sheets
Umbra la casete in CSS3
In CSS3 propietatea box-shadow ne permite sa adaugam umbra la o
caseta.
div
{-moz-box-shadow: 10px 10px 5px #888888; /* Firefox */
-webkit-box-shadow: 10px 10px 5px #888888; /* Safari and Chrome */
box-shadow: 10px 10px 5px #888888;}

Borduri cu imagini in CSS3


Cu ajutorul propietatii border-image puteti folosi imagini pentru a crea
borduri la casete.
div
{-moz-border-image:url(border.png) 30 30 round; /* Firefox */
-webkit-border-image:url(border.png) 30 30 round; /* Safari and Chrome */
border-image:url(border.png) 30 30 round;}
CSS3 - Cascading Style Sheets
Fundalul in CSS3
CSS3 contine propietati noi pentru fundal (background) ce permit un
control mai bun al fundalului in CSS.
In continuare se vor prezenta propietatile background-size si
background-origin si vom invata cum putem utiliza mai multe imagini
pentru background.
Firefox 3.6 si versiunile anterioare nu suporta propietatea background-origin si este
necesara utilizarea prefixului -moz- pentru propietatea background-size.
Safari 4 necesita prefixul -webkit- pentru a suporta noile propietati de background.
Internet Explorer 9, Firefox 4, Chrome, Safari 5 si Opera suporta noile propietati de
background.
Propietatea background-size in CSS3
Propietatea background-size specifica dimensiunile pentru
imaginea de background.
In CSS2 dimensiunile imaginii de background erau date de
dimensiunile imaginii utilizate. In CSS3 putem specifica dimensiunile imaginii
de background astfel incat, prin redimensionare, putem utiliza o singura
imagine in mai multe locuri.
Dimensiunile pot fi specificate in pixeli sau procente (dimensiunile
sunt relative la dimensiunile elementului parinte).
CSS3 - Cascading Style Sheets
Exemplu:
div
{background:url(img_flwr.gif);
-moz-background-size:80px 60px; /* Firefox */
background-size:80px 60px;
background-repeat:no-repeat;}

Propietatea background-size specifica dimensiunile pentru


imaginea de background. (valoarea standard este auto.)
Sintaxa:
background-size: length|percentage|cover|contain;
length - stabileste latimea (width, prima valoare specficata) si inaltimea (height, a doua valoare
specficata) imaginii de background. Daca este specficiata o singura valoare cea de a doua va fi "auto".
percentage - stabileste latimea si inaltimea imaginii de background ca procent din suprafata
elementului parinte.
cover - reduce dimensiunile imaginii de background astfel incat aceasta sa incapa in interiorul
suprafetei cu continut.
contain - mareste dimensiunile imaginii de background astfel incat aceasta sa incapa in interiorul
suprafetei cu continut.
CSS3 - Cascading Style Sheets
Propietatea background-origin in CSS3
Propietatea background-origin specifica zona de pozitionare a
imaginii de fundal.
Imaginea de background poate fi asezata in zona: content-box,
padding-box sau border-box.
Exemplu:
div
{background:url(img_flwr.gif);
background-repeat:no-repeat;
background-size:100% 100%;
background-origin:content-box;}
Propietatea background-origin specifica zona de pozitionare a
imaginii de fundal.
Nota! Daca propietatea background-attachment pentru imaginea de
background are valoarea "fixed", aceasta propietate nu are niciun efect.
Sintaxa:
background-origin: padding-box|border-box|content-box;
padding-box - imaginea de fundal este pozitionata in padding box
border-box - imaginea de fundal este pozitionata in border-box
content-box - imaginea de fundal este pozitionata in content-box
CSS3 - Cascading Style Sheets
Imagini multiple in background
CSS3 ne permite sa utilizam mai multe imagini pentru background-ul
unui element.
Nota: Internet Explorer nu suporta mai multe imagini pentru background.

Exemplu:
body
{
background-image:url(img_flwr.gif),url(img_tree.gif);
}
Propietati noi pentru background
background-clip - specifica zona de colorare a imagini de background.

Exemplu:
div
{background:url(/images/w3css.gif);
background-repeat: no-repeat;
background-size: 100% 100%;
background-clip: content-box;
-webkit-background-clip: content-box; /* Safari and Chrome */}
CSS3 - Cascading Style Sheets
Propietati noi pentru background
Sintaxa:
background-clip: padding-box|border-box|content-box;

padding-box - imaginea de backgroundd este decupata din padding box


border-box - imaginea de backgroundd este decupata din border-box
content-box - imaginea de backgroundd este decupata din content-box

Efecte de text in CSS3


CSS3 include caracteristici noi pentru text. In continuare vom studia
urmatoarele caracterisitici:
text-shadow
word-wrap

Internet Explorer nu suporta inca propietatea text-shadow.


Firefox, Chrome, Safari si Opera suporta propietatea text-shadow.
Majoritatea browserelor suporta propietatea word-wrap.
CSS3 - Cascading Style Sheets
CSS Text cu Umbra (Text Shadow)
In CSS3, propietatea text-shadow aplica o umbra pe text.

Putem specifica umbra pe orizontala, umbra pe verticala, distanta


pentru blur si culoarea umbrei.
Exemplu:
h1
{text-shadow: 5px 5px 5px #FF0000;}

Incadrarea cuvintelor in CSS3 (Word Wrapping)


Daca avem un cuvant prea lung, acesta iese din suprafata in care este
scris. Cu ajutorul propietatii word-wrap putem forta textul sa se incadreze
in suprafata respectiva (indiferent unde se afla acest cuvant intr-o fraza).
Exemplu:
p {word-wrap:break-word;}
CSS3 - Cascading Style Sheets
Propietati noi pentru text in CSS3
Propietate Descriere CSS
hanging-punctuation Specifica daca un caracter de punctuatie va fi plasat in 3
afara casetei de line.
punctuation-trim Specifica daca un caracter de punctuatie va fi taiat. 3

text-align-last Descrie modul in care ultima line a unui bloc sau linia 3
dinaintea liniei de pauza fortate este aliniata atunci cand
text-align este "justify".
text-emphasis Se aplica accent si culoare pe textul elementelor. 3

text-justify Specifica metoda de justificare ce va fi folosita cand text- 3


align este "justify"

.
text-outline Specifica o schita de text. 3
text-overflow Specifica ce se va intampla cand textul depaseste suprafata 3
elementului.
text-shadow Adauga umbra la text. 3
text-wrap Specifica regulile pentru liniile de pauza la text. 3

word-break Specifica regulile pentru liniile de pauza la scripturile non- 3


CJK.
word-wrap Permite ruperea cuvintelor lungi (ce nu pot fi despartite). 3
CSS3 - Cascading Style Sheets
Fonturile in CSS3
Inainte de aparitia CSS3, designerii web trebuiau sa foloseasca fonturi
care erau deja instalate pe calculatorul utilizatorului. Cu CSS3, designerii web
pot sa foloseasca ce font doresc.
Daca doriti sa folositi un font nu trebuie decat sa il incarcati pe
serverul web si acesta va fi descarcat automat utilizatorului cand va fi nevoie
de el. Fonturile "proprii" sunt definite in CSS3 cu ajutorul regulii @font-face.
In regula @font-face trebuie sa definiti mai intai un nume pentru
font (spre exemplu PrimulMeuFont) si apoi sa specificati calea catre fisierul
fontului.
Pentru a utiliza fontul pentru un element HTML trebuie sa faceti
referire la numele acestuia (PrimulMeuFont) cu ajutorul propietatii font-
family.
Exemplu:
<style type="text/css">
@font-face
{font-family: PrimulMeuFont;
src: url('Sansation_Light.ttf'), url('Sansation_Light.eot'); /* IE9+ */}
div
{font-family:PrimulMeuFont;}
</style>
CSS3 - Cascading Style Sheets
Fonturile in CSS3
Pentru a folosi text ingrosat trebuie sa adaugati o alta regula @font-
face care sa contina descrierea pentru textul ingrosat.
Exemplu:
@font-face
{font-family: PrimulMeuFont;
src: url('Sansation_Bold.ttf'),
url('Sansation_Bold.eot'); /* IE9+ */
font-weight:bold;}

"Sansation_Bold.ttf" este un fisier separat pentru font care contine


caracterele ingrosate (bold) pentru fontul Sensation. Browserele vor folosi
aceasta versiune a fontului cand parti din textul cu font-family
"PrimulMeuFont" trebuie redate ca bold. In acest fel puteti avea numeroase
reguli @font-face pentru acelasi font.
CSS3 - Cascading Style Sheets
Descriptorii (Descriptors) de fonturi in CSS3
In tabelul urmator sunt listati toti descriptorii de fonturi ce pot fi
definiti intr-o regula @font-face.
Descriptor Valoare Descriere
font-family name Obligatoriu - defineste un nume pentru font.

src URL Obligatoriu - defineste URL-ul catre font.


font-stretch normalcondensedultra-condensedextra- Optional - defineste cum va fi afisat (intins)
condensedsemi- fontul. Implicit este "normal".
condensedexpandedsemi-expandedextra-
expandedultra-expanded

font-style normalitalicoblique Optional - defineste stilul fontului. Implicit


este "normal".
font-weight normalbold1002003004005006007008 Optional - defineste cum va fi ingrosat
00900 fontul. Implicit este "normal".
unicode-range unicode-range Optional - defineste gama de caractere
UNICODE pe care fontul o suporta. Implicit
este "U+0-10FFFF".
JavaScript
JavaScript este un limbaj "client-oriented", ce poate fi folosit impreuna cu
HTML pentru a produce pagini dinamice, interactive. Javascript este un
limbaj interpretat, insa nu este compilat. Codul JavaScript poate fi introdus
direct in sursa HTML (in sectiunea HEAD) sau prin apelarea unui fisier
extern. Interpretorul JavaScript este chiar browser-ul web.
JavaScript este un limbaj care:
poate reactiona la evenimente: se pot scrie functii JavaScript care se
executa cand un eveniment are loc. (exemple de evenimente: onLoad,
onClick, onFocus, etc);
poate citi si scrie elemente (tag-uri) HTML. Structura unei pagini web
(HTML) este arborescenta, si poate fi accesata prin metode specifice (ex:
functia getElementById );
poate fi folosit pentru validarea formularelor (prin verificarea continutului
campurilor, la trimitere);
poate fi folosit pentru alte operatii "client" de tip: detectarea tipului
browserului, a sistemului de operare, etc.;
poate fi folosit pentru a crea / opera cu cookie-uri.
JavaScript
Exemplu de folosire a unui script JavaScript:
Prin implementarea urmatorului cod se va afisa o pagina web ce
contine textul "Exemplu JavaScript";
<html>
<body>
<script type="text/javascript">
document.write("Exemplu JavaScript");
</script>
</body>
</html>
Includerea fisierelor externe:
In fisierele HTML pot fi incluse fisiere ce contin cod JavaScript,
(operatie ce din ratiuni de optimizare SEO, este chiar indicat sa fie facuta). In
plus, acelasi cod poate fi folosit pe mai multe pagini, daca este necesar. Aceste
fisiere trebuie sa aiba extensia .js. Modalitatea de includere este:
<html>
<head>
<script type="text/javascript" src="nume.js"></script>
</head>
<body>
</body>
</html>
JavaScript
Variabile in JavaScript
In Javascript nu este necesara precizarea tipului de date, precum in C
sau alte limbaje invatate pana acum. Browserul realizeaza singur identificarea
tipului de date. De asemenea, singur face conversiile necesare (exemplu:
3+"abc" il va converti pe 3 la string in mod automat). Variabilele pot fi
declarate cu var(var a;), caz in care sunt locale pentru blocul de instructiuni
in care se afla, dar pot sa fie create si fara var, insa e necesara o initializare (in
momentul in care browserul intalneste de exemplu b=3, iar b nu a mai fost
folosit pana atunci, este creata variabila b), si in acest caz ele vor fi globale
chiar daca sunt create intr-un bloc de instrunctiuni delimitat de acolade (cum
ar fi corpul unei functii sau al unei bucle while etc.). Variabilele in JavaScript
se declara astfel:
var x;
var numeVar="exemplu";
Ca si in PHP, nu se face diferenta intre tipul variabilelor. Variabilele
JavaScript sunt literali simpli (nu avem nevoie de simboli tip $, ca in PHP,
pentru anuntarea unei variable).
JavaScript
Instructiuni si operatori in JavaScript
Sunt perfect similari cu cei din limbajele orientate obiect (JAVA,
PHP). Este si cazul constructiilor if, while, for, switch.
Le-ati mai intalnit si in cadrul celorlalte limbaje pe care le cunoasteti.
Instructiunea break fara argumente, instructiunea continue se folosea tot in
cadrul buclelor si forta programul sa sara peste instructiunile din bucla de
dupa ea (practic sa ignore instructiunile aflate sub continue), incepand
imediat o noua iteratie a buclei. Se pune problema: ce facem atunci cand avem
mai multe bucle? Break si continue fara argumente se refera la bucla cea mai
apropiata, practic cea mai din interior bucla care le contine. Dar uneori vrem
sa oprim o bucla mai din exterior. Pentru asta putem folosi etichete, ca in
exemplul de mai jos:
eticheta:
instructiune_repetitiva1{
...
[eventual alte instructiuni repetitive imbricate]{
break eticheta;
}
...
}
JavaScript
Instructiuni si operatori in JavaScript
In exemplu anterior punem o eticheta inaintea buclei cea mai din exterior. Se
presupune ca avem mai multe bucle imbricate si cu un break in cea mai din interior
bucla vrem sa oprim bucla principala. In acest caz, break va fi urmat de numele
etichetei pentru a indica precis la care bucla ne referim.
Functii in JavaScript
Maniera de definire a functiilor in JavaScript este una uzuala. Iata un exemplu:
<html>
<head>
<script type="text/javascript">
function displaymessage()
{
alert("Hello World!");
}
</script>
</head>
<body>
<form>
<input type="button" value="Click me!" onclick="displaymessage()" >
</form>
</body>
</html>
Acest exemplu, va avea ca efect afisarea unui Message Box la apasarea butonului din
formular. Message Box-ul contine string-ul "Hello World".
JavaScript
Functii in JavaScript
O functie se declara astfel (cu ajutorul cuvantului function):
function f (param_1, param_2,...,param_n){
..instrunctiuni..
return ceva;
}

Functiile se pot declara oriunde in cod. Nu exista function overload;


daca se declara mai multe functii cu acelasi nume, va fi luata in considerare
doar ultima functie cu acel nume.
Functiile sunt practic un tip de obiecte in JavaScript, deci ele au
propriile metode si proprietati. Proprietatea cea mai importanta este obiectul
arguments. Acesta se aseamana cu un vector (dar nu este un obiect de tip
Array(), ci se incadreaza intr-un tip special de obiecte). Argumentul cu
numarul i poate fi accesat in cadrul corpului functiei prin arguments[i].
Obiectul arguments are si proprietatea length prin care se poate vedea cate
argumente a primit functia.
Puteti citi mai multe despre acest obiect la:
http://docstore.mik.ua/orelly/webprog/jscript/ch07_04.htm
JavaScript
Functii in JavaScript
In JavaScript o functie chiar daca este declarata cu un anume numar
de argumente, ea poate fi apelata de fapt cu oricate. De exemplu daca avem o
functie definita cu doi parametri (exemplu function f(a,b){...}), atunci putem
avea mai multe cazuri:

f e apelata cu doi parametri, de exemplu: f(2,3);, si aici totul e clar, in corpul


functiei a va lua valoarea 2, b va lua valoarea 3 si arguments.length va fi egal cu 2.
f e apelata fara parametri, de exemplu: f();, atunci nu se va genera vreo eroare
prin faptul ca apelul nu respecta definitia, ci pur si simplu a si b vor fi ambele
undefined, iar daca in cadrul functiei codul e protejat astfel incat sa nu se ruleze
instructiuni care depind de a si b fara a se testa faptul ca a si b sunt instantiate,
functia se va executa fara probleme. In acest caz arguments.length va fi egal cu 0.
f e apelata cu un singur parametru, de exemplu: f(2);, aici a va lua valoarea 1 si b
va fi undefined, iar arguments.length va fi egal cu 1.
f e apelata cu mai multi parametri, de exemplu: f(2,3,1,9);, aici a si b vor lua
valorile primilor parametri oferiti, respectiv 2 si 3 iar restul parametrilor vor fi
ignorati, daca nu sunt luati din obiectul arguments. In acest exemplu
arguments.length va fi egal cu 4.
JavaScript
Functii in JavaScript
Aplicaia adunare ne adun dou numere scrise n 2 csue de text i
cnd apsm un buton ne scrie rezultatul n a treia csu de text.
<HTML>
<HEAD>
<TITLE>Adunare</TITLE>
<SCRIPT>
function adunare(form){
form.rezultat.value=eval(form.prim.value)+eval(form.secund.value);}
</SCRIPT>
</HEAD>

<BODY>
<FORM>
<INPUT type=text name=prim value=2> +
<INPUT type=text name=secund value=3>
<INPUT type=button name=action value== onclick=adunare(this.form)>
<INPUT type=text name=rezultat value=5>
</FORM>
</BODY>
</HTML>
Intrebari
???
Tehnologii WEB

Cursul 8
Planul lectiei:
Limbajul PHP
Elemente de baz ale limbajului PHP
Caracteristici
Vocabular, simboluri, expresii, instructiuni si
comentarii
Vocabular
Instructiuni
Comentarii
Tipuri de date
Tipuri scalare
Tipurile compuse
Limbajul PHP
Elemente de baz ale limbajului PHP

Sintagma tehnologii pentru server se refer n special la serverele de


aplicaii utilizate n scopul furnizrii de coninut dinamic n Web. Dintre
acestea, PHP (acronim recursiv pentru PHP: Hypertext Preprocessor), realizat
i distribuit n regim open source, este cel mai des folosit.

Prin PHP se nelege att limbajul de scripting, ct i serverul de


aplicaii, cel din urm avnd rolul de a procesa i interpreta scripturile scrise
utiliznd acest limbaj. Limbajul PHP este destinat n mod special pentru
dezvoltare Web, codul PHP putnd fi ncapsulat n (X)HTML.

n ceea ce privete popularitatea printre limbajele de programare,


PHP ocup poziia a treia, dup C/C++ i Java. Spre deosebire de programele
scrise intr-unul dintre limbajele pentru client (JavaScript), codul PHP este
interpretat pe server, utilizatorul primind - prin intermediul browserului Web
- numai rezultatul obtinut, in diverse formate (XHTML).
Limbajul PHP
Caracteristici - 1
Dintre caracteristicile generale ale limbajului / serverului de aplicatii
PHP care il recomanda drept cel mai indicat pentru dezvoltarea aplicatiilor
Web, pot fi mentionate urmatoarele:
este usor de invatat si utilizat;
ofera functionalitati complete;
este simplu de extins, diverse module si biblioteci oferind posibilitatea ca
PHP sa lucreze cu un numar mare de API-uri si alte tehnologii Web;
au fost create un numar mare de medii de dezvoltare profesionale scrise n
PHP, multe dintre ele fiind puse la dispozitia utilizatorului in regim open
source;
dispune de interfete pentru un numar mare de sisteme de gestiune a
bazelor de date:
Oracle
Microsoft SQL Server
IBM DB2
MySQL
Postgresql
Informix
Sybase
precum si pentru standardul ODBC
Limbajul PHP
Caracteristici - 2
Dintre caracteristicile generale ale limbajului / serverului de aplicatii
PHP care il recomanda drept cel mai indicat pentru dezvoltarea aplicatiilor
Web, pot fi mentionate urmatoarele:
asigura suport pentru comunicatia cu servicii ce utilizeaza diverse
protocoale, dintre care amintim:
HTTP
FTP (File Transfer Protocol)
IMAP (Internet Message Access Protocol)
POPS (Post Office Protocol version 3)
COM (Component Object Model)
LDAP (Lightweight Directory Access Protocol)
SOAP (Simple Object Access Protocol)
ofera suport pentru prelucrarea textului folosind expresii regulate;
implementeaza diverse metode de procesare a documentelor XML:
SAX - Simple API for XML
DOM - Document Object Model
XMLReader
SimpleXML
oferind si posibilitatea transformarii acestora prin intermediul foilor de stil
XSLT (XSL Transformations)
Limbajul PHP
Caracteristici - 3
Dintre caracteristicile generale ale limbajului / serverului de aplicatii
PHP care il recomanda drept cel mai indicat pentru dezvoltarea aplicatiilor
Web, pot fi mentionate urmatoarele:
asigura suport pentru:
generarea si prelucrarea imaginilor
gestiunea sesiunilor (folosind variabile cookie si, respectiv, variabile sesiune)
instantierea obiectelor Java si utilizarea lor in mod transparent ca obiecte PHP
comert electronic
crearea animatiilor FLASH
etc.
De obicei, PHP este folosit ca modul inclus in procesul-server HTTP,
iar in cazul in care serverul amintit suporta standardul CGI (Common
Gateway Interface ), poate fi utilizat si ca procesor CGI.
Atunci cand browserul cere un fisier PHP serverului Web, acesta
trimite cererea procesorului PHP, care efectueaza interpretarea scriptului si
produce la iesirea standard continut in diverse formate:
precum sunt cele textuale (XHTML, XML);
grafice (GIF, JPEG, PNG);
sau PDF.
Limbajul PHP
Caracteristici - 4
Secventele de cod PHP sunt delimitate de un marcaj de start si de un
marcaj de sfarsit (acestea sunt, in mod obisnuit, <?php si ?>), care determina
intrarea/iesirea procesorului in/din ,,modul PHP".
Se pot obtine o multime de informatii utile despre serverul de aplicatii
PHP 5: extensiile instalate in sistem odata cu acesta, prin intermediul functiei
phpinfo().

Exemplu 1: Script-ul urmator afiseaza un mesaj. Va fi memorat sub numele


de prim.php.
<?php
echo primul script PHP;
?>
Limbajul PHP
Observatie foarte importanta!
Atunci cand se apeleaza un script, el este rulat pe server.
Acesta va efectua operatiile pe care le are programate si eventual, va
scrie ceva (in exemplul anterior cu echo).
Rezultatul (adica ce este scris) este returnat catre browser, iar acesta il
va trata ca pe un fisier html.

Exemplu 2: Executam script-ul urmator care contine cateva elemente de


formatare.
<?php
echo Acesta este <b>primul</b> script <b><i>PHP</i></b>;
?>
Limbajul PHP
Vocabular, simboluri, expresii, instructiuni si comentarii

Sintaxa unui limbaj reprezinta totalitatea regulilor de scriere a


programelor, astfel incat acestea sa fie acceptate de catre analizorul sintactic
(numit si parser).

Aceste reguli se refera la:


Vocabularul;
Simbolurile;
Expresiile si instructiunile folosite;
Modalitatile utilizate pentru definirea functiilor si claselor.

O parte dintre elementele de sintaxa enumerate, referitoare la


limbajul de programare PHP sunt analizate in continuare
Limbajul PHP
Vocabular
Limbajul PHP foloseste un vocabular format din urmatoarele
componente:
caractere
identificatori
separatori
Caracterele utilizate sunt incluse in setul de caractere al limbajului,
acesta continand:
literele majuscule si minuscule ale alfabetului (a-z, A-Z)
cifrele corespunzatoare sistemului de numeratie zecimal (0-9)
caractere speciale: !, @, #, $, &, *,(,), -, _, :, ", ', {, }, [, ] si spatiu
Identificatorii furnizeaza modalitati de denumire a datelor (adica,
variabile si constante), functiilor, claselor, cuvintelor-cheie etc., fiind formati
din urmatoarele caractere:
cifre
litere
caracterul special liniuta de subliniere (underscore: _")
Limbajul PHP
Vocabular
Ca o regula generala, un identificator va incepe intotdeauna cu o
litera sau cu liniuta de subliniere.
Separatorii delimiteaza intre ei identificatorii si pot fi:
spatiul (blank)
caracterul punct si virgula ( ; ")
virgula ( , ")
Cele mai mici constructii sintactice pe care le poate ,,intelege"
interpretorul PHP sunt denumite simboluri (tokens, in limba engleza).
Acestea sunt reprezentate de:
numere (0.753, 45, 8.56)
siruri ("student")
variabile ($student)
constante (true, false)
cuvinte-cheie (if, for, do, while, function, class, this, public, protected,
private, static, abstract)
Limbajul PHP
Vocabular
Simbolurile sunt separate unele de altele prin spatii albe si prin unele
caractere speciale (paranteze, acolade).
Practic tot ceea ce se scrie in PHP reprezinta expresii. Astfel, se spune
ca PHP este un limbaj orientat pe expresii.
O expresie este orice combinatie de simboluri care are o valoare.
Cele mai simple expresii sunt constantele si variabilele.
Cand se scrie $x=20, se atribuie variabilei $x valoarea '20'. In acest
caz, '20' are valoarea 20 - adica '20' este o expresie avand valoarea 20 (in acest
caz, 20 este o constanta intreaga). In exemplul prezentat, se atribuie variabilei
$x valoarea 20. Astfel, $x este o expresie care - dupa atribuire - va avea
valoarea 20.
In general, o expresie de atribuire este o expresie in care valoarea unei
variabile este rezultatul obtinut in urma evaluarii unei alte expresii.
Limbajul PHP
Vocabular
In exemplul urmator, variabilei $douazeci i este atribuita valoarea
obtinuta in urma evaluarii expresiei : 2* (9+1):

$douazeci = 2*(9+1)

De multe ori, expresia evaluata in vederea atribuirii valorii sale unei


variabile, poate contine, la randul ei, alte variabile sau constante.

In aceasta situatie, valoarea unei variabile continute este egala cu cea


atribuita anterior, ca in exemplul urmator in care valoarea variabilei
$douazeci este egala cu 20:

$saizeci=10+2*($douazeci+5)
Limbajul PHP
Instructiuni
In PHP, instructiunea este o expresie urmata de caracterul punct si
virgula (;"), ca in C, Perl sau Java.
O secventa de instructiuni valide, inclusa, de exemplu, intre marcajele
<?php si ?> este un program (numit si script). In mod obisnuit scripturile
PHP se salveaza in fisiere cu extensia .php.
Desi instructiunile nu pot fi combinate ca si expresiile, ele pot fi
incluse in grupuri, plasate intre acolade, ca in exemplul urmator:
<?php
$numar=20;
if ($numar>=0) {
echo "Radacina patrata a numarului $numar este:";
echo sqrt($numar); }
else
echo "Numarul este negativ. Precizati unul pozitiv!";
?>
Limbajul PHP
Comentarii
Ca si in alte limbaje de programare, scripturile PHP pot include
comentarii, acestea fiind precizate in trei moduri:

in stilul Perl - comentariul se intinde pe o linie, fiind precedat de caracterul


# (cu toate ca este valid, acest tip de comentariu este mai putin utilizat in
PHP);
in stilul JavaScript - comentariul se intinde pe o singura linie si este
precedat de doua caractere slash succesive (//);
in stilul C - comentariul se poate intinde pe mai multe linii, fiind incadrat de
secventele /* si */.

Comentariile din scripturi sunt ignorate de procesorul PHP, nefiind


incluse in rezultatul trimis browserului.
Limbajul PHP
Tipuri de date
Limbajul PHP accepta opt tipuri de date, patru fiind scalare, doua
compuse si alte doua speciale.
Tipurile scalare sunt:
logic (numit si boolean)
sir de caractere (string)
intreg (integer)
dublu (double)
Ultimele doua reprezinta tipuri numerice.
Tipurile compuse sunt:
tablou (array)
obiect (object)
Tipurile speciale sunt:
resursa (resource)
null
Tipurile scalare impreuna cu tipul null se numesc tipuri simple.
Tipurile compuse pot impacheta un numar arbitrar de date, acestea
din urma avand diverse tipuri (simple sau compuse).
Limbajul PHP
Tipul ntreg
Tipul intreg se refera la numerele intregi, negative sau pozitive
(corespunde tipului long din C).
Acestea pot fi specificate in trei formate de citire, care corespund
sistemelor de numeratie octal, zecimal si hexazecimal.
Formatul zecimal este implicit, iar cele octal si hexazecimal sunt
precizate utilizand ca prefix cifra 0 (zero) si respectiv, secventa Ox (zero urmat
imediat de litera x).
Orice format poate fi precedat de semnul - (minus), care arata ca
numarul corespunzator este negativ.
Intervalul in care pot fi specificate numerele intregi in PHP depinde de
lungimea cuvantului pe masina utilizata.
Pentru cele mai multe platforme, limitele minima si maxima sunt:
(-2147483647) si, respectiv, (2147483647).
Limbajul PHP
Tipul dublu
Tipul dublu se refera la numerele in virgula mobila.
Formatul de citire pentru aceste numere este -A.B, unde semnul
optional - (minus) corespunde numerelor negative, iar A si B sunt secvente de
cifre situate in intervalul [0,9].
Secventa A poate fi omisa daca numerele sunt cuprinse intre -1.0 si 1.0
(-0.6518, 0.6518).
Numerele duble pot fi specificate utilizand si notatia stiintifica, adica
adaugand formatului anterior litera e urmata de un intreg, care semnifica o
putere a numarului 10 (numarul 2500.00 se poate scrie 2.5e+3).
Limbajul PHP
Tipul logic
Tipului logic (sau boolean) i corespund valorile true si false. Acestea
pot fi utilizate, de exemplu, in instructiunile de control (if) pentru a specifica
valoarea de adevar a expresiei de test.
Pentru a evalua valoarea de adevar a unei expresii care nu are tipul
logic, se impun urmatoarele reguli:
daca valoarea expresiei este un numar, atunci 0 va fi asimilat valorii false,
in caz contrar, numarul va fi asimilat valorii true;
daca valoarea expresiei este un sir, acesta va fi asimilat valorii false in cazul
in care este vid (adic, nu contine nici un caracter) si true, in caz contrar
(valoarea null va fi asimilata intotdeauna valorii false);
daca tipul valorii expresiei este compus (adic, tablou sau obiect), aceasta
va fi asimilata valorii false daca nu contine nici o valoare si true in caz
contrar (a nu contine nici o valoare inseamna pentru tipul tablou a nu avea
nici un element, iar pentru tipul obiect a nu include nici o proprietate cu o
valoare atribuita);
daca valorile de tip resursa sunt valide, vor fi asimilate valorii true.
Limbajul PHP
Tipul ir de caractere
Tipul sir de caractere reprezinta secvente de caractere. Un sir trebuie
inclus ntre ghilimele sau apostrofuri.
Diferenta dintre aceste modalitati de includere se manifesta in
momentul procesarii. Astfel, daca se utilizeaza apostrofuri, sirul este tratat
literal, in cele mai multe cazuri (pentru exceptii, vezi primele doua reguli
prezentate in continuare), in vreme ce, daca se utilizeaza ghilimele, variabilele
incluse in sir vor fi - in prealabil - evaluate, ca in exemplul urmator:
<?php
$limbaj="PHP";
echo "Limbajul meu preferat este $limbaj<br />";
// Se afiseaza Limbajul meu preferat este PHP
echo 'Limbajul meu preferat este $limbaj';
// Se afiseaza Limbajul meu preferat este $limbaj
?>
Limbajul PHP
Tipul resurs
Tipul resursa este un tip special de date, fiind asociat rezultatelor
intoarse de unele functii definite de cateva extensii PHP. De exemplu, in cazul
extensiei mysql, aceste functii pot realiza operatii ca:
deschiderea fisierelor
deschiderea conexiunii cu un server de baze de date
interogarea bazelor de date

Variabilele avand tipul resursa pot fi transmise unor functii, in scopul


prelucrarii rezultatelor asociate acestora, dupa cum vom studia la sistemul de
gestiune a bazelor de date mysql.
Intrebari
???
Tehnologii WEB

Cursul 9
Planul lectiei:
Limbajul PHP
Variabile
Constante
Operatori
Operatori unari
Operatori binary
Operatori ternari
Instruciuni
Instruciuni condiionale
Instructiuni pentru controlul executiei iteratiilor
Funcii
Apelarea funciilor
Functii definite de utilizator
Functii recursive
Limbajul PHP
Variabile
Principala modalitate de stocare temporara a datelor ntr-un script
PHP este reprezentata de utilizarea variabilelor.

In alcatuirea si utilizarea acestora trebuie respectate urmatoarele


reguli:
sunt precedate intotdeauna de simbolul dolarului ($);
numele lor incepe cu o litera sau cu caracterul underscore, pot contine
oricate caractere alfanumerice si liniute de subliniere si sunt case-sensitive,
adica sensibile la diferenta dintre minuscule si majuscule (exemplu,
$ovariabila si $OVariaBILa sunt variabile diferite)

Spre deosebire de alte limbaje (C, C++, Java), nu este obligatorie


declararea variabilelor PHP inainte de atribuire. Altfel spus, primul pas in
utilizarea unei variabile PHP este atribuirea unei valori; valoarea unei
variabile este rezultatul celei mai recente atribuiri; tipul unei variabile este
tipul valorii cel mai recent atribuite (neexistand unul intrinsec), insemnand ca
acesta se poate modifica la oricare noua atribuire.
Limbajul PHP
Variabile

Spre deosebire de alte limbaje de programare des utilizate (C, Java),


PHP nu asigura suportul pentru variabile globale. Trebuie mentionat, totusi,
ca exista posibilitatea utilizarii in corpul functiilor a variabilelor definite in
script, folosindu-se tabloul $GLOBALS, in care cheile elementelor reprezinta
numele variabilelor.

Cu toate ca PHP nu suporta variabilele globale, exista un numar de


variabile tablou predefinite, cunoscute sub denumirea de tablouri
superglobale, al caror comportament este similar cu cel al variabilelor globale
utilizate in alte limbaje de programare.

Astfel, aceste tablouri pot fi accesate in orice punct al scriptului,


inclusiv in interiorul metodelor si functiilor.
Limbajul PHP
Variabile

Alaturi de tabloul superglobal $GLOBALS, din categoria respectiva


mai fac parte:
$_GET si $_POST contin toate datele get si, respectiv, post primite de
PHP de la browser;
$_COOKIE - include toate cookie-urile primite de PHP de la browser;

Variabilele globale pot fi accesate automat de oriunde, inclusiv din


interiorul functiilor.
s_REQUEST - contine toate variabilele GET, POST si COOKIE primite de
PHP de la browser
s_SERVER - include valorile variabilelor setate de server sau pe cele direct
legate de mediul de executie al scriptului curent
s_FILES - contine informatii despre fisierele incarcate pe server via HTTP
s_SESSION - include variabile inregistrate in sesiunea curenta
s_ENV - contine variabile furnizate script-ului de catre mediul de executie
Limbajul PHP
Constante

Constanta este un identificator pentru o valoare scalara. Pentru


definirea si utilizarea constantelor trebuie respectate urmatoarele reguli:
numele constantelor nu sunt precedate de simbolul dolar;
numele lor vor fi alcatuite la fel ca si ale variabilelor.
De asemenea, constantele sunt case sensitive, motiv pentru care, prin
conventie, se scriu intotdeauna cu majuscule; odata definita, valoarea unei
constante nu mai poate fi schimbata pe parcursul executiei unui script, cu
exceptia unor constante predefinite (built-in), dintre care se poate aminti:
constantele magice _file (indica numele fisierului curent) si _LINE (indica
numarul liniei pe care se afla)
PHP_VERSION (precizeaza versiunea interpretorului PHP)
PHP_OS (are ca valoare numele sistemului de operare al calculatorului pe
care functioneaza interpretorul PHP);
Functiile define() si defined() sunt utilizate pentru definirea
(inregistrarea) constantelor si, respectiv, pentru verificarea existentei
acestora.
Limbajul PHP
Constante

Un exemplu in care sunt folosite ambele functii:


<?php
define("CAPITALA", "Bucuresti");
if(defined("CAPITALA"))
echo CAPITALA;
?>

Primul argument al functiei define() este un sir de caractere,


reprezentand numele constantei, iar al doilea o expresie PHP valida
(exceptand tablourile si obiectele), numita valoarea constantei.
Daca al treilea argument (acesta fiind optional si avand tipul boolean
al functiei define() este precizat si are valoarea true (define("CAPITALA",
"Bucuresti", true)), constanta inregistrata va fi case insensitive (adica, se
poate utiliza si capitala).
Pentru a obtine toate constantele PHP predefinite, se poate utiliza
functia get_defined_constants().
Limbajul PHP
Operatori

In PHP sunt folosite trei tipuri de operatori:


unari (se aplica unui singur operand)
binari (utilizeaza doi operanzi)
ternari (se folosesc impreuna cu trei operanzi)
PHP poate realiza operatii binare numai in situatia in care cei doi
operanzi au acelasi tip. Daca acestia au tipuri diferite, se realizeaza - in
prealabil - conversia unui operand la tipul celuilalt, utilizand regulile
urmatoare:
daca tipurile celor doi operanzi sunt intreg si dublu, operandul intreg este
convertit la tipul dublu;
daca operanzii sunt de tip intreg si sir de caractere, operandul sir caractere
de este convertit la tipul intreg;
daca operanzii sunt de tip dublu si sir de caractere, operandul sir de
caractere este convertit la tipul dublu.
De asemenea, operanzii de tip logic, null si resursa sunt convertiti la
tipul intreg, astfel: true la 1 si false la 0, null la 0 si resursa la id-ul resursei.
Limbajul PHP
Operatori unari
Operatorii unari utilizati in PHP sunt:
operatorul de negatie logica (!)
operatorul de negatie pe biti (~)
operatorii de incrementare/decrementare:
postincrementare ($var++)
preincrementare (++$var)
postdecrementare ($var--)
predecrementare (--$var)
operatorii pentru conversia de tip (cast):
(int), (integer) - schimba tipul la intreg
(float), (real), (double) - schimba tipul la duble
(string) - schimba tipul la sir de caractere
(bool), (boole) - schimba tipul la boolean)
(array) - schimba tipul la tablou
(object) - schimba tipul la obiect
operatorul pentru mpiedicarea afirii erorilor (@).

Trebuie remarcat ca acesti operatori schimba tipul valorii, si nu al


variabilei careia i se aplica.
Limbajul PHP
Operatori binari
Operatorii binari utilizai n PHP sunt:
operatori aritmetici:
adunare (+)
scadere (-)
inmultire (*)
impartire (/)
modulo (%)
operatorul de concatenare (.);
operatori de atribuire:
operatorul = (egal)
operatorii de atribuire compusi (dintr-un operator si semnul egal): +=, -=, *=, /=,
%=, ^=, .=, &=, |=;
operatori de comparatie:
egal (==)
inegal (!=)
mai mare (>)
mai mic (<)
mai mare sau egal (>=)
mai mic sau egal (<=)
identic (===)
neidentic (!==)
Limbajul PHP
Operatori binari

Pentru ultimii doi operatori, conversia de tip nu este efectuata,


comparndu-se att tipurile, ct i valorile acestora;
operatori logici: AND logic (&&, and), OR logic (| |, or) si XOR logic (xor);
operatori pe biti: AND pe biti (&), OR pe biti ( | ) si XOR pe biti (^).

Observatie:
Cu exceptia operatorului de concatenare (in cazul caruia operanzii
folositi au tipul sir de caractere sau sunt convertiti la acesta), toti operatorii
binari folosesc operanzi de tip numeric (intreg sau dublu).

Daca unul sau amandoi operanzii au tipul sir de caractere, logic, null
sau resursa, vor fi convertiti in echivalentii lor numerici, inainte de efectuarea
operatiei.
Limbajul PHP
Operatori ternari

Singurul operator ternar suportat de PHP este ? :, pentru utilizarea


caruia se foloseste sintaxa urmatoare:
$variabila = expresie ? expresie1 : expresie2

Operatorul ? : evalueaza expresia expresie. Daca rezultatul este true,


variabila $variabila va primi valoarea obtinuta prin evaluarea expresiel. In
caz contrar, $variabila va primi valoarea rezultata prin evaluarea expresie2.

Exemplu de script in care se foloseste operatorul amintit:


<?php
$media=9.50;
$situatiescolara=($media>=8.50) ? "este premiant." : "nu este premiant.";
echo "Elevul ".$situatiescolara;
?>
Limbajul PHP
Instruciuni

tim c orice program se poate scrie utilizand numai trei tipuri de


structuri de control:
secventiala (sau liniara)
alternativa
repetitiva conditionata anterior

Pe langa cele trei amintite, oricare limbaj de nivel inalt implementeaza


si alte structuri de control, introduse in scopul cresterii eficientei activitatii de
programare.
Structurile enumerate (cu exceptia celei secventiale) pot fi grupate in
urmatoarele doua categorii:
structuri de control conditional controleaza fluxul programului,
executand sau nu anumite portiuni de cod, in functie de indeplinirea sau
neindeplinirea unor conditii;
structuri de control repetitive executa anumite portiuni de cod de
un numar determinat de ori.
Limbajul PHP
Instruciuni condiionale
Structurile de control conditional sunt implementate in limbajul PHP
prin intermediul instructiunilor:
if
switch
Acestea permit ramnificarea executiei scriptului pe diverse cai, in
functie de deciziile luate in timpul executiei acestuia.
Instructiunea if
Cea mai des utilizata instructiune conditionala este if, iar sintaxa
acesteia este urmatoarea:
if (expresie) {
grup de instructiuni
}

Expresia expresie este evaluata la o valoare logica. Daca aceasta este


true va fi executata secventa de cod grup, care include una sau mai multe
instructiuni. Daca sunt cel putin doua instructiuni, grupul trebuie inclus
obligatoriu intre acolade, in caz contrar fiind executata numai prima
instructiune.
Observatie: In mod obisnuit, sunt folosite acoladele chiar daca grupul contine
numai o singura instructiune.
Limbajul PHP
Instructiunea if
Exemplu:
if ($varsta>99 && $varsta<18) {
echo "Nu puteti accesa aceasta sectiune a site-ului!";
}

Instructiunea if. . .else are urmatoarea sintaxa:


if (expresie) { grup1 }
else { grup2 }

Daca valoarea logica a expresiei expresie - evaluata de interpretorul


PHP este true, va fi executat grupul de instructiuni grup1, in caz contrar fiind
executat grup2.
Exemplu:
Daca o valoare este in intervalul [1, 2], se transmite catre browser
valoarea (x+1)/2, altfel se transmite valoarea (x-1)/2:
<?php
if($x>=1 && $x<=2)
$v=($x+1)/2;
else
$v=($x-1)/2;
echo ($v);
?>
Limbajul PHP
Instructiunea if
Instructiunea asociata unei instructiuni if sau else poate fi ea nsasi o
instructiune if. O asemenea instructiune if se numeste "instructiune if
imbricata".

Exemplu de instructiune if imbricata:


<?php
if ($numar > 10)
if ($numar > 100)
echo "Acesta este un numar mai mare decat 100";
else
echo "Acesta este un numar mai mic decat 100, dar mai mare decat 10";
else
echo "Acesta este un numar mic";
?>
Limbajul PHP
Instructiunea switch
A doua instructiune conditionala este switch, avand urmatoarea
sintaxa:
switch (expresie){
case expresie1: grup1; break;
case expresie2: grup2; break;
.....
[default: grup;]
}
Expresia expresie este comparata cu expresie1, expresie2, .
Daca se gaseste o potrivire pentru comparatie, se utilizeaza operatorul
de egalitate == cu (expresiek), va fi executata secventa de cod
corespunzatoare (adica grupk), ignorand eventualele linii case ramase.
Grupul de instructiuni grup, asociat cazului default, este executat
numai daca, anterior, nu s-a gasit nici o potrivire.
Limbajul PHP
Instructiunea switch
Exemplu:
Daca valoarea transmisa pentru x este 1,2,3,4, atunci valoarea
respectiva este retransmisa catre utilizator alfabetic, altfel, se va transmite un
mesaj oarecare:
<?php
switch($x)
{
case (1): echo(unu); break;
case (2): echo(doi); break;
case (3): echo(trei); break;
case (4): echo(patru); break;
default : echo (Nu este 1, 2, 3 sau 4);
}
?>
Limbajul PHP
Instructiuni pentru controlul executiei iteratiilor
Impreuna cu instructiunile repetitive sunt utilizate instructiunile
break si continue, avand rolul de a introduce elemente de control
suplimentare in executia acestora.
Instructiunea break are rolul de a intrerupe executia iteratiei curente
si, odata cu aceasta, a instructiunii in care este utilizata.
In cazul in care sunt folosite structuri pe mai multe niveluri
(imbricate), break poate primi un argument de tip intreg prin intermediul
caruia se precizeaza nivelul la care se va intrerupe executia instructiunilor:
adica break n, unde n este o expresie care poate fi evaluata la tipul
mentionat;
in plus, break 1 are acelasi efect ca break.
Instructiuni repetitive
Structurile repetitive (sau de ciclare) sunt implementate in limbajul
PHP prin intermediul instructiunilor:
while si for (structura repetitiva conditionata anterior)
respectiv do...while (structura repetitiva conditionata posterior)
,fiind utilizate in scopul executiei repetate a unor secvente de cod. Executia
unei astfel de secvente poarta numele de ciclu, iteraie sau bucl (loop).
Limbajul PHP
Instructiunea while
Sintaxa instructiunii while este urmatoarea:
while (expresie)
{
grup instructiuni
}

Procesorul PHP executa grupul de instructiuni grup in mod repetat, atat timp
cat expresia expresie este evaluata cu valoarea logica true. Evaluarea expresiei amintite
se face la inceputul fiecarei iteratii, ceea ce inseamna ca este posibil ca, in cazul in care
prima evaluare genereaza valoarea logica false, instructiunile incluse in secventa grup sa
nu fie executate niciodata. Acoladele sunt necesare numai daca grup contine cel putin
doua instructiuni.
Exemplu:
Se calculeaza suma:
<?php
$s=0; $i=1;
while($i <= 5)
{
$s+=$i + $i;
$i++;
}
echo ($s);
?>
Limbajul PHP
Instructiunea dowhile
Desi utilizarea instructiunii do. . .while nu este absolut necesara, ea permite
obtinerea unei flexibilitati sporite in scrierea scripturilor. Sintaxa acestei instructiuni
este urmatoarea:
do
{
grup instructiuni
} while (expresie);

Instructiunea do... while este asemanatoare cu while, cu exceptia faptului ca


evaluarea expresiei expresie se face dupa executia grupului de instructiuni grup
rezultand ca aceasta are loc cel putin o data! Acoladele sunt necesare numai daca grup
include cel putin doua instructiuni.
Exemplu:
Se calculeaza suma:
<?php
$s=0; $i=1;
do
{
$s += $i + $i;
$i++;
}while($i <= 5);
echo ($s);
?>
Limbajul PHP
Instructiunea for
Sintaxa instructiunii for este urmatoarea:
for (expresie1; expresie2; expresie3)
{
grup instructiuni
}

Cele trei expresii (argumentele instructiunii), care de cele mai multe ori sunt
construite pe baza unei variabile de ciclare, au urmatoarele semnificatii:
expresie1 (expresie de initializare) este evaluata o singura data, la inceputul
executiei instructiunii for;
expresie2 (expresia de test) - este evaluata la inceputul fiecarei iteratii. In functie de
rezultatul evaluarii, se executa sau nu grupul de instructiuni grup.
expresie3 (expresia de modificare) - este folosita pentru a introduce actiunile care
urmeaza a fi efectuate asupra variabilei de ciclare (incrementare/decrementare).
Exemplu:
<?php
for ($i=2; $i<10; $i++) {
echo "Patratul lui ".$i." este " . $i*$i . " .<br />";
}
?>
Limbajul PHP
Instructiunea for
Alaturi de instructiunile repetitive analizate pana acum, in PHP este
implementata si instructiunea foreach, deosebit de utila pentru traversarea iterativa a
tablourilor asociative sau nesecventiale (in ultimul caz nefiind posibila folosirea
instructiunii for), dar si a celor indexate numeric.

Exemplu in care se utilizeaza instructiunea break, pe un singur nivel intr-un ciclu


foreach:
<?php
$tablou=array(1,2,3,4,5,6,7,8,9);
foreach ($tablou as $element)
{
if ($element>5) { break;
echo $element.", ";
}
}
?>

Dupa executia scriptului, acesta va afisa: 1, 2, 3, 4, 5.


Limbajul PHP
Instructiunea for
Spre deosebire de break, instructiunea continue este folosita in
instructiunile repetitive pentru a intrerupe executia iteratiei curente, continuandu-se cu
urmatoarea.

Exemplu in care se utilizeaza instructiunea continue:


< ?php
$tablou=array(1,2,3,4,5,6,7,8,9,0);
foreach ($tablou as $element) {
if ($element > 4) { continue;
echo "Numarul ".$element." este mai mic decat 5;<br />" }
}
?>

Se afiseaza:
Numarul 1 este mai mic decat 5;
Numarul 2 este mai mic decat 5;
Numarul 3 este mai mic decat 5;
Numarul 4 este mai mic decat 5;
Limbajul PHP
Funcii
n PHP se pot crea funcii fr prea mari diferene fa de ce tim din C/C++.
n programare, o funcie include o secven de cod, care realizeaz o anumit operaie i
poate fi apelat n mod repetat, de cte ori este necesar. Altfel spus, o funcie const
dintr-un set de instruciuni care realizeaz o sarcin specific.
Exemplu: un script in care se utilizeaza o functie pentru calculul ariei unui triunghi si
apoi afiseaza aria.
<?php
function aria_t($b, $h)
{ return $b*$h/2; }
$x=3;
$y=8;
echo (aria_t($x, $y));
?>
Definitiile functiilor PHP pot fi plasate oriunde in interiorul unui script, dar
este preferabila plasarea la inceputul acestuia.
In scopul maririi gradului de reutilizare a functiilor, se poate folosi drept alternativa
plasarea functiilor in fisiere distincte (avand extensia .php, .inc, etc.), urmand ca acestea
sa fie incluse in scripturi prin intermediul instructiunilor PHP dedicate.
Limbajul PHP
Apelarea funciilor

Forma generala a unui apel de funcie este urmatoarea:


nume_ functie (argument1, argument2, ...)

Analizand forma prezentata, se poate observa ca apelul unei functii


consta in apelarea numelui sau, urmat imediat de o lista de argumente actuale
(sau parametri actuali), numarul acestora variind de la o functie la alta
(argument1, argument2, ...).

Fiecare argument trebuie sa fie o expresie valida, care poate include si


alte apeluri de functii.
Limbajul PHP
Functii definite de utilizator
In ceea ce priveste modalitatile de creare, functiile PHP pot fi definite de
utilizator sau predefinite.
Definirea functiilor
Pentru definirea unei functii in PHP se utilizeaza urmatoarea sintaxa:
function nume_functie(argument1, argument2, ...)
{
// Corpul functiei: lista de instructiuni
}
Se observa ca definitia unei functii include urmatoarele parti:
numele functiei (nume_functie), precedat de cuvantul-cheie function;
lista de argumente formale (care poate sa fie si vida), inclusa intre doua paranteze
rotunde (argument1, argument2, ...);
corpul functiei, care consta din orice secventa valida de cod, continuta in mod
obligatoriu intre acolade, inclusiv definitiile altor functii sau ale unor clase.
Variabile automatice
Variabilele locale (utilizate in interiorul functiilor) sunt denumite si
automatice, deoarece ele sunt create automat la inceputul executiei functiei si distruse,
tot automat la sfarsit. Din acest motiv, functiile vor pierde valorile variabilelor
utilizate in interiorul lor.
Limbajul PHP
Functii definite de utilizator
Exemplu:
<?php
function bun_venit($utilizator) {
$mesaj="Bine ai venit, ".$utilizator;
echo $mesaj;
}
bun_venit ("Costica") ;
echo $mesaj;
?>

In acest exemplu, incercarea de a afisa variabila locala $mesaj in


exteriorul functiei bun_venit() se soldeaza cu un esec, aceasta fiind o variabila
locala.
Limbajul PHP
Functii definite de utilizator
Functii care ntorc valori
Functiile pot intoarce (sau returna) valori. Pentru a intoarce o valoare
dintr-o functie, trebuie realizat - in corpul sau - un apel al instructiunii return,
acesta fiind urmata de o expresie valida:
return expresie
Apelul instructiunii return opreste imediat executia functiei, intoarce
expresia expresie si transfera controlul executiei programului pe linia din care
s-a realizat apelul. Valorile intoarse pot avea orice tip, inclusiv tablou si obiect.
Exemplu:
Fie o functie avand numele cub(), care intoarce cubul numarului
primit ca argument (adica, numarul ridicat la puterea a treia):
function cub($numar) {
return $numar*$numar*$numar; }
Dupa ce a fost definita, o functie poate fi utilizata oriunde se doreste,
inclusiv expresiile PHP, ca in exemplul urmator:
$numar=10;
echo 'Cubul numarului ' .$numar.' este ' .cub($numar);
Limbajul PHP
Functii definite de utilizator
Desi functiile nu pot intoarce simultan mai multe valori, se obtin
rezultate similare daca se intorc tablouri, ca in exemplul urmator:
<?php
function note(){
return array (9, 8, 10); }
list ($fizica, $matematica, $informatica)=note();
echo "Nota la fizica: ".$fizica.";<br />";
echo "Nota la matematica: ".$matematica.";<br />";
echo "Nota la informatica: ".$informatica.".";
?>

Argumentele pot fi transferate functiilor prin valoare si prin referinta


Limbajul PHP
Functii definite de utilizator
Transferul argumentelor prin valoare
In cazul transferului prin valoare, expresia transmisa ca argument este
evaluata, iar valoarea obtinuta este atribuita in corpul functiei variabilei cu
acelasi nume.
Este posibil ca argumentele transferate prin valoare functiilor sa fie si
tablouri, ca in exemplul prezentat in continuare, in care functia
suma_elemente() intoarce suma elementelor tabloului transferat ca
argument:
<?php
function suma_elemente($tablou) {
$nrelem=count($tablou);
$sumaelem=0;
for($i=0; $i< $nrelem;$i++) {
$sumaelem += $tablou[$i]; }
return $sumaelem;
}
echo "Suma elementelor tabloului este".suma_elemente(array(10,5,12));
?>
Limbajul PHP
Functii definite de utilizator
Transferul argumentelor prin referinta
Aceasta modalitate de transfer impune ca argumentul functiei sa fie o
variabila. In loc sa se refere la copia valorii variabilei transmise, variabila
corespunzatoare din functie se refera chiar la valoarea variabilei respective, de
fiecare data cand este utilizata. Drept rezultat, functia va schimba chiar
valoarea variabilei transferata.
Un exemplu in care este folosita aceasta modalitate de transfer:
<?php
function cub(&$numar) { // Transmitere prin referinta adresa variabilei
$numar=$numar*$numar*$numar;
}
$n=4;
cub($n);
echo $n;
?>
Limbajul PHP
Functii definite de utilizator
Accesul la variabile declarate in exterior. Variabile globale
Fiecare functie are propriul ei set de variabile (argumentele si/sau cele
definite in corpul sau). Toate variabilele utilizate in exteriorul oricarei functiii
(cu exceptia variabilelor superglobale) nu sunt vizibile in interiorul acesteia,
ceea ce inseamna ca ele nu sunt globale.
Daca se doreste accesarea in interiorul functiei a unei variabile folosite
in exteriorul sau, trebuie folosit tabloul $GLOBALS, ca in exemplul urmator:
<?php
function modifica()
{ $GLOBALS["variabila"]=100; }
$variabila=50;
echo $variabila;
modifica();
echo " ".$variabila;
?>
Limbajul PHP
Functii definite de utilizator
Accesul la variabile declarate in exterior. Variabile globale
De asemenea, este posibil ca una sau mai multe variabile sa poata fi
declarate globale, prin extinderea domeniului lor de vizibilitate utilizand
cuvantul-cheie global:
[global] $variabila1, $variabila2, ...
Variabilele declarate globale (adica, in exteriorul oricarei functii) pot
fi utilizate peste tot in script, inclusiv in definitiile functiilor. In scopul
precizat, este necesar ce ele sa fie importate in interiorul functiilor folosind
cuvantul cheie global, ca exemplul prezentat in continuare:
<?php
function modifica(){
global $variabila;
$variabila=10;
echo $variabila;
}
modifica();
$variabila=20;
echo " ".$variabila;
?>
Limbajul PHP
Functii definite de utilizator
Accesul la variabile declarate in exterior. Variabile globale
Se poate considera ca folosirea variabilelor declarate globale simplifica
activitatea de programare, eliminand partial necesitatea utilizarii
argumentelor in definitiile functiilor.

Cu toate acestea, posibilitatea modificarii variabilelor in orice punct al


scriptului, inclusiv in interiorul functiilor, poate avea drept consecinta scrierea
unui cod dificil de inteles de catre cei care il citesc.

In locul variabilelor declarate globale, este de preferat folosirea


variabilelor locale, functiile urmand sa modifice numai acele variabile care le
sunt transmise ca argumente prin referinta.
Limbajul PHP
Functii definite de utilizator
Functii recursive
Ca si in alte limbaje de programare, in PHP pot fi definite si utilizate
functiile recursive. Se spune ca o functie care se apeleaza pe ea insasi este o
functie recursiva, metoda numindu-se recursivitate.
Ca si intr-o structura ciclica, intr-o functie recursiva trebuie precizata
o conditie de incheiere a executiei. Daca o functie se autoapeleaza direct, se
spune ca se produce recursivitatea directa. In schimb, daca o functie se
apeleaza pe ea insasi, prin intermediul altei functii, se spune ca se produce
recursivitatea indirecta. In mod obisnuit, este utilizata recursivitatea directa.
In exemplul urmator este prezentata o functie (factorial ()) in care se
utilizeaza recursivitatea directa:
<?php
function factorial($n) {
if($n==1)
return 1;
else
return $n*factorial($n-1);
}
echo "Factorial = ".factorial(5);
?>
Limbajul PHP
Functii definite de utilizator
Terminarea executiei unui script
O instructiune return determina sistarea executiei functiei care o
contine. In cazul n care se doreste sistarea prelucrarii unui ntreg script, se
poate invoca functia exit():
<?php
function stop() {
exit(); }
echo "<br />Unu...";
echo "<br />Doi...";
stop();
echo "<br />Trei...";
?>

Dupa executie scriptul afiseaza:


Unu...
Doi...
Rezultatul acestui script include cuvintele "Unu" si "Doi", dar nu si
cuvntul "Trei".
Prin apelarea functiei "stop()" se executa corpul functiei respective; la
invocarea functiei, exit(), executia scriptului se ncheie.
Intrebari
???
Tehnologii WEB

Cursul 10
Planul lectiei:
Limbajul PHP
Tipuri de date compuse

Tipul tablou
Crearea tablourilor
Tablouri multidimensionale
Sortarea tablourilor
Transformarea tablourilor

Tipul obiect
Clasele
Alctuirea i instanierea unei clase
Definirea unei metode constructor
Utilizarea motenirii
Redefinirea metodelor
Invocarea unei metode redefinite
Tablouri cu obiecte
Limbajul PHP
Tipuri de date compuse
In PHP sunt utilizate doua tipuri de date compuse:
tipul tablou;
tipul obiect.

Tipul tablou
Tipul tablou se refer la colecii de date indexate, numite elements,
care pot fi utilizate mpreun.
Acest tip este foarte puternic i des folosit n PHP. Astfel, tablourile se
dovedesc a fi cele mai potrivite containere pentru stocarea datelor n scopul
manipulrii acestora (sortare).
De asemenea, funciile care extrag rezultatele obinute n urma
interogrii unei baze de date, ntorc tablouri.
n plus, unele dintre variabilele predefinite n PHP au tipul tablou:
$_GET
$_POST
$_SESSION
Limbajul PHP
Tipuri de date compuse

Un element al unui tablou este precizat indicnd numele tabloului i


cheia (numit i indexul elementului).

Cheile pot fi:


numere ntregi (tabloul corespunztor este de tip numeric);
iruri de caractere (tabloul corespunztor este de tip asociativ).

Cheile avnd ultimul tip precizat trebuie incluse ntre ghilimele sau
apostrofuri.

Exemple:
$note['matematica'] = 9
sau
$note["matematica"]= 9
Limbajul PHP
Crearea tablourilor

Exist urmtoarele 3 modaliti de creare a unui tablou:


prin atribuire direct;
folosind funcia array();
preciznd cheile odat cu utilizarea funciei array().

Atribuirea direct
Utilizarea acestei modalitati presupune precizarea numelui tabloului,
precum si a cheilor si valorilor fiecarui element.
In cazul in care se doreste utilizarea unei chei de tip sir de caractere, se
procedeaza ca in exemplul urmator:
$elev["scoala"] ="Mihail Sadoveanu";
$elev["clasa"]=10;
$elev["varsta"]=16;
Limbajul PHP
Crearea tablourilor
n exemplul oferit, PHP creeaz automat un tablou cu trei elemente.
Este important de menionat c elementele tabloului $elev pot fi indicate
ulterior preciznd cheia de tip ir de caractere i/sau cheia numeric. Cheile
numerice primesc automat valori ntregi succesive, prima fiind 0.
De exemplu, vrsta unui elev poate fi precizata n urmtoarele dou
moduri:
$varsta=$elev["varsta"];
$varsta=$elev[2];

Modificarea valorii unui element se realizeaz printr-o nou atribuire,


ca n exemplul prezentat n continuare (elevul este promovat n anul colar
urmtor):
$elev["clasa"]=11;

Pentru crearea unui tablou prin atribuire direct, pot fi precizate i


chei numerice, ca n exemplul urmtor:
$orase[0]="Bucuresti";
$orase[1]="Iasi";
$orase[2]="Timisoara";
Limbajul PHP
Crearea tablourilor
Este posibil s se porneasc de la o cheie numeric diferit de 0 sau s se indice
chei care nu au valori succesive.
De asemenea, este posibil s nu se precizeze nici o cheie, ca n exemplul
urmtor:
$tariUE[]="Franta";
$tariUE[]="Germania";
$tariUE[]="Romania";

n acest exemplu, PHP creeaz automat tabloul $tariUE, atribuind elementelor


acestuia chei numerice succesive, ncepnd cu valoarea 0 (adic 0, 1 i 2).
Utilizarea funciei array()
Dac funcia array() se apeleaz fr argumente, va fi creat un tablou vid
(fr elemente).
Pentru a crea un tablou nevid, valorile elementelor acestuia trebuie precizate ca
argumente, sub forma unei liste ale crei componente sunt separate prin caracterul
virgul, ca n exemplul prezentat n continuare:
$orase=array("Bucuresti", "lasi", "Timisoara");

Valorile precizate ca argumente ale funciei vor fi stocate ca elemente n tabloul


$orase, n ordinea precizrii lor, cheile acestora avnd valori ntregi succesive ncepnd
cu 0.
Limbajul PHP
Crearea tablourilor
Precizarea cheilor
PHP ofer posibilitatea de a preciza cheile elementelor odat cu
crearea unui tablou prin intermediul funciei array().
n acest caz, este necesar ca argumentele funciei s fie reprezentate
de o list de perechi cheie-valoare, separate prin virgul, n care cheia i
valoarea sunt separate prin simbolul =>".
Cheile precizate pot fi numerice sau iruri.
Exemplu n care cheile sunt numerice:
$orase=array(0=>"Bucuresti", 1=>"Iasi", 2=>"Timisoara");
Dac se dorete precizarea unor chei de tip ir de caractere, se
procedeaz astfel:
$orase2=array (
"Capitala"=>"Bucuresti",
"Moldova"=>"Iasi",
"Banat"=>"Timisoara");

n exemplul de mai sus, cheile celor trei elemente ale tabloului sunt, n
ordine, "Capitala", "Moldova" i "Banat".
Limbajul PHP
Crearea tablourilor
Tablouri multidimensionale
n exemplele anterioare, pentru a ilustra cele trei metode de creare a
tablourilor, au fost utilizate tablouri unidimensionale.
Dei acestea sunt mai rar utilizate, PHP ofer i posibilitatea de a crea tablouri
multidimensionale.
n continuare este prezentat un exemplu n care este creat un tablou
bidimensional, prin intermediul funciei array():
$note=array ('sem1' =>
array('matematica'=>9,
'fizica'=>9,
'informatica'=>10),
'sem2'=>
array('matematica' =>9,
'fizica'=>8,
'informatica'=>9) );

Acelai tablou poate fi creat prin atribuire direct n felul urmtor:


$note["sem1"] [ "matematica"] =9;
$note["sem1"] [ "fizica"] =9;
$note["sem1"] ["informatica"] =10;
$note["sem2"] ["matematica"] =9;
$note["sem2"] [ "fizica"] =8;
$note["sem2"] ["informatica"] =9;

Atunci cnd este posibil, tablourile multidimensionale se vor crea folosind


instruciunile repetitive (de exemplu instruciunea for).
Limbajul PHP
Crearea tablourilor
Parcurgerea tablourilor
Exist diverse modaliti pentru a parcurge elementele unui tablou
(operaie cunoscut i sub denumirea de traversarea tabloului), cea mai
elegant dintre acestea constnd n utilizarea instruciunii foreach, cu
urmtoarea sintax:
foreach($tablou as [$cheie=>] [&] $valoare)
{
de instruciuni
}

Variabila $cheie este opional i, atunci cnd este specificat, conine


cheia elementului curent.
De asemenea, caracterul &" este opional i, atunci cnd este prezent,
permite modificarea explicit a valorii elementului $valoare prin intermediul
instruciunilor incluse n grupul grup) i transmiterea automat a valorii ctre
tablou ($tablou).
n cele mai multe cazuri, nu se dorete modificarea valorii
elementelor, astfel nct caracterul &" nu se folosete.
Limbajul PHP
Crearea tablourilor
Exemplu n care se utilizeaz instruciunea foreach:
<?php
$orase=array("Bucuresti", "lasi", "Timisoara");
echo "Orase romanesti:<br />";
foreach($orase as $cheie=>$valoare) {
echo "$cheie=$valoare<br />";
}
/*
Se va afisa:
Orase romanesti:
0=Bucuresti
1=Iasi
2=Timisoara
*/
?>

O alt modalitate de parcurgere a elementelor unui tablou consta n utilizarea


funciilor list() i each(), ca n exemplul urmtor:
<?php
$orase=array("Bucuresti", "lasi", "Timisoara");
echo "Orase romanesti:<br />";
reset($orase);
while (list($cheie, $valoare) = each($orase))
{
echo "$cheie=$valoare<br />";
}
?>
Limbajul PHP
Crearea tablourilor
Funcia list() permite atribuirea simultan de valori mai multor
variabile utiliznd elementele unui tablou:
list(Svariabila1, $variabila2, ...) = $tablou;
Ca rezultat al execuiei instruciunii anterioare, variabilelor
$variabila1, $variabila2, ... li se vor atribui valorile elementelor $tablou[0],
$tablou[1], ... , echivalent cu a realiza urmtoarele atribuiri:
$variabila1 = $tablou[0];
$variabila2 = $tablou[1];
...
Funcia each() ntoarce perechea cheie-valoare curent a tabloului
primit ca argument i deplaseaz pointerul intern la urmtorul element.
Perechea ntoars este, de fapt, un tablou cu patru elemente:
cele avnd cheile 0 i "key" pstreaz cheia elementului;
iar cele avnd cheile 1 i "value" pstreaz valoarea acestuia.
Pentru traversarea unui tablou este utilizat un pointer (numrator)
intern al acestuia care nregistreaz poziia curent.
Dac se folosete funcia each() pentru parcurgerea unui tablou, spre
deosebire de instruciunea foreach, este necesar ca n prealabil s se
apeleze funcia reset(), care va muta pointerul intern la nceputul tabloului.
Limbajul PHP
Sortarea tablourilor
Pentru sortarea tablourilor sunt utilizate o serie de funcii dintre, care
menionm:
sort() sorteaz ascendent un tablou n funcie de valoarea elementelor
rsort() sorteaz descendent un tablou n funcie de valoarea elementelor
asort() sorteaz ascendent un tablou asociativ n funcie de valoarea elementelor
arsort() sorteaz descendent un tablou asociativ n funcie de valoarea
elementelor
ksort() - sorteaz ascendent un tablou n funcie de cheie
krsort() - sorteaz descendent un tablou n funcie de cheie
Prototipul sort() este urmtorul:
bool sort(array tablou [, int parametru])
Dup cum se poate observa, funcia sort() primete ca argument
obligatoriu numele unui tablou pe care l va sorta ascendent, n funcie de valorile
elementelor sale.
Argumentul opional parametru este utilizat pentru a schimba
comportamentul funciei la sortare i poate avea ca valoare urmtoarele constante:
sort_regular (valoare implicit) - elementele sunt comparate normal;
sort_numeric - elementele sunt comparate din punct de vedere numeric;
sort_string - elementele sunt comparate ca iruri de caractere codul ASCII al
primului caracter/cifr).
Limbajul PHP
Funcia sort() ntoarce valoarea true, n caz de succes, i false n cazul n care
sortarea nu s-a produs. n primul caz, funcia atribuie noi chei elementelor tabloului.
Exemplu de utilizare:

<?php sorteaza($alfanumeric, SORT_NUMERIC);


$alfanumeric=array("B", "a", 5, 100, "A"); /* Se va afisa:
function sorteaza($tablou, tablou[0]=B
$parametru=SORT_REGULAR) { tablou[1]=a
sort($tablou, $parametru); tablou[2]=A
foreach ($tablou as $cheie=>$valoare) { tablou[3]=5
echo "tablou[".$cheie."]=".$valoare."<br />"; tablou[4]=100
} */
}
sorteaza($alfanumeric, SORT_STRING);
sorteaza($alfanumeric); / * Se va afisa:
/* Se va afisa: tablou[0]=100
tablou[0]=A tablou[1]=5
tablou[1]=B tablou[2]=A
tablou[2]=a tablou[3]=B
tablou[3]=5 tablou[4]=a
tablou[4]=100 */
*/
?>
Limbajul PHP
Transformarea tablourilor
n PHP sunt definite o serie de funcii utilizate pentru transformarea
tablourilor.
Prin transformare se nelege:
unirea tablourilor
extragerea/eliminarea unor poriuni din acestea

Unirea tablourilor
Pentru unirea a dou sau mai multe tablouri ntr-unul singur, se
utilizeaz funcia array_merge() al crei prototip este urmtorul:
array array_merge(array tablou1 [, array tablou2 [,array ]])

Funcia reunete elementele tablourilor precizate ca argumente, astfel


nct elementele unuia sunt adugate la sfritul celui anterior, ntorcnd
tabloul rezultat.
Dac unele elemente au aceleai chei de tip ir de caractere, ultima
valoare o va suprascrie pe cea anterioar.
Nu acelai lucru se ntmpl cu cheile numerice.
Limbajul PHP
Exemplu:
<?php
$tablou1=array("oras"=>"Bucuresti", 10, 89);
$tablou2=array("abac","computer","oras"=>"Braila",4);
$rezultat=array_merge($tablou1, $tablou2);
print_r($rezultat);
/* Se va afisa:
Array
(
[oras]=>Braila
[0]=>10
[1]=>89
[2]=>abac
[3]=>computer
[4]=> 4
)
*/
?>
Limbajul PHP
Extragerea unei poriuni dintr-un tablou

Funcia array_slice(), care extrage o poriune dintr-un tablou, are


urmtorul prototip:
array array_slice(array tablou, int offset [, int lungime [, bool pastreazacheile ]] )

Aceasta funcie extrage din tablou, elementele precizate prin


intermediul argumentelor offset i lungime.

Dac offset nu este negativ, secvena de elemente extrase ncepe cu cel


avnd poziia offset n raport cu nceputul tabloului.

Dac acest argument este negativ, poziia primului element extras va fi


calculat n raport cu sfritul tabloului.

Dac argumentul lungime nu este precizat, vor fi extrase toate


elementele pn la sfritul tabloului.
Limbajul PHP
Exemplu:
<?php /* Se va afisa:
$tablou=array("rosu", "galben", "albastru", "verde", "negru"); Array
$extras=array_slice($tablou, 2); (
print_r($extras); [0] => rosu
/* Se va afisa: [1] => galben
Array [2] => albastru
( )
[0]=> albastru */
[1]=> verde $tablou=array("rosu", "galben", "albastru", "verde", "negru");
[2]=> negru $extras=array_slice($tablou, 2, -1);
) print_r($extras);
*/ /* Se va afisa:
$tablou=array("rosu", "galben", "albastru", "verde", "negru"); Array
$extras=array_slice($tablou, -2, 1); (
print_r($extras) ; [0]=> albastru
/* Se va afisa: [1]=> verde
Array )
( */
[0]=> verde $tablou=array("rosu", "galben", "albastru", "verde", "negru");
) $extras=array_slice($tablou,2,-1,true);
*/ print_r($extras);
$tablou=array("rosu", "galben", "albastru", "verde", "negru"); /* Se va afisa:
$extras=array_slice($tablou, 0, 3); Array
print_r($extras) ; (
[2]=> albastru
[3]=> verde
)
*/
?>
Limbajul PHP
Tipul obiect
Principiul de baz al programrii orientate pe obiecte (POO) l
reprezint ncapsularea datelor.
Un program care nu este orientat spre obiecte este organizat ca un set
de funcii i un set de variabile globale utilizate de acele funcii. Orice funcie
poate opera folosind orice variabil global.
Un program orientat spre obiecte combin funcii i variabile ntr-o
unitate, cunoscut sub numele de clas.
Un program orientat spre obiecte caracteristic este alctuit din mai
multe clase. Programele orientate spre obiecte pot fi mai uor de neles dect
programele care nu sunt orientate spre obiecte, deoarece interaciunile ntre
clasele unui program orientat spre obiecte sunt relativ reduse ca numr.
Pe lng ncapsularea datelor, o alt caracteristic important al POO
este motenirea.
Motenirea const n aceea c putem declara anumite clase ca fiind
derivate din alte clase de baz.
n cele mai multe situaii clasa derivat (numit i clasa copil) extinde
functionalitile clasei de baz (numit i clasa printe). n acest fel se
reduce foarte mult cantitatea de cod necesar.
Limbajul PHP
Clasele
O clas este de fapt o structur care conine variabile (membrii) i
funcii (metode).
Metodele sunt operaiile pe care membrii clasei le pot efectua.
Membrii i metodele declarate ntr-o clas aparin clasei respective i se
acceseaz specificnd numele clasei.
O clas poate include o metod special, numit "metoda
constructor" sau "constructor".
Metoda constructor este o funcie care are acelai nume cu al clasei i
este folosit pentru a crea instane sau membri ai clasei, numii "obiecte".
Diferena ntre clas i obiect este important. Dac o clas poate fi
asimilat unui tip de date, un obiect poate fi echivalat:
cu o variabil;
cu o valoare avnd un anumit tip de date.
Practic, o clas este o "fabric" de obiecte, care produce obiecte cu
aceeai structur, avnd proprieti i metode identice.

Alctuirea i instanierea unei clase


Definirea unei clase ncepe cu cuvntul cheie "class".
Variabilele sau membrii clasei se specifica folosind cuvntul "var".
Limbajul PHP

Funciile sau metodele unei clase se declar specificnd cuvntul


"function".

Clasele au un constructor al clasei, adic o metod care instaniaz o


clas. Numele funciei constructor este acelai cu numele clasei.

Structura general de alctuire a unei clase este urmtoarea:


class nume_clasa {
var membru1;
var membru2;
.................
function nume_functie(); {
function metoda1();
function metoda2();
.................
}
};
Limbajul PHP
Exemplu:
<?php
class ContBanca {
var $sold = 0;
function c_depozit($suma) {
$this->sold = $this->sold + $suma;
}
function obtine_sold() {
return $this->sold;
}
}
?>

Clasa "ContBanca" are un singur membru, "$sold" i dou metode:


"c_depozit()" i "obine_sold()".
Membru (variabila) "$sold" este definit de o instruciune "var".
Clasa "ContBanca" atribuie variabilei "$sold" valoarea iniial zero (
Nu este necesar atribuirea unei valori iniiale unei proprieti, dar astfel
programele devin mai simple i mai uor de citit).
Cele dou metodele sunt definite folosind cuvntul cheie "function".
(Diferena dintre metode i funcii este legat de amplasarea acestora;
metodele sunt definite n interiorul claselor, n timp ce funciile sunt definite
n exteriorul acestora).
Limbajul PHP
Instanierea unei clase se face prin operatorul "new", avnd urmtoarea form
general:
$nume_variabila = new nume_clasa();
Variabila "$nume_variabila" conine o referin la obiectul clasei
"nume_clasa". n continuare referirea metodelor clasei se face prin operatorul de
refereniere "->" ca mai jos:
$nume_variabila->Metoda1();
Variabila apeleaz metoda cu numele "Metoda1()", care aparine clasei
"nume_clasa". tergerea instanelor unei clase se face simplu prin apelarea funciei:
ubset($nume_variabila)
Dupa aceast tergere, orice apel de genul "$nume_variabila->Metoda1();" va
fi semnalat ca eroare.
Exemplu:
<?php
class ContBanca {
var $sold = 0;
function c_depozit($suma) {
$this->sold = $this->sold + $suma; }
function obtine_sold() {
return $this->sold; }
}
$cont = new ContBanca();
$cont->c_depozit(90);
echo "<br /> Soldul este : ". $cont->obtine_sold();
?>
Limbajul PHP
Prima instruciune instaniaz un obiect "ContBanca" folosind operatorul
"new" i stocheaz referina la acest obiect n variabila "$cont", care va fi utilizat
ulterior pentru a obine acces la metodele obiectului.

A doua instruciune folosete variabila "$cont", (care face referire la obiectul


"ContBanca" creat de prima instruciune).

Operatorul "->" arat c PHP trebuie s invoce metoda "c_depozit()" asupra


obiectului desemnat de variabila "$cont".

Cea de-a doua instruciune invoc metoda "c_depozit()" a obiectului, furniznd


argumentului valoarea 90.

Dup cum este definit, metoda "c_depozit", aceasta incrementeaz valoarea


membrului "$sold" cu valoarea argumentului din paranteze, "$suma".

Cea de-a treia instruciune invoc metoda "obtine_sold()", care returneaz


valoarea membrului "$sold".

Instruciunea afieaz valoarea returnat prin intermediul unei instruciuni


"echo", afind "Soldul este : 90".
Limbajul PHP
Definirea unei metode constructor
Pentru ca o clas s fie eficient, ar trebui s aibe mai muli membri.
De exemplu, clasa "ContBanca", pe lng membrul "$sold", ar necesita
membri care s defineasc numele i id-ul posesorului.
O nou versiune a clasei, care include trei membri i o metod
constructor:
<?php
class ContBanca {
var $cont_id;
var $nume_posesor;
var $sold = 0;
function ContBanca($id, $nume, $suma){
$this->cont_id = $id;
$this->nume_posesor = $nume;
$this->sold = $suma;
}
function c_depozit($suma) {
$this->sold = $this->sold + $suma;
return $this->sold;
}
}
?>
Limbajul PHP
Constructorul este "function ContBanca()", aa cum se observ, are
acelai nume ca al clasei. PHP apeleaz automat aceast funcie la invocarea
operatorului "new". Argumentele constructorului sunt folosite pentru a stabili
valorile iniiale ale membrilor noului obiect, "$id", "$nume" i "$suma".
Iat cum s-ar putea folosi noua clas, adaugm codul de mai jos dup
datele de definire a clasei, pe care nu le mai repetm:
<?php
// Aici sunt adaugate datele pentru definirea clasei
$cont = new ContBanca(8, Popescu Costica, 100);
echo "<br /> Contul $cont->cont_id apartine lui
$cont->nume_posesor";
$cont->c_depozit(90);
echo "<br /> Soldul este $cont->sold";
?>
Instructiunea $cont = new ContBanca(8, Popescu Costica,100);
obine accesul la membrii obiectului n mod direct, transferandu-le valorile
"8", "Popescu Costica" i "100".
Datele de ieire ale acestui exemplu sunt urmatoarele:
Contul 8 apartine lui Popescu Costica Soldul este 190
Limbajul PHP
Utilizarea motenirii
Aa cum s-a explicat la nceput, un avantaj al programrii orientate
spre obiecte este facilitatea cunoscut sub numele de motenire.
Pentru a nelege cum funcioneaz, prezint un exemplu care arat
modul de derivare a unei clase "ContCurent" din clasa de baz "ContBancar",
definit anterior i pe care o salvm ntr-un fiier extern "contbanca.php":
<?php
include("contbanca.php");
class ContCurent extends ContBanca {
var $cec_nr;
function ContCurent($id, $nume, $suma, $cecnr) {
$this->cont_id = $id;
$this->nume_posesor = $nume;
$this->sold = $suma;
$this->cec_nr = $cecnr;
}
function primire_cec($cecnr, $suma) {
$this->sold = $this->sold - $suma;
}
function obtine_sold() {
return $this->sold;
}
}
?>
Limbajul PHP
Utilizarea motenirii

Exemplul folosete o instruciune "include" pentru a obine accesul la


definiia clasei "ContBanca"(ar putea fi plasate i n acelai fiier).

Cuvntul cheie "extends" stabilete identitatea clasei "ContCurent" ca


fiind derivat a clasei "ContBanca". Clasa derivat definete:
un membru - "$cec_nr"
un constructor
dou metode: "primire_cec()" i "obtine_sold()

Important este c aceast clas mai include membrii: "$cont_id",


"$nume_posesor" i "$sold", care sunt definii n clasa de baz, n plus va
moteni i metoda "c_depozit()".

Constructorul atribuie valori membrilor motenii, dar i membrilor


noi definii n clasa derivat.
Limbajul PHP
Utilizarea motenirii

Cum putem folosi aceast clas derivat?

Creem un obiect "ContCurent", adaugm datele acestuia dup codul


de definire a clasei derivate prezentate mai sus:
<?php
// Aici sunt adaugate datele pentru definirea clasei
derivate
$cont = new ContCurent(8, "Popescu Costica", 100, 11);
$cont->primire_cec(11, 150);
$cont->c_depozit(250);
echo "<br /> Soldul este". $cont->obtine_sold();
?>

Se observ c metoda "c_depozit()", care este definit n clasa de baz,


este invocat ca i cum ar fi fost definit n clasa derivat; metodele motenite
nu necesit un tratament de natura special.
Limbajul PHP
Redefinirea metodelor
Uneori, o clas existent include o metod care nu este adecvat
pentru o clas derivat. n loc de a defini nou clas fr referire la o clas de
baz, se poate anula metoda inadecvat adugnd o metod cu acelai nume
n clasa derivat. Astfel la instaniere va fi folosit metoda, cu acelai nume,
din clasa derivat.
<?php
class ContBanca2 {
var $cont_id;
var $nume_posesor;
var $sold = 1;
function ContBanca2($id, $nume, $suma) {
$this->cont_id = $id;
$this->nume_posesor = $nume;
$this->sold = $suma;
}
function inchide_cont() {
$suma = $this->sold;
$this->sold = 1;
return $this->sold;
}
}
?>
Limbajul PHP
Redefinirea metodelor

S presupunem c dorim s derivm din aceasta o clas care


reprezint un nou tip de cont bancar, cu dobnd. La nchiderea contului,
programul trebuie s calculeze dobnda pe care s o adauge la soldul curent i
s returneze suma acumulat.
<?php
class ContEco extends ContBanca2
{
function inchide_cont($zile, $rata)
{
$suma = $this->sold * $rata * ($zile / 365);
$suma = $suma + $this->sold;
$this->sold = 1;
return $suma;
}
}
?>
Limbajul PHP
Invocarea unei metode redefinite

Dac se ncearc s se invoce o metod anulat (redefinit), se va


obine o eroare. Dac n exemplul anterior, am fi scris instruciunea: "echo
"<br /> Didi primeste ". $cont->inchide_cont();", fr cele dou argumente
(22, 0.8), ncercnd astfel s se fac referire la metoda anulat
"inchide_cont()", s-ar primi mesajele de eroare:
Warning: Missing argument 1 for
ContEco::inchide_cont(),
Warning: Missing argument 2 for
ContEco::inchide_cont()

Invocarea unei metode redefinite este un procedeu mai complicat,


pentru nceptori este mai bine a fi evitat deoarece poate complica nelegerea
scriptului.
Limbajul PHP
Invocarea unei metode redefinite

Exemplu de clas derivat care utilizeaz acest procedeu:

<?php
class ContEco extends ContBanca2 {
function inchide_cont($zile, $rata) {
$suma = ContBanca2::inchide_cont();
$suma = $suma + $suma * $rata * ($zile / 365);
return $suma;
}
}
?>
Limbajul PHP
Tablouri cu obiecte
Tablourile (numite i matrice) reprezint o modalitate convenabil pentru
lucrul cu mai multe valori.
Valorile stocate n tablouri pot face referire la obiecte exact aa cum procedeaz
n cazul numerelor sau al irurilor. Un tablou care face referire la obiecte se numete
"tablou cu obiecte".
clasa "ContBanca" i dou clase copil ale acesteia:
<?php // Incepe codul pt. prima clasa copil
class ContBanca { class ContCurent extends ContBanca {
var $cont_id; function ContCurent ($id, $nume, $suma) {
var $nume_posesor; ContBanca::ContBanca($id, $nume, $suma,
var $sold; "curent");
var $tip_cont; }
function ContBanca($id, $nume, $suma, $tip) { }
$this->cont_id = $id; // Incepe codul pt. a doua clasa copil
$this->nume_posesor = $nume; class ContEco extends ContBanca {
$this->sold = $suma; function ContEco ($id, $nume, $suma) {
$this->tip_cont = $tip; ContBanca::ContBanca($id, $nume, $suma,
} "economii");
function dump() { }
return "Cont = ". $this->cont_id. }
" posesor = ". $this->nume_posesor. ?>
" sold = ". $this->sold.
" tip = ". $this->tip_cont;
}
}
Limbajul PHP
Tablouri cu obiecte

Remarcati faptul ca metodele constructor ale celor doua clase copil fac referire
la constructorul clasei parinte, reutiliznd n mod eficient caracteristica furnizata de
clasa parinte, reducand astfel codul programului. Acum, creem instante ale claselor
copil si stocam referintele la aceste instante ntr-un tablou:
<?php
$cont[0] = new ContCurent(11, Popescu Costica",
100);
$cont[1] = new ContEco(12, "Didi", 140);
?>

De exemplu, dupa ce am definit clasele si am stocat instantele in tabloul


"$cont[]" de mai sus, adaugam urmatorul cod:
<?php
// Aici adaugam datele pt. definirea claselor
// Aici adaugam codul pentru stocarea instantelor
in tablou
foreach ($cont as $contul) {
echo "<br /> ". $contul->dump();
}
?>
Limbajul PHP
Tablouri cu obiecte

Din moment ce referintele instantelor incluse n tablou se refera la un obiect la


care este asociata o metoda "dump()", tabloul este simplu de parcurs, prin invocarea
metodei "dump()", care doar afiseaza membrii claselor unui obiect "ContBancar" sau ale
unui obiect din una din clasele sale derivate.

Exemplul va afisa urmatorul rezultat:


Cont = 11 posesor = Popescu Costica sold = 100 tip =
curent
Cont = 12 posesor = Didi sold = 140 tip = economii
Intrebari
???
Tehnologii WEB Cursul 11 + 12 1

1. Dezvoltare de aplicaii PHP cu baze de date MySQL

1.1. Funcii PHP pentru operare cu MySQL

Pe lng setul standard de comenzi aferente limbajului PHP, acesta dispune de o serie de funcii
i variabile predefinite care uureaz munca programatorului, unele dintre ele fiind incluse implicit
(built-in) n interpretor (spre exemplu, suportul pentru MySQL, FTP, XML), altele fiind disponibile prin
utilizarea unor fiiere externe ca extensii (biblioteci .dll). Aceste fiiere extensie de tip .dll (cu numele
generic php_*.dll) permit limbajului PHP s opereze cu o mare diversitate de tehnologii conexe, inclusiv
cu baze de date (n acest ultim caz, ele nglobnd funciile necesare accesrii i manipulrii unor baze de
date de diverse tipuri).

MySQL este unul dintre cele mai folosite sisteme de gestiune a bazelor de date client-server,
fiind cel mai des utilizat n combinaie cu scripturi PHP. Operarea cu baze de date MySQL nu necesit
utilizarea unei biblioteci suplimentare (.dll), suportul pentru MySQL fiind inclus funcional n motorul
interpretorului PHP. Prezentul paragraf va prezenta cele mai importante funcii PHP utilizate n lucrul cu
bazele de date MySQL (tabel 1.1), nsoite de aplicaii exemplificative n paragrafele ulterioare.

Tabel 1.1.

Tip_returnat Aciuni/caracteristici
Funcie(...)

resource - realizeaz conectarea la un server MySQL;


mysql_connect
- funcia necesit trei parametri uzuali: nume server MySQL/ adres IP
server, nume utilizator MySQL i parola de acces;

- returneaz valoarea logic FALSE n cazul n care a euat conectarea la


server-ul de baze de date, respectiv un identificator resurs de acces la
conexiunea cu server-ul MySQL n cazul n care conectarea a reuit.

resource - realizeaz o conexiune permanent la un server MySQL (parametrii fiind


mysql_pconnect aceiai ca la funcia anterior);
- iniial, caut o conexiune permanent deja existent, iar n cazul n care
nu gsete, creeaz una;
- nu nchide conexiunea la final de script;

- returneaz valoarea logic FALSE n cazul n care a euat conectarea la


server, respectiv un identificator resurs de acces la conexiunea cu MySQL
n cazul n care conectarea a reuit.

bool mysql_close - primete ca parametru un identificator de acces la o conexiune cu un


server MySQL i realizeaz nchiderea acesteia. n cazul n care parametrul
nu este specificat, se va nchide conexiunea curent;

- returneaz valoarea logic TRUE n cazul n care nchiderea conexiunii s-a


realizat cu succes, respectiv valoarea logica FALSE n caz contrar;

- funcia este opional n cazul n care conexiunea nu este permanent,


aceasta nchizndu-se automat la final de script.

bool mysql_select_db - selecteaz/deschide o baza de date curent (existnd deja o conexiune cu


un server MySQL) pentru interogrile/operaiile SQL care vor urma;
- funcia are doi parametri: primul este de tip ir de caractere,
reprezentnd numele bazei de date deschise/selectate, iar cel de-al doilea
parametru reprezint identificatorul resurs de acces la conexiunea cu
serverul MySQL;
- returneaz valoarea logic TRUE n cazul n care s-a reuit selectarea
bazei de date, respectiv valoarea logic FALSE n cazul n care baza de date
nu poate fi deschis (nu exist, utilizatorul nu are drepturi de acces la
aceasta, etc).
bool mysql_create_db - permite crearea unei noi baza de date MySQL;
- funcia are doi parametri: primul este de tip ir de caractere,
2 Tehnologii WEB Cursul 11 + 12

reprezentnd numele bazei de date care va fi creat, iar cel de-al doilea
parametru reprezint identificatorul aferent conexiunii cu MySQL-ul;
- returneaz valoarea logic TRUE n cazul n care a reuit s creeze baza
de date, respectiv valoarea logic FALSE n caz contrar.
bool mysql_drop_db - permite tergerea unei baze de date MySQL;
- funcia are doi parametri: primul este de tip ir de caractere,
reprezentnd numele bazei de date care va fi tears, iar cel de-al doilea
parametru reprezint identificatorul aferent conexiunii cu MySQL-ul;
- returneaz valoarea logic TRUE n cazul n care a reuit s tearg baza
de date, respectiv valoarea logic FALSE n caz contrar.

resource - trimite/paseaz o comand SQL spre serverului MySQL (sub forma unui
mysql_query string de caractere);
- returneaz, n caz de succes, un identificator resurs care va fi folosit n
continuare ca parametru n apelurile unor eventuale funcii, (realiznd
extragerea rezultatului interogrii), iar n caz contrar, returneaz valoarea
logic FALSE.

array - returneaz o nregistrare/linie extras dintr-o tabel interogat (sau


mysql_fetch_row jonciune de tabele), sub forma unui ir (array cu primul indice de element
0).

- presupunnd $row numele array-ului returnat, elementele acestuia pot fi


referite pa baza indicelui lor: $row[0], $row[1], ...

array - aceeai funcionalitate ca i mysql_fetch_row, dar elementele irului


mysql_fetch_assoc returnat sunt referite nu prin indici, ci prin nume asociate lor, identice cu
numele coloanelor referite prin interogare: $row[coloana1],
$row[coloana2], ...

array - aceeai funcionalitate ca i mysql_fetch_row /mysql_fetch_assoc, n


mysql_fetch_array varianta implicit (fr parametri opionali), permind ambele moduri de
referire a elementele irului returnat: fie prin indice, fie prin numele asociat
(numele coloanei).

- deci se poate face o referire echivalent a unui element: $row[0] sau


$row[coloana1]

object - aceeai funcionalitate ca i mysql_fetch_row, returnnd ns un tip


mysql_fetch_object object, datele putnd fi referite ca proprieti ale acestuia:

$row->coloana1,

$row->coloana2, ...

int mysql_num_rows - returneaz numrul de linii obinute n urma executrii unei comenzi SQL
de interogare SELECT.

int mysql_num_fields - returneaz numrul de coloane (cmpuri) aferente setului de date obinut
ca urmare a execuiei unei comenzi SQL SELECT.

resource - permite oferirea de informaii asupra unei anumite tabele (jonciuni de


mysql_list_fields tabele), returnnd ca rezultat un identificator resurs, care poate fi folosit
de ctre urmtoarele funcii conexe: mysql_field_name, mysql_field_len,
mysql_field_type.
Tehnologii WEB Cursul 11 + 12 3

string - returneaz succesiv numele coloanelor tabelei.


mysql_field_name

int mysql_field_len - returneaz succesiv dimensiunea coloanelor tabelei.

string - returneaz succesiv tipul coloanelor tabelei.


mysql_field_type

int - returneaz numrul de linii afectate de o comand SQL anterioar de tip


mysql_affected_rows UPDATE, INSERT, DELETE.

int mysql_errno - permite identificarea erorii care s-a produs n timpul execuiei de ctre
serverul MySQL a unei comenzi SQL;
- returneaz codul numeric al erorii n cazul n care a aprut o
eroare n timpul executrii unei comenzii SQL, respectiv 0 n caz contrar.

string mysql_error - permite identificarea erorii care s-a produs n timpul executrii unei
comenzi SQL;
- returneaz un mesaj n care eroarea este descris explicit n cazul n care
a aprut o eroare n timpul executrii unei comenzii SQL, respectiv un ir
vid n caz contrar.

tip_variabil
- preia valoarea unei celule din setul de date, aferente unei anumite
mysql_result coloane dintr-un rnd al unui cursor, rezultat ca urmare a unei comenzi
SQL SELECT.
bool mysql_free_result - realizeaz eliberarea zonei de memorie ocupat de cursorul indicat ca
argument, rezultat ca urmare a unei comenzi SQL SELECT;
- returneaz valoarea logic TRUE n caz de succes, respectiv valoarea
logic FALSE n caz contrar.

Observaie: De regul, cele mai utilizate funcii PHP pentru operarea cu o baz de date MySQL sunt:
mysql_connect (conectare la serverul MySQL), mysql_select_db (deschiderea unei baze de date),
mysql_query (interogare prin trimiterea spre server a unui string ntr-o sintax valid de comand SQL),
mysql_fetch_row (extragere date returnate), mysql_close (nchidere conexiune). Se poate remarca o
mare varietate de comenzi destinate extragerii datelor returnate de o interogare (mysql_fetch_...),
rmnnd la latitudinea programatorului selecia comenzii pe care o consider cea mai potrivit.

Folosind funciile anterior prezentate (i nu numai acestea), programatorul poate realiza aplicaii
PHP complexe n conexiune cu baze de date de tip MySQL, conferind astfel o dinamic sporit aplicaiei
WEB.

1.2. Elemente MySQL

Dup instalarea pachetului WAMP, un client consol MySQL este disponibil chiar din meniul
WAMP, sub denumirea MySQL Console (fig. 1.1). User-ul cu rol de administrator al serverului MySQL are
numele root i nu are o parol implicit setat. Este indicat ca, dup prima logare, s se seteze o parol
pentru acest important user.
4 Tehnologii WEB Cursul 11 + 12

Fig. 1.1. WAMP- MySQL Console

Setarea unei parole pentu user-ul root se poate face cu o comand de genul:

mysql> SET PASSWORD FOR root@localhost = PASSWORD(parola);

mysql> SET PASSWORD FOR root@% = PASSWORD(parola);

De sunt necesare dou comenzi? Practic sunt doi useri administrator, cu acelai nume root, unul
fiind dedicat conectrii exclusiv de pe localhost, iar cellalt (cu acelai nume) pentru realizarea unor
conexiuni din exterior (la distan sau remote).

Cei doi useri pot fi vizualizai cu comanda (parolele fiind criptate):

mysql> select host, user, password from mysql.user;

Tot dupa instalarea serverului de baze de date, dou baze sunt implicit create, avnd numele
mysql (coninnd informaiile pentru administrarea userilor, drepturilor acestora, parolelor de acces,
etc.), respectiv test (baz de lucru pentru root).

Vizualizarea numelor bazelor de date existente pe server, respectiv deschiderea uneia sau alteia
i afiarea numelor tabelelor din baza curent, se poate face cu o secven de comenzi de forma
urmtoare:

mysql> SHOW DATABASE;

mysql> USE test;

mysql> SHOW TABLES;

Pentru proiectarea i implementarea unei noi aplicaii, se recomand crearea unei noi baze de
date, respectiv crearea unui nou user i atribuirea de drepturi acestuia doar pe aceast nou baz de
date. Spre exemplu:

mysql> CREATE DATABASE persoane;

mysql> CREATE USER ion@localhost IDENTIFIED BY parola;

mysql> GRANT ALL ON persoane.* TO ion@localhost;

Se presupune serverul MySQL plasat pe acelai host cu interpretorul PHP, cu serverul Apache i
deci, implicit, cu scripturile PHP care integreaz rolul de user). Astfel, un singur user MySQL permind
doar o conectare de pe localhost este suficient pentru operare (oferind n plus i o securitate
suplimentar, doar un apel conexiune dintr-un script PHP fiind permis, respectiv orice apel extern, de la
distan (remote), fiind respins). Folosirea noului user implic deschiderea unei noi console client,
aceasta putnd fi startat printr-o comand de rulare direct a aplicaiei client mysql.exe cu parametri
Tehnologii WEB Cursul 11 + 12 5

(-h urmat de numele/adrea IP a host-ului, -u urmat de numele de user, p preciznd c este necesar
i se va cere o parol):

C:\wamp\mysql\bin\mysql.exe -h localhost -u ion -p

Dup tastarea parolei adecvate, prompter-ul mysql> va apare confirmnd realizarea conexiunii
la server i permind deschiderea bazei dorite:

mysql> USE persoane;

n acest moment se poate trece la crearea tabelelor bazei de date i la o operare standard cu
comenzi SQL consacrate (CREATE TABLE, INSERT, UPDATE, DELETE, SELECT, etc.).

Tabela table1, considerat n continuare n majoritatea exemplificrilor care vor urma


(aparinnd bazei de date persoane), a fost creat folosind comanda:

CREATE TABLE table1(

Nume CHAR(10),

Varsta INTEGER,

localitate CHAR(10));

Observaii: Prsirea consolei MySQL (i implicit nchiderea conexiunii user-ului curent cu serverul) se
face cu comanda exit. Din motive de comoditate viznd lansarea rapid a unui ferestre consol MySQL
(permind implicit conectarea doar ca user administrator), exemplele care urmeaz folosesc userul root
pentru accesul la baza de date persoane.

1.3. Interogare neparametrizat a unei tabele a bazei de date

Acest prim exemplu prezint o modalitate simpl de interogare fr parametrii a unei tabele a
unei baze de date MySQL. Sunt exemplificate modurile de utilizare ale urmtoarelor funcii, respectiv
comenzi i structuri:

- funcii legate direct de lucrul cu baze de date MySQL: mysql_connect(), mysql_select_db(),


mysql_query(), mysql_num_rows(), mysql_num_fields(), mysql_fetch_row( );
- funcii i comenzi PHP generale: print( ),echo, if( ), while( ), foreach( ), die( ).
Exemplul este pur didactic, aplicaia nefiind optimizat, rolul ei fiind doar acela de a detalia
funcionalitile unor comenzi, funcii i structuri PHP uzual folosite n operarea cu baze de date,
controlul fluxul scriptului i a modului de proiectare i implementare al unui acces la date stocate pe un
server MySQL. Cunotine apriorice legate de bazele de date SQL sunt necesare, n continuare sunt
punctate pe scurt cteva aspecte specifice MySQL-ului.

Codul surs PHP al aplicaiei considerate este urmtorul (rezultatul apelului acesteia, folosind un
browser WEB, fiind prezentat n fig. 1.2) :

<?php

//Conectare la server

//(n cazul de fa , server MySQL local, user root, parola parola)

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

//Selecie baza de date

mysql_select_db("persoane") or die("Nu se poate deschide baza de date");

//Interogare tabel (comand SQL)

$query=mysql_query("select * from table1 where nume=ion");

//Creeaz capul de tabel (se face o afiare tabelat )

print(<table align=center BORDER="2">);

print ("<tr>");
6 Tehnologii WEB Cursul 11 + 12

echo <th BGCOLOR="Silver">Nume</th>;

echo <th BGCOLOR="Silver">Virsta</th>;

echo <th BGCOLOR="Silver">Localitate</th>;


print ("</tr>");

//Iniializare variabil _contor coninnd num rul de elemente (celule)

// returnate prin interogarea tabelei

$nr_val=0;

//Cicleaz dup nr. nregistr ri/linii g site (realiznd o condiie logic i o

// atribuire prin returnarea elementelor unei linii/nregistr ri n variabila

// ir (array) $row)

while ($row = mysql_fetch_row($query)){

// Variabila $row este un ir (array) coninnd succesiv, la un moment

// dat, elementele unei nregistr ri (row[0] va conine elemente din //coloana 1 a liniei
curente, etc)

//Creeaz o linie nou n tabel

echo" <tr>\n";

//Cicleaz dup elementele unei nregistr ri/linii

foreach ($row as $value) {

//Pune ntr-o celul din tabel elementul unei nregistr ri (valoarea dintr-// un cmp al
nregistr rii)

//Creeaz o coloan nou n linia tabelului

echo "<td>$value</td>";

//Incrementeaz variabila_contor =

// nr.total elemente = nr.inreg. X nr. cmpuri

$nr_val++;

}//nchide bucl foreach

echo "</tr>";

}//nchide bucl while

//Calculeaz nr. de coloane returnate prin interogare

$coln=mysql_num_fields($query);

$nr_inreg=$nr_val/$coln; //calculeaz nr. de nregistr ri/linii

echo "<br>";

echo "<center>";

if ($nr_inreg>0) //verific cte nregistr ri s-au g sit


Tehnologii WEB Cursul 11 + 12 7

echo "s-au gasit: ".$nr_inreg." inregistrari";

// punctul (.) - rol de operator de concatenare ntre siruri

else

die ("Nu gasesc nici o inregistrare ...");

//Comanda die nchide programul i toate conexiunile (ieire forat )

echo "</center>";

//Comanda urm toare se va executa numai n caz de c utare reuit

mysql_close();

?>

Fig. 1.2. Afiare date interogare

Funcia mysql_connect realizeaz conectarea la serverul MySQL. Aceast funcie poate avea
pn la cinci parametri (toi putnd fi opionali), dintre care doar primi trei sunt de regul necesari,
ultimii doi fiind mai puin folosii:

- Primul parametru reprezint numele server-ului MySQL sau adresa de IP a computerului pe


care rezid serverul. Dac acest parametrul lipsete, caz n care i ceilali patru lipsesc
(mysql_connect()), se ncearc conectarea la un eventual server MySQL de pe calculatorul curent
(conectare pe local, echivalent de altfel cu a scrie ca nume de server localhost -ca n exemplul
anterior- sau adresa IP 127.0.0.1). n acest caz, ca nume de utilizator implicit se va considera root,
fr parol (user-ul implicit MySQL).

- Cel de-al doilea parametru reprezint numele utilizatorului, iar n cazul n care lipsete
(obligatoriu lipsind i ceilali parametrii care l succed), se folosete ca substitut implicit numele de
utilizator sub care ruleaz serverul MYSQL, adic de regul root (mysql_connect("localhost"));

- Al treilea parametru reprezint parola utilizatorului, iar n caz ca lipsete se folosete irul vid
pe post de parol pentru conectarea la server (mysql_connect("localhost","user1"));

Observaie: Din motive de securitate, se recomand a se folosi aceti primi trei parametrii cu valori
concrete, ne lsndu-se (prin lips lor) active valorile implicite care conduc la o cretere substanial a
gradului de vulnerabilitate al aplicaiei. Pentru MySQL (inclus n pachetul WAMP5), dup cum s-a mai
precizat, user-ul implicit existent la instalare este root, fr parol.

- Al patrulea parametru este de tip logic, avnd rolul de a indica motorului PHP c, n cazul n
care exist deja o conexiune la acelai server MySQL, s creeze o nou conexiune n loc s o reutilizeze
pe cea existent;
8 Tehnologii WEB Cursul 11 + 12

- Ultimul parametru este de tip ntreg i reprezint proprietile pe care le va avea conexiunea
(spre exemplu, dac se folosete compresia datelor).

Funcia mysql_connect returneaz (n cazul n care conectarea a reuit) un identificator resurs


de acces aferent conexiunii cu server-ul MySQL. Funcia este absolut necesar a fi folosit naintea
oricrei alte funcii opernd cu MySQL, asigurnd practic realizarea conexiunii/legturii cu serverul de
baze de date.

Funcia mysql_select_db selectez/deschide o baz de date aferent serverului MySQL cu care


s-a fcut conexiunea, fiind absolut necesar pentru interogrile/comenzile SQL care vor urma. Funcia
are doi parametri: primul (obligatoriu), este de tip ir de caractere i reprezint numele bazei de date pe
care se va opera, iar cel de-al doilea parametru (opional) reprezint identificatorul de acces la
conexiunea cu serverul MySQL. Dac acesta nu este specificat explicit, se consider conexiunea curent
existent cu serverul MySQL. Funcia returneaz valoarea logic TRUE n cazul n care s-a reuit
selectarea bazei de date, respectiv valoarea logica FALSE n caz contrar (baz de date nu exist,
utilizatorul nu are drepturi de acces la aceasta etc.).

Funcia mysql_query este cea prin care se asigur interaciunea efectiv cu elementele (datele)
bazei de date, permind operaiile SQL uzuale (interogare, adugare, tergere, modificare etc). Funcia
are doi parametri:

- Primul parametru este de tip ir de caractere i reprezint cererea (comanda SQL) trimis spre
execuie server-ului MySQL (n exemplul de fa, o comand SELECT pe o tabel);

- Al doilea parametru reprezint identificatorul de acces al conexiuni cu serverul MySQL. n cazul


n care acesta lipsete se ia n considerare conexiunea curent;
n exemplul anterior, cutarea n tabel s-a fcut dup o valoare bine precizat: "select * from
table1 where nume=ion". Exist ns situaii n care nu se cunoate exact valoarea cheii de cutare, n
acest caz, o alternativ constituind-o folosirea operatorul like. Acesta, mpreun cu wildcard-ul %
permit realizarea unei interogri dup o masc aproximativ (ceva ce seamn cu cheia de cutare).
Spre exemplu, dac se dorete afiarea tuturor persoanelor a cror nume ncepe cu ion, se poate folosi
comanda "select * from table1 where nume like ion%". n cazul n care se cere afiarea tuturor
persoanelor a cror vrst se termin cu cifra 9, comanda select va arta n felul urmtor: "select *
from table1 where varsta like %9"

Observaie: Evident, comanda SELECT poate fi i o interogare pe mai multe tabele (jonciuni de tabele),
spre exemplu: select tabela1.col11, tabela1.col.12, tabela2.col21, tabela2.col22 from tabela1, tabela2
where tabela1.col.12 = tabela2.col21

Bucla while($row=mysql_fetch_row($query)), utiliznd funcia mysql_fetch_row, poate fi


interpretat astfel: att timp ct este gsit o linie (coninutul fiecrei linii gsite fiind returnat succesiv
de funcia mysql_fetch_row n variabila array $row) execut.

Funcia mysql_fetch_row va umple succesiv un ir ($row) cu datele unei linii returnate de


interogare. Aceste date sunt prelucrate succesiv (de regul afiate ntr-un tabel pe ecran), ncepnd cu
prima linie, apoi se trece la a doua (coninutul irului $row fiind astfel suprascris succesiv) i aa mai
departe. Practic, bucla while() cicleaz dup numrul de articole/linii gsite i returnate n urma
interogrii.

Dup cum s-a mai precizat, PHP-ul ofer o multitudine de funcii alternative pentru extragerea
datelor aferente liniilor returnate de interogare. n exemplificarea curent s-a folosit
mysql_fetch_row, dar se puteau folosi (n cadrul condiiei buclei while) i urmtoarele variante
alternative:

- $row = mysql_fetch_array($query), cele 3 elemente ale array-ului $row putnd fi


referite direct $row[0], $row[1], $row[2], ceea ce ar conduce probabil la un cod mai optimizat.
- $row = mysql_fetch_assoc($query), genernd un ir cu elementele $row[nume],
$row[varsta], $row[localitate], referite cu nume asociate coloanelor interogrii (n cazul de fa,
chiar numele coloanelor tabelei).
- $row = mysql_fetch_object($query), elementele irului returnat putnd fi referite
ca: $row->nume, $row->varsta, $row->localitate.

Dac numrul de linii returnate de interogare este constant, cunoscut aprioric, funcia de
extragere a datelor mysql_fetch_row poate fi referit explicit de cte ori este nevoie, fr a se mai
Tehnologii WEB Cursul 11 + 12 9

face apel la o structur de ciclare, gen while. Este cazul unei cutri dup o cheie primar, numrul de
linii gsite putnd fi 1 sau 0. n acest caz, comanda de extragere trebuie referit o singur dat,
returnnd fie un array aferent linie gsite, fie FALSE dac nu a gsit nici o linie.

Linia print(<table align=center BORDER="2">); trimite spre ecran un ir HTML pentru


crearea unui tabel n care vor fi afiate datele gsite. Deci tag-ul <table> definete un tabel de afiare,
tag-ul <tr> se refer la construcia unei linii din tabel, <th> la o linie-header (cap de tabel), <td> la o
coloan, toate fiind elemente HTML care permit construcia unui format tabelat de afiare pe ecran.

Observaie: Comanda print are un efect similar cu al comenzii echo (afiare neformatat a unui string).
Pentru afiarea unor string-uri care includ variabile, se poate folosi i o comanda de afiare formatat
printf (dispunnd de civa parametri speciali pentru formatarea coninutului variabilelor integrate n
string-ul de afiat: %s, %d, %f). Un scurt exemplu de utilizare al acesteia este prezentat n continuare:

$var="string";

printf("Afisare: %s\n", $var); //Afiare: string

$var=10.1234;

printf("Afisare intreg: %d", $var); //Afiare intreg: 10

printf("Afisare float: %f", $var); //Afisare float: 10.123400

printf(Afisare float: %.2f , $var); //Afisare float: 10.12

Comanda foreach ($row as $value) este practic o bucl intern buclei while(), ciclnd n cadrul
fiecrui articol/linie dup numrul de elemente ale articolului/liniei. Pentru fiecare articol succesiv gsit
(in ciclul while()), comanda foreach() ca i bucl, extrage succesiv din irul $row cte un element i-l
trimite spre variabila $value (care la un moment dat conine o valoare a unui articol corespunztoare
unui anumit cmp, deci practic valoarea unei celule).

Afiarea pe ecran (n celulele tabelului de afiare construit) a coninutului variabilei $value (echo
"<td >$value</td>";), nseamn practic afiarea element

cu element a coninutului fiecrui articol gsit, n celule succesiv create. Prin incrementarea
variabile $nr_val, aceasta va conine numrul total de elemente (spre exemplu dac numrul de articole
gsite este 3 (bucla while() se va executa de 3 ori), iar numrul de cmpuri este 5 (bucla foreach() se
va executa de 5 ori), $nr_val=3X5=15.

Funcia mysql_num_fields returneaz numrul de coloane (cmpuri) rezultat n urma


interogrii cu comanda mysql_query. Dac mysql_query conine o comand SQL de forma SELECT * ,
practic va returna numrul total de coloane (cmpuri) ale tabelei (sau jonciunii de tabele) referite.
mprind valoarea variabilei $nr_val la valoarea returnat de funcia mysql_num_fields (oferind
numrul de cmpuri implicate n interogare), se obine numrul de nregistrri/linii gsite i returnate de
interogare.

Comanda die (executat pe ramura else a verificrii if( )) nchide automat conexiunea i
ncheie forat programul (nici o alt comand care ar mai urma n script nu se mai execut) .

Comanda mysql_close nchide conexiunea cu serverul MySQL (primind ca parametru un


identificator de acces la o conexiune spre un server MySQL). n cazul n care parametrul nu este
specificat, se nchide conexiunea curent. n exemplul de fa, aceast comand se execut doar dac
comanda die() de pe latura else nu s-a executat n prealabil.

O variant alternativ de codare PHP a funcionalitilor aceleiai aplicaii, este prezentat n


continuare:

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");


10 Tehnologii WEB Cursul 11 + 12

$query=mysql_query("select * from table1 where nume=ion");

//Calculeaz DIRECT ntr-o variabil nr. de linii returnate prin interogare

//$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo "<center>";

echo "S-au gasit " . $nr_inreg . " inregistrari";

echo"</center>";

echo"<table border=2 align=center>";

echo"<tr bgcolor=silver>";

echo"<th>Nume</th>";

echo"<th>Varsta</th>";

echo"<th>Localitate</th>";

echo"</tr>";

while($row=mysql_fetch_row($query)){

echo"<tr>";

foreach ($row as $value){

echo "<td>$value</td>";

echo"</tr>";

echo"</table>";

else{

echo"<center>";

echo "Nu s-a gasit nici o inregistrare!!!";

echo"</center>";

mysql_close();

?>

Aceasta variant reprezint o optimizare din punct de vedere al operrii pe partea de interpretor
PHP (practic pseudo-clientul aplicaiei Web), ntruct pentru a calcula numrul de nregistrri obinute n
urma interogrii se folosete funcia mysql_num_rows, pasndu-se aceast sarcin serverului MySQL
(care primete astfel o solicitare n plus). Aceasta funcie returneaz numrul de linii obinute n urma
executrii unei comenzi SQL SELECT. Semnul @ (care apare n faa funciei mysql_num_rows) are rolul
de a suprima afiarea pe ecran a unor eventuale warning-urilor (mesaje de avertisment) care pot
aprea n timpul execuiei unor comenzi.
Tehnologii WEB Cursul 11 + 12 11

n cele dou versiuni ale aplicaiei anterior prezentate, capul de tabel pentru afiarea
informaiilor din tabela bazei de date s-a realizat n mod manual, presupunndu-se cunoscute numele
coloanelor i numrul lor.

PHP-ul dispune de funcii prin care se pot obine informaii asupra structurii unei tabele, informaii care
pot fi utilizate pentru realizarea automat a unui cap de tabel pentru afiare (coloanele lui fiind practic
cmpuri ale tabelei bazei de date).

n continuare, sunt enumerate cteva dintre aceste funcii:

-mysql_list_fields() ofer informaii asupra structurii unei anumite tabele, returnnd ca rezultat un
identificator, care poate fi folosit de ctre urmtoarele funcii, cu semnificaiile aferent precizate :

-mysql_field_name()- returneaz succesiv numele coloanelor tabelei;

-mysql_field_len() - returneaz succesiv lungimea coloanelor tabelei;

-mysql_field_type()- returneaz succesiv tipul coloanelor tabelei;

-mysql_num_fields() - returneaz numrul coloanelor tabelei.

Urmtorul exemplu comentat este destul de edificator asupra modului de utilizare a acestor
funcii, fr a mai fi necesar o prezentare a sintaxei lor de baz:

<?php

//Conectare la serverul MySQL

$link = mysql_connect(localhost, root, parola);

// Informaii asupra structurii unei anumite tabele dintr-o baz de date

$fields = mysql_list_fields("persoane", "table1",$link);

// Num rare coloane ale tabelei referite

$columns = mysql_num_fields($fields);

// Pentru fiecare coloan , afieaz numele, tipul i lungimea ei pe rnd nou

for ($i = 0; $i < $columns; $i++){

echo mysql_field_name($fields, $i);

echo mysql_field_type($fields, $i);

echo mysql_field_len($fields, $i);

echo <br>;

?>

Efectul rulrii scriptului anterior const n afiarea, pe coloan, a numelui, tipului i lungimii
fiecrui cmp al unei anumite tabele a unei baze de date MySQL, tabel referit printr-un identificator
($fields) n funciile specializate folosite.

Observaie: Fiecare din funciile returnnd numele, tipul i lungimea unei coloane a tabelei are ca
argumente un identificator de pointare la tabel ($fields), respectiv un index de coloan (pornind de la
zero) reprezentnd poziia coloanei referite (aa cum se poate observa i n scriptul anterior prezentat).

O numrare a liniilor tabelei care ndeplinesc o anumit condiie impus, se poate face i folosind
funcia SQL COUNT:

$nr=mysql_query("select COUNT(*)from table1 where nume=ion");

$row = mysql_fetch_row($query);
12 Tehnologii WEB Cursul 11 + 12

echo $row[0];

sau

$query=mysql_query("select COUNT(*) as numar from table1 where nume=ion");

$row = mysql_fetch_array($query);

echo $row[numar];

De remarcat faptul c, dei interogarea returneaz o singur valoare (un scalar), funcia de
extragere (fetch) returneaz tot un ir, este adevrat cu un singur element, iar referirea lui se va face n
mod adecvat referirii unui element de ir.

Rezumnd, principalele funcii folosite pentru lucrul cu baze de date MySQL sunt urmtoarele:

- mysql_connect - permite conectarea la un server MySQL;


- mysql_select_db - permite selecia bazei de date MySQL;
- mysql_query - execut o comand SQL;
- mysql_fetch_row - returneaz o linie din tabel ca ir;
- mysql_num_fields - returneaz numrul de coloane(cmpuri) dintr-un set de rezultate
creat ca urmare a unei comenzi SQL SELECT;
- mysql_num_rows - returneaz numrul de linii obinute n urma executrii unei
comenzi SQL SELECT;
- mysql_list_fields - ofer informaii asupra unei anumite tabele, returnnd ca rezultat
un identificator, care poate fi folosit de ctre urmtoarele funcii: mysql_field_name,
mysql_field_len, mysql_field_type;
- mysql_field_name - returneaz succesiv numele cmpurilor tabelei;
- mysql_field_type - returneaz succesiv tipul cmpurilor tabelei;
- mysql_field_len - returneaz succesiv lungimea cmpurilor tabelei;
- mysql_close - nchide o conexiune cu baza de date,

1.4. Interogare parametrizat a unei tabele a bazei de date

Realizarea unei interogri a unei tabele aferente unei baze de date, implic obligatoriu
transmiterea unor parametrii dup care se face cutarea. Exemplul anterior de interogare, fr
parametrii, este pur didactic (doar pentru exemplificarea modului de utilizare a funciilor PHP de operare
cu o baz de date). n realitate, orice interogare pe Web necesit anumii parametri de intrare.

a) Interogare cu cutare exact (cu toi parametrii obligatoriu de introdus)

Acest prim exemplu presupune o interogare a unei tabele a bazei de date, cu afiarea liniilor
gsite, filtrarea fcndu-se funcie de valorile introduse pentru un nume i o varsta (cmpuri ale
tabelei), ambele furnizate obligatoriu (ca parametrii de intrare i implicit de interogare).

Un prim fiier script HTML necesar (fig.1.3), realizeaz doar o preluare a acestor parametrii (de
la tastatur) i o "pasare" a lor (printr-un form nsoit de o aciune "POST") spre pagina propriu-zis de
interogare (scriptul PHP), plasat la adresa local http://localhost/ex2.php:

<html>

<title>Interogare cu parametrii</title>

<center>

<head><H1>Interogare cu parametrii</H1></head>

</center>

<form method="POST" action="http://localhost/ex2.php">

<table border=10 align=center BGCOLOR="Silver">

<td>
Tehnologii WEB Cursul 11 + 12 13

Nume:<input type="text" name="nume" size="10"><br>

Varsta:<input type="text" name="varsta" size="4"><br>

<input type="SUBMIT" value="Cauta" >

<input type="RESET" value="Reset" >

</td>

</table>

</form> </html>

Elementul esenial al fiierului HTML anterior, este obiectul HTML <form action=POST ,
avnd rolul de preluare de la tastatur a unor valori pentru cei doi parametrii (nume i varsta simpl
coinciden faptul c numele lor este acelai cu al unor cmpuri ale tabelei bazei de date) i pasarea lor
spre scriptul PHP localizat de linia:

action="http://localhost/ex2.php"

ntreg coninutul formularului <form > </form> a fost plasat n celula unei tabele (avnd
culoarea de background argintiu), fr a fi obligatorie aceast afiare tabelat (mai reuit ns din
punct de vedere al designului):

<table border=10 align=center BGCOLOR="Silver">

<td>

. . .

</td>

</table>

Totui, nucleul esenialul a acestui fiier HTML este urmtorul (putndu-se reduce doar la
secvena urmtoare):

<form method="POST" action="http://localhost/ex2.php">

Nume:<input type="text" name="nume" size="10" ><br>

Varsta:<input type="text" name="varsta" size="4" ><br>

<input type="SUBMIT" value="Cauta" >

<input type="RESET" value="Reset" >

</form>

Se pot remarca:

- cele dou tag-uri <input type="text" care creeaz dou casete pentru preluarea datelor (fig.1.3) n
cele dou variabile-parametru, nume i varsta;

- tag-ul <input type="SUBMIT" care genereaz un buton, la apsarea cruia valorile celor doi
parametrii sunt trimise ctre fiierul PHP localizat prin adresa: action="http://localhost/ex2.php";

- tag-ul <input type="RESET" care reseteaz valorile parametrilor i anuleaz transmiterea lor;

Observaie: Referirea ntr-un script a unei alte pagini WEB (HTML PHP, etc.) se poate face, fie prin
adresare direct (caz n care se precizeaz inclusiv calea complet spre acea pagin, spre exemplu
"http://localhost/ex2.php"), fie prin adresare relativ (fr a mai fi necesar calea complet spre pagina
referit). n acest ultim caz, dac scriptul apelant i scriptul apelat/referit sunt n acelai director/locaie,
ajunge precizarea doar a numelui paginii apelate ("ex2.php").
14 Tehnologii WEB Cursul 11 + 12

Fig. 1.3. Ecran interogare

Codul PHP al fiierul realiznd conectarea la baza de date i interogarea tabelei table1 a bazei de
date MySQL persoane este urmtorul (acest fiier primete de la scriptul HTML anterior prezentat,
valorile parametrilor nume=valoare_tastata1, respectiv varsta= valoare_tastata2):

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

echo"<br><br>";

//Preluarea cu metoda POST a parametrilor transmii de c tre fiierul //HTML spre scriptul
PHP (parametrul register_globals=ON n php.ini)

$nume=$_POST[nume];

$varsta=$_POST[varsta];

// Interogare cu parametri

$query=mysql_query("select * from table1 where nume=$nume and varsta=$varsta");

//Calculeaza nr. de nregistr ri returnate prin interogare

$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo "<center>";

echo "S-au gasit " . $nr_inreg . " inregistrari";

echo"</center>";

//creeaz capul de tabel

echo "<table border=2 align=center>";

echo"<tr bgcolor=silver>";

echo"<th>Nume</th>";

echo"<th>Varsta</th>";

echo"<th>Localitate</th>";
Tehnologii WEB Cursul 11 + 12 15

echo"</tr>";

// Afieaz nregistr rile g site n urma interog rii

// (se putea folosi i mysql_fetch_array sau mysql_fetch_assoc

// cu referiri ale elementelor de genul $row[0]sau $row[nume] etc.)

while($row=mysql_fetch_row($query)){

echo"<tr>";

foreach ($row as $value){

echo "<td>$value</td>";

echo"</tr>";

echo"</table>";

else{

echo"<center>";

echo "Nu s-a gasit nici o inregistrare!!!";

echo"</center>"; }

// nchide conexiunea cu serverul MySQL

mysql_close();

?>

Rezultatul apelului acestui script cu parametri, i implicit al interogrii, este prezentat n fig.1.4.

Fig. 1.4. Rezultatul interogrii exacte parametrizate

Fa de exemplele prezentate n paragraful anterior, singura deosebire major apare n linia:

$query=mysql_query("select * from table1 where nume=$nume and varsta=$varsta");

reprezentnd o interogare parametrizat. (variabilele $nume i $varsta, reprezentand valorile preluate


de la tastatur i transmise de fiierul HTML spre fiierul PHP apelat).
16 Tehnologii WEB Cursul 11 + 12

b) Parolarea accesului

n scriptul anterior, accesul la serverul MySQL se face prin precizarea explicit a parolei direct n
cod. n unele situaii, din motive de restricionare a accesului, acest lucru nu este ns de dorit.
Parolarea accesului, n exemplul de fa, se poate face prin transmiterea parolei ca un parametru de
intrare, introdus de la tastatur odat cu ceilali parametrii (afereni interogrii - fig. 1.5).

Fig.1.5. Ecran de conectare i interogare

n acest sens, n fiierul care implementeaz formularul de introducere a parametrilor de intrare


se adaug codul urmtor (practic un input suplimentar) pentru preluarea de la tastatur a parolei (fig.
1.5):

Parola: <input type="password" name="parola" size="15">

<br>

<h4>Date de interogare:</h4><br>

n acest caz, suplimentar n scriptul PHP propriu-zis pot apare urmtoarele completri de cod
(verificnd reuita sau nereuita conectrii la serverul MySQL):

<?php

//Preluarea cu metoda POST a parametrilor transmii de c tre fiierul

// HTML, scriptului PHP

$parola=$_POST[parola];

$nume=$_POST[nume];

$varsta=$_POST[varsta];

// Conectare cu parol ca parametru

$con = mysql_connect("localhost","root",$parola);

// Returnare ntr-o variabil a unui mesaj (string) de eroare,

// dac apare o eroare la conectare ->mesaj

$var=mysql_error();

if (!$con){ // Verific reuita conect rii

echo "<br><h3>".$var."</h3><br>";

//afieaz mesaj eroare (fig. 1.6)

echo "<h1><center> Parola este incorecta!</center>


Tehnologii WEB Cursul 11 + 12 17

</h1>";

else {. . . . . .

// continuare program

. . . . . .

?>

Dac serverul MySQL dispune de un cont utilizator fr nume de user i password, comanda
mysql_connect (din exemplul anterior) este de forma:

mysql_connect("localhost"," "," ");

Fig. 1.6 Parol incorect

n exemplul anterior, fiind vorba de o conexiune securizat (printr-o parol) la un server de baze
de date MySQL, parola user-ului utilizat este stocat implicit criptat pe server (n tabela user a bazei de
date speciale mysql). Dac ns, aplicaia Web n sine implic conturi de acces direct la ea (i nu la
serverul de baze de date protejat implicit prin useri / parole propri), este necesar definirea unor useri
proprii aplicaiei, mpreun cu parolele lor aferente (stocate ntr-o tabel a aplicaiei creat special
pentru acest scop). Fiind vorba de stocarea unor informaii vitale pentru securizarea aplicaiei (parole
de acces), n mod normal acestea sunt salvate criptat n baza de date. Deci, la crearea acestor conturi
de acces user/parol, anterior salvrii lor n baza de date, parolele trebuie generate criptat. PHP pune la
dispoziie mai multe funcii destinate criptrii informaiei (md5, hash, sha1, etc.), iar pentru
exemplificare n paragraful de fa se prezint un caz de utilizare al funciei md5. n primul rnd
trebuie generat valoare criptat a parolei dorite:

$parola=clar33;

$parola=md5($parola);

echo Valoarea criptata -32 caractere: .$parola;

Rezultatul afiat pe ecran este:

Valoarea criptata - 32 caractere: e3e99e29de40ee1c050132e2eb28d4d6

Acest string de 32 de caractere reprezint parola criptat, fiind salvat n baza de


date.Presupunnd parola introdus de la tastatur prin intermediul unei casete INPUT, a unui formular
POST, i transmis prin variabila parametru $_POST[parola], verificarea corectitudinii ei se face
criptnd coninutul ei (introdus de la tastatur) i comparndu-l cu coninutul parolei criptate memorat
n baza de date. Altfel spus, nu se face o comparare a unui string decriptat cu alt string decriptat,
18 Tehnologii WEB Cursul 11 + 12

neputndu-se vorbi de decriptare n cazul algoritmului md5. Paii de parcurs pentru verificarea unei
parole ar fi:

- citire parola de la tastatur -> $_POST[citita]

- extragere parol criptat (din baza de date) -> $criptat

- comparare coninuturi criptate:

if ($criptat==md5($_POST[citita]) {cod}

c) Interogare cu cutare aproximativ

Singura modificare din script apare n linia de specificare a interogrii SQL efective (de remarcat
folosirea n comanda de interogare a ghilimelelor pentru ncadrarea variabilelor al cror coninut este
interpretat ca un string/ir de caractere, respectiv lipsa acestor ghilimele n cazul variabelelor coninnd
valori numerice):

$query =mysql_query("SELECT * FROM table1 where nume>$nume and varsta>=$varsta");

Rezultatele pot fi urmtoarele:

- dac n caseta INPUT corespunzatoare numelui nu se introduce nici o valoare, iar n cea
corespunzatoare vrstei se introduce valoarea 0, vor fi afiate toate nregistrrile bazei de date;

- dac se introduce un ir de caractere pentru nume, iar dac n caseta INPUT corespunzatoare
varstei se intoduce valoarea 0, se vor afia toate nregistrrile pentru care numele sunt superioare
alfabetic primului caracter din irul de caractere introdus;

d) Interogare cu ignorarea parametrilor necompletai

n acest caz este necesar urmtoarea modificare n script-ul PHP, n linia de interogare efectiv
($query=mysql_query()), folosindu-se urmtoarea secven:

// dac nu s-a introdus nici un nume i nici o varsta

// (se folosete operatorul = = pentru comparare)

if ($nume==and $varsta ==)

$query =mysql_query("SELECT * FROM table1");

// dac s-a introdus doar un nume (operatorul !== nseamn diferit de)

if ($nume!==and $varsta ==)

$query =mysql_query("SELECT * FROM table1 where nume=$nume");

// dac s-a introdus o varsta

if ($nume==and $varsta !==)

$query =mysql_query("SELECT * FROM table1 where varsta= $varsta");

//// dac s-a introdus att un nume ct i o varsta

if ($nume!==and $varsta !==)

$query =mysql_query("SELECT * FROM table1 where nume= $nume and varsta=$varsta");


Tehnologii WEB Cursul 11 + 12 19

e) Construcia dinamic a string-ului de interogare SQL

Analiznd scriptul PHP precedent, se poate constata c, pentru 2 parametri de cutare, numrul
de combinaii ale string-lui implementnd comanda SQL de interogare, presupunnd o completare
parial a criteriilor de filtrare (unele casete neconinnd date), este de 22 4 , iar prin extrapolare,
pentru 3 parametri 2 8 i aa mai departe crescnd exponenial (pentru n parametri ajungnd la 2
3 n

). Structura de cod anterioar nu prezint o alternativ viabil pentru cazul unui numr mare de
parametri (INPUT), considerai ca date de intrare dup care se face interogarea tabelei, n contextul n
care doar o parte dintre ei sunt cunoscui/folosii (i deci, aleatoriu, o serie de casete de intrare nu vor
conine date).

Soluia n acest caz o constituie construcia dinamic a unui singur string generalizat de
interogare, valabil pentru n parametri afereni clauzei WHERE. Tehnica propus implic o verificare
succesiv a coninutului fiecarei casete (parametru) de intrare, respectiv concatenarea sau nu, la un
string iniial SQL, a cte unei condiii suplimentare de filtrare. Astfel, string-ul SQL se genereaz
interactiv, dinamic, crescnd prin concatenri succesive de condiii suplimentare (substring-uri), iar
numrul de verificri ale completrii cu date pentru n casete de intrare se reduce rezonabil fa de
soluia anterioar, scznd la 2n la n.

Un exemplu concret este prezentat pentru cazul a 4 parametri de intrare i interogare ($p1, $p2,
$p3, $p4), mai mult sau mai puin cunoscui, folosii pentru condiionarea interogrii unei tabele TEST
cu 4 coloane (prima de tip numeric, respectiv celelalte de tip caracter). n faza de testare a scriptului se
recomand o afiare a string-ului de interogare construit dinamic, pentru a permite o inspectare vizual
a lui n vedere detectarii unor eventuale erori de sintax (spaii lips, spre exemplu). Secvena de cod
implementnd o posibil contrucie dinamic a string-ului comenzii SQL este urmtoarea:

$interogare="select * from test where ";

// verific primul parametru

if (!empty($p1))

$interogare=$interogare."c1=$p1 and ";

// verific al 2-lea parametru

if (!empty($p2))

$interogare=$interogare."c2=$p2 and ";

// verific al 3-lea parametru

if (!empty($p3))

$interogare=$interogare."c3=$p3 and ";

// verific al 4-lea parametru

if (!empty($p4))

$interogare=$interogare."c4=$p4 and ";

// adaug condiie final pentru sintax valid comand SQL

$interogare=$interogare."c1>0";

echo $interogare; //afiez string SQL pentru inspecie vizual

Prima linie genereaz suportul de baz al comenzii SQL, la acest string fiind concatenate dinamic
construcii suplimentare. Pentru fiecare parametru coninnd date, un substring suplimentar este
concatenat string-ului de baz. O problem de finalizare a construciei string-ului de interogare apare n
situaia n care nici un parametru nu conine date, iar soluia adoptat const n finalizarea tot timpul a
string-ului SQL prin concatenarea unei condiii statice, permanent ndeplinite (n cazul de fa, c1>0,
presupunnd coloana c1 cheie primar, spre exemplu). Un asemenea artificiu rezolv i problema
lipirii de operatorul logic AND (ncheind fiecare substring condiional aferent unui parametru non-vid),
a unei condiii necesare doar sintactic, dar fr nici o influen asupra rezultatului interogrii. Iat i
cteva exemple de string-uri de interogare generate astfel, n contextul exemplului considerat:
20 Tehnologii WEB Cursul 11 + 12

- toi parametri de intrare completai cu date:

select * from test where c1=2 and c2=ion and c3=ing and c4=da and c1>0

- doar primul parametru nenul:

select * from test where c1=2 and c1>0

- toi parametri de intrare nuli:

select * from test where c1>0

Evident exist i alte soluii de construcie dinamic a string-ului de interogare, dar din punct de
vedere al minimizri numrului de verificri efectuate prin secvene IF, algoritmul propus este optim.
Astfel, o soluie alternativ poate aborda problema printr-o construcie iniial a stringului integrnd din
start condiia permanent ndeplinit (doar din considerente de generare a unei construcii SQL valide
sintactic, indiferent de numrul de parametrii folosii pentru interogare), codul PHP fiind urmtorul:

$interogare="select * from test where c1>0 ";

if (!empty($p1))

$interogare=$interogare." and c1=$p1 ";

if (!empty($p2))

$interogare=$interogare." and c2=$p2 ";

if (!empty($p3))

$interogare=$interogare." and c3=$p3 ";

if (!empty($p4))

$interogare=$interogare." and c4=$p4 ";

echo $interogare; //afiez string SQL pentru inspecie vizual

Singurul dezavantaj al soluiilor de genul celor anterior prezentate const n faptul c, asupra
tabelei bazei de date se aplic o clauz suplimentar de filtrare, fr nici o valoare practic (fiind
permanent ndeplinit) i avnd drept unic scop rezolvarea ct mai simpl a unei probleme de validitate
sintatic a comenzii SQL generate dinamic. Dar simplitatea codul PHP necesar face s merite acest
compromis.

f) Parametri speciali (ca dimensiune sau coninut)

O situaie special de interogare o constituie i cea n care, interogarea se face dup o cheie mai
lung, spre exemplu, un set de cuvinte, grupate toate ntr-un acelai cmp/caset i transmise (toate)
ca un singur parametru. Un formular de tip FORM poate conine n acest caz o caset INPUT
(avnd atributul type=text, implicit de altfel), fie o caset de tip TEXTAREA. Pentru exemplificare, n
cadrul formularului urmtor, o caset de tip TEXTAREA permite scrierea unei informaii pe 3 rnduri i
10 coloane (fiind vorba de o formatare a modului de afiare pe ecran a informaiei, i nu de o limitare a
cantitii de informaie):

<form action="unu.php" method="get">

Detalii: <textarea name="detalii" cols="10" rows="3"></textarea>

<input type="submit" value="GO" />

</form>

Evident c utilizarea unei casete TEXTAREA este necesar doar n situaia unui volum mare de
informatie (mai multe linii de text, spre exemplu). Dac nu este vorba de o astfel de situaie, se poate
folosi o simpl caset INPUT, permind scrierea pe o singur linie.

Transferul valorii unui astfel de parametru citit ntr-o caset TEXTAREA ridic cteva probleme.
Acestea se datoreaz faptului c, coninutul parametrului poate include spaii, coduri de sfrit de linie
Tehnologii WEB Cursul 11 + 12 21

sau alte caractere speciale, care nu sunt permise ntr-un string primit ca parametru de ctre un script.
Aceste caractere speciale trebuie convertite n coduri speciale specifice parametrizrii apelului unei
pagini Web.

Se consider urmtorul exemplu de apel (printr-un link) al unui script intitulat newpage.php,
care primete ca parametru de intrare coninutul variabilei $detalii, al crei coninut a fost completat
printr-un formular de genul celui anterior prezentat (coninnd TEXTAREA). Se presupune c variabila
$detalii conine valoarea Exemplu de folosire a tag-ului Div, incluznd mai multe spaii, care nu sunt
permise ntr-un string de interogare, trimis explicit ca parametru de intrare spre un script, prin
intermediul unui link. Convertirea acestor spaii ntr-un cod special acceptat ntr-un astfel de apel,
implic folosirea unei funcii PHP speciale, i anume urlencode(). Iat codul aferent unui mod corect de
apel cu transfer al unui astfel de parametru (cod inclus n cadrul script-ului unu.php, care primete
parametrul de intrare $detalii de la formularul anterior):

<a href="newpage.php?detalii=<?php echo(urlencode($detalii)); ?>">

O legatura parametrizata</a>

Se poate observa o includere de cod PHP n mijlocul unei etichete HTML. O form i mai simpl
de apelare, similar ca efect cu cea anterioar, este urmtoarea:

<a href="newpage.php?detalii=<?=urlencode($detalii)?>">

O legatura parametrizata </a>

n ambele cazuri, funcia urlencode() preia caracterele speciale (spre exemplu, spaiile) dintr-un
string pasat ca parametru i le convertete n coduri speciale necesare i acceptate n cadrul unui apel
parametrizat al unei pagini Web. Pentru cazul unei valori particulare: $detalii=Exemplu de folosire a
tag-ului Div, aceast funcie convertete acest coninut ntr-un string de forma Exemplu+de+
folosire+a+tag-ului+Div, acceptat ca parametru valid. Dup apelul scriptului cu parametrul astfel
codat, PHP realizeaz automat conversia invers (n cadrul scriptului apelat -newpage.php-), la valoarea
iniiala, n momentul utilizrii variabilei $detalii.

Observaie: Funcia urlencode() se folosete doar n cadrul unei pasri de parametrii direct printr-un
hyperlink explicit (href, evident folosind metoda GET), nefiind necesar utilizarea ei explicit dac
transmiterea parametrilor se face prin intermediul unui formular FORM (codarea fcndu-se n acest caz
automat). Cu alte cuvinte, un formular FORM interpreteaz adecvat un string coninnd caractere
speciale sau spaii i-l transmite mai departe ca parametru, n formatul adecvat (nefiind nevoie se
utilizarea explicit a funciilor urlencode sau urldecode)

n situaia n care se dorete afiarea unui volum compact mai mare de informaii (preluat,
spre exemplu, dintr-un cmp de tip TEXT al unei tabele MySQL), este necesar uneori o formatare a
acesteia. Figura 1.7 prezint afiarea unei informaii neformatate (liniile ntinzndu-se pe toat limea
ecranului, iar dac ar depi-o, ar apare bara de scroll orizontal pentru fereastr).

Fig. 1.7. Afiare informaie neformatat (nowrap)


22 Tehnologii WEB Cursul 11 + 12

O soluie simpl de rezolvare presupune utilizarea etichetei DIV cu parametrii afereni setai
corespunztor. Astfel, dac n celulele aferente coloanei detalii a tabelului din figura 1.7 se folosete o
construcie de genul:

<td><div style=height: 100px;width: 330px; overflow: auto>....continutul


coloanei/variabila...</div></td>,

rezultatul formatrii este prezentat n figura 1.8, observndu-se o mbuntaire evident a design-ului.

Fig. 1.8. Afiare informaie formatat cu eticheta DIV

1.5. Adugare ntr-o tabel a bazei de date

i n cazul operaiei de adugare a unei noi linii ntr-o tablel a unei baze de date MySQL este
necesar utilizarea unui fiier HTML pentru transmiterea spre scriptul PHP propriu-zis a valorilor
corespunztoare liniei care va fi adugat n tabel:

<html>

<title>Adaugare</title>

<center><head><H1>Adaugare</H1></head></center>

<form method="POST" action="http://localhost/ex3.php">

<table border=10 align=center BGCOLOR="Silver">

<td>

// &nbsp: realizeaz introducerea unor spaii suplimentare de formatare a //afi rii tag-ul
<strong> bold-uiete textul ncadrat

<strong>Nr:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp

<input type="text" name="nr" size="4" ><br>


Tehnologii WEB Cursul 11 + 12 23

<strong>Nume:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp

<input type="text" name="nume" size="10" ><br>

<strong>Varsta:</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

&nbsp;&nbsp;&nbsp

<input type="text" name="varsta" size="4" ><br>

<strong>Localitate:</strong>&nbsp;&nbsp

<input type="text" name="localitate" size="10" ><br>

<center>

<input type="SUBMIT" value="Adauga" >

<input type="RESET" value="Reset" >

</center>

</td>

</table>

</form>

</html>

Acest fiier HTML permite (n cazul de fa) transmiterea valorilor a patru parametrii (nr, nume,
varsta, localitate - cu valori introduse de la tastatur) afereni datelor necesare construciei unei noi linii
care va fi adugat n tabela bazei de date (s-a presupus existena unei tabele similare cu cea folosit n
exemplele anterioare, dar avnd n plus cmpul NR, cu valori unice pentru fiecare articol, deci definit ca
PRIMARY KEY).

Scriptul PHP spre care sunt transmise valorile parametrilor i care va realiza adugarea propriu-
zis n tabela bazei de date are urmtorul cod:

<?php mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

$nr=$_POST[nr];

$nume=$_POST[nume];

$varsta=$_POST[varsta];

$localitate=$_POST[localitate];

// ad ugare parametrizat

$query=mysql_query("insert into table1 values($nr,$nume,$varsta,$localitate)");

echo "Inserare reusita!!!";


24 Tehnologii WEB Cursul 11 + 12

// selectarea i afiarea doar a nregistr rii/liniei nou ad ugate

$query=mysql_query("select * from table1 where nr=$nr");

//calculeaz nr. de nregistr ri returnate prin interogare

$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo "<center>";

echo "S-au gasit " . $nr_inreg . " inregistrari";

echo"</center>";

echo "<table border=2 align=center>";

$coln=mysql_num_fields($query); //nr. de campuri

echo"<tr bgcolor=silver>";

// realizare automat a capului de tabel (coninnd toate cmpurile)

for ($i=0; $i<$coln; $i++){

//numele cmpurilor ca i cap de tabel

$var=mysql_field_name($query,$i);

echo "<th> $var </th>";

echo"</tr>";

// afieaz nregistr rile g site n urma interogarii

while($row=mysql_fetch_row($query)){

echo"<tr>";

foreach ($row as $value){

echo "<td>$value</td>";

echo"</tr>";

echo"</table>";

else{

echo"<center>";

echo "Nu s-a gasit nici o inregistrare!!!";


Tehnologii WEB Cursul 11 + 12 25

echo"</center>";

mysql_close();

?>

Fig. 1.9 Confirmare adugare

Rezultatul vizibil pe ecran, produs n urma execuiei comenzii SQL de afiare SELECT este
prezentat n fig. 1.9. Comanda INSERT nu genereaz un rezultat vizibil pe ecran, mai precis nu va
returna eventuale date care ar putea fi afiate, cel mult aprnd un mesaj de eroare dac operaia de
adugare nu poate fi executat.

Observaie: n locul unei comenzi mysql_query("SELECT) compacte, se poate scrie echivalent:

//string de interogare memorat ntr-o variabil

$com= select * from table1;

$query=mysql_query($com); //interogare

Soluia este recomandat mai ales n cazul construciei dinamice a string-ului de interogare,
permind o eventual afiare i inspectare vizual a acestuia.

1.6. tergere cu confirmare dintr-o tabel a bazei de date

tergerea unor articole/linii dintr-o tabel a unei baze de date (tergere presupus a fi cu o
confirmare prealabil) implic dou operaii:

- realizarea unei interogri a bazei de date (pe baza unor parametri de intrare pentru interogare) i
afiarea nregistrrilor gsite, care vor fi terse,

- respectiv, confirmarea (sau anularea) tergerii efective, pe baza informaiilor anterior afiate n urma
interogrii.

Fiierul HTML (ex4.html) pentru realizarea unei interogri a tabelei n vederea tergerii
(interogare fcut cu un singur parametru -nume- introdus de la tastatur) este detaliat n listingul
urmtor (avnd rezultatul prezentat n fig. 1.10):
26 Tehnologii WEB Cursul 11 + 12

Fig. 1.10 Pagin HTML pentru tergere selectiv

<html>

<title>Stergere</title>

<center> <head><H1>Stergere</H1></head></center>

<form method="POST" action="http://localhost/ex4.php">

<table border=20 bordercolor="red" align=center BGCOLOR="Gold">

<td>

Nume:<input type="text" name="nume" size="10" ><br>

<center>

<input type="SUBMIT" value="Sterge" >

<input type="RESET" value="Anulare" >

</center>

</td>

</table>

</form>

</html>

Fiierul PHP pentru interogarea prealabil tergerii (cu rolul: gsete i vizualizeaz ce se
dorete a fi ters), este prezentat n continuare (acest fiier primind ca parametru de intrare valoarea
pasat spre el de ctre scriptul HTML anterior):

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

// transfer valoare parametru ntr-o variabil intern

$nume=$_POST[nume];

// c utare dup cmpul nume a nregistr rilor care vor fi terse

$query=mysql_query("select * from table1 where nume=$nume");

//calculeaz nr. de nregistr ri returnate prin interogare


Tehnologii WEB Cursul 11 + 12 27

$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo "<center>";

echo "S-au gasit " . $nr_inreg . " inregistrari";

echo"</center>";

// creare tabel pentru afiare rezultate

echo "<table border=2 align=center>";

//num rare cmpuri

$coln=mysql_num_fields($query);

echo"<tr bgcolor=silver>";

// realizare automat a capului de tabel (coninnd toate cmpurile)

for ($i=0; $i<$coln; $i++){

//numele cmpurilor ca i cap de tabel

$var=mysql_field_name($query,$i);

echo "<th> $var </th>";

echo"</tr>";

// extragere informaii i afiare

while (list ($nr,$nume,$varsta,$localitate) =

mysql_fetch_row($query)){

print (" <tr>\n".

" <td>$nr</td>\n".

" <td>$nume</td>\n".

" <td>$varsta</td>\n".

" <td>$localitate</td>\n".

" </tr>\n");

echo"</table>";

// Apelarea scriptului de tergere efectiv /anulare (cu transmitere mai

// departe a parametrilor de intrare, n cazul de fa nume dup care

// se face c utarea)

echo <form method="POST"

action="http://localhost/ex44.php">;
28 Tehnologii WEB Cursul 11 + 12

// pasare, transmitere mai departe a parametrului nume ($nume)

// sub numele nume1

// Atenie la ordinea i tipul ghilimelelor sau "!

echo <input type="hidden" name="nume1"

value=.$_POST[nume].>;

echo <input type="SUBMIT" value="Stergere efectiva

">;

echo <br>;

echo </form>;

// link pt. revenire la pagina de start i anulare tergere

echo <a HREF="http://localhost/ex4.html">

Renunt si revin...</a>;

else

die("Nu gasesc nici o inregistrare ...");

mysql_close();

?>

Pentru afisarea rezultatelor obinute n urma interogarii, anterior s-a folosit comanda PHP list(
), care permite asignarea de valori unei liste de variabile (asemntoare practic unui ir), printr-o
singur operaie, valorile asignate fiind cele extrase cu ajutorul functiei mysql_fetch_row(). Dup cum
se poate vedea i n fig. 1.11, fiierul PHP anterior prezentat, realizeaz, ntr-o prim etap, o simpl
interogare a tabelei bazei de date, cu afiarea rezultatelor pe ecran.

Fig. 1.11. Confirmare tergere

Ceea ce confer posibilitatea lurii deciziei de tergere a articolelor astfel vizualizate se


realizeaz prin partea de cod inclus n bucla if (verificnd numrul de linii gsite), constnd practic ntr-
un formular HTML <form>. Aceast parte este urmtoarea (PHP trimind practic spre ecran un
script HTML folosind comanda echo) :

echo <form method="POST" action="http://localhost/ex44.php">;


Tehnologii WEB Cursul 11 + 12 29

echo <input type="hidden" name="nume1" value= .$_POST[nume]. >;

echo <input type="SUBMIT" value="Stergere efectiva!

" >;

echo <br>;

echo </form>;

Secvena de cod prezentat, transmite valoarea parametrului de interogare, memorat n


variabila $nume (utilizat aici pentru o simpl afiare cu SELECT), spre un alt parametru (nume1) care va
fi pasat spre fiierul PHP de tergere efectiv. Se remarc n acest caz, tipul type="hidden" utilizat
pentru caseta de transfer a parametrului, care face aceast caset invizibil pentru utilizator.

Fiierul pentru tergere efectiv are n acest caz o structur extrem de simpl:

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

$nume1=$_POST[nume1] or die("Comanda esuata!");

// tergere efectiv

$query =mysql_query("DELETE FROM table1 where nume=$nume1");

echo "OK, am sters.";

mysql_close ();

?>

1.7. Modificarea unei linii dintr-o tabel a bazei de date

Modul de modificare a unei nregistrri/linii dintr-o tabel a unei baze de date (cu vizualizarea
liniei care se modific) presupune urmtoarele etape:

- o operaie de cutare parametrizat a nregistrrii care se dorete a fi modificat i o afiare a ei;

- modificarea efectiv (folosind afiarea realizat).

Fiierul pentru transmiterea parametrilor de cutare a nregistrrii care se dorete a fi modificat


(cutarea fcndu-se dup doi parametrii vezi fig. 1.12) este urmtorul:

<html>

<title>Cautare pentru modificare</title>

<center> <head><H1>Cautare pentru modificare</H1></head></center>

<form method="POST" action="http://localhost/ex5.php">

<table border=10 align=center BGCOLOR="Silver">

<td>

Nume: <input type="text" name="nume" size="10" ><br>

Virsta: <input type="text" name="virsta" size="4" ><br>

<input type="SUBMIT" value="Cauta" >

<input type="RESET" value="Reset" >

</td>
30 Tehnologii WEB Cursul 11 + 12

</table>

</form>

</html>

Fig. 1.12. Cutare pentru modificare (practic o simpl cutare)

Fiierul pentru interogare n vederea modificrii are urmtorul cod:

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

$nume=$_POST[nume];

$varsta=$_POST[varsta];

// c utarea nregistr rii care va fi modificat

$query=mysql_query("select * from table1 where nume=$nume and varsta=$varsta");

$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo "<center>";

echo "S-au gasit " . $nr_inreg . " inregistrari";

echo"</center>";

echo "<table border=2 align=center>";

echo"<tr bgcolor=silver>";

$coln=mysql_num_fields($query);

for ($i=0; $i<$coln; $i++){

$var=mysql_field_name($query,$i);
Tehnologii WEB Cursul 11 + 12 31

echo "<th> $var </th>";

echo"</tr>";

$nr_val=0; // contor indice array

while ($row = mysql_fetch_row($query)){

echo"<tr>";

foreach ($row as $value) {

echo "<td BGCOLOR=Yellow> $value</td>";

// memorare ntr-un ir (array) a datelor din articolul g sit

$nr_val++;

$sir[$nr_val]=$value;

echo "</tr>";

echo "</table>";

// Rezolvarea este valabil pentru o singur nregistrare g sit

// Pentru mai multe nregistr ri g site, modific rile efectuate se aplic //asupra tuturor
liniilor care corespund c ut rii

echo <br><hr>; // trasarea grafic a unei linii

// apel script pentru modificarea efectiv

echo <form method="POST" action="http://localhost/ex55.php">;

// transfer (ascuns) spre script a parametrilor de c utare

echo <input type="hidden" name="nume2" value=.$sir[2].>;

echo <input type="hidden" name="varsta2" value=.$sir[3].>;

// transfer spre script ca parametrii a datelor care pot fi modificate

echo <input type="text" name="nr1"

value=.$sir[1].>;

echo <input type="text" name="nume1" value=.$sir[2].>;

echo <input type="text" name="varsta1" value=.$sir[3].>;

echo <input type="text" name="localitate1" value=.$sir[4].>;

echo <input type="SUBMIT" value="Modifica!" >;


32 Tehnologii WEB Cursul 11 + 12

echo <br>;

echo </form>;

// link de revenire i renunare la modificare

echo <a HREF="http://localhost/ex5.html"> Renun i revin...</a>;

else

die ("Nu gasesc nici o inregistrare ...");

mysql_close();

?>

Rezultatul fiierului script PHP anterior, este prezentat n figura 1.13. Ceea ce aduce nou acest
script PHP, pe lng o simpl interogare (cutare cu SELECT) i afiare a articolelor gsite pe ecran
(tabelat), const ntr-o afiare n casete editabile a datelor gsite, permindu-se astfel i o modificare a
lor (vezi fig. 1.13). Cum se realizeaz acest lucru?

n primul rnd, n bucla foreach() ncuibat n bucla while(), apare o secven de genul:

//incrementare contor num r elemente

$nr_val++;

// memorare ntr-un ir (array) a datelor din articolul g sit

$sir[$nr_val]=$value;

care permite memorarea tuturor elementelor gsite ntr-un ir (arrary-ul $sir).

Fig. 1.13. Ecran pentru modificare

Spre exemplu, n cazul de fa (vezi fig. 1.13) s-a gsit un singur articol cu 4 elemente, acestea
memorndu-se ntr-un ir avnd 4 elemente (cu indicii 1,2,3 i 4, deoarece contorul $nr_val a fost
iniializat pe 0, dar este incrementat nainte de folosirea lui ca indice al unui element al irului $sir).

n al doilea rnd, este utilizat secvena urmtoare:

echo <form method="POST" action="http://localhost/ex55.php">;

// Transfer (ascuns) spre script a parametrilor de c utare


Tehnologii WEB Cursul 11 + 12 33

echo <input type="hidden" name="nume2" value=.$sir[2].>;

echo <input type="hidden" name="varsta2" value=.$sir[3].>;

// Transfer spre script ca parametrii a datelor care pot fi modificate

echo <input type="text" name="nr1"

value=.$sir[1].>;

echo <input type="text" name="nume1" value=.$sir[2].>;

echo <input type="text" name="varsta1" value=.$sir[3].>;

echo <input type="text" name="localitate1" value=.$sir[4].>;

echo <input type="SUBMIT" value="Modifica!" >;

echo <br>;

echo </form>;

Primele tag-uri <INPUT type=hidden permit transferul spre fiierul script PHP care realizeaz
modificarea efectiv a parametrilor iniiali de interogare (memorai n primele dou elemente ale array-
ului $sir), acest lucru fiind necesar deoarece aceti parametrii pot fi alterai n urma unei eventuale
modificri permise n continuare, dup cum se va vedea.

Urmtoarele 4 tag-uri <INPUT type=text permit afiarea (n casete care permit att operaii
de citire ct i de scriere) i alterarea (modificarea) acestor patru parametrii, care vor substitui
informaia existent n cmpurile articolului localizat (cu parametrii transmii din primele dou INPUT-uri
invizibile utilizatorului). Cu alte cuvinte, aceast secvena transfer spre script-ul PHP de modificare
efectiv ase parametrii:

- doi parametrii pentru localizarea articolului de modificat;


- ali patru parametrii, pentru substituirea informaiei din cele patru cmpuri ale articolului
deja localizat.
Fiierului PHP care realizeaz modificarea propriu-zis, utiliznd comanda SQL UPDATE, nu i mai
revine dect o sarcin banal:

<?php

mysql_connect("localhost","root","parola") or die ("Nu se poate conecta la serverul MySQL");

mysql_select_db("persoane") or die("Nu se poate selecta baza de date");

$nr1=$_POST[nr1];

$nume1=$_POST[nume1];

$varsta1=$_POST[varsta1];

$localitate1=$_POST[localitate1];

$nume2=$_POST[nume2];

$varsta2=$_POST[varsta2];

// Modificare efectiv

$query =mysql_query("update table1 set nr=$nr1,nume=$nume1,


varsta=$varsta1,localitate=$localitate1 where nume=$nume2 and varsta=$varsta2") or
die("Comanda esuata!");

// Afiare mesaj de eroare pentru date incorect introduse (dac se dorete)


34 Tehnologii WEB Cursul 11 + 12

$var=mysql_error();

echo $var;

echo "OK, am modificat!";

mysql_close ();

?>

1.8. Aplicaie exemplu cu operaii SQL multiple

Se consider baza de date MySQL angajati, coninnd tabela salarii cu urmatoarele cmpuri:

-id integer primary key;

-nume varchar(14);

-salar_brut float;

-impozit float;

-salar_net float;

Se dorete implementarea unei aplicaii care:

- folosete un prim fiier HTML (exempluFinal.html) prin intermediul cruia se preiau de la tastatura id-
ul, numele i salarul _brut al unui angajat, i sunt transmise valorile acestor parametri catre un script
PHP (exempluFinal.php). n cadrul scriptului PHP se efectuez urmatoarele operatii:

- inserarea (adugarea) n tabela salarii a informaiilor primite (ca linie nou);

- realizarea unui update pe tabel pentru calculul impozitului i a salariului net al angajailor cu
urmtoarele formule:

- impozit=0.16*salar_brut;

- salar_net=salar_brut - impozit;

- afiarea tuturor angajailor existeni n tabel.

Tabela MySQL (considerat a fi inclus n baza de date angajati) a fost creat folosind comanda:

CREATE TABLE salarii(

id integer primary key,

nume VARCHAR (14),

salar_brut FLOAT,

impozit FLOAT,

salar_net FLOAT);
Tehnologii WEB Cursul 11 + 12 35

Fig. 1.14. Formular HTML pentru preluarea parametrilor de la tastatur

Fiierul exempluFinal.html are urmtorul cod posibil (fig. 1.14):

<html>

<form method="POST"

action="http://localhost/exempluFinal.php">

<table border=10 align=center BGCOLOR="Silver">

<td>

Id: <input type="text" name="id" size="4"><br>

Nume: <input type="text" name="nume" size="10"><br>

Salar_brut: <input type="text" name="salar_brut"

size="4"><br>

<input type="SUBMIT" value="Insert" >

<input type="RESET" value="Reset" >

</td>

</table>

</form>

</html>

Fiierul exempluFinal.php are codul urmtor (vezi i fig. 1.15):

<?php

mysql_connect(localhost,root,parola) or die (Nu se poate conecta la serverul MySQL);

mysql_select_db(angajati) or die(Nu se poate selecta

baza de date);

echo<br><br>;

$id=$_POST['id '];
36 Tehnologii WEB Cursul 11 + 12

$nume=$_POST['nume '];

$salar_brut=$_POST['salar_brut '];

// COMENZI SQL SUCCESIVE

$query=mysql_query("insert into salarii

(id,nume,salar_brut) values($id,$nume,$salar_brut) ");

$query=mysql_query("update salarii set

impozit=0.16*salar_brut,salar_net=salar_brut-impozit where id=$id") or die("Comanda


esuata!");

$query=mysql_query("select * from salarii");

$nr_inreg=@mysql_num_rows($query);

if ($nr_inreg>0){

echo <center>;

echo S-au gasit . $nr_inreg . inregistrari;

echo</center>;

// cap tabel

echo <table border=2 align=center>;

$coln=mysql_num_fields($query);

echo<tr bgcolor=silver>;

for ($i=0; $i<$coln; $i++){

$var=mysql_field_name($query,$i);

echo <th> $var </th>;

echo</tr>;

// afiare date

while($row=mysql_fetch_row($query)){

echo<tr>;

foreach ($row as $value){

echo <td>$value</td>;

echo</tr>;

echo</table>;

else{
Tehnologii WEB Cursul 11 + 12 37

echo<center>;

echo Nu s-a gasit nici o inregistrare!!!;

echo</center>;

mysql_close(); ?>

Rolul acestui exemplu este de a arta c un fiier script PHP poate conine oricte comenzi SQL
sunt necesare pentru ndeplinirea funcionalitilor dorite. Se poate observa de asemenea c, comenzi
precum UPDATE (sau DELETE) pot fi uneori folosite pentru realizarea unor modificri/actualizri ntr-o
tabel, fr nici o confirmare prealabil din partea utilizatorului.

Fig. 1.15. Afiarea nregistrrilor gsite

Observaie: Pentru a determina numrul de linii returnate de o interogare SELECT se poate folosi funcia
mysql_num_rows. Dac se dorete determinarea numarului de linii afectate de o comand INSERT,
DELETE sau UPDATE, funcia funcia corespunztoare este mysql_affected_rows.

1.9. Interogare cu extragerea date dintr-o coloan BLOB

O situaie mai deosebit de operare cu baze de date MySQL o constituie interogarea cu


extragerea unei imagini dintr-un cmp de tip BLOB (Binary Large OBject), respectiv afiarea acelei
imagini. Se vor prezenta n continuare dou soluii care rezolv aceast problem. Un prim exemplu de
script are urmtorul cod PHP:

<?php

// configurare MIME

header("Content-type: image/jpg");

$query="select imag from tabela2 where id=1";

mysql_connect("localhost", "root", "parola")or die ("nu gasesc serverul MySQL");

// print ("Connected successfully");

// o linie de genul celei anterioare este INTERZISA

// NU SE REALIZEAZA NICI O ALT IEIRE DE ALT TIP PE ECRAN


38 Tehnologii WEB Cursul 11 + 12

mysql_select_db ("ioji")or die ("Nu gasesc baza");

$result = mysql_query($query);

// Extragere rezultat (binar)

$var=mysql_fetch_row($result);

// Trecere de la tip ir la tip variabila

$var1=$var[0];

print($var1); // sau direct, print($var[0]);

?>

Esenial n acest caz este linia prin care este setat specificaia MIME (Multipurpose Internet
Mail Extension) pentru afiarea unei imagine JPG. Aceasta nsemn c orice ieire spre browser, va fi
interpretat ca i coninut al unei imagini jpg, i afiat corespunztor. Dup o astfel de setare, realizat
la nceputul scriptului, nu este permis nici o alt ieire (de un alt tip) spre afiare la browser. Exemplul
prezentat presupune existena unui cmp imagine de tip BLOB (sau LONGBLOB), ntr-o tabel referit
n program.

Afiarea imaginii extrase din baza de date, se face printr-o simpl directare spre browser a
coninutului variabilei (print), n care este salvat (n format binary) imaginea propriu-zis.

n cazul (cel mai probabil) al unei interogri cu parametri, linia de interogare se modific astfel:

$query="select imagine from tabela2 where id=$id";

unde, $id este parametrul dup care se face interogarea, iar id este un cmp identificator din
tabel.

n cazul de fa, valoarea parametrului $id se transmite, fie printr-un formular FORM, fie direct
din linia de comand a browser-ului, printr-un apel cu parametru, de forma (spre exemplu, pentru o
cale dat i un nume al fiierului script PHP imag1.php):

http://localhost/imag1.php?id=1;

Observaie: Pentru a putea extrage date dintr-o coloan de tip BLOB, aceasta trebuie umplut anterior
cu date binare. n MySQL inserarea de date BLOB ntr-o linie nou se poate face fie direct printr-o
comand INSERT implicnd utilizarea funciei speciale MySQL LOAD_FILE, fie printr-o comand iniial
INSERT care creaz linia nou, eventual cu date pentru celelalte coloane (mai puin cea de tip BLOB),
urmat de o comand UPDATE setnd strict coloana BLOB (folosind de asemenea funcia special
MySQL LOAD_FILE). Pentru cazul de fa, cele dou cazuri rezolvnd problema adugrii unei linii noi
coninnd informaie BLOB (o imagine) n coloana imag a unei tabele tabela2 sunt punctate n
continuare:

INSERT into tabela2 values(1, LOAD_FILE ("c:\\poza.jpg"));

sau

INSERT into tabela2 (id) values(1);

UPDATE tabela2 SET imag=LOAD_FILE("c:\\poza.jpg") where id=1;

Un al doilea exemplu script PHP, folosete un fiier imagine intermediar (temp1.jpg) n care este
extras coninutul binar al cmpului BLOB:

<?php

$query="select imagine from tabela2 where id=2";

mysql_connect("localhost", "root", "parola") or die ("nu gsesc serverul MySQL");

mysql_select_db ("ioji") or die ("Nu gsesc baza");

$result = mysql_query($query);
Tehnologii WEB Cursul 11 + 12 39

// Verific dac g sete o astfel de nregistrare

if (mysql_num_rows()>0)

// mysql_num_rows() returneaz nr. de nregistr ri g site;

$var=mysql_fetch_row($result);

$var1=$var[0];

// Deschide un fiier pentru scriere n el

$fp=fopen("temp1.jpg","wb");

// Scrie n fiier

fwrite($fp,$var1);

fclose($fp);

// Afieaz coninutul fiierului ca imagine

echo <image src="temp1.jpg">;

// Dac nu g sete nimic, terge fiierul

else {

unlink("TEMP1.JPG"); // sau delete("TEMP1.JPG");

} ?>

n acest exemplu, se verific totodat existena unei nregistrri care corespunde interogrii
realizate (structura if). Dac se gsete o astfel de nregistrare, se salveaz coninutul cmpului BLOB
ntr-un fiier (cu extensia jpg), i se afieaz practic imaginea stocat de acest fiier. Pentru o nou
interogare reuit, acest fiier va fi suprascris. n caz de interogare nereuit, fiierul intermediar va fi
ters (pentru a nu se afia ultima imagine gsit).

Verificarea gsirii unei nregistrri care corespunde condiiei de interogare, este asigurat de
funcia: mysql_num_rows(). Aceast funcie returneaz numrul de linii gsite de o comand SQL
SELECT.

Observaie: Asupra lucrului cu fiiere n PHP se va reveni ntr-un paragraf ulterior.

Numrul funciilor PHP pentru lucrul cu baze de date MySQL este mult mai mare. Prin exemplele
prezentate i prin funciile specifice exemplificate, s-a dorit doar o simpl introducere n problematica
lucrului cu astfel de baze de date. Pentru mai multe detalii, resursele bibliografice n domeniu sunt mai
mult dect suficiente, n special cele oferite pe Internet.

1.10. Apelul unei proceduri stocate

Toate exemplele de operare cu MySQL din paragrafele anterioare au folosit ca mijloc de


comunicare cu serverul de baze de date comenzi SQL standard (SELECT, INSERT, UPDATE, DELETE),
pasate succesiv ca string-uri de caractere spre acesta i executate n ordinea sosirii lor pe server. Eecul
uneia dintre comenzi (din diverse motive, spre exemplu nclcarea unei constrngeri), nu bloca execuia
celorlalte apeluri SQL (care puteau reui) astfel nct, la finalul execuiei scriptului era posibil ca datele
actualizate n baza de date s nu-i mai pstreze consistenta i valabilitatea logic. Dac se pune
problema unei operri tranzacionale - ori se execut ntregul set de comenzi SQL implicate n
tranzacie, ori, n caz de nereuit a uneia, efectul i al tuturor celorlalte este anulat o soluie elegant
o constituie apelul unei proceduri stocate. O procedur stocat poate conine oricte comenzi SQL,
40 Tehnologii WEB Cursul 11 + 12

justificndu-se crearea ei n cazul n care multiple operaii distincte de actualizare


(modificare/adugare/tergere) a datelor bazei de date sunt necesare i se dorete fie execuia unitar
a tuturor comenzilor, fie a nici uneia. Pentru simple interogri SELECT, care nu modific date din tabele,
nu sunt necesare apeluri de proceduri stocate, utilizarea unor comenzi clasice SELECT (chiar succesive)
fiind soluia normal. Codul proceduri stocate (comenzi SQL) este evident salvat pe serverul de baze de
date.

n continuare este prezentat modul n care din PHP poate fi realizat un apel de procedur stocat
MySQL, aceasta asigurnd la finalizarea execuiei script-ului PHP caracterul tranzacional al execuiei
unor seturi de comenzi SQL de actualizare a datelor din baza de date. Ca i alte sisteme de gestiune a
bazelor de date, MySQL ofer suport pentru procedurile stocate, evident cu cteva aspecte specifice lui.

Pentru exemplificare, fie o tabel TESTUL, avnd 3 coloane de tip INT (c1, c2, c3). Se consider
o procedur stocat (numite TESTUL1), care adaug parametrizat o linie nou n tabel (completnd cu
date doar coloanele c1 i c2), apoi pentru linia nou introdus calculeaz o valoare pentru coloana c3. La
crearea procedurii stocate, deoarece n MySQL caracterul ; (punct i virgul) semnific ncheiere unei
linii de cod (delimitator de linie), un alt caracter sau secven de caractere trebuie definit i utilizat
pentru marcarea sfritului definiiei procedurii stocate (urmnd ca apoi s se revin la caracterul
consacrat ;). Corpul procedurii astfel create (inclusiv comanda de tergere prealabil a ei dac deja
exist, respectiv definiiile delimitatorilor necesari // i ;) este urmtorul

Drop procedure test1;

Delimiter //

Create procedure test1 (param1 int, param2 int)

Begin

Insert into testul1 (c1,c2) values(param1, param2);

Update testul1 set c3=c1+c2 where c1=param1;

End;

//

Delimiter;

Un apel al procedurii stocate (din cadrul clientului textual MySQL console), urmat de o afiare a
tabelei pentru a verifica efectul ei, este prezentat n continuare:

Call test1(101,101);

Select * from testul1;

Pentru apelul din PHP al procedurii stocate (scriptul Web jucnd rolul clientul apelant) se poate
folosi secvena urmtoare de cod (presupunnd o conexiune valid):

$var=100;

mysql_query("call test1($var,101)") or die("Procedura esuata!");

echo ("Procedura executata!");

Observaie: O soluie simpl i comoda pentru a nu mai scrie explicit i repetat pentru fiecare pagin
script a unei aplicatii Web a setului de comenzi de conectare la serverul de baze de date, respectiv
selecie a bazei de date, o constituie crearea unui script distinct de conectare, respectiv utilizarea
comenzii PHP include() referind acest script de conectare. Fie scriptul de conectare conectare.php:

<?php $server=localhost;

$user=root;

$passw=parola;

$db=baza;

$con=mysql_connect ("$server", "$user", "$passw") or die ("Error connecting to mysql");


Tehnologii WEB Cursul 11 + 12 41

$dbf=mysql_select_db($db) or die ("Error connecting to DB"); ?>

n fiecare script al aplicaiei (site-ului) Web care necesit o conectare la serverul MySQL, nainte
de realizarea unor operaii SQL efective de interogare, se insereaz linia urmtoare (asigurnd
conectarea la serverul de baze de date):

include("conectare.php ");

1.11. Prevenirea problemei SQL injection

Una dintre problemele de securitate ale aplicaiilor Web cu baze de date o constituie aa numita
problem a injectrii SQL (SQL Injection). Tehnica SQL injection const ntr-o integrare (interactiv, prin
datele de intrare) a unor poriuni suplimentare de cod SQL care permit o ataare la interogrile SQL a
unor condiii permanent ndeplinite, anulnd astfel filtrele condiionale de securizare. [20] Astfel,
anumite combinaii de condiii ataate string-ului SQL de interogare pot s conduc la o nou comand
SQL valid, care anuleaz toate restriciile viznd accesul la date, sau chiar conduc la crearea i
trimiterea spre serverul de baze de date a unor comenzi SQL cu cert potenial distructiv. Ideea de baz
a acestei tehnici const n faptul c, n cadrul codului script, pe baza datelor de intrare (INPUT), pot fi
create string-uri de comenzi SQL cu rol nedorit, maliios, pasate spre serverul de baze de date i
executate necondiionat de acesta. Aceste secvene ataate codului SQL generat prin concatenri de
string-uri, anuleaz condiiile de filtrare ale comenzii i transform comanda SQL ntr-o nou comand,
avnd o cu totul alt aciune dect cea dorit.

Din fericire, la ora actual interpretoarele PHP de versiuni recente sunt setate (prin intermediul
unor valori adecvate ale variabilelor interne de stare din fiierul de configurare php.ini) astfel nct s
resping din start aceste atacuri, interpretnd anumite forme de string-uri ca secvene maliioase i
genernd. secvene SQL adecvate, anulndu-le astfel potenialul distructiv.

Unul dintre principiile de baz ale unei injectri SQL poate fi descris succint de urmtorul mod de
construcie al string-ului de interogare:

String_interogare=comand_SQL_cu_conditii_logice. OR secventa_conditionala malitioasa,


ultima secven condiional introdus de la tastatur fiind tot timpul adevrat (iar condiia logic OR
face ca ntreaga secven condiional s fie ndeplinit).

Pentru o nelegere a acestui tip de atac, se considera o exemplificare concret. Fie tabelul TEST
(MySQL) cu structura i datele descrise n figura 1.16.

De asemenea, se consider o aplicaie WEB care permite interogarea dup coloanele CNP i
NUME, permind afiarea linie corespunztoare datelor introduse, interesnd afiarea informaiei
aferente coloanei PIN_SECRET. Aplicaia necesit un formular HTML pentru introducerea datelor de
interogare (CNP i NUME), respectiv un script PHP de interogare efectiv:

- Formular introducere date interogare:

<form action="temp2.php" method="POST">

CNP---><input name="param1" size=13> <br>

Nume--><input name="param2" size=13> <br>

<input type="Submit" Value="Cauta!"></form>

- Script interogare (PHP):

<?php

$query1=mysql_connect(localhost,root,);

mysql_select_db(test);

$param1=$_POST[param1];
42 Tehnologii WEB Cursul 11 + 12

$param2=$_POST[param2];

$query = "SELECT * FROM test WHERE cnp=$param1 and nume=$param2";

echo $query;

$interoghez=mysql_query($query);

print(<table align=center BORDER="2">);

print ("<tr>");

echo <th BGCOLOR="Silver">ID</th>;

echo <th BGCOLOR="Silver">CNP</th>;

echo <th BGCOLOR="Silver">PIN_SECRET</th>;

print ("</tr>");

while ($row = mysql_fetch_row($interoghez))

{ echo" <tr>\n";

foreach ($row as $value)

echo "<td>$value</td>";

echo "</tr>";

} ?>

Fig.1.16. Structura i date tabela TEST

a) n scenariul considerat, ca prim exemplificare, se realizeaz o interogare cu parametri


normali presupunnd introducerea de la tastatur a unor valori concrete pentru CNP, respectiv
NUME. Figurile 1.17.a i 1.17.b exemplific o interogare care nu gsete nici o linie adecvat
(PIN_SECRET neregsit), iar figurile 1.17.c i 1.17.d- o interogare reuit (PIN_SECRET afiat).
Tehnologii WEB Cursul 11 + 12 43

Fig.1.17.b. Cutare nereuit


Fig.1.17.a. Ecran interogare parametri
incoreci - protecie activ

Fig.1.17.c. Ecran interogare Fig.1.17.d. Cutare reuit


parametri coreci

b) Urmtoarea exemplificare presupune o interogare cu parametri anormali, deci practic o


injectare SQL. n fiierul de configurare PHP.ini - protecia implicit la instalarea PHP este setat
corespunztor prin valoarea adecvat a variabilei parametru magic_quotes_gpc (semnificaia
acesteia fiind ghilimele_magice sau citate_ magice):

; Magic quotes for incoming GET/POST/Cookie data.

magic_quotes_gpc = On

n figurile 1.18.a i 1.18.b este exemplificat cazul n care, dei printr-o injectare SQL este
construit un string de interogare maliios (care impune o condiie permanent ndeplinit), protecia
implicit a interpretorului PHP nu ofer acces la datele tabelei. Secvena de injectare SQL const n
introducerea n a doua caset (INPUT) a string-ului OR 1 (neavnd importan valoarea introdus n
prima caset), astfel nct secvena de interogare pasat spre serverul de baze de date devine:

SELECT * FROM test WHERE cnp=orice and nume=\ OR\1

De asemenea, n figurile 1.18.c i 1.18.d este considerat o alt form de injectare SQL, ns
protecia implicit PHP i face din nou datoria, mpiedicnd accesul la date. Astfel, secvena SQL
injectat i deci alterat prin introducere n ultim caset a secvenei de cod condiional OR=, devine:

SELECT * FROM test WHERE cnp=orice and nume=\ OR \\=\


44 Tehnologii WEB Cursul 11 + 12

Fig.1.18.b. Cutare nereuit Protecia


Fig.1.18.a. Valoare introdus pentru implicita mpiedic injectarea sql
parametrul al doilea: OR 1

Fig.1.18.d. Cutare nereuit! Protecia


Fig.1.18.c. Valoare introdus pentru
implicita mpiedic injectarea sql
parametrul al doilea: OR =

n ambele cazuri se poate observa caracterul \ , precednd de multe ori caracterul ghilimea
(prezena lui fiind un prim semn al unui posibil atac) i genernd astfel o interogare SQL al crei
potenial maliios este practic anulat (noua condiie ataat nu este ndeplinit).

Acelai scenariu este reluat considernd dezactivat protecia intern PHP (situaie implicit la
versiuni mai vechi PHP):

magic_quotes_gpc = Off

Rezultatele sunt prezentate n figurile 1.19.a i 1.19.b, respectiv 1.19.c i 1.19.d. String-urile de
interogare generate n urma injeciei SQL sunt comenzi SQL perfect valide, avnd condiia de filtrare
(clauza WHERE) adevrat tot timpul:

SELECT * FROM test WHERE cnp=orice and nume= OR 1

(condiia OR 1 fiind tot timpul ndeplinit)

SELECT * FROM test WHERE cnp=orice and nume= OR =

(condiia OR = fiind tot timpul ndeplinit)

Mai mult, se observ c n urma injectrii SQL, ntregul coninut al tabelei TEST este accesibil,
fiind practic depit bariera de protecie implicnd cunoaterea a dou informaii (CNP i NUME) pentru
a avea acces la informaia protejat (PIN_SECRET). Practic ntreaga informaie (inclusiv CNP i NUME)
din tabel este accesibil, cu consecine imprevizibile .
Tehnologii WEB Cursul 11 + 12 45

Fig.1.19.b. Cutare reuit! Protecia


Fig.1.19.a. Valoare introdusa pentru
dezactivat permite injectarea sql i
parametrul al doilea: OR 1
afiarea NTREGULUI coninut al tabelei

Fig.1.19.c. Valoare introdusa pentru Fig.1.19.d. Cutare reuita! Protecia


parametrul al doilea: OR = dezactivat permite injectarea sql i
afiarea NTREGULUI coninut al tabelei

i n final, un ultim scenariu care implic o protecie explicit, preventiv, recomandat a fi


folosita indiferent de setarea interpretorului PHP (deci indiferent de valoarea variabilei
magic_quotes_gpc). Soluia const n completarea scriptului PHP anterior cu liniile de cod urmtoare:

$param1=mysql_real_escape_string($param1);

$param2=mysql_real_escape_string($param2);

plasate nainte de construcia string-ului de interogare $query folosind cei doi parametri.

Evident, dac sunt mai muli parametri de interogare, asupra fiecruia se aplic funcia
mysql_real_escape_string, anterior interogrii (efectul acestei funcii fiind practic similar celui obinut
prin setarea adecvat pe ON a parametrului magic_quotes_gpc din fiierul de configurare php.ini).

Paragraful de fa a tratat doar problematica unui atac Web prin tehnica injectrii SQL, inta
acestuia fiind baza de date aflat n spatele aplicaiei, codul script propriu-zis nefiind cel direct vizat.
Exist i atacuri avnd o astfel de int, exploatnd n general bree generate prin configurarea
inadecvat a serverului de Web. Totui, n contextul dinamicii aplicaiilor Web asigurat prin preluarea
informailor din baze de date, o alterare a coninutului tabelelor atacate poate conduce implicit i la o
modificare a coninutului dinamic al site-ului.
46 Tehnologii WEB Cursul 11 + 12

2. Dezvoltare de aplicaii PHP cu baze de date Oracle

2.1. Interogare fr parametri

Pentru operarea cu baze de date Oracle este necesar utilizarea bibliotecii php_oci8.dll. ca
extensie PHP. Scriptul urmtor prezint o exemplificare a utilizrii ctorva dintre funciile oferite de
aceast bibliotec.
Conectarea la o baz de date Oracle se face utiliznd funcia PHP OCILogon (parametri
obligatorii ai acesteia fiind numele de user, parola i numele instanei Oracle, implicit ORCL pentru
versiunile Oracle Enterprise/Professional, respectiv XE pentru versiunile Express). Interogarea unei
tabele a unei baze de date Oracle (mai precis, n exemplu de fa, tabela ANGAJATI avnd coloanele ID,
NUME, SALAR) se face utiliznd funciile OCIParse i OCIExecute, fiind apoi extrase i afiate succesiv pe
ecran datele din liniile aceasteia (bucla while cu OCIFetch). Apoi, n exemplul prezentat, nregistrarile
din tabela angajati sunt adugate ntr-o alt tabel evidenta, utiliznd comanda SQL INSERT, mpreun
cu comenzile PHP OCIParse i OCIExecute (practic, se face un transfer al informaiilor din tabela
angajati n tabela evidenta). n final sunt eliberate resursele i este nchis conexiunea cu baza de date
Oracle. Se poate observa c procedura de lucru este practic identic cu cea din cazurile anterioare
(MySQL), doar numele funciilor utilizate i sintaxa lor fiind specifice bibliotecii extensie OCI8.
<?php

// Conectare la serverul Oracle (ultimul parametru se

// completeaz doar pentru un server Oracle la distan)

$connection = OCILogon("student", "student","ORCL");

// Interogare tabel

$stmt = OCIParse($connection, "SELECT * FROM angajati");

// Executa comanda SQL

OCIExecute($stmt);

// Generarea tabelului pentru afiarea rezultatelor obinute

echo "<table border=4 align=center>";

echo "<tr>";

echo "<th>ID</th>";

echo "<th>NUME</th>";

echo "<th>SALAR</th>";

echo "</tr>";

// Bucla pentru extragerea rezultatelor

while(OCIFetch($stmt))

$id= OCIResult($stmt, "ID");

$nume= OCIResult($stmt, "NUME");

$salar= OCIResult($stmt, "SALAR");

print (" <tr>\n".

" <td>$id</td>\n".

" <td>$nume</td>\n".

" <td>$salar</td>\n".
Tehnologii WEB Cursul 11 + 12 47

" </tr>\n");

/ / Pregtete adugarea

$stmt1 = OCIParse($connection, "INSERT into evidenta values ($id, $nume, $salar)");

// Execut comanda (adugare)

OCIExecute($stmt1);

// Elibereaz resursele i nchide conexiunea

OCIFreeStatement($stmt);

OCIFreeStatement($stmt1);

OCILogoff($connection);

?>

n situatia n care datele adugate sunt i de tip dat calendaristic (de asemenea, un tip uzual),
se va folosi o funcie de conversie la un format Oracle corespunzator (TO_DATE). Spre exemplificare:

$stmt1 = OCIParse($connection, "insert into test values


($id,$nume,$salar,TO_DATE($data,YY-MM-DD))");

Pe baza exemplului anterior, analiznd functiile specifice (OCILogon, OCIParse, OCIExecute,


OCIFetch, OCIResult, OCIFreeStatement, OCILogoff), se pot remarca cteva deosebiri fa de cazul
operrii cu MySQL. Totui, mai exist un set de funcii (destinate Oracle) a cror sintax, respectiv
funcionalitate, este foarte de apropiat de cea a setului folosit pentru MySQL, facnd extrem de facil
transpunerea unui script opernd cu MySQL ntr-un script opernd cu Oracle. Se consider urmtorul
exemplu n acest sens:

<?php

$connection = OCI_connect("student", "student","orcl");

$stmt = OCI_Parse($connection, "SELECT * FROM angajati");

OCI_Execute($stmt);

echo "<table border=4 align=center>";

echo "<tr>";

echo "<th>ID</th>";

echo "<th>NUME</th>";

echo "<th>SALAR</th>";

echo "</tr>";

while($row=OCI_Fetch_row($stmt))

print (" <tr>\n".

" <td>$row[0]</td>\n".

" <td>$row[1]</td>\n".

" <td>$row[2]</td>\n".

" </tr>\n");

}
48 Tehnologii WEB Cursul 11 + 12

OCI_Free_Statement($stmt);

OCI_close($connection); ?>

Se pot remarca similitudinile sintactice i funcionale ale noilor funcii utilizate, comparativ cu
cele destinate MySQL-ului, aa cum este prezentat comparativ i n tabelul 2.1:

Tabel 2.1.

Oracle MySQL

OCI_Connect MySQL_Connec
t

OCI_Parse + OCI_Execute MySQL_Query

OCI_Fetch_Row, OCI_Fetch_Array, MySQL


_Fetch_Row,
OCI_Fetch_Assoc, OCI_Fetch_Object
MySQL_Fetch_
Array,

MySQL_Fetch_
Assoc,

MySQL_Fetch_
Object

Oci _Num_Rows MySQL


_Affected_Rows

OCI_Close MySQL_Close

2.2. Operare tranzacional

Aa cum s-a precizat pentru MySQL, i n cazul Oracle se poate face un apel, dintr-un script PHP,
la o procedur stocat (util n special pentru operarea tranzacional, cu seturi de multiple comenzi
SQL destinate actualizrii informaiei din bazele de date). Pentru o exemplificare pur didactic, se
consider urmtoarea procedur stocat (cu numele joc), opernd asupra unei tabele (testul1):

Create or replace procedure joc(par1 int, par2 int)

As

Begin

Insert into testul1 (c1,c2) values(par1, par2);

Update testul1 set c3=c1+c2 where c1=par1;

End;

Un script PHP care face un apel al acestei proceduri stocate poate avea codul urmtor
(remarcndu-se apelul procedurii stocate prin intermediul unui bloc PL/SQL, specific Oracle):
<?php
$connection = OCILogon("student", "student","orcl");
// Pregatire execuie bloc PL/SQL integrnd apelul procedurii
$stmt = OCIParse($connection, "BEGIN joc(222,222); end;");
// execuie procedur
OCIExecute($stmt) or die("Esec !")
echo "ok"; ?>
Tehnologii WEB Cursul 11 + 12 49

n cazul Oracle, operarea tranzacional (totul sau nimic) asigurat de folosirea procedurilor
stocate, are i o alt soluie alternativ oferit de existen unui parametru opional (neutilizat n
exemplificrile anterioare) n cadrul funciei OCIExecute :

OCIExecute($identificator_Oci_Parse [, $mod])

Parametrul opional $mod poate s ia valori predefinite de genul:

-OCI_COMMIT_ON_SUCCESS - dup fiecare comand SQL (trimis spre sever cu OCIExecute)


se face COMMIT (aciune implicit, chiar prin lipsa parametrului)

-OCI_NO_AUTO_COMMIT folosit pentru modul tranzacional de operare: la ieirea din script,


nu se salveaz nici o modificare n baza de date (ROLLBACK implicit), dac anterior nu s-a executat o
comand OCI_commit explicit.

n contextul anterior precizat, validarea sau anularea explicit a unei tranzacii Oracle se poate
face folosind funciile PHP OCI_commit sau OCI_rollback.

Pentru o nelegere a modului de operare cu acest parametru, se consider o exemplificare


concret viznd un comportament tranzacional i avnd codul urmtor:

<?php

$connection = OCILogon("student", "student","orcl");

$var = OCIParse($connection, "insert into angajati values (2, dan, 1000)");

OCIExecute($var, OCI_NO_AUTO_COMMIT) or die (error 1);

$var = OCIParse($connection, "insert into angajati values (3, dan, 1000)");

OCIExecute($var, OCI_NO_AUTO_COMMIT) or die (error 2);

$var = OCIParse($connection, "insert into angajati values ($id, $nume, $salar)");

OCIExecute($var, OCI_NO_AUTO_COMMIT) or die (error 3);

OCI_COMMIT($connection );

OCIFreeStatement($var);

OCILogoff($connection); ?>

Se poate observa c scriptul ncearc execuia succesiv a trei comenzi INSERT, scopul acestuia
fiind fie executarea tuturor, fie a nici uneia. Astfel:

- dac toate cele trei comenzi se ncheie cu succes (deci nu se execut nici o comand die care
conduce la ieirea din script i implicit, prin folosirea parametrului OCI_NO_AUTO_COMMIT, la
invalidarea oricrei modificri n baza de date), prin comanda de finalizare a tranzaciei OCI_COMMIT
noile date sunt salvate n baza de date (COMMIT pe toate comenzile);

- dac una dintre comenzi eueaz (chiar dac altele anterioare au reuit), o comand die de
prsire a scriptului este executat (ne mai ajungndu-se la execuia comenzii OCI_COMMIT) i toate
eventualele modificri ale bazei de date efectuate prin apelul scriptului sunt anulate (ROLLBACK pe toate
comenzile).

Utilizarea uneia sau alteia dintre soluiile propuse rmne la latitudinea programatorului.

2.3. Interogare cu parametri pasai prin auto-apelare

Exemplul urmtor, coninnd o interogare parametrizat, se caracterizeaz prin aceea c, att


formularul de furnizare a parametrilor, ct i partea de preluare a acestora i realizare a interogrii, sunt
50 Tehnologii WEB Cursul 11 + 12

incluse ntr-un acelai script (auto-apelare). Practic, la un prim apel al scriptului se execut doar o parte
a acestuia, constnd ntr-un formular (FORM fig. 2.1) pentru preluarea/furnizarea unor valori de
parametri. Prin apsarea butonului din formular, se realizeaz o auto-apelare a aceluiai script spre care
este pasat i un parametru, i va fi executat o alt parte a scriptului (interogarea efectiv). Aceste
decizii sunt luate printr-o structur PHP if-else, ale crei seciuni pot include att cod HTML n clar, ct
i cod PHP ncuibat (fiierul avnd n mod obligatoriu extensia .php). O astfel de structur are forma
urmtoare:

<?php

if ( condiie ) {

?>

cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)

<?php

else {

?>

cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)

<?php

?>

Codul surs complet al unui script exemplificativ (cu auto-apelare) este urmtorul:

<?php

// Secvena care se execut la primul apel al scriptului,

// situaie n care NU a fost nc transmis nc nici un parametru

// de la formular

if (!isset($_GET[nume])){ // setat i nenul

?>

<center>

<form action="<?php $PHP_SELF ?>" method="get">

Nume: <input type="text" name="nume">

<input type="submit" value="GO" />

</form>

</center>

<?php

// Secvena care se execut dup furnizarea unui parametru de interogare

// (autoapelare)
Tehnologii WEB Cursul 11 + 12 51

else{

?>

<table border="4" align=center>

<tr>

<th>ID</th>

<th>NUME</th>

<th>SALAR</th>

</tr>

<?php

$numePreluat=$_GET[nume];

$connection = OCILogon("system","manager100", "orcl");

print ("Connected successfully");

$stmt = OCIParse($connection, "SELECT * FROM angajati where NUME=$numePreluat");

OCIExecute($stmt);

while(OCIFetch($stmt)) {

$id= OCIResult($stmt, "ID");

$nume= OCIResult($stmt, "NUME");

$salar= OCIResult($stmt, "SALAR");

print (" <tr>\n".

" <td>$id</td>\n".

" <td>$nume</td>\n".

" <td>$salar</td>\n".

" </tr>\n");

?>

</table>

<?php

OCIFreeStatement($stmt);

OCILogoff($connection);

?>

n cadrul script-ului de mai sus se putea utiliza, ca i variant alternativ, o structur if-else-end
if de forma urmtoare, oarecum similar cu cea anterioar:
52 Tehnologii WEB Cursul 11 + 12

<?php if ( condiie ): ?>

cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)

<?php else: ?>

cod HTML i/sau PHP (ncuibat, ncadrat n delimitatori)

<?php endif; ?>

Fig. 2.1. Formular interogare (apel fr parametrii)

De remarcat utilizarea n cadrul FORM-ului a unei variabile PHP speciale ($PHP_SELF), care
furnizeaz o hyper-legatur (link) spre scriptul care conine acest cod (practic un auto-apel cu transferul
unui parametru, lucru observabil i n linia de comand a browser-ului - fig. 2.1). Figura 2.2 prezint
rezultatul aplicaiei (implementat n maniera cu auto-apelare).

Observaie: Sintaxa action=<?php $_PHP_SELF ?> din cadrul scriptului anterior poate fi nlocuit
cu sintaxa action= sau action=nume_script.php, unde nume_script.php reprezint numele
scriptului curent, care se auto-apeleaz.

De remarcat de asemenea, funcia isset() care determin dac unei variabile i s-a atribuit o
valoare (a fost setat, deci nenul). n caz afirmativ, funcia returneaz valoarea logic TRUE, altfel
returneaz valoarea FALSE.
Tehnologii WEB Cursul 11 + 12 53

Fig. 2.2. Rezultate interogare (auto-apel cu parametri)

Exemplul anterior arat c, att partea de cod specific introducerii de la tastatur a


parametrilor, ct i cea de preluare i utilizare a lor n interogarea SQL efectiv, pot coexista n cadrul
unui aceluiai script PHP, acesta practic putndu-se auto-apela n mod repetat, reacionnd de fiecare
dat n mod diferit funcie de contextul auto-apelului.

Observaie: Spre deosebire de funcia isset (care returneaz TRUE pentru o variabil cu o valoare setat
i nenul), funcia empty returneaz FALSE dac variabila testat are o valoare i acesta nu este 0
(zero). Din acest motiv, n exemplul anterior, isset nu putea fi substituit de empty. Funcia empty
returneaz TRUE pentru string-uri vide ("","0"), 0 (zero numeric), NULL, FALSE, ir vid, respectiv
variabil declarat i neiniializat (caz specific programrii pe obiecte).
54 Tehnologii WEB Cursul 11 + 12

3. Dezvoltare de aplicaii PHP cu baze de date Interbase

Pentru operarea cu baze de date Interbase (sistem de gestiune al bazelor de date produs de
firma Borland), este necesar utilizarea ca extensie a bibliotecii php_interbase.dll. Aplicaia urmtoare
face o simpl exemplificare, avnd drept scop principal, relevarea faptului c, indiferent de tipul de baze
de date utilizat, modul de abordare al problemei este relativ identic. Diferenele majore (excluznd
evident utilizarea unor funcii specifice fiecrui tip de baz de date) const n modul n care se face
conexiunea la serverul SQL, respectiv n modul n care sunt referii parametrii de interogare n cadrul
comenzilor SQL apelate. Aplicaia de fa presupune adugarea unei noi linii ntr-o tabel Interbase,
respectiv cutarea acestei noi linii i afiarea sa pe ecran. Se consider tabela Interbase table1 creat
cu comanda:

CREATE TABLE table1 (nr INT, nume CHAR(10), virsta INTEGER, localitate CHAR(10));

i n acest caz este necesar existena unui fiier HTML pentru transmiterea spre scriptul PHP
propriu-zis a valorilor corespunztoare articolului care va fi adugat n tabel. Nu se mai face o
prezentare a acestuia, fiind similar cu cel din paragraful 1.3 (practic un formular pentru transmiterea
parametrilor de intrare spre scriptul PHP). Acest fiier HTML permite transmiterea a patru parametrii (nr,
nume, virsta, localitate - cu valori introduse de la tastatura) necesari adugrii unei noi linii (complete)
n tabela bazei de date.

Scriptul PHP spre care sunt transmise valorile acestor parametri i care va realiza adugarea
propriu-zis n tabela bazei de date este urmtorul:

<?php

// Conectare la server Interbase si deschide baza de date

$dbh= ibase_connect(localhost:c:\datafile\test.gdb,

sysdba, masterkey);

// Operaie de ad ugare cu parametrii

$query =ibase_query($dbh,"INSERT INTO TABLE1 (nr,nume,virsta,localitate) VALUES (?,?,?,?)",$nr,


$nume, $virsta,$localitate);

Echo "<strong>Adaugare reusita!";


Tehnologii WEB Cursul 11 + 12 55

// Selectarea i afiarea doar a nregistr rii ad ugate

$query =ibase_query($dbh,"SELECT * FROM TABLE1 where nr=?", $NR);

print(<table BORDER="1" align=center >);

$coln=ibase_num_fields($query); //nr. de cimpuri

print (" <tr>\n");

// realizare automat a capului de tabel (coninnd toate cmpurile)

for ($i=0; $i<$coln; $i++){

//ir (array) cu informaii despre cmpuri

$col_inf=ibase_field_info($query,$i);

//numele cmpurilor ca i cap de tabel

echo "<th BGCOLOR=Silver>$col_inf[0]</th>";

// Atenie - greit: echo<th GCOLOR="Silver">$col_inf[0]</th>

print (" </tr>\n");

while ($row = ibase_fetch_row($query)) {

echo" <tr>\n";

foreach ($row as $value) {

//Afiare nregistrare ad ugata

echo "<td BGCOLOR=Cyan> $value</td>";

echo "</tr>";

ibase_close ($dbh);

?>

Rezultatul pe ecran este similar cu cel din fig. 1.9.

Scriptul poate fi modificat echivalent (cu acelai rezultat) astfel:

n locul compactei comenzi ibase_query($dbh,"INSERT se poate folosi o secven echivalent


de genul:

//preg tirea unei interog ri cu parametrii (util mai ales dac se repet , dar cu

// ali parametrii de intrare)


56 Tehnologii WEB Cursul 11 + 12

// comanda INSERT n aceast sintax se refer la toate cmpurile tabelei

$query =ibase_prepare(INSERT INTO TABLE1 VALUES (?,?,?,?));

// executarea ad ug rii (prin transferul parametrilor)

ibase_execute($query,$NR,$nume,$virsta,$localitate);

ibase_free_query($query);

// eliberare resurse (nu este obligatorie)

ibase_free_result($sth); //nu este obligatorie

Se poate remarca, comparativ cu situaiile operrii cu MySQL, respectiv Oracle, c deosebirile


substaniale apar legat de conexiunea la serverul SQL (string-ul de conectare), respectiv deschiderea
bazei de date, precum i la modul de integrare a parametrilor de intrare n cadrul string-ului de
interogare (comanda SQL). n rest, lucrurile sunt aproape similare, din acest motiv ne mai insistndu-se
asupra operrii cu alte tipuri de servere de baze de date.

Observaie: Se menioneaz c, kit-ul de distribuie PHP vine nsoit de un pachet suplimentar (a crui
eventual instalare se face explicit, ulterior instalrii de baz), numit PEAR (PHP Extension and
Application Repository), constnd practic ntr-un depozit/colecie de componente software reutilizabile
(open-source). n cadrul acestuia, o component (PEAR:DB) se refer la operarea cu baze de date,
asigurnd un strat suplimentar de abstractizare, care conduce astfel la o cretere a portabilitii codul
din punct de vedere al multitudinii de tipuri de baze de date. Pachetul PEAR:DB ofer un API
(Application Programming Interface) unificat pentru gestionarea diverselor tipuri de baze de date,
principalele avantaje ale folosirii lui fiind simplitatea codului i portabilitatea lui, fiind recomandat
folosirea lui n cadrul unor aplicaii care implic o mare diversitate de tipuri de baze de date.

S-ar putea să vă placă și