Prohlížení obsáhlé tabulky na jedné stránce je dost nepohodlné. Ukáži vám, jak návštěvníkům vašich stránek umožníte listování v tabulce obsahující velké množství záznamů.
Následující skript (odkaz na něj naleznete v závěru článku) vám umožní posouvat se v tabulce vždy o jeden list vpřed nebo vzad a zobrazí číslo aktuálního listu i celkový počet listů. Předpokládám, že tabulka obsahuje záznamy vygenerované dotazem na databázi MySQL. Skript proto umí pracovat s proměnlivým počtem záznamů zobrazených v jednom listu tabulky – zadavatel dotazu tedy může při jeho definování určit, zda chce výsledné údaje zobrazovat například po 10, po 20 nebo jen po 5 záznamech.
Listování v tabulce se provádí klepnutím na jednoduché odkazy:
> – o jeden list dopředu < – o jeden list dozadu >> – na poslední list tabulky << – na první list tabulky |
|
Mezi těmito odkazy je vždy uvedeno číslo aktuálního listu tabulky lomené celkovým počtem listů tabulky. Pokud tedy dotaz vygeneruje např. 100 záznamů zobrazovaných po deseti v jednom listu tabulky a zadavatel dotazu je na pátém listu, tento skript vypíše údaj:
Z aktuálního pátého listu z celkem deseti je možno se dostat na čtvrtý, šestý, první a poslední list tabulky. Skript samozřejmě pozná první, druhý, poslední a předposlední list tabulky a přizpůsobí jim svůj výpis:
Dostane-li se tedy návštěvník stránky jako v tomto případě na předposlední list tabulky, nezobrazí se odkaz > (následující list), protože jeho funkce je shodná s odkazem >> (poslední list). Je ošetřen i případ, kdy výsledná tabulka obsahuje tři listy a aktuální list je list číslo 2. Skript vypíše následující sekvenci odkazů:
Pozadí skriptu
Pro pochopení principu skriptu je nezbytná znalost fungování příkazu LIMIT v mySQL.
$dotaz = Mysql_Query(„SELECT * FROM jmeno_tabulky LIMIT 20, 10“); |
|
Příkaz LIMIT obsahuje dva údaje: první udává číslo záznamu (vlastně řádku tabulky). Dotaz vrátí jen záznamy v tabulce následující – je-li tedy hodnota tohoto údaje 20, dotaz začne zpracovávat záznamy od 21. řádku tabulky. Druhý údaj udává počet záznamů, které dotaz zpracuje. Ve skriptu používám příkaz LIMIT ve tvaru LIMIT $zaznam, $pocet. Příkaz LIMIT tak načte z databáze jen počet záznamů odpovídající proměnné $pocet. Hodnotu proměnné $pocet zadá návštěvník stránky např. v elementu <SELECT> (rozevírací roletka) formuláře , kde je definován dotaz na databázi. Může tak určit počet záznamů zobrazených v jednom listu tabulky. Proměnná $zaznam se na rozdíl od proměnné $pocet mění – úkolem skriptu je nastavovat tuto proměnnou tak, aby se vypsaly vždy správné záznamy. Na začátku skriptu proměnnou $zaznam nastavím na nulu. Je-li tedy proměnné $pocet přidělena hodnota např. 10 (tj. návštěvník stránky si přeje výsledné záznamy prohlížet po deseti), první dotaz na databázi je proveden s příkazem LIMIT ve tvaru LIMIT = 0, 10. V prvním listu tabulky je tedy zobrazeno prvních deset záznamů. Listováním v tabulce se proměnná $zaznam mění tak, aby danému listu tabulky odpovídaly vždy správné záznamy.
Správné přiřazení proměnné $zaznam listu tabulky zajišťuje pole $pole.
Indexy tohoto pole odpovídají jednotlivým listům tabulky a příslušné prvky odpovídají proměnné $zaznam pro daný list. Pokud se tedy v jednom listu tabulky zobrazuje 10 záznamů a celkový počet záznamů je 40, pole $pole musí mít následující hodnoty:
$pole[1] = 0 $pole[2] = 10 $pole[3] = 20 $pole[4] = 30 |
|
Pro např. třetí list tabulky (tj. $pole[3]) tak získáte správnou hodnotu 20 pro proměnnou $zaznam, kterou dosadíte do příkazu LIMIT.
Je tedy nutné zajistit načtení správného prvku pole pro správný list tabulky. List tabulky identifikuje skript pomocí proměnné $c_listu, která je na začátku skriptu nastavena na hodnotu jedna. Kombinací cyklu WHILE s funkcemi List() a Each() zajistím načtení pole $pole do dvou pomocných proměnných $cislo_listu a $x.
while (List($cislo_listu, $x) = Each($pole)) |
|
Například hodnoty pole $pole uvedeného v příkladu výše budou načítány následujícím způsobem:
$cislo_listu = 1, tomu odpovídá $x = 0 $cislo_listu = 2, tomu odpovídá $x = 10 $cislo_listu = 3, tomu odpovídá $x = 20 $cislo_listu = 4, tomu odpovídá $x = 30 |
|
Proměnnou $cislo_listu po celou dobu načítání pole do pomocných proměnných porovnávám s aktuálním listem (tedy s proměnnou $c_listu). Při prvním volání skriptu, kdy hodnota proměnné $c_listu je natvrdo nastavena na 1, je podmínka rovnosti obou těchto proměnných splněna hned pro první prvek pole $pole. Díky funkci Each() se ukazatel pole $pole automaticky přesune na následující prvek tohoto pole (v tomto případě tedy na druhý prvek). Funkcí Current() zjistím hodnotu tohoto prvku (tedy 10) a uložím ji do proměnné $vpred. K proměnné $c_listu přičtu jedničku a uložím ji do proměnné $c_listu1. Pro přesun na následující (v tomto případě tedy druhý) list tabulky tak získám proměnné:
$c_listu1 = $c_listu + 1 $vpred = current($pole) |
|
Na druhém listu tabulky tedy skript již pracuje se změněnými proměnnými $c_listu (= $c_listu1) a $zaznam (= $vpred). Skript znovu vytvoří pole $pole (předtím však musím proměnnou $zaznam vynulovat) a jeho obsah načte do pomocných proměnných $cislo_listu a $x. Podmínka rovnosti proměnných $cislo_listu a $c_listu je tentokrát splněna pro druhý prvek pole. Definuji proměnné pro posun v tabulce o list zpět:
$c_listu2 = $c_listu – 1 $vzad = $x – $pocet |
|
Připomínám, že proměnná $pocet udávající počet zobrazovaných záznamů v jednom listu tabulky je konstantní (definována návštěvníkem stránky ve formuláři, v tomto případě 10). Na třetím listu tabulky získám tyto hodnoty proměnných:
$cislo_listu = 3 $x = 20 $c_listu1 = $c_listu + 1 (tedy 4) $c_listu2 = $c_listu – 1 (tedy 2) $vpred = Current($pole) (tedy 30) $vzad = $x – $pocet (tedy 10) |
|
Odkazům < > odpovídající proměnné přiděluji následujícím způsobem:
echo “ <a style=\“color:black\“ href=\“skript.php?zaznam=$vzad&c_listu=$c_listu2\“><</a>“; echo “ <a style=\“color:black\“ href=\“skript.php?zaznam=$vpred&c_listu=$c_listu1\“>></a> „; |
|
Musím také definovat proměnné pro odkazy << (první list tabulky) a >> (poslední list tabulky). Pro první list tabulky využiji známého čísla listu: $c_listu = 1 i známé velikosti prvního údaje příkazu LIMIT: $zaznam = 0. Pro poslední list tabulky využiji známého počtu všech listů odvozeného z celkového počtu záznamů poděleného proměnnou $pocet udávající počet záznamů zobrazených v jednom listu tabulky. Proměnná $zaznam bude rovna nejvyšší hodnotě proměnné $x, jinými slovy nejvyšší a tím i poslední hodnotě proměnné $zaznam načtené do pole $pole.
Nakonec zbývá již jen ošetřit jednotlivé zvláštní případy listů tabulky, tj. zobrazování odkazů pro druhý a předposlední list tabulky, pro první a poslední list tabulky a pro případy, kdy celkový počet listů tabulky je menší než čtyři. Uvádím příklad ošetření případu, kdy aktuální list je druhý:
if($c_listu = = 2): echo "<a style=\"color:blue\" href=\"skript.php?zaznam=0&c_listu=1\"><<</a> "; echo " <font color=\"red\">$c_listu</font> / <font color=\"red\">$pocet_vysl</font> "; echo " <a style=\"color:black\" href=\"skript.php?zaznam=$vpred&c_listu=$c_listu1\">></a> "; echo " <a style=\"color:blue\" href=\"skript.php?zaznam=$zaznam&c_listu=$pocet_vysl\">>></a>"; break; endif; |
|
Skript vypíše následující sekvenci:
<< 2 / celkový počet listů > >> |
|
Celý skript včetně poznámek vysvětlujících jednotlivé kroky si můžete prohlédnout zde. Skriptu musí předcházet formulář, ve kterém uživatel definuje dotaz na databázi – to už je však zase jiná kapitola.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.