Sunteți pe pagina 1din 59

Capitolul 1.

Introducere

1.1 Generaliti
Intranet-ul este o reea informatic privat a unei companii, similar ca
funcionalitate cu mediul Internet. Intranet-ul pune la dispoziia angajailor resursele
companiei, nepermind drepturi la informaiile confideniale utilizatorilor cu acces la
Internet.
Un intranet este construit din aceleai concepte i tehnologii utilizate pentru
Internet, cum ar fi un server-client i suita de protocoale de Internet TCP/IP. Oricare
din bine cunoscutele protocoale de Internet pot fi gsite ntr-un intranet, cum ar fi
HTTP (servicii web), SMTP (e-mail) i FTP (transfer de fiiere). Tehnologiile
Internetului sunt adesea utilizate pentru oferi interfee moderne la sistemele de
informaii vechi care gzduiesc date corporative.
Un intranet poate fi neles ca o analogie privat a Internetului sau ca o extensie
privat a Internetului limitat la o organizaie. Primele site-uri de intranet i primele
pagini de start au nceput s apar n organizaii n 1990-1991. Dei nu a fost oficial
notat, termenul intranet a devenit mai nti comun printre primii susintori, cum ar fi
universitile i corporaiile tehnologice n 1992.
n contrast cu Internetul exist extranetul. n timp ce intranet-urile sunt n
general limitate la angajai ai organizaiei, extranet-urile pot fi accesate de ctre clieni,
furnizori sau alte pri aprobate. Extranet-urile extind o reea privat pe Internet cu
dispoziii speciale pentru acces, autorizare i autentificare (protocolul AAA).
Intranet-urile pot oferi o poart de acces (gateway) la Internet prin intermediul
unei pori de acces de reea cu un firewall, protejnd intranetul de un posibil acces
exterior neautorizat. De multe ori gateway-ul implementeaz autentificarea
utilizatorului, criptarea mesajelor i, adesea, conectivitatea la o reea privat virtual
(VPN Virtual Private Network) pentru angajaii off-site, pentru a accesa informaiile
companiei, resursele de calcul i comunicaiile interne.

1.2 Scopul i utilitatea proiectului


Aplicaie PHP/MySQL pentru gestionarea echipamentului I.T. este un proiect
destinat intreprinderilor sau organizaiilor care vor s pun la ndemna angajailor un
mod mai simplu de gestionare a echipamentelor I.T. sau a inventarului mijloacelor fixe
n general.
Scopul acestui proiect este de a exemplifica realizarea i folosirea unei
aplicaii pentru intranet care permite vizualizarea i gestionarea mijloacelor fixe ntr-o
forma simpl i rapid, direct prin intermediul intranet-ului. De asemenea se
exemplific utilitatea folosirii limbajului PHP i a bazelor de date MySQL pentru o
realizare ct mai flexibil a unei aplicaii pentru intranet care conine informaiile
aferente.

1.3 Prezentarea capitolelor din lucrare

Capitolul 1. Introducere

Cuprinde dou pri care se refer la generaliti asupra proiectului realizat i


asupra intranet-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 aplicaiilor n intranet

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 aplicaiilor
pentru intranet. 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 aplicaii n intranet.

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.
Capitolul 2. Tehnologii Web pentru realizarea
aplicaiilor n intranet
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
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.
a) 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
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!
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. 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
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.5. 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> :
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
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 :
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


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;

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

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
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
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
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>
<?
$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];
?>
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.
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! ";
?>

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";
}
?>
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;
}
$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 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.
Cap. 3 . Realizarea practic a aplicaiei

3.1. Structura aplicaiei


Structura aplicaiei este foarte simpl, majoritatea scripturilor gsindu-se n
directorul rdcin. Exist un director numit include care conine fiiere care sunt
incluse frecvent n scripturile .php din aplicaie. De asemenea exist directorul tcpdf
care conine fiierele clasei tcpdf, clas PHP open source scris de Nicola Asuni, folosit
pentru crearea de fiiere .pdf prin intermediul scripturilor PHP.

3.2. Modul de realizare


Pentru realizarea acestui site am folosit Apache, MySQL i PHP mpreun cu
clasa tcpdf deoarece toate aceste aplicaii software sunt sub licen freeware sau open
source 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 operare Windows.
PHP este un limbaj de scripting care poate fi folosit att pentru realizarea unor
script-uri client-side i mai ales pentru realizarea unor script-uri server-side, aspect care
mbuntete att performanele ct i securitatea aplicaiei.
Clasa PHP tcpdf nu necesit alte biblioteci externe, suport toate formatele de
pagin standard, fonturi TrueTypeUnicode, OpenTypeUnicode, TrueType, OpenType,
Type1 i CID-0, poate publica sub form de fiier .pdf text generat prin intermediul
XHTML, CSS3, javascript i formulare HTML, suport nativ imagini de tip .jpg, .png
i .svg, mprire automat a textului n pagini precum i multe altele, fiind mult mai
flexibil i mai complex dect suportul .pdf standard inclus n PHP.

3.3. Baza de date MySQL


Baza de date este folosit n aceast aplicaie pentru a stoca informaiile despre
utilizatorii aplicaiei i despre mijloacele fixe aflate n inventarul gestionarilor.
Aceast baz de date conine dou tabele dup cum se poate vedea n imaginile
de mai jos.
Fig. 3.3.1. Tabelele bazei de date.
n continuare se vor descrie cele dou tabele i funciile pe care le ndeplinesc,
ncepnd cu tabelul utilizatori de tip InnoDB i interclasare UTF-8.

Fig. 3.3.2. 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 nregistrare in tabel. Acest cmp conine
numrul de identificare unic pentru fiecare utilizator.

marca - tip int (numr ntreg), fr semn, cu lungimea de 11 caractere.


Acest cmp conine marca, numrul prin care este identificat fiecare angajat n
cadrul intreprinderii.

nume - de tip varchar (ir de caractere) i lungimea de 60 de caractere


i interclasare UTF-8. Acest cmp nu accept valoarea NULL deci este
obligatoriu s conin o valoare. Nu poate exista un utilizator fr nume.

parola - de tip varchar (ir de caractere) i lungimea de 60 de caractere


i interclasare UTF-8. Acest cmp nu accept valoarea NULL deci este
obligatoriu s conin o valoare. Nu poate exista un utilizator fr parol.
drepturi de tipul enum, care poate lua valorile 1, 2 i 3, aceste
valori reprezint tipul de drepturi pe care le are utilizatorul i corespund
drepturile pe care le au gestionarii, contabilii i administratorii care folosesc
aplicaia.
Acest tabel are ca i cheie primar cmpul id.
Urmtorul tabel este mij_fix, de tipul InnoDB i interclasare UTF-8. Acest
tabel conine cmpurile:

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 nregistrare in tabel. Acest cmp conine
un numr de identificare unic pentru fiecare mijloc fix coninut n tabel.

nr_inv - de tip int (numr ntreg), fr semn, cu lungimea de 11


caractere. Acest cmp conine numrul de inventar al mijlocului fix n funcie de
specificaiile referitoare la numerele de inventar din cadrul intreprinderii.

tip de tip set, care poate lua valorile Calculator, Imprimant,


Laptop, Reelistic,Tablet sau Videoproiector. Acest cmp conine tipul
mijloacelor fixe pentru a se putea extrage o list a acestora n funcie de tip.

denumire - de tip text, deoarece denumirea mijloacelor fixe poate fi


destul de lung. Acest cmp conine denumirea mijlocului fix.

marca - tip int (numr ntreg), fr semn, cu lungimea de 11 caractere.


Acest cmp conine marca, numrul prin care este identificat fiecare angajat n
cadrul intreprinderii i face legtura ntre acest tabel i tabelul utilizatori. n
acest tabel are rolul de a identifica gestionarul care are n gestiune mijlocul fix la
care se refer nregistrarea.

Fig. 3.3.3. Tabelul mij_fix.


val_int - de tip decimal(10,2) adic un numr zecimal a crui parte
ntreag poate avea 10 cifre urmate de dou zecimale. Acest cmp conine
valoarea de intrare n inventar a mijlocului fix la care se refer nregistrarea.

d_p_f - de tip date, adic dat calendaristic. Acest cmp conine data
punerii n funciune a mijlocului fix la care se refer nregistrarea.

d_ex - tip date, adic dat calendaristic. Acest cmp conine data
expirrii perioadei normale de funcionare a mijlocului fix la care se refer
nregistrarea

locatie - de tip text. Acest cmp conine date despre localizarea (de
exemplu cldirea, etajul, sala, etc.) mijlocului fix la care se refer nregistrarea.

prop_cas - de tip set, care poate lua valorile Da, Nu sau Casat.
Acest cmp conine nformaii referitoare la starea casrii mijlocului fix la care se
refer nregistrarea.

3.4. Componentele aplicaiei i modul de funcionare

3.4.1. Pagina index.php.


Pagina index.php este pagina principal a aplicaiei care se deschide n
momentul cnd utilizatorul acceseaz aplicaia.
Folosete codificarea UTF - 8 pentru a afia corect caracterele specifice limbii
romne.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Se import scriptul care face conectarea la baza de date


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

Formatarea grafic a paginii este foarte simpl i se face prin cteva linii de cod
inline , nefiind necesar un fisier .css. n esen este un tabel n celulele cruia sunt
afiate datele generate de diverse scripturi .php ala aplicaiei.
<table style="width:1024px;" cellpadding="0" cellspacing="0" align="center">
<tr>
<td id="header" colspan="2" style="background-color:#FFA500;">
<h1 style="margin:0;padding:0;" align="center">Inventarul mijloacelor
fixe</h1>
</td>
</tr>

<tr>
<td id="meniu" style="background-color:#FFD700;width:100px;vertical-
align:top;">

Meniul este generat de scriptul meniu.php care este inclus n


<?php
include("include/meniu.php");
?>
</td>
<td id="principal" style="background-color:#eeeeee;width:924px;vertical-
align:top;">

n pagin se afieaz un coninut diferit n funcie de opiunile selectate de


utilizator i de drepturile pe care la are acesta. Coninutul este generat de diverse
scripturi .php la care utilizatorul are acces n funcie de drepturile sale dup ce se va
nregistra cu nume i parol.
<?php

if(isset($_GET['optiune']) && $_GET['optiune']==1)


{
echo '<p> Ai selectat Obiecte de Inventar, marca=';
echo ($_SESSION['marca']);
echo '</p>';
include("af_mij_fix.php");
}

if(isset($_GET['optiune']) && $_GET['optiune']==2)


{
echo '<p> Ai selectat Situaie casri, marca=';
echo ($_SESSION['marca']);
echo '</p>';
include("af_casari.php");
}

if(isset($_GET['optiune']) && $_GET['optiune']==3)

include('frm_afisare_mf_cont.php');

if(isset($_GET['optiune']) && $_GET['optiune']==4)


{
include('frm_ad_mij_fix.php');
}

if(isset($_GET['optiune']) && $_GET['optiune']==5)


{
include("frm_utilizator.php");
}

if(isset($_GET['optiune']) && $_GET['optiune']==6)


{
echo '<p> Situaia propunerilor de casare:</p>';
include("af_casari_cont.php");
}

if(isset($_GET['optiune']) && $_GET['optiune']==7)


{
include("frm_schimbare.php");
}

if(isset($_GET['optiune']) && $_GET['optiune']==8)


{
echo '<p> Mijloace fixe casate. </p>';
include("mf_casate_cont.php");
}
?>

</td>
</tr>
<tr>
<td id="footer" colspan="2" style="background-color:#FFA500;text-
align:center;">
Copyright Marius Irinei</td>
</tr>
</table>

</body>
</html>

Fig. 3.4.1.1. Pagina index.php la deschiderea aplicaiei.

3.4.2. Scriptul meniu.php.


Scriptul meniu.php este un script complex care gestioneaz att conectarea
utilizatorului prin intermediul numelui de utilizator i al parolei ct i afiarea meniului
n funcie de drepturile pe care acesta le are.
Folosete codificarea UTF - 8 pentru a afia corect caracterele specifice limbii
romne.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

Se includ scripturile necesare pentru funcionarea corect a acestuia. Scriptul


session.php gestioneaz utilizarea sesiunii php care va conine datele despre utilizator
i drepturile acestuia. Scriptul db_connection.php gestioneaz conectarea la baza de
date. Scriptul functions.php gestioneaz funciile care vor fi folosite n simplificarea
unor comenzi. Scriptul functions_form.php gestioneaz funciiole folosite n tratarea
formularelor de introducere a datelor.
require_once("include/session.php");
require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

Dac formularul prin care utilizatorul se identific cu nume i parol a fost


trimis, se iniializeaz variabila $erori care va conine o matrice de mesaje referitoarte
la erorile aprute la tratarea formularului. Urmtorul pas verific dac s-au introdus
numele de utilizator i parola i le verific prin intermediul funciei
verificare_campuri_obligatorii definit n scriptul functions_form.php.
if (isset($_POST['trimite'])) // Dac formularul a fost trimis.
{
$erori = array();

// Validm datele din formular


$campuri_obligatorii = array('nume', 'parola');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii, $_POST));
$lungime_camp = array('nume' => 60, 'parola' => 60);
$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp, $_POST));

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

Dac nu se detecteaz erori, se caut n baza de date perechea nume/parol


corespunztoare utilizatorului, care trebuie s existe doar ntr-o singur nregistrare.
Dac exist erori se vor afia mesaje de atenionare specificndu-se exact unde este
localizat eroarea (de exemplu a fost introdus doar numele de utilizator, dar nu a fost
introdus parola).
if ( empty($erori) ) {
// Verificam baza de date pentru avedea daca numele si
parola exista.
$query = "SELECT id, marca, nume, drepturi ";
$query .= "FROM utilizatori ";
$query .= "WHERE nume = '{$nume}' ";
$query .= "AND parola = '{$parola_criptata}' ";
$query .= "LIMIT 1";
$result_set = mysql_query($query);
confirm_query($result_set);
if (mysql_num_rows($result_set) == 1) {
// numele si parola exista
// si avem o singura inregistrare care le contine pe
ambele
$utilizator_gasit = mysql_fetch_array($result_set);
$_SESSION['user_id'] = $utilizator_gasit['id'];
$_SESSION['marca']= $utilizator_gasit['marca'];
$marca= $utilizator_gasit['marca'];
$_SESSION['nume'] = $utilizator_gasit['nume'];
$_SESSION['drepturi']= $utilizator_gasit['drepturi'];
$drepturi= $utilizator_gasit['drepturi'];

} else {
// nu s-a gasit perechea nume - parola in baza de
date.
$mesaj = "Combinaia nume / parol, este incorect.";
}
} else {
if ((count($erori) == 1)&&(!logged_in())) {
$mesaj = "Este o eroare n formular.";
} else {
if(!logged_in())
$mesaj = "Sunt " . count($erori) . " erori n
formular.";
}
}

} else { // formularul nu a fost trimis.


if (isset($_GET['logout']) && $_GET['logout'] == 1) {
$mesaj = "Nu suntei autentificat.";
}
$nume = "";
$parola = "";
}
?>
Aceast poriune de cod afieaz formularul prin care se autentific utilizatoru
prin nume de utilizator i parol. Valorile introduce n casetele de text sunt tratate prin
intermediul funciei predefinite htmlentities pentru a evita vulnerabilitile de tip
Cross Site Scripting.
<form name="test" action="<?php echo htmlentities($_SERVER['PHP_SELF']); ?>"
method="post">

<table>
<tr>
<td>Nume:</td>
<td><input type="text" name="nume"
maxlength="30" value="<?php echo htmlentities($nume); ?>"/></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="trimite" value="Autentificare"/></td>
</tr>
</table>
</form>

<?php

if (!empty($mesaj)) {echo "<p class=\"mesaj\">" . $mesaj .


"</p>";}
if (!empty($erori)) { afiseaza_erori($erori); }

Dup ce utilizatorul a fost identificat, se afieaz meniul disponibil acestuia n


funcie de drepturile pe care le are i care sunt coninute n sesiunea php.
if (logged_in())
{

if ($_SESSION['drepturi']==1)
{
echo"
<b>Meniu</b><br>
<ul>
<li><a href='index.php?optiune=1'>Mijloace Fixe
n gestiune</a></li>
<li><a href='index.php?optiune=2'>Situaia
casrilor</a></li>
<li><a href='logout.php'>Ieire</a></li>
</ul>";
}

Fig. 3.4.2.1. Meniul afiat pentru un utilizator cu drepturi de gestionar.


if ($_SESSION['drepturi']==2)
{
echo"
<b>Meniu</b><br>
<ul>
<li><a href='index.php?optiune=3'>Afiare
Mijloace Fixe</a></li>
<li><a href='index.php?optiune=4'>Adaug
Mijloace Fixe</a></li>
<li><a href='index.php?optiune=6'>Afiare
propuneri de casare</a></li>
<li><a href='index.php?optiune=8'>Mijloace fixe
casate</a></li>
<li><a href='logout.php'>Ieire</a></li>
</ul>";
}

Fig. 3.4.2.2. Meniul afiat pentru un utilizator cu drepturi de contabil.


if ($_SESSION['drepturi']==3)
{
echo"
<b>Meniu</b><br>
<ul>
<li><a href='index.php?optiune=1'>Mijloace Fixe
n gestiune</a></li>
<li><a href='index.php?optiune=2'>Situaia
casrilor</a></li>
<li><a href='index.php?optiune=3'>Afiare
Mijloace Fixe</a></li>
<li><a href='index.php?optiune=4'>Adaug
Mijloace Fixe</a></li>
<li><a href='index.php?optiune=6'>Afiare
propuneri de casare</a></li>
<li><a href='index.php?optiune=8'>Mijloace fixe
casate</a></li>
<li><a href='index.php?optiune=5'>Adaug
utilizator nou</a></li>
<li><a href='index.php?optiune=7'>Schimbare
parole</a></li>
<li><a href='logout.php'>Ieire</a></li>
</ul>";
}

?>
Fig. 3.4.2.3. Meniul afiat pentru un utilizator cu drepturi de administrator.

3.4.3. Scriptul af_mij_fix.php.


Acest script afieaz mijloacele fixe aflate n gestiunea unui utilizator cu drepturi
de gestionar. Acest tip de utilizator poate doar s vizualizeze mijloacele fixe pe care le
are n gestiune, s fac propuneri de casare i s vizualizeze situaia mijloacelor fixe din
propria gestiune care au fost propuse la casare.
Mijloacele fixe pe care utilizatorul le are n gestiune sunt extrase din baza de date
n funcie de marca utilizatorului care este pstrat ca variabil n sesiunea php deschisa
la autentificare.

Fig. 3.4.3.1. Rezultatul executrii scriptului af_mij_fix.php.

<?php
require_once("include/session.php");
require_once("include/db_connection.php");

$marca=$_SESSION['marca'];
Datele referitoare la mijloacele fixe aflate n gestiunea utilizatorului sunt afiate
ntr-un table generat de script pe baza datelor extrase din baza de date MySQL.
$tabel_html = '';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Locaie';
$col_7='Prop. casare';

$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, locatie, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE (prop_cas='Nu' OR prop_cas='Da') AND marca = '{$marca}' ";
$query .= "ORDER BY nr_inv ASC";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['locatie']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';

n cazul n care utilizatorul nu are mijloace fixe n gestiune, se afieaz un mesaj.


De asemenea se afieaz un link spre scriptul afisarepdf.php care va genera un fisier
.pdf, afiat ntr-o fereastr separat a browserului, coninnd tabelul cu mijloacele fixe
aflate n gestiune, care poate fi salvat sau tiprit pentru a fi folosit ulterior.
}else{
echo 'Nu exist mijloace fixe n gestiune.';
}

// Se afiseaza codul tabelului HTML obtinut


echo $tabel_html;
echo'<br>';
echo'<a target="_blank" href="afisarepdf.php">Afiseaz PDF</a>';
?>

Aceast seciune de cod afieaz un formular prin care utilizatorul poate propune
pentru casare un mijloc fix, selectndu-l dintr-o list derulant. Aceast list derulant
conine numerele de inventar ale mijloacelor fixe aflate n gestiunea utilizatorului i
extrase din baza de date pe baza mrcii utilizatorului i n funcie de valoarea cmpului
prop_cas care specific dac mijlocul fix a fost casat sau nu. Mijloacele fixe deja casate
nu mai apar n aceast list.
<table id="propunecasare">
<tr>

<td id="formularpropcas">
<h2>Propunere pentru casare</h2>

<form action="prop_casare.php" method="post">


<table>
<tr>
<td>Numr de inventar:</td>
<td><select name="nr_inv">
<?php
$query2 = "SELECT nr_inv FROM mij_fix ";
$query2 .="WHERE (prop_cas='Nu' OR
prop_cas='Da') AND marca = '{$marca}' ";
$query2 .= "ORDER BY nr_inv ASC";
$rezultat = mysql_query($query2);
while ($lista_nr=mysql_fetch_array($rezultat)) {
$nr_inv=$lista_nr["nr_inv"];
echo "<option>".$nr_inv."</option>";
}
?>
</select></td>
</tr>
<tr>
<td><div align="center"><input type="submit"
name="trimite" value="Propune la casare" /></div></td>
</tr>
</table>
</form>
</td>
</tr>
</table>

3.4.4. Scriptul af_casari.php.


Acest script afieaz situaia casrilor mijloacelor fixe aflate n gestiunea unui
utilizator cu drepturi de gestionar.

Fig. 3.4.4.1. Rezultatul executrii scriptului af_casari.php.

Datele referitoare la situaia mijloacele fixe propuse la casare de ctre utilizator


sunt afiate ntr-un table generat de script pe baza datelor extrase din baza de date
MySQL. n cazul n care nu exist date despre mijloace fixe casate sau propuse la casare
se afieaz un mesaj. De asemenea tabelul generat de acest script poate fi afiat ntr-o
fereastr separat a browserului pentru a fi salvat sau tiprit la nevoie.

<?php
require_once("include/session.php");
require_once("include/db_connection.php");
$marca=$_SESSION['marca'];
$tabel_html = '';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Locaie';
$col_7='Prop. casare';

$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, locatie, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE (prop_cas='Da' OR prop_cas='Casat') AND marca = '{$marca}'
";
$query .= "ORDER BY nr_inv ASC";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['locatie']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';

}else{
echo 'Nu exist mijloace fixe casate sau propuse la casare.';
}

// Se afiseaza codul tabelului HTML obtinut


echo $tabel_html;
echo'<br>';
echo'<a target="_blank" href="afisarepdf_cas.php">Afiseaz PDF</a>';
?>

3.4.5. Pagina frm_afisare_mf_cont.php.


Aceast pagin afieaz dou formulare accesibile unui utilizator cu drepturi de
contabil, prin intermediul cruia se pot afia mijloacele fixe din gestiunea oricrui
gestionar n funcie de marca acestuia sau de tipul mijlocului fix selectat.
Fig. 3.4.5.1. Pagina frm_afisare_mf_cont.php.

Mrcile gestionarilor sunt extrase din baza de date i sunt afiate ntr-o list
derulant din care pot fi selectate. De asemenea tipurile de mijloace fixe se selecteaz
dintr-o list derulant. Rezultatul cutrii n funcie de criteriul de cutare selectat sunt
afiate direct sub form de tabel n fiiere .pdf care se vor deschide n ferestre separate
ale browserului.

<p>Afieaz lista mijloacelor fixe n funcie de marc.</p>


<form name="af_mf_cont" action="afisarepdf_cont.php" method="post">

<table>

<tr>
<td>Marca</td>
<td><select name="marca">
<?php
$query2 = "SELECT marca FROM utilizatori ORDER BY marca ASC";
$rezultat = mysql_query($query2);
while ($lista_marci=mysql_fetch_array($rezultat)) {
$marca=$lista_marci["marca"];
echo "<option>".$marca."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="trimite1"
value="Afisare" onclick="this.form.target='_blank';return true;"/></td>
</tr>
</table>

</form>

<p>Afieaz lista mijloacelor fixe n funcie de tip.</p>


<form name="ad_ob_inv" action="afisarepdf_cont_tip.php" method="post">

<table>

<tr>
<td>Tip</td>
<td><select name="tip">
<option value="Calculator">Calculator</option>
<option value="Imprimant">Imprimant</option>
<option value="Laptop">Laptop</option>
<option value="Periferice">Periferice</option>
<option value="Reelistic">Reelistic</option>
<option value="Tablet">Tablet</option>
<option value="Videoproiector">Videoproiector</option>
</select>
</td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="trimite2"
value="Afisare" onclick="this.form.target='_blank';return true;"/></td>
</tr>
</table>

</form>

3.4.6. Pagina frm_ad_mij_fix.php.


Aceast pagin afieaz un formular accesibil unui utilizator cu drepturi de
contabil, prin intermediul cruia se pot aduga mijloacele fixe n gestiunea oricrui
gestionar.
Mrcile gestionarilor sunt extrase din baza de date i sunt afiate ntr-o list
derulant din care pot fi selectate. De asemenea tipurile de mijloace fixe se selecteaz
dintr-o list derulant.

Fig. 3.4.6.1. Pagina frm_ad_mij_fix.php.

<form name="ad_ob_inv" action="ad_mij_fix.php" method="post">

<table>
<tr>
<td>Nr. inventar:</td>
<td><input type="text" name="nr_inv" maxlength="11" value="<?php
echo htmlentities($nr_inv); ?>"/></td>
</tr>
<tr>
<td>Tip</td>
<td><select name="tip">
<option value="Calculator">Calculator</option>
<option value="Imprimant">Imprimant</option>
<option value="Laptop">Laptop</option>
<option value="Periferice">Periferice</option>
<option value="Reelistic">Reelistic</option>
<option value="Tablet">Tablet</option>
<option value="Videoproiector">Videoproiector</option>
</select>
</td>
</tr>
<tr>
<td>Denumire:</td>
<td><input type="text" name="denumire" size="100" maxlength="255"
value="<?php echo htmlentities($denumire); ?>"/></td>
</tr>
<tr>
<td>Marca</td>
<td><select name="marca">
<?php
$query2 = "SELECT marca FROM utilizatori ORDER BY marca ASC";
$rezultat = mysql_query($query2);
while ($lista_marci=mysql_fetch_array($rezultat)) {
$marca=$lista_marci["marca"];
echo "<option>".$marca."</option>";
}
?>
</select>
</td>
</tr>
<tr>
<td>Valoare de intrare</td>
<td><input type="text" name="val_int" maxlength="11" value="<?php
echo htmlentities($val_int);?>"/></td>
</tr>
<tr>
<td>Data punerii n funciune</td>
<td><input type="text" name="d_p_f" maxlength="10" value="<?php
echo htmlentities($d_p_f);?>"/></td>
</tr>
<tr>
<td>Data expirrii</td>
<td><input type="text" name="d_ex" maxlength="10" value="<?php
echo htmlentities($d_ex);?>"/></td>
</tr>
<tr>
<td>Locaie</td>
<td><input type="text" name="locatie" size="100" maxlength="255"
value="<?php echo htmlentities($locatie);?>"/></td>
</tr>
<tr>
<td colspan="2"><input type="submit" name="trimite"
value="Introducere"/></td>
</tr>
</table>

</form>

3.4.7. Scriptul af_casari_cont.php.


Acest script este disponibil numai utilizatorilor cu drepturi de contabil i afieaz
un tabel n care sunt prezentate mijloacele fixe propuse la casare de ctre gestionari. De
asemenea se afieaz i un formular prin care utilizatorul cu drepturi de contabil poate
confirma casarea mijloacelor fixe.
Fig. 3.4.7.1. Datele afiate de scriptul af_casari_cont.php.
i tabelul generat de acest script poate fi afiat ntr-o fereastr separat a
browserului ntr-un fiier .pdf pentru a fi salvat sau tiprit la nevoie.
Variabilele din care se construiete tabelul care va afia datele
$tabel_html = '';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Marca';
$col_7='Prop. casare';

Se extrag datele din baza de date i dac exist date de afiat, se genereaz tabelul
HTML.

$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, marca, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE prop_cas='Da' ";
$query .= "ORDER BY nr_inv ASC";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['marca']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';

Dac nu exist date de afiat, se afieaz un mesaj.


}else{
echo 'Nu exist mijloace fixe propuse la casare.';
}

// Se afiseaza codul tabelului HTML obtinut


echo $tabel_html;
echo'<br>';

Link spre scriptul care va genera fiierul .pdf.


echo'<a target="_blank" href="afisarepdf_cas_cont.php">Afiseaz PDF</a>';
?>

Formularul prin care se pot confirma casrile mijloacelor fixe n funcie de


numrul de inventar.
<table id="conf_casare">
<tr>

<td id="conf_cas">
<h2>Confirmare casare</h2>

<form action="conf_casare.php" method="post">


<table>
<tr>
<td>Numr de inventar:</td>
<td><select name="nr_inv">
<?php
$query2 = "SELECT nr_inv FROM mij_fix ";
$query2 .="WHERE prop_cas = 'Da' ";
$query2 .= "ORDER BY nr_inv ASC";
$rezultat = mysql_query($query2);
while ($lista_nr=mysql_fetch_array($rezultat)) {
$nr_inv=$lista_nr["nr_inv"];
echo "<option>".$nr_inv."</option>";
}
?>
</select></td>
</tr>
<tr>
<td><div align="center"><input type="submit"
name="trimite" value="Confirm casarea" /></div></td>
</tr>
</table>
</form>
</td>
</tr>
</table>

3.4.8. Scriptul mf_casate_cont.php.


Acest script este disponibil numai utilizatorilor cu drepturi de contabil i afieaz
un tabel n care sunt prezentate mijloacele fixe casate.
Fig. 3.4.8.1. Datele afiate de scriptul mf_casate_cont.php.
<?php
require_once("include/session.php");
require_once("include/db_connection.php");

$tabel_html = '';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Marca';
$col_7='Prop. casare';

$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, marca, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE prop_cas='Casat' ";
$query .= "ORDER BY nr_inv ASC";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['marca']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';

}else{
echo 'Nu exist mijloace fixe casate.';
}

// Se afiseaza codul tabelului HTML obtinut


echo $tabel_html;

?>
<table id="conf_casare">
<tr>

<td id="conf_cas">
<h2>tergere mijloace fixe casate</h2>

<form action="del_cas.php" method="post">


<table>
<tr>
<td>Numr de inventar:</td>
<td><select name="nr_inv">
<?php
$query2 = "SELECT nr_inv FROM mij_fix ";
$query2 .="WHERE prop_cas = 'Casat' ";
$query2 .= "ORDER BY nr_inv ASC";
$rezultat = mysql_query($query2);
while ($lista_nr=mysql_fetch_array($rezultat)) {
$nr_inv=$lista_nr["nr_inv"];
echo "<option>".$nr_inv."</option>";
}
?>
</select></td>
</tr>
<tr>
<td><div align="center"><input type="submit"
name="trimite" value="terge din baza de date" /></div></td>
</tr>
</table>
</form>
</td>
</tr>
</table>

3.4.9. Pagina frm_utilizator.php.


Aceast pagin este disponibil doar utilizatorilor cu drept de administrator i
afieaz un formular prin intermediul cruia se creeaz un utilizator nou. Doar
administratorul aplicaiei poate crea utilizatori noi sau schimba parolele acestora.

Fig. 3.4.9.1. Pagina frm_utilizator.php.


<table id="utilizatornou">
<tr>

<td id="formularadaugare">
<h2>Creaz utilizator nou</h2>

<form action="utilizator_nou.php" method="post">


<table>
<tr>
<td>Nume:</td>
<td><input type="text" name="nume" maxlength="30"/></td>
</tr>
<tr>
<td>Marca:</td>
<td><input type="text" name="marca" maxlength="30"/></td>
</tr>
<tr>
<td>Parola:</td>
<td><input type="password" name="parola"
maxlength="30"/></td>
</tr>
<tr>
<td>Drepturi:</td>
<td>
<select name="drepturi">
<option value="1">Gestionar</option>
<option value="2">Contabil</option>
<option value="3">Administrator</option>
</select>
</td>
</tr>
<tr>
<td><div align="center"><input type="submit" name="submit"
value="Creaz utilizator" /></div></td>
</tr>
</table>
</form>
</td>
</tr>
</table>

3.4.10. Pagina frm_schimbare.php.


Aceast pagin este disponibil doar utilizatorilor cu drept de administrator i
afieaz un formular prin intermediul cruia se poate schimba parola unui utilizator.
Doar administratorul aplicaiei poate crea utilizatori noi sau schimba parolele acestora.
Fig. 3.4.10.1. Pagina frm_schimbare.php.
Numele utilizatorului cruia i se schimb parola este selectat dintr-o list
derulant care conine doar numele de utilizator extrase din baza de date.

<td id="formularschimbare">
<h2>Schimbare parol</h2>

<form action="schimbare_parola.php" method="post">


<table>
<tr>
<td>Nume utilizator:</td>
<td><select name="nume">
<?php
$query2 = "SELECT nume FROM utilizatori";
$rezultat = mysql_query($query2);
while ($lista_nume=mysql_fetch_array($rezultat)) {
$nume=$lista_nume["nume"];
echo "<option>".$nume."</option>";
}
?>
</select></td>
</tr>
<tr>
<td>Parola nou:</td>
<td><input type="text" name="parola"
maxlength="60"/></td>
</tr>
<tr>
<td><div align="center"><input type="submit"
name="trimite" value="Schimb parola" /></div></td>
</tr>
</table>
</form>
</td>
</tr>

3.4.11. Scriptul logout.php.


Acest script gestioneaz delogarea utilizatorului. Acest lucru se realizeaz n
patru pai:
Pentru nceput se include scriptul functions.php n care este declarat funcia
redirecteaza_la
<?php require_once("include/functions.php"); ?>
<?php
Se gsete sesiunea

session_start();

se reseteaz variabilele coninute n sesiune

$_SESSION = array();

se distruge cookie-ul sesiunii

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

se distruge sesiunea
session_destroy();

se redirecteaz browserul la pagina index.php.

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

3.4.12. Scriptul prop_casare.php.


Acest script proceseaz datele din formularul formularpropcas din pagina
af_mij_fix.php prin intermediul cruia un utilizator cu drepturi de gestionar propune
mijloace fixe pentru casare.
n locul meniului standard, acest script afieaz un singur link care duce napoi n
pagina af_mij_fix.php
<td id="meniu" style="background-color:#FFD700;width:100px;vertical-
align:top;">
<ul>
<li><a href="index.php?optiune=1">napoi</a></li>
</ul>
</td>

se includ scripturile necesare pentru tratarea datelor primite de la formular


<?php
require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

// Procesarea formularului
if (isset($_POST['trimite'])) // Dac formularul a fost trimis.
{

$nr_inv = trim(structurare_date_mysql($_POST['nr_inv']));

se modific valoarea coloanei prop_cas n Da pentru nregistrarea


corespunztoare numrului de inventar selectat
$query = "UPDATE mij_fix ";
$query .= "SET prop_cas='Da'";
$query .= "WHERE nr_inv = '$nr_inv'";
$result = mysql_query($query, $connection);
if ($result) {
$mesaj = "Operaiunea a fost efectuat cu
succes.";
} else {
$mesaj = "NU s-a efectuat operaiunea!";
$mesaj .= "<br />" . mysql_error();
}
}
echo $mesaj;

?>
</td>
</tr>

i se afieaz un mesaj referitor la succesul operaiunii.

3.4.13. Scriptul ad_mij_fix.php.


Acest script proceseaz datele din formularul din pagina frm_ad_mij_fix.php
prin intermediul cruia un utilizator cu drepturi de contabil poate aduga mijloace fixe
n gestiunea unui gestionar.
n locul meniului standard, acest script afieaz un singur link care duce napoi n
pagina frm_ad_mij_fix.php

<tr>
<td id="meniu" style="background-color:#FFD700;width:100px;vertical-
align:top;">
<ul>
<li><a href="index.php?optiune=4">napoi</a></li>
</ul>
</td>
se includ scripturile necesare pentru tratarea datelor primite de la formular
<?php
require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

se proceseaz datele primite de la formular

if (isset($_POST['trimite'])) // Dac formularul a fost trimis.


{
$erori = array();

// Validm datele din formular


$campuri_obligatorii = array('nr_inv', 'denumire', 'marca',
'val_int', 'd_p_f', 'd_ex', 'locatie');
$erori = array_merge($erori,
verificare_campuri_obligatorii($campuri_obligatorii, $_POST));

$lungime_camp = array('nr_inv' => 11, 'denumire' => 255, 'marca'


=> 11, 'val_int' => 13, 'd_p_f' => 10, 'd_ex' => 10, 'locatie' => 255);
$erori = array_merge($erori,
verificare_lungime_maxima($lungime_camp, $_POST));
$nr_inv=intval($_POST['nr_inv']);
$tip = trim(structurare_date_mysql($_POST['tip']));
$denumire = trim(structurare_date_mysql($_POST['denumire']));
$marca=trim(structurare_date_mysql($_POST['marca']));
$val_int=trim(structurare_date_mysql($_POST['val_int']));
$d_p_f=trim(structurare_date_mysql($_POST['d_p_f']));
$d_ex=trim(structurare_date_mysql($_POST['d_ex']));
$locatie = trim(structurare_date_mysql($_POST['locatie']));

if ( empty($erori) ) {

se verific dac numrul de inventar propus pentru mijlocul fix ce va fi


introdus, este atribuit deja unui alt mijloc fix existent

$query = "SELECT denumire, marca, locatie ";


$query .= "FROM mij_fix ";
$query .= "WHERE nr_inv = '{$nr_inv}' ";
$query .= "LIMIT 1";
$result_set = mysql_query($query);
confirm_query($result_set);
if (mysql_num_rows($result_set) == 1)
{
$mesaj='Numrul de invetar introdus exist deja!';

dac numrul de inventar este corect se adaug nregistrarea n baza de date


}else{
$query = "INSERT INTO mij_fix (
nr_inv, tip, denumire, marca, val_int, d_p_f, d_ex, locatie
) VALUES (
'{$nr_inv}', '{$tip}', '{$denumire}', '{$marca}',
'{$val_int}', STR_TO_DATE('{$d_p_f}','%d-%m-%Y'), STR_TO_DATE('{$d_ex}','%d-
%m-%Y'), '{$locatie}'
)";
$result = mysql_query($query, $connection);
if ($result) {
$mesaj = "Obiectul de inventar a fost introdus cu succes.";
} else {
$mesaj = "NU s-a introdus obiectul de inventar!";
$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.";
}
}
}
echo $mesaj;

?>
</td>
</tr>

i se afieaz un mesaj referitor la succesul operaiunii.


3.4.14. Scriptul conf_casare.php.
Acest script proceseaz datele din formularul din pagina af_casari_cont.php
prin intermediul cruia un utilizator cu drepturi de contabil poate confirma casarea
unui mijloc fix propus la casare.
n locul meniului standard, acest script afieaz un singur link care duce napoi n
pagina af_casari_cont.php
<tr>
<td id="meniu" style="background-color:#FFD700;width:100px;vertical-
align:top;">
<ul>
<li><a href="index.php?optiune=6">napoi</a></li>
</ul>
</td>

se includ scripturile necesare pentru tratarea datelor primite de la formular


<?php
require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

se proceseaz datele primite de la formular

if (isset($_POST['trimite'])) // Dac formularul a fost trimis.


{

$nr_inv = trim(structurare_date_mysql($_POST['nr_inv']));

se modific valoarea coloanei prop_cas n Casat pentru nregistrarea


corespunztoare numrului de inventar selectat

$query = "UPDATE mij_fix ";


$query .= "SET prop_cas='Casat'";
$query .= "WHERE nr_inv = '$nr_inv'";
$result = mysql_query($query, $connection);
if ($result) {
$mesaj = "Operaiunea a fost efectuat cu succes.";
} else {
$mesaj = "NU s-a efectuat operaiunea!";
$mesaj .= "<br />" . mysql_error();
}
}
echo $mesaj;

?>

i se afieaz un mesaj referitor la succesul operaiunii.

3.4.15. Scriptul utilizator_nou.php.


Acest script proceseaz datele din formularul din pagina frm_utilizator.php
prin intermediul cruia un utilizator cu drepturi de administrator poate crea un
utilizator nou.
se includ scripturile necesare pentru tratarea datelor primite de la formular
<?php require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

// Start procesare formular


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

se proceseaz datele primite de la formular

// validm datele din formular


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

$lungime_camp = array('marca' =>11, 'nume' => 30, 'parola' =>


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

$marca = trim(structurare_date_mysql($_POST['marca']));
$marca_int = intval($marca);
$nume = trim(structurare_date_mysql($_POST['nume']));
$parola = trim(structurare_date_mysql($_POST['parola']));
$parola_criptata = sha1($parola);
$drepturi=intval($_POST['drepturi']);

dac nu exist erori se creeaz utilizatorul n baza de date


if ( empty($erori) ) {
$query = "INSERT INTO utilizatori (
marca, nume, parola, drepturi
) VALUES (
'{$marca_int}', '{$nume}',
'{$parola_criptata}', '{$drepturi}'
)";
$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.
$nume = "";
$parola = "";
}
redirecteaza_la('index.php?optiune=5');
?>

i se redirecteaz browserul la pagina frm_utilizator.php.


3.4.16. Scriptul schimbare_parola.php.
Acest script proceseaz datele din formularul din pagina frm_schimbare.php
prin intermediul cruia un utilizator cu drepturi de administrator poate schimba parola
uni utilizator.
se includ scripturile necesare pentru tratarea datelor primite de la formular

<?php
require_once("include/db_connection.php");
require_once("include/functions.php");
include_once("include/functions_form.php");

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

se proceseaz datele primite de la formular


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

$lungime_camp = array('nume' => 60, 'parola' => 60);


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

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

if ( empty($erori) ) {

dac nu sunt erori se modific valoarea coloanei parola cu variabila


$parola_criptata care conine noua parol pentru nregistrarea corespunztoare
numelui de utilizator selectat

$query = "UPDATE utilizatori ";


$query .= "SET parola='$parola_criptata'";
$query .= "WHERE nume = '$nume'";
$result = mysql_query($query, $connection);
if ($result) {
$mesaj = "Parola a fost schimbat cu succes.";
} else {
$mesaj = "NU s-a putut schimba parola!";
$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.";
}
}

echo $mesaj;

}
?>

i se afieaz un mesaj referitor la succesul operaiunii.

3.4.17. Scripturile de generare ale fiierelor .pdf.


Scripturile de generare ale fiierelor .pdf folosite n aceast aplicaie sunt:
afisarepdf.php - activat din pagina af_mij_fix.php
afisarepdf_cas.php - activat din pagina af_casari.php
afisarepdf_cas_cont.php - activat din pagina af_casari_cont.php
afisarepdf_cont.php - activat din pagina frm_afisare_mf_cont.php
afisarepdf_cont_tip.php - activat din pagina
frm_afisare_mf_cont.php

Aceste scripturi de generare ale fiierelor .pdf sunt n mare parte identice,
majoritatea liniilor de cod din care sunt compuse fiind funcii predefinite ale clasei PHP
tcpdf. n afar de acestea, fiecare script de generare a fiierelor .pdf mai conine o serie
de linii de cod prin care se extrag datele necesare din baza de date i se genereaz tabelul
HTML n care acestea sunt afiate. Aceste poriuni de cod sunt n general identice cu
cele din scripturile care afieaz datele respective n browser.
De exemplu scriptul afisarepdf.php care genereaz fiierul .pdf care conine
tabelul cu mijloacele fixe aflate n gestiunea unui utilizator cu drepturi de gestionar care
este afiat de scriptul af_mij_fix.php, conine o copie a acestui script integrat n
seciunea special destinat acestui lucru.
Difer totui scripturile afisarepdf_cont.php i afisarepdf_cont_tip.php
deoarece sunt activate dintr-o pagin care afieaz tabelele cu date direct n fiiere .pdf,
fr a mai fi afiate i n pagina respectiv. Mai jos se pot vedea poriunile de cod care
genereaz tabelele din cele dou scripturi.
3.4.17.1. Scriptul afisarepdf_cont.php
***
se includ scripturile necesare pentru tratarea datelor primite de la formular
require_once("include/functions.php");
include_once("include/functions_form.php");

se proceseaz datele primite de la formular i se iniializeaz variabilele


necesare pentru generarea tabelului HTML
$marca=trim(structurare_date_mysql($_POST['marca']));
$eticheta='Mijloace fixe ';
$eticheta .='n gestiunea angajatului cu ';
$eticheta .=' marca = ';
$eticheta .=$marca;
$eticheta .='<p>&nbsp;</p>';
$tabel_html ='';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Locaie';
$col_7='Prop. casare';
$mesaj='';

se extrag datele din baza de date i dac exist date de afiat, se genereaz
tabelul HTML

$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, locatie, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE marca = '{$marca}' ";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['locatie']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';
}else{
$mesaj='Nu exist mijloace fixe n gestiune.';
}

***
3.4.17.2. Scriptul afisarepdf_cont_tip.php
***
se includ scripturile necesare pentru tratarea datelor primite de la formular
require_once("include/functions.php");
include_once("include/functions_form.php");

se proceseaz datele primite de la formular i se iniializeaz variabilele


necesare pentru generarea tabelului HTML
$tip=trim(structurare_date_mysql($_POST['tip']));
$eticheta='Mijloace fixe ';
$eticheta .='de tipul ';
$eticheta .=$tip;
$eticheta .='<p>&nbsp;</p>';
$tabel_html ='';
$col_1='Nr. INV.';
$col_2='Denumire';
$col_3='Val. Intrare';
$col_4='Data PF ';
$col_5='Data Exp.';
$col_6='Gestionar';
$col_7='Prop. casare';
$mesaj='';

se extrag datele din baza de date i dac exist date de afiat, se genereaz
tabelul HTML
$query = "SELECT nr_inv, denumire, val_int, d_p_f, d_ex, marca, prop_cas ";
$query .= "FROM mij_fix ";
$query .= "WHERE tip = '{$tip}' ";
$query .= "ORDER BY nr_inv ASC";
$result_set = mysql_query($query);
if(!$result_set) die ('Unable to run query:'.mysql_error());
// Daca sunt returnate randuri de tabel
if(mysql_num_rows($result_set) > 0) {
// Se creaza codul pt. inceputul tabelului HTML
$tabel_html = '<table align = "center" border="1">';
$tabel_html .= '<tr><td>' .$col_1. '</td><td>' .$col_2. '</td><td>' .
$col_3. '</td><td>' .$col_4. '</td><td>' .$col_5. '</td><td>' .$col_6.
'</td><td>' .$col_7. '</td></tr>';
// Se scrie in bucla WHILE codul HTML pt. adaugarea DOAR a randurilor ce
vor fi in tabel
while($rand = mysql_fetch_array($result_set)) {
$tabel_html .= '<tr><td>' .$rand['nr_inv']. '</td><td>' .
$rand['denumire']. '</td><td>' .$rand['val_int']. '</td><td>' .date('d-m-
Y',strtotime($rand['d_p_f'])). '</td><td>' .date('d-m-
Y',strtotime($rand['d_ex'])). '</td><td>' .$rand['marca']. '</td><td>' .
$rand['prop_cas']. '</td></tr>';
}

// Se adauga (dupa terminarea lui WHILE) inchiderea tabelului HTML


$tabel_html .= '</table>';
}else{
$mesaj='Nu exist mijloace fixe de acest tip.';
}

***
Bibliografie

1. Curs Tehnologii WEB, Ionel Muscalagiu


2. Crearea paginilor WEB, Sabin Buraga, Ed. Polirom Iai,
2002
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.w3schools.com/
6. www.php.net/manual/
7. www.mysql.com/docs/
8. www.apache.org/docs/