Stronicowanie version 2
PHP, SQL 1 kwietnia 2009Postanowiłem poprawić swe stronicowanie. Dodać nową funkcje jaką jest pokazywanie na której stronie się znajdujemy.
Przechodząc od razu do kodu bez zbędnego owijania w bawełne:
| PHP | | copy code | | ? |
$ile_na_stronie = 20; // ilość wpisów na stronę |
if(empty($_GET['start'])) // sprawdzamy czy tablica super globalna $_GET jest pusta... |
{ |
$poczatek = 1; // ... jeśli tak podstawiamy domyślnie 1... |
$_GET['page'] = 1; // zaznaczenie domyslnie 1 strony |
} |
else |
{ |
$poczatek = mysql_escape_string($_GET['start']); // ... jeśli nie podstawiamy jej wartość (SQL Injection) |
} |
$sql = mysql_query("SELECT * FROM termin LIMIT $poczatek, $ile_na_stronie"); // pobieramy z tabeli rekordy (wiersze) i ustawiamy LIMIT, zmienna $poczatek mówi nam od jakiego rekordu zaczynamy wyświetlanie, natomiast zmienna $ile_na_strone pokazuje odpowiednią liczbę rekordów |
while ($row = mysql_fetch_array($sql)) |
{ |
//wyswietlamy jakies dane |
} |
$all = mysql_query("SELECT COUNT(*) FROM termin"); |
$ile = mysql_result($all, 0); // teraz zliczamy ile mamy wszystkich wierszy w bazie |
$next = $_GET['start'] + $ile_na_stronie; // ustawiamy wartość dla linku następny... |
$prev = $_GET['start'] - $ile_na_stronie; // ... i poprzedni |
if($ile > $ile_na_stronie) // sprawdzamy czy zmienne $ile jest większa od ilości danych wyświetlanych |
{ |
for($i=0 ; $i<ceil($ile/$ile_na_stronie) ; $i++) // zaokrąglamy ułamek do "góry" który otrzymaliśmy z podzielenia ilości wierszy przez ilość wyświetlanych na stronie |
{ |
$b = $i + 1; |
if ($_GET['page']==$b) //sprawdzamy. jeśli jest równe wyświetlamy z zaznaczeniem jeśli nie bez |
{ |
echo '<a href="ka.php?start='.($i*$ile_na_stronie).'&page='.($i+1).'">['.($i+1).']</a> | '; // wyświetlamy odpowiednie strony z zaznaczeniem |
} |
else |
{ |
echo '<a href="ka.php?start='.($i*$ile_na_stronie).'&page='.($i+1).'">'.($i+1).'</a> | '; // wyświetlamy odpowiednie strony bez zaznaczeniem |
} |
} |
if ($_GET['start'] == 0) // sprawdzamy jeśli strona w $_GET jest równa 0 ... |
{ |
echo '<a href="ka.php?start='.$next.'&page='.($_GET['page']+1).'">Następny ></a>'; // ... to wyświetlamy tylko link: Następny ... |
} |
elseif (($_GET['start'] > 0) && ($next < $ile)) // jeśli strona jest większa od 0 i zarazem następna stronę mniejsza od ilości... |
{ |
echo '<a href="ka.php?start='.$prev.'&page='.($_GET['page']-1).'">< Poprzedni</a> | '; // ... wyświetlamy linki Poprzedni i ... |
echo '<a href="ka.php?start='.$next.'&page='.($_GET['page']+1).'">Następny ></a>'; // ... Następny |
} |
elseif ($next > $ile) // jeśli natomiast następna strona jest większa od ilości danych ... |
{ |
echo '<a href="ka.php?start='.$prev.'&page='.($_GET['page']-1).'">< Poprzedni</a>'; // ... wyświetlamy tylko link Poprzedni |
} |
} |
8 kwietnia 2010 at 09:02
W skrypcie robisz 2 zapytania SQL, nie jest to dobre dla wydajności i zupełnie niepotrzebne, można to zrobić jednym zapytaniem w taki sposób:
$sql = mysql_query(„SELECT SQL_CALC_FOUND_ROWS * FROM termin LIMIT $poczatek, $ile_na_stronie”);
Teraz żeby dowiedzieć się ile masz rekordów w tabeli robisz zapytanie:
$wynik=mysql_fetch_assoc(@mysql_query(„SELECT FOUND_ROWS() as ile”));
Zapytanie to nie korzysta już z tabel tylko bierze dane z poprzedniego zapytania, wykonanie jest szybsze i polecane:)
Pobrane dane są w zmiennej $sql.
8 kwietnia 2010 at 09:27
ale w jaki sposób „bierze” te dane z poprzedniego zapytania? trzymając je w buforze?
jako że ten wpis był pisany dość dużo dawno zmieniło się troszkę. teraz podszedłbym do tego problemu troszkę inaczej, na pewnie w PostgreSQL, na pewno używając jakiejś napisanej funkcjonalności.
ps. Testowałem ową funkcję i okazało się że przy 1 mln rekordów nie ma wielkiej różnicy, niemniej sposób ciekawy.
22 czerwca 2010 at 11:29
Witam a jak przeksztalcic ten skrypt zeby wyswietlal taka forme wynikow:
<<>>
22 czerwca 2010 at 11:38
No musisz pozamieniać napisy: Następny i Poprzedni na odpowiednie znaki.
23 czerwca 2010 at 08:58
cos chyba zle sie wkleilo chodzi o:
1, 2 … 6, 7, 8 … 12, 13
jak jest duzo newsow
23 czerwca 2010 at 09:00
Więc mój algorytm nie realizuje takiego założenia, polecam Pager nopsor’a.