PHP stronicowanie treście

Macie jakieś gotowe biblioteki/klasy do obsługi stronicowania dużej ilości pobieranych danych z mysql? Chodzi o to, aby na stronie wyświetliło się 20 rekordów, a pod spodem: [1] 2 3 4 5 6 .... 15 >>

Ostatnio borykam się z tym problemem. A kod napisany przeze mnie jest bardzo nieoptymalny i chaotyczny.

  • No to wszystko jasne (w kontekście tej wypowiedzi). Składni PHP nie chcę kaleczyć, bo nie programowałem w tym wynalazku od lat, więc zapiszę Ci w pseudokodzie. Mogą być jakieś drobne błędy logiczne bo nigdzie tego nie sprawdzałem, ale to sobie raz-dwa poprawisz.

    const MAX_VISIBLE = 9; // liczba max. widocznych linków do stron 
    total_pages = 15;  // wiadomo, to będziesz miała z bazy
    current_page = 5; // a to z URL-a
    showStartDots = true;
    showEndDots = true;
    
    start = current_page - (MAX_VISIBLE \ 2); // dzielenie całkowite
    end = current_page + (MAX_VISIBLE \ 2);
    if(start <= 1) {
      start = 1;
      showStartDots = false;
    }
    else {
      start += 1;
    }
    
    if(end >= total_pages) {
      end = total_pages;
      showEndDots = false;
    }
    else {
      end -= 1;
    }
    
    for(i = start; i <= end; i++){
      if (i == start && showStartDots) {
        // wyswietl link do strony 1 a potem trzy kropki
      }
    
      // wyswietl link do strony i
    
      if(i == end && showEndDots) {
        // wyswietl trzy kropki a potem link do strony total_pages
      }
    }
    

  • Gotowych rozwiązań jest pełno w Internecie, razem z wytłumaczeniem. Coś czego szukasz nazywa się "Pagination".

    Google - pagination php mysql

  • Biblioteka? do tego? daj spokój ;-)

    Dopiero co było zadane pytanie odnośnie ilości pobranych danych, może Ci się przydać. Pobierzesz sobie ilość, podzielisz to przez ilość 'artykułów' na stronę i dla każdej cyferki wygenerujesz adres http://twoja_strona.domena/art.php?page=
    gdzie będzie kolejno 1,2,3 itd.
    Oczywiście możesz wygenerować tylko najbliższe temu strony.

    w podanym pliku art.php pobierzesz stronę która ma się wyświetlić i zwrócisz odpowiednie artykuły.

  • Nie wiem co to jest "stronnicowanie treście", ale "ania" to kolejne multikonto!! W ciągu ostatnich kilku godzin pojawiło się co najmniej kilka nowych kont, i każdy nagle zadaje pytanie.

  • Wolałabym coś po polsku. Polskie wyniki wyszukiwania nie zwracają jakichś ciekawych materiałów.

    @bronek - to rozwiązanie co podałeś nijak ma się do "programowania". takie rzeczy powinny robić się automatycznie. Jak bede miec 10000 wyników i będę chciała je podzielić po 20 na stronę to mam ręcznie wstawiać 500 linków na stronę? to się mija z celem.

    Linki typu Dalej, Wstecz też potrafię zrobić. Ale wolałabym, aby było coś w stylu:

    1 .... 2 3 4 [5] 6 7 8 ... 15

    Czyli pierwsza strona, potem 6 stron w ogoło tej wybranej (w przypadku powyzej nr 5), a potem znowu koncowa wartosc. Dość zagmatwanie wygląda mój kod, stąd moje pytanie o jakąś bibliotekę do tego :P

  • W prezentowanym kodzie użyłeś takiego formatowania, że na końcu listy są dwa nawiasy trójkątne. Czy one oznaczają ostatnią stronę? Ja wolę stosować ostatnią liczbę jako liczbę ostatniej strony i pierwszą jako pierwszej coś w stylu:

    1 ... 67 68 69 70 71 [72] 73 74 75 76 77 ... 1010

    Łatwo można dostać się do pierwszej i ostatniej pozycji na liście.

    Przy okazji uwaga : jeżeli użytkownik nie ma możliwości takiego przefiltrowania listy, aby miała ona więcej niż 10 podstron to według mnie trzeba przemyśleć jeszcze raz projekt aplikacji/strony i zastanowić się jak uczynić życie użytkownika mniej nieszczęśliwym.

    W każdym bądź razie oto kod który napisałem w PHP. Aczkolwiek mogły wkraść się jakieś błędy bo nie mam pod ręką kompilatora. Aczkolwiek dołożyłem starań żeby tak się nie stało.

    $wybranaStrona = (int) $_GET['strona'];
    
    //Jakie wiersze trzeba pobrac?
    $liczbaNaStrone = 20;
    $liczbaLiczbNaLewoIPrawo = 5;
    
    $pierwszyWiersz = $wybranaStrona * $liczbaNaStrone;
    $ostatniWiersz = ($wybranaStrona + 1) * $liczbaNaStrone - 1;
    
    //Pobieranie danych tylko te ktore chcesz wyswietlic (optymalizacja)
    $AliczbaWierszy = dbquery("SELECT COUNT(*) LICZBA FROM TABELA");
    $liczbaWierszy = dbarray($AliczbaWierszy)['LICZBA'];
    $liczbaStron = $liczbaWierszy / $liczbaNaStrone;
    $wiersze = dbquery("SELECT id, tresc FROM TABELA LIMIT $pierwszyWiersz, $liczbaWierszy");
    
    //Wyswietlenie wierszy
    while ($wiersz = dbarray($wiersze))
    {
        echo $wiersz['id'] . " " . $wiersz['tresc'];
        echo "<br>";
    }
    
    //Wyswietlenie liczb
    $lastWasADot = false;
    for ($i = 0; $i < $liczbaStron; $i++)
    {
      if ($i != 0 && $i != $liczbaStron - 1 && abs($i - $wybranaStrona) > $liczbaLiczbNaLewoIPrawo) 
      {
         if (!lastWasADot)
         {
            echo " ... ";
            $lastWasADot = true;       
         }
      }
      else
      {
         $lastWasADot = false;
         if ($wybranaStrona != $i)
         {
           echo " <a href='?strona=$i'>$i</a> ";
         }
         else
         {
           echo " <a href='?strona=$i'>[$i]</a> ";
         }
      }
    }
    

  • Polecam Ci pobranie FrameWorka z gotowymi tego typu klasami, w razie czego szukaj pod zapytaniem "Pager Class".

  • Kopnąłem się trochę po necie, i TA-DAM po polsku artykuł, ale polecił bym zapoznanie się z tym co zaproponował 'michu' ;-)

  • Witam, jak się dzisiaj czujesz? Mam nadzieję, że wszystko jest dobrze. Nazywam się na stałym poziomie. W poszukiwaniu człowieka, który rozumie znaczenie miłości, zaufania i wiary w siebie, a nie ten, kto widzi miłość jako jedyny sposób zabawy, ale dojrzały człowiek z Nicei wizję tego, co na świecie jest wszystko o, a po przeczytaniu profilu tutaj () I wziął interes w ciebie, więc zarzuty odpowiedź mi w tym e-mail (constantduke10@hotmail.com. Będę bardzo szczęśliwy, aby przeczytać odpowiedzi tak, że ja wysłać moje zdjęcie dla Ciebie możemy wówczas zacząć wiedzieć więcej o sobie nawzajem. Dziękuję za przeczytanie mojego maila i być Bless.

    stałej (constantduke10@hotmail.com))

    Hello, how are you doing today? i hope all is well. My name is constant., In search of a man who understand the meaning of love as Trust and faith in each other rather than one who sees love as the only way of fun, but a matured Man with Nice Vision of what the world is all about, and after reading your profile here in( ) I took Interest in you, so pleas reply me with this Email (constantduke10@hotmail.com. i will be very happy to read your reply so that i will send my picture to you then we can start know more about each other. Thanks for reading my mail and be Bless.

    constant (constantduke10@hotmail.com))

Zaloguj się, aby dodać swoją odpowiedź