V několikadílném článku vás provedu tvorbou internetov0ho obchodu, ve kterém si zákazník sám prohlédne a vybere zboží, objedná si ho, případně si vybere možnost slevy – a vám jako majiteli obchodu přijde zpráva o objednávce. Tématika článku předpokládá základní zkušenosti s provozem lokálního serveru (např. Personal Web Server), PHP i mySQL na vašem počítači.
Spolupráce PHP s mySQL – vytvoření tabulky a import dat
V prvním díle popíši skript php, pomocí kterého si v mySQL pohodlně vytvoříte tabulku a importujete do ní data. Tento díl berte prosím jako jakýsi úvod do problematiky a jako příklad toho, jak lze pomocí několika standardizovaných funkcí PHP pohodlně ovládat databázi mySQL. Postupy uvedené v tomto dílu budu používat ve všech dalších skriptech zajišťujících správné fungování obchodu.
function chybova_zprava() { echo „Chyba: „.mysql_errno(). „; popis chyby: „.mysql_error().“<br>“; } |
|
Na začátku skriptu si definuji funkci chybova_zprava(), která mně příkazem echo vypíše případné chyby v komunikaci s databází. Výpis chyby je obdobný jako při práci s mySQL na příkazovém řádku.
$spojeni = MySQL_Connect(„localhost“, „JmenoSpravceDB“, „HesloSpravceDB“); |
|
Touto funkcí se připojíte k databázi mySQL na vašem počítači. Musíte samozřejmě uvést vaše skutečné jméno a heslo jako správce databáze.
$database = Mysql_Query(„CREATE DATABASE IF NOT EXISTS obchod“); if (!$database): chybova_zprava(); endif; Mysql_Select_DB(„obchod“); |
|
Standardní funkce Mysql_Query odešle příkaz nebo dotaz na databázi mySQL. Prvním příkazem vytvořím databázi „obchod“. Nepovinný argument IF NOT EXISTS zabrání chybovému hlášení (duplicita databází) v případě opakovaného použití skriptu. Chybové hlášení obstarává příkaz if (!název proměnné, která odpovídá dané funkci MySQL_Query), který volá funkci chybova_zprava(). Funkcí Mysql_Select_DB aktivujeme databázi, se kterou chceme dále pracovat.
$table = Mysql_Query(„CREATE TABLE IF NOT EXISTS vyrobky ( id_vyrobek SMALLINT(5) NOT NULL PRIMARY KEY AUTO_INCREMENT, skupina VARCHAR(25) NOT NULL, nazev VARCHAR(60), popis VARCHAR(65), cena SMALLINT(5) UNSIGNED, kat_cislo VARCHAR(6), info VARCHAR(40))“); |
|
Dalším příkazem vytvořím tabulku „vyrobky“. První pole tabulky „id_vyrobek“ je klíčové a jednoznačně identifikuje každý záznam tabulky. Smyslem tohoto článku není rozebírat jednotlivé datové typy a modifikátory polí používané v mySQL. Upozorňuji jen na nutnost použít modifikátor NOT NULL u všech polí, kde chceme mít klíč nebo index. Pokud se chcete dozvědět více, odkazuji vás na články na tomto serveru věnující se přímo MySQL nebo na příslušnou literaturu (např. Naučte se mySQL za 21 dní od Marka Maslakowskeho). Z hlediska fungování internetového obchodu má samozřejmě každé pole a jeho modifikátor své opodstatnění, o tom však až v dalších dílech.
$indexovat = Mysql_Query(„ALTER TABLE vyrobky ADD INDEX idx_skupina (skupina)“); if(!$indexovat): chybova_zprava(); endif; |
|
Pro optimalizaci výkonu databáze přidám tímto příkazem poli „skupina“ index. Zde upozorňuji na použití funkce „chybova_zprava()“, která se vyvolá, když přidání indexu „idx_skupina“ neproběhne. Tato situace nastane vždy, pokud již máte tabulku „vyrobky“ s tímto indexem vytvořenu. Jinými slovy, pokud se pokusíte použít skript create.php více než jednou, vypíše se vám chybové hlášení v tom smyslu, že index tohoto jména již existuje. Na funkčnost tabulky nebo skriptu to ale nemá vliv, protože není důvod vytvářet tentýž index podruhé.
$smazat = Mysql_Query(„DELETE FROM vyrobky“); $sql = „LOAD DATA INFILE ‚c:/…cesta k souboru…/sortiment.txt‘ INTO TABLE vyrobky FIELDS TERMINATED BY ‚*‘ ENCLOSED BY ““ „; |
|
Touto částí skriptu importujeme do tabulky „vyrobky“ data uložené v textovém souboru sortiment.txt. Proměnná $smazat zajistí vymazání všech údajů v tabulce, aby se záznamy mohly uložit do prázdné tabulky. Pozor! Mějte vždy zálohu vaší tabulky a potažmo celé databáze! Příkaz DELETE je v mySQL nekompromisní. Smazaná data vám již nikdo zpátky nevrátí! Pro vytvoření vlastního textového souboru použijte nejlépe textový editor Poznámkový blok. Jednotlivá pole záznamu oddělte znaky ‚ ‚ (tj. např. ‚cena‘), jednotlivé záznamy od sebe oddělte znakem *. Tyto znaky můžete změnit u přepínačů ENCLOSED BY, respektive TERMINATED BY. Pozor! Použité znaky musí být jedinečné, tj. v textovém souboru je nesmíte použít pro jiné účely než pro oddělování polí, resp. záznamů. Soubor si poté uložte a u příkazu „LOAD DATA INFILE..“ specifikujte jeho adresář. Pokud se podíváte na příklad souboru sortiment.txt, který jsem použil pro importování dat, zjistíte, že pole „id_vyrobek“ (tj. první pole) je prázdné. Pole zaplní modifikátor AUTO_INCREMENT, který pro každou položku automaticky přidá hodnotu pole vždy o jedno číslo vyšší. A ještě jednou pozor! Pořadí polí v textovém souboru musí odpovídat pořadí polí v tabulce. Textový soubor, ze kterého načítáte data, můžete používat stále – pokud budete chtít změnit údaje u některé položky, položku přidat či naopak ubrat, docílíte toho jednoduchou opravou textového souboru a použitím skriptu create.php.
$vysledek = Mysql_Query(„SELECT*FROM vyrobky“); ….. echo „V tabulce vyrobky je „.Mysql_Num_Rows($vysledek).“ záznamů.<br>“; while ($zaznam = Mysql_Fetch_Array($vysledek)): echo $zaznam[„id_vyrobek“].“/ „.$zaznam[„skupina“].“/ „.$zaznam[„nazev“].“/ „.$zaznam[„popis“].“/ „.$zaznam[„kat_cislo“].“/ „.$zaznam[„cena“].“/ „.$zaznam[„info“].“<br>“; endwhile; |
|
Posledními příkazy provedeme kontrolní výpis importovaných dat. Proměnná $vysledek obstará výběr všech údajů z tabulky. Příkazem echo a funkcí Mysql_Num_Rows, jejímž parametrem je název proměnné výsledné sady dotazu mySQL, v tomto případě tedy $vysledek, si vypíši počet importovaných záznamů. Cyklus while umožní načíst všechny záznamy (řádky) tabulky, které jsou uloženy v nové proměnné (v tomto případě $zaznam) jako asociativní pole. Jednotlivé řádky tohoto pole volá funkce Mysql_Fetch_Array. Parametrem funkce je opět název proměnné výsledné sady dotazu mySQL. Prvky pole odpovídají jednotlivým polím tabulky a voláme je vždy názvem pole tabulky. Mohu tedy snadno určovat počet záznamů (řádků) výpisu, když v tomto případě proměnné $vysledek přiřadím dotaz mySQL např. s klauzulí WHERE. Rovněž mohu v příkazu echo cyklu while určit počet nebo pořadí vypsaných polí tabulky.
Omlouvám se za tento poněkud triviální úvod, který mnohé z vás jistě dokonale znudil. Tento skript je navíc zcela zbytečný v případě, že „svou“ databázi mySQL pohodlně ovládáte z grafického rozhraní a tabulku i s importem údajů zvládnete několika kliky. Věřím však tomu, že ne všichni zájemci o poznání tajů internetového obchodu těchto několik zde zmíněných základních funkcí, příkazů a postupů ovládají a umí je používat a že tento díl jim tak poslouží jako vhodný úvod do celé problematiky.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Jakub
Říj 1, 2009 v 11:00Textový soubor by mohl být napsán např. takto:
*’programy’*’Čeština 1’*’diktáty’*’10’*1*’připravujeme’*
*’programy’*’Čeština 2’*’yý/ií’*’10’*1*’připravujeme’*
V dalších dílech píše autor o skupinách jídel (např. hermelín), ale princip formátování je stejný.
Jiří Stojan
Zář 22, 2010 v 15:35Dobrý den jak mám vyvořit sloupec v mysql, s tím že na mé stránce by jsem zadal informace
„příklad:rozměry, poznámky k produktu, atd.“
a pak by jse mi ty informace ukázali v kosiku?
My sql jsem začátečník.
Tomáš
Bře 13, 2011 v 0:21Kde se dají stáhnout hotové soubory? Neumím ani najít odkaz na ten sortiment.txt
Díky