Witam, na google jest wiele tematów odnośnie stronnicowania, lecz wszystkie mają już swoje lata. W jaki sposób poprawnie wykonać stronnicowanie?
Przy pobieraniu strony wyślij w requeście numer strony którą chcesz dostać (np http://mojastrona.com/plik.php?strona=12
). Przy odczytywaniu, tam gdzie pobierasz posty ustaw sobie offset 12*ILOSC_POSTOW_PER_STRONA
oraz limit ILOSC_POSTOW_PER_STRONA
(liczba 12
of course wzięta z parametru). I po prostu wyświetl te które odczytałeś.
Ok, dzięki, jeśli ktoś byłby zaintersowany, wklejam kod jaki napisałem.
$count=2;
$offset=0;
if(isset($_GET['count']))
{
$count = $_GET['count'];
}
if(isset($_GET['offset']))
{
$offset = $count*$_GET['offset'];
}
$stmt=$this->db->prepare('SELECT [wartosci] FROM products INNER JOIN users ON products.nick=users.nick');
$stmt->execute();
$count_pages = $stmt->rowCount();
$pages = ceil($count_pages/$count);
$stmt=$this->db->prepare('SELECT [wartosci] FROM products INNER JOIN users ON products.nick=users.nick ORDER BY id DESC LIMIT '.$offset.','.$count.'');
$stmt->execute();
for($i=0;$i<$pages;$i++)
{
if($i*$count==$offset)
{
echo ' '.$i.' ';
}
else
{
echo '<a href="admin_orders.php?count='.$count.'&offset='.$i.'"> '.$i.' </a>';
}
}
Źle, źle - z całą pewnością nie jest to poprawne
stronicowanie, ani nawet mierne
.
- Wydziel stronicowanie do odrębnej klasy.
- Spraw, aby było niezależne od źródła danych (separacja warstw aplikacji, zasada pojedynczej odpowiedzialności).
- Porównuj zawsze poprzez
===
, aby być pewnym typów. - Nie pobieraj na pałę danych z
$_GET
- gdy wydzielisz stronicowanie do odrębnej warstwy, utwórz metody w rodzajusetItemsPerPage
orazsetPageNumber
. - Twój kod jest podatny na
sql injection
, bo z jakiegoś dziwnego powodu wykorzystujesz konkatenację ciągów znaków zamiast bindowania.
Plus generalnie poczytaj sobie o MVC/MVVP.
A da się bindować LIMIT ?
Da się, wykorzystując $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
.
Ewentualnie przynajmniej rzutuj na int
y przed wplataniem do zapytania.
Rzutowanie na inty pomogło :) Dostosowałem się do Twoich rad, co do MVC, właśnie przerabiam ten projekt, aby był zgodny z wzorcem projektowym, w celu utrzymania wspomagam się view helperem.
Zauważyłem właśnie, że ostatnie dane z pierwszej strony przechodzą do następnej. Gdzie może być błąd?