tworzenie aplikacji server-sideprojektowanie sklepów internetowychwykonywanie aplikacji internetowych

Strona główna Publikacje "Sklepy internetowe" Software 2.0 3/2002 część 1
Programowanie przy użyciu smarty + PHP i Postgresql lub MySQL

Strona główna
O mnie
Projekty
Publikacje
Linki


- Mój Anty blog

- Statystyki #php.pl

 


Sklepy internetowe
Autor: Adam Major

Wersja do druku
Artykul został pierwotnie opublikowany w magazynie Software 2.0 3/2002 - "Programowanie dla Internetu". Software 2.0
www.software.com.pl

część 1 | część 2 > | część 3 >


W dzisiejszych czasach handel elektroniczny niekiedy przynosi firmie dużo większe zyski niż tradycyjna sprzedaż towarów i usług. Jest przy tym znacznie tańszy (odpadają koszty wynajmu i utrzymania budynków oraz zatrudnienia sprzedawców, transport) i otwarty 24h na dobę przez 365 dni w roku. Dlatego wiele firm mimo recesji jaka ogarnęła naszą gospodarkę próbuje dotrzeć do klientów uruchamiając sklepy internetowe.
Zadaniem tego artykułu jest praktyczne przedstawienie najważniejszych problemów związanych z planowaniem i projektowaniem tego typu aplikacji przy wykorzystaniu PHP 4 i serwera baz danych MySQL.
      Najpierw musimy sobie postawić podstawowe pytanie czym tak naprawdę jest sklep internetowy i jakie powinien spełniać funkcje? Dobrze zaprojektowany sklep powinien przypominać w swoim działaniu placówkę handlową ze "świata realnego". Po wejściu klienta na stronę WWW aplikacja powinna kierować go w ten sposób aby mógł szybko znaleźć poszukiwany produkt lub grupę produktów, obejrzeć dostępne informacje o danym produkcie, a na końcu gdy będzie zdecydowany dokonać zakupu, pozwolić szybko, łatwo i bezpiecznie złożyć zamówienie.
Sklepy składają się więc z dwóch powiązanych ze sobą części: modułu klienckiego oraz panelu administracyjnego, za pomocą którego osoba zarządzająca może wpływać na asortyment sklepu oraz realizować zamówienia klientów.
      Głównymi problemami, które stoją przed programistą, który ma zrealizować sklep internetowy są: stworzenie łatwego w użyciu, szybkiego, przyjaznego w nawigacji i bezpiecznego modułu klienckiego oraz powiązanego z nim panelu administracyjnego, pozwalającego osobie nie obeznanej ze sztuką tworzenia stron WWW prowadzić sklep.
W artykule tym poruszam najważniejsze zagadnienia z którymi przyjdzie się zmierzyć osobie tworzącej sklep internetowy tj. zaprojektowanie struktury bazy danych, koszyka oraz struktury katalogów serwisu i pliku konfiguracyjnego. Zostały także poruszone problemy związane z bezpieczeństwem.

Struktura bazy danych

Projektowanie struktury bazy danych zaczniemy od zastanowienia się jakie dane musimy przechowywać i jak najkorzystniej je pogrupować, w taki sposób aby nie dublować ich (jeśli jest to tylko możliwe) w kilku tabelach.
Możemy wyodrębnić grupy danych odpowiedzialnych za:

  1. Nawigację klienta po sklepie
  2. Przechowywanie danych o produktach
  3. Składowanie zamówień
  4. Funkcje administracyjne

Nawigacja

W większości sklepów internetowych asortyment pogrupowany jest w działy tematyczne (np. komputery, samochody), które dzielą się dodatkowo na kategorie (np. procesory, karty graficzne, monitory). My przyjmiemy także takie rozwiązanie ponieważ jest ono najbardziej rozpowszechnione i dość naturalne dla potencjalnego klienta naszego sklepu. Projektowany system nawigacji będzie umożliwiał zakładanie do maksymalnie 255 działów, zawierających po max 255 kategorii. Tego typu ograniczenia (wygodne ze względów technicznych) praktycznie nie powinny przeszkadzać w niczym osobie prowadzącej sklep.
      System nawigacji w bazie danych będziemy przechowywać w dwóch tabelach: cat będzie składować dane o działach, subcat natomiast informacje o kategoriach w danym dziale. Oprócz identyfikatora działu i kategorii zapisujemy także czy dany dział/kategoria jest aktywny, czyli czy ma być widoczny dla klienta.

W tabeli cat przechowujemy identyfikator, pole informujące czy dany dział jest aktywny (widoczny) oraz nazwę działu. W identyfikatorze id_ct nie używamy własności auto_increment, ponieważ chcemy zapobiec powstawaniu "dziur" w numeracji, na skutek kasowania i tworzenia nowych działów. Niestety wtedy o poprawną numerację będziemy musieli zadbać sami. Za aktywne działy będziemy uznawać te, który w polu ct_akt mają wpisaną cyfrę 1. Zakładamy indeksy (key) dla wszystkich pól, które będą przeszukiwane w celu wyświetlenia klientowi w której pod kategorii asortymentu się znajduje.
      Pole pid_ct tabeli subcat przechowuje identyfikator działu do którego dana kategoria należy. Id_sc to identyfikator danej kategorii o jego poprawną numerację także musimy sami zadbać w naszej aplikacji.
      Najprościej można to zrealizować sprawdzając przed dodaniem nowego działu jaki maksymalny identyfikator ma pole id_ct lub id_sc (w przypadku kategorii), a następnie wstawienie nowego wiersza z identyfikatorem powiększonym o 1. Warto także sprawdzić przedtem czy wstawiany rekord będzie miał identyfikator mniejszy od 255.
W ten sposób nie ustrzeżemy się jednak powstawania luk w przypadku skasowania innego rekordu niż ostatniego.
 
CREATE TABLE cat
(
 id_ct        tinyint unsigned not null,
 ct_act       tinyint unsigned not null,
 name_ct      char (30),
 key          ct_act (ct_act),
 key          name_ct (name_ct(6)),
 primary key (id_ct)
);

CREATE TABLE subcat
(
 id_subcat    smallint unsigned not null
              auto_increment,
 sc_act       tinyint unsigned not null,
 pid_ct       tinyint unsigned not null,
 id_sc        tinyint unsigned not null,
 name_sc      char(30),
 key          sc_act (sc_act),
 key          pid_ct (pid_ct),
 key          id_sc (id_sc),
 key          name_sc (name_sc(6)),
 primary key (id_subcat)
);
Listing 1. Polecenia SQL tworzące tablice cat i subcat.
Aby ominąć ta niedogodność można wczytać do tablicy posortowane rosnąco id_ct wszystkich działów, następnie przejrzeć tablicę w pętli i znaleźć pierwszy wiersz o nie kolejnym identyfikatorze. Jest to dość czasochłonne działanie, jednak przy 255 rekordów możemy sobie na nie pozwolić.

Tworzenie drzewka kategorii

Obok przedstawiam listing skryptu pozwalającego wyświetlić klientowi drzewko działów z wyróżnionym wybranym działem oraz rozwiniętymi jego kategoriami. Po dodaniu grafiki i stylów CSS można uzyskać taki efekt jak pokazano na rysunku 1.

Rysunek 1. Przedstawienie działów i kategorii w postaci drzewka.
 
<?php

function pconnect_to_mysql()
{
 global $db, $conn;

 $conn = @mysql_pconnect($db[host], $db[user], $db[pass]);
 if (!@mysql_select_db($db[base], $conn))
    { $err_ln=__LINE__; include('db_error.php'); }
 return $conn;
}

function show_cat_tree()
{
  global $HTTP_GET_VARS;

  if ($HTTP_GET_VARS[d] <= 0 OR
    !is_numeric($HTTP_GET_VARS[d])) $HTTP_GET_VARS[d] = 1;
  $conn = pconnect_to_mysql();
  $sql = "select id_ct, name_ct from cat where ct_act=1 order
   by name_ct";
  if (!($res = @mysql_query($sql,$conn)))
     { $err_ln=__LINE__; include('db_error.php'); }
  if (mysql_num_rows($res) == 0)
     { echo 'Brak kategorii'; return 0; }

 while ($row = @mysql_fetch_row($res))
     {
      if ($row[0] == $HTTP_GET_VARS[d]) echo "- $row[1]<br>";
         else $other_cat[]= "+ $row[1]<br>";
     }
 // podkategorie
 $sql = "select id_sc, name_sc from subcat where
  pid_ct='$HTTP_GET_VARS[d]' and sc_act=1 order by name_sc";
 if (!($res = @mysql_query($sql,$conn)))
    { $err_ln=__LINE__; include('db_error.php'); }
 while ($row = @mysql_fetch_row($res))
   echo "   $row[1]<br>";

 $cnt_ot = count($other_cat);
 for ($x = 0; $x < $cnt_ot; $x++) echo $other_cat[$x];
}

?>
Listing 2. Tworzenie drzewka kategorii

część 1 | część 2 > | część 3 >

sklepy_lst.zip - Wszystkie listingi zawarte w artykule (4 KB).



planowanie, projektowanie, programowanie, wdra�anie projekt�w informatycznych
Copyright (c) 2002-06 by