• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Automatyczne paginacja strony wraz z wpisami na niej

Object Storage Arubacloud
0 głosów
518 wizyt
pytanie zadane 13 czerwca 2020 w PHP przez Bakkit Dyskutant (7,600 p.)
Witam.

Zrobiłem stronę, na którą dodaję sobie wpisy do działu aktualności. Strona to domena.pl/aktualnosci/1.

Teraz chciałbym zrobić, aby na domena.pl/aktualnosci/1 maksymalnie wyświetlało się np 5 wpisów. Reszta wpisów byłaby na domena.pl/aktualnosci/2, kolejne na domena.pl/aktualnosci/3 etc... Chciałem abyście mi podpowiedzieli jak takie coś mógłbym wykonać. Oczywiście można to robić ręcznie (tworzyć kolejne podstrony) ale interesuje mnie automatyczny sposób.

2 odpowiedzi

0 głosów
odpowiedź 13 czerwca 2020 przez Landu Stary wyjadacz (11,880 p.)
wybrane 14 czerwca 2020 przez Bakkit
 
Najlepsza
Zależy w jaki sposób zrobiłeś tą stronę. Najłatwiej będzie to zrobić w PHP, ale musisz też określić skąd będziesz pobierał te wpisy.
komentarz 13 czerwca 2020 przez Bakkit Dyskutant (7,600 p.)
Myślałem, że skoro dałem w dziale php to będzie to wiadome :D Wpisy tworzę w panelu zarządzania treścia, następnie są one dodawane do bazy mysql i potem pobierane z niej na stronie z aktualnościami.
1
komentarz 13 czerwca 2020 przez Landu Stary wyjadacz (11,880 p.)

Ogólnie to nie napiszę ci dokładnie jak to zrobić, ale mniej więcej ci to opiszę.

Pobierając wpisy z bazy danych, musisz posortować je od najnowszego do najstarszego. Musisz użyć także parametru LIMIT który określa jaki zakres rekordów uzyskać (np. LIMIT 10, 15 pominie pierwsze 10 rekordów i wybierze tylko rekordy 11-25). 

SELECT *
FROM wpisy
ORDER BY id
LIMIT 10, 15

Do sortowania warto użyć timestampa wpisów, a nie ID, ale to tylko przykład.

Potem w kodzie php sprawdzasz parametr GET z adresu, w którym będziesz przechowywał numer strony i na jego podstawie określasz w query do bazy jaki zakres wpisów chcesz uzyskać. Potem maskujesz adres news.php?page=2 za pomocą .htaccess i uzyskujesz aktualnosci/2

 

komentarz 13 czerwca 2020 przez Bakkit Dyskutant (7,600 p.)

Potem w kodzie php sprawdzasz parametr GET z adresu, w którym będziesz przechowywał numer strony i na jego podstawie określasz w query do bazy jaki zakres wpisów chcesz uzyskać. Potem maskujesz adres news.php?page=2 za pomocą .htaccess i uzyskujesz aktualnosci/2

 Dla mnie czarna magia... Mogłbyś bardziej wyjaśnić, na jakichś przykładach? Albo może ktoś inny? Z samych słów to ja dużo nie podziałam.

komentarz 13 czerwca 2020 przez Landu Stary wyjadacz (11,880 p.)

Jeżeli masz link np. example.com/news.php?page=2
to co jest po pytajniku, to jest zmienna przechowywana w linku. Możesz ją odczytać używając:

$variable = $_GET['page'];

W twoim przypadku w tej zmiennej przechowujesz numer strony z aktualnościami. Jeżeli zmienna 'page' będzie pusta lub będzie równa 1, oznacza to, że przeglądasz pierwszą stronę aktualności więc należy wysłać zapytanie do bazy danych o pierwsze 10 wpisów np.

SELECT *
FROM wpisy
ORDER BY id
LIMIT 0, 10

Baza zwróci ci pierwsze 10 newsów, a ty je wyświetlasz na stronie.

Jeżeli chciałbyś wyświetlić inne strony newsów, odczytujesz ze zmiennej 'page' numer danej strony i mnożysz numer strony * 10 i odejmujesz od tego 10 (zakładając że chcesz wyświetlić 10 postów). Wpisujesz te dane do parametru LIMIT i powiedzmy dla strony nr 5 uzyskujesz:
 

SELECT *
FROM wpisy
ORDER BY id
LIMIT 40, 10

 

Na prawdę nie mam pojęcia co ja mam więcej ci wytłumaczyć. Jeżeli tego nie rozumiesz, to znaczy, że musisz jeszcze się trochę podszkolić w PHP, żeby być w stanie pisać takie rzeczy. Nikt ci nie podsunie na tacy gotowego rozwiązania.

komentarz 13 czerwca 2020 przez Landu Stary wyjadacz (11,880 p.)
Jeszcze taka notka, żeby uzyskać zmienną w linku, wystarczy, że przekierujesz klienta za pomocą zwykłego linku w html <a href="news.php?page=2">.
komentarz 14 czerwca 2020 przez Bakkit Dyskutant (7,600 p.)
Dobra już wszystko rozumiem, dzięki.

A jeszcze tak z ciekawości zapytam czy w metodzie post też da się coś takiego stworzyć?
1
komentarz 14 czerwca 2020 przez Landu Stary wyjadacz (11,880 p.)
No niby można by było, ale nie ma to za bardzo sensu. Przyjmując, że użytkownik chciałby udostępnić link, to będzie to nie możliwe przy użyciu POST. Przy przełączaniu stron także musiałbyś albo robić formularze, albo wysyłać post przez JS. Lepiej będzie jak po prostu zostaniesz przy GET. Jest to raczej najlepsze rozwiązenie.
+1 głos
odpowiedź 14 czerwca 2020 przez VBService Ekspert (253,420 p.)
edycja 14 czerwca 2020 przez VBService

.htaccess (Pewnie można go inaczej zapisać, nie będę się upierał)

RewriteEngine On

RewriteCond %{REQUEST_URI} ^aktualnosci/ [NC]
RewriteRule ^aktualnosci/([0-9]+)/?$ /news.php?page=$1

news.php (Taka moja lużna propozycja)

<?php

    if (isset($_GET['page'])) {
        $page = $_GET['page'];
        if(!is_numeric($page) || $page <= 0) $page = 1;
    } else {
        $page = 1;
    }

    $news_per_page = 5;
    $offset = ($page-1) * $news_per_page;

    $conn = new mysqli("localhost","root","pass","test");
    if ($conn->connect_error) {
        die("<br><br><b>Bład połączenia z bazą danych</b></br>");
    }

    $news_to_display = true;
    $sql = "SELECT COUNT(*) AS c_rows FROM news";
    $result = $conn->query($sql);

    if ($result->num_rows > 0) {
        $row = $result->fetch_assoc();
        $total_news = $row['c_rows'];

        if(is_numeric($total_news) && $total_news > 0) {
            $total_pages = ceil($total_news / $news_per_page);

            $sql = "SELECT n.imie, n.data_dodania FROM news AS n "
                  ."ORDER BY n.data_dodania DESC LIMIT $offset, $news_per_page";
            $result = $conn->query($sql);

            if ($result->num_rows > 0) {
                ob_start();
                while($row =  $result->fetch_assoc()) {
                    $create_data = date_create($row["data_dodania"]);

?>

    <div class="news_wrapp">
        <h1>Artykuł</h1>
        <p>
            <span class="news_autor">Autor: <?=$row["imie"]?></span>
            <span class="news_data_dodania">Data dodania: <?=date_format($create_data, "Y-m-d H:i")?></span>
        </p>
        <p class="news_content">
            <a href="https://pl.lipsum.com/" target="_blank">Lore ipsum generator</a> Duis nec ex libero. Cras ac
            fringilla fermentum, tortor ex ullamcorper velit, ut mollis sapien ipsum et nibh.
            Aliquam nec mi ac metus commodo dapibus nec ac augue. Nunc condimentum volutpat nisi.
            Vivamus aliquam molestie ullamcorper. Nulla elementum arcu vitae maximus bibendum.
            Sed eget mi a dolor eleifend rhoncus. Pellentesque pulvinar, dui luctus eleifend
            vestibulum, massa ligula eleifend nisi, vitae facilisis ipsum sem eget orci. Cras magna
            tellus, tempor sit amet massa id, elementum placerat felis. Suspendisse auctor lobortis
            condimentum. Vivamus viverra risus vel enim convallis ultrices.
        </p>
    </div>

<?php
                } // while($row =  $result->fetch_assoc())

                $news_html = ob_get_clean();
            } else {
                $news_to_display = false;
                $news_html = "<div class='no_news_wrapp'>Brak artykułów</div>";
            }
        } else { // if(is_numeric($total_news) && $total_news > 0)
            $news_to_display = false;
            $news_html = "<div class='no_news_wrapp'>Brak artykułów</div>";
        }
    } else { // if ($result->num_rows > 0)
        $news_to_display = false;
        $news_html = "<div class='no_news_wrapp'>Brak artykułów</div>";
    }

    $conn->close();
?>

<html lang="pl">
<head>
    <meta charset="utf-8">
</head>

<style>
body {
    margin: 0px;
    padding: 0px;
}
.no_news_wrapp {
    font-weight: bold;
    color: tomato;
}
.news_container {
    width: 1000px;
    margin-left: auto;
    margin-right: auto;
    margin-top: 20px;
    background-color: aliceblue;
    padding: 10px;
    color: black;
    font-family: Arial;
    font-size: 14px;
}
.news_container .pagination {
    text-align: center;
}
.news_wrapp {
    margin-bottom: 40px;
}
.news_wrapp h1 {
    letter-spacing: 1px;
    margin-bottom: 0px;
}
.news_autor {
    margin-right: 40px;
    font-size: 12px;
}
.news_data_dodania {
    font-size: 12px;
}
.pagination {
    display: inline-block;
    border: 0px;
}
.pagination a {
    width: auto;
    color: black;
    float: left;
    padding: 5px 10px;
    font-size: 12px;
    text-decoration: none;
    font-variant: small-caps;
    transition: color 0.4s;
}
.pagination a.curren_page {
    cursor: default;
    width: auto;
}
.pagination a:hover {
    color: royalblue;
    transition: color 0.4s;
}
.pagination a:active {
    transform: translateY(2px);
}
</style>

<body>
    <div class="news_container">
        <?=$news_html?>

<?php
    if($news_to_display) {
        $prev_href = ($page <= 1 ? "/aktualnosci/1" : "/aktualnosci/".($page - 1));
        $next_href = ($page >= $total_pages ? "/aktualnosci/".$total_pages : "/aktualnosci/".($page + 1));
        $last_href = "/aktualnosci/".$total_pages;
?>

        <div class="pagination">
            <a href="/aktualnosci/1">Pierwsza</a>
            <a href="<?=$prev_href?>">Poprzednia</a>
            <a class="curren_page"><?=$page?></a>
            <a href="<?=$next_href?>">Następna</a>
            <a href="<?=$last_href?>">Ostatnia</a>
        </div>
<?php } ?>
    </div><!-- <div class="news_container"> -->
</body>
</html>

mod_rewrite mysqli connect() css pagination

Podobne pytania

0 głosów
1 odpowiedź 163 wizyt
pytanie zadane 6 maja 2019 w PHP przez Whereismycode Obywatel (1,710 p.)
0 głosów
0 odpowiedzi 254 wizyt
pytanie zadane 8 grudnia 2018 w PHP przez niezalogowany
0 głosów
0 odpowiedzi 183 wizyt
pytanie zadane 3 lutego 2018 w PHP przez mi-20 Stary wyjadacz (13,190 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...