Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Jak rozwiązać problem pustej ostatniej strony Paginacji
Forum PHP.pl > Forum > Przedszkole
darney
Na samym początku limit ustaliłem na 6
  1. define('ILOSC_WYNIKOW_NA_STRONIE', 6)


Wpisów w bazie 18. Mam 4 pustą stronę paginacyjną. Jeśli dodam do bazy kolejny wpis to już wcześniej pusta strona będzie zawierała 19 rekord z bazy.

Co powinienem zmienić, aby przy 6 , 12 , 18 wpisie przy osiągniętej równej liczbie limitu nie pokazywał mi skrypt pustej ostatniej strony strony.

Korzystam z poniższego skryptu.

  1.  
  2. $SQL = "SELECT SQL_CALC_FOUND_ROWS *
  3. FROM lesson_inn
  4. ORDER BY id
  5. LIMIT ".mysql_escape_string((int)$_GET['porcja']*ILOSC_WYNIKOW_NA_STRONIE).",".ILOSC_WYNIKOW_NA_STRONIE;
  6. // pobiera ILOSC_NA_STRONIE rekordów z bazy, sortując wg daty rosnąco, zaczynając od $_GET['porcja']*ILOSC_NA_STRONIE
  7. $RES = mysql_query($SQL); // wykonujemy zapytanie
  8. while($AFR = mysql_fetch_assoc($RES)){
  9. /*Wyświetlanie wyników, przykładowo:*/
  10. echo 'tytuł: '.$AFR['category'].'<br />';
  11. }
  12.  
  13. // w inny sposób pobieramy ilosc danych w bazie
  14. $SQL = "SELECT FOUND_ROWS() as Ilosc";
  15. $RES= mysql_query($SQL);
  16. list($iloscWpisow) = mysql_fetch_row($RES);
  17.  
  18. //Teraz wypadało by wyświetlić jakąś nawigację
  19.  
  20. //jeśli nie jesteśmy na pierwszej stronie
  21. if($_GET['porcja']>0){
  22. //wyswietlamy link do poprzedniej strony
  23. echo '<a href="?porcja='.($_GET['porcja']-1).'">Poprzednie</a> ';
  24. }
  25.  
  26. for($i = 0;$i<=floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++){
  27. echo '<a href="?porcja='.($i).'">[ '.($i+1).' ]</a> ';
  28. }
  29. //jeśli nie jesteśmy na ostatniej stronie
  30. if($_GET['porcja']<floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE)){
  31. //wyświetlamy link do nastepnej strony
  32. echo ' <a href="?porcja='.($_GET['porcja']+1).'">następne</a>';
  33. }
potreb
  1. for($i = 1;$i<=floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++){


smile.gif
darney
Niestety tak też próbowałem. Dodanie liczny 1 likwiduję mi 1 stronę a ostatnia dalej zostaje pusta
Wicepsik
  1. for($i = 0;$i<=floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE)-1;$i++){
darney
z odjęciem 1 także próbowałem. 4 strona pusta znika lecz skrypt wyświetla mi tylko 18 pozycji z bazy. Więcej nie chce wyświetlić po dodaniu nowych rekordów.
eurosoft
a próbowałeś zamiast floor podstawić ceil ?
thek
Primo - nie $i<= ale $i <
Secundo - ceil, a nie floor
darney
Super działa : ) Jeszcze tylko aktywna Porcja pogrubiona bez linku i będę spełniony. ; )
thek
  1. for($i = 0;$i<ceil($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++)
To jest bardzo niewydajne. W każdym przebiegu pętli liczysz i zaokrąglasz! Policz to przed pętlą.

Co do pogrubienia aktualnego to w pętli for sprawdzaj IFem indeksy aż trafisz na właściwy dla aktualnej strony. Zgadnij ile on będzie wynosił i sprawdź.

PS: Na Twoim miejscu jednak bym ograniczył zakres pętli FOR. Jeśli będziesz miał w paginacji 40-50 stron to stronę sobie rozwalisz paginacją. Ogranicz sobie liczbę stron po obu stronach od aktualnej. Czyli coś w stylu:
  1. $zakres_dolny = ( ( $aktualna - $zakres ) > 0 ? $aktualna - $zakres : 0 );
  2. $zakres_gorny = ( ( $aktualna + $zakres ) < $ileStron ? $aktualna + $zakres : $ileStron );

i pętlę przekształć do
  1. for($i = $zakres_dolny;$i<$zakres_gorny;$i++)
by uzyskać to o co wiele osób już tu na forum prosiło, czyli tylko X stron odległych od aktualnej od aktualnej.
darney
indeksy czyli ID w bazie? czy jak? bo troszeczkę nie bardzo rozumiem.
thek
Indeksy w tym wypadku to Twój licznik pętli, czyli $i smile.gif Zapomniałem tylko zgadnij ując w ", bo on jest prosty do wyliczenia, a nie do zgadywania winksmiley.jpg
darney
Jak prawidłowo powinno wyglądać zapytanie czy $i = czemu ?
thek
Weź zostaw swój kod jak jest z tym ceil, a w dotychczasowym for zrób wewnątrz IF sprawdzający czy obecny $i jest równe stronie aktualnej. Jeśli to będzie działało, to dopiero zajmij się później zakresami o jakich wspomniałem w swoim poście.
darney
W porządku tylko jak brzmi zapytanie do aktualnej strony. Nie mogę sobie tego wyobrazić jak wewnątrz

  1. for($i = 0;$i<ceil($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++) {
  2.  
  3. echo '<a href="?porcja='.($i). '">[ '.($i+1).' ]</a> ';
  4. }
zmienna $i przyrównać do $i ?
thek
A $_GET['porcja'] to niby co jest? Nie odpowiednik strony aktualnej? winksmiley.jpg Kombinuj... Kombinuj smile.gif
darney
Jee wykombinowałem i działa ; ) Mega dźwięczny jestem : )
  1. for($i = 0;$i<ceil($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++) {
  2.  
  3. if ($_GET['porcja'] == $i) {
  4. echo $i+1;
  5. }
  6. else{
  7. echo '<a href="?porcja='.($i). '">[ '.($i+1).' ]</a> ';
  8. }
  9. }


Jeszcze ostatnia rzecz i będę już naprawdę zaspokojony : ) . Bo planuję żeby na początku listy paginacyjnej i na końcu poprzednia i następna nie znikała tylko link się wyłączał.
thek
To wykrywaj czy aktualna strona jest pierwsza bądź ostatnia. Jesli tak - wywal otaczający owe wyrazy znacznik A, lub inaczej mówiąc zrób sprawdzenie, dzięki ktoremu raz owe wyrazy będa miały link, a innym razem nie. To kolejne IFy i nic więcej.
darney
Dziękuję za pomoc będę próbował.

Udało się.

  1. if($_GET['porcja']>0){
  2. //wyswietlamy link do poprzedniej strony
  3. echo '<a href="?porcja='.($_GET['porcja']-1).'">Poprzednie</a> ';
  4. }
  5. else {
  6. echo 'nie ma wstecz ';
  7. }
  8.  
  9. for($i = 0;$i<ceil($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE);$i++) {
  10.  
  11. if ($_GET['porcja'] == $i) {
  12. echo $i+1;
  13. }
  14. else{
  15. echo '<a href="?porcja='.($i). '">[ '.($i+1).' ]</a> ';
  16. }
  17. }
  18.  
  19. //jeśli nie jesteśmy na ostatniej stronie
  20. if($_GET['porcja']<floor($iloscWpisow/ILOSC_WYNIKOW_NA_STRONIE)){
  21. //wyświetlamy link do nastepnej strony
  22. echo ' <a href="?porcja='.($_GET['porcja']+1).'">następne</a>';
  23. }
  24. else {
  25. echo ' nie ma dalej';
  26. }
  27.  
  28. ?>


Jeszcze raz wielkie dzięki smile.gif

Mam jeszcze zapytanie. Po najechaniu na link do strony [2] widzę link do 1 porcji po najechaniu na [3] widzę link 2 porcji. Zapewne jest na to sposób aby linki równały się wartości prezentującej numer strony. Próbowałem to zmienić już na samym początku i coś mi nie wychodzi.
thek
Można i owszem... Na stronę idzie normalna numeracja od 1 wzwyż(zarówno pokazywane liczby, jak i w linkach), ale po stronie skryptu sobie odejmujesz 1 i wtedy w kodzie masz od 0, tak jak Ci potrzebne do operacji.
darney
właśnie wydaję mi się że po stronie skryptu idzie od 0. Nie bardzo wiem w takim razie gdzie odjąć. Myślałem że wystarczy kombinacja z <a href="?porcja='.($i) lecz po odjęciu czy dodaniu sypie się wyświetlanie. Chyba nie bardzo rozumiem mechanizm działania.
thek
To pomyśl tak... Jako linki twórz od 1 wzwyż nie tylko numerki, ale także ustawiaj w ten sposób zmienną, którą przekazujesz do linku jako numerek. Na starcie skryptu odbieraj tę zmienną i pomniejszaj ją o 1 by numerowała się nie od 1, ale od 0. To cała filozofia smile.gif
darney
Nie wiem czy się dobrze zrozumieliśmy. Ja chce żeby numeracja stron numerowała się od 1 tak jest obecnie tylko linki chce od 1 mieć bo obecnie są od zero. Czy zwiększyć do 1 $_GET['porcja'] ? czy tylko linki i zmienna $i ?
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.