Autor | Zpráva | ||
---|---|---|---|
Kcko Profil |
#1 · Zasláno: 26. 7. 2008, 10:56:46 · Upravil/a: Kcko
Napsal jsem si strankovaci tridu.
Pouziti vypada nejak takto $pager = new Paging(50); // kolik radku vypiseme na strance $query = DB::query("SELECT SQL_CALC_FOUND_ROWS * FROM tabulka LIMIT $pager->offset, $pager->limit); // inicializacni metoda, ktera mimo jine doda do clenske // promenne celkovy pocet radku, nastavi 1 stranu a posledni stranu ve strankovacim bloku a dalsi veci $pager->init(); // tady muze byt klasicky vypis while () { } // strankovaci blok echo $pager->block(5); // kolik cisel ukazeme a pak se stred bude posouvat A ted mi jde o tento problem. Nekdo si muze hrat s URL , cili pokud URL vypada nejak takto ?paging=3 a nekdo zada napr ?paging=-50 tak se $pager->offset dostane do minusu a SQL zarve. To jeste problem neni, do metody init si muzu dopsat metodu ktera bude checkovat $_GET[paging] a pokud bude zaporny nastavi automaticky 0. Horsi je jak checkovat pokud by nekdo napsal do URL napr ?paging=89898422 , cili offset by ziskal vysokou hodnotu a zadne radky by se nevypsali. Toto se da resit mimo strankovaci tridu podminkou if (mysql_num_rows), ja bych ale rad docilil v pripade preteceni offsetu nastaveni jeho nejvyssi hodnoty. Ale vsechny udaje zna INIT az po vyvolani SQL dotazu do ktereho prave jiz $pager->offset davam. Mel by nekdo nejaky napad, pokud to docetl az sem a chape podstatu veci? Podotykam ze pouzivam 1x SQL dotaz zamerne kvuli narocnosti ( vice http://php.vrana.cz/ziskani-poctu-radek.php ) Diky |
||
joe Profil |
#2 · Zasláno: 26. 7. 2008, 12:41:51 · Upravil/a: joe
$pager = new Paging(50);
změň na $pager = new Paging("SELECT COUNT(*) FROM tabulka"); // (změnit i v té třídě :)) tím zjistíš počet řádků a pak to budeš kontrolovat, jestli to nepřesáhlo, když jo, dáš maximální. Abys pořád nevolal tenhle dotaz do db, můžeš si do sessions ukládat počet řádků nebo někam jinam a odtamtud ji brát, pokud se tabulka nebude často měnit. |
||
Kcko Profil |
#3 · Zasláno: 26. 7. 2008, 12:43:30
Eh, tohle je presne to co jsem nechtel, volat 2 SQL dotazy, diky za snahu ale zkus si to precist jeste jednou.
|
||
joe Profil |
#4 · Zasláno: 26. 7. 2008, 13:30:10 · Upravil/a: joe
Kcko
Já jsem to přečetl, jenomže to z toho nebylo moc zřejmé, zvlášť když po kliknutí odkaz se ti první objeví COUNT(*)... a před tím píšeš, že to používáš - asi nějaký kód dál. Proto jsem ještě napsal poslední řádek... Ale jestli existuje efektivnější způsob než je volání dotazu pro počet řádků, tak se taky rád přiučím - samozřejmě s tou "ochranou" jak je výše napsáno. |
||
matak Profil |
#5 · Zasláno: 26. 7. 2008, 13:38:43
řeším to také jedním dotazem a funguje mi to při každém ze zmíněných problémů:
1. záporné hodnoty stránky ošetřím snadno a to pokud je menší než jedna je page=1, lepší by asi bylo udělat redirect, ale nepředpokládám, že se to stane pokud někdo není šťoural a tu zápornou hodnotu do url nenapíše http://www.webfaq.cz/PHP.htm?page=-1 2. naopak příliš vysokou hodnotu řeším, tím, http://www.webfaq.cz/PHP.htm?page=100000000000 že po položení dotazu a zjištění, že požadovaný OFFSET je vyšší než počet řádků v dtb, tak položím dotaz znovu, opět si myslím, že pokud někdo nění šťoural, tak se to nestane a tudíž v takovém případě 2x položený dotaz je přijatelné zatížení dtb na šťourala, nebo špatně vedený odkaz z jiné stránky if (($this->page > $this->totalPages) && ($this->totalPages > 0)) { $this->page = $this->totalPages; $stmt = mysql_query(queryagain s upravenym offsetem); } |
||
Časová prodleva: 16 let
|
0