You are on page 1of 70

CUPRINS

CUPRINS....................................................................................................................................................................4
CAPITOLUL 1. INTRODUCERE.........................................................................................................................5
1.1 GENERALITI......................................................................................................................................................5
1.2 SCOPUL I UTILITATEA PROIECTULUI..................................................................................................................6
1.3 PREZENTAREA CAPITOLELOR DIN LUCRARE.......................................................................................................6
CAPITOLOUL 2. TEHNOLOGII WEB PENTRU REALIZAREA SITE-URILOR INTERACTIVE7
2.1 INTERFAA HTML..............................................................................................................................................7
2.1.1 Introducere in limbajul HTML...............................................................................................................7
2.1.2. Structura unui document HTML.........................................................................................................8
2.1.3. Formatarea textului..............................................................................................................................10
2.1.4. Formatarea paragrafelor....................................................................................................................10
2.1.5. Formatarea la nivel de caracter.........................................................................................................11
2.1.6. Aplicarea unor efecte asupra texlului................................................................................................11
2.1.7. Utilizarea citatelor n documente HTML..........................................................................................12
2.1.8. Utilizarea indicilor si a exponenilor.................................................................................................13
2.1.9. Inserarea legturilor n documente HTML......................................................................................13
2.1.10. Inserarea imaginilor n documente HTML....................................................................................14
2.1.11. Inserarea tabelelor n documente HTML........................................................................................15
2.1.12. Utilizarea cadrelor n documente HTML......................................................................................15
2.1.13. Utilizarea cadrelor inline...................................................................................................................16
2.1.14. Utilizarea formularelor......................................................................................................................17
2.2 BAZELE DE DATE MYSQL.................................................................................................................................19
2.2.1 Comanda SHOW....................................................................................................................................20
2.2.2 Comenzile CREATE i DROP...............................................................................................................21
2.2.3 Comanda INSERT.................................................................................................................................22
2.2.4 Comanda SELECT.................................................................................................................................23
2.2.5 Stringuri (iruri)....................................................................................................................................25
2.2.6 Normalizarea.........................................................................................................................................32
2.3 LIMBAJUL PHP.................................................................................................................................................32
2.3.1 Introducere..............................................................................................................................................32
2.3.2 Elemente de baz ale limbajului PHP................................................................................................33
2.3.3 Folosirea funciei print.........................................................................................................................34
2.3.4 Tipuri de variabile.................................................................................................................................35
2.3.5 Operatori.................................................................................................................................................36
2.3.6 Structuri de control...............................................................................................................................37
2.3.7 Funcii......................................................................................................................................................40
FUNCII PREDEFINITE.............................................................................................................................................41
CAPITOLUL 3. REALIZAREA SITE-ULUI INTERACTIV DE INFORMARE TURISTIC..........41
3.1. SCOPUL APLICAIEI...........................................................................................................................................41
3.2. MODUL DE REALIZARE.....................................................................................................................................42
3.2.1 Implementarea bazei de date MySQL................................................................................................42
3.2.2 Realizarea site-ului propriuzis cu ajutorul limbajului PHP...........................................................45
Pagina header.php...................................................................................................................................................45
Pagina footer.php.....................................................................................................................................................46
Pagina session.php...................................................................................................................................................46
Pagina constants.php...............................................................................................................................................47
Pagina db_connection.php.....................................................................................................................................47
Pagina functions.php...............................................................................................................................................48
Pagina functions_form.php....................................................................................................................................51
Pagina index.php...................................................................................................................................................... 52
Pagina login.php.......................................................................................................................................................54
Pagina staff.php........................................................................................................................................................ 55
Pagina continut.php.................................................................................................................................................56
Pagina editeaza_subiect.php..................................................................................................................................57
Pagina sterge_subiect.php......................................................................................................................................59
Pagina subiect_nou.php..........................................................................................................................................60
Pagina creaza_subiect.php......................................................................................................................................61
Pagina editeaza_pagina.php...................................................................................................................................62

4
Pagina form_pagina.php.........................................................................................................................................64
Pagina sterge_pagina.php.......................................................................................................................................65
Pagina pagina_noua.php.........................................................................................................................................65
Pagina utilizator_nou.php......................................................................................................................................67
Pagina logout.php....................................................................................................................................................69
Pagina .......................................................................................................................................................................69
Bibliografie..................................................................................................................................................................69

5
Capitolul 1. Introducere

1.1 Generaliti

World Wide Web-ul reprezint un sistem de distribuie local sau global a


informaiilor hipermedia [1]. Din punct de vedere tehnic, spaiul Web pune la dispoziie
un sistem global i standardizat de comunicare multimedia, informaiile fiind organizate
asociativ i distribuite n funcie de cererile utilizatorilor, funcionnd conform
modelului client/server. Web-ul, cu toat dezvoltarea lui spectaculoas, nu trebuie
confundat cu Internetul, ci poate fi vzut drept celmai efervescent i dinamic serviciu al
acestuia, neputnd exista fr infrastructura harware a reelelor mondiale
interconectate.
Spaiul WWW a fost creat la CERN ( Centrul European de Cercetri Nucleare de
la Geneva) n anul 1989 de ctre fizicianul Tim Berners-Lee i echipa sa, cu scopul de a
avea acces mai uor la informaiile tehnice ale manualelor de utilizare a calculatoarelor.
Data de 12 noiembrie 1990 se consider a fi ziua de natere oficial a Web-ului. Primul
client grafic permind vizualizarea de documente WWW a purtat denumirea World
Wide Web. Dezvoltarea ulterioar a sistemului a fost facilitat de navigatorul grafic
Mosaic, rulnd sub mediul Xwindow. Acest navigator era foarte simplu de folosit si
poseda faciliti multimedia, fiind furnizat gratuit pe Internet ncepnd din 1993.
Ca orice serviciu bazat pe modelul client/server, Web-ul const dintr-o pleiad de
servere Web. Cele mai cunoscute sunt Apache, Netscape Enterprise Server, Sun Web
Server, Microsoft Internet Information Server, Stronghold, Jigsaw. Calculatorul pe care
ruleaz un server Web i care gzduiete o serie de pagini WWW se mai numete i sit
(site). Documentele (paginile) Web vor fi vizualizate de utilizatori prin intermediul
navigatoarelor Web (denumite i browsere sau ageni-utilizator), care reprezint de fapt
clieni solicitnd resurse hipertext serverelor Web. Dintre cele mai populare navigatoare
actuale pot fi amintite Netscape Navigator, Internet Explorer sau Opera (toate opernd
n mod grafic), ori Lynx sau Links (rulnd n mod text)[2].

1.2 Scopul i utilitatea proiectului

Site interactiv de informare turistica este un proiect destinat asociaiilor de


tineret sau chiar i a firmelor de turism care doresc s fie prezente n spaiul World
Wide Web cu informaii despre destinaiile turistice i oferte de excursii.
Scopul acestui proiect este de a exemplifica realizarea i folosirea unui site
interactiv care permite publicarea online unei serii de informaii despre obiectivele
turistice sau de alt natur, ntr-o forma simpl i rapid, direct prin intermediul site-
ului. De asemenea se exemplific utilitatea folosirii limbajului PHP i a bazelor de date
MySQL pentru o realizare ct mai flexibil a site-ului interactiv care conine imaginile i
informaiile aferente.

1.3 Prezentarea capitolelor din lucrare

Capitolul 1. Introducere

6
Cuprinde dou pri care se refer la generaliti asupra proiectului realizat i
asupra Web-ului. Prima parte cuprinde o motivare a realizrii acestui proiect, iar a doua
parte cuprinde o descriere a capitolelor introduse n acest material.

Capitolul 2. Tehnologii Web pentru realizarea site-urilor interactive

Cuprinde trei pri care fac referire la limbajele de programare folosite pentru
realizarea acestui proiect.
Prima parte se refer la folosirea limbajului HTML n cadrul paginilor Web. Sunt
descrise pri importante ale acestui limbaj.
Partea a doua arat utilitatea folosirii bazelor de date MySQL i exemple de
folosire a acestora.
Partea a treia cuprinde elementele specifice ale programrii n cadrul limbajului
PHP. Aceast parte demonstreaz posibilitile oferite de limbajul PHP pentru
realizarea aplicaiilor pentru pagini Web.

Capitolul 3. Realizarea site-ului interactiv.

Cuprinde dou pri n care sunt prezentate scopul pentru care a fost conceput
aceast aplicaie, respectiv o descriere amnunit a modului de realizare i utilizare a
acesteia.

Bibliografie

Cuprinde o list de materiale bibliografice i alte surse care au fost utilizate


pentru documentare.

7
Capitoloul 2. Tehnologii Web pentru realizarea site-
urilor interactive

2.1 Interfaa HTML

2.1.1 Introducere in limbajul HTML

HTML este prescurtarea de la HyperText Markup Language, limbajul utilizat n


World Wide Web pentru descrierea hipertextelor. HTML nu este un limbaj de
programare propriu-zis, ci doar un limbaj de descriere, coninnd elemente ce permit
construirea paginilor Web. Astfel, HTML ofer posibilitatea de a publica pe Web
documente ce conin text, liste, etichete, imagini, secvene audio sau video, legturi ce
permit accesarea altor resurse Web printr-un simplu clic, formulare care permit
accesarea unor servicii on-line (de exemplu, comandarea unor produse, rezervarea unor
bilete), realizarea comerului electronic, etc. [1].
Limbajul HTML este principalul limbaj de descriere a paginilor de WEB.
Realizatorii paginilor de WEB, folosesc acest principal limbaj mpreun cu alte limbaje
pentru a realiza pagini de WEB. Aceste pagini de WEB se depun (se copieaz ) pe
serverele de INTERNET (bazate n general pe LINUX) ntr-un director special astfel
nct sunt accesibile din INTERNET cu ajutorul browserelor .
Limbajul HTML a fost creat n 1990 de ctre Tim Berners-Lee si Daniel Connoly,
fiind derivat din SGML (Standard Generalized Markup Language - limbaj standard
generalizat de marcare), un standard internaional, aprobat n 1986. SGML permite
tehnoredactarea documentelor complexe utiliznd un set de reguli de descriere specific.
HTML este un limbaj mult mai simplu, destinat doar paginilor Web, dar are
caracteristici specifice limbajelor descriptive [2]:
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 95 putei 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 browsere, care lucreaz pe diferite tipuri de sisteme de calcul;
prin urmare, documentelor HTML sunt independente de platforma de lucru.
HTML utilizeaz pentru descrierea documentelor Web etichete (denumite si
tag-uri) specifice pentru fiecare element descris; etichetele stabilesc att structura
documentului, ct i aspectul acestuia.
Pentru a fi delimitate, etichetele HTML sunt ncadrate ntre paranteze unghiulare
(<>). Descrierea celor mai multe elemente ale unui document HTML necesit o etichet
de nceput (<TAG>) si o etichet de sfrit (</TAG>). Se observ c singura diferen
dintre eticheta de nceput i cea de sfrit este caracterul / (slash). Efectul
corespunztor etichetei este aplicat textului dintre eticheta de nceput i cea de sfrit.
De exemplu, pentru a scrie cursiv ntr-o pagin de Web textul Acesta este un text
ncadrm textul ntre etichetele <I> si </I> astfel:
Descriere
<I> Acesta este un text </I>
Efect n pagina de WEB

8
Acesta este un text
n HTML nu se face distincie ntre literele mari i mici, dar pentru a evidenia
etichetele este bine s le scriem cu majuscule.
Unele elemente HTML admit atribute care specific informaii suplimentare
despre coninutul elementului. Atributele unui element se precizeaz n cadrul etichetei
de nceput i se aplic doar elementului curent. De exemplu, dac dorim s includem o
imagine n document, trebuie s specificm ca atribut adresa fiierului care conine
imaginea, eventual i modul de aliniere a imaginii n raport cu textul etc. Eticheta
urmtoare permite includerea n document a imaginii din fiierul imagine imagine.gif
din locaia curent, aliniat la mijlocul rndului de text:

<IMG SRC="imagine.gif ALIGN=MIDDLE>

Se observ c atributele sunt separate prin spaii, iar specificarea lor presupune
precizarea numelui atributului i a valorii acestuia sub forma : atribut=valoare
Unele atribute admit orice valoare concordant cu semnificaia atributului (de
exemplu, atributul SRC asociat etichetei <IMG> admite ca valoare orice ir de caractere
care reprezint adresa sau URL-ul unui fiier ce conine o imagine), alte atribute admit
doar valori predefinite (de exemplu, atributul ALIGN asocial etichetei <1MG> admite
doar trei valori predefinite - TOP, MIDDLE, BOTTOM).

2.1.2. Structura unui document HTML

Un document HTML este de fapt un fiier text pe care l putem vizualiza cu un


editor de texte. Documentul este delimitat de perechea de etichete <HTML> i
</HTML> i este constituit din:
a) Antetul documentului, delimitat de etichetele <HEAD> i </HEAD>, care
conine
informaii generate referitoare la document, cum ar fi titlul documentului, autorul
acestuia, etc.
b) Corpul documentului, care conine textul propriu-zis al documentului, precum i
elementele specifice de descriere a formatului acestuia.
n antet este recomandat s precizai titlul documenrului, care va fi afiat n bara
titlu a ferestrei browser-ului. Pentru a preciza titlul documentului, care nu poate depi
64 de caractere, se utilizeaz n seciunea antet etichetele pereche <TITLE> i
</TlTLE>, ntre care se scrie titlul documentului[2].
De exemplu:

<HTML>
<HEAD>
<TITLE> Introducere n limbajul HTML </TITLE>
</HEAD>

va avea ca efect afiarea pe bara de titlu a browserului a textului Introducere n


limbajul HTML.
Pentru a specifica n antet si alte informrii suplimentare (cum ar fi autorul
documentului, data crerii, copyright, setul de caractere utilizat implicit etc.) se
utilizeaz eticheta <META>.
De exemplu, pentru a specifica autorul documentului:

<META NAME="Autor CONTENTS = Popescu Ion">


n cadrul etichetei <META> se specific o proprietate a documentului (n cazul

9
nostru "Autor") i i se asociaz o valoare (n cazul nostru "Popescu Ion"). Proprietile
care se pot defini pentru un document nu sunt standard, dar specificarea autorului
(author) sau a cuvintelor cheie (keywords) poate fi deosebit de util motoarelor de
cutare (search engines), eventual chiar o scurt descriere a documentului.
De exemplu, putem specifica cuvintele cheie i descrierea astfel:

<META NAME="Keywords"
CONTENT="HTML,CGI,CSS,JavaScript>
<META NAME=Description
CONTENT=Proiectarea paginilor Web>

n exemple se observ c eticheta <META> admite atributele :


NAME - care conine un sir de caractere ce reprezint numele
proprieti;
CONTENT - care conine valoarea asociat proprietii
respective.

Corpul documentului poate fi delimitat de etichetele <BODY> i </BODY>


sau (n cazul n care este descris structura cadrelor din document, adic se folosete
tehinica cadrelor pentru a descrie pagina ) de etichetele pereche <FRAMESET> i
</FRAMESET>.
Astfel, structura general a unui document HTML poate fi:

<HTML>
<HEAD>
... antetul documentului ...
</HEAD>
<BODY atribute >
... corpul documentului ...
</BODY>
</HTML>

Realizarea efectiv a paginiilor de Web presupune parcurgerea unor etape de


lucru. Exist dou metode de realizare a paginilor de WEB:
Folosind un editor de texte obinuit se scrie coninutul paginii ntr-un fiiere text
care se salveaz (foarte important ) cu extensia HTML sau HTM. Apoi, folosind
un browser ( de exemplu Internet Explorer sau Netscape Navigator) se ncarc
cu ajutorul comenzii OPEN din meniul FILE pagina local realizat.
Folosind un editor specializat n realizarea paginilor de WEB. Exist mai multe
editoare de pagini de WEB , care genereaz codul paginii ( adic nu trebuie s
scrie utilizatorul ntregul cod surs al paginii ) i ofer i faciliti suplimentare .
Cele mai cunoscute sunt Macromedia DreamWeaver , FrontPage i Netscape
Composer .

Comentarii HTML
n cadrul unui document este bine s inserai comentarii, pe care browser-ul nu
le va afia, dar care pot fi utile celor care citesc sau editeaz documentul. Comentariile
HTML ncep cu <! i se termin cu ->. De exemplu,

<! Acesta e un comentariu. Browser-ul nu l "vede" ! ->

Comentariile pot fi inserate oriunde in document!


10
2.1.3. Formatarea textului

Formatarea textului care apare n corpul unui document HTML se poate face la
nivel de bloc (block-level) sau la nivel de caracter (text-level sau inline). Diferenele
principal dintre cele dou tipuri de formatare sunt[1]:
elementele de formatare la nivel de bloc pot conine alte elemente de formatare (la
nivel de bloc sau la nivel de caracter), in timp ce elementele de formatare la nivel de
caracter conin doar text sau alte elemente de formatare la nivel de caracter;
elementele de formatare la nivel de bloc ncep de obicei de la linie nou.

Gruparea mai multor elemente HTML la nivel de bloc se realizeaz cu ajutorul


etichetelor <DIV> i </DIV>. Pentru gruparea mai multor elemente dintr-un bloc la
nivel de caracter (inline) se utilizeaz perechea de etichete <SPAN> i </SPAN>.
Gruparea mai multor elemente prin <DIV> sau <SPAN> va fi deosebit de util dac
vei apela la facilitile oferite de stilurile de formatare text, deoarece vei putea aplica
acelai stil simultan tuturor elementelor din grup[2].

2.1.4. Formatarea paragrafelor

Cnd redactm un text, pentru a-1 face mai uor de citit structurm ideile
principale n paragrafe diferite. Este bine ca un paragraf s conin o singur idee
principal.
n tehnoredactare, prin paragraf se nelege o zon de text cuprins ntre dou
caractere de trecere la linie nou (denumite NewLine sau Enter). Acestea sunt
caracterele cu codurile ASCII 13 (Cariage Return - retur de car, revenire la nceputul
liniei) i 10 (Line Feed - trecere la linia urmtoare). n HTML, delimitarea paragrafelor
se realizeaz cu ajutorul etichetei <P> , eticheta de sfrit </P> fiind opional [1].

Descriere
<P> Paragraful 1 </P>
<P> Paragraful 2 </P>
* * *

Cel mai utilizat atribut atins de eticheta <P> este ALIGN, care stabilete modul
de aliniere stnga - dreapta a textului paragrafului.

ALIGN = LEFT | CENTER | RIGHT | JUSTIFY


Se observ c atributul ALIGN admite patru valori predefinite :
- LEFT - textul este aliniat la marginea din stnga;
- RIGHT - textul este aliniat la marginea din dreapta;
- CENTER - textul este central (plasat la egal distan de marginea din stnga
i cea din dreapta);
- JUSTIFY - textul este aliniat si la stnga si la dreapta (prin mrirea spaiului
ntre cuvinte).

2.1.5. Formatarea la nivel de caracter

Precizarea informaiilor referitoare la fontul utilizat de browser pentru


vizualizarea textului se realizeaz cu ajutorul etichetelor pereche <FONT> si </FONT>.
Dac in document nu sunt precizate nici un fel de informaie referitoare la font,

11
browser-ul va utiliza fontul su implicit[1].
Atributele admise de eticheta <FONT> sunt:

SIZE = valoare
stabilete dimensiunea caracterelor. Valoarea dimensiunii fontului poate fi specificat in
mod absolut (un numr natural cuprins ntre 1 si 7) sau relativ la dimensiunea curent a
caractere of (dac valoarea este +n, caracterele vor fi cu n mrimi mai mari; dac
valoarea este -n, caracterele vor fi cu n mrimi mai mici). Dimensiunea efectiv cu care
sunt vizualizate caracterele depinde de browser.

COLOR = culoare stabilete culoarea


textului.

FACE = list_fonturi
definete o list de fonturi separate prin virgul, dintre care browser-ul l va alege pe
primul disponibil in ordinea preferinelor. Dac nici unul din fonturile din list nu este
instalat pe calculatorul utilizatorului, browser-ul va utiliza fontul implicit.

2.1.6. Aplicarea unor efecte asupra texlului

Pentru a aplica unei zone de text un anumit efect, se ncadreaz textul ntre
eticheta dt nceput i cea de sfrit, corespunztoare efectului respectiv. Cele mai
utilizate efecte se pot aplica asupra textului n HTML sunt[2]:

Descriere
<I> Textul este scris
cursiv</I>
Efect
Textul este scris cursiv
Descriere
<U> Textul este scris subliniat </U>
Efect
Textul este scris subliniat
Descriere
<B> Textul este scris ingrosat </B> Efect
Textul este scris ingrosat
Descriere
<BIG> Textul este scris mai mare </BIG> Efect
Textul este scris mai mare
Descriere
<SMALL> Textul este scris mai mic </SMALL> Efect
Textul este scris mai mic

Descriere
<STRIKE> Textul este scris tiat </STRIKE> Efect
Toxtul- Qst-G -troriG^to-iat

Aceste efecte pot fi utilizate i in combinaie.


De exemplu:
Descriere
<!><B>Textul este scris cursiv ngroat</Bx/I> Efect
Textul este scris cursiv ngroat

12
In HTML se pot aplica si efecte logice, in concordan cu semnifcaia textu respectiv.
De exemplu:

Descriere
<CODE> Textul reprezint un fragment din codul-sursa al unui program; va fi scris
cu un font proporional {de dimensiune fix)</CODE>
Efect
Textul reprezint un fragment din codul-sursa al unui program; va fi scris cu un
font proporional (de dimensiune fix)

Descriere
<EM> Textul este accentuat, scos n eviden </EM> Efect
Textul este accentuat, scos n eviden

Descriere
<STRONG> Textul este mai accentuat, puternic scos n eviden </STRONG>
Efect
Textul este mai accentuat, putGrnic scos n eviden

Descriere
<CITE> Textul reprezinta o referire la o carte, revista, articol etc </CITE>
Efect
Textul reprezinta o referire la o carte, revista, articol etc

2.1.7. Utilizarea citatelor n documente HTML

Uneori se impune utilizarea citatelor ntr-un document HTML. Pentru inserarea


de citate exist dou etichete : <BLOCKQUOTE> si <Q>. Arabele necesit etichet de
sfrit, textul cuprins intre cele dou etichete fiind un citat. Eticheta <BLOCKQUOTE>
este utilizat pentru citate lungi (formatare la nivel de bloc), n timp ce eticheta <Q>
este utilizat pentru citate scurte, care nu conin mai multe paragrafe [2] (inline).
De exemplu:
Descriere
<BLOCKQUOTE>
<P> &quot; lubitii sunt ingeri lasati
<P> In pauza ca sa se joace fcquot;
</BLOCKQUOTE>
<P> Emil Brumaru - Cantec naiv </P>
Efect
"lubitii sunt ingeri lasati
In pauza ca sa se joace"
Emil Brumaru - Cantec naiv

Observai c citatul este scris identat (deplasat la dreapta) fata de marginea textului,
iar ghilimelele sunt plasate explicit de autorul paginii.

Descriere
<P> Heraclit spunea ca <Q> &quot;fara speranta e imposibil sa gasesti ceva de
nesperat&quot; </Q>.</P>
Efect
Heraclit spunea ca "fara speranta e imposibil sa gasesti ceva de nesperat".

13
Eticheta <BLOCKQUOTE> admite atributul CITE, care primete ca valoare o adres
Web (URL-ul documentului surs din care provine citatul):
CITE = URL

2.1.8. Utilizarea indicilor si a exponenilor

Pentru a plasa un text ca indice (SUBscript) ntr-un document HTML, acesta se


ncadreaz ntre eticheia <SUB> si eticheta de sfarit </SUB>. Pentru exponent
(SUPerscript), se utilizeaz etichetele pereche <SUP> si </SUP>[2].
De exemplu:
Descriere
<P> H <SUB>2</SUB>O <P> E = me
<SUP>2</SUP>
Efect
H20 E=mc3

2.1.9. Inserarea legturilor n documente HTML

Principala caracteristic a hipertextelor o constituie utilizarea legturilor (link-s).


Un link este o conexiune ctre o alt resurs Web (un alt hipertext sau o imagine, o
secven video sau audio, un program etc.), resurs care poate fi accesat din
fereastra browser-ului printr-un simplu clic[1].
Limbajul HTML conine multiple elemente prin intermediul crora se poate crea
o legtur ctre resurse Web:

IMG (creeaz o legtur ctre o imagine),


LINK (specific legturi ctre resurse utile),
A (creeaz o legtur ctre o resurs Web ntr-un document HTML),
APPLET (creeaz o legtur ctre un program executabil pe calculatorul
utilizatorului). Le vom analiza pe rnd, n seciunile urmtoare.

Elementul A
Pentru a insera un link ntr-un document HTML se utilizeaz elementul A
(anchor -ancor). Textul cuprins ntre eticheta de nceput <A> si cea de sfrit </A> va
aprea evideniat n fereastra browser-ului; subliniat, colorat n funcie de valorile
atributelor LINK, VLINK, ALINK sau n funcie de modul de configurare a browser-
ului.
Atributele specifice elementului A sunt:

HREF = URL , specific adresa resursei la care se face legtura.


NAME = ir-de-caractere, asociaz un nume ancorei curente, astfel nct s
poat constitui inta unui alt link.Numele trebuie s fie unic n cadrul
documentului.
TITLE = ir-de-caractere, asociaz un nume resursei la care se face legtura.
Browser-ul va putea afia titlul resursei cnd utilizatorul deplaseaz mouse-ul
deasupra legturii.

Pot aprea mai multe tipuri de legturi, i anume :


- legtur spre o alt pagina HTML local calculatorului, la mceputul acesteia .
- legtur spre o pagin Web din Internet ( adic o pagin care nu este local).
14
- legtur spre o int din interiorul aceleai pagini.
- legtur spre o alt pagina HTML local calculatorului, ntr-un anumit loc din
interiorul acesteia.

2.1.10. Inserarea imaginilor n documente HTML

Limbajul HTML permite creatorilor de pagini Web s utilizeze, pe lng text, i


elemente multimedia, cum ar fi :imagini, secvene video, applet-uri (programe
compilate scrise n limbajul Java, care sunt lansate n execuie pe calculatorul
utilizatorului). n primele versiuni ale limbajului HTML erau permise doar imaginile
(care puteau fi inserate prin intermediul elementului IMG) i applet-urile scrise n
limbajul Java (care puteau fi inserate prin intermediul elementului APPLET). HTML
4.0 introduce elementul OBJECT, care reprezint o soluie general pentru inserarea
elementelor multimedia n documente HTML[1].

Elementul IMG
Elementul IMG este specific pentru inserarea unei imagini ntr-un document
HTML. Elementul IMG nu admite etichet de sfrit, prin urmare nu are coninut.
Specificarea imaginii ce urmeaz a fi inserat i informaiile necesare formatrii acesteia
se realizeaz prin intermediul atributelor:
SRC = URL
specific adresa fiierului care conine imaginea. Cele mai utilizate formate de fiiere
grafice sunt GIF (Graphic Interchange Format) si JPEG (Joint Photographic Expert's
Group), dar i BMP(Bit Map) .
ALT = text
specific un text alternativ, care va fi afiat de browser-ele care nu pot vizualiza imagini.
HEIGHT = dimensiune definete nlimea imaginii.
WIDTH = dimensiune definete limea imaginii
BORDER = numr-pixeli imaginea va fi ncadrat de un chenar cu grosimea
specificat n numr de pixeli.
HSPACE = dimensiune specific spaiul inserat n stnga si n dreapta imaginii.
VSPACE = dimensiune specific spaiul inserat n partea de sus i n partea de jos a
imaginii.

2.1.11. Inserarea tabelelor n documente HTML

Tabelele reprezint un instrument foarte puternic, care permite organizarea


informaiilor dintr-un document HTML, nscriindu-le n celule structurate pe linii i
coloane. Inserarea unui tabel ntr-un document HTML se realizeaz cu ajutorul
elementului TABLE, ntre eticheta de nceput <TABLE> i cea de sfrit </TABLE>
este ncadrat descrierea elementelor tabloului[1].
Elementul TABLE admite urmtoarele atribute principale :

ALIGN = LEFT | CENTER | RIGHT


specific modul de aliniere a tabelului n document (LEFT - tabelul este aliniat la
marginea din stnga (implicit); CENTER - tabelul este aliniat la egal distan de
marginile stnga - dreapta; RIGHT - tabelul este aliniat la marginea din dreapta).
WIDTH = valoare
specific limea ntregului tabel. Valoarea poate fi specificat n numr de pixeli sau
procentual (procentul se calculeaz din limea zonei de vizualizare a documentului).
HEIGHT = valoare

15
specific nlimea tabelului (n numr de pixeli).
BORDER = valoare
specific (ca numr de pixeli) grosimea liniei chenarului din jurul tabelului.
COLS = valoare
specific numrul de coloane ale tabelului.
CELLSPACING = valoare
specific spaiul dintre celule i spaiul dintre celule i marginile tabelului.
CELLPADDING = valoare
specific spaiul dintre chenarul celulei i coninutul ei. Valoarea poate fi specificat att
n numr de pixeli (in acest caz distanele dintre coninutul celulei i latura de sus, jos,
stnga, respectiv dreapta sunt egale cu valoarea specificat), cat i n procente (n acest
caz, pentru distanele fata de marginea din stnga, respectiv fat de cea din dreapta,
procentul se calculeaz din limea celulei, n timp ce pentru distanele fata de marginea
de sus, respectiv fat de cea de jos, procentul se calculeaz din nlimea celulei).
Coninutul elementului TABLE este constituit din liniile tabelului. Specificarea
unei linii se realizeaz cu ajutorul elementului TR (Table Row), ntre eticheta de
nceput <TR> i cea de sfrit </TR> fiind descrise celulele de pe linia respectiv.

2.1.12. Utilizarea cadrelor n documente HTML

Prin utilizarea cadrelor, utilizatorul are posibilitatea de a mpri fereastra


browser-ului n mai multe zone dreptunghiulare (o astfel de zon fiind denumit cadru
sau frame). Prin urmare, asemenea tabelelor, frame-urile ofer posibilitatea de a
structura n pagin informaii diverse, dar ofer i avantaje suplimentare, prin faptul c
n cadre se pot vizualiza documente HTML diferite. Cu alte cuvinte, prin utilizarea
frame-urilor, exist posibilitatea de a vizualiza simultan n fereastra browser-ului mai
multe pagini Web.
Pentru a utiliza cadre, trebuie creat un document special (denumit document
FRAMESET), o pagin principal, care s defineasc mprirea n cadre a ferestrei
browser-ului, dimensiunea, poziia i rolul fiecrui cadru[2]. Structura acestei pagini
este:

<HTML>
<HEAD>

</HEAD>
<FRAMESET>

</FRAMESET>
</HTML>

Observai c acest document nu conine elementul BODY, ci elementul


FRAMESET, care permitea definirea structurii cadrelor din document, ntre eticheta
de nceput <FRAMESET> i cea de sfrit </FRAMESET> sunt descrise cadrele din
document, prin intermediul elementului FRAME .

Atributele elementului FRAMESET sunt:

ROWS = list-dimensiuni
specific dimensiunile cadrelor orizontale, separate prin virgul. Dimensiunile pot fi
specificate absolut (n numr de pixeli) sau relativ la dimensiunea ferestrei (n

16
procente). Una din dimensiuni poate lipsi, fiind nlocuit de caracterul * , ceea ce
semnific spaiul rmas disponibil n fereastr".
COLS = list-dimensiuni
specific dimensiunile cadrelor verticale, n mod similar.
FRAMEBORDER = 1 | 0
specific dac frame-ul este sau nu separat de cadrele adiacente prin linii de contur.
Dac asociem acestui atribut valoarea 0, cadrul nu va fi separat de cadrele adiacente
prin linii. Valoarea implicit! este 1.
MARGINWIDTH = numr-de-pixeli
specific spaiul dintre coninutul cadrului si marginile stnga - dreapta. Valoarea
asociat trebuie s fie cel puin 1, valoarea implicit! depinznd de browser-nl utilizat.
MARGINHEIGHT = numr-de-pixeli
specific spaiul dintre coninutul cadrului si marginile sus - jos ale cadrului. Valoarea
asociat trebuie s fie cel puin 1, valoarea implicit depinznd de browser-ul utilizat.
Observaie : Pentru a preciza coninutul iniial al unui cadru se utilizeaz atributul
SRC.

2.1.13. Utilizarea cadrelor inline

Cadrele inline sunt asemntoare celulelor unui tabel. Ele pot fi inserate n
cadrul unui bloc, dar spre deosebire de celulele unui tabel nu conin text, imagini sau
alte informaii, ci un ntreg document HTML (asemenea cadrelor obinuite). Inserarea
unui cadru inline se realizeaz cu ajutorul elementului IFRAME. Atributele acestui
element sunt: SRC, NAME, FRAMEBORDER, LONGDESC, MARGINWIDTH,
MARGINHEIGHT, SCROLLING, cu aceeai semnificaie ca n cazul elementului
FRAME. n plus, sunt admise i atributele ALIGN (care specific modul de aliniere a
cadrului), WIDTH (care specific limea cadrului) i HEIGHT (care specific
nlimea cadrului)[2].
De exemplu, inserm un cadru inline care conine documentul initial.htm. n
acelai document exist dou link-mi care au ca int acelai cadru:

2.1.14. Utilizarea formularelor

O posibilitate de a realiza interactivitatea pentru o pagina Web este folosirea


formularelor (in engleza forms).
Un formular este un ansamblu de zone active alcatuit din butoane de apasat,
casete de selectie, campuri de editare etc. O sesiune de lucru cu o pagina Web ce contine
un formular cuprinde urmatoarele etape[2]:
- utilizatorul completeaza formularul si il expediaza unui server;
- aplicatie dedicata de pe server analizeaza formularul completat si (daca
este necesar) stocheaza datele intr-o baza de date;
- daca este cazul serverul expediaza un raspuns utilizatorului.
Un formular este definit intr-un bloc delimitat de etichetele corespondente
<form> si </form>.

Observatii:
- blocurile <form> nu pot fi imbricate;
- intr-o pagina Web pot fi create oricate formulare.

Atribute esentiale ale elementului <form> :


17
atributul action precizeaza ce se va intampla cu datele formularului o data ce
acestea ajung la destinatie. De regula, valoarea atributului action este adresa
URL a unui script aflat pe un server WWW care primeste datele formularului,
efectueaza o prelucrare a lor si expediaza catre utilizator un raspuns.
Observatie:
Valoarea atributului action poate fi, de asemenea, o adresa valida de mail, caz in
care datele formularului sunt expediate prin posta electronica pe adresa specificata. In
acest caz nu are loc o prelucrare automata a datelor din formular, citirea si
interpretatrea corecta a datelor primite fiind responsabilitatea destinatarului.

atributul method precizeaza metoda utilizata de browser pentru expedierea


datelor formularului. Sunt posibile urmatoarele valori:
1. get (valoarea implicita). In acest caz, datele din formular sunt adaugate
la adresa URL precizata de atributul action;
2. post . In acest caz, datele sunt expediate separate. Sunt premise
cantitati mari de date (chiar de ordinul MB).

Pentru elementul <input> de tipul camp de editare (type=text), alte doua


attribute pot fi:
- atributul size specifica latimea campului de editare; daca valoarea tastata intr-un
camp de editare depaseste aceasta latime, atunci se executa automat o derulare a
acestui camp.
- atributul maxlength specifica numarul maxim de caractere pe care le poate primi
un camp de editare; caracterele testate peste numarul maxim sunt ignorate.
Daca atributul type lipseste intr-un element <input>, atunci campul respectiv
este considerat prestabilit ca fiind de tip text.
Formularele cu un singur camp (de tip text) nu au nevoie de un buton de
expediere. Datele sunt expediate automat dupa completarea campului si apasarea tastei
ENTER.
Intr-un formular pot exista mai multe butoane de expediere avand atributul name configurat la
valori diferite.

Formular cu butoane de tip reset


Daca un element de tip <input> are atributul type configurat la valoarea reset,
atunci in formular se introduce un buton pe care scrie Reset [1]. La apasarea acestui
buton, toate elementele din formular primesc valorile prestabilite (definite o data cu
formularul), chiar daca aceste valori au fost modificate de utilizator. Un boton Reset
poate primi un nume cu ajutorul atributului name si o valoare printr-un atribut value.

Formular cu caseta de tip password


Daca se utilizeaza eticheta <input> avand atributul type configurat la valoarea
password , atunci in formular se introduce un element asemanator cu un camp de
editare obisnuit (introdus prin type=text). Toate atributele unui camp de editare
raman valabile. Singura deosebire consta in faptul ca acest camp de editare nu afiseaza
caracterele in clar, ci numai caractere *, care ascund de privirile altui utilizator aflat in
apropiere valoarea introdusa intr-un asemenea camp[1].
La expedierea formularului insa, valoarea tastata intr-un camp de tip password
se transmite in clar.

Formular cu butoane de tip radio

18
Butoanele radio permit alegeream, la un moment dat, a unei singure variante din
mai multe posibile[1]. Butoanele radio se introduc prin eticheta <input> cu atributul
type avand valoarea radio.

Formular cu caseta de validare (checkbox)


O caseta de validare (checkbox) permite selectarea sau deselectarea unei
optiuni[2]. Pentru inserarea unei casete de validare se foloseste eticheta <input> cu
atributul type configurat la valoarea checkbox.

Formular cu caseta de fisiere


Intr-o pereche name = value a unui formular se poate folosi intregul continut al
unui fisier pe post de valoare. Pentru aceasta se insereaza un element <input> intr-un
formular, cu atributul type avand valoarea file (fisier)[2].
Alte trei attribute sunt utile pentru un element de tip caseta de fisiere:
- atributul name permite atasarea unui nume; acest nume va aparea in perechea
name = value expediata serverului;
- atributul value primeste ca valoare adresa URL a fisierului care va fi expediat o
data cu formularul. Aceasta valoare poate fi atribuita direct atributului value,
poate fi tastata intr-un camp de editare ce apare o data cu formularul sau poate fi
selectata prin intermediul unei casete de tip FileUpload sau ChooseFile care
apare la apasarea butonului Boowse din formular.
- atributul enctype precizeaza metoda utilizata la criptarea fisierului de expediat.
Valoarea acestui atribut este multipart / form-data.

Formular cu o lista de selecie


Lista de selectie este inclusa in formular cu ajutorul etichetelor corespondente
<select> si </select>.
In mod prestabilit, un singur element din lista poate fi selectat la un moment dat.
Atributul selected (fara alte valori) permite selectarea prestabilita a unui element al
listei[2].

Formular cu o lista de selectie ce accepta selectii multiple


O lista de selectie ce permite selectii multiple se creeaza intocmai ca o lista de
selectie obisnuita. In plus, eticheta <select> are un atribut multiple (fara alte valori).
Cand formularul este expediat catre server pentru fiecare element selectat al listei care
este scris insereaza cate o pereche name = value unde name este numele listei [2].

Formular cu un camp de editare multilinie


Intr-un formular pot fi incluse si campuri de editare multilinie. Acest lucru se
face cu ajutorul etichetei <textarea>. Pentru a particulariza un camp de editare
multilinie, se folosesc urmatoarele attribute [2]:
- atributul cols, care specifica numarul de caractere afisate intr-o linie;
- atributul rows, care specifica numarul de linii afizate simultan;
- atributul name, care permite atasarea unui nume campului de editare multilinie;
- atributul wrap (de la word wrap = trecerea cuvintelor pe randul urmator), care
determina comportamentul campului de editare fata de sfarsitul de linie (trei
valori: off , hard, soft).

Blocul button :

19
Un buton pentru lansarea in executie a unei actiuni poate fi introdus intr-un
formular prin elementul <input> avand atributul type configurat la valoarea button.
Exista o a doua modalitate de a introduce intr-o pagina Web un buton de apasat,
si anume prin intermediul blocului <button> </button>.
Atributele posibile ale elementului button sunt:
- name acorda elementului un nume;
- value precizeaza textul care va fi afisat pe buton;
- type precizeaza actiunea ce se va executa la apasarea butonului daca acesta este
inclus intr-un formular. Valorile posibile pentru acest atribut sunt:
- button
- submit
- reset .

2.2 Bazele de date MySQL

MySQL este cel mai popular sistem de management pentru baze de date
relaionale deoarece este Open Source adic poate fi folosit fr s fim nevoii s pltim
vreo sum de bani. MySQL Server a fost creat pentru a lucra cu baze de date mai rapid
dect soluiile existente deja i este folosit de ani buni n medii foarte solicitante [3][6].
ntr-o baz de date relaional datele sunt stocate n mai multe tabele separate,
fiind astfel mbuntite viteza i flexibilitatea. Tabelele pot fi legate prin relaii definite
de noi, fiind astfel posibil s combinm la cerere datele din mai multe tabele.
SQL, acronimul pentru ,,Structured Query Language", este limbajul standard
pentru comunicarea cu bazele de date. Comenzile SQL sunt folosite pentru a
interaciona cu baza de date (de exemplu s adauge, s modifice sau s tearg datele).
Alte sisteme de baze de date care folosese SQL sunt Microsoft SQL Server, Access,
Oracle, Sybase, etc.
Pentru a ne putea face o baz de date trebuie ca serverul MySQL s fie pornit.
Dac ai urmat paii descrii n capitolul instalare, serverul MySQL ar trebui s ruleze
deja, el fiind repornit automat la fiecare restartare a calculatorului [3][6].
n continuare va trebui s folosim o aplicaie cu ajutorul creia s comunicam cu
serverul. Aplicaia se numete simplu mysql.exe i se gsete de obicei n directorul
c:\mysql\bin\ sau in directorul c:\apache\mysql\bin\. Vom intra n command prompt
apsnd pe Start, apoi pe Run i scriind command n cmpul destinat programului ce
urmeaz s fie rulat. Odata aflai n linie de comand, scriem:

c:\mysql\bin\mysql.exe -p -u root
iar cnd ni se cere parola apsm ENTER.

Dac serverul nu este pornit vom primi mesajul de eroare Can't connect to
MySQL server on "localhost".
Serverul de MySQL, ca orice server care se respecta, ofera posibilitatea de a avea
mai multi posesori de date pe acelai sistem, fiecare cu drepturile lui. Astfel, serverul
unui ISP de exemplu va putea fi folosit de mai muli oameni, fiecare avnd mai multe
baze de date i neputnd s vad ce au ceilali utilizatori ai aceluiai server [3][6].
Utilizatorul implicit (i cu drepturi depline, de altfel) este root, iar parola iniiala
este goal. Vom lucra cu aceste date pentru nceput.

2.2.1 Comanda SHOW

20
Odat autentificai vom putea comunica cu serverul MySQL folosind comenzi
SQL. Trimiterea unei comenzi SQL ctre serverul de baze de date se mai numete i
interogare. S facem prima noastr interogare i s aflm dac exist deja vreo baz de
date pe server[3][6]:
SHOW DATABASES;

Rezultatul primit de la server va arta ca n imaginea de mai sus.


Am ncheiat interogarea cu punct i virgul deoarece toate comenzile SQL (cu
excepia QUIT i USE) trebuie ncheiate astfel pentru a semnala serverului c am
terminal de scris propoziia i c poate trece la procesarea cererii. Exist cazuri n care o
interogare poate fi foarte lung i atunci ar trebui s o ,,rupem" n cteva bucai mai
mici, pe mai multe rnduri. MySQL ar da eroare dac ar observa ca propoziia este
neterminat aa c nu uitai s ncheiai interogrile cu punct i virgul.
S inspectm una din bazele de date de pe acest server. Pentru a face acest lucru,
spunem serverului cu ce baz de date dorim s interacionm n continuare: USE fih
Vom primi mesajul ,,Database changed" i baza de date 'fih' va rmne cea n care
ne vom face interogrile pn la deconectarea de la server sau dac decidem s folosim o
alt baz de date, cu aceeasi comand:

USE alta_baza_de_date

Setarea unei baze de date ca fiind cea curent nu ne mpiedic totui s accesm
tabele din alte baze de date n forma nume_baza_de _date.nume_tabel. Comanda USE
este pstrat pentru compatibilitate cu Sybase[6].

Tot comanda SHOW o vom folosi pentru a vedea ce tabele exist n baza de date
fih, n care ne aflm[3][6]:

SHOW TABLES;

21
comanda SHOW TABLES;.

O alt utilizare a lui SHOW este SHOW COLUMNS care afieaz informaii
despre coloanele unui tabel.

2.2.2 Comenzile CREATE i DROP

Vom creea o baz de date special pentru testare. Vom scrie n linia de comand:
CREATE DATABASE test;
Serverul ne afieaz ,,Query OK" deci baza de date a fost creat. Va trebui s mai
spunem serverului c aceasta este baza de date cu care urmeaz s interacionm n
continuare[3][6]:
USE test
Am putea s folosim interogarea SHOW TABLES i aici, ns ea nu ne-ar arat
mai mull dect stim deja: ca noua baza de date nu are inca nici un tabel, S facem, deci,
unul:
CREATE TABLE test (camp_test TEXT);

S lum cuvnt cu cuvnt propoziia: CREATE TABLE test(cmp_test TEXT)


nseamn ,,creeaz tabelul test cu un cmp numit cmp_text al crui tip este TEXT.
Pentru a afla ce este tipul de date i la ce folosete consultai oglinda ,,Tipuri de date".

S facem nc un tabel, cu trei coloane:

CREATE TABLE test2(camp1 TEXT, camp2 INT, camp3 TINYINT);

n imaginea anterioar putem vedea mai multe informaii despre fiecare cmp.
S le analizm:
- prima coloan, Field, este numele cmpului;

22
- a doua, Type, este tipul de date coninut de timp. TEXT nseamn c datele de
pe coloana respectiv vor fi texte, INT ca vor fi numere ntregi i TINYINT c n coloana
respectiv vor fi introduse doar numere ntre -128 i 127;
- n a treia dac este NULL sau nu, a patra, Key arat dac este index, n a cincea,
Default Value, este specificat valoarea implicit i ultima coloan arat ce alte
proprieti mai are cmpul.
S lum ca exemplu un magazin de cri. Fiecare carte are un autor, un titlu i o
scurt descriere. Toate sunt de tip text, deci aa vor fi i tipurile de cmpuri aferente lor:

CREATE TABLE carti(autor TEXT, titlu TEXT, descriere TEXT);

n cazul n care nu a fost semnalat nici o eroare, tabelul nostru a fost creat. S
verificm, de dragul exerciiului, acest lucru, cu comenzile SHOW TABLES i SHOW
COLUMNS.
Pentru a terge un tabel, o baz de date, un index sau o coloan dntr-un tabel
folosim comanda DROP astfel[3][6]:

DROP TABLE tabel_test;


DROP DATABASE librarie;

Dei MySQL are suport pentru diacritice i setul de caractere 8859-2, este
preferabil s nu folositi diacritice n numele bazelor de date, tabelelor sau cmpurilor.
De asemenea, nu putei folosi ca nume de tabel sau de cmp cuvintele rezervate (nume
de funcii, tipuri de caractere din MySQL precum create, drop sau column).
Ar mai trebui s tii c putei folosi nume de tabele care conin spaii dar n
practic trebuie s ncadrai numele ntre back-ticks `` (semnul back-tick l gsii pe
tasta aflat imediat sub Escape):

CREATE TABLE 'tabel al carui nume are spatii`('cmp 1', TEXT);


SHOW COLUMNS FROM 'tabel al carui nume are spatii';
SELECT 'cmp 1' FROM 'tabel al carui nume are spatii';

2.2.3 Comanda INSERT

Haidei s introducem cteva date n tabelul cri. Comanda pe care o vom folosi
este INSERT i sintaxa este[3][6]:

INSERT INTO tabel(cmpl, cmp2, cmp3) values(valoarel, valoare2,


valoare3)

n romnete aceast comand s-ar traduce ,,introdu n cmpul1 valoarea1, n


cmpul2 valoarea2 i n cmpul3 valoarea3", iar n format tabelar ar arata n felul
urmtor:
Cmpul1 cmpul2 cmpul3
valoareal valoarea2 valoarea3

INSERT INTO carti (autor, titlu, descriere) VALUES('William Shakespeare',


'Romeo si Julieta', 'Cea mai frumoasa poveste de dragoste a tuturor timpurilor');
Am pus ghilimele n jurul fiecrei valori ce urmeaz a fi introduse pentru a stabili
c acela este un text unitar, un string de introdus n cmpul respectiv. Imaginaiv cam
cum ar interpreta serverul comanda noastr dac am scrie numele autorului n forma
Shakespeare, William. Atunci textul interogrii ar fi: INSERT INTO carti(autor, titlu)
23
VALUES(Shakespeare, William, Hamlet) i serverul MySQL ne-ar returna urmatoarea
eroare: "Column count doesn't match value count at row 1" deoarece se ateapt ca
pentru dou coloane s aib de introdus tot dou valori separate prin virgul, nu trei.
Dac am fi specificat c vrem s introducem valori n toate cele trei coloane am fi primit
alt mesaj de eroare deoarece MySQL nu ar fi recunoscut textul 'Shakespeare' ca fiind
string i s-ar fi oprit din execuie.
Dac dorim, putem s omitem una din coloane ca n exemplul urmtor unde nu
adaugm nimic n cmpul descriere:

INSERT INTO carti(autor, titlu) VALUES('William Shakespeare', 'Hamlet');

Sintaxa lui INSERT poate fi simplificat dac lum n calcul toate cmpurile
tabelului deoarece le putem omite, menionnd doar valorile ce urmeaz a fi adugate ca
n exemplul urmtor:

INSERT INTO carti VALUES('Mihai Eminescu', 'Poezii', 'Cele mai frumoase


poezii ale poetului national');

Observm c nu am mai specificat coloanele n care urmeaz s introducem date,


sintaxa fiind astfel mult simplificat. Dac dorim s beneficiem de sintaxa prescurtat
pentru INSERT dar nu avem o valoare pentru un cmp, putem s nu punem nimic ntre
ghilimelele care delimiteaz valoarea respectiv, ca n exemplele urmtoare unde nu
introducem nici un text (sau un text gol, dac vrei s i spunei aa n cmpul descriere:

INSERT INTO carti VALUES('Mihai Eminescu', 'Poezii, volumul 2', ); INSERT


INTO carti VALUES('Mihai Eminescu', 'Poezii, volumul 3', }; INSERT INTO carti
VALUES('Alexandru Mitru', 'legendele Olimpului', ) ; INSERT INTO carti
VALUES('George Cosbuc', 'Fire de tort - Poezii', ) ; INSERT INTO carti VALUES('Mihai
Eminescu', 'Geniu pustiu', ) ;

2.2.4 Comanda SELECT

Vom folosi SELECT, cea mai important comanda SQL i i vom vedea cteva din
utilizri n exemplele urmtoare. Am aflat cum putem vedea ce tabele sunt ntr-o baz
de date, s aflm i ce conine un tabel. S luam primul tabel i s afim datele din el:

SELECT * FROM tabel_test;


Ne va fi returnat urmtorul mesaj:
Empty set (0.17 sec)
Empty set nseamn c tabelul nu conine date, e gol. Numrul din paranteze
reprezint secundele care i-au luat serverului ca s returneze un rezultat.
S ncercm cu cellalt tabel, n care tim sigur c am introdus date i s vedem
cum arat acestea[3][6]:

SELECT * FROM carti;

Tipurile de date care apar n coloanele MySQL ar putea parc o complicaie


inutil la prima vedere. Oare nu am putea la o adic s adaugam datele n ce form avem
nevoie? Lucrurile nu stau chiar aa. MySQL aloc spaiu pe disc n funcie de tipul de
date specificat de utilizator. Dac n tabelul salariai avem o coloan pentru numrul de
zile de concediu legal o vom seta ca fiind TINYINT deoarece aceai este valoarea
numeric n care se ncadreaz (un salariat nu va avea mai mult de 127 de zile de

24
concediu pe an). Pentru fiecare nregistrare n coloana zile_concediu MySQL va aloca 1
byte de memorie, indiferent dac un angajat are 2 zile de concediu i altul are 18. Dac
acelai cmp l setm ca INT, MySQL va aloca fiecarei nregistrri n coloana 4 bytes,
indiferent de numrul de zile de concediu introduse i astfel pentru fiecare nregistrare
(fiecare angajat) se vor pierde 3 bytes. Acesta este doar un exemplu dar putei avea la un
moment dat o baz de date cu 10 milioane de nregistrri i atunci pierderea a 3 bytes la
fiecare nregistrare se traduce n cateva zeci de MB de spaiu.
Iat i tipurile de date n bazele de date MySQL i spaiul pe care l ocup[3][6] :

Valori numerice:

Tip Bytes
TINYINT 1
SMALLINT 2
MEDIUMINT 3
INT 4
BIGINT B

Toate tipurile de mai sus au un atribut opional (nestandard), UNSIGNED. Putei


folosi acest atribut n definirea tipului de date al unei coloane atunci cnd dorii s
conin doar valori pozitive. Un cmp de tip TINYINT va putea conine numere ntre-
128 i 127 n timp ce alt cmp, TINYINT UNSIGNED va putea avea valori ntre 0 i 255.
La fel, pentru SMALLINT valorile sunt de la -32768 pn la 32767 n timp ce pentru
SMALLINT UNSIGNED ele pot fi ntre 0 i 65535.
Dac ntr-un cmp TINYINT care are valori ntre -128 i 127 vei ncerca s
introducei o valoare mai mic de -128 ea va fi convertit n cea mai mic valoare
admis, -128. Dac vei ncerca s introducei o valoare mai mare de 127 ea va fi
convertit n cea mai mare valoare admis de tipul cmpului, 127 n acest caz.

Data/timp:
Column type Format
DATETIME YYYY-MM-DD hh:mm:ss
DATE 'YYYY-MM-DD'
TIMESTAMP YYYYMMDDhhmmss
TIME 'hh:mm ss'
YEAR YYYY'

Tipul de cmp TIMESTAMP ofer posibilitatea de a data automat operaiile de


tip INSERT i UPDATE.. El este compus implicit din 14 caractere pentru formatul
'YYYYMMDDhhmmss' dar putem s specificm la crearea unui tabel c dorim s
conin mai puine caractere:

Timestamp
Column type Display format
TIMESTAMP(14) YYVMMDDHHMMSS
TIMESTAMP(12) YYMMDDHHMMSS
TIMESTAMP(10) YYMMDDHHMM
TIMESTAMP(8) YYYYMMDD
TIMESTAMP(6) YYMMDD
TIMESTAMP(4) YYMM
TIMESTAMP(2) YY

25
2.2.5 Stringuri (iruri)

Tipurile de string-uri n MySQL sunt BLOB, TEXT, CHAR, VARCHAR, ENUM i


SET. n tabelul urmtor putei vedea mrimea maxim admis pentru cele mai folosite
dintre ele precum i spaiul alocat pe disc pentru fiecare [3][6]:

Tip Mrime maxim Bytes


TINYTEXT sau TINYBLOB 2^8-1 255
TEXT or BLOB 2^16-1 (64K-1) 65535
MEDIUMTEXT or MEDIUMBLOB 2^24-1 (16M-1) 16777215
LONGBLOB 2^32-1 (4G-1) 4294967295

Cmpul de tip BLOB poate conine o cantitate variabil de informaie, similar cu


TEXT ns diferit printr-un singur aspect: cautarea ntr-un cmp BLOB este case
sensitive (se face diferena ntre majuscule i minuscule), iar ntr-un cmp TEXT nu
este.
Tipul VARCHAR este similar tipului TEXT cu deosebirea ca ntr-o coloan de tip
VARCHAR putem specifica numrul maxim de caractere admis.

Acum putem vedea foarte clar structura i coninutul tabelului. Asteriscul * din
SELECT * FROM carti este echivalenlul lui .,tot/toate", iar comanda s-ar traduce n
limba romn ,,arat-mi tot din tabelul test". Asteriscul II putem nlocui cu numele unui
cmp pentru a vedea doar coninutul acestui cmp. Aslfel:

SELECT titlu FROM carti ne va afia doar coninutul cmpului titlu:

titlu
Hamlet
Hamlet
Poezii
Poezii, volumul 2
Poezii, volumul 3
Legendele Olirapului
Fire de tort - Poezii
Geniu pustiu

Putem selecta s ne fie afiate mai multe coloane, specificate de noi, n orice
ordine (nu neaparat n ordinea n care se afl n tabel), ca n interogarea urmtoare
unde afim coloanele titlu i autor:

SELECT titlu, autor FROM carti

Titlu Autor
Hamlet William Shakespeare
Hamlet William Shakespeare
Poezii Mihai Eminescu
Poezii, volumul 2 Mihai Eminescu
Poezii, volumul 3 Mihai Eminescu
Legendele Olimpului Alexandru Mitru
Fire de tort poezii George Cosbuc
Geniu Pustiu Mihai Eminescu

26
Putem afia crile pentru care cmpul descriere este gol astfel:

SELECT * FROM carti WHERE descriere =

Autor Titlu Descriere


William Shakespeare Hamlet
M. Eminescu Poezii, volumul 2
M. Eminescu Poezii, volumul 3
Alexandru Mitru Legendele Olimpului
George Cosbuc Fire de tort poezii
M. Eminescu Geniu pustiu

Avem suficiente date pentru a afla cteva ulilizri noi i foarte interesante ale
comenzii SELECT. Putem aduga condiii de selecie i putem astfel alege s ne fie
afiate doar titlurile crilor de Mihai Eminescu, astfel:

SELECT titlu FROM carti where autor='Mihai Eminescu';

Titlu
Poezii
Poezii, volumul 2
Poezii, volumul 3
Geniu pustiu

S afim toate volumele de poezii din baza de date, indiferent de autor. Dac
executm interogarea:

SELECT * carti WHERE FROM titlu='Poezii'


ne va returna doar cartea al crui titlu este chiar ,,Poezii", nelundu-le pe celelalte
n considerare:

autor titlu descriere


Mihai Eminescu Poezii Cele mai frumoase poezii ale poetului national
Folosind condiia titlu='Poezii' nu vor fi afiate volumele 2 i 3 din colecia de
poezii de Mihai Eminescu i nici cartea intitulat ,,Fire de tort -Poezii" de Cobuc. Dac
vrem s obinem toate crile care au cuvntul ,,poezii" n titlu putem face acest lucru
nlocuind egalitatea cu operatorul LIKE i folosind wild-card-uri. Semnul cu funcie de
wildcard ntr-o interogare MySQL este % (semnul * cu care probabil suntei deja
obinuii este definit n SQL ca nsemnnd tot/toate i l-am folosit deja atunci cnd am
utilizat SELECT * FROM carti pentur a afia toate inregistrrile din tabel). Iat cum
funcioneaz LIKE i wildcardul %:

SELECT autor, titlu FROM carti WHERE titlu LIKE poezii%;

Vor fi afiate toate nregistrrile n care titlul crii ncepe cu cuvntul ,,poezii".

Autor titlu
Mihai Eminescu Poezii
Mihai Eminescu Poezii, volumul 2
Mihai Eminescu Poezii, volumul 3

27
MySQL trateaz toate valorile dintr-un cmp de tip TEXT ca fiind case-
insensitive aslfel nct nu va trebui s tinei cont de literele mari sau mici atunci cnd v
referii ntr-o interogare la valoarea unui cmp. Comanda:

SELECT * FROM carti WHERE titlu LIKE %poezii;

va afia toate nregistrrile n care titlul crii se termin cu cuvntul ,,poezii":


volumele Poezii de Mihai Eminescu i Fire de tort - Poezii de George Cobuc. Similar,

SELECT * FROM carti WHERE titlu LIKE %poezii;

va afia toate nregistrrile n care titlul crii conine cuvntul ,,poezii" oriunde
n cadrul textului.
Putem extinde comanda SELECT pentru a adauga un nou criteriu de selecie.
Dac dorim s alegem toate crile de poezii de Mihai Eminescu fr s ne fie
afiat i romanul scris de acesta sau cartea de poezii a lui George Cobuc, vom trimite
ctre baza de date o interogare cu dou criterii; ,,returneaz-mi toate nregistrrile unde
autorul este Mihai Eminescu i titlul crii conine cuvntul poezii.

SELECT * FROM carti WHERE autor='Mihai Eminescu' AND titlu LIKE %poezii
%;

Autor Titlu Descriere


Mihai Eminescu Poezii Cele mai frumoase poezii ale poetului
national
Mihai Eminescu Poezii, volumul 2
Mihai Eminescu Poezii, volumul 3

Dac vrem s alegem toate crile care nu sunt scrise de Mihai Eminescu folosim
operatorul de inegalitate (semnul !=, opus lui =):

SELECT autor, titlu FROM carti WHERE autor != 'Mihai Eminescu';


Autor Titlu
William Shakespeare Hamlet
Alexandru Mitru Legendele Olimpului
George Cosbuc Fire de tort - Poezii

Putem gsi toate titlurile crilor pentru care cmpul descriere este gol astfel:

SELECT titlu FROM carti WHERE descriere !=";


Analog, folosind operatorul NOT LIKE putem alege toate crile al cror titlu nu
ncepe cu litera P:

SELECT autor, titlu FROM carti WHERE titlu NOT LIKE 'P%';

Autor Titlu
William Shakespeare Hamlet
Alexandru Mitru Legendele Olimpului
George Cosbuc Fire de tort Poezii
Mihai Eminescu Geniu pustiu

Teme de rezolvat:
- afiai toate titlurile crilor de William Shakespeare;

28
- afiai toate titlurile care conin litera T oriunde n textul titlului;
- afiai titlurile crilor ale cror autori au numele care se termin cu litera U;
- afiai numele autorilor care nu se termin cu litera U;

Putem folosi ORDER BY pentru a ordona rezultatele unei selecii, cresctor sau
descresctor, n funcie de coloana aleas pentru ordonare[3][6].

Iat, spre exemplu, cum putem afia autorii din tabel n ordine cresctoare:

SELECT autor FROM carti ORDER BY autor ASC;

autor
Alexandru Mitru
George Cosbuc
Mihai Eminescu
Mihai Eminescu
Mihai Eminescu
Mihai Eminescu
William Shakespeare

Putem avea mai multe criterii de ordonare.ca n exemplul urmtor unde


ordonarea se face dup autor ascendent i pentru fiecare autor, crile sunt ordonate
dup titlu descendent

SELECT autor, titlu FROM carti ORDER BY autor ASC, titlu DESC;

Putem afla cte nregistrri sunt pentru un criteriu de selecie cu ajutorul lui
count(). Putem astfel afla cte nregistrri avem n total n tabel;

SELECT count(*) FROM carti;


count(*)
8
sau cte nregistrri sunt n tabel al cror cmp 'autor' este Mihai Eminescu:
SELECT count (*) FROM carti WHERE autor='Mihai Eminescu' ;
Count(*)
4

Cu ajutorul instruciunii GROUP BY putem ,,grupa" rezultatele astfel nct s nu


vedem duplicatele i s vedem doar valorile unice.

S vedem, folosind GROUP BY ce autori avem i s i ordonm crescator:

SELECT autor FROM carti GROUP BY autor ORDER BY autor ASC;

Autor
Alexandru Mitru
George Cosbuc
Mihai Eminescu
William Shakespeare

Pentru a limita numrul de rezultale returnate, folosim instruciunea LIMIT.


Dac avem 10000 de nregistrri i nu dorim s vedem dect primele 3, folosim LIMIT
n felul urmtor:

29
SELECT * FROM carti LIMIT 0,3;

Dac dorim s vedem nregistrrile de la 3 la 7:

SELECT * FROM carti LIMIT 3,4;

iar pentru nregistrrile de la 10 la 15:

SELECT * FROM carti LIMIT 10,5;

Observm ca primul numr din LIMIT este nregistrarea de la care se ncepe


afiarea i al doilea numr este numrul de nregistrri ce urmeaz a fi returnate.

DELETE

DELETE se foloseste pentru tergerea nregistrri lor dintr-un tabel (ne


reamintim c pentru tergerea tabelelor i a bazelor de date se foloete DROP). Sintaxa
lui DELETE este[3][6]:

DELETE FROM table WHERE condiii;.

Aa cum putem afia doar nregistrrile ce corespund condiiilor noastre, la fel


putem condiiona i tergerea lor n funcie de criteriile specificate.

SELECT * FROM carti WHERE autor='Mihai Eminescu';

afieaz toate crile de Mihai Eminescu, n timp ce:

DELETE FROM carti WHERE autor='Mihai Eminescu' ;


va terge din tabel toate nregistrrile pentru care cmpul autor este Mihai Emi-
nescu, lsndu-le pe celelalte neatinse.
Observm dou lucruri: asteriscul a disprut, el fiind inutil. MySQL va terge un
rnd ntreg la solicitarea dumneavoastr, el nu va putea s tearg (logic) o coloan sau
mai multe aparinnd unei nregistrri.
n al doilea rnd, cu aceast excepie sintaxa pentru tergere seamn ca dou
picturi de ap cu sintaxa pentru selecie. La fel ca n SELECT putem folosi mai multe
condiii i am putea terge toate nregistrrile unde autorul este Mihai Eminescu i titlul
crii conine cuvntul poezii".

DELETE FROM carti ' WHERE autor='Mihai Eminescu' AND titlu LIKE '$poezii
%';

DELETE FROM carti este echivalentul de tergere al lui SELECT * FROM carti,
adic va terge toate nregistrrile din tabel. Nu l vom pune n aplicare dar este bine de
tiut.

UPDATE

Atunci cnd vrem s modificm coninutul unei nregistrri nu este nevoie s o


tergem i s o adaugm n varianta nou, putem folosi UPDATE care are urmtoarea
sintax[3][6]:

30
UPDATE tabel SET coloanal='noua valoare a coloanei 1', coloana2= ' noua
valoare a coloanei 2' WHERE condiii
UPDATE modific coninutul unuia sau mai multor cmpuri n funcie de
condiiilc specificate. S modificm, de exemplu, n coloana autor toate nregistrrile
Mihai Eminescu i s le nlocuim cu M. Eminescu:

UPDATE carti SET autor='M. Eminescu' WHERE autor='Mihai Eminescu;

Executai SELECT * FROM carti pentru a observa modificarea.


Condiiile pot fi extinse la fet ca n sintaxa SELEC'T. n urmtoarea interogare
vom modifica cmpul de scriere al tuturor nregistrrilor al cror titlu conine
cuvntul ,,poezii" i cmpul descriere este gol:

UPDATE carti SET descriere='Carte de poezii' WHERE titlu like %poezii%' and
descriere='';

Astfel, toate crile fr descriere al cror titlu coninea cuvntul poezii au acum
descrierea Carte de poezii.

ALTER TABLE

ALTER TABLE ne permite s schimbm structura unui tabel existent. Putem


adauga sau terge coloane i indeci. putem redenumi coloane sau chiar tabelul n sine i
putem schimba tipul de date coninut de o coloan. S adaugm o coloan, data, n care
s stocm data adaugrii crii n baza de date. Cmpul data al tabelului carti ne va fi
util atunci cnd vom afia vizitatorilor noutile din magazin pe prima pagin. El nu
corespunde datei la care a fost editat cartea ci datei n care aceasta a ajuns pe rafturile
virtuale ale magazinului nostru. Cele mai noi 10 titluri din librrie le-am afla astfel
foarte uor folosind urmtoarea interogare [3][6]:

SELECT titlu FROM carti ORDER BY data DESC LIMIT 0,10;

S adugm noua coloan, la sfritul tabelului:

ALTER TABLE carti ADD dat TEXT;

Am scris greit numele coloanei, s o redenumim din ,,dat" n ,,data":

ALTER TABLE carti CHANGE dat data TEXT;

Ne aducem aminte c exist tipul DATE i c o dat cum e 12-12-2003 ne-ar


putea fi mai util dac s-ar afla ntr-o coloan de tip DATE dect ntr-una de tip TEXT
aa c vom modifica tipul de date al noii coloane:

ALTER TABLE carti CHANGE data data DATE;

Ca s adugm o coloan altundeva dect la sfrit, ntre descriere i dat spre


exemplu, folosim ALTER TABLE n felul urmtor:

ALTER TABLE carti ADD pret MEDIUMINT UNSIGNED AFTER descriere;

31
INDECI

Cel mai folosit tip de index este id-ul. Id-ul este un numr unic de identificare
pentru un element distinct (un rnd) al unui tabel. Avnd structura tabelului carti n
forma actual, pentru a alege ,,Romeo i Julieta" de William Shakespeare, interogarea ar
arata n felul urmtor[6]:

SELECT * FROM carti WHERE autor='William Shakespeare' AND titlu='Romeo


i Julieta';

Ce ne facem ns dac implementm interogarea n aceast form n aplicaie i


ntr-o bun zi primim spre vnzare aceeai carte dar cu un pre diferit? Ar trebui s
rescriem interogarea pentru a ne adapta situaiei i atunci cutarca unei cri ar fi fcut
cu interogarea:

SELECT * FROM carti WHERE autor='William Shakespeare' AND titlu='William


Shakespeare' AND pret =100000;

Daca am folosi un cmp care s conin un numr unic de identificare pentru


fiecare carte cutarea ar fi mult simplificat:

SELECT * FROM carti WHERE id_carte=15;

S modificm tabelul cri astfel nct fiecare carte s aiba un id unic:

SET INSERT_ID=#;
ALTER TABLE carti ADD id_carte INT UNSIGNED NOT NULL
AUTO_INCREMENT FIRST, ADD INDEX (id_carte);
SET INSERT_ID=# este folosit ca pentru fiecare carte deja adugat s fie pus un
id unic. De asemenea. pentru toate crile ce le vei aduga de acum nainte va exista un
id unic, incrementat automat.
S ne folosim de index pentru a executa operaii n tabel:

INSERT INTO carti(titlu) values ('un text oarecare');


SELECT id__carte, titlu FROM carti;

Valoarea id_carte a acestei ultime nregistrari este 9. O folosim pentru a efectua


modificri:

UPDATE carti SET titlu='un text modificat' WHERE id_carte=9; SELECT


id_carte, titlu FROM carti WHERE id_carte=9

2.2.6 Normalizarea

Normalizarea nseamn structurarea tabelelor bazei de date n aa fel nct datele


din acestea s ocupe ct mai puin spaiu pe hard disc, fiind astfel deosebit de util.
Chiar dac spaiul nu poate prea o problem, trebuie s luai n con$iderare
posibilitatea de a fi nevoit s v extindei ntr-o zi peste numrul de megabii oferit de
contractul ncheiat cu ISP-ul, din lipsa de spaiu [3][6].
MySQL stocheaz fizic datele unui tabel ntr-un fiier pe hard disc i cu ct
tabelul este mai mare, cu att mrimea acestui fiier crete, Versiunea 3.22 a MySQL are
o limit de 4GB pentru mrimea unui tabel. n versiunile superioare aceast limit este

32
extins pn la 8 milioane TB pentru tipul de tabel My-ISAM. Cu toate acestea,
sistemele de operare pot avea propriile limitri ale mrimii fiierelor. Mrimea implicit
a tabelelor MySQL este de aproximativ 408, Putei verifica mrimea maxim pentru un
tabel cu ajutorul comenzilor SHOW TABLE STATUS sau myisamchk -dv table_name.
Pe platforma Windows va trebui s folosii sistemul de fiiere NTFS dac dorii s aveti
tabele mai mari de 4GB.

2.3 Limbajul PHP

2.3.1 Introducere

Ca limbaj de programare, PHP este foarte uor de nvat dac elementele


programrii sunt explicate pe nelesul tuturor. PHP este limbajul ideal pentru
construirea de pagini web dinamice [1]. Este uor de nvat, open-source, poate fi rulat
pe mai multe platforme i se poate conecta la mai multe tipuri de baze de date. Cel mai
important aspect al limbajului este ns posibilitatea de a fi imbricat cu cod HTML.
Putem astfel crea pagini HTML statice i din loc n loc, acolo unde este nevoie, s
introducem dinamism cu ajutorul PHP. S lum prima pagin a site-ului www.chip.ro
de exemplu. Mare parte din struclura sa este compus din cod HTML static (meniurile,
tabelele, aranjamentul n pagin). Din loc n loc codul HTML este intercalat cu cod PHP
care extrage din baza de date cele mai noi tiri. n momentul n care apelai pagina,
acest cod este parsat (analizat linie cu linie i executat) pe server i este afiat o pagina
HTML fr s stii c pentru crearea ei s-a fcut o conexiune la baza de date, s-au extras
informaiile de acolo i au fost ordonate pentru afiare.
Istoric.
Limbajul PHP s-a ,,nscut" n 1994 din nevoia lui Rasmus Lerdorf de a afla cte
persoane i vizualizeaz CV-ul online. El a denumit setul de scripturi create PHP,
acronimul pentru Personal Home Page. Pe parcursul urmtorilor trei ani limbajul a
evoluat dar adevaratul succes a nceput s l cunoasc de cnd Zeev Suraski i Andi
Gutmans au rescris motorul PHP de la cap la coad, motor care poart din versiunea 4 a
PHP numele Zend, o combinaie de litere din prenumele creatorilor si: Zeev i Andi.
Fiind open-source, PHP beneficiaz de suport activ din partea comunitii online,
acesta fiind i motivul creterii explozive a numrului site-urilor bazate pe PHP. ntre
2000 i 2002 numrul lor a crescut cu peste 13130% n timp ce numrul site-urilor
bazate pe tehnologia ASP doar cu 278%, Java Server Pages cu 1594% i ColdFusion cu
429%.
Pe lng manipularea coninutului paginilor de web, PHP poate trimite head-ere
HTTP pentru autentificare, seta cookie-uri sau redireciona utilizatorii. Mai mult, cu
ajutorul bibliotecilor externe de funcii poate parsa fiiere XML, crea i manipula
imagini, animaii Shockwave Flash, PDF-uri sau se poate conecta la un server de mail
iar acestea sunt doar cteva din funciile pe care le poate ndeplini [4][5].

2.3.2 Elemente de baz ale limbajului PHP

33
Pentru a testa exemplele de fiiere PHP, putei folosi orice editor de text. Notepad
este bun pentru nceput dar putei alege s folositi unul din editoarele PHP existente pe
piat. Salvai fiierele cu extensia .php, n document root (c:\Program Files\Apache
Group\Apache\htdocs\) i le vei accesa n browser la adresa http:/
/localhost/numefiier.php.
Programarea de orice fel, nu doar PHP, are dou elemenle de baz: datele i
instruciunile. Pentru a lucra cu datele trebuie s nelegem ce sunt variabilele i tipurile
iar pentru a lucra cu instruciuni trebuie s aflm ce sunt structurile de control i
funciile[4][5].

Variabile
O variabil este o zon de memorie cruia i se da un nume pentru a putea fi
recunoscut ulterior i pentru a ne putea referi mai trziu la ea[4][5].
Iat un exemplu:

<html>
<head>
<title> Exemplu</title>
</head>
<body>

<?php
echo Acesta este un script PHP;
?>
</body>
</html>

Sa disecm codul:
- toate instruciunile PHP se termin cu punct i virgul. Omiterea semnului
,,punct i virgul" este cea mai frecvent greeal pe care o fac programatorii nceptori.
- codul PHP ncepe ntotdeauna cu <? i se termin cu ?>. El poate fi imbricat cu
cod HTML dup cum putei vedea n exemplul alturat. Putei chiar crea pagini HTML
fr pic de cod PHP n ele i s le dai extensia php. Atta vreme ct parser-ul PHP nu
,,vede" tagurile <?...?>, el va trimite pagina HTML neschimbat ctre server.
- putem pune diacritice n cadrul unui string ns pentru ca browserul s le
afieze corect va trebui s specificm n <head> setul de caractcre folosit, la fel ca ntr-
un document HTML.
- valoarea unei variabile poate fi schimbat dup necesiti (aa cum am schimbat
valoarea lui $x) sau ea va fi schimbat automat n funcie de celelalte variabile de care
depinde (aa cum valoarea lui $rezultat s-a schimbat n funcie de valoarea lui $x).
- pentru a afia rezultatul folosim print, altfel valorile variabilelor ar fi fost
schimbate dar nu ar fi fost afiate pe ecran. Pentru mai multe detali privind folosirea lui
print v recomand s consultai oglinda alaturat.
- linia de text care ncepe cu // nu este afiat, la fel ca textul demarcat de /*... */
i nu apar nici mcar dac dm View Source n browser pentru fiierul algebra.php
accesat. Acestea sunt comentarii care nu sunt procesate de ctre server ca fiind cod
executabil i nici nu sunt trimise mai departe ctre browser. n aplicaiile mai mari de
cteva linii este util s comentm codul pentru a ne orienta mai bine sau a explica
aciunile ntreprinse. Diferena ntre cele dou notaii este c // este folosit pentru a
comenta o singur linie de tex n timp ce /*...*/ poate fi folosit pentru a delimita un
comentariu ce se extinde pe mai multe linii. Marcatorii de comentariu se pot folosi i

34
atunci cnd dorim ca o bucat de cod s nu ruleze. Putei s testai acest lucru
comentnd una din liniile care conin instruciunea print i ruland din nou pagina.
Numele variabilelor trebuie s conin doar litere (a-z, A-Z i caracterele ASCII de la
127 la 255), cifre i liniue de subliniere (underscores) i pot ncepe doar cu litere sau
liniue de subliniere.

2.3.3 Folosirea funciei print

Afiarea datelor
Cu ajutorul lui print putem afia un string, o variabil, un string ce conine
variabile sau rezultatul unei funcii. Textul ce urmeaz a fi afiat trebuie inclus ntre
ghilimele simple sau duble, rezultatul fiind uor diferit. Folosind ghilimelele duble orice
variabil din cadrul stringului este parsat. Putem afia variabilele i dac folosim
ghilimele simple, "rupnd" stringul i interclasndu-l cu variabile, n forma urmtoare.
folosind operatorul "." de concatenare a stringurilor (irurilor) [4][5]:

Print rezultatul inmultirii lui $x cu 1 este $rezultat.'<br>";

Pentru a afia caracterele speciale folosite de PHP (ghilimelele duble ",


ghilimelele simple '.backslash-ul \, semnul $) trebuie s le precedei cu semnul \ astfel:

print "Semnul dolar \$, back-slash \\";

Ghilimelele trebuie precedate de semnul \ doar dac sunt de acelai tip cu cele
care ncadreaz string-ul. n plus, ntr-un string putei folosi celelalte ghilimele normal.
Print "Ghilimelele duble \ ntr-un string ncadrat tot de ghilimele duble trebuie
precedate cu semnul \\. Ghilimelele simple ca acestea' nu au nevoie s fie precedate
deoarece se afl ntr-un string ncadrat de ghilimele duble"; Alternativ:
Print 'Ghilimelele simple trebuie \'precedate\ ntr-un string ncadrat de
ghilimele simple n timp ce "ghilimelele duble" nu,
Dac dorii s afiati doar valoarea unei variabile, putei s nu o ncadrai ntre
ghilimele.

<?
$o_variabila = 1;
print $o_variabila;
$alta_variabila = "Un text oarecave";
print $alta_variabila;
?>

Observm c dac rulm acest cod, rezultatul afiat n browser va fi Un text


oarecare", dei instruciunile de afiare se afl pe dou linii diferite. Aceasta se ntmpl
deoarece rezultatul este trimis ctre browser ca HTML. Dac vrem s ne fie afiate una
sub alta va trebui s intercalm cod HTML ntre cele doua instruciuni. Putem face acest
lucru n dou moduri: ori prin ntreruperea codului PHP, aa:

<?
$o_variabila = 1;
print $o_variabila;
?>
<br>
<?
35
$alta_variabila = "Un text oarecare";
print $alta_variabila;
?>
ori prin scrierea lui &lt;br&gt; direct n cod aa:
<?
$o_variabila = 1;
print $o_variabila;
print "<br>";
$alta_variabila = "Un text oarecare"
print $alta_variabila;
?>

2.3.4 Tipuri de variabile

Variabilele pot fi de mai multe tipuri, nu doar numere cum am vzut pn acum.
PHP are opt tipuri de variabile dintre care patru sunt mai importante [4][5].

Integer
Variabilele de tip integer sunt numere ntregi: 3, 783, -56, 0, -1 sunt valori
integer.
String
Un string este o succesiune de caractere (ir). Atunci cnd sunt fobsite n codul
PHP stringurile trebuie ncadrate ntre ghilimele i toate caracterele speciale din ele
precedate cu semnul \ (detalii i explicaii gsii n oglinda funcia print). lat i cteva
exemple de stringuri:
$variabila = "un text oarecare";
$variabila = "10 texte oarecare",
$variabila = "10";

Boolean
Tipul boolean definete o valoare de adevr, TRUE (adevrat) sau FALSE (fals).
Spre exemplu, vom scrie mai trziu o funcie pentru seciunea de administrare a site-
ului cu ajutorul cruia vom verifica dac utilizatorul este logat ca administrator. Dup ce
va face toate verificrile necesare, funcia noastr v returna o valoare de adevar: TRUE
dac este logat sau FALSE dac nu este i astfel vom ti dac s i acordm sau nu acces
n seciunea de administrare.
Array
Putei s considerai un array ca fiind o colecie de obiecte (matrice). Ca i
exemplu:

<?
$filme = array("Casablanca", "Blairwitch Project", "Matrix","Rambo");
/* Nu putei afia direct valorile unui array, putei verifica acest lucru scriind
print $filme; i rulnd scriptul n browser. Putem ns apela valorile lui, folosind indexul
numeric, care, dac nu este definit, Incepe de la 0. S cerem filmul "Casablanca": */
print $filme[0];
/*Pentru a cere "Matrix" scriem:*/
print $filme[2];
/* i pentru Rambo */
print $filme[3];
?>

36
Indexarea unui array poate fi definit de ctre programator, aa cum i patronul
unui magazin de casete video i poate numerota casetele dup cum i place.
Arrayurile pot fi indexate i asociativ, adic putem folosi stringuri n loc de
integer pentru a ne referi la valorile unui array:

<?
$filme = array ("dragoste=> "Casablanca", "groaza"=>"Blairwi^ch Project",
"SF"=>"Matrix", "actiune"=>"Rambo") ;
/* S afim "Blairwitch Project"*/
print $filme["groaza"] ;
?>

Pentru avansai: n PHP nu este nevoie s definim nti variabila sau s-i
declarm tipul. i el va fi folosit ca integer sau string n funcie de contextul n care este
folosit. Dac dorii s forai evaluarea unei variabile ca un anumit tip putei folosi
conversia de tip, astfel: i = (int) i sau i = (bool) i.

2.3.5 Operatori

Cel mai des ntalnit operator esle cel de atribuire, definit prin semnul =. Am
observat din exemplele de pn acum c dac scriem $x = 1 nu nseamn c $x este egal
cu 1 ci c i s-a acordat valoarea 1. Dei la prima vedere egalitatea i acordarea valorii pot
prea a fi acelai lucru, ele nu sunt! S considerm urmtoarele variabile [4][5]:

$x = 1;
$y = 7;

Este $x egal cu $y? Nu este. Valoarea lui $x este 1 n timp ce valoarea lui $y este
7. Folosind operatorul = de atribuire i putem acorda lui $x valoarea lui Sy:

$x = 1;
$y = 7;
$x = $y;

Abia acum $x este 7 i este egal cu $y care are i el valoarea 7. Nu v lsai nelai
de asemnarea cu semnul = din matematic nici mcar atunci cnd facei operaii
complexe. Dac scriem $rezultat = $x + $y nu nseamn c $rezultat este egal cu suma
celor dou, ci c i-am atribuit (acordat) valoarea sumei celor dou.
Operatorul de egalitate este == i se foloseste cel mai des n propoziii
condiionale, pentru a testa egalitatea. Opusul su, !=, este operatorul de inegalilate i se
folosete n acelai scop.
Operatorul de egalitate se folosete pentru a compara egalitatea a dou valori.
Ali operatori folosii pentru compararea valorilor variabilelor sunt:
> mai mare
>= mai mare sau egal
< mai mic
<= mai mic sau egal
Operatorii logici v vor veni la ndemn n execuia scriptului atunci cnd avei
nevoie s lucrai cu valori de adevr. Vom face un exerciiu de imaginaie pentru a
explica funcia i utilitatea operatorilor logici. S presupunem c la intrarea n seciunea
de administrare avem un formular care cere numele i parola de acces n seciune.

37
Scriptul PHP ar putea verifica aceste informaii pentru a autoriza accesul n seciune
folosind operatorii logici astfel:
- operatorul ! (NOT)
if ( !parola_e_buna) ... parola nu este bun, accesul este interzis
if(!parola_nu_e_bun) ... parola e bun, accesul este permis
Operatorul ! returneaz TRUE dac valoarea iniial de adevr e FALSE i FALSE
dac valoarea iniial este TRUE.
- operatorul || (OR)
if (numele_este_valid | | parola este bun) ... verific dac numele sau parola
sunt valide i dac oricare din ele este, returnaz valoarea de adevar TRUE. n acest
exemplu de pseudocod dac numele ar fi valid dar parola nu, i-am acorda utilizatorului
acces mai departe ceea ce nu e de dorit. Trebuie s fim siguri c i numele i parola sunt
valide.
Operatorul || returneaz TRUE dac oricare din valorile verificate e TRUE.
Returneaz FALSE doar dac amndou sunt FALSE.
- operatorul && (AND)
if (numele_este_valid && parola este bun) ... dac att numele ct i parola
sunt valide putem acorda utilizatorului acces n seciunea de administrare.
Operatorul && returneaz TRUE doar dac ambele valori verificate sunt TRUE. El
returneaz FALSE dac oricare din ele este FALSE (sau dac amndou sunt FALSE).

2.3.6 Structuri de control

Structurile de control sunt instruciunile care aduc flexibilitatea n programare i


uureaz munca programatorului.
Am vzut cum putem defini o variabil $x i cum putem obine ca rezultat o alt
variabil $total = $x+1 . Putem, cu ajutorul structurilor de control s manipulm
variabilele i rezultatele cu minim de cod. Vom vedea cum, cu ajutorul lui while i for
putem folosi aceeai bucat de cod pentru mai multe variabile care s trebuiasc s
rescriem codul pentru fiecare valoare a variabilei[4][5].

While
Structura de control while este folosit pentru a rula acelai cod pentru mai multe
valori ale unei variabile oarecare $x, fr s trebuiasc s rescriem codul pentru $x = 1 ,
$x = 2 i aa mai departe pentru fiecare valoare a variabilei.
S presupunem c ar trebui ca pentru toate numerele de la 0 la 99 ar trebui s
calculm variabila $rezultat i s afim textul ,,Rezultatul nmulirii lui $x cu 5 este
$rezultat". Dac ar fi s scriem codul de nmulire i afiare pentru fiecare valoare a lui
$x de la 0 la 99 ne-ar apuca dimineaa. Pentru aceasta vom folosi while, cel mai simplu
tip de loop i vom scrie o singur bucat de cod care va prelua automat toate valorile lui
$x de la 0 la 99 i pentru fiecare va nmuli cu 5 i va afia rezultatul automat.

<?
$x = 0;
while ($x < 100)
{
$rezultat = $x*5;
print " Rezultatul nmulirii lui $x cu 5 este $rezultat<br>";
$X++;
}
print "sfrit! ";
38
?>

For
for este echivalentul lui while i funcioneaz n mare msur la fel, cu cteva
mici diferene. S rescriem cu ajutorul lui for codul din fiierul incrementare.php pentru
a obine aceleai rezultate:

<?
for ($x = 0; $x < 100; $x++)
{
$rezultat = $x * 5;
print " Rezultatul nmulirii lui $X cu 5 este $rezultat <br>";
$x++;
}
print "sfrit!
?>

Structura for este preferat de programatori deoarece ntre cele dou paranteze
ce o preced sunt coninute toate instruciunile i condiiile necesare rulrii loop-ului.

If
Dac dorim s rulm o bucat de cod doar cnd este ndeplinit o condiie
anume, folosim if. Iat cum, n urmtorul cod afim un text doar dac numrul de
caractere dintr-un string este mai mare decit 5.
<?
$text = "Ana are mere";
$nr_caractere = strlen($text) ;
if ($nr_caractere > 5)
{
print "Textul \"$text\" are mai mult de 5 caractere";
}
?>

Am folosit n acest exemplu funcia strlen care calculeaz numrul de caractere


ntr-un string. Pentru $text = "Ana are mere", valoarea variabilei $nr_caractere =
strlen($text) va fi 12 (spaiile conteaz). Pentru $text = "mere", $nr_caractere va fi 4.

If... else
Se folosete atunci cnd dorim s afim un text, dac o condiie este ndeplinit
i alt text dac aceeai condiie nu este ndeplinit.

<?
$text = "mere";
$nr_caractere = strlen ($text) ;
if ($nr_caractere > 5)
{
print "Textul are mai mult de 5 caractere";
}
else
{
print "Textul are mai puin de 5 caractere";
}
?>

39
Pentru stringul ,,mere" rezultatul afiat pe ecran va fi ,,Textul are mai puin de 5
caractere" i pentru stringul ,,Ana are mere" rezultatul va fi ,,Textul are mai mult de 5
caractere".

Switch
Switch este alternativa pentru blocurile condiionale if ... else if ... else. Este
preferabil n cazul n care codul dintre acolade este mai mare i ne-am putea pierde n
propoziii condiionale i paranteze.

<?
$text = "Ana are mere";
$nr_caractere = strlen($text);
switch ($nr_catactere)
{
case 4:
print Textul are 4 caractere";
break;
case 5:
print "Textul are 5 caractere",
break;
case 12 :
print "Textul are 12 caractere";
break ;
default;
print "Textul nu are nici 4 nici 5 nici 12 caractere";
break;
}
?>

Cazul special default de la sfrit este folosit pentru situaia n care dorim s
executm cod i dac nici una din condiiile anterioare nu este ndeplinit (fiind astfel
similar lui else din structura if... else if... else). El poate fi omis i astfel s executm cod
doar dac una din condiii este ndeplinit. Instruciunea break; trebuie folosit la
ncheierea fiecrui caz deoarece altfel codul din urmtorul caz va fi executat.

2.3.7 Funcii

Dei programarea PHP nu este matematic, modul n care trateaz funciile este
similar. Spre exemplu, la algebr, funcia f(x)=0+1 executa o operaie cu x i ddea un
rezultat n funcie de valoarea lui x. Acelai lucru l face i o funcie PHP [4][5].

<?
// funciile trebuie definite nainte de a le apela
function recalculare ($x)
{
$total = $x+ 1;
print $total;
}

40
$x = 1;
recalculare ($x);
// va afia pe ecran 2
?>

Funciile pot accepta mai muli parametri:

<?
function inmultire ($x, $y)
{
$rezultat = $x * $y;
}
$x = 5;
$y = 6;
print inmultire ($x, $y) ;
?>

Putem de asemenea s dm parametrii direct, separai prin virgul


print inmultire (76, 59);
sau aa:
print inmultire ($x = 76, $y = 59);
Putem da unei variabile valoarea rezultatului unei funcii dac acesta este o
variabil:
$variabila = inmultire ($x = 16, $y = 30) ;
print $variabila;
n pasarea unei variabile ctre o funcie nu conteaz numele variabilei ci doar
valoarea acesteia, valoare ce urmeaz a fi prelucrat.
<?
function adunare ($x)
{
$rezultat = $x + 1;
}
$a = 5;
print adunare($a);
$b = 10;
print adunare ($b) ;
?>

n acest exemplu vedem c doar valoarea variabilei este cea care conteaz, funcia
prelund aceast valoare.

Sau, folosind operatorul ! NOT:

<?
if (!e_dimineata()) print "E prea trziu pentru cafea.";
else print "Poi s faci cafeaua.;
?>

Aceast funcie ilustreaz foarte bine folosirea operatorilor logici. Dac ora este
mai mare sau egal cu 5 i mai mic sau egal cu 9, ne putem face cafeaua. Dac e 4am

41
nu vom bea cafea dei $ora <=9 i la fel dac e ora 22 dei $ora >=5. Ambele condiii
trebuie s fie adevrate pentru ca e_dimineata() s fie TRUE.

Funcii predefinite
Toate funciile exemplificate pn acum au fost definite de noi. Exist ns i
funcii predefinite, integrate n PHP, pentru o mulime de aciuni. Un exemplu ar fi
funcia count() pe care am folosit-o s numram cte elemente sunt ntr-un array.

Capitolul 3. Realizarea site-ului interactiv de informare


turistic

3.1. Scopul aplicaiei

Scopul acestei aplicaii este realizarea unui site interactiv cu dou interfee, o
interfa public prin intermediul cruia cei interesai pot gsi informaii despre
monumentele istorice dintr-o anumit zon i o interfa rezervat unui grup de
utilizatori autorizai care pot edita informaiile existente sau pot aduga rapid informaii
noi direct prin intermediul site-ului.
Site-ul permite vizualizarea informaiilor organizate pe subiecte, fiecare subiect
avnd mai multe pagini i de asemenea, permite unor utilizatori autorizai, editarea
subiectelor i paginilor existente sau adugarea de subiecte i pagini noi:
- Vizitatorii au acces la vizualizarea subiectelor i paginilor existente, fie
selectnd subiectele i paginile din meniu, fie selectnd o locaie de pe harta
interactiv.
- Utilizatorii autorizai au acces la toate facilitile anterioare dar pot de
asemenea s aduge subiecte sau pagini noi i s editeze subiectele sau paginile
deja existente. De asemenea pot selecta ca un anumit subiect sau o anumit
pagin s fie vizibil doar pentru utilizatorii autorizai i invizibil pentru
vizitatorii obinuii

3.2. Modul de realizare

Pentru realizarea acestui site am folosit Apache, MySQL i PHP deoarece toate
aceste aplicaii software sunt sub licen freeware ceea ce nu implic eforturi financiare
legate de achiziionarea lor, un aspect destul de important.
Apache este un server http care poate funciona pe un calculator folosind un
sistem de operare de tip Linux, cum ar fi Fedora sau Ubuntu, care sunt de asemenea sub
licen freeware, ct i n cazul utilizrii unei versiuni a sistemului de operare Windows.
MySQL este un server pentru baze de date care funcioneaz de asemenea att n
cazul folosirii unui sistem de operare de tip Linux ct i n cazul utilizrii unei versiuni a
sistemului de operere Windows.
PHP este un limbaj de scripting care poate fi folosit att pentru realizarea unor
script-uri client-side i mai ales pentru realizarea unur script-uri server-side, aspect care
mbuntete att performaele ct i securitatea aplicaiei.
42
3.2.1 Implementarea bazei de date MySQL

Baza de date este folosit n cadrul aplicaiei pentru a stoca informaii referitoare
la subiectele existente pe site, paginile existente aferente fiecrui subiect i coninutul
acestora, precum i la utilizatorii autorizai care pot opera modificri pe site.
Baza de date folosit de site conine 3 tabele dup cum se poate vedea n
imaginea urmtoare[6].

Baza de date a site-ului

n continuare vom descrie fiecare tabel i funcia pe care o ndeplinete. ncepem


cu tabelul subiecte, de tip InnoDB [6], care conine un ID unic, numele subiectului care
va fi afiat n meniu, poziia pe care acest subiect o va ocupa n meniu i rangul de
vizibilitate a acestuia, public sau doar pentru utilizatorii autorizai.

Tabelul subiecte

Cmpurile tabelului subiectes sunt:


id de tip int (numr ntreg), fr semn, cu lungimea de 11 caractere i
proprietatea AUTO_INCREMENT, ceea ce duce la incrementarea sa

43
automat de fiecare dat cnd se introduce o nou inregistrare in tabel.
Acest cmp conine numrul de identificare al subiectului.
nume_meniu de tip varchar (ir de caractere) i lungimea de 30 de
caractere, interclasare UTF-8. De asemenea nu accepta valoarea NULL,
ceea ce nseamn c acest cmp trebuie s conin obligatoriu o valoare.
pozitie de tip int (numr ntreg) i lungimea de 3 de caractere. n acest
cmp se specific poziia de ordine pe care subiectul o ocup n meniu.
vizibil de tip tinyint (ntreg de valoare mic) i lungimea de 1 caracter.
Acest cmp va conine valoarea 1 sau 0 i va specifica dac subiectul va
fi vizibil sau nu pentru vizitatorii obinuii.
Acest tabel are ca i cheie primar cmpul id.
Urmtorul tabel este pagini, de tip InnoDB, care conine datele de identificare
ale paginilor corespunztoare subiectelor.

Tabelul pagini

Cmpurile tabelului pagini sunt:


id de tip int (numr ntreg), fr semn, cu lungimea de 11 caractere i
proprietatea AUTO_INCREMENT, ceea ce duce la incrementarea sa
automat de fiecare dat cnd se introduce o nou inregistrare in tabel.
Acest cmp conine numrul de identificare al paginii.
id_subiect de tip int (numr ntreg) i lungimea de 11 de caractere.
nume_meniu de tip varchar (ir de caractere) i lungimea de 30 de
caractere, interclasare UTF-8.
pozitie de tip int (numr ntreg) i lungimea de 3 caractere.
vizibil de tip tinyint (ntreg de valoare mic) i lungimea de 1 caracter.
Acest cmp va conine valoarea 1 sau 0 i va specifica dac pagina va fi
vizibil sau nu pentru vizitatorii obinuii.
continut de tip text i interclasare UTF-8. Acest cmp va conine textul
propriuzis al paginii care poate fi i cod HTML.

Acest tabel are ca i cheie primar cmpul id i este n relaie cu tabelul


subiecte prin intermediul cmpului id_subiect.

44
Urmtorul tabel este utilizatori, de tip InnoDB, care conine datele despre
utilizatorii autorizai s fac modificri pe site.

Tabelul utilizatori

Cmpurile tabelului utilizatori sunt:


id de tip int (numr ntreg), fr semn, cu lungimea de 11 caractere i
proprietatea AUTO_INCREMENT, ceea ce duce la incrementarea sa
automat de fiecare dat cnd se introduce o nou inregistrare in tabel.
Nume_user de tip varchar (ir de caractere) i lungimea de 50 de
caractere, interclasare UTF-8.
Parola_criptat de tip varchar (ir de caractere) i lungimea de 40 de
caractere, interclasare UTF-8.

Acest tabel are ca i cheie primar cmpul id

3.2.2 Realizarea site-ului propriuzis cu ajutorul limbajului PHP

Pentru realizarea acestui site am folosit un design minimalist. Accentul punndu-


se n principal pe funcionallitate i pe simplitatea navigrii, meniul fiind foarte simplu
i intuitiv.
Limbajul PHP a evoluat foarte mult n ultima perioad, iar acest site folosete
cteva dintre caracteristicile avansate ale acestuia. Una dintre aceste caracteristici este
creearea de funcii definite de programator, pe lng cele mai mult de 700 de funcii
predefinite ale limbajului PHP.
Vom parcurge pe rnd scripturile site-ului n funcie de modul cum
interacioneaz unele cu altele, acordnd o atenie suplimentar script-urilor care conin
funcii.

45
Site-ul are dou seciuni, seciunea public i seciunea rezervat celor care
formeaz staff-ul asociaiei sau firmei care administreaz site-ul.
Seciunea public poate fi vizualizat de orice vizitator, fr a fi necesar s se
autentifice cu nume de utilizator i parol. n aceast seciune se vor afia toate
subiectele i paginile aferente, care au vizibilitate public.
Seciunea rezervat staff-ului poate fi accesat doar dup autentificarea cu nume
de utilizatror i parol i permite att vizualizarea tuturor subiectelor i paginilor
aferente lor, fie ele cu vizibilitate public sau cu vizibilitate restrns, ct i urmtoarele
aciuni:
Crearea de utilizatori autorizai
Editarea subiectelor i paginilor existente
Crearea de subiecte noi
Crearea de pagini noi, att pentru subiectele existente ct i pentru
subiectele nou create.

Pentru nceput ne vom referi la script-urile apelate de mai multe pagini, acestea
fiind grupate n directorul includes, apoi la seciunea public a site-ului, urmnd s
detaliem mai apoi funcionalitatea seciunii rezervate staff-ului.

Pagina header.php

Majoritatea paginilor site-ului include pagina header.html, pagin care conine


informaiile de formatare a paginii.

nceputul script-ului:

Aceast seciune a scriptului conine informaii despre setul de caractere folosite


(n cazul nostru UTF-8) i cere browser-ului s nu foloseasc o versiune a paginii
salvat n memoria cache ci s rencarce de fiecare dat pagina de pe server.

<?php
header('Content-Type: text/html;charset=UTF-8');
header('Pragma: no-cache');
header('Cache-Control: no-cache,must-revalidate');
?>

Aceast seciune a scriptului conine informaii despre tipul documentului i a


limbajului folosit (n cazul nostru XHTML 1.0 Transitional n limba romn).

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//RO"


"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

Aceast seciune a scriptului deschide tag-ul <html> ofer informaii despre


autorul documentului, declar titlul paginii, satbilete ce fiier .css se folosete pentru
formatare i continu cu informaii despre structura paginii.

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<meta name="Author" content="Silviu Gtlan">
<title>Istorie Hunedorean</title>
<link href="css/public.css" media="all" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="header">

46
<h1>Repere de Istorie Hunedorean</h1>
</div>
<div id="principal">

Sfritul scriptului.

Pagina footer.php

Aceast pagin este foarte simpl i servete doar la nchiderea tag-urilor HTML
ale paginilor i la nchiderea conexiunii cu baza de date. Este apelat de majoritatea
paginilor site-ului.

nceputul script-ului:

</div>
<div id="footer">Copyright 2011, Istorie Hunedorean</div>

</body>
</html>
<?php
//5.nchidem conexiunea cu baza de date
if(isset($connection)){
mysql_close($connection);
}
?>

Sfritul scriptului.

Pagina session.php

De aemenea o pagin simpl care servete la generarea sesiunii folosite pentru


autorizarea n seciunea rezervat staff-ului.

nceputul script-ului:

<?php
session_start();

function logged_in() {
return isset($_SESSION['user_id']);
}

function confirm_logged_in() {
if (!logged_in()) {
redirecteaza_la("login.php");
}
}
?>
Sfritul scriptului.

Pagina constants.php

47
Aceast pagin niializeaz constantele necesare pentru realizarea conexiunii la
baza de date, astfel acestea trebuie modificate ntr-un singur loc n caz de necesitate, pe
parcursul scripturilor facndu-se referin doar la variabile i nu la valoarea lor.

nceputul scriptului:

<?php
//Constantele bazei de date
define("DB_SERVER","localhost");
define("DB_USER","root");
define("DB_PASS","parola");
define("DB_NAME","hdhistory");
?>

Sfritul scriptului

Pagina db_connection.php

Aceast pagin realizeaz conexiunea la baza de date, de acum ncolo celelate


scripturi vor folosi de fiecare dat variabila $connection.

nceputul scriptului:

<?php
require("constants.php");
//1.Cream o conexiune la baza de date
$connection = mysql_connect(DB_SERVER,DB_USER,DB_PASS);
if(!$connection){
die("Conexiunea cu baza de date a euat: ".mysql_error());
}

//2.Selectam baza de date cu care vom lucra


$db_select = mysql_select_db(DB_NAME,$connection);
if(!$db_select){
die("Selectarea bazei de date a euat : ".mysql_error());
}
?>

Sfritul scriptului

Pagina functions.php

Aceast pagin este una dintre cele mai importatnte pagini ale site-ului i conine
toate funciile de baz care vor fi apelate de diverse scripturi n timpul funcionrii.
Astfel organizm i simplificm foarte mult paginile site-ului.

nceputul scriptului:

<?
//Aici se stocheaz toate funciile de baz

Aceast funcie structureaz datele pentru a nu afecta sintaxa PHP si MySQL din
cauza caracterelor ',",/ si NULL. Acest lucru se face n funcie de versiunea de PHP
existent pe server i de faptul c funcia magic_quotes este activ sau nu.

function structurare_date_mysql($valoare){

48
//Functia structureaza datele pentru a nu afecta sintaxa PHP si MySQL din
cauza caracterelor ',",/ si NULL.
//verificam daca este activata functia magic_quotes.
$magic_quotes_activ = get_magic_quotes_gpc();
//verificam daca versiunea de PHP este mai noua de v4.3.0 si are functia
mysql_real_escape_string.
$php_nou = function_exists("mysql_real_escape_string");
if($php_nou){
//Daca versiunea de PHP este destul de noua si este activata functia
magic_quotes, anulam efectul functiei magic_quotes pentru a folosi
mysql_real_escape_string.
if($magic_quotes_activ){$valoare = stripslashes($valoare);}
$valoare = mysql_real_escape_string($valoare);
} else {
//Daca versiunea de PHP este mai veche de v4.3.0 (deci nu exista functia
mysql_real_escape_string) si nu este activata functia magic_quotes, vom
adauga manual ghilimelele necesare.
if(!$magic_quotes_activ){$valoare = addslashes($valoare);}
//Daca functia magic_quotes este activata, nu trebuie sa mai facem nimic
}
return $valoare;
}

Aceast funcie redirecteaz browserul spre o anumit pagin.

function redirecteaza_la($locatie = NULL){


if($locatie!=NULL){
header("Location: {$locatie}");
exit;
}
}

Aceast funcie verific dac s-a efectuat cu succes o interogare a bazei de date i
dac nu afieaz un mesaj de avertizare.

function confirm_query($set_rezultate){
if(!$set_rezultate){
die("Cutarea n baza de date a euat: ".mysql_error());
}
}

Aceast funcie extrage datele despre subiectele coninute n baza de date n


funcie de rangul de vizibilitate i poziia pe care trebuie s o ocupe n meniu.

function extrage_subiectele($public=true){
global $connection;
$query = "SELECT * FROM subiecte";
if($public){
$query .=" WHERE vizibil = 1 ";
}
$query .=" ORDER BY pozitie ASC";
$set_subiecte = mysql_query($query, $connection);
confirm_query($set_subiecte);
return $set_subiecte;
}

Aceast funcie extrage din baza de date paginile corespunztoare unui anumit
subiect, n funcie de rangul de vizibilitate i de poziia pe care trebuie s o ocupe n
meniu.

function extrage_paginile_pentru_subiect($subiect, $public = true){

49
global $connection;
$query = "SELECT * FROM pagini WHERE id_subiect = {$subiect}";
if($public){
$query .= " AND vizibil = 1 ";
}
$query .=" ORDER BY pozitie ASC";
$set_pagini = mysql_query($query, $connection);
confirm_query($set_pagini);
return $set_pagini;
}

Aceast funcie extrage din baza de date un subiect n funcie de numrul de


identificare stocat n cmpul id.

function extrage_subiect_dupa_id($sub_sel){
global $connection;
$query = "SELECT * FROM subiecte WHERE id='$sub_sel' LIMIT 1";
$set_rezultate = mysql_query($query,$connection);
confirm_query($set_rezultate);
if($subiect_s = mysql_fetch_array($set_rezultate)){
return $subiect_s;
} else{
return NULL;
}
}

Aceast funcie extrage din baza de date o pagin n funcie de numrul de


identificare stocat n cmpul id.

function extrage_pagina_dupa_id($pag_sel){
global $connection;
$query = "SELECT * FROM pagini WHERE id='$pag_sel' LIMIT 1";
$set_rezultate = mysql_query($query,$connection);
confirm_query($set_rezultate);
if($pagina_s = mysql_fetch_array($set_rezultate)){
return $pagina_s;
} else{
return NULL;
}
}

Aceast funcie alege prima pagin din setul de pagini setul de pagini
corespunztoare unui subiect.

function alege_pagina($sub_sel){
$set_pagini=extrage_paginile_pentru_subiect($sub_sel,true);
if($prima_pagina=mysql_fetch_array($set_pagini)){
return $prima_pagina;
}else{
return NULL;
}
}

Aceast funcie verific dac a fost selectat un subiect sau o pagina i care din ele
anume.

function gaseste_pagina_selectata(){
global $sub_sel;
global $pag_sel;
if(isset($_GET['sub'])){

50
$sub_sel = extrage_subiect_dupa_id($_GET['sub']);
$pag_sel = NULL;
} elseif(isset($_GET['pag'])){
$sub_sel = NULL;
$pag_sel = extrage_pagina_dupa_id($_GET['pag']);
} else {
$sub_sel = NULL;
$pag_sel = NULL;
}
}

Aceast funcie genereaz forma i funcionalitatea meniului care se afieaz n


interfaa seciunii rezervate membrilor autorizai. Folosete multe din funciile
anterioare.

function navigatie($sub_sel, $pag_sel, $public = false){


$output = "<ul class=\"subiecte\">";
//Extragem subiectele din baza de date cu functia "extrage_subiectele()"
care este apelata fara parametru si returneaza variabila "$set_subiecte" .
$set_subiecte = extrage_subiectele($public);
//Printr-o bucla "while" listam subiectele si pentru fiecare subiect
cautam in baza de date paginile corespunzatoare
while($subiect = mysql_fetch_array($set_subiecte)){
$output .="<li";
if($subiect["id"]==$sub_sel['id']){$output .=" class = \"selectat\"";}
$output .= "><a href=\"editeaza_subiect.php?
sub=".urlencode($subiect["id"])."\">{$subiect["nume_meniu"]}</a></li>";
//Extragem paginile corespunzatoare fiecarui subiect in parte cu
functia "extrage_paginile_pentru_subiect", apelata cu parametrul
$subiect["id"] si care returneaza variabila "$set_pagini".
$set_pagini = extrage_paginile_pentru_subiect($subiect["id"], $public);
$output .="<ul class=\"pagini\">";
//Printr-o bucla "while" listam paginile pentru fiecare subiect in
parte.
while($pagina = mysql_fetch_array($set_pagini)){
$output .="<li";
if($pagina["id"]==$pag_sel['id']){$output .= " class = \"selectat\"";}
$output .="><a href=\"continut.php?
pag=".urlencode($pagina["id"])."\">{$pagina["nume_meniu"]}</a></li>";
}
$output .= "</ul>";
}
$output .="</ul>";
return $output;
}

Aceast funcie genereaz forma i funcionalitatea meniului care se afieaz n


interfaa seciunii publice. Folosete multe din funciile anterioare.

function navigatie_public($sub_sel, $pag_sel, $public = true) {


$output = "<ul class=\"subiecte\">";
$set_subiecte = extrage_subiectele($public);
while ($subiect = mysql_fetch_array($set_subiecte)) {
$output .= "<li";
if ($subiect["id"] == $sub_sel['id']) { $output .= "
class=\"selectat\"";
}
$output .= "><a href=\"index.php?
sub=".urlencode($subiect["id"]) .
"\">{$subiect["nume_meniu"]}</a></li>";
if ($subiect["id"] == $sub_sel['id']) {

51
$set_pagini =
extrage_paginile_pentru_subiect($subiect["id"], $public);
$output .= "<ul class=\"pagini\">";
while ($pagina = mysql_fetch_array($set_pagini)) {
$output .= "<li";
if ($pagina["id"] == $pag_sel['id']) { $output
.= " class=\"selectat\""; }
$output .= "><a href=\"index.php?
pag=".urlencode($pagina["id"]) .
"\">{$pagina["nume_meniu"]}</a></li>";
}
$output .= "</ul>";
}
}
$output .= "</ul>";
return $output;
}

?>

Sfritul scriptului

Pagina functions_form.php

Aceast pagin conine funciile necesare pentru procesarea formularelor din


paginile site-ului.

nceputul scriptului:

<?php
//Functii folosite pentru tratarea formularelor

Aceast funcie verific dac au fost completate cmpurile obligatorii din


formular.
function verificare_campuri_obligatorii($campuri_obligatorii){
$erori_camp=array();
foreach($campuri_obligatorii as $numecamp) {
if(!isset($_POST[$numecamp]) || empty($_POST[$numecamp])) {
$erori_camp[] = $numecamp;
}
}
return $erori_camp;
}

Aceast funcie verific dac au fost completate corect cmpurile din formular
care au o lungime maxim.
function verificare_lungime_maxima($lungime_camp){
$erori_camp=array();
foreach($lungime_camp as $fieldname => $lungimemax ){

if(strlen(trim(structurare_date_mysql($_POST[$fieldname])))>$lungimemax
){
$erori_camp[] = $fieldname;}
}
return $erori_camp;
}

52
Aceast funcie afieaz eventualele erori returnate de funciile anterioare.
function afiseaza_erori($sir_erori){
echo"<p class-\"erori\">";
echo"V rugm verificai urmtoarele cmpuri:<br />";
foreach($sir_erori as $eroare){
echo"-" . $eroare . "<br />";
}
echo"</p>";
}
?>
Sfritul scriptului

Pagina index.php

Aceasta este pagina principal a seciunii publice, fiind folosit pentru a afia
coninutul care are rangul de vizibilitate public. Structurarea paginii se realizeaz cu
ajutorul unui tabel i cu ajutorul fiierului public.css aflat n subdirectorul css al site-
ului. Meniul afiat n stnga paginii este generat cu ajutorul funciei navigatie_public.
Dac nu sunt selectate nici un subiect pagin anume, se afieaz un mesaj de
ntmpinare i un meniu sub forma listei tuturor subiectelor cu rang de vizibilitate
public.

53
Pagina index.php nainte de a fi selectat un subiect sau o pagin.

n momentul n care a fost selectat un anumit subiect, acest lucru este marcat
prin modificarea fontului cu care este afiat subiectul respectiv (subiectul apare afiat cu
caractere ngroate i iatalice), iar sub acesta sunt listate toate paginile corespunztoare
subiectului respectiv i care au rangul de vizibilitate public.

Pagina index.php dup ce a fost selectat un subiect.

Dup selectarea unui subiect, se afieaz i paginile corespunztoare lui, astfel


nct se poate selecta o pagin. n momentul n care a fost selectat o pagin, subiectul
selectat anterior este deselectat i se revine la forma iniial a meniului care listeaz
acum doar subiectele, iar n seciunea principal a paginii se afieaz coninutul paginii
selectate.
n cazul n care este selectat o pagin care se refer la un anumit monument,
aceasta conine i o legtur spre harta interactiv. Aceast hart conine spre paginile
corespunztoare fiecrui monument marcat prin semne distinctive. Dac se execut
click pe aceste marcaje, vizitatorul este redirecionat spre pagina care conine informaii
despre monumentul de la locaia selectat de pe hart.

54
Pagina index.php dup ce a fost selectat un subiect.

Pagina index.php afind harta interactiv.

55
n partea de jos a meniului este afiat o legtur care duce la pagina de
autentificare unde pot fi introduse, numele de utilizator i parola pentru a putea avea
acces la seciunea privat a site-ului.

nceputul script-ului:

<?php require_once("includes/db_connection.php"); ?>


<?php require_once("includes/functions.php"); ?>

<?php gaseste_pagina_selectata(); ?>


<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie_public($sub_sel, $pag_sel); ?>
<a href="login.php">Autentificare</a>
</td>
<td id="pagina">
<?php if ($pag_sel) { ?>
<h2><?php echo $pag_sel['nume_meniu']; ?></h2>
<div class="continut_pagina">
<?php echo $pag_sel['continut']; ?>
</div>
<?php } else { ?>
<h2 align="center">Bine ai venit pe site-ul informativ "Repere Istorice
Hunedorene"</h2>
<p align="center"><img src="imagini/intro.jpg" width="600" height="600"
/></p>
<?php } ?>
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

Sfritul scriptului.

Pagina login.php

Aceast pagin permite introducerea unui nume de utilizator i a unei parole,


prin intermediul unui formular.

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php

if (logged_in()) {
redirecteaza_la("staff.php");
}
include_once("includes/functions_form.php");

// Procesarea formularului
if (isset($_POST['submit'])) { // Dac formularul a fost trimis.
$erori = array();

// Validm datele din formular

56
pagina login.php.
$campuri_obligatorii = array('numeuser', 'parola');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii, $_POST));

$lungime_camp = array('numeuser' => 30, 'parola' => 30);


$erori = array_merge($errors,
verificare_lungime_maxima($lungime_camp, $_POST));

$numeuser = trim(structurare_date_mysql($_POST['numeuser']));
$parola = trim(structurare_date_mysql($_POST['parola']));
$parola_criptata = sha1($parola);

if ( empty($errors) ) {
// Verificm baza de date pentru a vedea dac exist numele de
utilizator i parola.
$query = "SELECT id, numeuser ";
$query .= "FROM utilizatori ";
$query .= "WHERE numeuser = '{$numeuser}' ";
$query .= "AND parola_criptata = '{$parola_criptata}' ";
$query .= "LIMIT 1";
$result_set = mysql_query($query);
confirm_query($result_set);
if (mysql_num_rows($result_set) == 1) {
// numele de utilizator i parola exist
// i de asemenea exist o singur nregistrare
$utilizator_gasit = mysql_fetch_array($result_set);
$_SESSION['user_id'] = $utilizator_gasit['id'];
$_SESSION['numeuser'] = $utilizator_gasit['numeuser'];

57
redirecteaza_la("staff.php");
} else {
// numele de utilizator i parola exist n baza de date
$mesaj = "Combinaia nume de utilizator/parol este
incorect.<br />
V rugm s v asigurai c ai tastat corect.";
}
} else {
if (count($erori) == 1) {
$mesaj = "A fost detectat o eroare n formular.";
} else {
$mesaj = "Au fost detectate " . count($erori) . "
erori n formular.";
}
}

} else { // Formularul nu a fost trimis.


if (isset($_GET['logout']) && $_GET['logout'] == 1) {
$mesaj = "Nu suntei autentificat.";
}
$numeuser = "";
$parola = "";
}
?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<a href="index.php">napoi</a>
</td>
<td id="pagina">
<h2>Login</h2>
<?php if (!empty($mesaj)) {echo "<p class=\"mesaj\">" . $mesaj . "</p>";} ?>
<?php if (!empty($erori)) { afiseaza_erori($erori); } ?>
<form action="login.php" method="post">
<table>
<tr>
<td>Nume utilizator:</td>
<td><input type="text" name="numeuser" maxlength="30" value="<?php
echo htmlentities($numeuser); ?>" /></td>
</tr>
<tr>
<td>Parola:</td>
<td><input type="password" name="parola" maxlength="30" value="<?
php echo htmlentities($parola); ?>" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="submit" value="Login"
/></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

Sfritul scriptului

58
Pagina staff.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/functions.php"); ?>


<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
&nbsp;
</td>
<td id="pagina">
<h2>Meniu Staff</h2>
<p>Bine ai venit n pagina de administrare</p>
<ul>
<li><a href="continut.php">Administreaz coninutul site-ului</a></li>
<li><a href="utilizator_nou.php">Adaug utilizator nou</a></li>
<li><a href="logout.php">Ieire</a></li>
</ul>
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

Sfritul scriptului

Pagina continut.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php gaseste_pagina_selectata(); ?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie($sub_sel, $pag_sel); ?>
<br />
<a href="subiect_nou.php">+ Adaug subiect nou</a>
<br />
<a href="logout.php">Iesire</a>
</td>
<td id="pagina">
<?php if(!is_null($sub_sel)){ // este selectat un subiect ?>
<h2><?php echo $sub_sel['nume_meniu']; ?></h2>
<?php } elseif(!is_null($pag_sel)){ // este selectata o pagina ?>
<h2><?php echo $pag_sel['nume_meniu']; ?></h2>
<div class="pagina">
<?php echo $pag_sel['continut'];?>
</div>
<br />

59
<a href="editeaza_pagina.php?pag=<?php echo urlencode($pag_sel['id']);
?>">Editeaz pagina</a>
<?php } else { // nu a fost selectat nimic ?>
<h2>Selectai un subiect sau o pagin pentru editare</h2>
<?php } ?>
</td>
</tr>
</table>
<?php require("includes/footer.php"); ?>

Sfritul scriptului

Pagina editeaza_subiect.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php
if (intval($_GET['sub']) == 0) {
redirecteaza_la("continut.php");
}
if (isset($_POST['submit'])) {
$erori = array();

$campuri_obligatorii = array('nume_meniu', 'pozitie',


'vizibil');
foreach($campuri_obligatorii as $fieldname){
if (!isset($_POST[$fieldname])||
(empty($_POST[$fieldname])&&$_POST[$fieldname] != 0)) {
$erori[] = $fieldname;
}
}
$lungime_camp = array('nume_meniu' => 30);
foreach($lungime_camp as $fieldname => $maxlength ) {
if (strlen(trim(structurare_date_mysql($_POST[$fieldname]))) >
$maxlength) { $erori[] = $fieldname; }
}
if (empty($erori)) {
// Se execut modificarea
$id = structurare_date_mysql($_GET['sub']);
$nume_meniu =
structurare_date_mysql($_POST['nume_meniu']);
$pozitie = structurare_date_mysql($_POST['pozitie']);
$vizibil = structurare_date_mysql($_POST['vizibil']);

$query = "UPDATE subiecte SET


nume_meniu = '{$nume_meniu}',
pozitie = {$pozitie},
vizibil = {$vizibil}
WHERE id = {$id}";
$result = mysql_query($query, $connection);
if (mysql_affected_rows() == 1) {
// Succes
$mesaj = "Subiectul a fost actualizat cu
succes.";
} else {

60
// Eroare
$mesaj = "Actualizarea subiectului a euat.";
$mesaj .= "<br />". mysql_error();
}

} else {
// Afim numrul de erori
$message = "Au fost detectate " . count($erori) . "
erori n formular.";
}

} // sfrit: if (isset($_POST['submit']))
?>
<?php gaseste_pagina_selectata(); ?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie($sub_sel, $pag_sel); ?>
<br />
<a href="logout.php">Iesire</a>
</td>
<td id="pagina">
<h2>Editeaz Subiect: <?php echo $sub_sel['nume_meniu']; ?
></h2>
<?php if (!empty($mesaj)) {
echo "<p class=\"mesaj\">" . $mesaj . "</p>";
} ?>
<?php
// Afim lista cmpurilor n care s-au detectat erori
if (!empty($erori)) {
echo "<p class=\"erori\">";
echo "V rugm verificai urmtoarele cmpuri:<br />";
foreach($erori as $eroare) {
echo " - " . $eroare . "<br />";
}
echo "</p>";
}
?>
<form action="editeaza_subiect.php?sub=<?php echo
urlencode($sub_sel['id']); ?>" method="post">
<p>Nume subiect:
<input type="text" name="nume_meniu" value="<?
php echo $sub_sel['nume_meniu']; ?>" id="nume_meniu" />
</p>
<p>Pozitie:
<select name="pozitie">
<?php
$set_subiecte =
extrage_subiectele();
$numr_subiecte =
mysql_num_rows($set_subiecte);
// $numr_subiecte + 1 pentru c
adugm un subiect
for($count=1;
$count<=$numr_subiecte+1; $count++) {
echo "<option
value=\"{$count}\"";
if ($sub_sel['pozitie'] ==
$count) {
echo " selected";

61
}
echo ">{$count}</option>";
}
?>
</select>
</p>
<p>Vizibil:
<input type="radio" name="vizibil" value="0"<?
php
if ($sub_sel['vizibil'] == 0) { echo " checked";
}
?> /> Nu
&nbsp;
<input type="radio" name="vizibil" value="1"<?
php
if ($sub_sel['vizibil'] == 1) { echo " checked";
}
?> /> Da
</p>
<input type="submit" name="submit" value="Editeaz
Subiect" />
&nbsp;&nbsp;
<a href="sterge_subiect.php?sub=<?php echo
urlencode($sub_sel['id']); ?>" onclick="return confirm('Eti
sigur?');">terge Subiect</a>
</form>
<br />
<a href="continut.php">Anuleaz</a>
<div style="margin-top: 2em; border-top: 1px solid
#000000;">
<h3>Pagini la acest subiect:</h3>
<ul>
<?php
$pag_sub = extrage_paginile_pentru_subiect($sub_sel['id']);
while($pagina = mysql_fetch_array($pag_sub)) {
echo "<li><a href=\"continut.php?pag={$pagina['id']}\">
{$pagina['nume_meniu']}</a></li>";
}
?>
</ul>
<br />
+ <a href="pagina_noua.php?sub=<?php echo
$sub_sel['id']; ?>">Adaug o pagin nou la acest subiect</a>
</div>
</td>
</tr>
</table>
<?php require("includes/footer.php"); ?>

Sfritul scriptului

Pagina sterge_subiect.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>

62
<?php confirm_logged_in(); ?>
<?php
if (intval($_GET['sub']) == 0) {
redirecteaza_la("continut.php");
}

$id = structurare_date_mysql($_GET['sub']);

if ($subiect = extrage_subiect_dupa_id($id)) {

$query = "DELETE FROM subiecte WHERE id = {$id} LIMIT 1";


$result = mysql_query($query, $connection);
if (mysql_affected_rows() == 1) {
redirecteaza_la("continut.php");
} else {
// Dac tergerea eueaz, afim un mesaj de eroare
echo "<p>tergerea subiectului a euat.</p>";
echo "<p>" . mysql_error() . "</p>";
echo "<a href=\"content.php\">Revenire la pagina
principala</a>";
}
} else {
// subiectul nu exista n baza de date
redirecteaza_la("continut.php");
}
?>

<?php mysql_close($connection); ?>

Sfritul scriptului

Pagina subiect_nou.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php gaseste_pagina_selectata(); ?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie($sub_sel, $pag_sel); ?>
</td>
<td id="pagina">
<h2>Adaug subiect</h2>
<form action="creaza_subiect.php" method="post">
<p>Nume Subiect:
<input type="text" name="nume_meniu" value="" id="nume_meniu" />
</p>
<p>Poziie:
<select name="pozitie">
<?php
$subiecte=extrage_subiectele();

63
$numar_subiecte=mysql_num_rows($subiecte);
//$numar_subiecte+1 pentru ca adaugam un subiect
for ($count=1; $count <= $numar_subiecte+1; $count++)
{
echo "<option value=\"{$count}\">{$count}</option>";
}
?>
</select>
</p>
<p>Vizibil:
<input type="radio" name="vizibil" value="0" /> Nu
&nbsp;
<input type="radio" name="vizibil" value="1" /> Da
</p>
<input type="submit" value="Adaug Subiect" />
</form>
<br />
<a href="continut.php">Anulare</a>

</td>
</tr>
</table>
<?php require("includes/footer.php"); ?>

Sfritul scriptului

Pagina creaza_subiect.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>

<?php
$erori = array();
// Validarea formularului
$campuri_obligatorii = array('nume_meniu','pozitie','vizibil');
foreach($campuri_obligatorii as $numecamp) {
if(!isset($_POST[$numecamp]) || empty($_POST[$numecamp])) {
$erori[] = $numecamp;
}
}

$lungime_camp = array('nume_meniu' => 30);


foreach($lungime_camp as $numecamp => $maxlength ) {
if (strlen(trim(structurare_date_mysql($_POST[$numecamp]))) >
$maxlength) { $erori[] = $numecamp; }
}
if (!empty($erori)) {
redirecteaza_la("subiect_nou.php");
}
?>

<?php
//initializam variabile cu datele preluate din formular.
$nume_meniu = structurare_date_mysql($_POST['nume_meniu']);
$pozitie = structurare_date_mysql($_POST['pozitie']);

64
$vizibil = structurare_date_mysql($_POST['vizibil']);
// Inseram variabilele citite din formular in baza de date.
"$nume_meniu" este incadrat in ghilimele simple pentru ca este de tip "sir de
caractere".
$query="INSERT INTO subiecte (
nume_meniu,pozitie,vizibil
) values (
'{$nume_meniu}',{$pozitie},{$vizibil}
)";
if(mysql_query($query,$connection)){
//Daca inserarea in baza de date este reusita, ne intoarcem la pagina
continut.php
redirecteaza_la("continut.php");
exit;
} else {
//Daca apare o eroare, o afisam
echo"<p>Subiectul nu a putut fi creat</p>";
echo"<p>" . mysql_error() . "</p>";
}
?>

<?php
//5.nchidem conexiunea cu baza de date
mysql_close($connection);
?>

Sfritul scriptului

Pagina editeaza_pagina.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php
// Verificm dac a fost selectat un subiect
if (intval($_GET['pag']) == 0) {
redirecteaza_la('continut.php');
}

include_once("includes/functions_form.php");

// ncepem procesarea formularului


// Se execut procesarea numai n cazul n care formularul a fost trimis
if (isset($_POST['submit'])) {
// initializm un ir pentru erori
$erori = array();

// Validm datele din formular


$campuri_obligatorii = array('nume_meniu', 'pozitie', 'vizibil',
'continut');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii));

$lungime_camp = array('nume_meniu' => 30);

65
$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp));

// procesm datele din formular nainte de a le trimite la baza de


date
$id = structurare_date_mysql($_GET['pag']);
$nume_meniu = trim(structurare_date_mysql($_POST['nume_meniu']));
$pozitie = structurare_date_mysql($_POST['pozitie']);
$vizibil = structurare_date_mysql($_POST['vizibil']);
$continut = structurare_date_mysql($_POST['continut']);

// Trimitem datele la baza de date numai dac nu exist erori.


if (empty($erori)) {
$query = "UPDATE pagini SET
nume_meniu = '{$nume_meniu}',
pozitie = {$pozitie},
vizibil = {$vizibil},
continut = '{$continut}'
WHERE id = {$id}";
$result = mysql_query($query);
// Verificm dac s-a executat modificarea
if (mysql_affected_rows() == 1) {
// Succes!
$mesaj = "Pagina a fost modificat cu succes.";
} else {
$mesaj = "Pagina nu a putut fi modificat.";
$mesaj .= "<br />" . mysql_error();
}
} else {
if (count($erori) == 1) {
$mesaj = "A fost detectat o eroare n formular.";
} else {
$mesaj = "Au fost detectate " . count($erori) . "
erori n formular.";
}
}
// Sfrit procesare formular
}
?>
<?php gaseste_pagina_selectata(); ?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie($sub_sel, $pag_sel); ?>
<br />
<a href="new_subject.php">+ Adaug subiect nou</a>
<br />
<a href="logout.php">Iesire</a>
</td>
<td id="pagina">
<h2>Editeaz pagina: <?php echo $pag_sel['nume_meniu']; ?
></h2>
<?php if (!empty($mesaj)) {echo "<p class=\"mesaj\">" .
$mesaj . "</p>";} ?>
<?php if (!empty($erori)) { afiseaza_erori($erori); } ?>

<form action="editeaza_pagina.php?pag=<?php echo


$pag_sel['id']; ?>" method="post">
<?php include "form_pagina.php" ?>
<input type="submit" name="submit" value="Modific
Pagina" />&nbsp;&nbsp;

66
<a href="sterge_pagina.php?pag=<?php echo
$pag_sel['id']; ?>" onclick="return confirm('Eti sigur c vrei s tergi
pagina?');">terge pagina</a>
</form>
<br />
<a href="continut.php?pag=<?php echo $pag_sel['id']; ?
>">Anuleaz</a><br />
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

Sfritul scriptului

Pagina form_pagina.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php confirm_logged_in(); ?>
<?php // Aceast pagin este inclus n pagina_noua.php i
editeaza_pagina.php ?>
<?php if (!isset($pagina_noua)){$pagina_noua = false;} ?>

<p>Nume Pagin: <input type="text" name="nume_meniu" value="<?php echo


$pag_sel['nume_meniu']; ?>" id="nume_meniu" /></p>

<p>Pozitie: <select name="pozitie">


<?php
if (!$pagina_noua) {
$set_pagini =
extrage_paginile_pentru_subiect($pag_sel['id_subiect']);
$page_count = mysql_num_rows($set_pagini);
} else {
$set_pagini =
extrage_paginile_pentru_subiect($sub_sel['id']);
$page_count = mysql_num_rows($set_pagini) + 1;
}
for ($count=1; $count <= $page_count; $count++) {
echo "<option value=\"{$count}\"";
if ($pag_sel['pozitie'] == $count) { echo " selected"; }
echo ">{$count}</option>";
}
?>
</select></p>
<p>Vizibil:
<input type="radio" name="vizibil" value="0"<?php
if ($pag_sel['vizibil'] == 0) { echo " checked"; }
?> /> Nu
&nbsp;
<input type="radio" name="vizibil" value="1"<?php
if ($pag_sel['vizibil'] == 1) { echo " checked"; }
?> /> Da
</p>
<p>Continut:<br />
<textarea name="continut" rows="20" cols="80"><?php echo
$pag_sel['continut']; ?></textarea>

67
</p>

Sfritul scriptului

Pagina sterge_pagina.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php
// Verificm dac a fost selectat un subiect
if (intval($_GET['pag']) == 0) {
redirecteaza_la('continut.php');
}

$id = structurare_date_mysql($_GET['pag']);
// Verificm dac pagina exist
// folosim id-ul paginii pentru redirectare
if ($pagina = extrage_pagina_dupa_id($id)) {
// LIMIT 1 nu este necesar dar este o protectie in plus
$query = "DELETE FROM pagini WHERE id = {$pagina['id']} LIMIT 1";
$result = mysql_query ($query);
if (mysql_affected_rows() == 1) {
// tergerea s-a executat cu succes
redirecteaza_la("editeaza_subiect.php?
subj={$pagina['id_subiect']}");
} else {
// tergerea paginii a euat
echo "<p>tergerea paginii a euat.</p>";
echo "<p>" . mysql_error() . "</p>";
echo "<a href=\"continut.php\">napoi</a>";
}
} else {
// Pagina nu exist deci nu facem nimic
redirecteaza_la('continut.php');
}
?>
<?php
// Deoarece nu includem footer+ul, nchidem manual conexiunea cu baza de date
mysql_close($db);
?>

Sfritul scriptului

Pagina pagina_noua.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/db_connection.php"); ?>

68
<?php require_once("includes/functions.php"); ?>
<?php
// Verificm dac s-a selectat un subiect
if (intval($_GET['sub']) == 0) {
redirecteaza_la('continut.php');
}

include_once("includes/functions_form.php");

// Start procesare formular


// procesm formularul numai dac acesta a fost trimis
if (isset($_POST['submit'])) {
// iniializm un ir pentru erori
$erori = array();

// validm datele din formular


$campuri_obligatorii
=array('nume_meniu','pozitie','vizibil','continut');

$erori=array_merge($erori,verificare_campuri_obligatorii($campuri_obligatorii
,$_POST));

$lungime_camp = array('nume_meniu' => 30);


$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp,$_POST));

// procesm datele din formular nainte de a le trimite spre baza


de date
$id_subiect = structurare_date_mysql($_GET['sub']);
$nume_meniu = trim(structurare_date_mysql($_POST['nume_meniu']));
$pozitie = structurare_date_mysql($_POST['pozitie']);
$vizibil = structurare_date_mysql($_POST['vizibil']);
$continut = structurare_date_mysql($_POST['continut']);

// Datele se trimit spre baza de date numai daca nu sunt erori.


if (empty($erori)) {
$query = "INSERT INTO pagini (
nume_meniu, pozitie, vizibil, continut,
id_subiect
) VALUES (
'{$nume_meniu}', {$pozitie}, {$vizibil},
'{$continut}', {$id_subiect}
)";
if ($result = mysql_query($query, $connection)) {
$mesaj = "Pagina a fost creat cu succes.";
// Obinem ultimul id inserat n actuala conexiune cu
baza de date
$new_page_id = mysql_insert_id();
redirecteaza_la("continut.php?page={$new_page_id}");
} else {
$mesaj = "Pagina nu a putut fi creat.";
$mesaj .= "<br />" . mysql_error();
}
} else {
if (count($erori) == 1) {
$mesaj = "A fost detectat o eroare n formular.";
} else {
$mesaj = "Au fost detectate " . count($erori) . "
erori n formular.";
}
}
// Sfrit procesare formular

69
}
?>
<?php gaseste_pagina_selectata(); ?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<?php echo navigatie($sub_sel, $pag_sel, $public = false); ?
>
<br />
<a href="subiect_nou.php">+ Adaug subiect nou</a>
</td>
<td id="pagina">
<h2>Adaug Pagin nou</h2>
<?php if (!empty($mesaj)) {echo "<p class=\"mesaj\">" .
$mesaj . "</p>";} ?>
<?php if (!empty($erori)) { afiseaza_erori($erori); } ?>

<form action="pagina_noua.php?sub=<?php echo $sub_sel['id'];


?>" method="post">
<?php $pagina_noua=true; ?>
<?php include "form_pagina.php" ?>
<input type="submit" name="submit" value="Creaz
Pagin" />
</form>
<br />
<a href="editeaza_subiect.php?sub=<?php echo $sub_sel['id'];
?>">Anuleaz</a><br />
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

Sfritul scriptului

Pagina utilizator_nou.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/session.php"); ?>


<?php require_once("includes/db_connection.php"); ?>
<?php require_once("includes/functions.php"); ?>
<?php confirm_logged_in(); ?>
<?php
include_once("includes/functions_form.php");

// Start procesare formular


if (isset($_POST['submit'])) { // Formularul a fost trimis.
$erori = array();

// validm datele din formular


$campuri_obligatorii = array('numeuser', 'parola');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii, $_POST));

$lungime_camp = array('numeuser' => 30, 'parola' => 30);


$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp, $_POST));

70
$numeuser = trim(structurare_date_mysql($_POST['numeuser']));
$parola = trim(structurare_date_mysql($_POST['parola']));
$parola_criptata = sha1($parola);

if ( empty($erori) ) {
$query = "INSERT INTO utilizatori (
numeuser, parola_criptata
) VALUES (
'{$numeuser}', '{$parola_criptata}'
)";
$result = mysql_query($query, $connection);
if ($result) {
$mesaj = "Utilizatorul a fost creat cu succes.";
} else {
$mesaj = "Utilizatorul nu a putut fi creat.";
$mesaj .= "<br />" . mysql_error();
}
} else {
if (count($erori) == 1) {
$mesaj = "A fost detectat o eroare n formular.";
} else {
$mesaj = "Au fost detectate " . count($erori) . "
erori n formular.";
}
}
} else { // Formularul nu a fost trimis.
$numeuser = "";
$parola = "";
}
?>
<?php include("includes/header.php"); ?>
<table id="structura">
<tr>
<td id="navigatie">
<a href="staff.php">napoi la meniu</a><br />
<br />
</td>
<td id="pagina">
<h2>Creaz utilizator nou</h2>
<?php if (!empty($mesaj)) {echo "<p class=\"mesaj\">" .
$mesaj . "</p>";} ?>
<?php if (!empty($erori)) { afiseaza_erori($erori); } ?>
<form action="utilizator_nou.php" method="post">
<table>
<tr>
<td>Nume utilizator:</td>
<td><input type="text" name="numeuser"
maxlength="30" value="<?php echo htmlentities($numeuser); ?>" /></td>
</tr>
<tr>
<td>Parola:</td>
<td><input type="password" name="parola"
maxlength="30" value="<?php echo htmlentities($parola); ?>" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit"
name="submit" value="Creaz utilizator" /></td>
</tr>
</table>
</form>
</td>
</tr>
</table>
<?php include("includes/footer.php"); ?>

71
Sfritul scriptului

Pagina logout.php

Aceast pagin

nceputul scriptului:

<?php require_once("includes/functions.php"); ?>


<?php
// Patru pai pentru nchiderea sesiunii
// (adic logout)

// 1. Gsim sesiunea
session_start();

// 2. resetm toate variabilele sesiunii


$_SESSION = array();

// 3. Distrugem cookie+ul sesiunii


if(isset($_COOKIE[session_name()])) {
setcookie(session_name(), '', time()-42000, '/');
}

// 4. Distrugem sesiunea
session_destroy();

redirecteaza_la("login.php?logout=1");
?>

Sfritul scriptului

Pagina

Aceast pagin

nceputul scriptului:

Sfritul scriptului

Bibliografie

1. Curs Tehnologii WEB, Ionel Muscalagiu


2. Crearea paginilor WEB, Sabin Buraga, Ed. Polirom Iai,
2002

72
3. Aplicaii WEB la cheie: studii de caz implementate n
PHP, volum coordonat de Sabin Buraga, Ed. Polirom Iai, 2003
4. PHP pentru World Wide Web, Larry Ullman ED. Teora
SRL Bucureti, 2004
5. www.php.net/manual/
6. www.mysql.com/docs/
7. www.apache.org/docs/

73

You might also like