Condu afacerea ta online [619536]

Laura Cruceat
Condu afacerea ta online
Ghid de proiectare a unui magazin virtual

Laura Cruceat

Condu afacerea ta online
Ghid de proiectare a unui magazin virtual

Titlul: Condu afacerea ta online.
Ghid de proiectare a unui magazin vi rtual

Copyright © 2017

ISBN 978 -606-616-265-4

Referent științific:

Descrierea CIP a Bibliotecii Naționale a României

CRUCEAT, LAURA
Condu afacerea ta online. Ghid de proiectare a unui
magazin virtual / Laura Cruceat. – Sibiu : Techno Media,
2017
Bibliogr.
ISBN 978 -606-616-265-4

CUPRINS

INTRODUCERE ………………………….. ………………………….. ………………….. 1
CAPITOLUL I CONCEPTU L DE FIRMĂ DE EXERCI ȚIU ………….. 3
1.1. CE ESTE O FIRMĂ DE EXERCIȚIU ………………………….. …………………… 3
1.2. ACTIVITATEA ÎN FIRMA DE EXERCIȚIU ………………………….. ………….. 4
1.3. UTILIZAREA INTERNETULUI ÎN FIRMA DE EXERCIȚIU …………………… 5
CAPITOLUL II – PAGINI WEB TEHNOLOG II SI INSTRUMENTE
INFORMATICE UTILIZA TE ÎN DEZVOLTAREA AP LICAȚIEI .. 8
2.1. NOȚIUNI GENERALE ………………………….. ………………………….. ………. 8
2.2. SERVERUL APACHE ………………………….. ………………………….. ……….. 10
2.3. LIMBAJUL PHP ………………………….. ………………………….. …………….. 11
2.4. BAZA DE DATE MYSQL ………………………….. ………………………….. ….. 20
CAPITOLUL III – PROIECTAREA UNUI MAG AZIN VIRTUAL …. 24
3.1. ANALIZA CERINȚELOR , OBIECTIVE ………………………….. ……………….. 24
3.2. PROIECTAREA SOLUȚIEI SOFTWARE ………………………….. ……………… 25
3.2.1. Elemente inițiale ………………………….. ………………………….. ……. 25
3.2.2. Autentificarea utilizatorilor ………………………….. …………………. 28
3.2.3. Catalogul de produse și servicii ………………………….. …………… 41
3.2.4. Coș ul de cumpărături ………………………….. …………………………. 48
3.2.5. Generarea facturii ………………………….. ………………………….. …. 59
3.2.6. Căutarea produselor în site ………………………….. …………………. 67
3.2.7. Topul produselor vândute ………………………….. …………………… 71
3.3. ADMINISTRAREA APLICAȚ IEI ………………………….. ………………………. 74
CONCLUZIE ………………………….. ………………………….. ……………………….. 91
BIBLIOGRAFIE ………………………….. ………………………….. ………………….. 92
ANEXA ………………………….. ………………………….. ………………………….. ……. 93

1 Introducere

Progres ul marcant care se înregistrează în domeni ul Teh-
nologie i Informației ma rchează în mod semnificativ modul de
viață al popula ției globului. Explozia Internetului, apariția și dez-
voltarea conceptului de comerț electronic au produs modific ări
semnificative în peisajul economic mondial. În zilele noastre,
afacerile conduse online permit gestiona rea mai facilă a relațiilor
între parteneri și clienți, dar și urmărirea în timp real a ten-
dințelor pieței.
Lucrarea de fa ță își propune să implementeze o aplicație
de comerț electronic pentru firmele de exercițiu , cu ajutorul pa-
ginilor web dinamic e. Ideea subiectului acestei lucrări a venit în
mod natural. În liceele cu profil economic , a fost implementată
o nouă metodă de predare -învățare centrată pe elevi , firma de
exercițiu. În cadrul activității pe care o desfășoară elevii trebuie
să rea lizeze și un site web al firmei care să îi ajute în promovarea
imaginii firmei și în acțiunile comerciale pe care aceasta le între-
prinde. Dacă prin natura programei de informatică elevii pot
obține unele cunoștințe referitoare la realizarea unor pagini web
statice, necesitatea dezvoltării unui magazin virtual al firm ei nu
a putut fi asigurată prin conținuturile acestei programe. Am con-
statat o mare dorință a elevilor de a construi un astfel de site
dinamic. Aceasta pentru că au observat site -urile firmelor reale
și au dorit ca și site -ul lor să fie unul cu adevărat profesional,
prin care să se realizeze o comunicare rapidă cu clienții firmei,
să se permită gestionarea rapidă și eficientă a tranzacțiilor și nu
în ultimul rând să se evidențieze dintre site -urile altor firme de
exercițiu în vederea participărilor la târguri naționale și inter-
naționale .
Această lucrare permite învățarea noțiunilor necesare
utilizării programelor de tip client -server de realizare a paginilor
web dinamice și este structurat ă pe trei capitole.
În capitolul I am prezentat conceptul de firmă de
exercițiu , arătând pe scurt activitatea pe care o presupune
aceasta , cu accent pe elementele online utilizate în cadrul ei .
Capitolul II conține elemente ce caracterizează triada
Apache + MySQL + PHP pe care am ales -o în implementarea
aplicației de comerț electronic realizate . Am arătat aici și modul

2 lor de instalare precum și programe le anexe pe care le -am uti-
lizat. Totodată am inclus funcțiile și comenzile cele mai impor-
tante din limbajele PHP și MySQL pe care le -am folosit în scrip-
turile pentru implementarea aplicației.
Capitolul al III -lea l-am alcătuit pe baza studiului moda-
lității de realizare a unui magazin virtual . Am arătat meca-
nismele economice care stau la baza funcționării unei aplica ții
de comerț electronic și modalitatea de implementare a lor în
limbajul PHP. Am proiectat baza de date care gestionează
conținutul magazinului virtual pentru produse de birou (mobi-
lier, electronice și papetărie) și am realizat o schemă a magazi-
nului virt ual care să ajute la obținerea unei imagini de ansamblu
și la realizarea legăturilor între modulele site -ului. Apoi am des-
cris, folosind capturi din site și codul comentat PHP, operațiile
de autentificare a utilizatorilor site -ului, de afișare a catalogulu i
virtual cu posibilitatea de adăugare a articolelor într -un coș de
cumpărături și gestionarea acestuia. Am implementat un modul
pentru generarea unei facturi proforme pe care utilizatorul să o
poată descărca de pe site . Pentru aceasta am folosi t funcțiile
bibliotecii PdfLib care pot fi utilizate în PHP datorită suportului
oferit de acesta în crearea documentelor PDF . O parte impor-
tantă pe care am descris -o în capitolul III este modulu l de ad-
ministrare a site -ului. Acesta permite administratorului să ada-
uge noi produse/ categorii în catalogul virtual, precum și să mo-
difice oric e date referitoare la ele ș i chiar să le șteargă . Toate
acestea sunt posibile datorită utilizării variabilelor de sesiune
care rețin numele utilizatorului și operațiile pe care acesta le
face. Dacă utilizatorul nu se conectează are doar posibilitatea de
a vizualiza catalogul virtual de produse al firmei.
Doresc ca această lucrare să fie de folos acelora care do-
resc să își realizeze propriul magazin virtual, dar și în activitatea
didact ică tuturor profesorilor de informatică ce vor dori să în-
drume elevii în implementarea unei pagini web dinamice, folo-
sind metodele prezentate aici, atât în cadrul firmelor de exercițiu
cât și în cadrul cursurilor din trunchiul comun sau CDȘ în funcție
de profilul clasei .
Autorul

3 CAPITOLUL I
Conceptul de Firmă de Exercițiu

1.1. Ce este o firmă de exercițiu
Firma de exerci țiu este o metod ă practic ă de simulare a
activităților unei firme reale în scop didactic.
Prin proiectul Eco Net, finanțat de Ministerul Afacer ilor Ex-
terne din Austria și pus în practică de organizația Kultur Kontakt,
s-a reali zat implementarea Firmei de Exercițiu ca metodă di-
dactică în școlile românești cu profil economic. Această metodă
este un pas uriaș în pregătirea practică a elevilor la un nivel
superior.
Instruirea în firma de exerci țiu determină o aprofundare a
cunoștintelor deja dob ândite, fiind continuarea fireasc ă și
necesar ă a instruirii de baz ă. În firma de exercițiu se realizeaz ă
sinergia interdisciplinarit ății con ținuturilor de la d iverse disci-
pline: economie, contabilitate, coresponden ță comercial ă, limbi
străine, informatic ă, drept și legisla ție, marketing, determin ând
astfel dobândirea de abilit ăți antreprenoriale, perfec ționarea
comportamentelor personale și identificarea poten țialului pro-
priu al elevilor.
Firma de exercițiu este o metod ă conceput ă pentru for-
marea aptitudinilor personale și comportamentelor aplicabile în
toate domeniile economice, pornind de la func țiile de baz ă și
până la cele de conducere din intreprindere.
In firmele de exercițiu elevii se comport ă ca sefi sau an-
gajati responsabili și isi educ ă și formeaza spiritul de intreprin-
zator. Aici sunt exersate tranzacti ile economice existente în
firmele reale, fiecare firma de exercițiu fiind structurat ă în con-
formita te cu situatia din practic ă, în departamente: secretariat ,
financiar -contabil , marketing , resurse umane, etc.
Firmele de exercițiu lucrează pe piața natională a firmelor
de exercițiu cu alte firme de exercițiu din țară și cu o centrală a
firmelor de exerc ițiu, precum și pe piața internațională a firmelor
de exercițiu cu firme de exercițiu din străinătate.
Centrala firmelor de exercițiu simulează serviciile de circu-
lație a plăților(ex. Banca virtuală), serviciile de Finanțe, Asig-
urări Sociale, Registrul C omerțului și monitorizează desfășu-
rarea t ârgurilor firmelor de exercițiu.

4 Legătura cu firme de exercițiu din străinătate dezvoltă
competențele lingvistice ale elevilor și le arată acestora
diferențele sociale, culturale și economice. Toate acestea asig-
ură o bază valoroasă pentru activitatea profesională ulterioară .
Competențele specifice care se pot obține prin utilizarea
acestei metode de predare -învățare centrate pe elev sunt
următoarele:
• Bucuria de a stabili contacte
• Atitudine sigură
• Acțiune autonomă
• Capacitate de adaptare
• Bucuria de a lua decizii
• Sentimentul răspunderii
• Ințelegere
• Spirit de echipă
• Grijă
• Talent de organizare
• Capacitatea de a -și asuma sarcini
În fiecare an s -au înregistrat la departamentul de coordo-
nare al firmelor de exercițiu, între 200 și 400 de firme. Dintre
acestea foarte multe și -au organizat sta nduri la târgurile care
au avut loc atât în România (Brăila, Timișoara, București) cât și
în străinătate (Austria, Bulgaria, Cehia, Croația, slovacia, Unga-
ria și Statele Unite) .
Firma de exercițiu – complex ă ca metod ă , motiva ntă ca
efecte – este o provocare atractiv ă atat pentru elevi câ t și pentru
profesori.

1.2. Activitatea în firma de exercițiu
Activitatea firmelor de exercițiu se desfasoar ă după mode-
lul firmelor reale, ținând cont de speci ficațiile l egislatiei în
vigoare .
Toate documentele emise la centrala firmelor de exercițiu
și la firmele de exercițiu care reproduc documente ale insti-
tutiilor stat ului, au un î nsemn distinctiv: UZ DIDACTIC / FOR-
MULAR DE LUCRU .
Metoda "firma de exerci țiu" se caracterizeaz ă prin dou ă
aspecte definitorii:
• Virtual: nu exist ă bunuri reale și nici bani

5 • Real: se respect ă uzanțele comerciale, fluxul in-
formaț ional, documentele și circuitul documentelor
Simularea situatiilor de e șec ca și a celor de s ucces re-
prezint ă pentru experienta elevilor o component ă esential ă și
necesar ă a procesului de învățare. Deciziile gresite, care în viata
reală ar putea duce până la punerea în pericol a existentei in-
treprinderii, în firma de exercițiu nu au urmari economi ce nega-
tive datorit ă caracterului virtual al situatiilor exersate.
Pentru a -și forma diverse deprinderi și abilitati elevii ex-
ersează situații care pot să apară într-o firm ă reală. Însușirea
competentelor -cheie (ex. capacitatea de a lucra în echip ă, gâ-
ndire interdisciplinar ă, competen țe de comunicare, capacitatea
de a lua decizii) le permite elevilor ob ținerea unor abilit ăți profe-
sionale și a unei flexibilit ăți ridicate pe piața de munc ă precum
și descoperirea afinit ății față de un anumit loc de muncă . Com-
peten țele obț inute pot determin a reducerea perioadei de aco-
modare la locul de munc ă, aspect deosebit de benefic pentru
viitorii angajati c ât și pentru angajator.
Puterea firmei de exercițiu stă în relația determinat ă de
derulare de tranzactii pe piata fir melor de exercițiu (national ă și
international ă) precum și în comunicarea cu mediul extern al
firmei de exercițiu , respectiv: colaborarea cu firma "mam ă", cu
alți agen ți economici, cu institu ții ale statului.

1.3. Utilizarea Internetului în firma de exercițiu
Ca în orice firm ă reală, și în firmele de exercițiu internetul
este folosit pentru transmiterea electronică a mesajelor (e -mail)
și pentru realizarea unui site al firmei prin care, de obicei, se
poate face și comercializarea produselor companiei.
O prezen tare online a firmei realizat ă printr -un site de pre-
zentare este un element de marketing pe Internet foarte im-
portant pentru orice firmă . Pentru a crea un site al unei firme de
exercițiu elevii trebuie să țină seama de următoarele precizări :
1. Un site pe Internet trebuie să conțină toate informațiile
importante, de exemplu:
 Datele de contactare ale firmei: denumire, adresa, telefon,
fax, e -mail, orele de funcționare și persoanele de contact;
 Oferta întreprinderii: Oferta generală, prețuri, Condițiile
Generale de Afaceri, serviciile oferite;

6  Informații despre întreprindere, de exemplu rapoarte de ac-
tivitate inclusiv bilanțuri;
 Organigrama î ntreprinderii , eventual cu fotografiile lu-
crătorilor;
 O listă cu referințe (clienți ai întreprinderii);
 Informații actu ale (noutăți)
 Situarea geografică a întreprinderii;
 Sigla întreprinderii;
 Copyright.
2. Site -ul captează interesul dacă:
 Design -ul este atractiv ;
 Contrastul între elementele grafice, text și fundal este put-
ernic;
 Distanța între rândurile de text este sufic ientă;
 Rândurile sunt îndeajuns de scurte pentru a permite citirea
lor ușoară;
 Oferta de informație poate fi citită fără a derula pagina;
 Textul este clar structurat; Caracterele sunt lizibile;
 Elementele grafice și fotografiile sunt de calitate foarte bun ă
și sunt explicate în comentarii.
3. Site -ul este unitar atunci când:
 Link-urile se deschid în aceeași fereastră;
 Revenirea la pagina de start se face cu un click pe un obiect
de pe fiecare pagină;
 Elementele (butoanele) de navigare sunt plasate în genera l
în același loc pe fiecare pagină și au aceeași reprezentare
grafică;
 Sigla întreprinderii se află mereu în același loc;
 Se poate identifica ușor poziționarea în site (știm pe ce pag-
ină ne aflăm);
 Paginile sunt elaborate unitar din punct de vedere grafic.
4. Site -ul oferă siguranța navigării:
 Pentru vizionare să se ofere softul corespunzător pentru
download sau cel puți un link către un site care îl oferă;
 Există elementele de navigare „Căuta re”, „Home”
 Există link -uri directe către alte pagini pe aceeași temă;
 Link-urile care au fost deja vizitate trebuie să capete o altă
culoare decât cea originală;
 Link-urile pot fi accesate ușor cu mouse -ul;

7 5. Site -ul este interactiv dacă:
 Există un forum de discuții sau o funcție de chat;
 Oferta poate fi citită și î n alte limbi, de exemplu în engleză;
 Există o aplicație e -commerce;
 Există chestionare online;
 Se poate comanda sau transfera (download) material in-
formativ, fișiere, etc.
6. Încărcarea paginilor este rapidă (mai ales la pagina de
start)
7. Reguli suplimen tare pentru cumpărături online:
 Ofertantul este identificat clar cu denumirea firmei, adresa,
număr de telefon, eventual persoană de contact sau alte el-
emente cerute de lege (cod fiscal, etc.);
 Condițiile Generale de Afaceri pot fi citite online sau tipări te
cu ușurință înainte de încheierea contractului;
 Specificațiile tehnice ale produselor oferite precum și con-
dițiile pentru acordarea garanției sunt numite online în mod
vizibil;
 Prețul de vânzare al produselor oferite este vizibil și sunt
specificate și costurile suplimentare (de exemplu pentru li-
vrare, ambalare, etc.);
 Se oferă cumpărătorilor o modalitate de plată facilă și sigură;
 Se confirmă prin email fiecare comandă primită, eventual se
confirmă și trimiterea produselor. Confirmarea va conține
denumi rea produselor, cantitatea, prețurile, numărul de
înregistrare a comenzii și datele clientului;
 Ofertele se formulează în limba țării clientului.
Tehnologia de afaceri online este o tehnologie în plină dez-
voltare . Comerț ul electronic permite o modalitate m ult mai
ușoară de comunicare între partenerii de afaceri , alternativ ă la
variantele traditionale de schimb de informaț ii: po șta, telefon,
sau fax.
Resursel e utilizate pentru acest tip de afacere sunt cele
mai noi din fiecare domeniu: marketing online , tehnică de calcul
de anvergură, m etode și instrumente de plat ă online , aplicații
informatice cu actualizare în timp real .

8 CAPITOLUL II – Pagini Web
TEHNOLOGII SI INSTRUMENTE INFORMATICE
UTILIZATE ÎN DEZVOLTAREA APLICA ȚIEI

2.1. Noțiuni generale

Web-ul se b azeaz ă pe o arhitecur ă client/server. Asta in-
semn ă că și severul central dar și aplicaț ia-client sunt responsa-
bile de o parte din procesarea datelor.
Aplica țiile care se pot dezvolta folosind MySQL și PHP fo-
losesc un singur client: browser -ul Web.
Aproa pe tot ce
fac aplicaț iile Web are
loc pe un server. O
aplicaț ie specific ă, nu-
mită server Web, va fi
responsabil ă pentru
comunicarea cu brow –
ser-ul. Mai este nevoie
de un limbaj care s ă
intermedieze cereri în-
tre server -ul web și un
server de baze de date
și să realizeze sarcini
prin program asupra
informaț iilor ce vin și
se duc spre sever -ul
Web.
Toate aceste
trei elemente (server –
ul Web, limbajul de
programare și serverul de baze de date) trebuie s ă fie compati-
bile și cu sistemul de operare din calculatoru l pe care sunt folo-
site. Cele mai folosite sisteme de operare pe serverele Web sunt
Windows NT/2000 și UNIX (peste 90% din numarul total de ser-
vere de pe Web).
În această lucrare, am ales pentru proiectarea și imple-
mentarea unui magazin virtual triada Apache- ca server de web ,
PHP- ca limbaj de programare și MySql – ca server de ba ze de

9 date. Această soluție utilizată pentru site -urile cu conținut dina-
mic se remarc ă dintre cele traditionale prin costul redus al dez-
voltarii software datorit ă gratuitatii celor trei produse, rapidita-
tea în dezvoltare , interacțiunea cu vizitatorii și pentru ușurința
de întreținere a site -ului. Utilizatorii pot căuta, selecta sau per-
sonaliza informația pe care o doresc.
Pentru a executa o operație cu baza de date pe Web vom par-
curge urmatorii pa și:

1. Browser -ul unui utilizator face o cerere HTTP pentru o
anumit ă pagin ă (spre exemplu se caut ă un anumit articol
în site prin intermediul fișierului cauta .php).
2. Server -ul Web primeste cererea pentru cauta .php, gă-
sește fișierul și îl trimite motorului PHP pentru a fi pro-
cesat.
3. Motorul PHP începe procesare a și găsește o comand ă de
conectare la o baz ă de date și o interogare dup ă un anu-
mit criteriu. PHP deschide o conexiune cu server -ul
MySQL și îi trimite interogarea.
4. Server -ul MySQL p rimeste interogarea , o proceseaz ă și
trimite rezultatul (o list ă de articole ) PHP -ului.
5. PHP-ul termin ă de rulat script -ul (de obicei are loc o for-
matare a rezultatelor interogarii în HTML) și returneaz ă
fișierul HTML rezultat server -ului Web
6. Server -ul We b trimite HTML -ul înapoi c ătre browser de
unde utilizatorul poate vedea lista articolelor pe care le –
a cerut.
Pentru instalarea triadei am folosit XAMPP (versiunea 2.5 –
mai 2007). Acesta este un server preconfigurat de Apache 2 ce
conține Apache (versiun ea 2.2.4.) , MySQL (versiunea 5.0.41) ,
PHP (versiunea 5.2.2.). De asemenea mai con ține și alte pro-
grame utilitare cum ar fi phpMyAdmin – interfața grafică a ser-
verului MySQL și FileZilla FTP Server – pentru transferul fișiere-
lor. Pentru a lucra mai ușor cu baza de date MySQL am instalat
programul PHPMyAdmin care are o interfață web de lucru cu ba-
zele de date.

10
2.2. Serverul Apache

Cea mai importanta caracteristic ă a unui server web este
de traduce un URL într-un nume de fișier și apoi sa -l trimit ă
inapoi pr in Internet, sau într-un nume de program, apoi s ă
ruleze programul și să transmit ă datele de iesire catre calcula-
torul surs ă.
Serverul WEB este un computer care prezint ă anumite
caracteristici tehnice astfel proiectate pentru a servi cu succes
la prelucrar ea informaț iilor stocate și livrate unui utilizator care
solicit ă aceasta prin intermediul unei conexiuni Internet. Un
Server web poate deservi simultan mii de utilizatori far ă a în-
tampina probleme.
Apache este un web server open -source pentru UNIX,
Window s sau alte platforme. Apache a devenit în prezent cel mai
popular și des folosit Web server, datorit ă caracteristicilor și a
perfomantelor exceptionale. El asigură o securitate sporit ă, efi-
ciență în funcționare, gratuitate și o structur ă modular ă care
permite extensia funcționalitatii lui. Aceasta ultim ă caracteris-
tică permite configurarea PHP -ului ca și modul al serverului,
crescându -se astfel rapiditatea triadei.
Deoarece codul surs ă Apache și documentatia pentru
Apache sunt gratuite, serverul poate fi se tat pentru sarcini
specifice.
Din punct de vedere statistic , mai mult de 60% dintre
site-urile web sunt găzduite sub diferite versiuni de Apache, care
poate funcționa pe diverse sisteme de operare: Linux, Mac OS
X, și Windows. Apache poate fi folosit gratu it, atât în aplicații
comerciale, c ât și personale.
Apache este un server web foarte complex, în principal
datorit ă numeroaselor facilitati pe care le ofer ă: fiabilitate (fiind
un program open -source este permanent testat și îmbun ătățit),
rapiditate, consu m mic de resurse hardware, multitasking, vir-
tual hosts, securitate sporit ă, ruleaz ă pe diferite platforme, usor
de configurat. Printre tehnologiile suportate de Apache sunt:
protocolul HTTP 1.0, autentificare HTTP, CGI, Perl, PHP, JSP,
SSI, SSL.

11 Un alt mot iv pentru care Apache este preferatul ma-
jorității utilizatorilor, este stabilitatea sa ieșită din comun. De
asemenea, Apache este relativ rapid, însă această caracteristică
depinde în mare parte de destinația sa. Dacă este folosit pentru
pagini statice (HT ML), atunci Apache este foarte rapid . Dacă are
de prelucrat sute de scripturi, cu fiecare script interog ând baza
de date simultan , serverul pierde puțin din viteză, ca orice alt
server web. Mare parte din încetinire vine de la scripturi , nu de
la serverul Apache.

2.3. Limbajul PHP
PHP este un limbaj de programare orientat pe obiect, fi-
ind o combinație între C, Perl și Java, aducând dinamică unei
pagini web.
Acronimul de PHP provine de la PHP Hypertext Prepro-
cessor, fiind un popular limbaj “server -side”, op en-source și
multi-platformă, prezent pe majoritatea serverelor Apache. A
fost conceput de Rasmus Lerdorf în 1994 când l -a distribuit free,
fiind repede adoptat de mulți oameni. Inițial s -a numit Personal
Home Page iar de -a lungul timpului a cunoscut schim bări ma-
jore:
 în anul 1998 a fost lansată versiunea PHP 3.0 de Zeev
Suraski și Andi Gutmans, care i -au schimbat numele din
Personal Home Page în PHP Hypertext Preprocessor;
 în mai 2000 a fost lansată versiunea PHP 4.0 care are la
bază Zend Engine 1.0 scris în 1999;
 iulie 2004 a fost lansată versiunea PHP 5.0 care are la
bază Zend Engine II, având o mai pronunțată orientare
obiect;
 august 2006 a fost lansată versiunea PHP 5.1.6.
 februarie 2007 a fost lansată versiunea PHP 5.2.1.
 mai 2007 a fost lansată versiu nea PHP 5.2.2.
 mai 2007 a fost lansată versiunea PHP 5.2.3.
 iunie 2009 a fost lansată versiunea PHP 5.3
 martie 2012 a fost lansată versiunea PHP 5.4
 iunie 2013 a fost lansată versiunea PHP 5.5
 august 2014 a fost lansată versiunea PHP 5.6
 decembrie 2015 a f ost lansată versiunea PHP 7.0
 2016 a fost lansată versiunea PHP 7.1

12 PHP este un limbaj de programare care ruleaz ă pe un
server web și care este de obicei asociat cu o pagina HTML.
Astfel ea nu mai r ămâne o simpl ă înșiruire de text și imagini,
capat ând multiple funcționalitati prin prelucrare de variabile, co-
municare cu o baz ă de date, scriere de fișiere, desenare de
grafice, etc.
In prezent PHP este cel mai raspandit limbaj de pro-
gramare de pe Internet, datorit ă portabilitatii lui pe numeroase
sisteme de op erare și servere web precum și datorit ă eficacitatii
și usurintei în utilizare. Datorit ă capacitatii sale de a executa
instructiuni complexe asupra datelor introduse sau extrase într-
o baza de date, PHP este formatul ideal pentru crearea de pagini
web inte ractive.
Cele mai cunoscute aplicaț ii care ca folosesc PHP ca su-
port sunt: sisteme de management, portaluri, magazine vir-
tuale, comunitati virtuale, site -uri de stiri, etc.
PHP satisface nevoia unui limbaj server -side puternic la
implementarea nivelului d e logica a aplicaț iei datorit ă combin ării
unei sintaxe relaxate cu construc ții puternice de limbaj și dato-
rită faptului c ă beneficiaz ă de o librarie de extensii considerabil ă.
Este bine cunoscut suportul oferit pentru interactiunea cu un
server de baze de date MySQL, asa cum este bine cunoscut și
tandemul pe care PHP și MySQL îl formeaz ă ca solutie rapid ă la
cererea crescând ă de site -uri ce afiseaz ă conținut dinamic.
În cele ce urmează voi descrie câteva noțiuni de limbaj PHP pe
care le -am utilizat în lucr are.

1. Extragerea datelor din formular e în PHP
Scrierea unui formular pentru a fi folosit cu un script PHP
se face exact la fel ca și în mod normal, în HTML.
După costruirea formularului și completarea lui trebuie
să extragem datele din formularul trans mis script -ului, astfel
încât să le putem utiliza . Există două procedee diferite de ex-
tragere a datelor în PHP, care depind de modul în care datele au
fost trimise (cu metoda GET sau cu POST). Diferența majoră
dintre cele două constă în faptul că, folosind GET, variabilele și
datele vor fi vizibile în adresa paginii, în timp ce folosind POST
acestea sunt invizibile.

13 Pentru a prelua o variabilă care a fost trimisă script -ului
cu metoda POST trebuie să folosim un apel de forma:
$nume_variabila=$_POST['variab ila'];
Similar, la folosirea metodei GET vom scrie: $nume_var-
iabila=$_GET['variabila'];
Aceste sintaxe se scriu pentru fiecare variabilă pe care vrem să
o folosim din formular.

2.Func ții de prelucrare a fișier elor

fopen (string filename, string mode [, int use_include_path])
Deschide un fișier. Primul parametru este numele fișierului, iar
al doilea este modul de deschidere.
use_include_path poate fi setat '1' sau TRUE dac ă se face cau-
tarea și în include_path.
Exempl u:
<?php
$f = fopen ("fis.txt" ,"r");
$f = fopen ("include/date.dat","w");
$f = fopen ("../agenda.txt","w+r");
$f = fopen ("fisier.txt","a");
$f = fopen ("ftp://user:password@exam-
ple.com/somefile.txt","w");
?>
Modurile de deschidere ale unui fișier sunt:
mod Descriere
'r' Deschide doar pentru citire; poziționează pointerul la în-
ceputul fișierului.
'r+' deschide pentru citire și pentru scriere; poziționează
pointerul la începutul fișierului
'w' Deschide doar pentru scriere; poziționează pointerul la în-
ceputul fișierului și trunchi ază lungimea fișierului la
0.Dac ă fișierul nu exist ă încearcă sa-l creeze.
'w+' Deschide pentru scriere și pentru citire; poziționează
pointerul la începutul fișierului și trunchiaz ă lungimea
fișierului la 0.Dac ă fișierul nu exist ă încearcă sa-l creeze.
'x' Deschide doar pentru scriere; poziționează pointerul la în-
ceputul fișierului.Dac ă fișierul exist ă nu îl deschide .

14 'x+' Deschide pentru scriere și pentru citire; poziționează
pointerul la începutul fișierului. Dacă fișierul exist ă nu îl
deschide.
'a' Deschide doar pentru scriere; poziționează pointerul la
sfârșit ul fișierului.Dac ă fișierul nu exist ă încearcă sa-l
creeze
'a+' Deschide pentru scriere și pentru citire; poziționează
pointerul la sfârșit ul fișierului.Dac ă fișierul nu exist ă
încearcă sa-l creeze

fread (resource fis, int length)
Citeste până la lenght bytes de la pointerul pozitionat în fișierul
referit de fis sau până la sfârșit ul de fișier. Exempl u:
<?php
$filename = "fisier.txt";
$fis = fopen ($filename, "r") or
die("Eroare l a deschidere");
$contents = fread ($fis, 1024);
fclose ($fis);
?>

fwrite ( resource fis, string string [, int length])
Scrie sirul de caractere string în fișierul referit de fis. Dacă par-
ametrul length exist ă, scrierea s e va î ntrerupe dup ă ce au fost
scrise length caractere , sau s -a ajuns la sfârșit ul șirului de ca-
ractere. Funcț ia returneaz ă numarul de bytes scriș i sau FALSE
dacă apare o eroare.
Exempl u:
<?php
//scrie o linie nou ă în fisierul ex2.txt
$filename = 'ex2.txt';
$text = "O lin ie singur ă linie\n";
$fis = fopen($filename, "w") or
die("Eroare la deschidere");
fwrite($fis, $text);
fclose($fis);
print "Success, am scris $text în fisierul $filename";
?>

15 feof ( resource fis)
Returnez ă TRUE pointerul este pozitionat în fișier la EOF(sfârșit
de fișier) sau dac ă apare o eroare; altfel returneaz ă FALSE

fgets ( resource fis [, int length])
Returneaz ă un sir de caractere de lungime maxim ă length – 1
bytes citiți din fișierul referit de fis. Citirea se termin ă când au
fost c ititi length – 1 bytes , la intalnirea unui sfârșit de linie
(care este inclus în valoarea returnata), sau la EOF.
Dacă nu este specificat ă lungimea, lungimea default este de
1k, sau 1024 bytes. Exempl u:
<?//afiseaz ă prima linie dintr -un fisier
$nume_fisi er="exemplu.txt";
$fis=fopen($nume_fisier,"r") or
die("Eroare la deschidere");
$linie=fgets($fis,4096);
fclose($fis);echo $linie;
?>

fgetc ( resource fis)
Returneaz ă un string care con ține un singur caracter citit din
fișierul referit de fis. Returneaz ă FALSE când intalneste sfârșitul
de fișier (EOF).
Exempl u:
<?php
$nume_fisier="fisier.txt";
$fis=fopen($nume_fisier,"r") or
die("Eroare la deschidere");
$n=0;
while(!feof($fis))
{
$c=fgetc ($fis);
echo $c;
}
fclose($fis);

fseek ( resou rce fis, int offset [, int whence])
Modific ă pozitionarea în fișierul referit de fis. Noua pozitie,
măsurată în bytes de la începutul fișierului, este ob ținută
adaug ând un numar de bytes la poziția specificat ă de whence,

16 ale carui valori sunt specificate m ai jos: SEEK_SET – Seteaz ă
poziția egală cu numarul de bytes specificati de offset.
SEEK_CUR – Seteaz ă poziția egală cu poziția curent ă plus offset.
SEEK_END – Setează poziția egală cu poziția sfârșit ului de fișier
plus offset (Pentru a ne muta la o pozit ie inainte de sfârșit ul de
fișier trebuie ca offset s ă aibă o valoare negativ ă.)
Dacă whence nu este specificat, se presupune c ă este
SEEK_SET. Dac ă mutarea s -a realizat cu succes funcția re-
turnează 0; altfel, returneaz ă -1. .
Exempl u:
<?php
$fis = f open ("exemplu.txt", "r");
fseek($fis,2);
fscanf($fis,"%c",$char); echo $char;?>
Dacă fișierul exemplu.txt con ține: exemplul va afisa:
abcdefsds csdadad

3. Funcții pentru șiruri de caractere

ltrim(s)
Returneaz ă valoarea lui s, elimin ând spatiil e albe de la extrem-
itatea din stanga a sirului.

rtrim(s)
Returneaz ă valoarea lui s, elimin ând spatiile albe de la extrem-
itatea din dreapta a sirului.

trim(s)
Returneaz ă valoarea lui s, elimin ând spatiile albe de la ambele
extremit ăti.

strcasecmp(s1, s2)
Execut ă o comparatie far ă sensibilitate la diferenta intre ma-
juscule și minuscule. Returneaz ă o valoare mai mic ă decât zero
dacă s1 este mai mic decât s2, o valoare mai mare decât zero
dacă s1 este mai mare decât s2, respectiv 0 în celelalte cazuri.

strcmp(s1, s2)
Execut ă o comparatie cu sensibilitate la diferenta intre majus-
cule și minuscule. Returneaz ă o valoare mai mic ă decât zero
dacă s1 este mai mic decât s2, o valoare mai mare decât zero
dacă s1 este mai mare decât s2, respectiv 0 în celelalte cazuri.

17 strncasecmp(s1, s2, n)
Execut ă o comparatie far ă sensibilitate la diferenta intre ma-
juscule și minuscule. Returneaz ă o valoare mai mic ă decât zero
dacă s1 este mai mic decât s2, o valoare mai mare decât zero
dacă s1 este mai mare decât s2, respe ctiv 0 în celelalte cazuri.
La comparatie sunt luate în considerare n caractere.

strncmp(s1,s2, n)
Execut ă o comparatie cu sensibilitate la diferenta intre majus-
cule și minuscule.Returneaz ă o valoare mai mic ă decât zero
dacă s1este mai mic decât s2, o va loare mai mare decât zero
dacă s1 este mai mare decât s2, respectiv 0 în celelalte cazuri.
La comparatie sunt luate în considerare un numar de n carac-
tere.

strchr(s1,s2)
Returneaz ă toate sirurile s1 de la prima aparitie a sirului s2 și
până la sfârșit . Dacă s1 nu este găsit, funcția returneaz ă false.
Funcț ia strstr() execut ă aceeași operatie.

stristr(s1,s2)
Returneaz ă toate sirurile s1 de la prima aparitie a sirului s2 și
până la sfârșit . Dacă s1 nu este găsit, funcția returneaz ă false.
Sirurile s1 și s2 sunt comparate far ă a se ține cont dac ă literele
sunt majuscule sau minuscule.

strpos(s1,s2)
Returneaz ă poziția întreagă a primei aparitii a sirului s2 în
s1.Dac ă s2 nu este găsit, funcția returneaz ă false.

strrchr(s1,s2)
Returneaz ă toate sirurile s1 de la ultima aparitie a sirului s2 și
până la sfârșit . Dacă s1 nu este găsit, funcția returneaz ă false.
La comparatie este folosit numai primul caracter al sirului s2.

strstr(s1,s2)
Returneaz ă toate sirurile s1 de la prima aparitie a sirului s2 și
până la sfârșit. Dacă s1 nu este găsit, funcția returneaz ă false.
Funcț ia strchr() execut ă aceeași operatie.

substr(s,sfarf) substr(s,start,lung)
Returneaz ă portiunea sirului s specificat ă de indexul intreg
start respectiv de indexurile start și lung. Prima pozitie a sirului
este poziția 0.

18 str_replace(cauta, inlocuire, subiect)
Se caut ă în sirul subiect sub -sirul cauta; dac ă sub-sirul este
găsit, returneaz ă valoarea subiect, inlocuindu -se prima aparitie
a sirului caut ă cu inlocuire.

substr_replace(subiect, inlocu ire, start, lungime)
Returneaz ă valoarea subiect, inlocuind sub -siruf care începe de
la start și având lungimea lungime cu sirul inlocuire.

4. Sesiuni în PHP
În mod normal, o variabila local ă declarat ă într-o pagin ă
.php este valabil ă doar în acea pagin ă. O sesiune reprezint ă una
din modalitatile de a pastra datele de lucru ale unei aplicaț ii
atunci c ând se face transferul de la o pagina la alta.
Fiecare sesiune trebuie declarat ă la începutul paginii, cu ajutorul
funcției: session _start ();
Aceast ă funcție face ca PHP s ă înregistreze un identifica-
tor unic al sesiunii, iar acel identificator este trimis utilizatorului.
Totodat ă, pe server se creaz ă un fișier care va re ține valorile
variabilelor folosite în aceast ă sesiune.
Apoi trebuie declarat ă variabila (sau variabilele) cu care lucr ăm
în cadrul acestei sesiuni. Pot fi create oric âte variabile.
session_register('sesiunea_mea');
Exemplu de definire a unei sesiuni:
<?
session_start();
session_register(“variabila_mea”);
$variabila_mea = “Aceasta este un exem plu”;
?>
$variabila_mea va putea fi folosit ă apoi pe toate paginile
aplicaț iei respective.
Variabilele definite în sesiuni pot fi folosite într-o pagin ă
doar dup ă ce a fost executat ă comada session_start();
Aceasta comand ă ii spune PHP -ului să verifice dac ă există
o sesiune și atunci s ă foloseasc ă variabilele acelei sesiuni ca var-
iabile globale.
Funcț ia session_start() trebuie folosit ă întotdeauna chiar
la începutul fișierului. Dac ă se trimite altceva c ătre browser
înainte de folosirea ei atunci vor exista erori la folosirea sesiunii.

19 5. E-mail cu PHP
În PHP avem doar o singură comandă mail() pentru a
trimite un mesaj. Utiliza tă în formatul :
mail($destinatar,$subiect,$corpul_mesajului,$antet);
În exemplu l de mai jos variabilele indică prin numele lor sin-
taxa comenzii. De fapt se pot include chiar textele în co mandă.
Variabila $destinatar conține adresa e -mail la care să fie trans-
mis mesajul. Variabila $subiect trebuie să conțină textul care
dorim să apară în linia Subject: a mesajului. Iar variabila
$corp ul_mesajului conține textul mesajului – conținutul său. Prin
variablia $antet se transmit componentele suplimentare din an-
tetul mesajului. Cel mai des e vorba despre câmpul From: , dar
poate fi inclusă oricare linie din antet, precum Cc:, sau Bcc: .
Exempl u:
$destinatar = " liceuleconomic@yahoo.com ";
$subiect = "despre FE";
$corpul_mesajului = " FE Moelpa are un magazin vir-
tual";
$antet = "From: admin@moelpa.ro \n";
mail($destinatar,$subiect,$corpul_mesajului,$antet);
echo "Mesaj trimis la $destinatar";

Cum în antetul mesajului (și deci și în variabila $antet)
putem avea mai multe linii, fiecare trebuie să se încheie cu com-
binația \n . Acesta este standardul international pentru formatul
mesajelor e -mail.
Combinația aceasta de trecere la linie nouă ( \n ) poa te
fi folosită și în corpul mesajului, în variabila $corpul_mesajului .
Dar nu are voie să apară nici în adresa de destinație (în variabila
$destinatar), nici în subiectu l mesajului (variabila $subiect ).

20 2.4. Baza de date MySql
Acronimul MySQL provine de la My Structured Query
Language. MySQL este un server multi -user și multi -thread.
Este cel mai popular SGBD ( Sistem de Gestiune a Bazelor de
Date) open -source în acest moment.
Principalele atu -uri MySQL sunt viteza, scalabilitatea și
stabilitatea, la care dacă se adaugă faptul că este gratis îl trans-
formă într -un competitor extraordinar comparativ cu alte baze
ca Oracle sau Microsoft SQL Server. Licența GNU sub care este
oferit nu permite încorporarea MySQL în softuri comerciale.
MySQL este cea mai popula ra baz ă de date de tip SQL.
Este folosit ă în special în combinatie cu un server web pentru a
construi site -uri web care ofer ă un continut dinamic cu ajutorul
informaț iilor stocate într-o bază de date.
O baz ă de date este o colectie de date structurat ă care
poate con ține orice de la simpl ă lista de produse dintr -un mag-
azin virtual până la galerii de imagini sau cantitati mari de in-
formaț ii care circul ă într-o întreprindere de mari dimensiuni.
Pentru a insera, accesa sau prelucra datele stocate întru-un cal-
culator este nevoie de un sistem de gestiune al bazelor de date
cum este MySQL .
MySQL a fost conceput pentru a gestiona cantitati mari
de date mai repede decât alte solutii existente. MySQL ofer ă un
set bogat de funcții care alaturi de conectivitate, viteza și secu-
ritate o fac cea mai folosit ă bază de date din Internet.
Interactiunea PHP – MySQL se bazeaz ă pe faptul că PHP
permite ca informaț iile care se doresc s ă apară pe site s ă fie
prezente în baza de date. În acest fel informaț iile pot fi actual-
izate uso r și prezentate într-o forma dinamic ă în cadrul site -ului.
Conectarea la baza de date se face utilizând comanda
mysql_connect(adresa, utilizator, parola);
unde adresa reprezint ă IP-ul sau hostname -ul calculatorului pe
care am instalat baza de date MySQL. Acesta poate fi acelasi cu
cel pe care ruleaz ă serverul de web (de obicei Apache sau IIS)
sau un alt calculator. În cazul în care se g ăsește pe acelasi cal-
culator cu serverul de web, putem folosi la adresa și localhost.
Numele de utilizator și parola vor f i cele setate pentru MySQL.
Implicit acestea sunt nume de utilizator: root și fară parola. Se
recomand ă ca aceste setari implicite s ă fie modificate.

21 Funcț ia mysql_connect returneaz ă un numar de identifi-
care a conexiuni în caz de succes sau false în caz de eroare
<?php
$conn = mysql_connect("localhost", "root", "")
or die("Nu ma pot conecta la MySQL!");
print ("Conectare reusita");
mysql_close($ conn);
?>
În cazul în care nu ne putem conecta la baza de date
funcția mysql_connect va returna false, iar în acest caz se va
trece la executarea funcției die care va afisa mesajul din
parantez ă și va termina executia scriptului.

Cele mai utilizate comenzi MySQL sunt următoarele:

Comanda SELECT
SELECT
[optiuni]
select_expr , …
[INTO detalii_fis iere ]
[FROM tabela
[WHERE conditii ]
[GROUP BY tip_grupare
[ASC | DESC], …
[HAVING definitie_ where]
[ORDER BY tip_ordonare ]
[ASC | DESC] , …]
[LIMIT criteriu_limita ]
[PROCEDURE nume_procedur a(argument e)]
[FOR UPDATE | LOCK IN SHARE MODE]]

Comanda INSERT
INSERT INTO] tabela [(coloana1,…)]VALUES ( valoare
1,…)

Comanda UPDATE
UPDATE [LOW_PRIORITY] [IGNORE] Tabela
SET coloana1=expr1 [, coloana2=expr2 …]
[WHERE conditie ]
[ORDER BY criteriu ]
[LIMIT numar]

22 Comanda ALTER TABLE
ALTER TABLE [IGNORE] tabela modificare [, modifi-
care…]

Comanda DELETE
DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tabela
[WHERE conditie ]
[ORDER BY ordine_coloane ]
[LIMIT row_count ]

Comanda DROP TABLE
DROP TABLE tabela

Pentru a lucra cu comenzile MySQL în PHP va t rebui să utilizăm
funcția mysql_query cu ajutorul careia vom executa o instruc-
tiune SQL.
mysql_query(instructiune_SQL, identificatorul_conexiunii);
Aceasta instructiune va fi transmis ă serverului MySQL care îl va
executa și va returna rezultatul. Rezulta tul va fi true, în caz de
succes, sau false, în caz de eroare.

Exemplul 1 –inserarea în baza de date
<?
if($den) {
$conn = mysql_connect("localhost", "root", "");
mysql_select_db("produse", $conn);
$query = "INSERT INTO categorii(denumire)
VALUES('$den')";
mysql_query($query, $conn);
print("Denumirea categoriei a fost introdusa in baza de
date!");
}?>
<form method="POST" action="adauga_ cat.php">
Categoria :
<input type="text" name=" den" size="30">
<input type="submit" val ue="Adauga">
</form>

Instructiunea mysql_num_rows returneaz ă numărul de re-
zultate returnate de executia instructiunii. În cazul în care se
foloseste instructiunea mysql_query cu o instructiune SELECT,

23 acesta nu va returna true sau false, ci va returna o l istă de re-
zultate sau false î n caz de eroare.

Exemplul 2 –selectarea înregistrărilor din baza de date
$query = "SELECT * FROM clienti WHERE nume='Cristi'";
$result = mysql_query ($query, $conn);
if(mysql_num_rows($result))
{ print("<strong>Numele Cristi exista in tabela cli-
enti</strong>");}
else
{ print("<strong>Numele Cristi nu exista in tabela cli-
enti</strong>");}
Instructiunea mysql_fetch_row parcurge rezultatul returnat de
instructiunea mysql_query și return ează pentru fiecare inregis-
trare un tab lou care con ține fiecare camp returnat. Indexarea
tablourilor începe de la valoare 0. Instructiune while va avea ca
efect returnarea pentru fiecare linie a unui tablou. In cazul nos-
tru vom avea în $row[0], numele clientul ui.
mysql_fetch_row(rezultatul_ret urnat_de_mysql_query);

Exemplul 3 –selectarea tuturor înregistrărilor dintr -o tabelă
$query = "SELECT nume FROM c lienti";
$result = mysql_query($query, $ conn);
if(mysql_num_rows($result)) {
while($row = mysql_fetch_row($result))
{ print("$row[0]<br>" );}
}
else {
print "Tabela c lienti este goala !";}

Exemplul 4 – actualizarea înregistrărilor dintr -o tabelă
care conțin la numele producatorului KFC cu Real
$query = "UPDATE clienti SET producator='Real' WHERE
producator='KFC'";
mysql_query($query, $c onn);

Exemplul 5 – stergerea înregistrărilor dintr -o tabelă
care conțin la numele producatorului KFC
$query = "DELETE FROM clienti WHERE producator='KFC'";
mysql_query($query, $conn);

24 CAPITOLUL III – Proiectarea unui magazin virtual

3.1. Analiza cerințe lor, obiective

Comerțul electronic se poate defini ca fiind o activitate
comercială în care o firmă folosește Internetul pentru a -și pre-
zenta și vinde produsele către clienții săi.
Obiectivele principale ale unei aplicaț ii de comerț electro-
nic vizez ă cresterea eficien ței economice a afacerii dezvoltate
prin reducerea consumului de timp și resurse, cresterea vitezei
de comunicare a informaț iilor, oferirea unei interfeț e priete-
noase care s ă faciliteze schimbul de informaț ii dintre diversele
categorii de util izatori ai aplicaț iei.
Un magazin virtual aduce un plus de valoare firmei fie c ă
este doar o extensie a vânzări lor pe care le derul ează deja fie
ca și modalitate principal ă de a ob ține profit.
Principalele obiective ale magazinelor virtuale sunt crest-
erea vânzărilor, comunicarea permanentă cu clienții, livrarea
produselor într -un timp c ât mai scurt și asigurarea unor mo-
dalități de plată cât mai sigure și cât mai eficiente. Aceste obi-
ective se pot atinge prin realizarea unor statistici periodice, ac-
tualizar ea permanentă a listelor de produse oferite și oferirea
unui răspuns prompt la cerințele clienților.
De obicei cerințele cele mai importante ale beneficiarilor unui
magazin virtual sunt:
 să se poată efectua autentificarea uitilizatorilor
 să conțină un catalog de produse organizat pe categorii
 să existe un cos virtual de cumparaturi pentru a ține evi-
dența produselor pe care dorește să le cumpere un utili-
zator
 un sistem de plati online
 un formular d e comanda magazin virtual
 eventual să se realizeze promovarea anumitor oferte
speciale în magazin -ul virtual
 să existe un sistem de actualizare online p entru produ-
sele din magazin ul virtual și pentru categorii

25 3.2. Proiectarea soluției software

3.2.1. Elemente inițiale

Pentru a realiza cerințele expuse mai sus am r ealizat o dia-
gramă (vezi anexa ) care ne permite să avem o viziune generală
asupra aplicației. Fiecare modul din diagrama va avea imple-
mentata o bibliotecă de funcții care va rezolva cerințel e pentru
acea parte din aplicație. Câteva cerințe desprinse din această
diagramă ar fi:
 utilizatorii să poată să studieze produsele pe categorii
 utilizatorii să poată selecta articolele din catalog pentru o
achiziție ulterioară și să poată vedea produsele pe care le -au
selectat
 când au încheiat cumpărăturile trebuie să putem calcula to-
talul comenzii, să preluăm datele de livrare și să generăm
factura
 administratorul trebuie să poată actualiza articolele și cate-
goriile de pe site

Foarte importantă este cons truirea unei baze de date pentru
server ul MySQL , deoarece fără ea nu ar putea funcționa cele-
lalte componente ale aplicației. În figura 1 am prezentat o
schemă cu tabelele bazei de date “PRODUSE”, câmpurile pe care
acestea le conțin și legăturile între tabe le.

Buy SmartDraw !- purchased copies print this
document without a watermark .
Visit www .smartdraw .com or call 1-800-768-3729 .

Figura 1. Structura bazei de date PRODUSE

26 Implementarea acestei baze de date în MySQL este prezentată
mai jos.
create database produse;
use produse;

create table clienti(
nr_client int unsigned not null auto_increment prim ary key,
nume char(60) not null,
nr_reg_com CHAR(30) not null,
cui CHAR(20) not null,
adresa char(80) not null,
oras char(30) not null,
judet char(20),
cod char(10),
tara char(20) not null,
cont char(40) not null,
banca char(20),
tel char(15)
);

create table comenzi(
nr_comanda int unsigned not null auto_increment primary key,
nr_client int unsigned not null,
valoare float(6,2),
data_c date not null,
stare_comanda char(10),
tara_destinatar char(20) not null
);

create tabl e produse(
cod char(13) not null primary key,
denumire char(80),
producator char(100),
nr_cat int unsigned,
pret float(4,2) not null,
descriere varchar(255)
);

create table categorii(
nr_cat int unsigned not null auto_increment primary key,
den_cat char(60) not null
);

create table articole_comanda(
nr_comanda int unsigned not null,
cod char(13) not null,
pret_articol float(4,2) not null,
cantitate tinyint unsigned not null,
primary key ( nr_comanda, cod )
);

27

create table a dmin(
username char(16) not null primary key,
parola char(40) not null
email char(30) not null
tip_cont char(15) not null
);

grant select, insert, update, delete
on produse.*
to produse@localhost identified by 'parola';

Scriptul PHP care permite conectarea la aceasta ba ză de date
este:
function db_connect()
{
$result = new mysqli('localhost', 'laura', 'TXeT5cQ3ZsRtv.XV',
'produse');
if (!$result){
return false;}
return $result;
}

După ce am construit baza de date și am restricționat
drepturile utilizato rilor asupra ei (un singur utilizator cu drepturi
depline – administrator – și neapărat cu parolă) putem trece la
implementarea interfeței site -ului.
Una din regulile în conceperea unei interfețe utilizator
pentru orice produs software este următoarea: o interfață utili-
zator este bine scrisă atunci când programul se comportă exact
așa cum se așteaptă utilizatorii săi.
Această regulă trebuie avută și la conceperea site -urilor
web. Proiectarea magazinului virtual ca site web este dirijată de
utilizator , iar interfața trebuie să mulțumească și să ajute utili-
zatorul. Pentru a asigura un astfel de design a m luat în calcul
posibilitățile de navigare prin site, accesul direct și rapid la in-
formații, asigurarea simplității, stabilitatea design -ului și nu în
ultimu l rând crearea unui conținut accesibil.
Site-ul web pe care l -am dezvoltat este un magazin vir-
tual care se ocupă cu vânzarea de articole pentru birou . În figura
2 este prezentată prima pagină a site -ului ( homepage ). Este
foarte important ca utilizatorul s ă aibă acces direct în cât mai
multe locuri din site încă din prima pagină. Secțiunile din această

28 pagină sunt: Categorii, Căutare, Top 5 v ânzări , Login și Curs
valutar . Fiecare pagină are pe una din laturi un modul cu lista
de categorii și un alt modul cu formularul de căutare. De ase-
menea în antet este prezent în permanență un buton pentru
coșul de cumpărături.

Figura 2. Pagina principală a magazinului virtual

3.2.2. Autentificarea utilizatorilor

Autentificarea reprezintă modalitatea de recunoașter e a
unui anumit client. Ea se realizează prin introducerea unui nume
de utilizator și a unei parole care se aleg în momentul com ple-
tării unui formular de înscriere.
În acest modul există patru elemente principale :
 Înregistrarea utilizatorilor (crearea u nui cont nou)
 Deschiderea și închiderea sesiunii de lucru (intrare în
cont și ieșire)
 Resetarea parolei (dacă a fost uitată)
 Schimbarea parolei (dacă utilizatorul dorește și este
conectat)
Pentru a înregistra un utilizator trebuie să colectăm câ-
teva inform ații despre el, dintr -un formular și să le adăugăm în
baza de date. Aceasta o putem face dacă el apasă linkul „Cont
nou” din formularul de autentificare . Va apare un nou formular
pe care el îl va completa ca în figura 3.

29 Figura 3. Înregistrarea utilizatorilor

Scriptul PHP care realizează crearea unui cont nou este următo-
rul:
function afiseaza_formular_inregistrare()
{
?>
<form method='post' action=' cont_nou.php '>
<table bgcolor='#cccccc'>
<tr>
<td>Adresa de email:</td>
<td><input type='text' name='email' size=30
maxlength=100></td></tr>
<tr>
<td>Username <br />(max 16 char.):</td>
<td valign='top'><input type='text' name='username'
size=16 maxlength=16></td></tr>
<tr>
<td>Parola <br />(intre 6 si 16 char.):</td>
<td valign='top'><input type='password' name='passwd'
size=16 maxlength=16></td></tr>
<tr>
<td>Confirmare parola:</td>
<td><input type='password' name='passwd2' siz e=16
maxlength=16></td></tr>
<tr>
<td colspan=2 align='center'>
<input type='submit' value='Inregistrare'></td></tr>
</table></form>
<?php
}
iar scripul cont_nou.php apelat mai sus este:
<?php
require_once('produse.php');
//creaza nume s curte de variabile

30 $email=$_POST['email'];
$username=$_POST['username'];
$passwd=$_POST['passwd'];
$passwd2=$_POST['passwd2'];
session_start();
try
{
// verifica daca au fost completate datele
if (!filled_out ($_POST))
{
throw new Exception('Nu ati completat corect formularul!');
}
// adresa de email nu e valida
if (!valid_email ($email))
{
throw new Exception('Aceasta nu este o adresa de email va-
lida! Incercati din nou.');
}
// parolele difer a
if ($passwd != $passwd2)
{
throw new Exception('Parola introdusa nu este corecta!');
}
// verifica lungimea parolei
if (strlen($passwd)<6 || strlen($passwd) >16)
{
throw new Exception('Parola trebuie sa aiba intre 6 si 16 ca-
ractere! Reluati!');
}
// inregistreaza utilizatorul
register ($username, $email, $passwd);
// incarca variabila de sesiune
$_SESSION['admin_user'] = $username;
do_html_titlu('Inregistrarea s -a efectuat cu succes!');
}
catch (Exception $e)
{
do_html_titlu('Problema:');
echo $e ->getMessage();
exit;
} ?>
Iar funcțiile filled_out(), valid_email () și register() :
function filled_out($form_vars)
{
// verifica daca fiecare variabila are o valoare
foreach ($form_vars as $key => $value)
{
if (!isset($key) || ($value == ''))
return false;
}

31 return true;}

function valid_email($address)
{
// verifica daca adresa de email poate sa fie valida
if (ereg("^[a -zA-Z0-9_\.\-]+@[a -zA-Z0-9\-]+\.[a-zA-Z0-9\-
\.]+$", $address))
return true;
else
return false;
}

function register($username , $email, $password)
// adauga un nou cont in bd
// returneaza true sau mesaj de eroare
{
// conectare la bd
$conn = db_connect();

// verifica daca username este unic
$result = $conn ->query("select * from admin where
username='$username'");
if (!$result)
throw new Exception('Nu se poate executa interogarea');
if ($result ->num_rows>0)
throw new Exception('username -ul este deja atribuit – alegeti al-
tul.');
// daca e ok, il adauga in bd
$result = $conn ->query("insert into admin valu es
('$username', sha1('$password'), '$email',
'user')");
if (!$result)
throw new Exception('Momentan nu puteti fi inregistrat – incer-
cati din nou.');
return true;
}
După crearea unui cont, utilizatorul poate să se conecteze la site
utilizând formularul de autentificare (vezi figura 4)

Figura 4. Formularul de login

32 După completarea acestui formular, la apăsarea butonului de tip
submit „Intra în cont” se va apela scr iptul admin.php pe care l –
am atașat mai jos.

<?php
require_once('produse.php');
session_start();

$username = $_POST['username'];
$password = $_POST['passwd'];

if ( $username && $password)
// se incearca logarea
{
$v=login($username, $password);
// daca userul sau parola nu corespund, se incearca relogarea
if (!$v){
do_html_titlu('Conectare esuata!');
do_html_url('diverse.php', 'Login',login);
}
else
{
// daca datele sunt corecte, se verifica daca este admin si se atribuie
variabilei sesiune valoarea corespunzatoare
if ($v == 'admin')
$_SESSION['admin_user'] = $username;
else
$_SESSION['user'] = $username;
?>
<!– script pentru refresh al pag. care se
modifică în funcție de tipul utiliz. –>
<script language="Java Script" type
="text/javascript">
window.open("antet.php","antet");
window.open("diverse.php","login");
window.open("gol.php","afis");
</script>
<?php }
}
else
{
// conectare esuata din cauza user -ului sau parolei vide
do_html_titlu('Problema:');
echo 'Nu va puteti loga.
Trebuie sa va logati pentru a vizualiza aceasta pagina.';
do_html_url('diverse.php', 'Login',login);
exit;
}
?>

33 Funcția login apelată mai sus verifică dacă utilizatorul este înre-
gistrat, conform codului:
function login($username, $password)
// verifica username si parola in bd
// daca il gaseste, return true
// altfel return false
{
// conectare la bd
$conn = db _connect();
if (!$conn)
return 0;

// verifica daca username este unic
$result = $conn ->query("select * from admin
where username='$username'
and parola = sha1('$password')");

if (!$result or !$result ->num_rows)
return 0;
else
{
$row=$result ->fetch_assoc();
return $row[tip_cont];
}
}

Se observă că scriptul pentru autentificare este același
pentru administrator și pentru orice alt client al site -ului, varia-
bilele de sesiune retinând în fiecare caz tipul utilizatorului.

Cele ce urmează se vor referi la cazul în care utilizatorul
care s -a conectat este client. Cazul administratorului este anali-
zat în paragraful 3 .3 al acestui capitol.
În momentul autentificării clientului, pagina principală se
va modifica (vezi figura 5) , în sensul că în antet pe lângă butonul
care arată în permanență coșul de cumpărături va mai apare și
un buton de ieșire pentru cazul în care utilizatorul dorește să
părăsească sesiunea de lucru. De asemenea, în partea centrală
a paginii va apare un mesaj de bun venit personalizat, alături de
un link care permite schimbar ea parolei utilizatorului. Și tot aici
clientul poate vedea o listă cu cele mai cumpărate produse din
site.

34
Figura 5. Homepage pentru un client

Aceste modificări apar datorită conținutului a două scripturi –
cel pentru antet și cel pentru afișaj. Iată codul pentru antet :
<?php
session_start();
include ('produse.php');
?>
<html>
<head>
<title><?php echo $title; ?></title>
<style>
h2 { font -family: Arial, Helvetica, sans -serif; font -size: 22px;
color = red; margin = 6px }
body { font -family: Arial, Helvetica, sans -serif; font -size:
13px }
li, td { font -family: Arial, Helvetica, sans -serif; font -size:
13px }
hr { color: #FF0000; width=70%; text -align=center}
a { color: #000000 }
</style>
</head>
<body>
<table width='100%' border=0 cellspacing = 0 bgcolor=
'#cccccc'>
<tr>
<td>
<img src='images/moelpa.jpg' alt='Moelpa' border=0
align='left' valign='center' height = 60 width = 500>
</td>
<td align = 'right' width = 135>

35 <?php
if(isset($_SESSION['admin_user']))
afisare_buton ('logout.php', 'log -out', 'Log Out');
else
do_html_url ('afisare_cos.php',"<IMG SRC= \"images/vezi –
cos.jpg \"
border=0 height = 50 width = 135>", afis);
echo '</td>';
if(isset($_SESSION['user'])){
echo '<td>';
afisare_buton('logout.php', 'log -out', 'Log
Out');
echo '</td>';
}
?>
</tr>
</table>
<?php

function afisare_buton($target, $image, $alt)
{
echo "<center><a href= \"$target \"><img src=\"ima-
ges/$image".".jpg \"
alt=\"$alt\" border=0 height = 50 width =
135></a></center>";
}

function do_html_url($url, $name, $t)
{
// afiseaza URL ca link
?>
<a href="<?php echo $url; ?>" target=<?php echo $t
?>><?php echo $name; ?></a>
<?php
}
Iată acum și codul pentru afișaj :
<?php
require_once('produse.php');
session_start();
include('top5.php');
if(isset($_SESSION['admin_user']))
{
echo 'Bine ai venit, '.$_SESSION['admin_user'].'!';
echo '<h2> <center> Administrare magazin virtual </cen-
ter> </h2>';
afisare_meniu_admin();}
else
if(isset($_SESSION['user']))
{
echo 'Bine ai venit, '.$_SESSION['user'].'! ';

36 echo '<a href="formular_schimba_parola.php" tar-
get = afis>
Doresti sa schimbi parola?</a>';
top5(); }
?>
În continuare apare cazul în care utilizatorul dorește să
schimbe parola. Un caz în care este de dorit ca parola să fie
schimbată este cel în care utilizatorului i s -a generat o parolă
nouă din cauză ca a uitat -o pe cea veche. Noua parolă fiind ge-
nerată aleator este po sibil să fie foarte greu de reținut.
Scriptul de mai jos afișează formularul care trebuie completat
pentru schimbarea parolei.

<?php
require_once("produse.php");
session_start();

do_html_titlu("Schimba parola ");
formular_afisare_parola();

if(isset($_SESSION['admin_user']))
do_html_url("admin_menu.php", "Inapoi la
meniul de administrare",afis);
if(isset($_SESSION['user']))
do_html_url("gol.php", "Inapoi la pagina
principala",afis);
?>

function formular_afisare_parola(){
// afiseaza formu larul de schimbare a parolei
?>
<br />
<form action="schimba_parola.php" method="post">
<table width=220 cellpadding=2 cellspacing=0 bgcolor="#cccccc">
<tr><td>Parola veche:</td>
<td><input type="password" name="old_passwd" size=16
maxlength=16></td>
</tr>
<tr><td>Parola noua:</td>
<td><input type="password" name="new_passwd" size=16
maxlength=16></td>
</tr>
<tr><td>Reintrodu parola noua:</td>
<td><input type="password" name="new_passwd2" size=16
maxlength=16> </td>
</tr>
<tr><td colspan=2 align="center"><input type="submit" value="Schimba
parola">

37 </td></tr>
</table>
<br />
<?php
};
Scriptul apelat la acționarea butonului de tip submit
„Schimbă parola” va verifica parolele și daca totul e ok va
schimba parola în baza de date și va afișa un mesaj corspunză-
tor, ca în figura alăturată.
<?php
require_once('produse.php');
session_start() ;

do_html_titlu('Schimba parola');
check_admin_user();
if (!filled_out($HTTP_POST_VARS))
{
echo 'Nu ati completat formularul. Incercati din nou.';
echo '<br>';
do_html_url('formular_schimba_parola.php', 'Inapoi',afis);
exit;
}
else
{
$new_passwd = $HTTP_POST_VARS['new_passwd'];
$new_passwd2 = $HTTP_POST_VARS['new_passwd2'];
$old_passwd = $HTTP_POST_VARS['old_passwd'];
if ($new_passwd!=$new_passwd2)
echo 'Parolele introduse nu coincid. Schimbare esuata!';
else if (strlen($new_passwd)>16 || strlen($new_passwd)<6)
echo 'Noua parola trebuie sa aiba intre 6 si 16 caractere.
Incercati din nou.';
else
{
// modifica parola pt. admin in bd
if(isset($_SESSION['admin_user']))
if (schi mba_parola($HTTP_SESSION_VARS['admin_user'],
$old_passwd, $new_passwd))
echo 'Parola a fost schimbata.';
else
echo 'Parola nu poate fi schimbata.';
// modifica parola pt. user in bd
if(isset($_SESSION['user']))
if (schimba_parola($HTTP_SESSION_VARS['user'],
$old_passwd, $new_passwd))
echo 'Parola a fost schimbata.';
else
echo 'Parola nu poate fi schimbata.';
}

38 }
echo '<br><br>';
if(isset($_SESSION['admin_user']))
do_html_ur l('admin_menu.php', 'Inapoi la meniul de admi
nistrare', afis);
else
do_html_url('gol.php', 'Inapoi la pagina principala', afis);
?>

function schimba_parola($username, $old_password,
$new_password)
// schimba parola pentru username/old_password in
new_password
// returneaza true sau false
{
// daca vechea parola este ok
// o schimba cu noua parola si returneaza true
// altfel, returneaza false
if (login($username, $old_password))
{
if (!($conn = db_connect()))
return false;
$result = $conn ->query( "update admin
set parola = sha1('$new_password')
where username = '$username'");
if (!$result)
return false; // nu a fost schimbata
else
return true; // a fost schimbata cu succes
}
else
return false; // vechea parola era gresita
}
În cele ce urmează am analizat și cazul în care utilizatorul
și-a uitat parola. Această situație nu este una neobișnuită. Pen-
tru a-și putea utilza din nou contul va trebui să completeze într –
un formular username -ul.

39 Iată cum am implementat acest script. În primul rând se
verifică existența usename -ului în baza de date. Dacă nu este
corect, se afișează un mesaj corespunzător. Altfel, se trece la
generarea noii p arole prin extragerea dintr -un fișier text a unui
cuvânt aleator și concatenarea lui cu un număr de trei cifre ge-
nerat tot aleator. Parola generată se trimite prin email

<?php
require_once("produse.php");

echo '<h2>Schimbare parola</h2>';

// cre aza nume scurte de variabile
$username = $_POST['username'];

$conn = db_connect();
$query = "select * from admin where username=$username";
$result = @$conn ->query($query);
if($result){
try
{
$parola = reseteaza_parola ($username);
anunta_parola ($username, $parola);
echo 'Noua parola v -a fost trimisa prin email.<br />';
}
catch (Exception $e)
{
echo 'Parola dumneavoastra nu poate fi resetata –
va rugam incercati mai tarziu.';
}
}
else
echo 'Nu sunteti inregistrat in baza noastra de date.
Completati formularul de inregistrare';
?>

function reseteaza_parola($username)
// seteaza parola pt. username la o valoare aleatoare
// returneaza noua parola sau false daca esueaza
{
// alege un cuvant i ntre 6 si 13 caractere, din dictionar
$new_password = get_random_word (6, 13);
if($new_password==false)
throw new Exception('Nu poate fi generata o parola noua.');
// adauga un nr. intr 0 si 999 la ea
// pentru a face o parola mai sigura
srand ((double) microtime() * 1000000);
$rand_number = rand(0, 999);

40 $new_password .= $rand_number;

// seteaza aceasta parola in baza de date
$conn = db_connect();
$result = $conn ->query( "update admin
set parola = sha1('$ new_password')
where username = '$username'");
if (!$result)
throw new Exception('Parola nu poate fi schimbata.');
// nu a fost schimbata
else
return $new_password; // a fost schimbata
}

function get_random_word ($min_length, $max_length)
// alege un cuvant aleator, cu dimensiunea intre min_length si
max_length si il returneaza
{
$DOCUMENT_ROOT =HTTP_SERVER_VARS['DOCUMENT_ROOT'];
// genereaza un cuvant aleator, utilizad cuvintele din dictionar
$word = '';
$dictionar ="C: \\xampp \htdocs \produse \dict.txt";
$fp = fopen($dictionar, "r") or
die("Eroare la deschidere");
if(!$fp)
return false;

$size = filesize($dictionar);

// se pozitioneaza pe o locatie aleatoare in dictionnar
srand ((do uble) microtime() * 10000);
$rand_location = rand(0, $size);
fseek($fp, $rand_location);

// alege urmatorul cuvant intreg de dimensiunea corecta din
fisier
while (strlen($word)< $min_length ||
strlen($word)>$max_length ||
strstr($word, "'"))
{
if (feof($fp))
fseek($fp, 0); // daca a ajuns la sfarsit, merge la inceput
$word = fgets($fp, 80); // sare primul cuvant care poate sa
nu fie intreg
$word = fgets($fp, 80); // potentiala parola
};
$word=trim($word); // elimina caracterele de sfarsit( \n)
return $word;
}

41 function anunta_parola($username, $password)
// anunta prin email userul de schimbarea parolei
{
$conn = db_connect();
$result = $conn ->query("select email from admin
where username='$username'");
if (!$result)
{
throw new Exception('Adresa de email nu este gasita.');
}
else if ($result ->num_rows==0)
{
throw new Exception('Adresa de email nu este gasita.');
// username nu e in bd
}
else
{
$row = $result ->fetch_object();
$email = $row ->email;
$from = 'From: admin@moelpa.lx.ro'." \r\n";
$mesg = $username." Parola ta a fost schimbata in $pass-
word \r\n"."Va rugam schimbati -o la urmatoarea logare.
\r\n";

ini_set(SMTP,"mail.moelpa.lx.ro");
if (mail($email, 'Autentificare -informatii logare', $mesg,
$from))
return true;
else
throw new Exception('Nu poate fi trimis email.');
}
} ?>
Pentru a putea tri mite prin email parola trebuie să confi-
gurăm în prealabil un server de mail care să permită protocolul
SMTP. Eu am folosit PostCastServer deoarece este gratuit și pe
localhost merge bine, dar în eventualitatea înregistrării pe web
există host -uri care perm it trimiterea de mail -uri (de exemplu
lx.ro).

3.2.3. Catalogul de produse și servicii

Am implementat catalogul virtual prin trei scripturi:
unul care afișează în pagina principală lista de categorii, altul
care afișează articolele dintr -o categorie și al tul care afișează
pagina cu detaliile articolului.

42 Primul sript care afișează lista cu categoriile de articole
conține două funcții importante: extrage_categoriile și
afișare_categorii. Prima returnează un tablou cu categoriile
existente, pe care îl trans feră celei de a doua funcții.
<?php

session_start();
include ('produse.php');

?>
<font color="blue"><h6><center>Alegeti o categorie:</cen-
ter></h6></font>
<?php
$cat_array = extrage_categoriile ();
// afisare ca linkuri catre paginile cate goriilor
afisare_categorii ($cat_array);
?>

function extrage_categoriile()
{
// interogarea bd pentru obtinerea listei de categorii
$conn = db_connect();
$query = 'select nr_cat, den_cat
from categorii';
$result = @$conn ->quer y($query);
if (!$result)
return false;
$num_cats = @$result ->num_rows;
if ($num_cats ==0)
return false;
$result = db_result_to_array ($result);
return $result;
}

function db_result_to_array($result)
{
$res_array = array();
for ($count=0; $row = $result ->fetch_assoc(); $count++)
$res_array[$count] = $row;
return $res_array;
}

Funcția afisare_categorii realizează conversia fiecărei ca-
tegorii din baza de date într -o legătură care duce la scriptul ur-
mător afisare_cate gorie.php , dar fiecare cu un parametru diferit
– numarul caregoriei (nr_cat). Acest parametru va determina
categoria care va fi afișată.

43 function afisare_categorii($cat_array)
{
if (!is_array($cat_array))
{
echo 'Nici o categorie disponibila<br />';
return;
}
echo '<table bgcolor="#F3F7B3">';
foreach ($cat_array as $row)
{
echo '<tr><td align="center">';
echo '<center>'.$row['den_cat'].'</center>';
$url = ' afisare_categorie.php ?nr_cat='.($row['nr_cat']);
$denumire = '<img s rc=\'images/'.($row['den_cat']).'.jpg \'
border=0/>';
do_html_url($url, $denumire, afis);
echo '</td></tr>';
}
echo '</table>';
}
Rezultatul se poate vedea în pagina principală (vezi figura 5).

Cel de al doilea script pentru magazinul virtual este cel
pentru afișarea articolelor dintr -o categorie. Acest script
(afisare_categorie.php) este asemănător cu cel pentru afișarea
categoriil or, dar după afișarea articolelor apar două butoane di-
ferite care determină acțiunea pe care poate să o facă clientul
(continuă cumparaturile) sau administratorul (editează denumi-
rea categoriei) .
<?php
include ('produse.php');
session_start();

$nr_cat = $_GET['nr_cat'];
$nume = extrage_den_categorie ($nr_cat);
echo '<center><h2>'.$nume.'</h2></center>';

// extrage informatiile despre articol din bd
$art_array = extrage_articole ($nr_cat);
afisare_articole ($art_array);
// daca esti logat c a administrator, afiseaza linkuri pentru adau-
gare si stergere articole
if(isset($_SESSION['admin_user']))
afisare_buton("formular_editare_catego-
rie.php?nr_cat=$nr_cat", 'editare -categorie', 'Editare Catego-
rie');
else
if(isset($_SESSION['user']))

44 afisare_buton('gol.php', 'continua -cumparaturile',
'Continua Cumparaturile');?>
function extrage_den_categorie($nr_cat)
{
// interogarea bd pentru obtinerea numelui unei categorii
$nr_cat = intval($nr_cat);
$conn = db_connect();
$query = "select den_cat
from categorii
where nr_cat = $nr_cat";
$result = @$conn ->query($query);
if (!$result)
return false;
$num_cats = @$result ->num_rows;
if ($num_cats ==0)
return false;
$row = $result ->fetch_obje ct();
return $row ->den_cat;
}
function extrage_articole($nr_cat)
{
// interogarea bd pentru obtinerea listei articolelor
dintr-o categorie
if (!$nr_cat || $nr_cat=='')
return false;
$conn = db_connect();
$query = "select * from produse where nr_cat='$nr_cat'";
$result = @$conn ->query($query);
if (!$result)
return false;
$num_art = @$result ->num_rows;
if ($num_art ==0)
return false;
$result = db_result_to_array($result);
return $result;
}

function afi sare_articole($art_array)
{
//afiseaza toate articolele din vector
if (!is_array($art_array))
echo '<br />Nici un articol in aceasta categorie<br />';
else
{
//creaza tabel
echo '<table width = 100% border = 0>';
//creaza o linie pentru fiecare articol
foreach ($art_array as $row)
{
$url = 'afisare_articol.php?cod='.($row['cod']);

45 echo '<tr><td>';
if (@file_exists('images/'.$row['cod'].'.jpg'))
{
$size = GetImageSize('images/'.$row['cod'].'.jpg') ;
$denumire = '<img src= \'images/'.($row['cod']).'.jpg \'
border=0 width = '. $size[0]/2 . 'height =
'.$size[1]/2 . '/>';
do_html_url($url, $denumire, afis);
}
else
echo '&nbsp;';
echo '</td><td>';
$denumire = $row['denumire'].' produs de '.$row['produca-
tor'];
do_html_url($url, $denumire, afis);
echo '</td></tr>';
}
echo '</table>';
}
echo '<hr />';
}
Se observă în funcția de afișare se caută un fișier de
forma images/ $cod.jpg care dacă nu este găsit nu va fi afișată
nicio imagine pentru articolul respectiv.
Rezultatul acestui script se poate vedea în figura 6.

Figura 6. Afișarea articolelor dintr -o categorie

Cel de al treilea script realizează afișarea detaliilor pentru
un articol ales din catalog. Este afișată imaginea mărită a arti-
colului, iar dedesupt două butoane pentru adăugarea în coșul de

46 cumpărături a articolului selectat și pentru continuarea cumpă-
răturilor, dacă acest articol nu este dorit la momentul respectiv.
<?php
include ('produse.php');
session_start();

$cod = $_GET['cod'];
// Extrage articolul din bd
$art = extrage_detalii_articol ($cod);
do_html_titlu($art['denumire']);
afiseaza_detalii_articol ($art);
// seteaza url pentru "butonul de continuare"
$target = 'categorii.php';
if($art['nr_cat'])
{
$target = 'afisare_categorie.php?nr_cat='.$art['nr_cat'];
}
// daca esti logat ca a dmin, arata legatura catre editare
if( check_admin_user() )
{
echo "<table width=600> <tr> <td>";
afisare_buton("formular_editare_articol.php?cod=$cod",
'editare -articol', 'Editare Articol');
echo "</td> <td>";
afisare_buton($target, 'continua', 'Continua');
echo "</td> </tr> </table>";
}
else
if(isset($_SESSION['user']))
{
afisare_buton("afisare_cos.php?new=$cod", 'pune -in-cos',
'Pune '.$art['denumire'].' in cosul meu');
afisare_buton($target, 'continua -cumparaturile',
'Continua cumparaturile');
}
else
echo '<center><font color="RED" size=5>Pentru a putea
cumpara produse online, trebuie sa va
conectati. </font> </center>';
?>

Se observă că apare și cazul în care un utilizator care nu este
autentificat nu poate să adauge articole în coș. Funcțiile apelate
în scriptul anterior:
function extrage_detalii_articol($cod)
{
// interogarea bd pen tru obtinerea descrierii unui articol
if (!$cod || $cod=='')
return false;

47 $conn = db_connect();
$query = "select * from produse where cod='$cod'";
$result = @$conn ->query($query);
if (!$result)
return false;
$result = @$result ->fetch_assoc();
return $result;
}

function afiseaza_detalii_articol($art)
{
// afiseaza toate detaliile despre acest $art
if (is_array($art))
{
echo '<table><tr>';
//afiseaza imaginea, daca exista
if (@file_exists('images/'.($art['cod ']).'.jpg'))
{
$size = GetImageSize('images/'.$art['cod'].'.jpg');
if($size[0]>0 && $size[1]>0)
echo '<td><img src= \'images/'.$art['cod'].'.jpg \'
border=0 '.$size[3].'></td>';
}
echo '<td><ul>';
echo '<li><b>Denu mire:</b> ';
echo $art['denumire'];
echo '</li><li><b>Cod:</b> ';
echo $art['cod'];
echo '</li><li><b>Pretul nostru:</b> ';
echo number_format($art['pret'], 2,'.','');
echo '</li><li><b>Descriere:</b> ';
echo $art['descriere'];
echo '</li></ul></td></tr></table>';
}
else
echo 'Detaliile despre acest articol nu pot fi afisate acum.';
echo '<hr />';
}

Efectul acestul script se observă în figura 7.

48

Figura 7. Afișarea detaliilor unui articol

3.2.4. Coșul de cump ărături

În general procesul de vânzare -cumpărare on-line se desfășoară
astfel:
 Comerciantul își deschide un magazin virtual pe Internet pe
care își prezintă în detaliu produsele comercializate.
 Cumpărătorul intră pe acest magazin virtual, găsește pro-
dusul căutat și transmite o comandă către comerciant,
specificând produsele, cantitățile comandate, modalitatea de
plată și adresa de livrare.
După verificarea veridicității datelor din comandă, comerciantul
livrează marfa către cumpărător, încasând contraval oarea aces-
teia, fie de pe cardul cumpărătorului, fie la livrarea produselor
sau chiar în avans în unele cazuri.
În lucrarea de față am implementat un coș de cumpărături as-
tfel:
 după vizualizarea datelor despre un anumit produs, așa cum
am văzut în paragra ful precedent, clientul are posibilitatea
de a-l adăuga în coșul său

49  după ce este adăugat are posibilitatea de a modifica numărul
de articole pe care vrea să le achiziționeze și să continue
cumpărăturile
 după ce a adăugat articolele în coș va trebui să mea rgă la
casă, adică să completeze un formular pentru datele de li-
vrare, și să primească o factură proformă urmând să vireze
banii în contul firmei.
Descrierea detaliată a procesului de comandă -livrare, cu toate
procesele care au loc și operațiile care se f ac asupra bazei de
date, se poate vedea și în diagrama din figura 8.

Pentru a urmări produsele pe care un utilizator le adaugă
în coșul său, există două posibilități. Prima este să adăugăm
produsele selectate în baza de date, dar aceasta necesită inte-
rogarea permanentă a bazei de date pentru a avea acces la acele
informații și adaugă date inutile ca urmare a faptului că unii cli-
enți se pot răzgândi să mai cumpere.
A doua posibilitate, pe care am implementat -o în această
lucrare, este de a utiliza o variab ilă sesiune care să urmărească
selecțiile făcute de un utilizator de la o pagină la alta. Când cli-
entul își încheie cumpărăturile și confirmă încheierea tranzacției,
o înregistrăm trecând aceste date în baza de date. Am numit
variabila de sesiune, cart. Ea este un tablou ce conține ca index
codul articolului, iar ca valoare cantitatea dorită. În momentul
adăugării în coș, se completează tabloul. Pentru a vizualiza
conținutul coșului, utilizăm tot variabila cart pentru a căuta de-
taliile complete ale articole lor în baza de date.

50

Buy SmartDraw !- purchased copies print this
document without a watermark .
Visit www .smartdraw .com or call 1-800-768-3729 .

Figura 8. Descrierea procesului de comandă în magazinul virtual

Scriptul de mai jos controlează coșul virtual de cumpărături:
<?php
include ('produse.php');
session_start();

// vede dacă s -a ales un n ou articol pentru coșul de cumpărături
@ $new = $_GET['new'];

if($new)
{
//articol selectat
if(!isset($_SESSION['cart']))
{
$_SESSION['cart'] = array();
$_SESSION['items'] = 0;
$_SESSION['pret_total'] ='0.00';
}

51 if(isset($_SESSION['cart'][$new]))
$_SESSION['cart'][$new]++;
else
$_SESSION['cart'][$new] = 1;
$_SESSION['pret_total'] = calculeaza _pret ($_SESSION['cart']);
$_SESSION['items'] = nr_articole_cos ($_SESSION['cart']);
}

if(isset($_POST['save']))
{
foreach ($_SESSION['cart'] as $cod => $qty)
{
if($_POST[$cod]=='0')
unset($_SESSION['cart'][$cod]);
else
$_SESSION['cart'][$cod] = $_POST[$cod];
}
$_SESSION['pret_total' ] = calculeaza_pret ($_SESSION['cart']);
$_SESSION['items'] = nr_articole_cos($_SESSION['cart']);
}
do_html_titlu('Cosul tau contine urmatoarele articole');
if($_SESSION['cart']&&array_count_values($_SESSION['cart']))
afisare_cos ($_SESSION['c art']);
else
{
echo '<p>Nu aveti niciun articol in cos.</p>';
echo '<hr />';
}
$target = 'gol.php';
// daca am adaugat un articol in cos,
// continua cumparaturile din acea categorie
if($new)
{
$details = extrage_detalii_articol( $new);
if($details['nr_cat'])
$target = 'afisare_categorie.php?nr_cat='.$details['nr_cat'];
}
afisare_buton($target, 'continua -cumparaturi-
le', 'Continua cumparaturi');
afisare_buton('checkout.php', 'checkout', 'Checkout');
?>

Acest script este activat dacă se apasă unul din butoanele
Vizualizare coș sau Adaugă în coș. În primul caz scriptul este
apelat fără parametru și afișează conținutul coșului, iar în al do-
ilea caz este apelat cu parametru (la acționarea butonului Ada-
ugă în coș )

52 afisare_buton("afisare_cos.php?new=$cod", 'pune -in-cos', 'Pune
'.$art['denumire'].' in cosul meu');
și va adăuga în coșul virtual articolul $cod transmis ca parame-
tru prin variabila $new.
Funcțiile apelate în scriptul de mai sus:
function calculeaza_pre t($cart)
{
// calculeaza pretul total al articolelor din cos
$price = 0.0;
if(is_array($cart))
{
$conn = db_connect();
foreach($cart as $cod => $qty)
{
$query = "select pret from produse where cod='$cod'";
$result = $conn ->query($query);
if ($result)
{
$item = $result ->fetch_object();
$pret_articol = $item ->pret;
$pret +=$pret_articol*$qty;
}
}
}
return $pret;
}
function nr_articole_cos($cart)
{
// calculeaza numarul de ar ticole din cos
$items = 0;
if(is_array($cart))
{
foreach($cart as $cod => $qty)
$items += $qty;
}
return $items;
}
function afisare_cos($cos, $change = true, $images = 1)
{
// afiseaza articolele din cos
// optional permite modif icari (true sau false)
// optional include imagini (1 – da, 0 – nu)
echo '<table border = 0 width = "100%" cellspacing = 0>
<form action = "afisare_cos.php" method = "post">
<tr><th colspan = '. (1+$images) .'
bgcolor ="#cccccc">Articol</th>
<th bgcolor="#cccccc">Pret</th><th
bgcolor="#cccccc">Cantitate</th>
<th bgcolor="#cccccc">Total</th></tr>';

53
//afiseaza fiecare articol pe o linie
foreach ($cos as $cod => $qty)
{
$art = extrage_detalii_articol($cod);
echo '<tr>';
if($images ==true)
{
echo '<td align = left>';
if (file_exists("images/$cod.jpg"))
{
$size = GetImageSize('images/'.$cod.'.jpg');
if($size[0]>0 && $size[1]>0)
{
echo '<img src="images/'.$cod.'.jpg" border=0 ';
echo 'width = '. $size[0]/3 .' height = ' .$size[1]/3 . ' />';
}
}
else
echo '&nbsp;';
echo '</td>';
}
echo '<td align = "left">';
echo '<a href = "afisare_articol.php?cod='.$cod.'">
'.$art['denumire'].'</a>
produs de '.$art['producator'];
echo '</td><td align = "center">
'.number_format($art['pret'], 2,'.','').' RON';
echo '</td><td align = "center">';
// daca permitem schimbarea, cantitatea va fi in textbox
if ($change == true)
echo "<input type = 'text' name = \"$cod \" value = \"$qty \"
size = 3>";
else
echo $qty;
echo '</td><td align ="c enter">
'.number_format($art['pret']*$qty,2,'.','').
'RON'."</td></tr> \n";
}
// afiseaza linia cu totalul
echo "<tr>
<th colspan = ". (2+$images) .
" bgcolor= \"#cccccc \">&nbsp;</td>
<th align = \"center \" bgcolor= \"#cccccc \">
".$_SESSION['items']."
</th>
<th align = \"center \" bgcolor= \"#cccccc \">".
number_format($_SESSION['pret_total'], 2,'.','')." RON
</th>
</tr>";

54 // afisare but on de actualizare
if($change == true)
{
echo '<tr>
<td colspan = '. (2+$images) .'>&nbsp;</td>
<td align = "center">
<input type = "hidden" name = "save" value = true>
<input type = "image" src = "images/actualizare.jpg"
border = 0 alt = "Actualizeaza">
</td>
<td>&nbsp;</td>
</tr>';
}
echo '</form></table>';}
Funcția afișare_coș funcționează astfel:
– printr -un foreach se transferă fiecare c od al articolului
funcției extrage_detalii_articol pentru a putea obține detali-
ile acestuia
– afișează câte o imagine redimensionată (în HTML) pentru fi-
ecare articol
– fiecare articol din coș este afișat ca o legătură către pagina
lui cu detalii
– dacă apelăm fu ncția cu parametrul change având valoarea
true, cantitățile pot fi modificate și apare butonul „Actuali-
zează”, altfel nu se pot face modificări (de exemplu după ce
clientul a trecut pe la casă).

Rezultatul acestui script se poate vedea în figurile 9 și 1 0.
Figura 9. Afisarea coșului de cumpărături

55
Figura 10. Actualizarea coșului de cumpărături

În cazul în care utilizatorul va apăsa butonul „Mergi la casă” , se
activează scriptul checkout.php prin care se afișează din nou
coșul de cumpărături, dar nu ma i pot fi făcute modificări. Apoi
se afișează formularul de preluare a datelor necesare completă-
rii facturii și livrării produselor și două butoane
„Cumpara” – care confirmă comanda și
„Continuă cumpărăturile” – care permite întoarcerea la catalogul
de produse.

Scriptul PHP care realizează acestea este:
<?php
include ('produse.php');
session_start();

do_html_titlu('Plata');
if($_SESSION['cart']&&array_count_values($_SESSION['cart']))
{
afisare_cos($_SESSION['cart'], false, 0);
afisare_t axe_exp (calculeaza_taxe_exp());
formular_checkout();
}
else
echo '<p>Cosul este gol!</p>';
afisare_buton('afisare_cos.php', 'continua -cumparaturile',
'Continue Cumparaturile');
?>
function afisare_taxe_exp($taxe)
{
// afiseaza tabelul cu costurile de expediere si pretul
total(incluz ând aceste taxe)

56 ?>
<table border = 0 width = '100%' cellspacing = 0>
<tr><td align = 'left'>Taxe de expediere</td>
<td align = 'right'> <?php echo number_format($taxe,
2,'.','').' RON'; ?></ td></tr>
<tr><th bgcolor='#cccccc' align = 'left'>TOTAL </th>
<th bgcolor='#cccccc' align = 'right'><?php echo
number_format($taxe+$_SESSION['pret_total'],
2,'.','').' RON'; ?></th>
</tr> </table><br />
<?php
}
function formular_checkout()
{
//afiseaza formularul prin care se introduc datele cumparatorului
?>
<br />
<table border = 0 width = '100%' cellspacing = 0>
<form action = 'cumpara.php' method = 'post'>
<tr><th colspan = 2 bgcolor='#cccccc'>
Datele dumneavoastra</th>< /tr>
<tr>
<td><b>* Nume firma </b></td>
<td><input type = 'text' name = 'nume' value = ""
maxlength = 40 size = 40></td>
</tr>
<tr>
<td><b>* Numar la Registrul Comertului </b></td>
<td><input type = 'text' name = 'nr_reg_ com' value = ""
maxlength = 40 size = 40></td>
</tr>
<tr>
<td><b>* Cod unic de identificare </b></td>
<td><input type = 'text' name = 'cui' value = ""
maxlength = 40 size = 40></td>
</tr>
<tr>
<td><b>* Adresa </b></td>
<td><input type = 'text' name = 'adresa' value = ""
maxlength = 40 size = 40></td>
</tr>
<tr>
<td><b>* Oras </b></td>
<td><input type = 'text' name = 'oras' value = ""
maxlength = 20 size = 40></td>
</tr>
<tr>
<td>Cod postal</td>
<td><input type = 'text' name = 'cod' value = ""
maxlength = 10 size = 40></td>

57 </tr>
<tr>
<td>Tara</td>
<td><input type = 'text' name = 'tara' value = ""
maxlength = 20 size = 40></td>
</tr>
<tr>
<td><b>* Numar cont </b></td>
<td><input type = 'text' name = 'cont' value = ""
maxlength = 40 size = 40></td>
</tr><tr>
<td><b>* Banca</b> </td>
<td><input type = 'text' name = 'banca' value = "ROCT"
maxlength = 40 size = 40></td>
</tr><tr>
<td>Telefon </td>
<td><input type = 'text' name = 'telefon' value = ""
maxlength = 40 size = 40></td>
</tr>
<tr>
<td colspan = 2 align = 'center'>
<b>Apasati butonul Cumpara pentru a confirma comanda
dumneavoastra. sau Continua cumparaturile pentru a
adauga sa a renunta la articole</b> <br>
<center><input type ='image' src="images/cumpara.jpg"
alt="cumpara" border=0 height = 50
width = 135></center>
</td>
</tr>
</form>
</table><hr />
<?php
}
Efectul acestui script se poate vedea în figura 11, iar în figura
12 am arătat un formular completat cu datele necesare încheierii
tranzacției.

58
Figura 11. Pagin a de checkout (apare după apăsarea butonului „Mergi la
casă”)

Figura 12. Model de formular completat

59 La acționarea butonului „Cumpara”, se va afișa forma finală a
coșului de cumpărături, se va adăuga în baza de date comanda
efectuată și se va genera factura proformă. Scriptul care reali-
zează acest lucru este prezentat la punctul în care am analizat
generarea facturii , dar efectul lui se observă în figura 13 .

Figura 13. Pagina cu ultima operație a procesului de comandă

3.2.5. Generarea facturii
Se face ca urmare a necesității completării unei facturi în
momentul când a fost efectuată o comandă. Modulul din site -ul
propus, generează automat o astfel de factură utilizând datele
din formularul de comandă și pe cele din coșul de cumpărături
al persoane i care s -a autentificat în prealabil. Formatul PDF al
documentului fiscal a fost ales în primul rând din motive de se-
curitate (modificare frauduloasă), dar și pentru calitatea rezul-
tatului tipărit (atât pe ecran cât și pe hârtie), dimensiunea re-
dusă a fiși erului care va fi descărcat și/sau trimis prin email și
portabilitate.
Limbajul PHP oferă suport pentru crearea documentelor
PDF. Există mai multe biblioteci cu funcții pentru lucrul cu astfel
de documente. Am ales în această lucrare biblioteca PDFLib
deoarece este actualizată și întreținută mai constant decât alte
librării de același tip și permite utilizarea gratuită în scopuri non –
comerciale.

60 Mai jos am prezentat scriptul comentat care arată afișa-
rea paginii finale a procesării comenzii cu modalitatea de gene-
rare a facturii . Acesta este apelat în momentul în care se apasă
butonul „Cumpără” .
<?php
include ('produse.php');
session_start();

// creaza nume scurte de variabile
$nume = $_POST['nume'];
$nr_reg_com = $_POST['nr_reg_com'];
$cui = $_PO ST['cui'];
$adresa = $_POST['adresa'];
$oras = $_POST['oras'];
$cont = $_POST['cont'];
$banca = $_POST['banca'];

$data = date('d.m.y');
$taxe_exp = calculeaza_taxe_exp();

$cart = $_SESSION['cart'];
// daca formularul a fost completat
if($_SESSION['cart']&&$nume&&$nr_reg_com&&$cui&&
$adresa&&$oras&&$cont&&$banca)
{
// daca se poate adauga in bd
if( adauga_comanda($_POST)!=false )
{
$nr_factura = adauga_comanda($_POST);
//afiseaza cosul, nu permite s chimbari si fara imagini
afisare_cos($_SESSION['cart'], false, 0);
afisare_taxe_exp(calculeaza_taxe_exp());
echo '<br><br>Action ând linkul de mai jos puteti descarca
factura pe calculatorul dumneavoastra. <br> ';

// CREAZA FACTURA PROFORMA IN FORMAT PDF

//crearea unui document în memorie
$pdf = PDF_new();
PDF_open_file($pdf,'fact.pdf');

//distanța de la marginea paginii la chenar
$inset = 20;

//numele fontului care va fi utilizat
$fontname = 'Times -Roman';

// dimensiunea paginii în puncte A4 are 11.69 ’’ x 8.27’’ și sunt 72
de puncte pe inch

61 $width = 8.27*72;
$height = 11.69*72;

// coordonatele maxime pe axe
$x = $width – 2*$inset;
$y = $height – 2*$inset – 3.5*72;

//începe o pagină nouă
PDF_begin_page($pdf, $width, $height);

// GRAFICA

//stabilește grosimea liniei de desenare
PDF_setlinewidth($pdf, 1.0);

//chenarul facturii
PDF_rect($pdf, $inset, $inset, $x, $y);

//liniile de sus

//linia 1 – antet
PDF_moveto($pdf, $inset, $y -0.2*$inset);
PDF_lineto($pdf , $inset+$x, $y -0.2*$inset);
PDF_closepath($pdf);

//linia 2 – antet
PDF_moveto($pdf, $inset, $y -0.8*$inset);
PDF_lineto($pdf, $inset+$x, $y -0.8*$inset);
PDF_closepath($pdf);

//linia 1 – vert
PDF_moveto($pdf, 3*$inset, $y/2 -65);
PDF_lineto($pdf, 3*$inset, $y+$inset);
PDF_closepath($pdf);

//linia 2 – vert
PDF_moveto($pdf, $x/4+30, $y/2 -65);
PDF_lineto($pdf, $x/4+30, $y+$inset);
PDF_closepath($pdf);

//linia 3 – vert
PDF_moveto($pdf, $x/4+50, $y/2 -65);
PDF_lineto($pdf, $x/4+50, $y+$inset);
PDF_closepath($pd f);

//linia 4 – vert
PDF_moveto($pdf, $x/2, $y/2 -65);
PDF_lineto($pdf, $x/2, $y+$inset);
PDF_closepath($pdf);

62 //penultima
PDF_moveto($pdf, 3*$x/4 -50, $y/2 -65);
PDF_lineto($pdf, 3*$x/4 -50 , $y+$inset);
PDF_closepath($pdf);

//ultima
PDF_moveto($pdf, 3*$x/ 4+50, $y/2 -65);
PDF_lineto($pdf, 3*$x/4+50 , $y+$inset);
PDF_closepath($pdf);

//liniile de jos
PDF_moveto($pdf, $inset, $y/2 -65);
PDF_lineto($pdf, $inset+$x , $y/2 -65);
PDF_closepath($pdf);

PDF_moveto($pdf, $x/4 -10, $y/2 -65 );
PDF_lineto($pdf, $x/4 -10 , $inset);
PDF_closepath($pdf);

PDF_moveto($pdf, $x/2+35, $y/2 -65 );
PDF_lineto($pdf, $x/2+35 , $inset);
PDF_closepath($pdf);

PDF_moveto($pdf, 3*$x/4, $y/2 -65);
PDF_lineto($pdf, 3*$x/4 , $inset);
PDF_closepath($pdf);

PDF_moveto($pdf, $x/2+35, $y/4);
PDF_l ineto($pdf, $x+$inset , $y/4);
PDF_closepath($pdf);

//linia pt total valoare si total tva
PDF_moveto($pdf, 3*$x/4 -50, $y/4+100);
PDF_lineto($pdf, $x+$inset , $y/4+100);
PDF_closepath($pdf);

//pentru desenarea tuturor formelor din memorie
PDF_stroke($pdf );

// TEXTUL

//adaugă titlul FACTURA PROFORMA
$font = PDF_findfont($pdf, $fontname, 'host', 0);
if($font)
PDF_setfont($pdf, $font, 24);
$startx = ($width – PDF_stringwidth($pdf, 'FACTURA', $font,
24))/2;
PDF_show_xy($pdf, 'FACTURA', $st artx, 750);
$startx = ($width – PDF_stringwidth($pdf, 'PROFORMA', $font,
24))/2;

63 PDF_show_xy($pdf, 'PROFORMA', $startx, 730);

//schimbă dimensiunea și afișează datele despre furnizor și
cumpărător
PDF_setfont($pdf, $font, 14);
PDF_show_xy ($pdf, 'Furnizor',$inset, 800);
PDF_continue_text($pdf,'F.E. MOELPA S.R.L.');
PDF_continue_text($pdf,'Nr.ord.reg.com./an');
PDF_continue_text($pdf,'J 32/1842/2005');
PDF_continue_text($pdf,'Cod fiscal R 018221870');
PDF_continue_text($pdf,'Sediul str.OITUZ nr.31');
PDF_continue_text($pdf,'Judetul SIBIU');
PDF_continue_text($pdf,'Contul');
PDF_continue_text($pdf,'R028BROCT330SV1978673303');
PDF_continue_text($pdf,'Banca ROCT TIMISOARA');

PDF_show_xy($pdf, 'Cumparator',3*$x/4 -20, 800);
PDF_continue_text($pdf ,strtoupper($nume));
PDF_continue_text($pdf,'Nr.ord.reg.com./an');
PDF_continue_text($pdf,$nr_reg_com);
PDF_continue_text($pdf,'Cod fiscal '.$cui);
PDF_continue_text($pdf,'Sediul '.strtoupper($adresa));
PDF_continue_text($pdf,'Judetul '.strtoupper($oras));
PDF_continue_text($pdf,'Contul');
PDF_continue_text($pdf,strtoupper($cont));
PDF_continue_text($pdf,'Banca ROCT TIMISOARA');

PDF_show_xy($pdf,'Nr.facturii '.$nr_factura ,$x/2 -50, 630);
PDF_show_xy($pdf,'Data(ziua,luna,anul) '.$data ,$x/2 -50, 610);
PDF_s how_xy($pdf,'Cota T.V.A…19%',30,575);

PDF_setfont($pdf, $font, 12);
PDF_show_xy($pdf, 'Nr. Denumirea Pretul unitar Valoare',
30,$y+10);
PDF_continue_text($pdf, 'Crt. produselor UM Cantitatea
(fara T.V.A.) Valoare T.V.A.');
PDF_con tinue_text($pdf,' 0 1 2 3 4 5(3*4) 6 ');

//calculează datele numerice cu care trebuie completată
factura și le afișează
$total_tva = 0;
$total_valoare = 0;
$i = 0;
foreach ($_SESSION['cart'] as $cod => $cantitate)
{
$rez = extrage_deta lii_articol($cod);
$denumire = $rez['denumire'];
$pret = 0.81*$rez['pret'];
$conn = db_connect();
$query = "select * from articole_comanda

64 where cod='$cod' and nr_comanda
= $nr_factura";
$result = @$conn ->query($query);
$result = @$result ->fetch_assoc();
$cantitate = $result['cantitate'];
$valoare = $pret * $cantitate;
$valoare_tva = 19*$valoare/81;
$total_tva += $valoare_tva;
$total_valoare += $valoare;

$pret = number_format($pret,2,'.','');
$valoare =
number_format($valoare,2,'.','');
$valoare_tva =
number_format($valoare_tva,2,'.','');

// determină lungimea textului și o ajustează pentru
a nu apărea decalaje la afișare
while(PDF_stringwidth($pdf, strtolower($denumire), $font,
12) < 107)
$denumire . = ' ';
while(PDF_stringwidth($pdf, $pret, $font,12) <50)
$pret .= ' ';
while(PDF_stringwidth($pdf, $valoare, $font,12) <50)
$valoare .= ' ';
while(PDF_stringwidth($pdf, $valoare_tva, $font,12) <50)
$valoare_tva .= ' ';

PDF_continue_text($pdf,''.++$i.' .strtolower($denumire).'buc
'.$cantitate.' '.
$pret.' '.
$valoare.' '.
$valoare_tva);
}
$total = $total_valoare + $to tal_tva + $taxe_exp; }
else {
echo 'Nu putem inregistra datele; incearca din nou.';
afisare_buton('checkout.php', 'back', 'Back');
exit;
}
}
else
{
echo 'Nu ai completat toate campurile cerute.
Incearca din nou<hr />';
afisare_buton('checkout.php', 'back', 'Back');
exit;
}

65 // COMPLETAREA PARTII INFERIOARE A FACTURII
//textul
PDF_show_xy($pdf,'Semnatura si ',$inset+2, $y/4+55);
PDF_continue_text($pdf,'stampila ');
PDF_continue_text($pdf , 'furnizorului');
PDF_show_xy($pdf,'Date privind expeditia ',$x/4 -9, $y/4+55);
PDF_continue_text($pdf,'');
PDF_continue_text($pdf,'');
PDF_continue_text($pdf,'Numele delegatului………………');
PDF_continue_text($pdf,'……………………………………');
PDF_continue_t ext($pdf,'Buletinul/cartea de identitate');
PDF_continue_text($pdf,'Seria…..nr……eliberat(a)…………');
PDF_continue_text($pdf,'Mijloc de transport…………………');
PDF_continue_text($pdf,'nr………………………………');
PDF_continue_text($pdf,'Expeditia s -a facut in prezen ta noastra');
PDF_continue_text($pdf,'la data de…………..ora…………….');
PDF_continue_text($pdf,'Semnaturile………………………..');
//valoare totala
PDF_show_xy($pdf, number_format($total_valoare,2,'.',''),
3*$x/4 -20, $y/2 -55);
// total tva
PDF_show_xy($ pdf, number_format($total_tva,2,'.',''),
3*$x/4+80, $y/2 -55);

//taxele de expediere
PDF_show_xy($pdf, 'Taxe de', $x/2+55, $y/4+35);
PDF_continue_text($pdf,'expediere');
PDF_show_xy($pdf, number_format($taxe_exp,2,'.',''),
3*$x/4+65, $y/ 4+30);

PDF_show_xy($pdf, 'Semnatura', $x/2+55, $y/4 -15);
PDF_continue_text($pdf,'de primire');
PDF_show_xy($pdf, 'Total de plata:', 3*$x/4+5, $y/4 -15);
PDF_continue_text($pdf,'(col.5 + col.6 + taxe exp.)');
PDF_setfont($pdf, $font, 14);
PDF_sh ow_xy($pdf, number_format($total,2,'.','').' RON',
3*$x/4+40, $y/4 -70);

// închide pagina
PDF_end_page($pdf);
// închide documetul pdf
PDF_close($pdf);

// download pentru factura generată
echo "Descarcati <a href = 'fact1.pdf'>FACTURA PR OFORMA</a>
in format pdf.<br><br>";
echo 'Dupa ce veti face plata in contul nostru, articolele comadate
va vor fi livrate prin curier, in cel mai scurt timp';
echo '<br><br><h3>Va multumim ca ati cumparat de la noi!</h3>';
}?>

66 Factura generată prin acest script este :

Figura 14. Factura proformă generată prin program
– uz didactic –

67 3.2.6. Căutarea produselor în site

Orice site Web, în special un magazin virtual care conține
multe produse, trebuie să posede un modul de căutare pentru a
facilita regăsirea informațiilor. Și aplicația de față conține o as-
tfel de funcție pentru a căuta în catalogul virtual un articol pen-
tru care nu se cunoaște decât denumirea aproximativă.
Iată cum funcționează acest modul. Cel mai simplu este
să introduceți în formular denumirea aproximativă a articolului:

Căutarea se face în toata baza de date. Se va genera următorul
raport:

În cazul în care dorim să facem căutatea numai într -o
anumită categorie trebuie să o alegem din lista derulantă, astfel:

68

și apo i să introducem denumirea articolului căutat:

Articolele care respectă acest criteriu vor fi afișate:

Dacă acționăm clic pe unul din produsele selectate se vor afișa
toate detaliile produsului și acesta poate fi adăugat în coș.

69

Codul PHP utiliz at în realizarea căutării este prezentat în cele ce
urmează.

Scriptul care crează formularul de căutare:

<?php

require_once('produse.php');

function cauta()
{
?>
<form name='cauta' action=' cauta_articol.php ' method='post'
target=" afis">
<table bgcolor="#F3F7B3" width="207">
<tr>
<td colspan=2 align='center'><h4>
Cautare articole</h4></td>
</tr>

<tr>
<td> Categoria:
<select name="fnr_cat" size="1" >
<opti on selected value="">
<?php
if(isset($fnr_cat) and ($fnr_cat!=10) and ($fnr_cat>0)){

70 $conn=db_connect();
$query='select nr_cat, den_cat from categorii where
nr_cat=$fnr_cat';
$categ=@$conn -query($query);
$categ=@$categ ->fetch_assoc();
$fnr_cat=$categ['nr_cat'];
$den_cat=$categ['den_cat'];
echo $fnr_cat;
echo $den_cat;
echo '<option value=10> toate categoriile \n';
$where="where nr_cat=$fnr_cat";
}
else {
echo("toate categori ile");
$fnr_cat=10;
}
$conn = db_connect();
$query = "select nr_cat, den_cat from categorii where
nr_cat!=$fnr_cat";
$categ = @$conn ->query($query);
for ($count = 0; $cat = @$categ – >fetch_assoc(); $count++)
{
$fnr_cat=$cat['nr_cat'];
$den_cat=$cat['den_cat'];
echo ("<option value = '$fnr_cat'> $den_cat \n");
}
?>
</select>
<br/>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Articol:
<input type = "text" name = "articol" size="15">

<!– butonul de tip submit –>
&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="submit" name="submit" value="Cauta" >
</td></tr>
</table>
</form>
}
?>

Scriptul care efectuează căutarea propriu -zisă:
<?php
require_once( 'produse.php');
session_start();
$articol = $_POST['articol'];
$fnr_cat = $_POST['fnr_cat'];
do_html_titlu("Rezultatul cautarii dupa cuvantul '".$articol."'");
if(isset($fnr_cat))

71 {
$select = "select distinct cod, denumire, producator, pret";
$from = " from produse";
if($where == "")
{
$where = " where cod!=0";
}
if($fnr_cat != "" and $fnr_cat != 10 and $fnr_cat > 0)
{
// este selectata o categorie
$where .= " and nr_cat = $fnr_cat";
}
$conn = db_connect();
$query = $select.$ from.$where." and denumire like
'%$articol%' order by pret asc";
$result = @$conn ->query($query);
if (!$result)
echo 'Nu s -a putut efectua cautarea. Reveniti.';
else
{
$num_books = @$result ->num_rows;
if ($num_books == 0)
echo 'nu exista articolul';
$result = db_result_to_array($result);
echo $result ->num_rows;
echo $result ->denumire;
afisare_articole($result);
}
}
?>
Mai sus, afișare_articole este o funcție pe care am preze ntat-o
anterior la listarea caracteristicilor unui articol dintr -o categorie.

3.2.7. Topul produselor vândute
Acesta poate ară ta unui potențial cumpărător care sunt
cele mai căutate produse și deci, poate și cele mai calitative.
Totodată reprezintă un ra port util firmei care se generează au-
tomat, nemaifiind necesară o muncă suplimentară.
Pentru a implementa acest raport este necesar să deter-
minăm un total al cantităților vândute pentru fiecare articol în
parte, apoi să sortăm descrescător produsele în fun cție de
aceste cantități și să le afișăm pe primele 5. Fiecare articol afișat
reprezintă și o legătură pentru cumpărarea acelui articol,
ușurând astfel munca utilizatorului care nu mai trebuie să caute
acel articol.

72 Scriptul PHP care implementează acest mo dul este următorul :
<?php
function top5()
{
// extrage toate articolele, ordonate crescator dupa cod
$conn=db_connect();
$query='select * from articole_comanda order by cod asc';
$rez=@$conn ->query($query);
$row = $rez ->num_rows;
$rez = db_result _to_array($rez);
$nr = array();
$i = 0;
// determina cantitatea totala vanduta de la fiecare articol
while($i < $row)
{
$cod = $rez[$i]['cod'];
$nr[$cod] += $rez[$i]['cantitate'];
$n = $cod;
$i++;
}
// sorteaza descrecator codurile articolel or, dupa cantitatea vanduta
$desc = array();
$k = 0;
for($i = 11; $i <= $n; $i++)
{
$desc[$k] = $i;
for($j = 0; $j <= $k; $j++)
if( $nr[$desc[$j]] < $nr[$desc[$k]] ){
$aux = $desc[$j];
$desc[$j] = $desc[$k];
$desc[$k] = $aux; }
$k++;
}
$query='select * from produse';
$rez = @$conn ->query($query);
$rez = @$rez ->fetch_assoc();
// afiseaza primele 5 articole in ordinea descrescatoare a vanzarilor
if($rez)
try{
echo '<table width = 50% border = 0 align = center>';
echo '<tr><td rowspan = 5>
<img src = "images/top5.jpg" align =
center> </td>';
for ($i = 0; $i < 5; $i++)
{
if($i < 5 and $nr[$desc[$i]] != 0)
{
$url = 'afisare_articol.php?cod='.$desc[$i];
echo '<td alig n = center>';
if (@file_exists('images/'.$desc[$i].'.jpg'))

73 {
$size =
GetImageSize('images/'.$desc[$i].'.jpg');
$denumire =
'<img src= \'images/'.$desc[$i].'.jpg \'
border=0 width = '. $size[0]/3 . 'height =
'.$size[1]/3 . '/>';
do_html_url($url, $denumire, afis);
}
echo '</td><td>';
if ($nr[$desc[$i]] !=1 )
echo $nr[$desc[$i]].' bucati vandute';
else
echo $nr[$desc[$i]].' bucata vanduta';
}
echo '</td></tr>';
}
echo '</table>';
}
catch (Exception $e) {
echo 'Nu pot fi extrase datele!'; }
else
echo 'Nu exista niciun produs vandut!' ;
}?>

Rezultatul afișat este în figura 15 :

Figura 15 . Topul celor mai bine 5 produse vândute

74 3.3. Administrarea aplicației

Pentru a accesa interfața de administrare a programului, utiliza-
torul trebuie să deschidă o sesiune de lucru prin intermediul mo-
dulului de autentificare.

Dacă este recunoscu t ca administrator,
function check_admin_user()
// verifica daca administratorul este logat
{
if (isset($_SESSION['admin_user']) )
return true;
else
return false;
}
va fi afișată homepage care conține un meniu cu operațiile pe
care le poate efect ua. Scripturile pentru autentificarea adminis-
tratorului și pentru afișarea paginii inițiale sunt prezentate în
paragraful 3.2.2. din acest capitol . Funcția care afișează meniul
de administrare este:
function afisare_meniu_admin()
{
?>
<br /><br />
<a href= "formular_adauga_categorie.php" target = afis>Adauga o noua cate-
gorie</a><br /><br />
<a href="formular_adauga_articol.php" target = afis>Adauga un articol
nou</a><br /><br />
<a href="formular_schimba_parola.php" target = afis>Schimba parola de ad-
ministra tor</a>
<br /><br />
<font color="BLUE"> Pentru a modifica sau a sterge o categorie sau un articol,
actionati clic pe obiectul corespunzator! </font>
<br /><br />
<?php
}

75
Figura 16. Pagina principală pentru administratorul magazinului virtual

Voi preze nta acum opțiunile pe care le are cuprinse administra-
torul în meniul său.
Adăugarea unei noi categorii se face prin apelarea scriptului for-
mular_adauga_categorie.php Se observă în scriptul de mai jos
ca apelează funcția formular_afisare_categorii() care ar e o
funcție dublă – aceea de adăugare și aceea de modificare a ca-
tegoriei. Pentru a efectua operația de adăugare am apelat
această funcție fără parametru.

<?php
require_once('produse.php');
session_start();

do_html_titlu('Adauga o categorie');
if (check _admin_user())
formular_afisare_categorii ();
else
echo 'Nu esti autorizat sa accesezi aceasta pagina.';
?>

function formular_afisare_categorii($categorie = '')
// Afiseaza formularul de categorii
// Poate fi folosit pentru a adauga sau a edita categor ii.
// Pentru inserare – nu se trece niciun parametru.
// $edit va lua valoarea false, si formularul va merge la
adauga_categorie.php.
// Pentru modificare, se introduce un sir ce contine o categorie.

76 // Formularul va contine vechea data si un punc t de trimitere la
editare_categorie.php
// Se adauga si un buton pentru stergere categorie.
{
// daca se introduce o categorie, se continua in modul editare
$edit = is_array($categorie);

?>
<form method='post'
action="<?php echo $edit?' editare_categorie.php ':
'adauga_categorie.php' ; ?>">
<table width=200 border=0>
<tr>
<td>Denumire categorie:</td>
<td><input type='text' name='den_cat' size=15
maxlength=25 value="<?php echo $edit?
$categorie['den_cat']:''; ?>"></td>
</tr>
<tr>
<td <?php if (!$edit) echo 'colspan=2'; ?> align=center>
<?php if ($edit)
echo '<input type="hidden" name="nr_cat"
value="'.$categorie['nr_cat'].'">';
?>
<input type='submit'
value="<?php echo $edit?'Actualizare':'Adaugare'; ?>
Categorie"
onClick = "return refresh_categorii();"> </form>
</td>
<?php if ($edit)
// permite stergerea categorilor existente
{
echo '<tr><td>';
echo '<form method="post"
action=" sterge_categorie.php ">';
echo '<input type="hidden" name="nr_cat"
value="'.$categorie['nr_cat'].'">';
echo '<input type="su bmit"
value="Stergere Categorie">';
echo '</form></td></tr>';
}
?>
</tr>
</table>
<?php
}

77 Se va afișa formularul

Acesta, la acționarea butonului de tip submit, apelează s criptul
adaugă_categorie care este prezentat mai jos
<?php
require_once('produse.php');
session_start();
do_html_titlu('Adauga o categorie');
if (check_admin_user())
{
if (filled_out($HTTP_POST_VARS))
{
$den_cat = $HTTP_POST_VARS['den_cat'];
if(adauga_categorie ($den_ cat)){
echo 'Categoria '.$den_cat.' a fost adaugata la baza de date.<br />';
?>
<!– script pentru refresh categorii –>
<script language="Java Script" type ="text/javascript">
window.open("categorii.php","categ");
</script>
<?php
}
else
echo 'Categoria '.$den_cat.' nu a putut fi adaugata la baza de date.
<br />';
}
else
{
echo 'Nu ati completat formularul. ';
echo '<br>';
do_html_url('formular_adauga_categorie.php', 'Incercati din nou.', afis);
echo '<br>';
}
}
else
echo 'Nu esti autorizat sa accesezi aceasta pagina.';
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare',afis);
?>

function adauga_categorie($den_cat)
// adauga o noua categorie in bd

78 {
$conn = db_connect ();

// verifica daca nu exista deja categoria
$query = "select *
from categorii
where den_cat='$den_cat'";
$result = $conn ->query($query);
if (!$result || $result ->num_rows!=0)
return false;

// adauga noua categorie
$query = "insert into categorii values
('', '$den_cat')";
$result = $conn ->query($query);
if (!$result)
return false;
else
return true;}

și are efectul care se observă în figura 17.

Figura 17. Adăugarea unei categorii de produse

79 Adăugarea un ui nou articol se face prin apelarea scriptului for-
mular_adauga_ articol .php Se observă în scriptul de mai jos ca
apelează funcția formular_afisare_ articol () care are o funcție
dublă – aceea de adăugare și aceea de modificar e a unui articol .
Pentru a efectua operația de adăugare am apelat această funcție
fără parametru.
<?php
require_once('produse.php');
session_start();
do_html_titlu('Adauga un produs');
if (check_admin_user())
formular_afisare_articol ();
else
echo 'NU sunteti autorizat sa intrati aici!';
?>
function formular_afisare_articol($art = '')
// Aceasta afiseaza formularul pentru articole.
// Acest formular poate fi folosit pentru a insera sau a edita articole.
// Pentru a insera, nu se trece niciun parametru.
// Se va seta $edit pe false, si formularul va merge la adauga_articol.php.
// Pentru editare, se trece un vector ce contine un articol
// Formularul va afisa vechile date si va indica modifica_articol.php.
// Va dauga si un buton "Sterge articol"
{
// daca se introduce o carte, se continua in modul editare
$edit = is_array($art);
?>
<form method='post'
action="<?php echo $edit?' editare_articol.php ':
'adauga_articol.php' ;?>">
<table width=150 cellpadding=2 cells pacing=0 bgcolor="#cccccc"
border=0>
<tr>
<td>Cod articol:</td>
<td><input type='text' name='cod'
value="<?php echo $edit?$art['cod']:''; ?>"></td>
</tr>
<tr>
<td>Denumire:</td>
<td><input type='text' name='den umire'
value="<?php echo $edit?$art['denumire']:''; ?>"></td>
</tr>
<tr>
<td>Producator:</td>
<td><input type='text' name='producator'
value="<?php echo $edit?$art['producator']:''; ?>"></td>
</tr>
<tr>

80 <td>Categ orie:</td>
<td><select name='nr_cat'>
<?php
// lista categoriilor din baza de date
$cat_array=extrage_categoriile();
foreach ($cat_array as $thiscat) {
echo '<option value="';
echo $thiscat['nr_cat'];
echo '"';
// daca este un articol existent, il trece in categoria curenta
if ($edit && $thiscat['nr_cat'] == $art['nr_cat'])
echo ' selectat';
echo '>';
echo $thiscat['den_cat'];
echo " \n";
}
?>
</select>
</td>
</tr>
<tr>
<td>Pret:</td>
<td><input type='text' name='pret'
value="<?php echo $edit?$art['pret']:'' ; ?>"></td>
</tr>
<tr>
<td>Descriere:</td>
<td><textarea rows=5 cols=15
name='descriere'>
<?php echo $edit?$art['descriere']:''; ?>
</textarea></td>
</tr>
<tr>
<td <?php if (!$edit) echo 'colspan= 2'; ?> align='center'>
<?php
if ($edit)
// am nevoie de codul vechi pentru a gasi un articol
// in baza de date daca se actualizeaza codul
echo '<input type="hidden" name="cod_vechi"
value="'.$art['cod'].'">';
?>
<input type='submit'
value="<?php echo $edit?'Actualizare':'Adaugare'; ?> Articol">
</form></td>
<?php
if ($edit) {
echo '<tr><td>';
echo '<form method="post" action=" sterge_articol.php ">';
echo '<input type="hidden" name="cod"
value="'.$art['cod'].'">';

81 echo '<input type="submit"
value="Stergere Articol">';
echo '</form></td></tr>';
}
?>
</td>
</tr>
</table>
</form>
<?php}

Se va afișa formularul din figura 18, de unde se observă datele
care trebuie completate pentru adăugarea unui articol într -o
anumită catego rie a magazinului virtual și rezultatul acestei ope-
rații.

Figura 18. Adaugarea unui articol în magazinul virtual

82 La acționarea butonului de tip submit se apelează scriptul
adaugă_articol care este prezentat mai jos
<?php
require_once('produse.php');
session_start();
do_html_titlu('Adauga un articol');
if (check_admin_user())
{
if (filled_out($_POST))
{
$cod = $_POST['cod'];
$denumire = $_POST['denumire'];
$producator = $_POST['producator'];
$nr_cat = $_POST['nr_cat'];
$pret = $ _POST['pret'];
$descriere = $_POST['descriere'];

if(adauga_articol ($cod, $denumire, $producator, $nr_cat, $pret,
$descriere))
echo "Articolul '".stripslashes($denumire)."' a fost adaugat
in baza de date.<br />";
else
echo "Articolul ".stripslashes($denumire).
" nu a putut fi adaugat in baza de date.<br />";
}
else
{
echo 'Nu ati completat formularul. ';
echo '<br>';
do_html_url('formular_adauga_articol.php ', 'Incercati din nou.',afis);
echo '<br>';
}
}
else
echo 'Nu sunteti autorizat sa vedeti aceasta pagina.';
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare',afis);

?>

function adauga_articol($cod, $denumire, $producator, $nr _cat, $pret,
$descriere)
// adauga un nou articol in bd
{
$conn = db_connect();

// verifica daca articolul nu exista deja in bd
$query = "select *
from produse
where cod='$cod'";

83
$result = $conn ->query($query);
if (!$result || $result ->num_rows!=0)
return false;

// adauga un nou articol
$query = "insert into produse values
('$cod', '$denumire', '$producator', '$nr_cat', $pret, '$descriere')";

$result = $conn ->query($query);
if (!$result){
echo $result ->num_rows;
return false;
}
else
return true;
}

Modificarea unei categorii se face acționând butonul „Editare ca-
tegorie” ce apare la afișarea articolelor din categoria respectivă
(vezi figura 19) .

Figura 19. Fereastra de editare a produselor dintr -o categorie

Scriptul PHP este același cu cel prezentat anterior la adăugarea
unei categorii, numai că aici se apelează funcția formu-
lar_afisare_categorii cu parametrul $nr_cat, adică numărul ca-
tegoriei. Aceasta are ca efect apelarea scriptului editare_cate-
gorie.php al cărui cod este prezentat mai jos.

84 <?php
require_once('produse.php');
session_start();

do_html_titlu('Modificare categorie');
if (check_admin_user())
{
if (filled_out($HTTP_POST_VARS))
{
if(modificare_categorie ($HTTP_POST_VARS['nr_cat'],
$HTTP_POST_VARS['den_cat']))
{
echo 'Categoria a fost modificata.<br />';
?>
<!– script pentru refresh categorii –>
<script language="Java Script" type ="text/javascript">
window.open("categorii.php","categ");
</script>
<?php
}
else
echo 'Categoria nu a putut fi modificata.<br />';
}
else {
echo 'Nu ai completat formularul. ';
echo '<br>';
do_html_url('formular_editare_categorie.php', 'Incercat i din nou.', afis);
echo '<br>';
}
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare', afis);
}
else
echo 'Nu esti autorizat sa accesezi aceasta pagina.';
?>

function modificare_categorie($nr_cat, $den_cat)
// schimba numele categoriei in bd
{
$conn = db_connect();

$query = "update categorii
set den_cat='$den_cat'
where nr_cat='$nr_cat'";
$result = @$conn ->query($query);
if (!$result)
return false;
else
return true;
}

85 Formu larul afișat este următorul:

iar efectul se vede în frame -ul din stânga, instantaneu la apăsa-
rea butonului de actualizare.
Tot în acest formular mai apare și un buton pentru ștergerea
categoriei. În cazul în care acesta este apăsat se va apela scrip-
tul sterge_categorie.php care va încerca să steargă categoria
din magazinul virtual . Așa cum se observă din figura 20, cate-
goria nu poate fi ștearsă dacă mai conține articole. În primul
rând ar trebui șterse articolele și de abia apoi categoria.

Figura 20. Mesaj din timpul operației de ștergere a categorie i

Scripul care execută ștergerea este următorul:
<?php
require_once('produse.php');
session_start();
do_html_titlu('Stergere categorie');
if (check_admin_user())
{
if (isset($HTTP_POST_VARS['nr_cat']))
{
if(sterge_categorie ($HTTP_POST_VARS['nr_cat']))
{
echo 'categoria '.$HTTP_POST_VARS['den_cat'].'a fost stersa.<br />';
?>
<!– script pentru refresh categorii –>

86 <script language="Java Script" type ="text/javascript">
window.open("categorii.php","categ");
</script>
<?php
}
else
echo 'Categoria nu a putut sa fie stearsa.<br />'
.'Trebuie sa stergeti mai intai articolele din aceasta categorie.<br />';
}
else
echo 'Nu ai ales nicio catego rie. Incearca din nou.<br />';
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare', afis);
}
else
echo 'Nu esti autorizat sa accesezi aceasta pagina.';
?>

function sterge_categorie($nr_cat)
// Sterge numele categoriei din bd
// Daca sun t articole in categorie, aceasta nu va fi stearsa si funcia va returna
false
{
$conn = db_connect();
// verifica daca nu sunt articole in categorie
// pentru a evita eroarea
$query = "select *
from produse
where nr_ cat='$nr_cat'";
$result = @$conn ->query($query);
if (!$result || @$result ->num_rows>0)
return false;
$query = "delete from categorii
where nr_cat='$nr_cat'";
$result = @$conn ->query($query);
if (!$result)
return false ;
else
return true;
}
Cazul în care stergerea se poate efectua l -am ilustrat în grupul
de figuri 21 cu secvențe din site.

87

Figura 2 1. Operația de ștergere a unei categori i

Operația de modificare a caracteristicilor unui articol din baza d e
date se face acționând butonul „Edit ează articol ” ce apare la
afișarea caracteristicilor articol ului selectat (vezi figura 22).

88
Figura 2 2. Vizualizarea butonului de editare a unui articol

Scriptul PHP este același cu cel prezentat anterior la adăugare a
unui articol , numai că aici se apelează funcția formu-
lar_afisare_ articol cu parametrul $cod, codul articolului . Aceast ă
funcție are ca efect apelarea scriptului editare_ articol .php al că-
rui cod este prezentat mai jos.

<?php
// include function files for this application
require_once('produse.php');
session_start();

do_html_titlu('Modificare articol');
if (check_admin_user())
{
if (filled_out($HTTP_POST_VARS))
{
$cod_vechi = $HTTP_POST_VARS['cod_vechi'];
$cod = $HTTP_POST_VARS['cod'];
$denumire = $HTTP_POST_VARS['denumire'];
$producator = $HTTP_POST_VARS['producator'];
$nr_cat = $HTTP_POST_VARS['nr_cat'];
$pret = $HTTP_POST_VARS['pret'];
$descriere = $HTTP_POST_VARS['descriere'];

if(modifica_articol ($cod_vechi, $cod , $denumire, $producator, $nr_cat,
$pret, $descriere))
echo 'Articolul a fost modificat.<br />';
else
echo 'Articolul nu a putut fi modificat.<br />';
}
else{

89 echo 'Nu ai completat formularul. Incearca din no u.';
echo '<br>';
do_html_url('formular_editare_articol.php', 'Incercati din nou.', afis);
}
echo '<br>';
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare', afis);
}
else
echo 'Nu esti autorizat sa accesezi aceasta pag ina.';
?>

function modifica_articol($cod_vechi, $cod, $denumire, $producator, $nr_cat,
$pret, $descriere)
// schimba detaliile pentru articolul $cod_vechi cu cele date ca parametrii
{
$conn = db_connect();

$query = "update pr oduse
set cod='$cod',
denumire ='$denumire',
producator = '$producator',
nr_cat = '$nr_cat',
pret = '$pret',
descriere = '$descriere'
where cod='$cod_vechi'";

$result = @$conn ->query($query);
if (!$result)
return false;
else
return true;
}
Formularul afișat și efectul său, obținut în urma acționării buto-
nului „Actualizare articol”, se observă în figura 23.
Figura 2 3. Operația de editare a unui a rticol

90 În formular ul de editare mai apare și un buton pentru ștergerea
articolului . În cazul în care acesta este apăsat se va apela scrip-
tul sterge_ articol .php al cărui cod este prezentat mai jos
<?php
require_once('produse.php');
session_start();
do_html _titlu('Stergere articole');
if (check_admin_user())
{
if (isset($HTTP_POST_VARS['cod']))
{
$cod = $HTTP_POST_VARS['cod'];
if(sterge_articol ($cod))
echo 'Articolul '.$cod.' a fost sters.<br />';
else
echo 'Articolul '.$cod.' nu a putut fi sters.<br />'; }
else
echo 'Avem nevoie de un cod pentru a sterge un articol.
Incearca din nou.<br />';
echo '<br>';
do_html_url('admin_menu.php', 'Inapoi la meniul de administrare', afis);
}
else
echo 'Nu esti a utorizat sa accesezi aceasta pagina.'; ?>
function sterge_articol($cod)
// sterge articolul identificat prin $cod, din bd
{
$conn = db_connect();
$query = "delete from produse where cod='$cod'";
$result = @$conn ->query($query);
if (!$result)
return false;
else
return true;
}

Am ilustrat în figura 24 cazul
ștergerii articolului cu codul 33
– Tonner .

Figura 2 4. Operația de ștergere a unui
articol

91 O ultimă operație pe care o poate efectua administratorul este
cea de schimbare a parolei de administrator . Modalitatea e ste
aceeași cu cea a unui utilizator obișnuit și a fost prezentată în
paragraful 3.2.2. al acestui capitol.

Concluzi e

Lucrarea de față s-a dorit a fi un studiu amănunțit al eta-
pelor de creare a unei pagini web di namice pentru o aplicație de
comerț electronic , în vederea aplicării la firmele de exercițiu .
Datorită studiului unei probleme deosebit de actuale care
apare în cadrul firmelor reale și implicit în cadrul firmelor de
exercițiu, a ceea a realizării unui mag azin virtual , precum și da-
torită metodologi ei didactic e folosit e pentru a -i face pe elevi să
înteleagă această problemă , studiul efectuat își dovedește utili-
tatea. Prin parcurgerea cursului elevii angajați ai firmei de
exercițiu vor ști să își creeze o pag ină web dinamică la orice
firmă reală se vor angaja, respectând deviza „din școală în viață
prin firma de exercițiu” .

111 Bibliografie

Bibliografie Științifică
1. Julie-C-Meloni., Invata -singur -PHP-MySQL -si-Apache, Editura Co-
rint, București, 2005
2. Cristian Darie ,Mihai Bucica , PHP5 Si MySQL pentru comerț electro-
nic, Editura Teora, București, 2006
3. Larry Ullman , PHP și MySQL pentru site -uri WEB dinamice , Editura
Teora , București, 2006
4. Luke-Welling -Laura -Thomson, Dezvoltarea -aplicaț iilor-WEB-cu-
PHP-si-MySQL, Editura Teora, București, 2005
5. Bill-McCarty , PHP 4, Editura Teora, București, 2001
6. Traian -Anghel, Dezvoltarea -aplicaț iilor-WEB-folosind -XHTML -PHP-
si-MySQL, Editur a Polirom, București, 2005
7. Traian -Anghel, Programarea -in-PHP-Ghid-practic, Editura Polirom ,
București, 2005
8. Steven Holzner , Initiere în PHP 5 , Editura Teora, București, 2005
9. ***, Din școală în viață prin firma de exercițiu, Editura Didactică
și Pedagogică, București, 2005

Bibliografie Online
1. Site-ul oficial PHP, http://www.php.net
2. Site-ul oficial Apache, http://www.apache.org
3. Site-ul oficial MySQL, http://www.mysql.com
4. PHP Româ nia, http://www.phpromania.net
5. The WebMaster’s Net , http://www.thewebmasters.net/
6. Resurse pentru programatori PHP, http://www. phpbuilder.com
7. Scripturi PHP, JavaScript, și alte scripturi,
http://www.hotscripts.com
8. Platforma de e -Learning Moodle, http://moodle.org
9. Site-ul Departamentului de Coordonare al F irmelor de Exercițiu
din invatamantul preuniversitar, http://www.roct.ro

Buy SmartDraw !- purchased copies print this
document without a watermark .
Visit www .smartdraw .com or call 1-800-768-3729 .ANEXA

Similar Posts