Créer une pagination en PHP avec MySQL et Bootstrap
Sommaire
- 1- Objectifs
- 2- Présentation
- 3- Caractéristiques d'une pagination avec Bootstrap
- 4- Créer une pagination dans une application PHP avec Bootstrap
- 4.1- La pagination coté MySql
- 4.1.1- La clause LIMIT de MySQL
- 4.1.2- Syntaxe:
- 4.2- La pagination coté PHP
- 4.2.1- Spécifier le nombre de lignes à afficher par page
- 4.2.2- Calculer le nombre total de pages avec une limite dynamique
- 4.2.3- Numéroter les pages
- 4.2.4- Mise en place de la pagination avec PHP
- 5- Exemple
- 6- Application
- 6.1- Énoncé
- 6.2- Solution
- 6.2.1- Cours PHP
Créer une pagination en PHP avec MySQL et Bootstrap
-
Objectifs
- Être capable de réaliser une pagination en PHP avec MySQL et Bootstrap
-
Présentation
- Dans ce tutoriel, nous allons créer une pagination avec PHP et MySql . Il est probablement possible qu’une requête SQL SELECT renvoie des résultats d’enregistrements qui rends la lecture de la page web lourd. Nous pouvons donc diviser ce résultat en plusieurs pages.
- La pagination sert à afficher tous les résultats récupérés sur plusieurs pages au lieu de les afficher tous sur une seule page.
- La pagination est une liste non ordonnée HTML qui est gérée par Bootstrap(pour plus d’information sur ce sujet visitez la page suivante) comme beaucoup d’autres éléments d’interface
- La pagination bootstrap est un composant utilisé pour indiquer l’existence d’une série de contenus liés sur plusieurs pages et permet la navigation entre elles.
- Par exemple si vous écrivez une requête de recherche dans la barre d’outils de recherche Google. Vous voyez la liste numérique avec les liens précédents et suivants tout en bas de votre écran.
- En réalité le résultat de votre recherche comprend des milliers ou des millions de lignes, Google décompose le résultats dans un ensemble de données plus petit pour vous montrer les résultats de manière plus précise. Cela vous permet de parcourir rapidement les informations que vous recherchez. C’est ce qu’on appelle la pagination.
-
Caractéristiques d’une pagination avec Bootstrap
- Pour pouvoir paginer, il nous faut connaître plusieurs informations :
- Un bouton précédent dans la pagination pour revenir en arrière.
- Un bouton suivant dans la pagination pour avancer.
- Il faut désactivez le bouton précédent lorsque vous atteignez le premier élément de la pagination.
- Il faut désactiver le bouton suivant lorsque le dernier élément de la pagination est atteint.
- Le numéro de la page sur laquelle on se trouve , pour le faire ajouter une classe active dans la pagination pour définir l’état actif.
- Définir une limite dynamique pour les éléments de pagination via la liste déroulante de la sélection.
- Définir une session pour sauvegarder la limite de pagination.
-
Créer une pagination dans une application PHP avec Bootstrap
- Calculer le nombre total d’éléments et le nombre de pages :
- Utilisez une requête SQL pour obtenir le nombre total d’éléments dans votre base de données.
- Calculez le nombre total de pages en divisant le nombre total d’éléments par le nombre d’éléments que vous souhaitez afficher par page. Utilisez la fonction
ceil()
pour arrondir le résultat à l’entier supérieur. - Définir le nombre d’éléments à afficher par page :
- Déterminez le nombre d’éléments que vous souhaitez afficher par page dans votre application.
- Récupérer les éléments de la page actuelle :
- Utilisez la clause LIMIT dans votre requête SQL pour récupérer uniquement les éléments de la page actuelle.
- Calculez l’offset nécessaire pour paginer les résultats correctement.
- Afficher la pagination :
- Utilisez une boucle pour générer les liens de pagination.
- Pour chaque lien, générez un élément <li> avec un lien <a> pointant vers la page correspondante.
- Si la page actuelle correspond à la page du lien, ajoutez la classe active à l’élément
- pour le mettre en surbrillance.
- Gérer la navigation entre les pages :
- Lorsque l’utilisateur clique sur un lien de pagination, votre application doit afficher les éléments de la page correspondante en utilisant le paramètre de requête $_GET[‘page’].
- Style de la pagination :
- Utilisez les classes CSS de Bootstrap pour styliser votre pagination selon vos préférences.
- Assurez-vous de mettre en surbrillance visuellement la page active pour indiquer à l’utilisateur sur quelle page il se trouve.
-
La pagination coté MySql
-
La clause LIMIT de MySQL
- La clause
LIMIT
est utilisée dans l’instructionSELECT
pour contraindre le nombre de lignes à renvoyer. - La clause
LIMIT
accepte un ou deux arguments. Les valeurs des deux arguments doivent être zéro ou des entiers positifs. -
Syntaxe:
-
La pagination coté PHP
-
Spécifier le nombre de lignes à afficher par page
- Pour spécifier le nombre de lignes à afficher par page nous proposons une liste déroulante qui sera rempli à partir d’un tableau avec les nombres [5,7,10,12]
-
Calculer le nombre total de pages avec une limite dynamique
- Pour connaître le nombre total de page il faut connaitre le nombre d’enregistrement à a afficher
- Pour connaître le nombre d’enregistrement dans notre base de données, nous utiliserons le «
COUNT
» en SQL au moyen de la requête ci-dessous SELECT COUNT(*) AS nbre_enregistrement FROM `nom_table`;
- Pour exécuter cette requête nous utiliserons le code PHP suivant :
- Une fois le nombre total d’enregistrement est connu, nous pourrons calculer le nombre de pages nécessaires.
- Nous diviserons le nombre total d’enregistrement par le nombre de ligne à afficher par page et nous arrondirons à l’entier supérieur.
- La fonction
ceil()
de PHP arrondit le nombre à l’entier le plus proche. - Exemple:
-
Numéroter les pages
- Pour obtenir le numéro de la page actuelle, passer le numéro de la page dans l’URL à l’aide de
$_GET
, afin de pouvoir récupérer l’information en PHP. - Si aucun numéro de page n’est fourni, nous considérerons que nous sommes en page 1.
- Le code PHP sera le suivant:
-
Mise en place de la pagination avec PHP
- Maintenant nous créons la pagination et affichons le résultat en fonction de la limitation des données. Un utilisateur peut aller en arrière et en avant en utilisant la pagination, voir la classe Bootstrap active pour la page en cours.
-
Exemple
-
Application
-
Énoncé
- Buts généraux
- Notre but est de créer un système de pagination pour afficher la liste des apprenants de notre école.
- Jusqu’à maintenant, nous affichions la liste des apprenants de notre école sur une seule page.
- Vu le nombre important des apprenants, cela devient impossible et le système doit être automatisé.
- Notre système devra en plus nous permettre de changer facilement le nombre des apprenants affichés par page.
- Table à utiliser
- Pour notre application, nous allons utiliser la table apprenant suivant:
- Utiliser Bootstrap
- Créer une pagination à l’aide du composant d’interface utilisateur de pagination Bootstrap, pour plus d’informations visitez la page suivante Pagination avec Bootstrap
- Utiliser la bibliothèque Bootstrap pour créer la mise en page du tableau et de la pagination afin d’afficher la liste de tous les apprenants.
- Implémenter la pagination avec PHP
- Compter tous les apprenants contenus dans la table apprenants.
- Compter le nombre de pages
- Afficher le liste des apprenants correspondant à la page actuelle
-
Solution
SELECT
select_list
FROM
table_name
LIMIT [offset,] row_count;
$limitLignesPage = isset($_SESSION['nbrLignesAffiche']) ? $_SESSION['nbrLignesAffiche'] : 5;
// Obtenir le nombre total des enregistrements
$reqSql = "SELECT count(immatriculation) AS nbrLignes FROM voitures";
// On prépare la requête
$query = $connexion->prepare($reqSql);
// On exécute
$query->execute();
// On récupère le nombre d'enregistrements
$resultat = $query->fetch();
$toutesLignes = (int) $resultat['nbrLignes'];
// Calculer le nombre total de pages
$totoalPages = ceil($toutesLignes / $limitLignesPage);
<?php
echo ceil(4.3); // 5
echo ceil(9.999); // 10
echo ceil(-3.14); // -3
?>
// On détermine sur quelle page on se trouve
if(isset($_GET['page']) && !empty($_GET['page'])){
$currentPage = (int) strip_tags($_GET['page']);
}else{
$currentPage = 1;
}
// Calcul du nombre total d'éléments et le nombre de pages
$total_records = // récupérez le nombre total d'éléments dans votre base de données
$limit = 10; // nombre d'éléments à afficher par page
$total_pages = ceil($total_records / $limit);
// Récupérer la page actuelle à partir du paramètre de requête
$page = isset($_GET['page']) ? $_GET['page'] : 1;
// Calcul de l'offset pour récupérer les éléments de la page actuelle
$offset = ($page - 1) * $limit;
// Affichage de la pagination
echo "<ul class='pagination justify-content-center'>";
if ($page > 1) {
echo "<li class='page-item'><a class='page-link' href='?page=".($page - 1)."'>Précédent</a></li>";
}
for ($i = 1; $i <= $total_pages; $i++) {
$active_class = ($page == $i) ? 'active' : '';
echo "<li class='page-item ".$active_class."'><a class='page-link' href='?page=".$i."'>".$i."</a></li>";
}
if ($page < $total_pages) {
echo "<li class='page-item'><a class='page-link' href='?page=".($page + 1)."'>Suivant</a></li>";
}
echo "</ul>";
Afficher la solution
<?php
include('../header.php');
//set session
session_start();
if(isset($_POST['nbrLignesAafficher'])){
echo "eeee";
}
if(isset($_POST['nbrLignesAafficher'])){
echo "eeee".$_POST['nbrLignesAafficher'];
$_SESSION['nbrLignesAffiche']= $_POST['nbrLignesAafficher'];}
$limitLignesPage= isset($_SESSION['nbrLignesAffiche']) ? $_SESSION['nbrLignesAffiche']:5;
$page=(isset($_GET['page'])&& is_numeric($_GET['page'])) ? $_GET['page'] : 1;
$paginationStart = ($page - 1) * $limitLignesPage;
$stmt=$pdo-> query("SELECT * FROM apprenants a, gouvernorats g WHERE a.cdegouvernorat=g.cdegouvernorat LIMIT $paginationStart, $limitLignesPage")->fetchAll();
$reqSql ="SELECT count(*) AS nbrLignes FROM apprenants a, gouvernorats g WHERE a.cdegouvernorat=g.cdegouvernorat";
$query= $pdo->prepare($reqSql);
$query->execute();
$resultat= $query->fetch();
$toutesLignes = (int) $resultat['nbrLignes'];
$totoalPages= ceil($toutesLignes / $limitLignesPage);
$prec = $page - 1;
$suiv = $page + 1;
?>
<!--
<script>
$(document).ready(function(){
$('[data-toggle="tooltip"]').tooltip();
});
</script>
-->
<div class="container w-90">
<div class="row bb-4">
<div class="col-lg-10">
<a href="page_ajout_apprenant.php"><button class="btn btn-primary"> Ajouter un nouveau apprenant</button></a>
</div>
<div class="col-lg-2">
<!---------tableau---affichage----------->
<form id="formNbrLignes" action="#" method="post">
<select name="nbrLignesAafficher" id="nbrLignesAffiche" class="form-select">
<option disabled selected>Nbr Lignes</option>
<?php foreach([5,7,10,12] as $limitLignesPage) : ?>
<option
<?php if(isset($_SESSION['nbrLignesAffiche']) && $_SESSION['nbrLignesAffiche']== $limitLignesPage) echo 'selected'; ?>
value="<?= $limitLignesPage; ?>">
<?= $limitLignesPage; ?>
</option>
<?php endforeach; ?>
</select>
</form>
</div>
<div class="card border-primary mb-3" style="border-width: 2px;">
<div class="card-header">
<nav class="navbar navbar-light">
<h2>Gestion des apprenants</h2>
<form class="form-inline" method="post" action="#">
<div class="input-group">
<input id="search-input" type="search" class="form-control" name="txtAfficher"placeholder="Rechercher...">
<button id="search-button" type="submit" class="btn btn-primary" name="btnAfficher">
<i class="bi bi-search"></i>
</button>
</div>
</form>
</nav>
</div>
<div class="card-body">
<?php
if(isset($_POST["btnAfficher"]) && isset($_POST["txtAfficher"]))
{
$apprenant=$_POST["txtAfficher"];
}else{
$apprenant="";
}
/*
$stmt=$pdo-> prepare("SELECT * FROM apprenants a, gouvernorats g WHERE a.cdegouvernorat=g.cdegouvernorat".
" and cinapprenant LIKE ?");
$stmt->execute(['%'.$apprenant.'%']); */
echo "<table class='table table-striped table-bordered'><thead> <tr><th>CIN</th>
<th>Prénom</th><th>Nom</th><th>Date de naissance</th>
<th>Civilité</th>
<th>Adresse</th>
<th>Adresse mail</th><th>Gouvernorat</th>
<th>Groupe</th><th class='col-md-2' align='center'>Action</th></tr></thead><tbody>";
/*while ($ligne=$stmt->fetch())*/
foreach($stmt as $ligne){
$civilite="Femme";
if($ligne[4]== 1) { $civilite="Homme"; }
echo "<tr><td>". $ligne[0]."</td>".
"<td>". $ligne[1]."</td>".
"<td>". $ligne[2]."</td>".
"<td>". $ligne[3]."</td>".
"<td>". $civilite."</td>".
"<td>". $ligne[5]."</td>".
"<td>". $ligne[6]."</td>".
"<td>". htmlentities($ligne[12], ENT_QUOTES,'iso-8859-1')."</td>".
"<td>". $ligne[8]."</td>"
.'<td align="center">'
."<a href='page_edit_apprenant.php?id=". $ligne[0] ."' class='btn btn-outline-primary btn-sm me-2'><span class='bi bi-eye'></span></a>"
."<a href='page_modifier_apprenant.php?id=". $ligne[0] ."' class='btn btn-outline-success btn-sm me-2'><span class='bi bi-pencil'></span></a>"
."<a href='supprimer.php?id=". $ligne[0] ."' class='btn btn-outline-warning btn-sm me-2' role='button' data-bs-toggle='button'><span class='bi bi-trash'></span></a>"
.'</td></tr>';
}
echo "</tbody></table>";
echo "</div>";
/*}*/
?>
</div>
</div>
</div>
<!----------Pagination------->
<nav aria-label="Page navigation example">
<ul class="pagination justify-content-center">
<li class="page-item <?php if ($page <= 1){echo 'disabled';} ?>">
<a class="page-link" href="<?php if ($page <= 1){echo '#';} else {echo "?page=".$prec;} ?>" >Precedent</a>
</li>
<?php for ($i=1; $i<=$totoalPages; $i++) : ?>
<li class="page-item <?php if ($page == $i){echo 'active';} ?>">
<a class="page-link" href="?page=<?= $i; ?>">
<?= $i; ?>
</a>
</li>
<?php endfor; ?>
<li class="page-item <?php if ($page >= $totoalPages){echo 'disabled';} ?>">
<a class="page-link" href="<?php if ($page >= $totoalPages){echo '#';} else {echo "?page=".$suiv;} ?>">Suivant</a>
</li>
</ul>
</nav>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
$('#nbrLignesAffiche').change(function(){
$('#formNbrLignes').submit();
})
});
</script>
</div>
<?php
include('../footer.php');
?>