Jednoduchý internetový obchod v PHP 4.

21. ledna 2002

Tentokrát se dozvíte, jak napsat skript php, který objednané položky vloží do košíku, provede potřebný cenový výpočet a navíc zamezí vkládání neplatných objednávek.

Naplněný košík

Vložení objednaných položek do nákupního košíku řeší skript nazvaný select_kosik.php ve spolupráci s tabulkami „vyrobky“ a „kosiky“ databáze pracovně nazvané „obchod“ (viz díl první – tabulka „vyrobky“ a díl třetí – skript „select_kosik.php“). Tabulka „kosiky“ pro vás bude nová. Funkcí této tabulky je držet záznamy o zboží vloženém do košíku po určitou definovanou dobu, pokud se zákazník nerozhodne zboží z košíku a tím i z této tabulky odstranit dříve.

Nahlédnutí do košíku

Tabulka „kosiky“obsahuje sedm polí. První pole „id_vyrobek“ definuje každou položku sortimentu, další dvě pole se jmény „nazev“ a „kat_cislo“ jsou převzaty přímo z tabulky „vyrobky“. Pole „mnozstvi“ udává pro každý záznam tabulky (tj. položku vloženou do košíku) objednaný počet a pole „cena“ odpovídající cenu. Pole „id_host“ v sobě obsahuje systémovou proměnnou PHP „$PHPSESSID“ jednoznačně definující každého návštěvníka obchodu. Tuto proměnnou návštěvníkovi přidělil skript select.php (viz třetí díl). A konečně pole „cas“ s užitečným formátem „TIMESTAMP“ udává přesný čas vložení daného záznamu do tabulky (a tím i do košíku). Tabulka obsahuje dvoupoložkový klíč složený z polí „id_vyrobek“ a „id_host“. K tomuto klíči se ještě vrátím. Skript select_kosik.php potřebuje mít ke své práci vygenerované tyto proměnné: $PHPSESSID (viz třetí díl), $skupina a $klic (definují výběrová kritéria návštěvníka – (viz druhý a třetí díl), $ident (jednoznačně definuje položku sortimentu podle pole „id_vyrobek“ z tabulky „vyrobky“ – viz předchozí díly) a $kolik (udávající hodnotu textového pole formuláře, do které zákazník zadá počet objednávané položky). Všechny tyto proměnné jsou vygenerovány skriptem select.php (viz třetí díl).

Inicializace proměnných

Skripty select_kosik.php a select.php jsou si velmi podobné. Opět si tedy nadefinujte jednotlivé kategorie sortimentu obchodu a odkazy na ně i formulář umožňující vyhledat položku podle klíčového slova (tuto problematiku řeší podrobně druhý díl). Poté se pomocí cyklu do-while připojte k databázi MySQL „obchod“. Následuje inicializace proměnných $ident a $kolik (předpokládejte, že proměnné $skupina a $klic jsou již inicializované).

if (!IsSet($ident)) $ident=““;
if (!IsSet($kolik)) $kolik=““;

Tyto proměnné jsou vygenerovány skriptem select.php, respektive elementy typu text a hidden jeho formulářů s atributem action = „select_kosik.php“. Počet formulářů skriptu select.php je proměnlivý – vždy se rovná počtu vygenerovaných záznamů z tabulky „vyrobky“ databáze mySQL, tj. počtu položek, které odpovídají zadanému kritériu návštěvníka. Tyto položky jsou zobrazeny do normální tabulky v kódu html – každému řádku tabulky odpovídá jeden formulář (=jedna položka) a tím i jedna proměnná $ident, resp. proměnná $kolik (k problematice vygenerování tabulky viz třetí díl). Zákazník tak klepnutím na ikonu košíčku u požadované položky (řádku tabulky) předá skriptu select_kosik.php právě jednu dvojici proměnných $kolik a $ident. Skript select_kosik.php pak pozná, kolik kusů ($kolik) dané položky ($ident) chce zákazník do košíku vložit.

Zjištění zbývajících údajů o objednané položce

$polozka=MySQL_Query(„SELECT nazev, kat_cislo, cena FROM vyrobky WHERE id_vyrobek=$ident“);
if(!$polozka):
Došlo k poruše v komunikaci s databází!;
break;
endif;
while ($zaznam = MySQL_Fetch_Array($polozka)):
$nazev=$zaznam[nazev];
$katalog=$zaznam[kat_cislo];
$jedn_cena=$zaznam[cena];
endwhile;

Abyste mohli vložit objednanou položku do tabulky „kosiky“, musíte kromě proměnných $PHPSESSID, $ident a $kolik znát i její název, cenu a katalogové číslo (tato hodnota samozřejmě není povinná, ale předpokládám, že každý vlastník obchodu má své zboží pro vnitřní potřebu označené i číselnými nebo textovými kódy). Všechny tyto údaje zjistí dotaz MySQL na tabulku „vyrobky“ obsažený v proměnné $polozka. Ptáte se na jediný záznam tabulky, jehož klíčové pole „id_vyrobek“ odpovídá proměnné $ident. Získáte potřebné proměnné: $nazev odpovídá údaji z pole „nazev“ daného záznamu (a udává tedy jméno objednané položky), $katalog odpovídá údaji z pole „kat_cislo“ daného záznamu (určuje kód objednané položky) a $jedn_cena odpovídá údaji z pole „cena“ daného záznamu (a určuje cenu objednané položky – pozor, tato cena je jednotková, tj. odpovídá ceně za jednu položku).

Určení ceny pro daný počet kusů

$celk_cena=$jedn_cena*$Kolik;

Tímto jediným řádkem kódu zajistíte přepočet jednotkové ceny (proměnná $jedn_cena) položky na cenu, která odpovídá zadanému počtu objednaných kusů položky (proměnná $kolik). Výsledná cena se tedy bude rovnat součinu těchto dvou proměnných (proměnná $celk_cena).

Vymazání košíku

$smazat_cas=MySQL_Query(„DELETE FROM kosiky WHERE cas<DATE_SUB(NOW(), Interval 5 Hour)“);
$vysledek=MySQL_Query(„INSERT INTO kosiky (id_vyrobek, nazev, kat_cislo, mnozstvi, cena, id_host) VALUES ($ident, ‚$nazev‘,’$katalog‘, $kolik, $celk_cena, ‚$PHPSESSID‘)“);

Příkazem MySQL obsaženém v proměnné $smazat_cas smažete z tabulky „kosiky“ všechny staré záznamy. Ulehčí se tím databázi. Lhůtu pro mazání záznamů určuji atributem INTERVAL (je možné použít i např. dny nebo měsíce – DAY, MONTH). Jak jsem se již zmínil výše, pole „cas“ tabulky je datového formátu „TIMESTAMP“ – tento formát zaručí při vložení záznamu nebo při jakékoli změně automatické vložení příslušného času s přesností na vteřinu. Pokud je tedy záznam v tabulce beze změny po dobu delší než 5 hodin (v tomto případě), stává se kandidátem na odstranění. Při následné aktivaci skriptu select_kosik.php (tj. při pokusu vložit do košíku položku, nezávisle na proměnné $PHPSESSID) je tento záznam vymazán. Příkaz MySQL obsažený v proměnné $vysledek zaručí vložení záznamu (tedy objednané položky) se všemi požadovanými informacemi do tabulky „kosiky“. Skriptu kosik.php (zobrazení košíku a spočítání celkové ceny) se budu věnovat v příštím díle.

Vyloučení chybných objednávek

$kontrola=MySQL_Query(„SELECT cena FROM kosiky WHERE id_vyrobek=$ident and id_host=’$PHPSESSID'“);
$kontrola_a=MySQL_Fetch_Array($kontrola);
if ($kontrola_a[cena]= =0):
$delete=MySQL_Query(„DELETE FROM kosiky WHERE id_vyrobek=$ident and id_host=’$PHPSESSID'“);
endif;
//*od tohoto místa je skript select_kosik.php shodný se skriptem select.php*/
$vytvor = MySQL_Query(„CREATE TEMPORARY TABLE vkosiku SELECT * FROM vyrobky“);
if(!$vytvor):
echo „Došlo k poruše v komunikaci s databází!\n“;
……

Za chybné objednávky považuji objevení se téže položky více, než jednou v nákupním košíku jednoho zákazníka a nulový počet objednaných kusů u jakékoli položky. Tabulka „kosiky“ obsahuje vícepoložkový klíč složený z polí id_vyrobek a id_host. Do prvního pole se, jak jsem již uvedl, vkládá proměnná $ident jednoznačně určující položku a do druhého pole proměnná $PHPSESSID jednoznačně určující zákazníka. Složený klíč zabrání duplicitě záznamů se stejnými hodnotami těchto dvou polí. Zákazník tedy nemůže k objednané položce přidat tutéž položku ještě jednou. Skript select_kosik.php obsahuje i trik s tzv. temporary table, která při generování tabulky html, obsahující vybrané položky, umožní vytřídění položek vložených do košíku (viz třetí díl).

Nulový počet u objednané položky by nastal, kdyby zákazník například uvedl do textového pole formuláře jako objednávaný počet kusů číslo nula. Proto ještě před vytříděním záznamů pomocí „temporary table“ použijte v proměnné $kontrola dotaz MySQL na cenu přidávané položky. Je-li hodnota pole cena u této položky rovna nule, vymažte tuto položku z košíku (viz proměnná $delete).

To je vše ke skriptu select_kosik.php. Jistě by nebyl problém spojit skripty select.php a select_kosik.php v jeden. Rozdělení jsem použil pro lepší názornost.

V příštím díle bych se chtěl věnovat problematice zobrazování košíku s objednanými položkami a další manipulaci s těmito položkami.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Tom

    Čvc 4, 2009 v 19:29

    je mozne to cele nekde tahnout?

    Odpovědět

Napsat komentář: Tom Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *