Først og fremmest bør du gå ud efter et sat page_id
Er dette enten ikke sat, 1 eller 0, så skal du have en værdi der starter på 1
Er det over 1, så skal dette ganges op med 5, og derefter minuses med 5, for at holde en logisk værdi
Ergo
- // Vi definerer lige samtidigt en variabel der holder på sidetallet.
- $page = is_int($_GET['page_id']) && $_GET['page_id'] > 1 ? $_GET['page_id'] : 1;
- $offset = $page > 1 ? $page * 5 - 5 : 0;
Derefter skal du så selecte og sætte en limit på dit offset, plus fem ekstra rækker
- // Jeg fraråder brugen af mysql API'et - dette er deprecated, og snart fjernet fra PHP. Benyt enten MySQLi eller PDO
- $query = mysql_query("SELECT * FROM `blog` ORDER BY `id` DESC LIMIT " . $offset . ", 5");
Der har du dit resultset - hvis ikke page_id er sat, ikke er af numerisk værdi, eller ikke er højere end 1, vil $offset være 0 (computere tæller som standard fra 0, ergo er dette 1, 2 = 1, 3 = 2. Dette er dog et helt andet emne, google det istedet). Hvis det er højere end 1, vil $offset ganges op med 5 og minuses med 5, så 2 = 5, 3 = 10, 4 = 15, 5 = 20.
Foruden dette, vil MySQL's LIMIT også hente de næste 5 forekomster (dette tal er menneskeligt at forstå. Det kan ikke blive simplere end at det reelt er de næste 5 resultater) - LIMITS stopper også eksekveringen af en query, når disse fem resultater er fundet, så det vil nedsætte ressourceforbruget.
Der fra kan vi så printe vores fem indlæg ud, vha. en løkke.
- while($row = mysql_fetch_array($query)) {
- echo $title . PHP_EOL;
- echo $post . PHP_EOL;
- echo $author . PHP_EOL;
- echo $date . PHP_EOL;
- echo "<hr />";
- }
Vi printer her de forskellige værdier ud, i en løkke af fem - dette burde være basal viden. Løkken stopper når $row returnerer FALSE, ergo når der ikke er flere rækker tilbage fra vores resultset.
Vi kan så hurtigt tælle hvor mange post's vi har i vores tabel, evt. med
- // Igen fraråder jeg brugen af mysql API'et. MySQLi og PDO har tilsvarende funktioner
- $countQuery = mysql_query("SELECT `id` FROM `blog`");
- $postSum = mysql_num_rows($countQuery);
Her har vi blot en sum af alle vores posts - denne skal vi kort bruge til at udregne hvor mange sider vi skal have.
Simpelt regnestykke udregner dette
- // Vi runder lige op til næste heltal, for at få reelle sider
- $pages = ceil($postSum / 5);
Vi kan så starte ud med at få smækket et "første side-link" og et "en side tilbage-link" ind, med følgende
- if($page > 1) {
- $prev = $page - 1;
- echo "<a href='?page_id=1'>«</a> ";
- echo "<a href='?page_id=" . $prev . "'>‹</a> ";
- }
Denne siger lidt sig selv - disse skal ikke vises, hvis vi er på første side.
Vi smækker så sidenumre ind
- // Denne indikerer hvor mange tal der skal vises på hver side af nuværende side
- $range = 3;
-
- for($x = $page - $range; $x <= $page + $range; $x++) {
- if($x > 0 && $x <= $pages) {
- if ($x == $page) {
- echo "[<b>" . $x . "</b>] ";
- } else {
- echo "<a href='?page_id=" . $x . "'>" . $x . "</a> ";
- }
- }
- }
Dette stykke handler simpelt om at der kun skal vises positive numre, samt ikke flere sider end der findes. Den starter med at sætte en midlertidig variabel, der holder en værdi af den nuværende side minus vores range. Dette loop, kører ind til denne værdi er vores nuværende side plus vores range (ergo vil der som scriptet ser ud nu, blive vist maksimalt 7 sider. Hver gang loopet har kørt en omgang, vil vores midlertidige variabel stige med en. Den vil kun spytte et tal (omkranset af [ og ]) ud på siden, hvis dette er større end 0, samt ikke overgår summen af vores sider
Vi skal også have samme effekt, med næste side, samt sidste side på den anden side, så lad os da få dette smækket på.
- if($page != $pages) {
- $next = $page + 1;
- echo "<a href='?page_id=" . $next . "'>›</a> ";
- echo "<a href='?page_id=" . $pages . "'>»</a> ";
- }
Dette burde give sig selv, eftersom det egentlig er nogenlunde samme kode som tidligere.
Dette indlæg burde gerne give en idé om hvordan man kan vise flere blog-indlæg på en side, og samtidigt tilknytte en pagination.
Det fulde script kan ses i følgende kodeboks.
- <?php
-
- // Vi definerer lige samtidigt en variabel der holder på sidetallet.
- $page = is_int($_GET['page_id']) && $_GET['page_id'] > 1 ? $_GET['page_id'] : 1;
- $offset = $page > 1 ? $page * 5 - 5 : 0;
-
- // Jeg fraråder brugen af mysql API'et - dette er deprecated, og snart fjernet fra PHP. Benyt enten MySQLi eller PDO
- $query = mysql_query("SELECT * FROM `blog` ORDER BY `id` DESC LIMIT " . $offset . ", 5");
-
- while($row = mysql_fetch_array($query)) {
- echo $title . PHP_EOL;
- echo $post . PHP_EOL;
- echo $author . PHP_EOL;
- echo $date . PHP_EOL;
- echo "<hr />";
- }
-
- // Igen fraråder jeg brugen af mysql API'et. MySQLi og PDO har tilsvarende funktioner
- $countQuery = mysql_query("SELECT `id` FROM `blog`");
- $postSum = mysql_num_rows($countQuery);
-
- // Vi runder lige op til næste heltal, for at få reelle sider
- $pages = ceil($postSum / 5);
-
- if($page > 1) {
- $prev = $page - 1;
- echo "<a href='?page_id=1'>«</a> ";
- echo "<a href='?page_id=" . $prev . "'>‹</a> ";
- }
-
- // Denne indikerer hvor mange tal der skal vises på hver side af nuværende side
- $range = 3;
-
- for($x = $page - $range; $x <= $page + $range; $x++) {
- if($x > 0 && $x <= $pages) {
- if ($x == $page) {
- echo "[<b>" . $x . "</b>] ";
- } else {
- echo "<a href='?page_id=" . $x . "'>" . $x . "</a> ";
- }
- }
- }
-
- if($page != $pages) {
- $next = $page + 1;
- echo "<a href='?page_id=" . $next . "'>›</a> ";
- echo "<a href='?page_id=" . $pages . "'>»</a> ";
- }
-
- ?>
OBS: dette er utestet, men burde gerne fungere (med tilsvarende tabel). I tilfælde af at det ikke gør, giver det i hvert fald en idé om hvordan det bør sættes op.
Indlæg senest redigeret d. 22.11.2013 03:10 af Bruger #17260