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". |
 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:
- Nawigację klienta po sklepie
- Przechowywanie danych o produktach
- Składowanie zamówień
- 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).
|