V dalším díle svého seriálu o jednoduchém internetovém obchodě v PHP vám ukáži způsob, jak zákazníkům umožnit výběr zboží z databáze nabízeného sortimentu, buď zadáním klíčového slova nebo podle skupiny zboží. Tématika tohoto dílu předpokládá zvládnutí obsahu dílu prvního, tj. vytvoření tabulky v mySQL, zaplnění tabulky daty a práce s touto tabulkou pomocí základních příkazů PHP.
Výběr záznamů z tabulky mySQL – vyhledání zboží podle skupiny nebo klíčového slova
Skript PHP, který si nazvu select.php, vašim zákazníkům umožní vyhledat v dané tabulce databáze mySQL jakýkoliv záznam nebo množinu záznamů (tj. výrobků nabízených v internetovém obchodě) zadáním řetězce do textového pole formuláře (proměnná $klic) nebo kliknutím na odkaz označující libovolnou skupinu zboží (proměnná $skupina). Pracovat budu s fiktivní databází „obchod“, ve které jsem si vytvořil tabulku „vyrobky“ s textovými poli „skupina“, „nazev“ a „popis“. Bližší informace o této tabulce naleznete v prvním díle seriálu.
Nejdříve si nadefinuji styl odkazů, který zákazníkovi usnadní orientaci – tj. při najetí myši na odkaz se tento změní dle naší definice stylu. Mohu rovněž definovat vzhled již navštívených odkazů. Definice stylu může vypadat např. takto:
<style type=“text/css“> <!– .odkaz {font-size:small; font-weight:800; font-family: Times New Roman CE, Times CE, Times New Roman, Times, serif;} A:link { text-decoration: underline; color:#663300} A:visited { text-decoration: underline; color:#663300} A:hover { text-decoration: underline; color: red } –> </style> |
|
Aby byl skript funkční, musím mít v tabulce „vyrobky“ již načtené záznamy (opět odkazuji na první díl tohoto seriálu), tj. údaje o zboží nabízeném v internetovém obchodě. Předpokládám, že v poli „skupina“ je vždy jméno skupiny, pod který daný výrobek (záznam) spadá (bez české diakritiky a mezer mezi slovy), v poli „nazev“ je jméno a charakteristika výrobku, které se objeví zákazníkovi jako výstup v prohlížeči a v poli „popis“ jsou klíčová slova, o kterých si myslím, že by je zákazník mohl uvést při pokusu najít daný záznam. Abych byl konkrétnější – předpokládám např. internetový obchod s potravinami. Záznamy v tabulce „vyrobky“ potom mohou v jednotlivých polích vypadat takto:
1. záznam pole „skupina“: maso pole „nazev“: zmražené kuřecí drůbky, 750g pole „popis“: drůbež, kuře, polévka, mražené polotovary n. záznam pole „skupina“: mlecnevyrobky pole „nazev“: Hermelín, pikantní pole „popis“: sýry, sýr, plíseň, plísňový, král sýrů |
|
Skript select.php bude potom vypadat takto:
<form action=“select.php“ method=“post“> <input type=“text“ name=“klic“> <input type=“image“ name=“vyber“ src=“cesta k obrázku“ alt=“Vyhledat“ border=“0″> </form> |
|
Nadefinuji si jednoduchý formulář (mohu použít normální html kód), pomocí kterého si zákazník může vybrat zboží zadáním klíčového slova. Odešle-li zákazník textový řetězec (tj. klíčové slovo) z elementu „klic“ formuláře, dostane skript select.php k dispozici proměnnou $klic s hodnotou odpovídající zadanému textovému řetězci.
<? if (!IsSet($skupina)) $skupina=““; if (!IsSet($klic)) $klic=““; if(($Skupina= =““)&&($klic= =““)): echo „<div align=’center‘>Zde bude např. reklama.</div>“; echo „</body></html>“; die(); endif; |
|
Těmito příkazy se vyhnu hlášení chyby v případech, že není definována proměnná $skupina, resp. $klic. Pokud se zákazník rozhodne vyhledat zboží podle skupiny, zůstala by nedefinována proměnná $klic. Pokud zákazník bude hledat zboží podle klíčového slova, vypsalo by se chybové hlášení pro proměnnou $skupina. Jestliže není definována žádná z těchto proměnných (např. při prvním načtení skriptu) a jejich hodnota je tedy prázdný řetězec, vygeneruji příkazem echo libovolný kód html, který skript zobrazí jako normální html stránku a funkcí die() skript ukončím.
$styl=Array(„class=’odkaz'“,….,“class=’odkaz'“); |
|
Inicializace pole. Proměnné $styl přiřadím pole. Počet prvků pole odpovídá počtu skupin zboží, resp. počtu odkazů na tyto skupiny. Všem prvkům pole přiřadím textový řetězec, který v jazyce html přiřadí odkazu styl, jak jsem si jej definoval výše (v tomto případě class=’odkaz‘). Nezapomeňte, že indexování prvků pole začíná od nuly.
if ($skupina= =“maso“) $styl[0]=“style=’color:red;'“; elseif ($skupina= =“mlecnevyrobky“) $styl[1]=“style=’color:red;'“; elseif ($skupina= =“kategorie#n“) $styl[n-1]=“style=’color:red;'“; |
|
Příkazem if-elseif přiřadím v závislosti na hodnotě proměnné $skupina jednotlivým prvkům pole styl odlišný od definovaného stylu.
echo „<a href=’select.php?skupina=maso‘ „.$styl[0].“ title=“>masné výrobky</a> <a href=’select.php?skupina=mlecnevyrobky‘ „.$styl[1].“ title=“>mléčné výrobky</a> <a href=’select.php?skupina=skupina#n‘ „.$styl[n-1].“ title=“>fiktivní skupina</a>“; |
|
Pokud tedy ve skriptu select.php zákazník klikne např. na odkaz „masné výrobky“, který odkazuje zpět na tentýž skript, avšak s již definovanou proměnnou $skupina ($skupina=maso), získá nultý prvek pole proměnné $styl hodnotu podle příkazu if-elseif (tj. style=’color:red;‘). Ostatní prvky pole proměnné $styl si ponechají svou inicializovanou hodnotu (tj. class=’odkaz‘). V prohlížeči se tak vždy aktuální odkaz (tj. ten, který odpovídá vybrané množině záznamů) zobrazí jinak (v tomto případě červenou barvou) než odkazy ostatní.
Nyní mi zbývá určit, co skript select.php s proměnnou $skupina, případně s $klic udělá, aby skutečně došlo k výběru správných dat z naší tabulky „vyrobky“. Opět vše vysvětlím na jednotlivých částech skriptu.
<? do { $spojeni = MySQL_Connect(„localhost“, „root“, „password“); if (!$spojeni): echo „Nezdařilo se připojení k databázi.“; break; endif; |
|
Část skriptu, která komunikuje s databází mySQL, uzavřu do cyklu do-while. Kombinace tohoto cyklu s příkazem break mi v případě poruchy komunikace s databází umožní, jako např. zde, kdykoliv připojení k databázi ukončit a vypsat hlášení o chybě.
$vybrat_dtb = MySQL_Select_DB(„obchod“); if($klic!=““): /* funkce AddSlashes převede případné kolizní hodnoty zadané do pole klic na bezpečné */ $podminka = „WHERE popis LIKE ‚%“.AddSlashes($klic).“%‘ OR nazev LIKE ‚%“.AddSlashes($klic).“%'“; else: $podminka = „WHERE skupina=’$skupina'“; endif; $vysledek = Mysql_query(„SELECT nazev from vyrobky $podminka“); if(!$vysledek): echo „Došlo k poruše v komunikaci s databází!\n“; break; endif; |
|
Těmito několika málo příkazy provedu výběr pole „nazev“ všech záznamů z tabulky „vyrobky“, které odpovídají zadané skupině nebo klíčovému slovu. Podstatná je proměnná $podminka, která upřesňuje klauzuli WHERE. Pokud proměnná $klic není prázdný řetězec (tj. zákazník se rozhodl vybrat zboží podle klíčového slova), získá $podminka tvar „WHERE popis LIKE ‚%klíčové slovo%‘ OR nazev LIKE ‚%klíčové slovo%‘. Proměnné $vysledek tedy bude přiřazen výběr všech záznamů tabulky „vyrobky“, jejichž hodnoty pole „popis“ (tj. můj soupis klíčových slov pro daný záznam) nebo pole „nazev“ (tj. název výrobku, který chci mít jako výstup z tabulky do prohlížeče) budou v sobě obsahovat textový řetězec (klíčové slovo) zadaný zákazníkem do textového pole formuláře. V případě, že proměnná $klic je prázdný řetězec, předpokládám, že zákazník si zboží vybírá podle skupiny. Potom proměnná $podminka získává tvar „WHERE skupina = ‚proměnná $skupina předaná skriptu kliknutím na příslušnou skupinu zboží‘. Proměnné $vysledek bude přiřazen výběr všech záznamů tabulky „vyrobky“, jejichž hodnota pole „skupina“ odpovídá hodnotě proměnné $skupina.
if((Mysql_Num_Rows($vysledek)= =0)&&($klic!=““)): echo „Vámi zadanému klíčovému slovu neodpovídá žádný záznam.“; break; endif; } while(false); MySQL_Close($spojeni); ?> |
|
Na závěr musím do skriptu přidat ještě jednu eventualitu. Nastane v případě, že zákazník zadá klíčové slovo, kterému v naší tabulce neodpovídá žádný záznam. Skript select.php to pozná tak, že počet výsledných řádků odpovídá nule (tj. Mysql_Num_Rows($vysledek) = =0) a současně proměnná $klic není prázdný textový řetězec. Potom dojde k vypsání chybového hlášení.
V dalším díle svého seriálu bych se chtěl věnovat, pokud vás tedy druhé pokračování dostatečně zaujalo a nažhavilo, problematice zobrazování vybraných záznamů z tabulky, jejich přidávání do nákupního košíku a vzájemné komunikaci skriptů PHP řešících zobrazování vybraných záznamů z tabulky a zobrazování záznamů přidaných do nákupního košíku.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.