Poprawne stronnicowanie

0

Witam, na google jest wiele tematów odnośnie stronnicowania, lecz wszystkie mają już swoje lata. W jaki sposób poprawnie wykonać stronnicowanie?

0

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ś.

0

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>';
					 }
				}
0

Źle, źle - z całą pewnością nie jest to poprawne stronicowanie, ani nawet mierne.

  1. Wydziel stronicowanie do odrębnej klasy.
  2. Spraw, aby było niezależne od źródła danych (separacja warstw aplikacji, zasada pojedynczej odpowiedzialności).
  3. Porównuj zawsze poprzez ===, aby być pewnym typów.
  4. Nie pobieraj na pałę danych z $_GET - gdy wydzielisz stronicowanie do odrębnej warstwy, utwórz metody w rodzaju setItemsPerPage oraz setPageNumber.
  5. 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.
0

A da się bindować LIMIT ?

0

Da się, wykorzystując $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);.
Ewentualnie przynajmniej rzutuj na inty przed wplataniem do zapytania.

0

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.

0

Zauważyłem właśnie, że ostatnie dane z pierwszej strony przechodzą do następnej. Gdzie może być błąd?

1 użytkowników online, w tym zalogowanych: 0, gości: 1