Pagination News

Résolu/Fermé
TRUNCKS Messages postés 1030 Date d'inscription vendredi 10 août 2007 Statut Membre Dernière intervention 3 juin 2023 - 24 mars 2011 à 17:49
avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 - 24 mars 2011 à 18:30
Bonjour à vous,

J'ai suivi un petit tuto du zéro pour faire un système de news, mais maintenant j'aimerai faire une petite pagination pour afficher par exemple 5 news seulement, mais je ne sais du tout par où commencer.

Ma table à quatre champs: id, titre, contenu, timestamp.


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" >

<head>

<title>Bienvenue sur mon site</title>

<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />

		<style type="text/css">

        h1, h3
        {
            text-align:center;
        }
        h3
        {
            background-color:black;
            color:white;
            font-size:0.9em;
            margin-bottom:0px;
        }
        .news p
        {
            background-color:#CCCCCC;
            margin-top:0px;
        }
        .news
        {
            width:70%;
            margin:auto;
        }
		
  		</style>
        
</head>
    
<body>

<h1>Bienvenue sur mon site !</h1>

<p>Voici les dernières news :</p>
 
<?php

mysql_connect("localhost", "root", "");
mysql_select_db("news");
// On récupère les cinq dernières news.
$retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT 0, 5');
while ($donnees = mysql_fetch_array($retour))
{
	
?>

<div class="news">

    <h3>
    
    <?php echo $donnees['titre']; ?>
    <em>le <?php echo date('d/m/Y à H\hi', $donnees['timestamp']); ?></em>
        
    </h3>
    
    <p>
    
    <?php
    // On enlève les éventuels antislashs, PUIS on crée les entrées en HTML (<br />).
    $contenu = nl2br(stripslashes($donnees['contenu']));
    echo $contenu;
    ?>
    
    </p>
    
</div>

<?php
} // Fin de la boucle des news.
?>

</body>

</html>

A voir également:

1 réponse

avion-f16 Messages postés 19249 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 15 juin 2024 4 501
24 mars 2011 à 18:30
Salut.

Il va falloir compter le nombre d'entrées dans la table et diviser le total par le nombre de news par page.
Le nombre obtenu correspondra au nombre de page.
Pour éviter d'avoir des nombres décimaux, tu peux utiliser la fonction ceil() qui arrondi à l'entier supérieur.

Une fois que tu as le nombre de page, tu peux, à l'aide d'une boucle, créer chaque lien vers chaque page.

Dans le lien, il faut indiquer la page grâce aux paramètres dans l'URL (GET).
Exemple : /news.php?page=3 pour la page 3.

Dans le code qui récupère les news, il faut indiquer le premier élément à prendre.
Ce premier élément est : (page_actuelle - 1) * nb_news_par_page
Dans le cas où $_GET['page'] n'existe pas, la page sera la n°1.
Et il faut également indiquer le nombre d'entrées à prendre depuis cet élément.
Pour cette étape, il faut utiliser la clause LIMIT.

En code, ça donne :
<?php
define('NEWS_PAR_PAGE', 5);
include 'connexion-pdo.php';

// 1) *** Afficher les news ***
// Numéro de la page
$page = isset($_GET['page']) ? (int) $_GET['page'] : 1;
if($page < 1) $page = 1;

// Premier élément
$premier = ($page - 1) * NEWS_PAR_PAGE;

// Requête SQL
$sql = 'SELECT * FROM news ORDER BY id DESC LIMIT '.$premier.','.NEWS_PAR_PAGE;
$result = $bdd->query($sql);

// Affichage des news
while($news = $result->fetch()) {
    include 'tpl/news-single.tpl.php'; // À remplacer par ce que tu veux
}

// 2) *** Pagination ***
// Nombre de page
$sql = 'SELECT COUNT(*) AS nb FROM news';
$result = $bdd->query($sql);
$firstRow = $result->fetch();
$nbNews = $firstRow['nb'];

$nbPage = ceil( $nbNews / NEWS_PAR_PAGE );

// Affichage des liens
for($i = 1 ; $i <= $nbPage ; $i++) {
    echo '<a href="news.php?page='.$i.'">'.$i.'</a> ';
}

?>
J'ai codé ça directement dans le formulaire de réponse, il y a sans doute des erreurs.
0