CATEGORII DOCUMENTE |
Construirea unui magazin web
In prezent, magazinele web reprezinta o componenta esentiala a fiecarei strategii de afaceri a unei companii moderne. Magazinele web nu sunt construite doar pentru a vinde produse. In multe situatii ele realizeaza prezenta companiei pe web si ne va ajuta sa prezentam produsele unei audiente largi.
Vom vedea cum se construeste un shopping cart si cum se dezvolta siturile personalizate. Aplicatia consta din doua ecrane: primul afiseaza produsele din baza de date, al doilea script va reduce numarul de produse stocate in magazin si va afisa lista de produse pe care consumatorul le-a cumparat.
Vom incepe cu definirea unei structuri de date pentru magazinul nostru. Vom porni cu o singura tabela.
CREATE TABLE product (
id int4, -- id-ul unic al produslui
name text, -- numele produsului
instock int4, -- numarul de produse din stoc
price numeric(9,2), -- pretul produselor
PRIMARY KEY (id)
COPY product FROM stdin USING DELIMITERS ';';
1;PostgreSQL Cookbook;345;41.99
2;PHP and PostgreSQL;2534;41.59
3;Python Handbook;962;39.52
4;mod_perl;0;49.99
5;PostgreSQL For UNIX Programmers;1;54.69
6;Visual C++;2;29.19
Tabela contine informatii despre produse. Fiecare produs are un id, un nume si un pret. In plus, baza de date stocheaza numarul de produse care sunt in magazin. Prototipul contine mai multe fisiere:
File |
Purpose |
cart.php |
Creaza noi obiecte pentru shopiing cart si managementul sesiunilor |
cash.php |
Afiseaza produsele pe care cumparatorul le-a cumparat si reduce numarul de produse care sunt inca in magazin |
error.php |
Manipularea erorilor |
incshop.php |
Ajutor in legatura cu serializarea |
ss_libcart.php |
Librarie pentru lucrul cu shopping cart; este o extensie pentru clasa db definita in libdb.php |
libdb.php |
Libraria bazei de date |
libhtml.php |
Libraria HTML |
shop.php |
Ecranul de pornire |
temp_cash.html |
Sablon HTML |
temp_list.html |
Sablon HTML pentru afisarea produselor din baza de date |
Vom construi aplicatia in varianta bazata pe sesiuni si pe cookies. Obiectivul acestei sectiuni este sa vedem cum separam layout-ul unei aplicatii de codul sursa. In plus, vom vedea cum trecem arry-urile de la un ecran la altul si cum putem folosi tranzactiile.
Shopping Cart bazat pe cookie
Fisierul libdb.php contine o librarie pentru interactiunea cu baza de date.
<?php
class db
}
function sql($statement)
$this->res = @pg_exec($this->db, $statement);
if (!$this->res)
else
}
function fetch($num, $type = 3, $param = 0, $mres = 0)
return ($row);
}
function disconnect()
function ErrorMsg($outstr)
?>
Obiectul db contine trei variabile. $conn contine parametrii care definesc conexiunea la baza de date. In acest exemplu acesti parametri au fost codate pentru a reduce cantitatea de cod si numarul de fisiere necesare pentru acest prototip. $db contine manipulatorul pentru baza de date iar $res rezultatul declaratiei SQL.
Functia connect stabileste conexiunea la baza de date si afiseaza un mesaj de eroare daca nu este stabilita nici o conexiune. Functia sql poate fi utilizatǎ pentru a executa declaratia SQL. In cazul aparitiei unei erori, mesajul de eroare poate fi suprimat.Valoarea returnatǎ de functie contine numǎrul de inregistrǎri returnate de declaratia SQL.
Pentru a extrage valorile din rezultatul declaratiei SQL, a fost implementatǎ functia fetch. In functie de tipul de rezultat care se doreste a fi regǎsit, putem alege. Cu ajutorul celui de-al treilea parametru trecut in functie, putem decide cand dorim sǎ lucrǎm cu array-uri, obiecte sau linii. Aceasta este o trǎsǎturǎ confortabilǎ deoarece ne ajutǎ sǎ reducem functiile din librǎria bazei de date farǎ a reduce flexibilitatea programatorului care utilizeazǎ librǎria.
Functia disconnect este utilizatǎ pentru a distruge conexiunea la baza de date. Functia ErrorMsg afiseazǎ un mesaj pe ecran si terminǎ aplicatia.
Aceastǎ librǎrie va fi utilizatǎ de intregul pachet al magazinului.
Urmǎtorul pachet necesar se numeste ss_libcart.php si este utilizat pentru a lucra cu shopping cart-ul.
<?php
require ('libdb.php');
class cart extends db
$chk = $this->checkstock($id,$number);
if (!$chk)
if ( $number < 1)
else
$ser_cart = serialize($ar_cart);
return($ser_cart);
}
function checkstock($id, $number)
{
$chksel = 'SELECT instock FROM product WHERE id=$id';
$this->connect();
$this->sql($chksel);
$row = $this->fetch(0,3);
if ($number > $row->instock)
return(1);
}
?>
Prima functie definitǎ in acest loc este numitǎ cartwork. Ea este necesarǎ pentru verificarea datelor transmise de la un script la altul. Pentru a transmite datele care nu pot fi stocate intr-un sir de la un script la altul, datele trebuie serializate. Pentru array-uri sau obiecte acestea sunt necesare deoarece un array constǎ din mai mult de o componentǎ Serializarea ne asigurǎ cǎ un sir contine aceeasi informatie ca obiectul original construit. In acest mod datele pot fi stocate intr-un cookie sau intr-o sesiune sau pot fi utilizate in cadrul unui URL.
Functia checkstock este utilizatǎ pentru a gǎsi numǎrul de unitǎti disponibile dintr-un produs pe care cumpǎrǎtorul doreste sǎ le cumpere. Dacǎ numǎrul de produse pe care cumpǎrǎtorul vrea sǎ le cumpere este mai mare decat produsele care sunt in magazin, este returnat 0; altfel functia va returna 1. Singurii parametri necesari pentru functie sunt id-ul obiectului si numǎrul de produse pe care utilizatorul vrea sǎ le cumpere. Numǎrul de unitǎti disponibile este preluat din baza de date.
Fisierul cart.php este utilizat pentru a procesa parametrii trecuti in scriptul pentru plǎti.
<?
include ('ss_libcart.php');
@session_start();
$sid = session_id();
$keys = array_keys($HTTP_POST_VARS);
$anz = count($keys);
for ($x = 0; $x < count($keys); $x++)
$t = time() + 50000;
setcookie('ser_cart',$ser_cart,$t,'/');
header('Location: shop.php');
?>
La inceputul scriptului este pornitǎ sesiunea. In plus, id-ul sesiunii este creat. Dupǎ aceasta sunt extrase cheile din $HTTP_POST_VARS. $HTTP_POST_VARS contine toti parametrii specificati in functie cu ajutorul cererii POST. Pentru fiecare cheie din array, este calculat numǎrul de produse. Un nou obiect cart este creat si este apelat cartwork.
La sfarsitul scriptului este setat un cookie. Acest cookie este necesar pentru a stoca informatia referitoare la shopping cart. Datele sunt serializate, din acest motiv nefiind nevoie sǎ ne facem griji despre modul in care datele sunt stocate in interiorul unui cookie.
Urmǎtorul fisier din listǎ se numeste error.php. Acesta contine un fragment de cod pentru afisarea informatiilor privind erorile:
<?php
if ($msg)
?>
Scriptul verificǎ cand $msg este definit. Dacǎ este definit, este apelat $page ->add_data si <b>Nu sunt sficiente produse in stoc!</b> va fi adǎugat la obiectul care contine codul HTML al paginii. Obiectul care contine codul este numit $page, asa cum putem observa in urmǎtorul fisier. Sǎ vedem acum fisierul shop.php. Fisierul este utilizat pentru a afisa primul ecran care contine o listǎ a produselor pe care utilizatorul le poate cumpǎra. Codul fisierului este:
<?php
include('ss_libcart.php');
include('libhtml.php');
include('incshop.php');
$page = new libhtml('temp_list.html');
include('error.php');
$psel = 'SELECT id,name,instock,price FROM product ORDER BY name';
$con = new db();
$con->connect();
$num = $con->sql($psel);
$content = '';
for ($i = 0; $i<$num; $i++)
$page->add_data('CONTENT',$content);
echo $page->output();
?>
In primul rand sunt incluse librǎrile necesare pentru a afisa paginile. In urmǎtorul pas, un nou obiect numit $page este creat. Obiectul se bazeazǎ pe un template numit temp_list.html. Codul template-ului este:
<h1>Lista produselor</h1>
<form action='cart.php' method=post>
<table>
<tr>
<td>ID</td>
<td>Nume Produs</td>
<td>Pret</td>
<td>Cantitate</td>
</tr>
</table>
</form>
<a href='cash.php'>Continuam cu verificarea </a>
Dupǎ cum putem observa template-ul este simplu si contine cod HTML si cateva cuvinte cheie.
Dupǎ ce includem librariile si creem obiectul $page, este inclus error.php. Acesta librarie trebuie inclusa in acest loc si nu inainte de a genera obiectul $page deoarece error.php se bazeaza pe existenta lui $page. Intregul cod generat de acesta aplicatie trebuie inclus in $page inainte de a fi afisat $page trebuie sa existe inainte de a adauga cod in acesta. Acum trebuie sa stabilim o conexiune la baza de date prin crearea obiectului db. In plus va fi executata o interogare Aceasta interogare este necesara pentru extragerea produselor dorite din baza de date.Valoarea returnata de functie numita sql contine numarul de linii din rezultat. Aceasta valoare este utilizata de procesarea buclei, fiecare linie fiind returnata de PostgreSQL. In interiorul buclei este apelata functia line. Similar cu celelalte functii apelate in acest bloc, functia a fost implementata in libhtml.php:
<?php
class libhtml
function add_data($field, $value)
', $value,$this->page);
}
function line($id, $name, $price, $value)
function cashline($id = '', $name = '', $price = '', $value = '',
$sum = '')
function output()
{
$this->page = str_replace('', $msg, $this->page);
return($this->page);
}
?>
Clasa implementata in libhtml.php contine doua variabile. $page contine intregul cod HTML al paginii care a fost generat. $msg contine mesaje importante. Sa studiem mai atenti la constructorul obiectului. Numele fisierului este trecut im metodǎ. Acest fisier este citit si asignat la $page. Acum datele din fisier pot fi modificate cu usurintǎ. Pentru a inlocui variabilele din fisierele in care dorim sǎ vedem datele, putem utiliza add_data. Acesta analizeazǎ fisierele si realizeazǎ inlocuiri. Add_data inlocuieste intregul sir de date. In cazul tabelelor nu este ceea ce dorim; este necesarǎ functia numitǎ line. Aceastǎ functie este necesarǎ pentru a afisa o linie a unei tabele. Indiferent de datele necesare, line va construi tabelul.
Urmǎtoarea functie se numeste cashline. Aceasta este utilizatǎ pentru a afisa datele pe ultima paginǎ, care contine o listǎ a tuturor produselor pe care utilizatorul le-a cumpǎrat. In final, a fost implementatǎ iesirea functiei. Aceasta realizeazǎ o substitutie si returneazǎ codul paginii.
Asa cum se poate observa in template-ul HTML utilizat de shop.php, legǎtura din partea de jos a paginii conduce la cash.php. Cash.php reprezintǎ fisierul responsabil de verificare. Dupǎ ce utilizatorul a selectat toate produsele pe care le doreste, el poate cumpǎra aceste produse si aceasta se realizeazǎ cu cash.php. Similar cu restul aplicatiei, codul HTML este bazat pe template-uri. De aceastǎ datǎ fisierul se numeste temp_cash.html:
<h1>Payment</h1>
<table>
<tr>
<td>ID</td>
<td>Productname </td>
<td>Price </td>
<td>Quantity</td>
<td>Sum</td>
</tr>
</table>
</form>
In fisier observǎm doi parametri. Primul este si al doilea este . Aceste douǎ siruri vor fi substituite pentru continut. Aceasta se realizezǎ cu cash.php:
<?
include ('libhtml.php');
include ('libdb.php');
include ('incshop.php');
$page = new libhtml('temp_cash.html');
$con = new db();
$con->connect();
$con->sql('BEGIN TRANSACTION');
$allsum = 0;
$keys = array_keys($ar_cart);
foreach ($keys as $element)
$con->sql('COMMIT');
$content .= $page->cashline('', '', '', '', $allsum);
$page->add_data('CONTENT',$content);
$t = time() - 50000;
setcookie('ser_cart', '', $t, '/');
echo $page->output();
?>
La inceputul fiserului este creat un obiect care contine codul HTML. La fel ca in shop.php, obiectul este numit $page. In urmǎtorul pas este stabilitǎ o conexiune la baza de date si este pornitǎ o tranzactie. Acest lucru este important deoarece cand eliminǎm produsele din magazin, trebuie sǎ avem grijǎ sǎ nu se intample ceva rǎu in mijlocul procesului. Dacǎ o interogare esueazǎ, numǎrul de produse din magazin nu va fi corect si nu existǎ nici o cale sǎ rezolvǎm astfel de probleme.
In urmǎtorul pas shopping-cart-ul utulizatorului este procesat. Pentru fiecare produs pe care utilizatorul il cumpǎrǎ, este executatǎ o declaratie SELECT. Datele returnate de declaratia SELECT sunt utilizate pentru a construi cadrul final al produselor. In plus, este realizatǎ o interogare UPDATE. Interogarea reduce produsele care se aflǎ in magazin.
Dupǎ procesarea datelor, este comisǎ tranzactia si codul HTML aditional este adǎugat la obiectul $page. In cele din urmǎ continutul obiectului este afisat pe ecran si cookie este setat la un "timestamp" negativ. Aceasta inseamnǎ cǎ acel cookie este sters si din acest motiv shopping-cart-ul utilizatorului este gol.
Fisierul incshop.php este:
<?
@session_start();
$sid = session_id();
$sel = 'SELECT value FROM cart WHERE sid='$sid'';
$condb = new db();
$condb->connect();
$num = $condb->sql($sel);
if ($num)
$condb->disconnect();
?>
Pentru a vedea cum aplicatia a fost implementatǎ sǎ vedem ecranul generat de shop.php:
Shopping Cart bazat pe sesiuni
Cookie-urile au anumite dezavantaje. Indeosebi atunci cand lucrǎm cu o mixturǎ de zone securizate si nesecurizate, cookie-urile pot fi fatale deoarece un cookie care a fost setat intr-o zonǎ securizatǎ nu este valid intr-o zonǎ nesecurizatǎ. Aceasta poate cauza probleme si duce la muncǎ suplimentarǎ si costuri ridicate. Vom vedea cum aplicatia anterioarǎ poate fi implementatǎ cu ajutorul sesiunilor. Fisierele care vor fi schimbate sunt:
- cart.php - functii adǎugate pentru inceperea sesiunilor
- incshop.php - functii adǎugate pentru pornirea sesiunilor
- ss_libcart.php - adǎugarea si actualizarea informatiilor de tip sesiune
Obiectivul fisierelor originale sunt similare, dar modificǎrile au fost fǎcute pentru a lucra cu sesiuni. Vom crea o tabelǎ:
CREATE TABLE 'cart' (
'sid' text,
'value' text
Aceasta tabelǎ va fi utilizatǎ pentru a stoca informatiile colectate de subsistemul sesiunilor. Prima coloanǎ contine id-ul sesiunii. A doua coloanǎ este folositǎ pentru a stoca valorile sesiunii.
Dupǎ crearea tabelei, vom vedea fisierul care necesitǎ a fi schimbat pentru a lucra cu informatii privind sesiunile. Vom incepe cu cart.php:
<?php
include ('ss_libcart.php');
@session_start();
$sid = session_id();
$keys = array_keys($HTTP_POST_VARS);
for ($x = 0; $x < count($keys); $x++)
header('Location: shop.php');
?>
Dupǎ cum se poate observa la inceputul scriptului, o sesiune este pornitǎ. In urmǎtorul pas este creat id-ul sesiunii. Acest id este asignat lui $sid. Restul scriptului functioneazǎ la fel ca versiunea cookie a fisierului. Singurul lucru care trebuie fǎcut este sǎ eliminǎm functia setcookie si liniile legate de aceasta.
Fisierul incshop.php va fi:
<?
@session_start();
$sid = session_id();
$sel = 'SELECT value FROM cart WHERE sid='$sid'';
$condb = new db();
$condb->connect();
$num = $condb->sql($sel);
if ($num)
$condb->disconnect();
?>
Dupǎ pornirea sesiunii si generarea id-ului de sesiune, id-ul sesiunii curente este extras din baza de date. Dacǎ datele sunt returnate , valoarea din a doua coloanǎ este extrasǎ si este apelat unserialize. Acesta este modul in care informatiile privind sesiunea sunt extrase din baza de date. Versiunea modificatǎ a lui ss_libcart.php este:
<?
require ('libdb.php');
class cart extends db
$con = new db();
$con->connect();
$chk = $this->checkstock($id,$number);
if (!$chk)
$selc = 'SELECT value FROM cart WHERE sid='$sid'';
$num=$con->sql($selc);
if (!$num)
else
else
$ser_cart = serialize($ar_cart);
$upd = 'UPDATE cart SET value='$ser_cart' WHERE
sid='$sid'';
$con->sql($upd);
}
function checkstock($id,$number)
return(1);
}
?>
Vom porni cu functia numitǎ cartwork. Asa cum am vǎzut in versiunea cookie, functia verificǎ cand sunt suficiente produse in magazin. Aceasta se realizezǎ cu ajutorul functiei checkstock care o gǎsim la sfarsitul documentului. Aceastǎ functie lucreazǎ similar cu cea pe care am vǎzut-o in versiunea cookie a acestui script. Pentru a lucra cu baza de date sesiune, trebuie stabiltǎ o conexiune la baza de date, aceasta realizandu-se prin crearea obiectului db.
In urmǎtorul pas inregistrǎrile care contin id-ul sesiunii sunt extrase din baza de date. Continutul celui de-al doilea camp din coloanǎ este neserializat si modificat inainte de a fi serializat din nou. In cele din urmǎ continutul bazei de date este modificat.
Dupǎ ce aplicatia a pornit, unele inregistrǎri pot fi gǎsite in tabela numitǎ cart.
phpdb=# SELECT * FROM cart;
sid | value
1d94d8e82a893618bcfddde8b06fcf17 | a:2:
ef495e885964545b61c10bfc6f1853fd | a:3:
9646a5abc72d26ce1975f8c389990358 | a:3:
(3 rows)
In prima coloanǎ se poate observa cum aratǎ id-ul unei sesiuni; are lungimea de 32 de caractere si este un sir alfanumeric. A doua coloanǎ contine versiunea serializatǎ a datelor trecute in scriptul numit cash.php.
Dacǎ toate componentele utilizate in lucrul cu sesiuni sunt manipulate prin module, este necesar sǎ schimbǎm modulele pe care le utilizǎm. In majoritatea cazurilor aceasta nu va afecta intreaga aplicatie.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1372
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved