Autor Zpráva
Kcko
Profil
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
$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
Eh, tohle je presne to co jsem nechtel, volat 2 SQL dotazy, diky za snahu ale zkus si to precist jeste jednou.
joe
Profil
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
ř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);
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0