Pagination pour mon forum

Résolu/Fermé
younesase Messages postés 80 Date d'inscription samedi 21 avril 2012 Statut Membre Dernière intervention 27 avril 2014 - 18 mai 2013 à 22:00
h4ckkids Messages postés 16 Date d'inscription dimanche 19 mai 2013 Statut Membre Dernière intervention 26 février 2014 - 19 mai 2013 à 18:03
Bonjour,
J'ai créer un forum ou j'ai mis plusieurs catégorie et dans chaque catégorie il y a les sujets que l'utilisateur écrit mais mon problème et que si il y a plusieurs sujets dans une catégorie par exemple 100 je veux pas qu'il soient tous dans une pages , c'est pour ça que je veut créer un système de pagination pour mon forum , merci de m'aider
Voila ma la table topics de ma base de donné:

CREATE TABLE 'topics' (
'parent' smallint(6) NOT NULL,
'id' int(11) NOT NULL,
'id2' int(11) NOT NULL,
'title' varchar(256) NOT NULL,
'message' longtext NOT NULL,
'authorid' int(11) NOT NULL,
'timestamp' int(11) NOT NULL,
'timestamp2' int(11) NOT NULL,
PRIMARY KEY ('id','id2')
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

----------------------------------------------------------------------------------
Voila mon code
La page list_topics.php :

<?php
//Cette page permet d'afficher la liste des sujets d'une categorie de forum
include('config.php');
if(isset($_GET['parent']))
{
$id = intval($_GET['parent']);
$dn1 = mysql_fetch_array(mysql_query('select count(c.id) as nb1, c.name,count(t.id) as topics from categories as c left join topics as t on t.parent="'.$id.'" where c.id="'.$id.'" group by c.id'));
if($dn1['nb1']>0)
{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link href="<?php echo $design; ?>/style.css" rel="stylesheet" title="Style" />
<title><?php echo htmlentities($dn1['name'], ENT_QUOTES, 'UTF-8'); ?> - Forum</title>
</head>
<body>
<header>
<?php
include 'header.php';
?>
</header>
<?php
if(isset($_SESSION['username']))
{
$nb_new_pm = mysql_fetch_array(mysql_query('select count(*) as nb_new_pm from pm where ((user1="'.$_SESSION['userid'].'" and user1read="no") or (user2="'.$_SESSION['userid'].'" and user2read="no")) and id2="1"'));
$nb_new_pm = $nb_new_pm['nb_new_pm'];
?>
<div class="box">
<div class="box_left">
<a href="<?php echo $url_home; ?>">Index du Forum</a> > <a href="list_topics.php?parent=<?php echo $id; ?>"><?php echo htmlentities($dn1['name'], ENT_QUOTES, 'UTF-8'); ?></a>
</div>
<div class="box_right">
<a href="list_pm.php">Vos messages(<?php echo $nb_new_pm; ?>)</a> - <a href="profile.php?id=<?php echo $_SESSION['userid']; ?>"><?php echo htmlentities($_SESSION['username'], ENT_QUOTES, 'UTF-8'); ?></a> (<a href="login.php">Déconnexion</a>)
</div>
<div class="clean"></div>
</div>
<?php
}
else
{
?>
<div class="box">
<div class="box_left">
<a href="<?php echo $url_home; ?>">Index du Forum</a> > <a href="list_topics.php?parent=<?php echo $id; ?>"><?php echo htmlentities($dn1['name'], ENT_QUOTES, 'UTF-8'); ?></a>
</div>
<div class="box_right">
<a href="signup.php">Inscription</a> - <a href="login.php">Connexion</a>
</div>
<div class="clean"></div>
</div>
<?php
}
if(isset($_SESSION['username']))
{
?>
<a href="new_topic.php?parent=<?php echo $id; ?>" class="button">Nouveau Sujet</a>
<?php
}
$dn2 = mysql_query('select t.id, t.title, t.authorid, u.username as author, count(r.id) as replies from topics as t left join topics as r on r.parent="'.$id.'" and r.id=t.id and r.id2!=1 left join users as u on u.id=t.authorid where t.parent="'.$id.'" and t.id2=1 group by t.id order by t.timestamp2 desc');
if(mysql_num_rows($dn2)>0)
{
?>
<table class="topics_table" name="topics">
<tr>
<th class="forum_tops">Sujet</th>
<th class="forum_auth">Auteur</th>
<th class="forum_nrep">Réponses</th>
<?php
if(isset($_SESSION['username']) and $_SESSION['username']==$admin)
{
?>
<th class="forum_act">Action</th>
<?php
}
?>
</tr>
<?php
while($dnn2 = mysql_fetch_array($dn2))
{
?>
<tr>
<td class="forum_tops"><a href="read_topic.php?id=<?php echo $dnn2['id']; ?>"><?php echo htmlentities($dnn2['title'], ENT_QUOTES, 'UTF-8'); ?></a></td>
<td><a href="profile.php?id=<?php echo $dnn2['authorid']; ?>"><?php echo htmlentities($dnn2['author'], ENT_QUOTES, 'UTF-8'); ?></a></td>
<td><?php echo $dnn2['replies']; ?></td>
<?php
if(isset($_SESSION['username']) and $_SESSION['username']==$admin)
{
?>
<td><a href="delete_topic.php?id=<?php echo $dnn2['id']; ?>"><img src="<?php echo $design; ?>/images/delete.png" alt="Delete" /></a></td>
<?php
}
?>
</tr>
<?php
}
?>

</table>
<?php
}
else
{
?>
<div class="message">Cette catégorie ne contient aucun sujet.</div>
<?php
}
if(isset($_SESSION['username']))
{
?>
<a href="new_topic.php?parent=<?php echo $id; ?>" class="button">Nouveau Sujet</a>
<?php
}
else
{
?>
<div class="box_login">
<form action="login.php" method="post">
<label for="username">Nom d'utilisateur</label><input type="text" name="username" id="username" /><br />
<label for="password">Mot de passe</label><input type="password" name="password" id="password" /><br />
<label for="memorize">Se souvenir</label><input type="checkbox" name="memorize" id="memorize" value="yes" />
<div class="center">
<input type="submit" value="Login" /> <input type="button" onclick="javascript:document.location='signup.php';" value="S'inscrire" />
</div>
</form>
</div>
<?php
}
?>
</body>
</html>
<?php
}
else
{
echo '<h2>La catégorie que vous désirez visiter n\'existe pas.</h2>';
}
}
else
{
echo '<h2>L\'identifiant de la catégorie que vous désirez visiter n\'est pas défini.</h2>';
}
?>

<?php
include 'footer.php';
?>


1 réponse

h4ckkids Messages postés 16 Date d'inscription dimanche 19 mai 2013 Statut Membre Dernière intervention 26 février 2014
19 mai 2013 à 18:03
Salut younesase, j'ai eu le même problème à une époque, et j'ai trouvé la solution alors je te donne le code, mais il te faudra l'adapter à ton code évidemment.




D'abord, la fonction a simplement copier coller.

<?php

 function barre_navigation ($nb_total, 
      $nb_affichage_par_page, 
      $debut, 
      $nb_liens_dans_la_barre) { 
 
   $barre = ''; 
   
   // on recherche l'URL courante munie de ses paramètre auxquels on ajoute le paramètre 'debut' qui jouera le role du premier élément de notre LIMIT
   if ($_SERVER['QUERY_STRING'] == "") { 
      $query = $_SERVER['PHP_SELF'].'?debut='; 
   } 
   else { 
      $tableau = explode ("debut=", $_SERVER['QUERY_STRING']); 
      $nb_element = count ($tableau); 
      if ($nb_element == 1) { 
         $query = $_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'].'&debut='; 
      } 
      else { 
         if ($tableau[0] == "") { 
            $query = $_SERVER['PHP_SELF'].'?debut='; 
         } 
         else { 
            $query = $_SERVER['PHP_SELF'].'?'.$tableau[0].'debut='; 
         } 
      } 
   } 
   
   // on calcul le numéro de la page active
   $page_active = floor(($debut/$nb_affichage_par_page)+1); 
   // on calcul le nombre de pages total que va prendre notre affichage
   $nb_pages_total = ceil($nb_total/$nb_affichage_par_page); 
   
   // on calcul le premier numero de la barre qui va s'afficher, ainsi que le dernier ($cpt_deb et $cpt_fin)
   // exemple : 2 3 4 5 6 7 8 9 10 11 << $cpt_deb = 2 et $cpt_fin = 11
   if ($nb_liens_dans_la_barre%2==0) { 
      $cpt_deb1 = $page_active - ($nb_liens_dans_la_barre/2)+1; 
      $cpt_fin1 = $page_active + ($nb_liens_dans_la_barre/2); 
   } 
   else { 
      $cpt_deb1 = $page_active - floor(($nb_liens_dans_la_barre/2)); 
      $cpt_fin1 = $page_active + floor(($nb_liens_dans_la_barre/2)); 
   } 
   
   if ($cpt_deb1 <= 1) { 
      $cpt_deb = 1; 
      $cpt_fin = $nb_liens_dans_la_barre; 
   } 
   elseif ($cpt_deb1>1 && $cpt_fin1<$nb_pages_total) { 
      $cpt_deb = $cpt_deb1; 
      $cpt_fin = $cpt_fin1; 
   } 
   else { 
      $cpt_deb = ($nb_pages_total-$nb_liens_dans_la_barre)+1; 
      $cpt_fin = $nb_pages_total; 
   } 
 
   if ($nb_pages_total <= $nb_liens_dans_la_barre) { 
      $cpt_deb=1; 
      $cpt_fin=$nb_pages_total; 
   } 
   
   // si le premier numéro qui s'affiche est différent de 1, on affiche << qui sera un lien vers la premiere page
   if ($cpt_deb != 1) { 
      $cible = $query.(0); 
      $lien = '<A HREF="'.$cible.'"><<</A>&nbsp;&nbsp;'; 
   } 
   else { 
      $lien=''; 
   } 
   $barre .= $lien; 
 
   // on affiche tous les liens de notre barre, tout en vérifiant de ne pas mettre de lien pour la page active
   for ($cpt = $cpt_deb; $cpt <= $cpt_fin; $cpt++) { 
      if ($cpt == $page_active) { 
         if ($cpt == $nb_pages_total) { 
            $barre .= $cpt; 
         } 
         else { 
            $barre .= $cpt.'&nbsp;-&nbsp;'; 
         } 
      } 
      else { 
         if ($cpt == $cpt_fin) { 
            $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page); 
            $barre .= "'>".$cpt."</A>"; 
         } 
         else { 
            
            $barre .= "<A HREF='".$query.(($cpt-1)*$nb_affichage_par_page); 
            $barre .= "'>".$cpt."</A>&nbsp;-&nbsp;"; 
         } 
      } 
   } 
   
   $fin = ($nb_total - ($nb_total % $nb_affichage_par_page)); 
   if (($nb_total % $nb_affichage_par_page) == 0) { 
      $fin = $fin - $nb_affichage_par_page; 
   } 
 
      // si $cpt_fin ne vaut pas la dernière page de la barre de navigation, on affiche un >> qui sera un lien vers la dernière page de navigation
   if ($cpt_fin != $nb_pages_total) { 
      $cible = $query.$fin; 
      $lien = '&nbsp;&nbsp;<A HREF="'.$cible.'">>></A>'; 
   } 
   else { 
      $lien=''; 
   } 
   $barre .= $lien; 
 
   return $barre;   
}  
?>



Ensuite, tu devras adapter ceci.




// on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages

// Avec des if else if j'avais prévu toutes les requêtes sql en fonctions des $_GET pour compter le nombre de textes.
 $sql='SELECT COUNT(*) as nombre FROM histoires' ; 



// on exécute cette requête
$resultat = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
 
// on récupère le nombre d'éléments à afficher
$nb_total = mysql_fetch_array($resultat);  
 
// on teste si ce nombre de vaut pas 0
if (($nb_total = $nb_total[0]) == 0) {  
echo '<div class="aucune">Aucune histoire ne correspond à votre recherche.</div>';  
}  
else { 

   
// sinon, on regarde si la variable $debut (le x de notre LIMIT) n'a pas déjà été déclarée, et dans ce cas, on l'initialise à 0
if (empty($_GET['debut']) || (!mb_ereg("^[0-9]+$", $_GET['debut'])) || $_GET['debut'] < 0){ $_GET['debut'] = 0;} //Si debut n'est pas un nombre ou qu'il est inférieur à 0, on va l'initié à 0.






   
   $nb_affichage_par_page = 15; 
   
// Préparation de la requête avec le LIMIT
//On prépare la requête sql pour l'affichage des textes.

 if(isset($_GET['type']) && ($_GET['type']) != '' && isset($_GET['sujet']) && ($_GET['sujet']) != '' && isset($_GET['auteur']) && ($_GET['auteur']) != '')
 {
$sql='
SELECT *
FROM histoires
WHERE sujet = \''.$_GET['sujet'].'\'
AND type = \''.$_GET['type'].'\'
AND pseudo_auteur = \''.$_GET['auteur'].'\'
ORDER BY id_histoire DESC
LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;
}
else
{
$sql='SELECT * FROM histoires ORDER BY vue ASC LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;
}
 
 
// on exécute la requête
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());  
 
// on va scanner tous les tuples un par un
while ($donnees = mysql_fetch_array($req)) 


{
?>
<div><hr color=grey size=1px></hr>
<?php 

//Maintenant, on affiche les histoires que l'on veut.

echo '<p class="histoire"> <a href="texte.php?texte='.htmlspecialchars($donnees['id_histoire']).'"><span style="font-size: 1.1em;">' . str_replace('\\\'','\'', htmlspecialchars($donnees['titre'])).'</span><br /><span class="titre">Thème:</span> '.htmlspecialchars($donnees['sujet']).'<br /><span class="titre">Résumé:</span> '.htmlspecialchars($donnees['resume']).'<br /><span class="titre">Publié par:</span> '.htmlspecialchars($donnees['pseudo_auteur']).' le '.htmlspecialchars($donnees['date_ecriture']).'<br /></a><br /></p>';
if(isset($_SESSION['page_supp'])) { echo'<a href="confirm_supp_text.php?id='.htmlspecialchars($donnees['id_histoire']).'">Supprimer ' . $donnees['titre'] . '</a><br />
<a href="modif_texte.php?id='.htmlspecialchars($donnees['id_histoire']).'">Modifier '.htmlspecialchars($donnees['titre']).'</a></p>
';} ?>
 </div>
 
 <?php
}
 
// on libère l'espace mémoire alloué pour cette requête
mysql_free_result ($req); 
 
 
   // on affiche enfin notre barre, en utilisant la fonction qui est déclarée au dessus.
  echo '<div class="barre">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 10).'</div>';  
}  
// on libère l'espace mémoire alloué pour cette requête
mysql_free_result ($resultat);  
// on ferme la connexion à la base de données.
mysql_close ();    
?>
 
</body>
</html> 
 
 



Je réponds à toutes tes questions en cas de besoin ;)
(si tu veux voir un exemple, sur le site dans ma signature c'est ce code qui est utilisé.
0