Documente Academic
Documente Profesional
Documente Cultură
Construirea unui simplu co de cumprturi n PHP Pasul 1. Pregtirea bazei de date Relum exemplul cu librria. Presupunem c avem doar trei cri n librrie.
CREATE TABLE books ( id int(6) unsigned NOT NULL auto_increment, title varchar(100) NOT NULL default '', author varchar(100) NOT NULL default '', price decimal(3,2) NOT NULL default '0.00', PRIMARY KEY (id) ) TYPE=MyISAM; INSERT INTO books VALUES (1, 'Bla1', 'x', '24.99'); INSERT INTO books VALUES (2, 'Bla2', 'y', '17.99'); INSERT INTO books VALUES (3, 'Bla3', 'Oolon z', '14.99');
2. Identificarea cerinelor Cosul de cumprturi trebuie s afieze un mesaj pe toate paginile din site (mpreun cu propoziia: Ai 5 obiecte n co), care n momentul n care este apsat s afieze coul de cumprturi. Avnd n vedere c n baza de date sunt stocate detaliile despre stocuri, singura informaie necesar va fi id-ul fiecarui produs care este adugat n cos. Pentru acest lucru va trebui s folosim sesiuni PHP. Pasul 3. Folosirea sesiunilor n PHP Lucrul cu sesiuni n PHP este foarte uor de nteles. Pentru a le porni trebui s adugm session_start(); la nceputul codului. In variabilele sesiune se pot stoca valori sau array-uri. $_SESSION['name'] = 'Matei'; $_SESSION['age'] = 31; Pasul 4. Crearea coului Vom stoca coninutul coului de cumprturi ntr-o list, n care id-urile produselor sunt separate de virgul. Mai jos este codul pentru afiarea mesajului Ai X obiecte pe fiecare pagin.
function writeShoppingCart() { $cart = $_SESSION['cart']; if (!$cart) { return '<p>Nu ai niciun obiect in cos</p>'; } else { // parsam variabila de sesiune cart
smaranda.belciug@inf.ucv.ro
$items = explode(',',$cart); $s = (count($items) > 1) ? 's':''; return '<p>Ai <a href="cart.php">'.count($items).' obiecte'.$s.' in cos</a></p>'; } }
Aceast funcie ia valoarea variabilei de sesiune cart i o salveaz ntr-o variabil local (pentru a scrie mai puin). Dac avem coul gol, atunci returnm un anumit mesaj; dac nu, folosim funcia explode() pentru a crea un array cu toate produsele din co i apoi cu count() le numrm i afim rezultatul (variabila $s este folosit pentru a afia corect elementele care apar de mai multe ori). Pentru a afia mesajul corect pe site scriem: echo writeShoppingCart(); Pasul 5. Show me the money Jerry Maguire La pagina coului de cumprturi nsui (cart.php) se poate ajunge n mai multe moduri. Utilizatorul ar putea s fac click pe un link creat de writeShoppingCart() de mai sus; sau a apsat pe un link Add to cart din pagina unui produs. Daca este cea de-a doua, trebuie s interceptm click-ul respectiv i s updatm coninutul coului nainte de a afia noua list de produse. Tot ce trebuie este s adugam id-ul produsului sesiunii cart. Link-ul produselor ar arata asa.
<a href="cart.php?action=add&id=1">Add to cart</a>
Pasul 6. Obiecte multiple, un singur produs Este posibil ca utilizatorul s aib mai multe de un obiect de acelai tip n co. Deoarece nu vrem s duplicm obiectele cnd afim coul, trebuie s cretem cantitatea.
$cart = $_SESSION['cart']; if ($cart) { $items = explode(',',$cart); $contents = array(); foreach ($items as $item) { $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; }
smaranda.belciug@inf.ucv.ro De aceast dat, dup ce am folosit explode() pentru lista de id-uri, le-am iterat ntrun nou array $contents, care const n perechi de cheie valoare, unde cheia este id-ul iar valoarea este cantitatea produsului din coul de cumprturi. Dac avem 1,1,3,1,2 rezult 1 3, 2 1, 3 1. Acum c am stabilit numrul de obiecte din co, s facem un query n baza de date pentru fiecare dintre ele i s le afim ntr-un tabel:
$total = 0; $output[] = '<table>'; foreach ($contents as $id=>$qty) { $sql = 'SELECT * FROM books WHERE id = '.$id; $result = $db->query($sql); $row = $result->fetch(); extract($row); $output[] = '<tr>'; $output[] = '<td><a href="cart.php?action=delete&id='.$id.'" class="r">Remove</a></td>'; $output[] = '<td>'.$title.' by '.$author.'</td>'; $output[] = '<td>£'.$price.'</td>'; $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>'; $output[] = '<td>£'.($price * $qty).'</td>'; $total += $price * $qty; $output[] = '</tr>'; } $output[] = '</table>'; $output[] = '<p>Total: £'.$total.'</p>';
Pasul 7. tergerea unui produs Dup cum arat codul mai sus, se poate terge un produs din co, la fel cum se adaug: <a href="cart.php?action=delete&id=1">Remove</a> S expandm codul de mai devreme prin adugarea unui switch():
$cart = $_SESSION['cart']; $action = $_GET['action']; switch ($action) { case 'add': if ($cart) { $cart .= ','.$_GET['id']; } else { $cart = $_GET['id']; } break; case 'delete': if ($cart) { $items = explode(',',$cart); $newcart = ''; foreach ($items as $item) { if ($_GET['id'] != $item) { if ($newcart != '') { $newcart .= ','.$item;
smaranda.belciug@inf.ucv.ro
} else { $newcart = $item; } } } $cart = $newcart; } break; } $_SESSION['cart'] = $cart;
Cazul delete itereaz elementele din sesiunea cart, cutnd dup produsele pe care nu care le tergem, adugnd-ule ntr-o variabil temporar. Cnd terminm coninutul lui $newcart este trecut in $cart. Pasul 8. Updatarea unui produs In final, vom permite clientului s updateze coninutul coului manual, schimbnd cantitate din casua produsului. Pentru asta avem nevoie de un formular i de un buton de update cart pentru submit.
$output[] = '<form action="cart.php?action=update" method="post" id="cart">'; $output[] = '<table>'; foreach ($contents as $id=>$qty) { $sql = 'SELECT * FROM books WHERE id = '.$id; $result = $db->query($sql); $row = $result->fetch(); extract($row); $output[] = '<tr>'; $output[] = '<td><a href="cart.php?action=delete&id='.$id.'" class="r">Remove</a></td>'; $output[] = '<td>'.$title.' by '.$author.'</td>'; $output[] = '<td>£'.$price.'</td>'; $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>'; $output[] = '<td>£'.($price * $qty).'</td>'; $total += $price * $qty; $output[] = '</tr>'; } $output[] = '</table>'; $output[] = '<p>Grand total: £'.$total.'</p>'; $output[] = '<div><button type="submit">Update cart</button></div>'; $output[] = '</form>';
De reinut este c n ciuda faptului c formularul folosete metoda POST, action-ul include o variabil GET, action=update. Din nou, putem expanda codul pentru a procesa updatri.
case 'update': if ($cart) { $newcart = ''; foreach ($_POST as $key=>$value) { if (stristr($key,'qty')) { $id = str_replace('qty','',$key);
smaranda.belciug@inf.ucv.ro
$items = ($newcart != '') ? explode(',',$newcart) : explode(',',$cart); $newcart = ''; foreach ($items as $item) { if ($id != $item) { if ($newcart != '') { $newcart .= ','.$item; } else { $newcart = $item; } } } for ($i=1;$i<=$value;$i++) { if ($newcart != '') { $newcart .= ','.$id; } else { $newcart = $id; } } } } } $cart = $newcart; break;
Interogm coninutului array-ului $_POST (care conine cantitile) i extragem perechile de id-uri i valori. Pentru fiecare produs tergem apoi toate instanele existente i rescriem noua cantitate. Mai jos este funcia final pentru afiarea produselor din co.
function showCart() { $cart = $_SESSION['cart']; if ($cart) { $items = explode(',',$cart); $contents = array(); foreach ($items as $item) { $contents[$item] = (isset($contents[$item])) ? $contents[$item] + 1 : 1; } $output[] = '<form action="cart.php?action=update" method="post" id="cart">'; $output[] = '<table>'; foreach ($contents as $id=>$qty) { $sql = 'SELECT * FROM books WHERE id = '.$id; $result = $db->query($sql); $row = $result->fetch(); extract($row); $output[] = '<tr>'; $output[] = '<td><a href="cart.php?action=delete&id='.$id.'" class="r">Remove</a></td>'; $output[] = '<td>'.$title.' by '.$author.'</td>'; $output[] = '<td>£'.$price.'</td>'; $output[] = '<td><input type="text" name="qty'.$id.'" value="'.$qty.'" size="3" maxlength="3" /></td>';
smaranda.belciug@inf.ucv.ro
$output[] = '<td>£'.($price * $qty).'</td>'; $total += $price * $qty; $output[] = '</tr>'; } $output[] = '</table>'; $output[] = '<p>Grand total: £'.$total.'</p>'; $output[] = '<div><button type="submit">Update cart</button></div>'; $output[] = '</form>'; } else { $output[] = '<p>You shopping cart is empty.</p>'; } return join('',$output); }