Page 1 sur 1

Problème de pagination

Posté : 22 sept. 2005, 20:56
par Birdaille
Pour mon site, je propose les liens vers les nouveautés qui sont gérés par PHP/SQL dans une petite table. Jusque là, tout est ok. La pagination fonctionne correctement. Par contre, si je fais une sélection, ça fonctionne aussi, mais le nombre de page reste complet et une fois les premiers enregistrements présentés dans les premières pages, il continue à faire comme si il y avait l'ensemble des pages en proposant des pages vides...

Je ne sais pas si j'ai été clair. Voici le problème :

http://www.sentiers.be/principal.php?se ... uction=non
Il s'agit de l'ensemble des enregistrements

http://www.sentiers.be/principal.php?se ... uction=non
Et là, cliquez sur page 2 ou 3 et vous comprendrez le problème. Il ne devrait y avoir qu'une page et non trois...


Voici le code en question :
<?php require "bienvenue/BIneuf/BIneufConfig.php";?>
<table width="670" class="TABpage">
  <tr>
    <td class="sous-titre"><h3>Actualit&eacute; des chemins et sentiers</h3></td>
  </tr>
  <tr>
    <td height="10"></td>
  </tr>
  <tr>
    <td><?php
	    // Début du tableau
		echo "<table width=\"100%\" border=\"0\" cellspacing=\"2\" cellpadding=\"4\"\n";
		  echo "<tr height=\"20\" align=\"center\" valign=\"top\">\n";
			echo "<td class=\"TABcolonne\" width=\"90\">Dates</td>\n";
			echo "<td class=\"TABcolonne\" width=\"570\">Sujets</td>\n";
		  echo "</tr>\n";
		  
		// Liste des articles	
		if (!isset($debut)) $debut="0";
		if (!isset($f)) $f=$npages;
		
		// Ouverture de la BD $Articles
		mysql_select_db($database_Articles, $Articles);

		$requete = "SELECT * FROM articles WHERE theme = 'Actualité' AND typelangue = 'FR' ORDER BY date DESC LIMIT ".$debut.", ".$npages."";
		$resultats = mysql_query($requete) or die ("<p align=center class=text>Lecture des articles impossible</p>");
		$nb_resultats = mysql_num_rows($resultats);
		
		$requete_nb = "SELECT * FROM articles";
		$resultats_nb = mysql_query($requete_nb) or die ("");
		$nb_resultats_nb = mysql_num_rows($resultats_nb);
		$nb_pages = ceil($nb_resultats_nb/$npages);
		
		// Liste des articles
		while ($row = mysql_fetch_array($resultats)) {

			$sujet = $row['sujet'];
			$lien = $row['lien'];
			$resume = $row['resume'];
			$auteur = $row['auteur'];
			$theme = $row['theme'];
			$date = $row['date'];
			list($annee,$mois,$jour) = split( '[/.-]', $date );
			
		    // Différence de dates pour la nouveauté des sujets			
			$timestamp = mktime(0,0,0,$mois,$jour,$annee);
			$d2 = time();
			$d3 = $d2 - $timestamp; 
            $d4 = floor($d3 / 86400);
			if($d4>30){$nouveau="";}else{$nouveau="Nouveau";};
			
			// Affichage du "par"
			if ($auteur==""){$par="";}else{$par="par";};
			
		echo "<tr>\n";
		  echo "<td bgcolor=\"#ECECEC\" width=\"90\" align=\"center\" valign=\"top\" class=\"sansretrait\">".$jour."/".$mois."/".$annee."<br><font size=\"1\" color=\"#FF0000\">".$nouveau."</font></td>\n";
		  echo "<td bgcolor=\"#ECECEC\" width=\"430\" align=\"left\" ><table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td height=\"15\" valign=\"top\" class=\"sansretrait\"><strong><a href=\"".$lien."\">".$sujet."</a></strong><br><font size=\"1\" color=\"#BCBCBC\">".$par." ".$auteur."</font></td></tr><tr><td class=\"sansretrait\"><font size=\"1\">".$resume."</font></td></tr><tr><td height=\"5\"></td></tr></td></tr></table></td>\n";
		echo "</tr>\n";
			
		}
		
		// Fin du tableau
		echo "</table>\n";
		
		// Fermeture de la BD $Articles
		mysql_close($Articles);
		
		echo"<br><center>\n";
		echo"<font size=\"1\" color=\"#99CC33\" face=\"Verdana, Arial, Helvetica, sans-serif\">";
				
		// Bouton "Précédent"
		if ($debut!="0") {
			$debut_new1=$debut-$npages;
			$f_new1=$debut;
			echo "<a href=\"principal.php?section=comprendre&langue=".$_SESSION['langue']."&page=COactualite&num=Liste&debut=$debut_new1&f=$f_new1\"><font color=\"#55811B\"> Précédent </font></a> | \n";
		}
		
		// Affichage n° pages
		if ($nb_pages>"1") {
			for ($i=0;$i<$nb_pages;$i++) {
				if(isset($debut_page))
					$debut_page=$debut_page+$npages;
				else
					$debut_page="0";
					$f_page = $f_page+$npages;
					$num_page=$i+1;
					if($debut==$debut_page)
						echo $num_page."\n";
					else {
						if ($debut_page<$nb_resultats_nb)
						echo "<a href=\"principal.php?section=comprendre&langue=".$_SESSION['langue']."&page=COactualite&num=Liste&debut=$debut_page&f=$f_page\"><font color=\"#55811B\">".$num_page."</font></a> \n";
					}
				}
			}
		
		// Bouton "Suivant"
		if ($f<$nb_resultats_nb) {
			$debut_new2=$f;
			$f_new2=$f+$npages;
			echo "| <a href=\"principal.php?section=comprendre&langue=".$_SESSION['langue']."&page=COactualite&num=Liste&debut=$debut_new2&f=$f_new2\"><font color=\"#55811B\"> Suivant </font></a>\n";
		}			
		
		echo"</font>"
		
		?></td>
  </tr>
  <tr>
    <td height="10"></td>
  </tr>
</table>

Posté : 22 sept. 2005, 21:31
par Cyrano
Plusieurs choses :
-1- Quand tu mets du code, regarde au dessus de la zone de saisie, il y a des boutons [code] et [php] : c'est pas pour décorer, utilise les pour mettre du code dans tes messages.

-2- Le sujet n'a pas grand chose à voir avec le forum "Base de données", j'ai donc déplacé ic où c'est le sujet;

-3- : quand tu fais du code, essaye de faire ça de façon lisible et opitimisée dès le départ, on repère les bugs beaucoup plus vite.

Ton erreur vient de ce que tu envoies en paramètres d'url une valeur dont on a rien à faire : f est toujours supérieur a debut de 10, j'en ai rapidement conclu que tu pointais la fin. Mais en fait, tu dois spécifier au départ un nombre de lignes à afficher par page dans une variable qui reste dans la page et que tu n'as pas besoin de passer en paramètre.

Ensuite, sépare le PJHP du HTML, c'est beaucoup plus propre, c'est plus lisible, et c'est meilleur également pour les performances : essaye comme ça:
<?php require "bienvenue/BIneuf/BIneufConfig.php";?>
<table width="670" class="TABpage">
  <tr>
    <td class="sous-titre"><h3>Actualité des chemins et sentiers</h3></td>
  </tr>
  <tr>
    <td height="10"></td>
  </tr>
  <tr>
    <td>
<?php
// Début du tableau
?>
      <table width="100%" border="0" cellspacing="2" cellpadding="4">
        <tr height="20" align="center" valign="top">
          <td class="TABcolonne" width="90">Dates</td>
          <td class="TABcolonne" width="570">Sujets</td>
        </tr>
<?php          
// Liste des articles
/* On récupère la page de départ s'il y en a une de précisée, sinon ce sera 0 par défaut */
$debut = isset($_GET['debut']) ? $_GET['debut'] : 0;
/* On définit le nombre de ligne par défaut */
$npages = 10;

// Ouverture de la BD $Articles
mysql_select_db($database_Articles, $Articles);

$requete = "SELECT * FROM articles WHERE theme = 'Actualité' AND typelangue = 'FR' ORDER BY date DESC LIMIT ".$debut.", ".$npages."";
$resultats = mysql_query($requete) or die ("<p align=center class=text>Lecture des articles impossible</p>");
$nb_resultats = mysql_num_rows($resultats);

$requete_nb = "SELECT * FROM articles";
$resultats_nb = mysql_query($requete_nb) or die ("");
$nb_resultats_nb = mysql_num_rows($resultats_nb);
$nb_pages = ceil($nb_resultats_nb/$npages);

// Liste des articles
while ($row = mysql_fetch_array($resultats))
{

    $sujet = $row['sujet'];
    $lien = $row['lien'];
    $resume = $row['resume'];
    $auteur = $row['auteur'];
    $theme = $row['theme'];
    $date = $row['date'];
    list($annee,$mois,$jour) = split( '[/.-]', $date );

    // Différence de dates pour la nouveauté des sujets
    $timestamp = mktime(0,0,0,$mois,$jour,$annee);
    $d2 = time();
    $d3 = $d2 - $timestamp;
    $d4 = floor($d3 / 86400);
    $nouveau = ($d4>30) ? "" : "Nouveau";
    // Affichage du "par"
    $par = ($auteur=="") ? "" : "par";
?>
        <tr>
          <td bgcolor="#ECECEC" width="90" align="center" valign="top" class="sansretrait"><?php echo($jour."/".$mois."/".$annee); ?><br><font size="1" color="#FF0000"><?php echo($nouveau); ?></font></td>
          <td bgcolor="#ECECEC" width="430" align="left" >
            <table border="0" cellspacing="0" cellpadding="0">
              <tr>
                <td height="15" valign="top" class="sansretrait">
                  <strong><a href="<?php echo($lien); ?>"><?php echo($sujet); ?></a></strong><br>
                  <font size="1" color="#BCBCBC"><?php echo($par." ".$auteur); ?></font>
                </td>
              </tr>
              <tr>
                <td class="sansretrait">
                  <font size="1"><?php echo($resume); ?></font>
                </td>
              </tr>
              <tr>
                <td height="5">&nbsp;</td>
              </tr>
            </table>
          </td>
        </tr>
<?php
}
// Fin du tableau
?>
      </table>
<?php        
// Fermeture de la BD $Articles
mysql_close($Articles);
?>
      <br><center>
      <font size="1" color="#99CC33" face="Verdana, Arial, Helvetica, sans-serif">
<?php                
// Bouton "Précédent"
if ($debut!="0")
{
    $debut_new1=$debut-$npages;
    $f_new1=$debut;
?>
<a href="principal.php?section=comprendre&langue=<?php echo($_SESSION['langue']); ?>&page=COactualite&num=Liste&debut=<?php echo($debut_new1); ?>&f=<?php echo($f_new1); ?>"><font color="#55811B"> Précédent </font></a> | 
<?php
}
// Affichage n° pages
if ($nb_pages > 1)
{
    for ($i=0;$i<$nb_pages;$i++)
    {
        if(isset($debut_page))
        {
            $debut_page=$debut_page+$npages;
        }
        else
        {
            $debut_page="0";
        }
        $f_page = $f_page+$npages;
        $num_page=$i+1;
        if($debut==$debut_page)
        {
            echo $num_page."\n";
        }
        else
        {
            if ($debut_page<$nb_resultats_nb)
            {
?>
<a href="principal.php?section=comprendre&langue=<?php echo($_SESSION['langue']); ?>&page=COactualite&num=Liste&debut=<?php echo($debut_page); ?>&f=<?php echo($f_page); ?>"><font color="#55811B"><?php echo($num_page); ?></font></a>
<?php
            }
        }
    }
}

// Bouton "Suivant"
if ($f<$nb_resultats_nb)
{
    $debut_new2=$f;
    $f_new2=$f+$npages;
?>
| <a href="principal.php?section=comprendre&mp;langue=<?php echo($_SESSION['langue']); ?>&page=COactualite&num=Liste&debut=<?php echo($debut_new2); ?>&f=<?php echo($f_new2); ?>"><font color="#55811B"> Suivant </font></a>
<?php
}
?>
      </font>
    </td>
  </tr>
  <tr>
    <td height="10">&nbsp;</td>
  </tr>
</table>
Regarde les lignes 22 et 24, j'ai modifié et rajouté des commentaires, tu devrais comprendre. En principe le reste devrait être bon.

Posté : 23 sept. 2005, 07:48
par Birdaille
Merci pour la réponse rapide et 1000 excuses pour mon empressement (c'est ma première participation :wink: )

Concernant mon problème, le nombre de ligne est déjà prévu dans la page de configuration ($npages). Mais j'ai quand-même modifié pour voir. Rien à faire, il affiche toujours la possibilité d'aller sur trois pages là où il n'y en a qu'une... Les deux autres étant vides.

Je pense que dans la requête, il propose la sélection correctement, mais il doit y avoir une erreur de code dans dans la partie "Bouton précédent - Affichage N°pages - Bouton suivant" qui fait qu'il tient compte de l'ensemble des enregistrements avant requête pour établir le nombre de pages. N'y a-t-il pas confusion à un moment donné entre le nombre de pages et le nombre de résultats ?

Posté : 23 sept. 2005, 08:33
par Cyrano
Je crois que ça vient de ce que tu n'effectues pas les bons contrôles pour afficher tes liens de navigation: par exemple, pour la page suivante, remplace par ceci:
// Bouton "Suivant"
if (($debut + 1) < $nb_pages)
{
    $debut_new2 = ($debut + 1);
?>
| <a href="principal.php?section=comprendre&mp;langue=<?php echo($_SESSION['langue']); ?>&page=COactualite&num=Liste&debut=<?php echo($debut_new2); ?>"><font color="#55811B"> Suivant </font></a>
<?php
}
?>
Comme tu vois, je fais sauter le paramètre "f" qui ne sert à rien, mais surtout je vérifie autre chose: je récupère la page en cours ($debut) et je l'incrémente de 1 pour comparer le nombre obtenu avec le nombre de page totale déterminé par la requête. Et là j'affiche un lien suivant dans la mesure où il y a une différence.

Je ne me suis pas attardé sur les autres liens, mais pars de ce principe.

Posté : 25 sept. 2005, 18:37
par Birdaille
Et bien voilà, c'est quand c'est le plus évident qu'on ne le voit pas :)

La solution est toute simple : j'ai oublié de spécifié le tri dans ma seconde requête...

Il suffit de corriger comme ceci :
$requete_nb = "SELECT * FROM articles WHERE theme = 'Actualité' AND typelangue = 'FR'";
.. et tout rentre dans l'ordre.