Professional Documents
Culture Documents
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
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.
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.
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
7
Capitoloul 2. Tehnologii Web pentru realizarea site-
urilor interactive
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:
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).
<HTML>
<HEAD>
<TITLE> Introducere n limbajul HTML </TITLE>
</HEAD>
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>
<HTML>
<HEAD>
... antetul documentului ...
</HEAD>
<BODY atribute >
... corpul documentului ...
</BODY>
</HTML>
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,
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.
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.
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.
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.
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
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
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> "fara speranta e imposibil sa gasesti ceva de
nesperat" </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
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:
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.
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.
<HTML>
<HEAD>
</HEAD>
<FRAMESET>
</FRAMESET>
</HTML>
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.
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:
Observatii:
- blocurile <form> nu pot fi imbricate;
- intr-o pagina Web pot fi create oricate formulare.
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.
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 .
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.
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;
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.
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);
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:
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]:
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):
Haidei s introducem cteva date n tabelul cri. Comanda pe care o vom folosi
este INSERT i sintaxa este[3][6]:
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:
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:
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
Data/timp:
Column type Format
DATETIME YYYY-MM-DD hh:mm:ss
DATE 'YYYY-MM-DD'
TIMESTAMP YYYYMMDDhhmmss
TIME 'hh:mm ss'
YEAR YYYY'
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)
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:
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:
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:
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:
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:
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:
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
%;
Dac vrem s alegem toate crile care nu sunt scrise de Mihai Eminescu folosim
operatorul de inegalitate (semnul !=, opus lui =):
Putem gsi toate titlurile crilor pentru care cmpul descriere este gol astfel:
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:
autor
Alexandru Mitru
George Cosbuc
Mihai Eminescu
Mihai Eminescu
Mihai Eminescu
Mihai Eminescu
William Shakespeare
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;
Autor
Alexandru Mitru
George Cosbuc
Mihai Eminescu
William Shakespeare
29
SELECT * FROM carti LIMIT 0,3;
DELETE
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
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 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
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]:
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:
2.2.6 Normalizarea
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.1 Introducere
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.
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]:
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;
?>
<?
$o_variabila = 1;
print $o_variabila;
?>
<br>
<?
35
$alta_variabila = "Un text oarecare";
print $alta_variabila;
?>
ori prin scrierea lui <br> direct n cod aa:
<?
$o_variabila = 1;
print $o_variabila;
print "<br>";
$alta_variabila = "Un text oarecare"
print $alta_variabila;
?>
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).
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";
}
?>
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
?>
<?
function inmultire ($x, $y)
{
$rezultat = $x * $y;
}
$x = 5;
$y = 6;
print inmultire ($x, $y) ;
?>
n acest exemplu vedem c doar valoarea variabilei este cea care conteaz, funcia
prelund aceast valoare.
<?
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.
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
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].
Tabelul subiecte
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
44
Urmtorul tabel este utilizatori, de tip InnoDB, care conine datele despre
utilizatorii autorizai s fac modificri pe site.
Tabelul utilizatori
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
nceputul script-ului:
<?php
header('Content-Type: text/html;charset=UTF-8');
header('Pragma: no-cache');
header('Cache-Control: no-cache,must-revalidate');
?>
<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
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
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());
}
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 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());
}
}
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.
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;
}
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;
}
}
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;
}
}
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
nceputul scriptului:
<?php
//Functii folosite pentru tratarea formularelor
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.
54
Pagina index.php dup ce a fost selectat un subiect.
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:
Sfritul scriptului.
Pagina login.php
nceputul scriptului:
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();
56
pagina login.php.
$campuri_obligatorii = array('numeuser', 'parola');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii, $_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.";
}
}
Sfritul scriptului
58
Pagina staff.php
Aceast pagin
nceputul scriptului:
Sfritul scriptului
Pagina continut.php
Aceast pagin
nceputul scriptului:
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:
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
<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" />
<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:
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)) {
Sfritul scriptului
Pagina subiect_nou.php
Aceast pagin
nceputul scriptului:
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
<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
$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;
}
}
<?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:
include_once("includes/functions_form.php");
65
$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp));
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:
67
</p>
Sfritul scriptului
Pagina sterge_pagina.php
Aceast pagin
nceputul scriptului:
$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:
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");
$erori=array_merge($erori,verificare_campuri_obligatorii($campuri_obligatorii
,$_POST));
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); } ?>
Sfritul scriptului
Pagina utilizator_nou.php
Aceast pagin
nceputul scriptului:
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:
// 1. Gsim sesiunea
session_start();
// 4. Distrugem sesiunea
session_destroy();
redirecteaza_la("login.php?logout=1");
?>
Sfritul scriptului
Pagina
Aceast pagin
nceputul scriptului:
Sfritul scriptului
Bibliografie
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