Listování v tabulce pomocí skriptu PHP

12. března 2002

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:

<< < 5 / 10 > >>

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:

<< < 9 / 10 >>

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ů:

<< 2 / 3 >>

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\“>&lt;</a>“;
echo “ <a style=\“color:black\“ href=\“skript.php?zaznam=$vpred&c_listu=$c_listu1\“>&gt;</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\">&lt;&lt;</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\">&gt;</a> ";
echo " <a style=\"color:blue\" href=\"skript.php?zaznam=$zaznam&c_listu=$pocet_vysl\">&gt;&gt;</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.

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 *