Sunteți pe pagina 1din 46

Contents

CAPITOLUL 1. INTRODUCERE ................................................................................. 4

1.1. GENERALITĂŢI ....................................................................................................................... 4


1.2. SCOPUL ŞI UTILITATEA PROIECTULUI ...................................................................................... 4
1.3. PREZENTAREA CAPITOLELOR .................................................................................................. 5

CAPITOLUL 2. TEHNOLOGII ȘI LIMBAJE FOLOSITE LA REALIZAREA


PROIECTULUI ...................................................................................................................... 5

2.1. LIMBAJUL HTML.......................................................................................................................... 5


2.2. SISTEMUL DE GESTIUNE AL BAZELOR DE DATE RELAȚIONALE MYSQL ........................................... 6
2.3. LIMBAJUL PHP ............................................................................................................................. 6

CAPITOLUL 3. REALIZAREA PRACTICĂ A MAGAZINULUI ONLINE ....................... 7

3.1 IMPLEMENTAREA BAZEI DE DATE MYSQL....................................................................................... 7


3.2 REALIZAREA SCRIPTURILOR SITE-ULUI CU AJUTORUL LIMBAJULUI PHP....................................... 16
3.2.1. Pagina „header.htm” ........................................................................................................ 16
3.2.2. Pagina „footer.html” ........................................................................................................ 18
3.3.3. Pagina „mysqli_connect.php” ......................................................................................... 18
3.3.4. Pagina „index.php” .......................................................................................................... 19
3.3.5. Pagina „ adauga_produs.php” ....................................................................................... 22
3.3.6. Pagina „inregistrare.php” ............................................................................................... 27
3.3.7.Pagina „login.php” ............................................................................................................29
3.3.8. Pagina „rasfoieste_produse.php” ................................................................................... 31
3.3.9. Pagina „cautare.php” ....................................................................................................... 33
3.3.10. Pagina „vezi_produs.php” ............................................................................................. 34
3.3.12. Scriptul „adauga_cos.php” ............................................................................................ 37
3.3.13. Pagina „vezi_cos.php” ....................................................................................................38
3.3.14. Scriptul „checkout.php” ................................................................................................. 40
3.3.16. Gestionarea parolelor” ................................................................................................... 43

CAPITOLUL 4. CONCLUZII ..................................................................................... 47

BIBLIOGRAFIE ....................................................................................................... 48

3
Capitolul 1. Introducere

1.1. Generalităţi

Una dintre activităţile care se dezvoltă din ce în ce mai mult în ultimii ani este
comerţul electronic sau e-commerce, termen care denumeşte activitatea de cumpărare
sau vânzare prin intermediul transmiterii de date la distanță. Ideea a fost lansată în anii
’90 de către compania IBM.
Un magazin virtual, magazin online sau magazin electronic (e-shop), este un
website de comerț electronic destinat vânzării de produse și servicii. În cele mai multe
dintre cazuri, magazinul online reprezintă o platformă pe care sunt adăugate produse.
Aceste produse pot fi accesate și cumpărate prin intermediul mai multor modalităţi de
plată și sunt livrate cumpărătorului care alege modalitatea de transport: poștă, curier,
etc.

1.2. Scopul şi utilitatea proiectului

Scopul acestei aplicaţii este realizarea unui site interactiv de tip magazin online
prin intermediul căruia se pot comanda diferite produse, în acest caz parfumuri.
Site-ul permite vizualizarea infrmațiilor despre produse şi comandarea acestora.
Pentru a putea accesa site-ul, vizitatorii trebuie să se înregistreze şi să se logheze cu o
adresă de e-mail validă şi o parolă:
- Vizitatorii au acces la vizualizarea produselor şi la catalogul din care pot face
comenzi. De asemenea pot căuta produse după un cuvânt cheie, acesta fiind
căutat atât în numele produsului cât şi în descrierea acesteia. Fiecărui membru i
se deschide, la logarea pe site, un coş de cumpărături în care poate să adauge
produsele pe care dorește să le comande. Coşul de cumpărături poate fi vizualizat
şi vizitatorul poate modifica oricând conţinutul acestuia până în momentul în
care dă confirmarea finală a comenzii.
- Administratorul site-ului are acces la toate facilităţile anterioare dar poate de
asemenea să adăuge produse noi şi să proceseze comenzile făcute de vizitatori pe
site.

Adăugarea de produse noi şi procesarea comenzilor se face direct din meniul site-
ului de către membrii care au aceste drepturi.

4
1.3. Prezentarea capitolelor

Lucrarea de faţă cuprinde 3 capitole şi o scurtă bibliografie. Capitolele conțin


următoarele informații:
- Capitolul 1 conține o scurtă introducere vizând generalități precum și
scopul și utilitatea proiectului.
- Capitolul 2 conține o prezentare a principalelor tehnologii și limbaje
folosite pentru realizarea proiectului.
- Capitolul 3 conține o prezentare detaliată a realizării proiectului
propriuzis.

Capitolul 2. Tehnologii și limbaje folosite la


realizarea proiectului

2.1. Limbajul HTML

Limbajul HTML, acronimul de la Hypertext Markup Language, este un element


fundamental al World Wide Web. Acest limbaj este folosit pentru a descrie formatul
primar în care se difuzează orice informație prin intermediul Internetului. Acest limbaj,
dezvoltat initial în 1989 de către Tim Berners-Lee de la CERN, a fost vazut ca un mod
prin care fizicienii care foloseau computere cu arhitecturi și sisteme de operare diferite
să poată schimba între ei informații utilizând Internetul.
Deci în esență HTML nu este un limbaj de programare ci unul de formatare a
textului și imaginilor, a întregii informații multimedia care este prezentată prin
intermediul unui site WEB și poate fi interpretată și afișată identic indiferent de tipul de
computer sau de sistemul de operare folosit de acesta. Acest lucru se face prin
intermediul unei structurări foarte stricte și prin folosirea de marcaje sau etichete care
marchează fiecare element în parte.
Ajuns acum la versiunea 5, lansată în anul 2014, limbajul HTML a fost extins
pentru a include toate capacitățile versiunilor anterioare și în plus a fost adăugat un
suport îmbunătățit pentru fișiere multimedia

5
2.2. Sistemul de gestiune al bazelor de date relaționale
MySQL

Acest sistem de gestiune al bazelor de date relaționale, produs initial de firma


suedeză MySQL AB actualmente preluată de Oracle Corporation, este cel mai răspândit
și popular SGBD open-source la ora actuală.
Deși este folosit foarte des împreună cu limbajul de programare PHP, cu MySQL
se pot construi aplicații în orice limbaj major.
MySQL este componentă integrată a platformelor LAMP sau WAMP
(Linux/Windows-Apache-MySQL-PHP/Perl/Python). Popularitatea sa ca aplicație web
este strâns legată de cea a PHP-ului care este adesea combinat cu MySQL și denumit
Duo-ul Dinamic. În multe cărți de specialitate este precizat faptul ca MySQL este mult
mai ușor de învățat și folosit decât multe din aplicațiile de gestiune a bazelor de date.
Pentru a administra bazele de date MySQL se poate folosi modul linie de
comandă sau, prin descărcare de pe internet, o interfață grafică: MySQL Administrator
și MySQL Query Browser. Un alt instrument de management al acestor baze de date este
aplicația gratuită, scrisă în PHP, phpMyAdmin.
Licența GNU GPL nu permite încorporarea MySQL în softuri comerciale; cei care
doresc să facă acest lucru pot achiziționa, contra cost, o licență comercială de la
compania producătoare.

2.3. Limbajul PHP

PHP este un limbaj de programare. Numele PHP provine din limba engleză și
este un acronim recursiv : Php: Hypertext Preprocessor. Folosit inițial pentru a produce
pagini web dinamice, este folosit pe scară largă în dezvoltarea paginilor și aplicațiilor
web. Se folosește în principal înglobat în codul HTML, dar începând de la versiunea
4.3.0 se poate folosi și în mod „linie de comandă” (CLI), permițând crearea de aplicații
independente. Este unul din cele mai importante limbaje de programare web[2] open-
source și server-side, existând versiuni disponibile pentru majoritatea web serverelor și
pentru toate sistemele de operare. Conform statisticilor este instalat pe 20 de milioane
de site-uri web și pe 1 milion de servere web[3]. Este disponibil sub Licenṭa PHP ṣi Free
Software Foundation îl consideră a fi un software liber.

Inițial, limbajul a fost dezvoltat de inventatorul său, Rasmus Lerdorf. Odată cu


creșterea numărului de utilizatori, dezvoltarea a fost preluată de o nouă entitate, numită
The PHP Group (Grupul PHP).
6
PHP este simplu de utilizat, fiind un limbaj de programare structurat, ca și C-ul,
Perl-ul sau începând de la versiunea 5 chiar Java, sintaxa limbajului fiind o combinație a
celor trei. Probabil una din cele mai importante facilități ale limbajului este conlucrarea
cu majoritatea bazelor de date relaționale, de la MySQL și până la Oracle, trecând prin
MS Sql Server, PostgreSQL, sau DB2.
PHP poate rula pe majoritatea sistemelor de operare, de la UNIX, Windows, sau
Mac OS X și poate interacționa cu majoritatea serverelor web. Codul PHP este
interpretat de serverul WEB și generează un cod HTML care va fi trimis browserului.
Arhitectura tip LAMP a devenit populară în industria web ca modalitate rapidă,
gratuită și integrată de dezvoltare a aplicațiilor. Alături de Linux, Apache și Mysql, PHP
reprezintă litera P, deși uneori aceasta se referă la Python sau Perl. Linux ocupă rolul de
sistem de operare pentru toate celelalte aplicații, MySQL gestionează bazele de date,
Apache are rol de server web, iar PHP are rol de interpretator și comunicator între
acestea.
O arhitectură asemănătoare este WAMP, unde W reprezintă sistemul de operare
Windows, restul fiind identic. O astfel de arhitectură este folosită și de aplicația XAMPP
pe care am utilizat-o la realizarea proiectului.
PHP foloseste extensii specifice pentru fișierele sale: .php, .php3, .ph3, .php4,
.inc, .phtml.

Capitolul 3. Realizarea practică a magazinului


online

3.1 Implementarea bazei de date MySQL

Baza de date este folosită în cadrul aplicaţiei pentru a stoca informaţii referitoare
la vizitatorii înscrişi, picturile disponibile şi a informaţiilor despre acestea.
Baza de date folosită de site conţine 5 tabele după cum se poate vedea în imaginea
următoare[6].

7
Baza de date a site-ului

În continuare vom descrie fiecare tabel şi funcţia pe care o îndeplineşte. Începem


cu tabelul „clienti”, de tip InnoDB[6], care conţine un ID unic, numele, adresa şi adresa
de e-mail ale clienților.

Tabelul „clienti”

Câmpurile tabelului “clienți” sunt:


– id_client - de tip “int” (număr întreg), fără semn, cu lungimea de 10
caractere şi proprietatea “AUTO_INCREMENT”, ceea ce duce la
8
incrementarea sa automată de fiecare dată cînd se introduce o nouă
inregistrare in tabel. Acest cîmp conţine numărul de identificare al
clientului.
– nume_client - de tip “varchar” (şir de caractere) şi lungimea de 60 de
caractere, interclasare UTF-8. De asemenea nu accepta valoarea NULL,
ceea ce înseamnă că acest câmp trebuie să conţină obligatoriu o valoare.
– adresa_client - de tip “varchar” (şir de caractere) şi lungimea de 255 de
caractere, interclasare UTF-8. Acest câmp nu accepta valoarea NULL, ceea
ce înseamnă că acest câmp trebuie să conţină obligatoriu o valoare.
– email - de tip “varchar” (şir de caractere) şi lungimea de 60 de caractere,
interclasare UTF-8. De asemenea nu accepta valoarea NULL, ceea ce
înseamnă că acest câmp trebuie să conţină obligatoriu o valoare.
– parola - de tip “varchar” (şir de caractere) şi lungimea de 40 de caractere,
interclasare UTF-8. De asemenea nu accepta valoarea NULL, ceea ce
înseamnă că acest câmp trebuie să conţină obligatoriu o valoare.
– rang – de tip “enum”(enumerare) care poate să conțină doar două valori,
“client” și “admin”, valoarea default fiind “client”.

Acest tabel are ca şi cheie primară câmpul “id_client” dar are de asemenea alte
două index-uri care se sunt câmpurile “email” și “parola”.

Tabelul “clienti” poate fi creat cu următoarea secvenţă de instrucţiuni SQL[6]:

CREATE TABLE clienti (


id_client INT UNSIGNED NOT NULL AUTO_INCREMENT,
nume_client VARCHAR(60) NOT NULL,
adresa_client VARCHAR(255) NOT NULL,
email VARCHAR(60) NOT NULL,
parola CHAR(40) NOT NULL,
rang ENUM('client','admin') DEFAULT 'client',
PRIMARY KEY (id_client),
INDEX email (email, parola)
);

Următorul tabel este „comenzi”, de tip InnoDB, care conţine datele de identificare
ale comenzilor.

9
Tabelul „comenzi”

Câmpurile tabelului “comenzi” sunt:


– id_comandă – de tip “int” (număr întreg), fără semn, cu lungimea de 10
caractere şi proprietatea “AUTO_INCREMENT”, ceea ce duce la
incrementarea sa automată de fiecare dată cînd se introduce o nouă
inregistrare in tabel. Acest cîmp conţine numărul de identificare al
comenzii.
– id_client – de tip “int” (număr întreg) cu lungimea de 5 caractere și nu
accepta valoarea NULL, ceea ce înseamnă că acest câmp trebuie să conţină
obligatoriu o valoare. Acest camp conține numărul de identificare al
clientului care a făcutcomanda.
– total – de tip “decimal (10,2)” (număr zecimal cu 10 cifre înainte de virgulă
şi 2 zecimale). De asemenea nu accepta valoarea NULL, ceea ce înseamnă
că acest câmp trebuie să conţină obligatoriu o valoare. Acest camp conține
costul total al produselor comandate.
– data_comanda – de tip “timestamp” (tip de date care arată data şi ora).
Acest câmp va conţine data şi ora la care a fost făcută o comandă.
– procesat – de tip “tinyint” (întreg de valoare mică). Acest câmp are ca
valoare standard cifra “0”.

Acest tabel are ca şi cheie primară câmpul “id_ccomanda” dar are de asemenea
încă două index-uri, câmpurile “id_client” şi “data_comanda”.

10
Tabelul “comenzi” poate fi creat cu următoarea secvenţă de istrucţiuni SQL[6]:

CREATE TABLE comenzi (


id_comanda INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
id_client INT(5) UNSIGNED NOT NULL,
total DECIMAL(10,2) UNSIGNED NOT NULL,
data_comanda TIMESTAMP,
procesat TINYINT(4) NOT NULL DEFAULT 0,
PRIMARY KEY (id_comanda),
INDEX (id_client),
INDEX (data_comanda)
);

Următorul tabel este „continut_comanda”, de tip InnoDB, care conţine datele


despre conținutul comenzilor făcute pe site.

Tabelul „continut_comanda”

Câmpurile tabelului “continut_comanda” sunt:

11
– id_cc– de tip “int” (număr întreg), fără semn, cu lungimea de 10 caractere
şi proprietatea “AUTO_INCREMENT”, ceea ce duce la incrementarea sa
automată de fiecare dată cînd se introduce o nouă inregistrare in tabel.
Acest cîmp conţine numărul de identificare al listei continutului comenzii.
– id_comanda – de tip “int” (număr întreg), fără semn şi lungimea de 10
caractere. Acest cîmp conţine numărul de identificare al comenzii la care
se referă lista. De asemenea nu accepta valoarea NULL, ceea ce înseamnă
că acest câmp trebuie să conţină obligatoriu o valoare.
– id_produs – de tip “int” (număr întreg) cu lungimea de 4 caractere. De
asemenea nu accepta valoarea NULL, ceea ce înseamnă că acest câmp
trebuie să conţină obligatoriu o valoare. Acest camp conține numărul de
identificare al produsului prezent în comandă.
– cantitate – de tip “tinyint” (număr întreg de valoare mică) cu lunguimea de
3 caractere. Acest câmp va conţine numărul de bucăți din același produs
care au fost comandate.
– pret – de tip “decimal(6,2)” (număr zecimal) care conține un număr cu 6
caractere înainte de virgule și două caractere zecimale. Acest camp va
conține prețul total al numărului de bucăți de produs din comandă.

Acest tabel are ca şi cheie primară câmpul “id_cc” dar are de asemenea încă două
index-uri, câmpurile “id_comanda” şi “id_produs”.

Tabelul “continut_comanda” poate fi creat cu următoarea secvenţă de istrucţiuni


SQL[6]:

CREATE TABLE continut_comanda (


id_cc INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
id_comanda INT(10) UNSIGNED NOT NULL,
id_produs INT(4) UNSIGNED NOT NULL,
cantitate TINYINT UNSIGNED NOT NULL DEFAULT 1,
pret DECIMAL(6,2) UNSIGNED NOT NULL,
PRIMARY KEY (id_cc),
INDEX (id_comanda),
INDEX (id_produs),
);

Următorul tabel este „producatori”, de tip InnoDB, care conţine datele despre
producătorii produselor prezente pe site.
12
Tabelul “producatori”.

Câmpurile tabelului “producatori” sunt:


– id_producator– de tip “int” (număr întreg), fără semn, cu lungimea de 3
caractere şi proprietatea “AUTO_INCREMENT”, ceea ce duce la
incrementarea sa automată de fiecare dată cînd se introduce o nouă
inregistrare in tabel. Acest cîmp conţine numărul de identificare al
producătorului.
– denumire – de tip “varchar” (șir de caractere),cu lungimea de 50 de
caractere. Acest cîmp conţine denumirea producătorului sau a firmei
producătoare.
– informatii – de tip “text”. Acest cîmp conţine informații despre
producător.

Cheia primară a tabelului este câmpul “id_producator” dar are de asemenea încă
un index și anume câmpul “denumire”.

Tabelul “producatori” poate fi creat cu următoarea secvenţă de istrucţiuni SQL[6]:

CREATE TABLE producatori (


id_producator INT(3) UNSIGNED NOT NULL AUTO_INCREMENT,

13
denumire VARCHAR(50) DEFAULT NULL,
informatii TEXT,
PRIMARY KEY (id_producator),
INDEX (denumire)
);

Următorul tabel este „produs”, de tip InnoDB, care conţine datele despre
produsele disponibile pe site.

Tabelul „produs”.

Câmpurile tabelului “poster” sunt:


– id_produs – de tip “int” (număr întreg), fără semn şi lungimea de 4
caractere şi proprietatea “AUTO_INCREMENT”, ceea ce duce la
incrementarea sa automată de fiecare dată cînd se introduce o nouă
inregistrare in tabel. Acest cîmp conţine numărul de identificare al
produsului.
– id_producator – de tip “int” (număr întreg), fără semn şi lungimea de 3
caractere. Acest cîmp conţine numărul de identificare al producatorului.
De asemenea nu accepta valoarea NULL, ceea ce înseamnă că acest câmp
trebuie să conţină obligatoriu o valoare.
– nume_produs - de tip “varchar” (şir de caractere) şi lungimea de 60 de
caractere, interclasare UTF-8. De asemenea nu accepta valoarea NULL,

14
ceea ce înseamnă că acest câmp trebuie să conţină obligatoriu o valoare.
Acest camp conține denumirea produsului.
– pret – de tip “decimal (6,2)” (număr zecimal cu 6 cifre înainte de virgulă şi
2 zecimale). De asemenea nu accepta valoarea NULL, ceea ce înseamnă că
acest câmp trebuie să conţină obligatoriu o valoare. Conţine preţul
produsului.
– descriere – de tip “varchar” (şir de caractere) şi lungimea de 255 de
caractere, interclasare UTF-8. Acest câmp accepătă valoarea NULL, deci
informaţiile despre descrierea produsului pot să lipsească.
– imagine – de tip “varchar” (şir de caractere) şi lungimea de 60 de
caractere, interclasare UTF-8. Acest câmp nu accepta valoarea NULL, ceea
ce înseamnă că acest câmp trebuie să conţină obligatoriu o valoare. Aici se
va stoca un şir de caractere care indică calea spre imaginea produsului care
trebuie afişată pe site.

Cheia primară a tabelului este câmpul “id_produs” dar are de asemenea încă trei
index-uri, câmpurile “id_producator”,”nume_produs” şi “pret”.

Tabelul “produs” poate fi creat cu următoarea secvenţă de istrucţiuni SQL[6]:

CREATE TABLE produs (


id_produs INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
id_producator INT(3) UNSIGNED NOT NULL,
nume_produs VARCHAR(60) NOT NULL,
pret DECIMAL(6,2) UNSIGNED NOT NULL,
descriere VARCHAR(255) DEFAULT NULL,
imagine VARCHAR(60) NOT NULL,
PRIMARY KEY (id_produs),
INDEX (id_producator),
INDEX (nume_produs),
INDEX (pret)
);

15
3.2 Realizarea scripturilor site-ului cu ajutorul limbajului
PHP

Pentru realizarea site-ului de parfumerie, am folosit un design minimalist.


Accentul punându-se în principal pe imaginea produselor prezentate, descrierii acestora
şi pe simplitatea navigării, meniul fiind foarte simplu şi intuitiv.
Vom parcurge scripturile site-ului în ordinea în care le parcurge un vizitator care
ajunge pentru prima oară la galeria noastră.
Pentru început ne vom referi la paginile „header.html” – antetul HTML al
fiecărei pagini, „footer.html” – subsolul HTML care încheie fiecare pagină şi
„mysqli_connect.php” – scriptul care face conexiunea la baza de date folosită de
site[4][5][6].

3.2.1. Pagina „header.htm”

Fiecare dintre paginile site-ului include pagina „header.html”, pagină care


conţine informaţiile de formatare a paginii şi meniul care se schimbă în funcţie de
logarea sau delogarea vizitatorului cu ajutorul unui script care va fi prezentat în detaliu
în continuare.

Începutul script-ului:

<?php # Script - header.html


// Acest script iniţializează sesiunea şi conţine meniul.

Iniţializăm sesiunea.
session_start(); // Iniţializăm sesiunea.
?>

Setăm antetul documentului HTML, titlul paginii, setul de caractere folosit şi


imaginea care apare în antetul site-ului:

<!doctype html>
<html lang="ro">
<head>
<meta charset="utf-8" />
<title><?php echo (isset($page_title)) ? $page_title : 'Bun Venit!';
?></title>
</head>
16
<body>
<style type="text/css">
body {
background-image: url(imagini/stones-background.jpg);
}
</style>
<table cellspacing="0" cellpadding="0" border="0" align="center"
width="600">
<tr>
<td align="center" colspan="6"><img src="imagini/title.jpg" width="900"
height="125" border="0" alt="title" /></td>
</tr>
<tr>
<td align="center" bgcolor="#FD97B4"><a href="index.php">Pagina
principala</a></td>

Verificăm dacă utilizatorul este logat sau nu şi afişăm meniul corespunzător[5][6].

<?php if (isset($_SESSION['id_client']) && $_SESSION['id_client']


>null)
//Verificăm dacă utilizatorul este logat sau nu şi afişăm meniul
corespunzător
{
echo'<td align="center" bgcolor="#FD97B4"><a
href="cautare.php">Căutare</a></td>';
echo '<td align="center" bgcolor="#FD97B4"><a
href="schimbare_parola.php">Schimbare parolă</a></td>';
echo '<td align="center" bgcolor="#FD97B4"><a
href="logout.php">Logout</a></td>';
}else{
echo '<td align="center" bgcolor="#FD97B4"><a
href="inregistrare.php">Înregistrare</a></td>';
echo '<td align="center" bgcolor="#FD97B4"><a
href="recuperare_parola.php">Recuperare parolă</a></td>';
echo '<td align="center" bgcolor="#FD97B4"><a
href="login.php">Login</a></td>';
}
?>
<td align="center" bgcolor="#FD97B4"><a
href="rasfoieste_produse.php">Catalog ordonat A-Z</a></td>
<td align="center" bgcolor="#FD97B4"><a href="vezi_cos.php">Vezi coşul
de cumpărături</a></td>
</tr>
<tr>
<td align="left" colspan="6" bgcolor="#FFDDDD"><br />

17
Sfârşitul scriptului.

3.2.2. Pagina „footer.html”

Această pagină este foarte simplă şi serveşte doar la golirea buffer-ului de afişare,
afişarea unei informaţii de copyright şi închiderea tag-urilor HTML ale paginilor.

Începutul script-ului:

<!-- Script - footer.html -->


<br /></td>
</tr>

Golim buffer-ul.
<tr>
<?php ob_end_flush();
?>

Afişăm informaţia de copyright şi închidem etichetele HTML ale paginii.


<td align="center" colspan="6" bgcolor="#FD97B4"><font
color="#ffffff">&copy; Copyright admin@parfumeriamea.ro</font></td>
</tr>
</table>
</body>
</html>

Sfârşitul scriptului.

3.3.3. Pagina „mysqli_connect.php”

De aemenea o pagină simplă care serveşte la conectarea cu baza de date care


conţine informaţiile necesare funcţionării site-ului.

Începutul script-ului:

<?php # Script - mysqli_connect.php

// Acest fișier conține informațiile de acces la baza de date.


// De asemenea stabiește o conexiune la MySQL

18
// și selectează baza de date.

Setăm informaţiile despre baza de date ca şi constante[5][6].:


DEFINE ('DB_USER', 'root');
DEFINE ('DB_PASSWORD', '');
DEFINE ('DB_HOST', 'localhost');
DEFINE ('DB_NAME', 'parfumeria');

Iniţializăm conexiunea la baza de date:


$dbc = @mysqli_connect (DB_HOST, DB_USER,
DB_PASSWORD, DB_NAME) OR die ('Nu s-a putut face conexiunea la MySQL: ' .
mysqli_connect_error() );

?>
Sfârşitul scriptului.

3.3.4. Pagina „index.php”

Aceasta este pagina principală a site-ului şi serveşte de asemenea drept pagină de


administrare unde pot fi vizualizate comenzile ne-procesate şi se poate accesa pagina de
adăugare a unor produse noi în baza de date.

Pagina „index.php” în cazul în care vizitatorul nu este logat.

19
Începutul script-ului:

<?php # Script - index.php


// Aceasta este pagina principală.

Setăm titlul paginii şi includem antetul HTML:


$page_title = 'Parfumeria Mea';
include ('include/header.html');

Ne conectăm la baza de date


require_once ('mysqli_connect.php');

Verificăm dacă utilizatorul are rang de administrator şi dacă da, afişăm link-ul
spre pagina de adăugare a unor postere noi şi datele legate de ultimele comenzi ne-
procesate[5][6].:
if (isset($_SESSION['id_client']) && $_SESSION['rang'] == 'admin')
{
echo '<p align="center">Bun venit admin!</p>';
echo '<p align="center"><a href="adauga_produs.php">Adaugă produse
noi</a></p>';
echo '<h4 align="center">Lista comenzilor neprocesate:</h4>';
$v = (int)0;
$q = "SELECT id_comanda, id_client, total, data_comanda FROM comenzi WHERE
procesat = $v";
echo '<table border="0" width="100%" cellspacing="3" cellpadding="3"
align="left">';
$r = mysqli_query ($dbc, $q);
while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) {
$idc = $row['id_client'];
$q2 = "SELECT nume_client, adresa_client, email FROM clienti WHERE id_client
= $idc";
$r2 = mysqli_query ($dbc, $q2);
$row2 = mysqli_fetch_array ($r2, MYSQLI_ASSOC);

Afişăm fiecare comandă:


echo "\t<tr> <td align=\"left\" ><b><font color=\"red\">Comanda
{$row['id_comanda']}:</font></b></td>
<td align=\"center\"><b><font color=\"red\">Valoare:
{$row['total']}</font></b></td>
<td align=\"left\"><b><font color=\"red\">Data:
{$row['data_comanda']}</font></b></td>
<td align=\"left\"><b><font color=\"red\">Nume client:
{$row2['nume_client']}</font></b></td>
<td align=\"left\"><b><font color=\"red\">Adresa:
{$row2['adresa_client']}</font></b></td>
<td align=\"left\"><b><font color=\"red\">E-mail:
{$row2['email']}</font></b></td>
</tr>\n";

În funcţie de comandă afişăm conţinutul fiecărei comenzi[5][6].


20
$ido = $row['id_comanda'];
$q3 = "SELECT id_produs, cantitate, pret FROM continut_comanda WHERE
id_comanda = $ido";
$r3 = mysqli_query ($dbc, $q3);
While ($row3 = mysqli_fetch_array ($r3, MYSQLI_ASSOC)){

$idp = $row3['id_produs'];
$q4 = "SELECT nume_produs FROM produs WHERE id_produs = $idp";
$r4 = mysqli_query ($dbc, $q4);
$row4 = mysqli_fetch_array ($r4, MYSQLI_ASSOC);
// Display each record:
echo "<td align=\"left\">- {$row4['nume_produs']}</td>
<td align=\"center\">buc {$row3['cantitate']}</td>
<td align=\"right\">RON/buc {$row3['pret']}</td>
</tr>\n";

}
} // End of while loop.

Pagina „index.php” în cazul în care vizitatorul este logat şi are drept de


administrator.

Dacă utilizatorul nu are rang de administrator afişăm conţinutul normal


}else{
echo"<div align=\"center\"><img src=\"imagini/mesaj.png\"></div>";
echo"<div align=\"center\"><img src=\"imagini/index.jpg\"></div>
";
}

Includem subsolul HTML:


include ('include/footer.html');
?>

Sfârşitul scriptului.
21
3.3.5. Pagina „ adauga_produs.php”

Pagina „adauga_produs.php” este destinată doar administratorului şi deşi


afişează doar un formular simplu, este unul dintre cele mai complexe scripturi ale site-
ului.

Începutul script-ului:
<!doctype html>
<html lang="ro">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>Adaugă un produs</title>
</head>
<body>
<?php # Script - adauga_produs.php
// Acest script permite adăugarea unui produs si a datelor referitoare la el.

Ne conectăm la baza de date


require_once ("mysqli_connect.php");

Verificăm dacă formularul a fost trimis.


if (isset($_POST["submitted"])) { // Verificăm dacă formularul a fost trimis.

Validăm datele...
$errors = array();

Verificăm numele produsului[5][6].:


if (!empty($_POST['nume_produs'])) {
$np= trim($_POST['nume_produs']);
} else {
$errors[] = "Introduceţi denumirea produsului!";
}

Verificăm dacă a fost introdusă o imagine:


if (is_uploaded_file ($_FILES['image']['tmp_name'])) {

Îi dăm un nume temporar:


$temp = '../uploads/' . md5($_FILES['image']['name']);

Mutăm fişierul şi afişăm un mesaj:


if (move_uploaded_file($_FILES['image']['tmp_name'], $temp)) {

echo "<p>Fişierul a fost încărcat!</p>";

Setăm variabila $i cu numele imaginii:

22
$i = $_FILES['image']['name'];

Dacă nu s-a putut muta fişierul...


} else {
$errors[] = "Fişierul nu a putut fi mutat.";
$temp = $_FILES['image']['tmp_name'];
}

Dacă nu s-a putut încărca fişierul.


} else {
$errors[] = "Nici un fişier nu a fost încărcat.";
$temp = NULL;
}

Verificăm dacă a fost introdus preţul:


if (is_numeric($_POST['price'])) {
$p = (float) $_POST['price'];
} else {
$errors[] = "Introduceţi preţul produsului!";
}

Verificăm dacă a fost introdusă o descriere:


$d = (!empty($_POST['description'])) ? trim($_POST['description']) : NULL;

Validăm producătorul...
if (isset($_POST['producator']) && ($_POST['producator'] == 'new') ) {

Dacă este un producător nou îl introducem în baza de date:

// Validăm denumirea:
$den = (!empty($_POST['denumire'])) ? trim($_POST['denumire']) : NULL;

// Adăugăm producatorul la baza de date:


$q = "INSERT INTO producatori (denumire) VALUES (?)";
$stmt = mysqli_prepare($dbc, $q);
mysqli_stmt_bind_param($stmt, 's', $den);
mysqli_stmt_execute($stmt);

// Verificăm rezultatele....
if (mysqli_stmt_affected_rows($stmt) == 1) {
echo "<p>Producătorul a fost adăugat.</p>";
$a = mysqli_stmt_insert_id($stmt); // Obţinem ID-ul producatorului.

Dacă nu este totul în regulă...


} else { // Dacă nu este totul în regulă...
$errors[] = "Producătorul nu a putut fi adăugat la baza de date!";
}

// Închidem declaraţia predefinită:


23
mysqli_stmt_close($stmt);

} else { // Nu a fost introdusă denumirea.


$errors[] = "Introduceţi denumirea producatorului!";
}

Dacă producătorul există deja în baza de date.


} elseif ( isset($_POST['producator'])&&($_POST['producator'] ==
'existing')&&($_POST['existing']>0) ) {
$a = (int) $_POST['existing'];

Nu a fost selectat nici un producător.


} else { // Nu a fost selectat nici un producator.
$errors[] = "Introduceţi sau selectaţi producatorul!";
}

Dacă totul este în regulă...


if (empty($errors)) { // Dacă totul este în regulă...

Adăugăm produsul in baza de date:


$q = "INSERT INTO produs (id_producator, nume_produs, pret, descriere,
imagine) VALUES(?, ?, ?, ?, ?)";
$stmt = mysqli_prepare($dbc, $q);
mysqli_stmt_bind_param($stmt, 'isdss', $a, $np, $p, $d, $i);
mysqli_stmt_execute($stmt);

Verificăm rezultatele...
if (mysqli_stmt_affected_rows($stmt) == 1) {

Afişăm un mesaj:
echo "<p>Produsul a fost adăugat.</p>";

Redenumim imaginea:
$id = mysqli_stmt_insert_id($stmt); // Obţinem ID-ul produsului.
rename ($temp, "../uploads/$id");

Golim variabila $_POST:


$_POST = array();

Dacă a apărut o eroare...


echo "<p style='font-weight: bold; color:red'>Comanda nu a putut fi procesată
datorită unei erori de sistem.</p>";
}

24
Închidem declaraţia predefinită
mysqli_stmt_close($stmt);

} // Sfârşitul buclei IF.

Ştergem fişierul încărcat:


if ( isset($temp) && file_exists ($temp) && is_file($temp) ) {
unlink ($temp);
}

// Sfârşitul buclei IF.

Verificăm dacă au apărut erori şi le afişăm:


if ( !empty($errors) && is_array($errors) ) {
echo "<h1>Error!</h1> <p style='font-weight: bold; color: red'>The following
error(s) occurred:<br />";
foreach ($errors as $msg) {
echo " - $msg<br />\n";
}
echo "Vă rugăm reselectaţi imaginea si încercaţi din nou.</p>";
}
?>

Afişăm formularul...
<h1>Adaugă un produs</h1>
<form enctype="multipart/form-data" action="adauga_produs.php" method="post">

<input type="hidden" name="MAX_FILE_SIZE" value="524288" />

<fieldset><legend>Completaţi formularul pentru a adăuga un produs la


catalog:</legend>

<p><b>Denumire Produs:</b> <input type="text" name="nume_produs" size="30"


maxlength="60" value="<?php if (isset($_POST['nume_produs'])) echo
htmlspecialchars($_POST['nume_produs']); ?>" /></p>

<p><b>Imagine:</b> <input type="file" name="image" /></p>

<div><b>Producător:</b>
<p><input type="radio" name="producator" value="existing" <?php if
(isset($_POST['producator']) && ($_POST['producator'] == 'existing') ) echo '
checked="checked"'; ?>/> Existent =>
<select name="existing"><option>Selectează</option>

Obţinem artiştii existenţi şi îi adăugăm la lista derulantă[5][6]..


<?php // Obţinem producătorii existenţi şi îi adăugăm la lista derulantă.
$q = "SELECT id_producator, denumire FROM producatori ORDER BY denumire ASC";
$r = mysqli_query ($dbc, $q);
if (mysqli_num_rows($r) > 0) {
while ($row = mysqli_fetch_array ($r, MYSQLI_NUM)) {
echo "<option value=\"$row[0]\"";

25
if (isset($_POST['existing']) && ($_POST['existing'] == $row[0]) ) echo "
selected='selected' ";
echo ">$row[1]</option>\n";
}
} else {
echo "<option>Adăugaţi un producator nou.</option>";
}
mysqli_close($dbc); // Închidem conexiunea cu baza de date.
?>
</select></p>
<p><input type="radio" name="producator" value="new" <?php if
(isset($_POST['producator']) && ($_POST['producator'] == 'new') ) echo "
checked='checked'"; ?>/> Nou =>
Denumire: <input type="text" name="denumire" size="10" maxlength="20"
value="<?php if (isset($_POST['denumire'])) echo $_POST['denumire']; ?>" />
</p>
</div>

<p><b>Preţ:</b> <input type="text" name="price" size="10" maxlength="10"


value="<?php if (isset($_POST['price'])) echo $_POST['price']; ?>" />
<small>Nu includeţi moneda sau virgule.</small></p>

<p><b>Descriere:</b> <textarea name="description" cols="40" rows="5"><?php if


(isset($_POST['description'])) echo $_POST['description']; ?></textarea>
(optional)</p>

</fieldset>

<div align="center"><input type="submit" name="submit" value="Adaugă"


/></div>
<input type="hidden" name="submitted" value="TRUE" />

</form>
<a href="index.php">Înapoi la pagina principală</a>
</body>
</html>
Sfârşitul scriptului.

Pagina „adauga_produs.php”.
26
3.3.6. Pagina „inregistrare.php”

Este pagina unde se înregistrează vizitatorii care ajung pentru prima oară pe site.
Pentru a se înregistra, vizitatorul trebuie să introducă o adresă de e-mail validă şi o
parolă, care vor fi stocate în baza de date[3][4][5][6]..
<?php # Script - inregistrare.php
// Acesta este scriptul de inregistrare pe site.

$page_title = 'Înregistrare';
include ('include/header.html');

Verificăm dacă formularul a fost trimis.


if (isset($_POST['submitted'])) {

require_once ('mysqli_connect.php');

Procesăm datele care vin de la formular:


$trimmed = array_map('trim', $_POST);

Iniţializăm variabilele:
$n = $ad = $e = $p = FALSE;

$n = mysqli_real_escape_string ($dbc, $trimmed['nume']);

$ad = mysqli_real_escape_string ($dbc, $trimmed['adresa']);

Verificăm adresa de e-mail introdusă:


if (preg_match ('/^[\w.-]+@[\w.-]+\.[AZa-z]{2,6}$/', $trimmed['email'])) {
$e = mysqli_real_escape_string ($dbc, $trimmed['email']);
} else {
echo '<p class="error">Vă rugăm introduceţi o adresa de e-mail validă!</p>';
}

Verificăm parola introdusă si confirmarea ei:


if (preg_match ('/^\w{4,20}$/', $trimmed['password1']) ) {
if ($trimmed['password1'] == $trimmed['password2']) {
$p = mysqli_real_escape_string($dbc, $trimmed['password1']);
} else {
echo '<p class="error">Parola dvs. şi confirmarea ei nu corespund!</p>';
}
} else {
echo '<p class="error">Vă rugăm introduceţi o parolă validă!</p>';
}

if ($e && $p) { // Dacă totul este corect...

27
Verificăm dacă adresa de e-mail există deja in baza noastră de date:
$q = "SELECT id_client FROM clienti WHERE email='$e'";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));

Dacă adresa de e-mail nu există în baza de date...


if (mysqli_num_rows($r) == 0) {
// Generăm un cod de activare:
$a = md5(uniqid(rand(), true));

Adăugăm clientul la baza de date:


$q = "INSERT INTO clienti (nume_client, adresa_client, email, parola) VALUES
('$n', '$ad', '$e', SHA1('$p'))";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));

if (mysqli_affected_rows($dbc) == 1) { // If it ran OK.

Trimitem un e-mail:
echo "Vă mulţumim pentru că v-aţi înregistrat la magazinul nostru.";

Înregistrăm variabilele sesiunii.


@session_register('email');
$_SESSION['email']=$email;
@session_register('rang');
$_SESSION['rang']=$rang;
header("Location:index.php");

Finalizăm pagina:
include ('includes/footer.html'); // Includem subsolul paginii.
exit(); // Ieşim din script.

Dacă au apărut erori...


} else {
echo '<p class="error">Nu aţi putut fi înregistrat datorită unei erori de
sistem. Ne cerem scuze.</p>';
}

Adresa de e-mail a fost folosită deja de un alt client.


} else {
echo '<p class="error">Această adresă de e-mail a fost deja folosită de un
client. Dacă v-aţi uitat parola, folosiţi link-ul "Recuperare parolă" de mai
sus.</p>';
}

Dacă unul dintre teste nu a fost trecut.


} else {
echo '<p class="error">Vă rugăm reintroduceţi parola şi încercaţi din
nou.</p>';
}

mysqli_close($dbc);

28
} // Sfârşitul instrucţiunilor condiţionale.
?>

Se efișează formularul.
<h1>Înregistrare</h1>
<form action="inregistrare.php" method="post">
<fieldset>

<p><b>Nume:</b> <input type="text" name="nume" size="30" maxlength="60"


value="<?php if (isset($trimmed['nume'])) echo $trimmed['nume']; ?>" /> </p>

<p><b>Adresa:</b> <input type="text" name="adresa" size="30" maxlength="255"


value="<?php if (isset($trimmed['adresa'])) echo $trimmed['adresa']; ?>" />
</p>

<p><b>Adresa e-mail:</b> <input type="text" name="email" size="30"


maxlength="60" value="<?php if (isset($trimmed['email'])) echo
$trimmed['email']; ?>" /> </p>

<p><b>Parola:</b> <input type="password" name="password1" size="20"


maxlength="40" /> <small>Folosiţi doar litere, cifre şi underscore (liniuţa
de subliniere). Parola trebuie să aibă o lungime între 4 şi 20 de
caractere.</small></p>

<p><b>Confirmă Parola:</b> <input type="password" name="password2" size="20"


maxlength="20" /></p>
</fieldset>

<div align="center"><input type="submit" name="submit" value="Înregistrare"


/></div>
<input type="hidden" name="submitted" value="TRUE" />

</form>

<?php // Includem subsolul paginii.


include ('include/footer.html');
?>

Sfârşitul scriptului.

3.3.7.Pagina „login.php”

Este pagina în care un vizitator înregistrat se loghează pe site.

Începutul script-ului:

<?php # Script - login.php


// Acesta este scriptul de logare pe site.
include ('include/header.html');

29
Verificăm dacă formularul a fost trimis.
if (isset($_POST['submitted'])) {

Ne conectăm la baza de date


require_once ('mysqli_connect.php');

Verificăm dacă a fost introdusă adresa de e-mail şi o procesăm. Funcţia


„mysqli_real_escape_string()” generează un şir de caractere care poate fi utilizat de
baza de date în funcţie de setul de caratere al serverului MySQL[5][6].:
if (!empty($_POST['email'])) {
$e = mysqli_real_escape_string ($dbc, $_POST['email']);

Dacă nu a fost introdusă o adresă de e-mail, resetăm variabila şi afişăm un mesaj


de eroare
} else {
$e = FALSE;
echo '<p class="error">Vă rugăm introduceţi adresa de e-mail!</p>';
}

Verificăm dacă a fost introdusă parola și dacă nu, se afișeayă un mesaj de eroare.
if (!empty($_POST['pass'])) {
$p = mysqli_real_escape_string ($dbc, $_POST['pass']);
} else {
$p = FALSE;
echo '<p class="error">Vă rugăm să introduceţi parola!</p>';
}

if ($e && $p) {

Dacă totul este în regulă, căutăm în baza de date:


$q = "SELECT id_client, rang FROM clienti WHERE (email='$e' AND
parola=SHA1('$p'))";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));

if (@mysqli_num_rows($r) == 1) {

Dacă se găsește o înregistrare, înregistrăm valorile şi redirectăm:


$_SESSION = mysqli_fetch_array ($r, MYSQLI_ASSOC);
mysqli_free_result($r);
mysqli_close($dbc);
header("Location:index.php");

exit(); // Ieşim din script.

Dacă nu s-a găsit o înregistrare, afișăm un mesaj de eroare.


} else {
echo '<p class="error">Adresa de e-mail sau parola nu sunt corecte.</p>';
}

} else { // Dacă au apărut erori...


30
echo '<p class="error">Vă rugăm încercaţi din nou.</p>';
}

mysqli_close($dbc);

}// Sfârşitul instrucţiunilor condiţionale.


?>

Se afișează formularul.
<h1>Login</h1>
<p>Browserul dvs. trebuie să accepte cookies pentru a vă putea loga.</p>
<form action="login.php" method="post">
<fieldset>
<p><b>Adresa e-mail:</b> <input type="text" name="email" size="20"
maxlength="40" /></p>
<p><b>Parola:</b> <input type="password" name="pass" size="20" maxlength="20"
/></p>
<div align="center"><input type="submit" name="submit" value="Login" /></div>
<input type="hidden" name="submitted" value="TRUE" />
</fieldset>
</form>

<?php // Includem subsolul paginii.


include ('include/footer.html');
?>

Sfârşitul scriptului

3.3.8. Pagina „rasfoieste_produse.php”

Este pagina în care se afişează catalogul cu produsele disponibile pe site.


Catalogul este ordonat în ordine alfabetică după numele producătorului şi după numele
produsului Dacă vizitatorul doreşte să vadă doar produsele unui anumit producător,
poate să facă acest lucru printr-un click pe numele producătorului dorit.

Începutul script-ului:

<?php # Script - rasfoieste_produse.php


// Acest script afişează produsele aflate in magazin.

Setăm titlul paginii şi includem antetul:


$page_title = 'Răsfoieşte catalogul';
include ('include/header.html');

Ne conectăm la baza de date


require_once ('mysqli_connect.php');

31
Verificăm dacă există un client logat şi există datele de identificare în sesiune:
if (isset($_SESSION['id_client']) && $_SESSION['id_client'] >null)

Dacă da, interogăm baza de date:


$q = "SELECT producatori.id_producator,denumire, nume_produs, pret,
descriere, id_produs FROM producatori, produs WHERE producatori.id_producator
= produs.id_producator ORDER BY producatori.denumire ASC, produs.nume_produs
ASC";

Dacă vizitatorul caută un anumit producator?


if (isset($_GET['aid']) && is_numeric($_GET['aid']) ) {
$aid = (int) $_GET['aid'];
if ($aid > 0) { // re-interogăm baza de date:
$q = "SELECT producatori.id_producator, denumire, nume_produs, pret,
descriere, id_produs FROM producatori, produs WHERE producatori.id_producator
= produs.id_producator AND produs.id_producator = $aid ORDER BY
produs.nume_produs";
}
}
Afişăm capul de tabel:
echo '<table border="0" width="90%" cellspacing="3" cellpadding="3"
align="center">
<tr>
<td align="left" width="20%"><b>Producător</b></td>
<td align="left" width="20%"><b>Nume Produs</b></td>
<td align="left" width="40%"><b>Descriere</b></td>
<td align="right" width="20%"><b>Pret</b></td>
</tr>';

Afişăm imaginile produselor:


$r = mysqli_query ($dbc, $q);
while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) {

Afişăm înregistrările:
echo "\t<tr> <td align=\"left\"><a
href=\"rasfoieste_produse.php?aid={$row['id_producator']}\">{$row['denumire']
}</a></td>
<td align=\"left\"><a
href=\"vezi_produs.php?pid={$row['id_produs']}\">{$row['nume_produs']}</td>
<td align=\"left\">{$row['descriere']}</td>
<td align=\"right\">\RON - {$row['pret']}</td>
</tr>\n";} // Sfârşitul buclei while.

echo '</table>';
mysqli_close($dbc);
}else{
echo "<h1>Trebuie să fiţi logat pe site pentru a vedea catalogul!</h1>";}
include ('include/footer.html');
?>

Sfârşitul scriptului.

32
3.3.9. Pagina „cautare.php”

Această pagină permite căutarea după un anumit cuvânt cheie atât în numele
imaginii cât şi în descrierea acesteia. Este util ca la introducerea unui produs nou, să se
adauge o scurtă descriere care să conţină câteva cuvinte cheie după care acesta să poată
fi căutat.

Începutul script-ului:

<?php #script - cautare.php


//Acest script permite căutarea unei imagini după un cuvânt cheie din titlu
sau din descriere
$page_title = 'Căutare';
include ('include/header.html');
require_once ('mysqli_connect.php');

if (isset($_POST['submitted'])) {

Validăm cuvântul cheie:


if (!empty($_POST['cuvant'])) {
$cuv = $_POST['cuvant'];

Afișăm capul de tabel


echo '<table border="0" width="90%" cellspacing="3" cellpadding="3"
align="center">
<tr>
<td align="left" width="20%"><b>Producător</b></td>
<td align="left" width="20%"><b>Denumire produs</b></td>
<td align="left" width="40%"><b>Descriere</b></td>
<td align="right" width="20%"><b>Preț</b></td>
</tr>';

Căutăm în baza de date inregistrări în care cuvântul cheie se regăsește în numele


produsului sau în descriere.
$q = "SELECT denumire, id_produs, nume_produs, pret, descriere FROM
producatori, produs WHERE producatori.id_producator = produs.id_producator
AND nume_produs LIKE '%$cuv%' OR producatori.id_producator =
produs.id_producator AND descriere LIKE '%$cuv%'";
$r = mysqli_query ($dbc, $q);

while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) {

Afişăm înregistrările găsite:


echo "\t<tr> <td align=\"left\">{$row['denumire']}</td>
<td align=\"left\"><a
href=\"vezi_produs.php?pid={$row['id_produs']}\">{$row['nume_produs']}</td>
<td align=\"left\">{$row['descriere']}</td>
<td align=\"right\">\RON - {$row['pret']}</td>

33
</tr>\n";

} // Sfârşitul buclei WHILE.


echo "<h2>Aţi căutat după cuvântul $cuv <h2>";
} else {

echo '<p class="error">Vă rugăm introduceţi cuvântul cheie!</p>';


}

}
?>

Afișarea formularului.
<h1>Căutare</h1>
<p>Căutaţi produsele care conţin în nume sau în descriere un cuvânt
cheie.</p>
<form action="cautare.php" method="post">
<fieldset>
<p><b>Cuvânt cheie:</b> <input type="text" name="cuvant" size="20"
maxlength="40" /></p>
<div align="center"><input type="submit" name="cauta" value="Cauta" /></div>
<input type="hidden" name="submitted" value="TRUE" />
</fieldset>
</form>

<?php
include ('include/footer.html');
?>

Sfârşitul scriptului.

3.3.10. Pagina „vezi_produs.php”

Această pagină afişează produsul selectat din catalog. Pentru aceasta foloseşte şi
scriptul „show_image.php” care va fi descris în amănunt după descrierea paginii
„vezi_produs.php”.

Începutul script-ului:

<?php # Script - vezi_produs.php


// Acest script afişează detaliile pentru un anumit produs.

Resetăm variabila care conţine datele.


$row = FALSE;

Verificăm dacă există un ID al unui produs!

34
if (isset($_GET['pid']) && is_numeric($_GET['pid']) ) {
$pid = (int) $_GET['pid'];

Obţinem informaţiile despre produs:


require_once ('mysqli_connect.php');
$q = "SELECT denumire, nume_produs, pret, descriere, imagine FROM
producatori, produs WHERE producatori.id_producator = produs.id_producator
AND produs.id_produs = $pid";$r = mysqli_query ($dbc, $q);

Dacă am găsit ce cautam, mergem mai departe.


if (mysqli_num_rows($r) == 1) {
$row = mysqli_fetch_array ($r, MYSQLI_ASSOC);

Iniţializăm pagina:
$page_title = $row['nume_produs'];
include ('include/header.html');

Afişăm un antet:
echo "<div align=\'center\'><b>{$row["nume_produs"]}</b> produs de
{$row["denumire"]}<br />";

echo "<br />\RON - {$row['pret']}


<a href=\"adauga_cos.php?pid=$pid\">Adaugă în coş</a></div><br />";

Afişăm imaginea şi detaliile despre produs:


if ($image = @getimagesize("../uploads/$pid")) {

echo "<div align=\"center\"><img src=\"show_image.php?image= $pid&name=" .


urlencode($row['imagine']) .
"\" $image[3] alt=\"{$row['nume_produs']}\" /></div>\n";
} else {
echo "<div align=\"center\">No image available.</div>\n";
}

Afişăm, descrierea sau dacă aceasta nu există, un mesaj standard:


echo '<p align="center">' . ((is_null($row['descriere'])) ? '(Informaţie
indisponibilă)' : $row['descriere']) . '</p>';
}// Sfârşitul buclei IF.

mysqli_close($dbc);}

Dacă nu am găsit ce cautam afişăm un mesaj de eroare


if (!$row) {.
$page_title = 'Error';
include ('include/header.html');
echo '<div align="center">This page has been accessed in error!</div>';
}
Finalizăm pagina:
include ('include/footer.html');
?>

Sfârşitul scriptului.
35
3.3.11. Scriptul „show_image.php”

Începutul script-ului:

<?php # Script - show_image.php


// Acest script afişează imaginea selectată din catalog.

Iniţializăm variabilele care vor conține calea către imaginea ce va trebui afișată și
numele acesteia:
$image = FALSE;
$name = (!empty($_GET['name'])) ? $_GET['name'] : 'print image';

Verificăm ce imagine trebuie afişată:


if (isset($_GET['image']) && is_numeric($_GET['image']) ) {

Setăm calea spre fişier:


$image = '../uploads/' . (int) $_GET['image'];

Verificăm dacă fişierul există:


if (!file_exists ($image) || (!is_file($image))) {
$image = FALSE;
}
}

Dacă apare o problemă legată de fişier, afişăm imaginea standard:


if (!$image) {
$image = 'images/unavailable.png';
$name = 'unavailable.png';
}
Obţinem informaţiile despre imagine:
$info = getimagesize($image);
$fs = filesize($image);

header ("Content-Type: {$info['mime']}\n");


header ("Content-Disposition: inline; filename=\"$name\"\n");
header ("Content-Length: $fs\n");

Trimitem fişierul:
readfile ($image);

?>

Sfârşitul scriptului

36
3.3.12. Scriptul „adauga_cos.php”

Este scriptul cu care se adaugă un produs în coşul de cumpărături. Este accesat


prin intermediul link-ului „Adaugă în coş” din pagina „vezi_produs.php”.

Începutul script-ului:

<?php # Script - adauga_cos.php


// Acest script adaugă produse în coşul de cumpărături.

Setăm titlul paginii şi includem antetul HTML:


$page_title = 'Adaugă în coşul de cumpărături';
include ('include/header.html');

Verificăm ID-ul produsului.


if (isset ($_GET['pid']) && is_numeric($_GET['pid']) ) {
$pid = (int) $_GET['pid'];

Verificăm dacă coşul conţine deja acest produs. Dacă da, mărim cantitatea:
if (isset($_SESSION['cart'][$pid])) {

$_SESSION['cart'][$pid]['cantitate'] ++;

// Afişăm un mesaj.
echo "<p>Încă o unitate de produs a fost adăugată în coşul de dvs. de
cumpărături.</p>";

Dacă este un produs nou.


} else {

Obţinem preţul din baza de date:


require_once ('mysqli_connect.php');
$q = "SELECT pret FROM produs WHERE produs.id_produs = $pid";
$r = mysqli_query ($dbc, $q);
if (mysqli_num_rows($r) == 1) {
// Validăm ID-ul produsului.

Obţinem informaţiile.
list($price) = mysqli_fetch_array ($r, MYSQLI_NUM);

Adăugăm în coş:
$_SESSION['cart'][$pid] = array ('cantitate' => 1, 'pret' => $price);

Afişăm un mesaj:
echo '<p>Produsul a fost adăugat în coşul de cumpărături.</p>';
Dacă nu avem un ID valid afișăm un mesaj de eroare.
} else { echo '<div align="center">A apărut o eroare în această
pagină!</div>';
}
37
mysqli_close($dbc);

} // Sfârşitul instrucţiunilor condiţionale.

} else { // Nu avem un ID al produsului.


echo '<div align="center">A apărut o eroare în această pagină!</div>';
}

include ('include/footer.html');
?>

Sfârşitul scriptului

3.3.13. Pagina „vezi_cos.php”

Această pagină permite vizitatorului să vizualizeze conţinutul coşului de


cumpărături şi permite de asemenea modificarea cantităţilor sau ştergerea unui produs
din coş.

Începutul script-ului:

<?php # Script - vezi_cos.php


// Acest script afişează conţinutul coşului de cumpărături şi permite
modificarea acestuia.

Setăm titlul paginii şi includem antetul:


$page_title = 'Verifică coşul de cumpărături';
include ('include/header.html');
if (isset($_SESSION['id_client']) && $_SESSION['id_client'] >null)
{
Verificăm dacă formularul a fost trimis (pentru modificarea coşului de
cumpărături):
if (isset($_POST['submitted'])) {

Schimbarea catităţilor:
foreach ($_POST['qty'] as $k => $v) {

Valorile trebuie să fie întregi. Verificăm dacă este așa.


$pid = (int) $k;
$qty = (int) $v;

Dacă se alege valoare “0” ştergem produsul din coş.


if ( $qty == 0 ) {
unset ($_SESSION['cart'][$pid]);
} elseif ( $qty > 0 ) { // Schimbăm cantitatea.
$_SESSION['cart'][$pid] ['cantitate'] = $qty;
}

38
} // Sfârşitul buclei FOREACH.
} // Sfârşitul buclei SUBMITTED IF.

Afişăm conţinutul coşului dacă nu e gol.


if (!empty($_SESSION['cart'])) {

Obţinem informaţiile despre produsele din coş:


require_once ('mysqli_connect.php');
$q = "SELECT id_produs, denumire, nume_produs FROM producatori, produs WHERE
producatori.id_producator = produs.id_producator AND produs.id_produs IN (";
foreach ($_SESSION['cart'] as $pid => $value) {
$q .= $pid . ',';
}
$q = substr($q, 0, -1) . ') ORDER BY producatori.denumire ASC';
$r = mysqli_query ($dbc, $q);

Afişăm un formular şi un tabel:


echo '<form action="vezi_cos.php" method="post"> <table border="0"
width="90%" cellspacing="3" cellpadding="3" align="center">
<tr>
<td align="left" width="30%"><b>Producător</b></td>
<td align="left" width="30%"><b>Nume Produs</b></td>
<td align="right"
width="10%"><b>Preţ</b></td>
<td align="center"
width="10%"><b>Cantitate</b></td>
<td align="right" width="10%"><b>Preţ total</b></td>
</tr>';

Afişăm fiecare obiect...


$total = 0; // Costul total al comenzii.
while ($row = mysqli_fetch_array ($r, MYSQLI_ASSOC)) {

Calculăm totalul şi subtotalul.


$subtotal = $_SESSION['cart'][$row['id_produs']] ['cantitate'] *
$_SESSION['cart'][$row['id_produs']] ['pret'];
$total += $subtotal;

Afişăm informaţia.
echo "\t<tr>
<td align=\"left\">{$row['denumire']}</td>
<td align=\"left\">{$row['nume_produs']}</td>
<td align=\"right\">RON: {$_SESSION ['cart'][$row['id_produs']]['pret']}</td>
<td align=\"center\"><input type=\"text\" size=\"3\"
name=\"qty[{$row['id_produs']}]\" value=\"{$_SESSION['cart'][$row
['id_produs']]['cantitate']}\" /></td>
<td align=\"right\">RON: " . number_format ($subtotal, 2) . "</td>
</tr>\n";
} // Sfârşitul buclei WHILE.
$_SESSION['total'] = $total;

39
Închidem conexiunea cu baza de date.
mysqli_close($dbc);

Afişăm subsolul paginii, închidem tabelul şi formularul.


echo '<tr>
<td colspan="4" align="right"><b>Total:</b></td>
<td align="right">RON: ' . number_format ($total, 2) . '</td>
</tr>
</table>
<div align="center"><input type="submit" name="submit" value="Modifică coşul
de cumpărături" /></div>
<input type="hidden" name="submitted" value="TRUE" />
</form><p align="center">Introduceţi cantitatea 0 pentru a anula un produs.
<br /><br /><a href="checkout.php">Confirmă comanda</a></p>';

} else {
echo '<p>Coşul dvs de cumpărături este gol.</p>';
}
}else{
echo "<h1>Trebuie să fiţi logat pe site pentru a accesa coşul de
cumpărături!</h1>";
}
include ('./include/footer.html');
?>

Sfârşitul scriptului

3.3.14. Scriptul „checkout.php”

Este scriptul prin care se confirmă comanda şi care scrie datele comenzii în baza
de date. Este accesat prin link-ul „Confirmă comanda” din pagina „vezi_cos.php”.

Începutul script-ului:

<?php # Script - checkout.php


// Acest script adaugă în baza de date, informaţiile referitoare la comenzi

Setăm titlul paginii şi includem antetul HTML.


$page_title = "Confirmarea comenzii";
include ("include/header.html");

Obţinem ID-ul clientului:


if (isset($_SESSION['id_client']))
{
$customer = $_SESSION['id_client'];

40
Obţinem valoarea totală a comenzii.
$total = $_SESSION['total']; // Temporary.
}

Ne conectăm la baza de date.


require_once ("mysqli_connect.php");

// Oprim funcţia autocommit.


mysqli_autocommit($dbc, FALSE);

Adăugăm comanda în tabelul comenzi...


$q = "INSERT INTO comenzi (id_client, total) VALUES ($customer, $total)";
$r = mysqli_query($dbc, $q);
if (mysqli_affected_rows($dbc) == 1) {

Obţinem ID-ul comenzii:


$oid = mysqli_insert_id($dbc);

Inserăm în baza de date conţinutul comenzii.

// Pregătim interogarea:
$q = "INSERT INTO continut_comanda (id_comanda, id_produs, cantitate, pret)
VALUES (?, ?, ?, ?)";
$stmt = mysqli_prepare($dbc, $q);
mysqli_stmt_bind_param($stmt, 'iiid', $oid, $pid, $qty, $price);

Inmterogăm baza de date pentru fiecare produs.


$affected = 0;
foreach ($_SESSION['cart'] as $pid => $item) {
$qty = $item['cantitate'];
$price = $item['pret'];
mysqli_stmt_execute($stmt);
$affected += mysqli_stmt_affected_rows($stmt);
}
// Închidem declaraţia predefinită:
mysqli_stmt_close($stmt);

Dacă totul este în regulă ...


if ($affected == count($_SESSION['cart'])) {

… executăm tranzacţiile în baza de date:


mysqli_commit($dbc);

Golim coşul de cumpărături.


unset($_SESSION['cart']);

Afişăm un mesaj de confirmare:


echo '<p>Vă mulţumim pentru comandă. Veţi fi anunţaţi printr-un e-mail în
momentul în care comanda dvs. a fost trimisă prin curier.</p>';

41
Dacă apar erori, anulăm tranzacţia şi afişăm un mesaj.
} else {

mysqli_rollback($dbc);

echo '<p>Ne cerem scuze. Comanda dvs. nu a putut fi procesată datorită unei
erori de sistem. Veţi fi contactat pentru rezolvarea problemei.</p>';

} else {

mysqli_rollback($dbc);

echo '<p>Ne cerem scuze. Comanda dvs. nu a putut fi procesată datorită unei
erori de sistem. Veţi fi contactat pentru rezolvarea problemei.</p>';

mysqli_close($dbc);

include ("include/footer.html");
?>

Sfârşitul scriptului

3.3.15. Scriptul „logout.php”

Este scriptul prin care se deloghează vizitatorul care părăseşte site-ul. Este
accesat din meniu.

Începutul script-ului:

<?php # Script - logout.php


// Acesta este scriptul de ieşire din site.

$page_title = 'Logout';
include ('include/header.html');

Dacă nu găsim un ID al clientului in sesiune, redirectăm vizitatorul:


if (!isset($_SESSION['id_client'])) {

Definim URL spre care se redirectează vizitatorul ca pagina „index.php”.


$url = BASE_URL . 'index.php';
Ştergem buffer-ul.
ob_end_clean();
header("Location: $url");
Ieşim din script.
42
exit();

Dacă există un client logat…


} else {

Distrugem variabilele sesiunii.


$_SESSION = array();

Distrugem sesiunea.
session_destroy();

Distrugem cookie-ul, de-logăm clientul și îl redirectăm spre pagina „index.php”.


setcookie (session_name(), '', time()-300);
header("Location: index.php");

exit(); // Ieşim din script script.


}

// Afişăm un mesaj:
echo '<h3>Vă mulţumim pentru vizită.</h3>';
//Includem subsolul paginii
include ('include/footer.html');
?>

3.3.16. Gestionarea parolelor”

Gestionarea parolelor se face cu ajutorul a două scripturi, unul pentru


schimbarea unei parole existente şi altul pentru resetarea unei parole uitate.

3.3.16.1. Pagina „schimbare_parola”

În această pagină se poate face schimbarea unei parole existente cu o altă parolă
nouă. Pagina este accesată din meniu în cazul în care vizitatorul este deja logat pe site.

Începutul script-ului:

<?php # Script - schimbare_parola.php


// Acest script permite utilizatorului să-şi schimbe parola.

$page_title = 'Schimbare parolă';


include ('include/header.html');

Dacă nu avem un ID al userului, deci nu este nici un client logat, redirecţionăm


spre index:

43
if (!isset($_SESSION['id_client'])) {

$url = BASE_URL . 'index.php'; // Definim URL.


ob_end_clean(); // Ştergem buffer-ul.
header("Location: $url");
exit(); // Ieşim din script.

Verificăm dacă a fost trimis formularul…


if (isset($_POST['submitted'])) {
require_once ('mysqli_connect.php');

Verificăm parola noua şi confirmarea acesteia:


$p = FALSE;
if (preg_match ('/^(\w){4,20}$/', $_POST ['password1']) ) {
if ($_POST['password1'] == $_POST['password2']) {
$p = mysqli_real_escape_string($dbc, $_POST['password1']);
} else {
echo '<p class="error">Parola dvs nu se potriveşte cu parola
confirmată!</p>';
}
} else {
echo '<p class="error">Vă rugăm introduceţi o parolă validă!</p>';
}

Dacă totul este în regulă...


if ($p) {

Interogăm baza de date și modificăm parola.


$q = "UPDATE clienti SET parola=SHA1('$p') WHERE
id_client={$_SESSION['id_client']} LIMIT 1";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));
if (mysqli_affected_rows($dbc) == 1) { // If it ran OK.

Afişăm un mesaj referitor la schimbarea parolei.


echo '<h3>Parola dvs. a fost schimbată.</h3>';
mysqli_close($dbc); // Închidem conexiunea cu baza de date.
include ('include/footer.html'); // Includem subsolul HTML.
exit();

Dacă apar erori, parola nouă este identică cu cea veche sau nu respect cerințele,
afișăm un mesaj de eroare și procesul se repeat.
} else {

echo '<p class="error">Parola nu a fost schimbată. Alegeţi o parolă diferită


faţă de cea curentă. Contactaţi administratorul dacă consideraţi că a apărut
o eroare.</p>';

} else {

44
echo '<p class="error">Încercaţi din nou.</p>';
}

mysqli_close($dbc); // Închidem conexiunea cu baza de date.

} // Sfârşitul instrucţiunilor condiţionale.

?>

Afișarea formularului
<h1>Schimbă parola</h1>
<form action="schimbare_parola.php" method="post">
<fieldset>
<p><b>Parola nouă:</b> <input type="password" name="password1" size="20"
maxlength="20" /> <small>Folosiţi doar litere, cifre şi underscore. Lungimea
trebuie să fie între 4 şi 20 de caractere.</small></p>
<p><b>Confirmă parola nouă:</b> <input type="password" name="password2"
size="20" maxlength="20" /></p>
</fieldset>
<div align="center"><input type="submit" name="submit" value="Schimbă parola"
/></div>
<input type="hidden" name="submitted" value="TRUE" />
</form>

<?php
include ('include/footer.html');
?>

Sfârşitul scriptului

3.3.16.2. Pagina „recuperare_parola”

Această pagină permite unui vizitator să reseteze o parolă uitată. Acesta va primi
prin intermediul adresei de e-mail cu care s-a înregistrat o parolă temporară generată
aleeatoriu cu care se poate loga pe site şi poate după aceea să o schimbe cu altă parolă
mai uşor de ţinut minte. Această pagină poate fi accesată din meniul care apare dacă
vizitatorul nu este logat pe site.

Începutul script-ului:
<?php # Script - recuperare_parola.php
// Acest script permite unui utilizator sa reseteze parola în caz că a uitat-
o.

$page_title = 'Recuperare parola';


include ('include/header.html');

45
if (isset($_POST['submitted'])) {
require_once ('mysqli_connect.php');

// Resetăm variabila care conţine ID-ul utilizatorului:


$uid = FALSE;

// Validăm adresa de e-mail...


if (!empty($_POST['email'])) {

// verificăm dacă adresa de e-mail există în baza de date...


$q = 'SELECT id_client FROM clienti WHERE email="'. mysqli_real_escape_string
($dbc, $_POST['email']) . '"';
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));

if (mysqli_num_rows($r) == 1) { // Obţinem ID-ul utilizatorului:


list($uid) = mysqli_fetch_array ($r, MYSQLI_NUM);
} else { // Dacă adresa de e-mail nu există în baza de date...
echo '<p class="error">Adresa de e-mail introdusă, nu se regaseşte în baza de
date!</p>';
}

} else { // Dacă nu a fost introdus o adresă de e-mail


echo '<p class="error">Vă rugăm introduceţi adresa de e-mail!</p>';
} // Sfârşitul buclei IF.

if ($uid) { // Dacă totul e în ordine...

// Se creează o parolă aleatorie:


$p = substr ( md5(uniqid(rand(), true)), 3, 10);

// Schimbăm parola în baza de date:


$q = "UPDATE clienti SET parola=SHA1('$p') WHERE id_client=$uid LIMIT 1";
$r = mysqli_query ($dbc, $q) or trigger_error("Query: $q\n<br />MySQL Error:
" . mysqli_error($dbc));

if (mysqli_affected_rows($dbc) == 1) { // Verificăm dacă s-a făcut


schimbarea.

// Trimitem un e-mail utilizatorului cu noua parolă:


$body = "Parola dvs. a fost schimbată temporar în şirul de caractere '$p'. Vă
puteţi loga cu această parolă şi adresa dvs. de e-mail, după care puteţi
schimba parola în forma dorită.";
//mail ($_POST['email'], 'Your temporary password.', $body, 'From:
admin@sitename.com');

// Afişăm un mesaj:
echo '<h3>Parola dvs. a fost schimbată. Veţi primi o nouă parolă temporară pe
adresa de e-mail cu care v-aţi îmregistrat.</h3>';
mysqli_close($dbc);
include ('includes/footer.html');
exit(); // Ieşim din script.

} else { // Dacă apar erori...


echo '<p class="error">Ne cerem scuze! Parola dvs. nu a putut fi recuperată
datorită unei erori de sistem.</p>';
}
46
} else {
echo '<p class="error">Vă rugăm încercaţi din nou.</p>';
}

mysqli_close($dbc);

} // Sfârşitul buclei.

?>

<h1>Resetarea parolei</h1>
<p>Introduceţi mai jos adresa de e-mail cu care v-aţi înregistrat.Parola va
fi resetată.</p>
<form action="recuperare_parola.php" method="post">
<fieldset>
<p><b>Adresa e-mail:</b> <input type="text" name="email" size="20"
maxlength="40" value="<?php if (isset($_POST['email'])) echo $_POST['email'];
?>" /></p>
</fieldset>
<div align="center"><input type="submit" name="submit" value="Resetează
parola" /></div>
<input type="hidden" name="submitted" value="TRUE" />
</form>

<?php
include ('include/footer.html');
?>
Sfârşitul scriptului

Capitolul 4. Concluzii

Magazinul virtual este un tip de afacere care ofera facilităti atât clientilor cât și
ofertantilor. El asigură accesul la bunuri și servicii indiferent de localizarea geografică,
fiind disponibil 24 de ore din 24. În funcție de modul în care este construit și întreținut
magazinul virtual, beneficiile aduse firmei care furnizează bunurile sau prestează
serviciile sunt semnificative față de efortul prestat pentru actualizarea și întreținerea
acestuia.
De cele mai multe ori cea mai mare provocare pentru un magazin online este
câștigarea încrederii clienților, de aceea este necesară colaborarea strânsă între vânzător
și curier, pentru a nu avea probleme de livrare care s-ar răsfrânge negativ asupra
credibilității site-ului.
Cu siguranță nu există caracteristici universale sau opțiuni de design care să
garanteze succesul unui magazin online, însă există numeroase elemenete esențiale de
care trebuie ținut cont la crearea unui magazin online.

47
Bibliografie

1. Instrumente WEB 2.0 utilizate in educatie, Traian Anghel, Editura Albastra, Cluj
Napoca, 2009.
2. Crearea paginilor WEB, Sabin Buraga, Ed. Polirom Iaşi, 2002
3. Aplicaţii WEB la cheie: studii de caz implementate în PHP, volum coordonat de
Sabin Buraga, Ed. Polirom Iaşi, 2003
4. PHP pentru World Wide Web, Larry Ullman ED. Teora SRL Bucureşti, 2004
5. www.php.net/manual/
6. www.mysql.com/docs/
7. www.apache.org/docs/

48

S-ar putea să vă placă și

  • Tot
    Tot
    Document218 pagini
    Tot
    Ioana-camelia Stanila
    Încă nu există evaluări
  • Capitolul III
    Capitolul III
    Document36 pagini
    Capitolul III
    Ioana-camelia Stanila
    Încă nu există evaluări
  • Lucrare Practica 1
    Lucrare Practica 1
    Document6 pagini
    Lucrare Practica 1
    Ioana-camelia Stanila
    Încă nu există evaluări
  • Notificare APIA
    Notificare APIA
    Document4 pagini
    Notificare APIA
    Ioana-camelia Stanila
    Încă nu există evaluări
  • SUBIECTE
    SUBIECTE
    Document2 pagini
    SUBIECTE
    Ioana-camelia Stanila
    Încă nu există evaluări