Bonjour !

Je bloque sur un système de pagination, je sais pas si je m'y prend correctement ou non. J'ai TROIS boucle while qui reprenne tous les posts de ma base de données.

La première récupère les 2 premier posts,
La seconde récupère les 6 posts suivant
Et la troisième récupère les 2 posts apès les 6 précédents.

Jusque là tous vas nickel mon design ressemble à ceci :

Le truc c'est que si on rajoute une pagination bah le compte est perdu.

Voici le code :

<?php
if(!isset($_GET['page'])) {
    $page = 1;
} else {
    $page = $_GET['page'];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// First Posts
// Query & Rules For Show posts
$max = 6;
$from = (($page * $max) - $max);
$query = "SELECT * FROM posts";
$total_results = mysqli_num_rows($connect->query($query));
if($page > 1) {
    $query=$query." LIMIT ".($from+$max+2).",2";
} else {
    $query=$query." LIMIT ".$from.",2";
}
$result = mysqli_query($connect,$query);
$i = 0;
// Show Posts.
echo '<div class="row">';
while ($val = mysqli_fetch_array($result)) {
    if($i%2 == 0) {
        echo '<div class="col s12 m8">';
    } else {
        echo '<div class="col s12 m4">';
    } echo '
        <div class="card small">
            <div class="card-image">
                <img src="assets/images/'.$val['image'].'">
                <span class="card-title">'.$val['title'].$val['id'].'</span>
            </div>
            <div class="card-content">
                <p>'.$val['content'].'</p>
            </div>
            <div class="card-action">';
                if(isset($_SESSION['admin'])) {
                    echo '
                    <a href="#">Edit</a>
                    <a href="#">Delete</a>
                    ';
                }
                else { echo '<a href="#">View More</a>'; } echo '
            </div>
        </div>
    </div>
    ';
    $i++;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Posts
// Query & Rules For Show posts
$query2 = "SELECT * FROM posts";
$total_results = mysqli_num_rows($connect->query($query2));
if($page > 1) {
    $query2=$query2." LIMIT ".($from+6).",".$max;
} else {
    $query2=$query2." LIMIT ".($from+2).",".$max;
}
$result2 = mysqli_query($connect, $query2);
$j = 0;
// Show Posts
while ($val2 = mysqli_fetch_array($result2)) {
    if($j%2 == 0) {
        if($j%3 == 0) {
            echo '<div class="col s12 m3">';
        } else {
            echo '<div class="col s12 m6">';
        }
    } else {
        echo '<div class="col s12 m3">';
    } echo '
        <div class="card small">
            <div class="card-image">
                <img src="assets/images/'.$val2['image'].'">
                <span class="card-title">'.$val2['title'].$val2['id'].'</span>
            </div>
            <div class="card-content">
                <p>'.$val2['content'].'</p>
            </div>
            <div class="card-action">';
                if(isset($_SESSION['admin'])) {
                    echo '
                    <a href="#">Edit</a>
                    <a href="#">Delete</a>
                    ';
                }
                else { echo '<a href="#">View More</a>'; } echo '
            </div>
        </div>
    </div>
    ';
    $j++;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Last Posts
// Query & Rules For Show posts
$last = $max - 4;
$query3 = "SELECT * FROM posts";
$total_results = mysqli_num_rows($connect->query($query3));
if($page > 1) {
    $query3=$query3." LIMIT ".($from+12).",2";
} else {
    $query3=$query3." LIMIT ".($from+8).",2";
}
$result3 = mysqli_query($connect, $query3);
$k = 0;
// Show Posts.
while ($val3 = mysqli_fetch_array($result3)) {
    if($k%2 == 0) {
        echo '<div class="col s12 m4">';
    } else {
        echo '<div class="col s12 m8">';
    } echo '
        <div class="card small">
            <div class="card-image">
                <img src="assets/images/'.$val3['image'].'">
                <span class="card-title">'.$val3['title'].$val3['id'].'</span>
            </div>
            <div class="card-content">
                <p>'.$val3['content'].'</p>
            </div>
            <div class="card-action">';
                if(isset($_SESSION['admin'])) {
                    echo '
                    <a href="#">Edit</a>
                    <a href="#">Delete</a>
                    ';
                }
                else { echo '<a href="#">View More</a>'; } echo '
            </div>
        </div>
    </div>
    ';
    $k++;
}
echo '<div>';
// PAGINATION.
$total_pages = ceil($total_results/$max);
echo '<ul class="pagination">';
if($page > 1) {
    $prev = $page - 1;
    echo '<li><a href="?page='.$prev.'"><i class="material-icons">chevron_left</i></a></li>';
}
for($p=1; $p < $total_pages; $p++) {
    if($p == $page) {
        echo '<li class="active"><a href="?page='.$p.'">'.$p.'</a></li>';
    } else {
        echo '<li><a href="?page='.$p.'">'.$p.'</a></li>';
    }
}
if($page < $total_pages) {
    $next = $page+1;
    echo '<li><a href="?page='.$next.'"><i class="material-icons">chevron_right</i></a></li>';
}
echo '</ul>';

Si vous pouvez m'orrienter sa serais fortement apprécié :-)
Merci.

PS: La structure dois resté la même sur toute les pages.

PS²: Première utilisation du forum donc si j'ai fais une erreur dans le post du code ou autre désolé ^^

8 réponses


betaWeb
Réponse acceptée

Pas de soucis, prends plutôt la solution des conditions dans la boucle ça sera plus "propre", et ça va vachement alléger ton code ! Et puis je pense qu'il n'y aura plus de soucis de pagination ;)

Jordan Massart
Auteur
Réponse acceptée

Et voilà le travail !
On va être honnête c'était de la luck j'en suis venu à try toute les combinaisons possible au 1 par 1;
Car je pige rien au modulo pour le "ciblage".
voici le code :

<?php
if(!isset($_GET['page'])) {
    $page = 1;
} else {
    $page = $_GET['page'];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// First Posts
// Query & Rules For Show posts
$max = 10;
$from = (($page * $max) - $max);
$query = "SELECT * FROM posts";
$total_results = mysqli_num_rows($connect->query($query));
$query=$query." LIMIT ".$from.",".$max;
$result = mysqli_query($connect,$query);
$i = 0;
// Show Posts.
echo '<div class="row">';
while ($val = mysqli_fetch_array($result)) {
    if($i%2 == 0) {
        if($i%3 == 0) {
            if($i%4 == 0) {
                echo '<div class="col s12 m8">';
            } else {
                echo '<div class="col s12 m3">';
            }
        } else {
            if($i%7 == 1) {
                echo '<div class="col s12 m4">';
            } else {
                echo '<div class="col s12 m3">';
            }
        }
    } else {
        if($i%4 == 3) {
            echo '<div class="col s12 m6">';
        } else {
            if($i%3 == 2) {
                echo '<div class="col s12 m3">';
            } else {
                if($i%3 == 0) {
                    echo '<div class="col s12 m8">';
                } else {
                    echo '<div class="col s12 m4">';
                }
            }
        }
    }
    echo '
        <div class="card small">
            <div class="card-image">
                <img src="assets/images/'.$val['image'].'">
                <span class="card-title">'.$val['title'].$val['id'].'</span>
            </div>
            <div class="card-content">
                <p>'.$val['content'].'</p>
            </div>
            <div class="card-action">';
                if(isset($_SESSION['admin'])) {
                    echo '
                    <a href="#">Edit</a>
                    <a href="#">Delete</a>
                    ';
                }
                else { echo '<a href="#">View More</a>'; } echo '
            </div>
        </div>
    </div>
    ';
    $i++;
}
echo '<div>';
// PAGINATION.
$total_pages = ceil($total_results/$max);
echo '<div class="col s12"><ul class="pagination">';
if($page > 1) {
    $prev = $page - 1;
    echo '<li><a href="?page='.$prev.'"><i class="material-icons">chevron_left</i></a></li>';
}
for($p=1; $p < $total_pages; $p++) {
    if($p == $page) {
        echo '<li class="active"><a href="?page='.$p.'">'.$p.'</a></li>';
    } else {
        echo '<li><a href="?page='.$p.'">'.$p.'</a></li>';
    }
}
if($page < $total_pages) {
    $next = $page+1;
    echo '<li><a href="?page='.$next.'"><i class="material-icons">chevron_right</i></a></li>';
}
echo '</ul></div>';

Alors je sais pas si y a une méthode plus rapide/simple (Si quelqu'un là connais je preneur pour des informations).
Merci @betaWeb pour les indications :)

Salut,

Je n'ai pas du tout compris ta problématique, quel est le problème ?

PS: Tu utilises le framework materializecss je me trompe ? ^^

@betaWeb
Le problème c'est que si je me trouve sur la page 2
sa donne ceci :

Si tu compare les deux screens tu vois qu'au changement de page la boucle 1 affiche 15 & 16 et non pas 11 & 12 (j'ai déjà testé plusieur solution mais sa reporte à chaque fois le problème à la page d'après)

et la même chose pour la boucle 2 elle compte pas juste par rapport à la boucle précédente.
et moi je voudrais que au changement de page tout reste correcte que tout soit numéroté dans l'ordre ^^

Et effectivement j'utilise bien materializecss :) (J'ai pas trop apprécié le MDL de google :p)

Je me posais aussi une autre question: Pourquoi fais-tu 3 boucles (et donc 3 requêtes) pour récupérer tes posts ?

Car avec une seule boucle effectivement je récupère bien le tout, mais mon design est changé.

Tu n'as pas besoin de faire 3 boucles pour ça, il te suffit soit de mettre des conditions dans ta boucle PHP afin de changer le HTML, ou encore cibler certains éléments via le CSS afin de les styliser différemment.
Je pense que la première solution serait la plus simple pour toi ;)

Oui, j'était justement occupé de creusé du coté des conditions dans la boucle ^^ mais j'avais pas du tout pensé au ciblage css :) Merci dès que j'ai la solution je viens vous tenir au courrant :)