Jednoduchý internetový obchod v PHP 3.

27. prosince 2001

Tentokrát vám objasním práci s vybranými záznamy z databáze – jak je zobrazit v přehledné tabulce a umožnit zákazníkovi přidat libovolnou položku do nákupního košíku. Jde o poměrně náročnou tématiku, která předpokládá zvládnutí obou předchozích dílů.

Vložení libovolného zboží ze všech záznamů databáze vybraných zákazníkem podle jím určeného kritéria do nákupního košíku vyřešíte pomocí dvou skriptů php a tří tabulek v databázi MySQL. Proto nejdříve objasním jednotlivé skripty a tabulky databáze.

Nákupní tabulka

Skript nazvaný select.php již znáte z druhého dílu. Jeho prvním úkolem je tedy umožnit zákazníkovi výběr konkrétního zboží z databáze celého sortimentu, ať již podle skupiny zboží nebo podle klíčového slova (dále výběrová kritéria). Novým úkolem tohoto skriptu bude zobrazení vybraných záznamů s ikonou košíku do tabulky, což zákaznikovi umožní přidat libovolný počet zboží do nákupního košíku. Současně bude splněna podmínka, že již jednou objednané zboží se přehledně označí a nebude ho možné do nákupního košíku objednat podruhé. Druhý skript jsem nazval select_kosik.php a budu se mu podrobně věnovat v příštím díle. Tento skript přidá do nákupního košíku požadovaný počet zboží, spočítá cenu za zboží podle počtu objednaných kusů a vyčistí košík od starých, respektive chybně zadaných údajů.

Tabulka MySQL databáze „obchod“ nazvaná „vyrobky“ (viz první díl) svým klíčovým polem „id_vyrobek“ jednoznačně definuje každý záznam (tj. položku zboží). Pole „nazev“ je jméno a stručný popis výrobku, který se objeví v tabulce vybraných záznamů vygenerované skriptem select.php a numerické pole „cena“ určuje cenu zboží v Kč. Tabulka „kriteria“ je nová. Můžete si ji vytvořit podle návodu na tvorbu tabulky v MySQL pomocí skriptu php uvedeného v prvním dílu seriálu. Tabulka musí obsahovat klíčové pole „id_host“, do kterého se bude zapisovat systémová proměnná $PHPSESSID, což je řetězec jednoznačně definující každého návštěvníka stránky (pozor na dostatečnou délku pole, aby nedošlo k „odseknutí“ konce řetězce proměnné – já jsem použil textové pole pro 40 znaků). Další dvě textová pole jsou nazvána „skupina“, respektive „klic“. Do těchto polí se vždy zapíší aktuální výběrová kritéria návštěvníka. Poslední pole inicializuje čas vložení příslušného záznamu. Jmenuje se „cas“ a jeho datový typ je timestamp(14). Tabulka „kosik“ obsahuje záznamy o zboží vloženém do nákupního košíku, včetně jednoznačné definice zboží převzaté z tabulky „vyrobky“ (pole „id_vyrobek“). Obsahuje i důležité pole nazvané opět „id_host“, do kterého se ukládá zmíněná proměnná $PHPSESSID definující každého návštěvníka obchodu.

Skript select.php tedy inicializuje proměnnou $PHPSESSID a předává své informace (výběrová kritéria návštěvníka, druh a počet objednaného zboží) skriptu select_kosik.php. Současně zapíše aktuální výběrová kritéria návštěvníka do tabulky „kriteria“. Kromě toho, že dává, skript select.php si i bere: údaje z tabulky „vyrobky“ nutné pro správný výběr zboží podle výběrových kritérií návštěvníka a údaje z tabulky „kosiky“ nutné pro vytřídění zboží, které je již v košíku.

Nyní tedy konečně ke skriptu select.php.

<?
session_start();
Header(„Cache-control: no-cache“);
?>

Na počátku skriptu definuji relaci (session) jednoznačně určující každého návštěvníka obchodu pomocí proměnné $PHPSESSID a hlavičku zabraňující načítání stránky do vyrovnávací paměti prohlížeče. Pozor! Tyto dva řádky musí být úplně na začátku kódu, ještě před tagem <html>.

$vytvor = MySQL_Query(„CREATE TEMPORARY TABLE vkosiku SELECT * FROM vyrobky“);
if(!$vytvor):
echo „Došlo k poruše v komunikaci s databází!\n“;
break;
endif;

Po definici jednotlivých kategorií sortimentu obchodu a formuláře pro odeslání klíčového slova se pomocí cyklu do-while připojte k  databázi MySQL „obchod“ (viz druhý díl). Proměnná $vytvor vytvoří dočasnou tabulku, tj. tabulku, která existuje pouze v daném session (spojení) pro daného uživatele a sama zanikne po odpojení tohoto uživatele od databáze. Tabulka „vkosiku“ je v této chvíli shodná s naší známou tabulkou „vyrobky“.

$vlozeno = MySQL_Query(„SELECT id_vyrobek from kosik where id_host =’$PHPSESSID'“);
while ($vkosiku_vypis = MySQL_Fetch_Array($vlozeno)):
$vytridit = MySQL_Query(„UPDATE vkosiku SET Cena = 0 WHERE id_vyrobek = $vkosiku_vypis[id_vyrobek]“);
endwhile;

Proměnná $vlozeno identifikuje podle hodnoty pole „id_vyrobek“ tabulky "kosik" všechny položky vložené daným zákazníkem (stále definovaného podle proměnné $PHPSESSID) do nákupního košíku. Proměnná $vytridit obsažená v cyklu while porovnává tyto hodnoty s polem „id_vyrobek“ tabulky „vkosiku“, tj. se všemi položkami nabídky. Je-li některá položka v košíku, je splněna podmínka id_vyrobek = $vkosiku_vypis[id_vyrobek] a u této položky dojde k vynulování pole „cena“.

$smazat = MySQL_Query(„DELETE from kriteria where cas<DATE_SUB(NOW(), INTERVAL 5 HOUR)“);
$host = MySql_Query(„INSERT into kriteria (id_host) values (‚$PHPSESSID‘)“);
$vlozit = MySQL_Query(„UPDATE kriteria SET skupina=’$skupina‘, klic=’$klic‘ where id_host=’$PHPSESSID'“);
if(!$vlozit):
echo „Došlo k poruše v komunikaci s databází!\n“;
break;
endif;

Těmito příkazy předám tabulce „kriteria“ aktuální výběrová kritéria použitá návštěvníkem obchodu k vyhledání zboží. Proměnná $smazat vymaže z této tabulky všechny údaje starší než 5 hodin. Tento příkaz jsem použil, aby nedocházelo k zaplňování tabulky starými údaji. Proměnná $host identifikuje návštěvníka. Proměnná $vlozit obstará samotné vložení výběrových kritérií do tabulky (pokud vám proměnná $skupina, resp. $klic nic neříkají, odkazuji vás opět na druhý díl).

Výběr zboží z databáze

Nyní následují příkazy obstarávající výběr zboží z databáze podle aktuálních výběrových kritérií. Výstupem je proměnná $vysledek (tuto problematiku podrobně řeší druhý díl). Pozor však na jednu věc! Ve druhém díle jsem se nezmiňoval o dočasné tabulce „vkosiku“ a zboží jsem vybíral z původní tabulky „vyrobky“. Příslušnou část skriptu je tedy nutno opravit – zboží nyní vybíráte z dočasné tabulky „vkosiku“. Na skript navážu s předpokladem, že zákazník použil výběrová kritéria s pozitivním výsledkem, tj. výsledný počet záznamů je větší než nula a požadované zboží bylo nalezeno.

echo „Vašemu zadání odpovídá <b><font color=red>“.MySQL_Num_Rows($vysledek).“</font></b> záznamů.“;

Vypíše počet záznamů (položek zboží), který odpovídá výběrovému kritériu. Blíže k proměnné $vysledek ve druhém díle.

Návrh záhlaví tabulky

echo „<table border=’0′ align=’center‘ cellspacing=’0′ cellpadding=’4′ width=’95%‘ bgcolor=’#000000′>\n“
echo „<tr align=’left‘>\n“;
echo „<td>&nbsp;</td>“;
echo „<td><font color=’#FFFFFF‘><b>Název a popis zboží</b></font></td>\n“;
echo „<td><font color=’#FFFFFF‘><b>Cena</b></font></td>\n“;
echo „<td align=’center‘><font color=’#FFFFFF‘><b>Počet</b></font></td>\n“;
echo „<td align=’center‘>&nbsp;</td></tr>\n“;

Je zcela na vaší fantazii, jak si tabulku uspořádáte. Jen jedna malá rada. Snažte se co nejméně „kouskovat“ kód php. Tabulku byste mohli samozřejmě napsat v normálním html kódu, museli byste však nejdříve ukončit skript php (znaky ?>). Po výpisu html kódu by bylo nutné pro další práci s databází se opět do php skriptu znaky <? vrátit. Pro server je však lepší, když může ve skriptu php „vyplivnout“ celou stránku, bez zbytečného přepínání mezi html a php.

Vzhled tabulky

$y = 1;
while ($zaznam = MySQL_Fetch_Array($vysledek)):
if ($y%2 = = 0)
echo „<tr bgcolor = white>“;
else
echo „<tr bgcolor = ‚#CCCCCC‘>“;
$y+ +;

Cyklus while umožní načíst záznamy tabulky „vkosiku“ vybrané dotazem MySQL v proměnné $vysledek, které jsou uloženy v nové proměnné $zaznam jako asociativní pole (viz první díl). Následující podmínkou v kombinaci s čítačem y zajistíte střídání barev pozadí řádků pro jednotlivé záznamy výběru. Každá jednotlivá položka zboží bude tedy zobrazena v řádku s jinou barvou – v tomto případě se budou střídat řádky bílé se světle šedými.

echo „<td align=’center‘><a href=“.$zaznam[info].“.htm target=’_blank‘ title=’fotografie zboží'“>
<tag pro vložení obrázku/ikonky></a></td>“;
echo „<form name=’vypis‘ action=’select_kosik.php‘ method=’post‘>“;
if ($zaznam[cena] = = ‚0‘):
echo „<td>“.$zaznam[nazev].“</td>“;
echo „<td colspan=3 align=right><b><font color=red>v košíku</font></b></td>“;
else:
echo „<td>“.$zaznam[nazev].“</td>“;
echo „<td>“.$zaznam[cena].“,-</td>“;
echo „<td align=center><input type=text name=kolik size=3></td>“;
echo „<input type=hidden name=ident value=$zaznam[id_vyrobek]>
<input type=hidden name=klic value=$klic>
<input type=hidden name=skupina value=$skupina>
echo „<td align=center><input type=image name=kosik src=’cesta k obrázku/ikonce‘ border=’0′ alt=’vložit do košíku‘></td></tr>“;
endif;
echo „</form>“;
endwhile;
echo „</table>\n“;

Pokračujte v generování tabulky pro vybrané položky zboží. Do prvního sloupce umístěte odkaz na stránku s fotografií a dalšími informacemi o daném zboží. Adresa stránky odpovídá hodnotě pole „info“ ($zaznam[info]) pro daný záznam (bez přípony *.htm). Stránka se otevře v novém okně po klepnutí na ikonu.

Dalším krokem vložíte do tabulky formulář, který umožní předat skriptu select_kosik.php proměnné $kolik, $ident, $skupina a $klic. V tomto formuláři se skript podle podmínky if rozvětví: odpovídá-li hodnota pole „cena“ tabulky „vkosiku“ číslu „0“ (viz proměnná $vytridit výše), znamená to, že tato položka je již objednána a nachází se v nákupním košíku. Skript tedy ve druhém sloupci tabulky vypíše název položky ($zaznam[nazev]) a ve třech zbývajících (spojených) sloupcích tabulky se objeví poznámka „v košíku“. Není-li podmínka splněna, opět se ve druhém sloupci tabulky vypíše název položky. Ve třetím sloupci se však objeví údaj o ceně výrobku ($zaznam[cena]) a ve čtvrtém textový element formuláře pro zadání počtu kusů položky k objednání. Po odeslání formuláře tak skript select_kosik.php získá v proměnné $kolik údaj o tom, kolik kusů objednané položky má vložit do nákupního košíku.

Následují tři elementy formuláře typu hidden, které skriptu select_kosik.php předají v proměnné $ident jednoznačný klíč k  identifikaci objednaného výrobku ($zaznam[id_vyrobek]), elementy formuláře klic a skupina umožní zachování aktuálních výběrových kritérií i pro skript select_kosik.php (tj. proměnné $klic a $skupina – viz druhý díl).

V posledním sloupci tabulky se nachází ikonka košíku k přidání položky do nákupního košíku (a tedy k odeslání formuláře). Po ukončení podmínky if, formuláře, tabulky a cyklu while ukončíte i cyklus do-while a odpojíte se od databáze. Skript select.php splnil svou práci.

V příštím díle se chci věnovat skriptu select_kosik.php, který vkládá objednané položky do košíku a provádí cenové výpočty. Dozvíte se také, jak zamezit vkládání neplatných objednávek do košíku (např. při zadání množství = 0) a jak z košíku odstraňovat staré záznamy a tím optimalizovat výkon celé databáze.

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 *