Jednoduchý internetový obchod v PHP 5.

20. března 2002

Ukáži vám, jak ve vytvářeném obchodě pracovat s položkami vloženými zákazníkem do nákupního košíku.

Položky nákupního košíku a jejich editace

Vložení objednávaných položek do nákupního košíku řeší předchozí, čtvrtý díl seriálu. Předpokládám tedy, že zákazník si již něco vybral a nyní se chce podívat do svého košíku. Úkolem skriptu kosik.php, kterému se v tomto dílu budu věnovat, je zobrazit jméno a popis již vložených položek, jejich objednaný počet a odpovídající cenu. Skript samozřejmě spočítá i s celkovou cenou všech objednávaných položek. Rozhodne-li se zákazník některou položku z nákupního košíku odstranit, případně změnit objednávaný počet kusů, učiní to jednoduchým klepnutím na příslušné tlačítko. Je-li košík zákazníka prázdný, zobrazí se odpovídající oznámení. Kvůli větší přehlednosti jsem skript kosik.php rozdělil a část umožňující zákazníkovi změnit počet objednávaných kusů položky jsem umístil do samostatného skriptu zmenit.php.

Vysvětlení činnosti skriptu kosik.php

Jádrem skriptu je dotaz na tabulku „kosiky“ databáze mySQL. Tuto tabulku jsem podrobně popsal v předchozím díle svého seriálu, proto jen stručně. Tabulka obsahuje pole identifikující a popisující položku vloženou do košíku, čas tohoto vložení, množství objednaných kusů a kód zákazníka (pomocí proměnné $PHPSESSID, viz třetí díl seriálu), který položku do košíku vložil. Výsledné záznamy z tabulky „kosiky“ odfiltrované na konkrétního zákazníka se zobrazí do tabulky (tedy košíku) v kódu HTML tak, aby zákazník získal přehled o všech položkách vložených do „svého košíku“. Každou položku tohoto košíku je možné identifikovat pomocí elementu hidden dvou různých formulářů. První formulář odešle po stisknutí příslušného tlačítka skriptu kosik.php identifikaci položky určené zákazníkem k odstranění z košíku. Na začátku tohoto skriptu je příslušný příkaz na tabulku kosiky, který identifikovanou položku odstraní. Je-li aktivován druhý formulář, odešle se skriptu zmenit.php identifikace položky, u které si zákazník přeje změnit objednávané množství.

Skript zmenit.php

Skript je velice podobný předchozímu, jediný rozdíl je v zobrazení položky identifikované jako ta, kde si zákazník přeje změnit počet objednávaných kusů. Aktivuje se nový formulář s textovým polem, ve kterém zákazník může změnit údaj o počtu objednávaných kusů pro danou položku. Po potvrzení této volby předá formulář údaj zpět skriptu kosik.php, který provede aktualizaci tabulky kosiky a zajistí výpis položky s novým počtem objednaných kusů a samozřejmě i s přepočítanou cenou, včetně ceny celkové.

Výpis položek nákupního košíku

Pomocí cyklu do-while (viz druhý dil) se připojím k databázi mySQL pracovně nazvané obchod, ve které se nalézá i tabulka kosiky. Do proměnné $vypis uložíte dotaz na tuto tabulku, kterým zjistíte všechny potřebné údaje o položkách objednaných daným zákazníkem (identifikovaným pomocí proměnné $PHPSESSID). Do proměnné $soucet uložíte dotaz na tabulku zjišťující součet cen objednávaných položek. Hodnotu tohoto součtu v sobě obsahuje prvek soucet pole $soucet_vypis, které vzniklo použitím funkce Mysql_fetch_array( ). Je-li jeho hodnota rovná nule, vypíše se upozornění oznamující zákazníkovi, že je jeho košík prázdný.

$vypis = Mysql_query(„SELECT id_vyrobek, nazev, mnozstvi, cena FROM kosiky WHERE id_host=’$PHPSESSID'“);
if(!$vypis):
Došlo k poruše v komunikaci s databází.
break;
endif;
$soucet= Mysql_query(„SELECT SUM(cena) AS soucet FROM kosiky WHERE id_host =’$PHPSESSID'“);
$soucet_vypis=Mysql_fetch_array($soucet);
if ($soucet_vypis[soucet] = = 0):
echo „<div align=\“center\“><b><font color=\“red\“>Váš nákupní košík je prázdný!</font></b></div>“;
break;
endif;

Nadefinujete tabulku v kódu HTML, do které budete zákazníkovi vypisovat údaje o objednávaných položkách. Zajímat ho bude jméno objednávané položky, počet objednávaných kusů a cena za tento počet (výpočet ceny podle objednaných kusů dané položky je řešen v předchozím díle). Záhlaví tabulky může potom vypadat např. takto:

echo „<table align=\“center\“ border=\“0\“ width=\“500\“ bgcolor=\“red\“ cellpadding=\“0\“ cellspacing=\“0\“><tr><td>\n“;
echo „<table align=\“center\“ border=\“0\“ cellspacing=\“0\“ cellpadding=\“2\“ width=\“100%\“ bgcolor=\“red\“>\n“;
echo „<tr align=\“left\“>\n“;
echo „<td width=\“350\“><font color=\“white\“ ><b>Položka</b></font></td>\n“;
echo „<td align=\“center\“><font color=\“white\“><b>Počet</b></font></td>\n“;
echo „<td align=\“center\“><font color=\“white\“><b>Cena</b></font></td>\n“;
echo „<td>&nbsp;</td>“;
echo „<td>&nbsp;</td></tr>“;

Pomocí cyklu while a funkce Mysql_fetch_array vypíšete údaje o jednotlivých položkách do přehledné tabulky, resp. košíku. Každé položce přiřadíte dva formuláře. První s názvem Zmenit předá po klepnutí na tlačítko Změnit skriptu zmenit.php proměnnou $ID (jméno elementu hidden formuláře) obsahující jednoznačnou identifikaci položky (pomocí hodnoty pole id_vyrobek tabulky kosiky, kterou vyjadřuje proměnná $zaznam[id_vyrobek]). Druhý formulář s názvem Smazat předá obdobným způsobem proměnnou $ID aktuálnímu skriptu kosik.php. Tento formulář je vhodné ošetřit JavaScriptem, který se po klepnutí na tlačítko Smazat zeptá zákazníka, zda chce skutečně odstranit položku ze svého košíku.

while ($zaznam = Mysql_fetch_array($vypis)):
echo „<tr bgcolor=\“#FFCCCC\“><td><font size=\“-1\“>“.$zaznam[nazev].“</font></td>“;
echo „<td align=\“center\“><font size=\“-1\“>“.$zaznam[mnozstvi].“</font></td>“;
echo „<td align=\“center\“><font size=\“-1\“>“.$zaznam[cena].“,-</font></td>“;
echo „<form name=\“Zmenit\“ action=\“zmenit.php\“ method=\“post\“>“;
echo „<input type=\“hidden\“ name=\“ID\“ value=\“$zaznam[id_vyrobek]\“>“;
echo „<td><input type=\“submit\“ value=\“Změnit\“></td>“;
echo „</form>“;
echo „<form name=\“Smazat\“ action=\“kosik.php\“ method=\“post\“>“;
echo „<input type=\“hidden\“ name=\“ID\“ value=\“$zaznam[id_vyrobek]\“>“;
echo „<td><input type=\“submit\“ value=\“Smazat\“ ></td>“;
echo „</form>“;
endif;
endwhile;

Do spodního řádku tabulky umístěte údaj o celkové ceně za všechny objednané položky ($soucet_vypis[soucet]) a formulář, který po stisknutí tlačítka objednat nasměruje zákazníka na stránku objednat.php, kde vyplní kontaktní údaje a potvrdí objednávku. Poté ukončete připojení k databázi.

echo „<form name=\“Objednat\“ action=\“objednat.php\“ method=\“post\“>“;
echo „<tr valign=\“bottom\“><td bgcolor=\“red\“ align=\“left\“><font color=\“white\“><b>Cena celkem vč. DPH: „.$soucet_vypis[soucet].“ Kč </b></font></td>“;
echo „<td bgcolor=\“#FFFFCC\“ align=\“center\“ colspan=\“4\“><input type=\“submit\“ value=\“objednat\“></td></tr>“;
echo „</table>\n“;
echo „</table>\n“;
echo „</form>\n“;

Změna počtu kusů u objednávané položky

Aby mohl zákazník změnit počet kusů u dané položky košíku, musí klepnout na tlačítko Změnit. Aktivuje tím formulář Zmenit, který skriptu zmenit.php předá proměnnou $ID jednoznačně identifikující položku, u které si zákazník přeje změnit počet kusů. Skript zmenit.php je velice podobný dosud popsanému skriptu kosik.php. Jediný rozdíl je v cyklu while, kterým do košíku načítáte jednotlivé položky zákazníka (viz ukázka kódu níže vyznačená tučným písmem). Každá položka je podrobena testu, zda její identifikátor (tedy příslušná hodnota pole id_vyrobek tabulky kosiky, kterou v cyklu vyjadřuje proměnná $zaznam[id_vyrobek]) odpovídá proměnné $ID. Pokud ano, skript pozná, že jde o položku, u které chce zákazník změnit počet objednávaných kusů. Vypíše pak textové pole nového formuláře nazvaného Zpet obsahujícího aktuální počet objednávaných kusů (value = \“$zaznam[mnozstvi]\“). Zákazník v něm napíše novou hodnotu pro objednávaný počet kusů. Opět je vhodné tento formulář ošetřit JavaScriptem, který např. zákazníkovi nedovolí do textového pole zadat jinou hodnotu, než celé kladné číslo. Stisknutím tlačítka OK potvrdí zákazník svou volbu a skriptu kosik.php pošle zpět proměnnou $kolik (jméno textového elementu formuláře) nesoucí informaci o novém počtu objednávaných kusů položky a proměnnou $ID (jméno elementu hidden formuláře) tuto položku jednoznačně identifikující.

while ($zaznam = Mysql_fetch_array($vypis)):
echo „<tr bgcolor=\“#FFCCCC\“><td><font size=\“-1\“>“.$zaznam[nazev].“</font></td>“;
echo „<td align=\“center\“><font size=\“-1\“>“.$zaznam[mnozstvi].“</font></td>“;
echo „<td align=\“center\“><font size=\“-1\“>“.$zaznam[cena].“,-</font></td>“;
if ($zaznam[id_vyrobek] == $ID):
echo „<form name=\“Zpet\“ action=\“kosik.php\“ method=\“post\“>“;
echo „<input type=\“hidden\“ name=\“ID\“ value=\“$zaznam[id_vyrobek]\“>“;
echo „<td><input type=\“text\“ name=\“kolik\“ size=\“3\“ value=\“$zaznam[mnozstvi]\“></td>“;
echo „<td><input type=\“submit\“ value=\“OK\“></td>“;
echo „</form>“;
else:

echo „<form name=\“Zmenit\“ action=\“zmenit.php\“ method=\“post\“>“;
echo „<input type=\“hidden\“ name=\“ID\“ value=\“$zaznam[id_vyrobek]\“>“;
echo „<td><input type=\“submit\“ value=\“Změnit\“></td>“;
echo „</form>“;
echo „<form name=\“Smazat\“ action=\“kosik.php\“ method=\“post\“>“;
echo „<input type=\“hidden\“ name=\“ID\“ value=\“$zaznam[id_vyrobek]\“>“;
echo „<td><input type=\“submit\“ value=\“Smazat\“ ></td>“;
echo „</form>“;
endif;
endwhile;

Změny v tabulce kosiky

Na počátku skriptu kosik.php inicializujte proměnné $ID a $kolik.

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

Nyní můžete skript rozdělit do dvou větví. Pokud se proměnná $ID nerovná prázdnému řetězci, je jasné, že jí musel nějakou hodnotu udělit zákazník klepnutím na tlačítko Smazat formuláře Smazat nebo OK formuláře Zpet ve skriptu zmenit.php. Je-li současně proměnná $kolik rovna prázdnému řetězci, můžete vyloučit klepnutí na tlačítko OK. Zákazník si tedy přeje položku identifikovanou proměnnou $ID z košíku odstranit. Skript provede příslušný příkaz DELETE pro záznam tabulky kosiky odpovídající proměnné $ID (viz proměnná $vysledek1 v ukázce kódu níže). Protože se může klidně stát, že v tabulce kosiky bude mít více zákazníků uloženou tutéž položku, musíte příkaz DELETE pomocí proměnné $PHPSESSID omezit pouze na daného zákazníka. V opačném případě by rozhodnutím tohoto zákazníka byla položka z tabulky vymazána úplně a zmizela by tak i z košíků ostatních zákazníků. Obdobně, je-li proměnná $ID různá od prázdného řetězce a totéž platí i pro proměnnou $kolik, je jasné, že zákazník klepnul na tlačítko OK ve skriptu zmenit.php a chce tedy u takto identifikované položky změnit počet objednávaných kusů. Provedete tedy příkaz UPDATE a poli mnozstvi příslušného záznamu tabulky kosiky předáte hodnotu definovanou v proměnné $kolik (viz proměnná $vysledek2).

if (($ID != „“) && ($kolik = = „“)):
$vysledek1 = Mysql_query(„DELETE FROM kosiky WHERE id_vyrobek = $ID AND id_host = ‚$PHPSESSID'“);
elseif (($ID != „“) && ($kolik != „“)):
$vysledek2 = Mysql_query(„UPDATE kosiky SET mnozstvi = $kolik WHERE id_vyrobek = $ID AND id_host = ‚$PHPSESSID'“);

Nyní zbývá u dané položky znovu přepočítat cenu tak, aby odpovídala aktuálnímu počtu objednávaných kusů (stále pokračujete ve větvi elseif (($ID != „“) && ($kolik != „“))). Nejdříve si z tabulky vyrobky zjistěte pro danou položku jednotkovou cenu (viz proměnná $vyrobky_cena, resp. $jedn_cena) a z ní odvodíte celkovou cenu pro objednávaný počet kusů (viz proměnná $celkova_cena). Tuto celkovou cenu promítnete do košíku zákazníka (viz proměnná $update). Pro jistotu ještě zkontrolujte, zda se cena položky v košíku nerovná nule (datový typ pole cena tabulky kosiky je SMALLINT UNSIGNED; při pokusu zadat jinou hodnotu, než kladné celé číslo, se do tohoto pole uloží nula). Pokud se nule rovná, položku z košíku odstraníte (viz proměnná $smazat).

$vyrobky_cena = Mysql_query(„SELECT cena FROM vyrobky WHERE id_vyrobek = $ID“);
while ($zaznam = Mysql_fetch_array($vyrobky_cena)):
$jedn_cena = $zaznam[cena];
$celk_cena = $jedn_cena * $kolik;
endwhile;
$update = Mysql_query(„UPDATE kosiky SET cena=$celk_cena WHERE id_vyrobek = $ID AND id_host = ‚$PHPSESSID'“);
$smazat = Mysql_query(„DELETE FROM Kosiky WHERE id_vyrobek = $ID AND id_host = ‚$PHPSESSID‘ AND cena = 0“);
endif;

Správné logické pořadí příkazů skriptu kosik.php

Až nyní jsem se dostal opět k té části skriptu kosik.php, kterou jsem článek začal – tj. k výběru příslušných záznamů zákazníka z tabulky kosiky (viz proměnná $vypis) a jejich zobrazení do košíku. Aby skript fungoval logicky správně, je nutno toto pořadí zachovat – nejdříve se tedy musí provést příslušné změny v tabulce kosiky a až potom se výsledné záznamy mohou vypsat do zákazníkova košíku.

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ší

Napsat komentář

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