Stránkování výpisu z databáze

10.06.2001 11:40 | blackhole

Každý, kdo se trošku věnuje programování v hypertextovém procesoru PHP se jistě už setkal s následujícím problémem: mám v tabulce uložené nějaké údaje, chci je poskytnout uživateli, ale na jednu stránku jich je příliš mnoho. Co s tím?Řešení by měl poskytovat následující článek.Vytvořme si pracovní situaci: Jsme vlastníky knihkupeckého serveru a na jedné ze stránek chceme uživatele informovat o aktuálních knižních novinkách. Informace bude obsahovat (pro zjednodušení) jen název knihy a krátkou anotaci. Dejme tomu, že budeme na jednu stránku vypisovat tři anotace.Proto si nejdřív musíme v databázi vytvořit tabulku, do které budeme tyto informace ukládat.<source_code>CREATE TABLE anotace (id TINYINT (3) not null , jmeno_knihy CHAR (75) not null , anotace VARCHAR (255) not null , PRIMARY KEY (id))</source_code>Když už máme tabulku hotovou, pro naše účely jí bude potřeba zaplnit. Proto si do tabulky uložte cca 8-10 údajů.Jako první si vytvoříme skript vypis.php. V tomto skriptu se samozřejmě budeme muset připojit k databázi. Pro připojení budu používat funkci spojeni(), jíž si naprogramujeme později.Skript by také měl odeslat hlavičku o své \"trvanlivosti\". Na začátku budeme také muset připojit soubor funkce.php, jehož obsah si popíšeme níže.<source_code><?Header(\"Expires: \".GMDate(\"D, d M Y H:i:s\").\" GMT\");require \"./funkce.php\";?><!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//CZ\"><html><head> <title>Výpis</title></head><meta name=\"generator\" content=\"Notepad\"><body></source_code>Nyní již můžeme přistoupit k samotné tvorbě parametrů pro výpis. Pro identifikaci pořadí stránky výpisu budeme používat proměnnou $zobrazena_strana. Jak už název napovídá, v ní bude ukryto číslo aktuální strany výpisu. Pokud ke skriptu budeme přistupovat poprvé, tzn. proměnná $zobrazena_strana nebude zinicializována, přiřadíme ji číslo 1.Poté z databáze \"vytáhneme\" všechny potřebné údaje, u nás je to id, jmeno_knihy a anotace. Následně spočítáme počet záznamů v tabulce a určíme počet vypisovaných anotací.<source_code><?spojeni();If (!IsSet($zobrazena_strana)):$zobrazena_strana=1;endif;$vysledek = MySQL_Query(\"SELECT * FROM anotace\"); // výběr všech záznamů$celkove_zaznamu = MySQL_Num_Rows($vysledek); // spočítání všech záznamů$na_strance=3; // počet záznamů na jedné stránce$pocet_stran=Ceil($pocet_zaznamu/$na_strance); // kolik stran?</source_code>Pro omezení počtu záznamů, které budeme na stránku vypisovat, slouží proměnná $limit.V jazyce SQL má limit následující syntaxi: LIMIT <int1>, <int2>, kde int1 je číslo, od kterého budeme záznamy počítat a int2 je číslo určující počet záznamů počítaných od int1.<source_code>$limit1=(($zobrazena_strana-1)*$na_strance); // od kolikateho zobrazit?$limit2=($na_strance);// zobrazit x zaznamu$limit=\"LIMIT \".$limit1.\", \".$limit2.\"\";// zkompletování celého limitu</source_code>Tímto máme určené omezení pro naše anotace a můžeme přistoupit k dalšímu dotazu do databáze, tentokrát však už nebudeme tahat všechny záznamy, ale jen ty, které potřebujeme pro aktuální stránku.Součástí výpisu bude také informace pro uživatele, která jim oznámí kolik záznamů skript vypsal a kolik jich databáze obsahuje celkově a také samozřejmé ošetření chyb - například, když se v tabulce nenalézá žádný záznam.K výpisu do přehledné tabulky využijeme služeb while cyklu.<source_code>$sql=MySQL_Query(\"SELECT id, jmeno_knihy, anotace FROM anotace \".$limit); if (!$sql): echo \"Chyba při provádění výpisu! </body></html>\"; die; endif; if (mysql_num_rows($sql)==0): echo \"Nebyl nalezen žádný záznam! </body></html>\"; die; endif; echo predchozi_dalsi($zobrazena_strana, $pocet_stran, \"vypis.php\"); $celkem = MySQL_Num_Rows($sql); // celkovy pocet zaznamu if ($celkem!=0): echo \"<table><tr><td> Počet zobrazených anotací: \".$celkem.\" / \".$celkove_zaznamu. \"</td></tr></table>\"; $i=0; while($zaznam=mysql_fetch_row($sql)) {?><table><tr> <td>Název knihy: <?echo $zaznam[1];?></td></tr><tr> <td>Anotace: <?echo $zaznam[2];?></td></tr></table><? $i++;} while(false); mysql_close; endif;?></body></html></source_code>Tím jsme ukončili skript vypis.php. Nyní přistoupíme ke tvorbě pomocného souboru funkce.php, který bude obsahovat dvě funkce. První z nich bude zajišťovat připojení k databázi.<source_code>function spojeni(){ if (!@$spojeni = MySQL_Connect(\"localhost\", \"\", \"\")): echo \"Nepodařilo se připojit k databázi!\"; die; endif; if (!@$select = MySQL_Select_Db(\"vase_databaze\")): echo \"Chyba při selekci databáze!\"; die; endif;}</source_code>Funkci spojeni() snad nemusím detailněji popisovat, ta je snad jasná. Pro případ, že není: příkaz MySQL_Connect zajišťuje připojení k databázi o vyplněných předmětech: první je jméno stroje, druhé je username a třetí je heslo. Příkaz MySQL_Select_DB o parametru vase_databaze vybere ze všech přístupných databází právě tu vaši a do jednotlivých tabulek se odkazujete až z konkrétních souborů.Tak, toto je snad jasné… :)Druhou funkcí je funkce s obligátním názvem predchozi_dalsi. Tato funkce bude generovat podle potřeby odkazy na předchozí či následující stránky. Jejími vstupními parametry budou proměnné $zobrazena_strana, $pocet_stran, $soubor. Do poslední z nich uložíme řetězec, který bude obsahovat jméno souboru, ze kterého budeme tuto funkci volat. To proto, aby byla tato funkce univerzální a nemuseli jste ji upravovat pro každý soubor, ze kterého ji budete volat.Protože se jedná o vcelku jednoduchou funkci, budu jí komentovat ve zdrojovém kódu a ne v textu. Takže teď si jen vychutnejte krááásný source code… :)<source_code>function predchozi_dalsi($zobrazena_strana, $pocet_stran, $soubor){ If (($zobrazena_strana==1) && ($zobrazena_strana==$pocet_stran)) // když máme tolik záznamů, že se vlezou na jednu stránku, // tak negenerujeme žádný odkaz { return \"\"; } elseif (($zobrazena_strana!=1) && ($zobrazena_strana==$pocet_stran)) // když zobrazujeme poslední stránku // vypíšem odkaz jen na předchozí stránku { return \"<a href=\\\"\".$soubor.\"?zobrazena_strana=\".($zobrazena_strana-1).\"\\\"><== Předchozí strana</a>\"; } elseif (($zobrazena_strana!=$pocet_stran) && ($zobrazena_strana>1)) // když aktuální strana není poslední, ale ani první // generujem odkaz na předchozí i na další { return \"<a href=\\\"\".$soubor.\"?zobrazena_strana=\".($zobrazena_strana-1).\"\\\"> <== Předchozí strana</a> <a href=\\\"\".$soubor.\"?zobrazena_strana=\".($zobrazena_strana+1).\"\\\"> Další strana ==></a>\"; } elseif (($zobrazena_strana==1) && ($pocet_stran!=1)) // když jsme na první straně a zároveň nejsme na poslední straně // vypíšem odkaz na další stranu { return \"<a href=\\\"\".$soubor.\"?zobrazena_strana=\".($zobrazena_strana+1).\"\\\"> Další strana ==></a>\"; } else // a jinak negenerujeme nic, protože nevíme co… return \"\";}</source_code>Teď jsme ukončili i pomocný soubor funkce.php, takže máme již hotovo.Doufám, že jsem vám ničím nezamotal hlavu, že teď již máte jasno, jak do svých stránek vložíte řád. V případě jakýchkoli nejasností mě neváhejte kontaktovat!Mnoho zdaru a spousty stránekTomash