Obsah lekce:
V předchozích lekcích jsme se seznámili s konstrukcí SQL dotazu (např. funkce SELECT) a se způsobem, jak se pomocí funkcí PHP připojit do databáze MySQL, V této lekci si ukážeme, jak lze pomocí PHP a SQL vypsat obsah tabulky do prohlížeče.
Pro použití příkladů, které budou popisovány v této lekci, bude potřeba databáze, kterou jsme již v minulých lekcích využívali. Celou databázi si můžete stáhnout v souboru databaze.txt.
U prvního příkladu, na kterém bude vysvětlen výpis z databáze do prohlížeče, se vrátíme k dotazu pro výběr článků z databáze, který byl popisován v lekci SQL a příkaz SELECT. Cílem tohoto dotazu je vybrat z tabulky renome_tarticle nadpis článku (heading), krátký popis (descr) a datum vytvoření článku (createdate). Výsledek je seřazen dle data vytvoření a zobrazen.
SELECT heading, descr, createdate FROM renome_tarticle ORDER BY createdate
Pro odeslání dotazu bude sloužit funkce MySQL_Query, jejímž jediným argumentem bude proměnná s textem našeho dotazu.
Před započetím práce z databází je však nutné se k databázi připojit. K tomu použijeme funkci dbconn, kterou jsme si vytvořili dle pokynů v lekci PHP a funkce.
Před samotným popisem definice funce si nejprve uveďme obecný zápis:
// Odkaz na soubor, ve kterém máme definovanou funkci pro spojení s databází require("utils.php"); // Spojení s databází $spojeni = dbconn(); // SQL dotaz SELECT $sql = "SELECT "; $sql = $sql."heading, descr, createdate "; $sql = $sql."FROM renome_tarticle "; $sql = $sql." ORDER BY createdate"; // Provedení SQL dotazu $vysledek = MySQL_Query($sql);
Na začátku použijeme odkaz na soubor s funkcí pro připojení k databázi a k databázi se připojíme (identifikátor spojení uložíme do proměnné $spojeni). Následně do proměnné $sql sestavíme SQL dotaz. Tento dotaz bychom klidně mohli zapsat na jeden řádek ($sql = "SELECT header, descr, createdate FROM renome_tarticle ORDER BY createdate"), výsledek by byl stejný. Varianta, která je použita v tomto příkladu, je o něco přehlednější (což se nejvíce projeví u delších dotazů). Do proměnné $sql přidáváme (pomocí operátoru pro sloučení řetězců - tečka) další části dotazu. Při použití této vatianty je však nutné na konci každého řetězce ponechat mezeru (text by se jinak slil dohromady).
Pokud je dotaz nadefinován, je ještě třeba dotaz provést. K tomuto účelu slouží funkce MySQL_Query, jejímž parametrem je proměnná s dotazem (v našem případe $sql). Výsledek funkce je uložen v proměnné $vysledek.
Výsledkem funkce MySQL_Query však nejsou samotná data tabulky, ale pouze identifikátor výsledku, což lze jednodušše ověřit pomocí funkce print($vysledek) - po provedení funkce se zobrazí text Resource id #N (místo N bude doplněno číslo identifikátoru). Ten je třeba ještě dále zpracovat pro zobrazení výsledného seznamu článků.
Pokud již máme identifikátor výsledku je třeba z výsledku načíst záznamy. To docílíme pomocí funkce MySQL_Fetch_Array. Vstupním parametrem této funkce je naše proměnná $vysledek. Po provedení tohoto příkazu se do proměnné uloží jeden záznam. Při opakovaném volání se uloží vždy následující záznam. Pokud již výsledek žádné další záznamy neobsahuje, vrací funkce výsledek false.
Abychom zajistili vypsání všech záznamů, je vhodné funkci MySQL_Fetch_Array opakovat pomocí cyklu while - cyklus se bude opakovat dokud budou načítány další záznamy. Pokud již nejsou žádné další záznamy, funkce vrátí hodnotu false a cyklus while je ukončen. Tato část PHP skriptu bude vypadat následovně:
... if ($vysledek) { while($zaznam = MySQL_Fetch_Array($vysledek)) { print_r($zaznam); } } else { print("Dotaz na databazi se nezdaril."); } ...
Ve výše uvedeném příkladu jsme celý cyklus while uzavřeli do podmínky, která začíná řádkem if($vysledek). Tato podmínka nám zaručí pokračování pouze v případě, že byl dotaz proveden (v opačném případě má totiž proměnná $vysledek hodnotu false).
Uvnitř cyklu while je obsah pole vypsán pomocí funkce print_r. Tato funkce umožní zobrazení obsahu celého pole (tento řádek je zde pouze pro zjednodušení. V další části jej nahradíme výpisem jednotlivých částí pole tak, jak je budeme potřebovat naformátovat).
Tím, že jsme si pomocí funkce MySQL_Fetch_Array uložili záznam do proměnné $zaznam, můžeme k jednotlivým hodnotám záznamu přistupovat, tak, jak jako při práci s běžným polem (jednotlivé sloupce tabulky se uloží do pole v tom pořadí, v jakém jsou uvedeny v dotazu). Stačí uvést jméno proměnné a v hranatých závorkách číslo záznamu.
... if ($vysledek) { while($zaznam = MySQL_Fetch_Array($vysledek)) { print("<h2>".$zaznam[0]."</h2>"); print("<p>".$zaznam[1]."</p>"); } } else { print("Dotaz na databazi se nezdaril."); } ...
Uvedení čísla záznamu však může být nepraktické (hlavně pokud vypisujeme záznamy rozsáhlejší tabulky). Proto ještě provedeme jednu úpravu - číselné indexy pole nahradíme názvy sloupců tabulky.
... if ($vysledek) { while($zaznam = MySQL_Fetch_Array($vysledek)) { print("<h2>".$zaznam["heading"]."</h2>"); print("<p>".$zaznam["descr"]."</p>"); } } else { print("Dotaz na databazi se nezdaril."); } ...
Nyní již máme vypsán přehled článků (vždy nadpis + krátký popis). Dále nás ještě může zajímat počet záznamů, tj. počet článků, které jsou zobrazeny. Ten lze zjistit tak, že se bude počítat počet průchodů cyklu while a ten se uloží do proměnné $pocet.
... if ($vysledek) { $pocet = 0; while($zaznam = MySQL_Fetch_Array($vysledek)) { print("<h2>".$zaznam["heading"]."</h2>"); print("<p>".$zaznam["descr"]."</p>"); $pocet = $pocet + 1; } print("Počet nalezených článků: ".$pocet); } else { print("Dotaz na databazi se nezdaril."); } ...
Nyní již je zobrazen počet nalezených článků, avšak zobrazuje se až na konci stránky. Což není ideální, proto bude třeba ještě provést změnu, aby se nejprve zobrazil počet nalezených článků a až poté seznam článků. Toho lze docílit tak, že cyklus while nebude záznamy zobrazovat, ale bude je ukládat do pomocné proměnné, kterou skript zobrazí až po ukončení cyklu while. Upravený skript je zobrazen níže.
... if ($vysledek) { $pocet = 0; $htmlclanky = ""; while($zaznam = MySQL_Fetch_Array($vysledek)) { $htmlclanky .= "<h2>".$zaznam["heading"]."</h2>"; $htmlclanky = "<p>".$zaznam["descr"]."</p>"; $pocet = $pocet + 1; } print("Počet nalezených článků: ".$pocet); print($htmlclanky); } else { print("Dotaz na databazi se nezdaril."); } ...
Poslední situace, kterou bude potřeba ošetřit je situace, kdy nebyl nalezen žádný článek. V tomto případě stačí podmínka, která zkontroluje obsah proměnné $htmlclanky. Pokud bude tato proměnná prázdná (to zkontrolujeme tak, že proměnnou porovnáme s prázdným řetězcem), zobrazí se text s informací, že nebyl nalezen žádný článek.
... if ($vysledek) { $pocet = 0; $htmlclanky = ""; while($zaznam = MySQL_Fetch_Array($vysledek)) { $htmlclanky .= "<h2>".$zaznam["heading"]."</h2>"; $htmlclanky = "<p>".$zaznam["descr"]."</p>"; $pocet = $pocet + 1; } if ($htmlclanky == "") { print("Žádný článek nebyl nalezen."); } else { print("Počet nalezených článků: ".$pocet); print($htmlclanky); } } else { print("Dotaz na databazi se nezdaril."); } ...
Pro shrnutí na závěr ještě zbývá uvést kompletní kód PHP skriptu, který byl v této lekci vytvořen.
... require("utils.php"); $spojeni = dbconn(); $sql = "SELECT "; $sql = $sql."heading, descr, createdate "; $sql = $sql."FROM renome_tarticle "; $sql = $sql." ORDER BY createdate"; $vysledek = MySQL_Query($sql); if ($vysledek) { $pocet = 0; $htmlclanky = ""; while($zaznam = MySQL_Fetch_Array($vysledek)) { $htmlclanky .= "<h2>".$zaznam["heading"]."</h2>"; $htmlclanky = "<p>".$zaznam["descr"]."</p>"; $pocet = $pocet + 1; } if ($htmlclanky == "") { print("Žádný článek nebyl nalezen."); } else { print("Počet nalezených článků: ".$pocet); print($htmlclanky); } } else { print("Dotaz na databazi se nezdaril."); } ...