Problème de pagination

Bonjour,
J'ai un problème avec mon script de pagination...Ce n'est surement pas grand chose mais je ne parviens pas à déceler le pb... Je vous donne le script pour m'aider:

<body>
<center>
<div id="body2">
<?php include("****"); ?>
<?php include("***");?>
<bR><br>
<?php
include("identifiants.php");
mysql_connect("***", "***", "***");
mysql_select_db("news");

$retour = mysql_query('SELECT * FROM news ORDER BY id DESC');
while ($donnees = mysql_fetch_array($retour))
{
?>

<div id="news">
<strong>News du <?php echo date('d/m/Y à H\hi', $donnees['timestamp']); ?></strong>

<h2><div id="titre_news"><?php echo $donnees['titre']; ?></div></h2>
<p>

<?php
$contenu = nl2br(stripslashes($donnees['contenu']));
echo $contenu;
?>

</p>
</div>
<br><br>

<?php
}

$retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM news');
$donnees = mysql_fetch_array($retour);
$totalDesMessages = $donnees['nb_messages'];

$nombreDePages = ceil($totalDesMessages / 5);

echo 'Page : ';
for ($i = 1 ; $i <= $nombreDePages ; $i++)
{
echo '<a href="index.php?page=' . $i . '">' . $i . '</a> ';
}
?>

</p>

<?php

if (isset($_GET['page']))
{
$page = $_GET['page'];
}
else
{
$page = 1;
}

$premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;

mysql_close();

?>

</center>
</div>
</body>

Je vous donne aussi l'adresse du site: http://judex.production.free.fr/
D'avance merci.
Configuration: Windows XP
Firefox 3.0.3

16 réponses

  • Votes
  • Date
  • Date décroissante
  1. qu'est ce que c'est les dates SQL?
    1. lorsque tu rajoute un champ dans ta base, tu as le choix entre plusieur truc : int, text, varchar et aussi pour les date : date, datetime et time
      si tu prend date, tu enregistrera une date sous le format aaaa-mm-jj
      datetime : aaaa-mm-jj hh-ii-ss
      et time c'est juste l'heure.

      et lors d'un SELECT, tu dois mettre juste après (et donc avant le FROM $table) ceci :
      SELECT ...,DATE_FORMAT(date, '%d/%m/%y à %H:%i') as date

      ça affichera la date sour forme jj-mm-aa à hh:ii

      tu peux bien sur modifier tout ça.
      Pour plus d'info, cherche des tuto sur le SQL.
  2. Vous allez me trouver embêtant mais ça ne marche toujours pas...
    1. si tu n'a pas de message d'erreur, d'écrit nous le problème
  3. et bien j'ai appliqué le script et puis ça ne pagine pas...
    je ne sais pas ce qui se passe
    1. actuellement, mon script est le suivant:

      <html>
      <head>
      <title>***</title>
      </head>
      <body>
      <?php
      if (!$_GET["page"])
      {
      $page = 1;
      }
      else
      {
      $page = $_GET["page"];
      }
      $nombreDeMessagesParPage = 5;

      mysql_connect("***", "***", "***");
      mysql_select_db("news");
      $premier_message_a_afficher = ($page-1) * $nombreDeMessagesParPage;
      $retour = mysql_query("SELECT COUNT(*) AS nb_messages FROM news
      LIMIT $premier_message_a_afficher, $nombreDeMessagesParPage");
      $totalDesMessages = mysql_result($retour, 0, "nb_messages");

      $nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
      ?>
      <center>
      <div id="body2">
      <?php include("bann.php");
      include("menu.php");?>
      <div id="dateHeure">
      <?php
      $jour = date("d");
      $mois = date("m");
      $annee = date("Y");

      echo "Nous sommes le $jour/$mois/$annee.";
      ?>

      </div><div id=clock></div>

      <bR><br>
      <?php

      $retour = mysql_query('SELECT * FROM news ORDER BY id DESC');

      while ($donnees = mysql_fetch_array($retour))
      {
      ?>

      <div id="news">
      <strong>News du <?php echo date('d/m/Y à H\hi', $donnees['timestamp']); ?></strong>

      <h2><div id="titre_news"><?php echo $donnees['titre']; ?></div></h2>
      <p>

      <?php

      $contenu = nl2br(stripslashes($donnees['contenu']));
      echo $contenu;
      ?>

      </p>
      </div>
      <br><br>

      <?php
      }

      echo 'Page : ';
      for ($i = 1 ; $i <= $nombreDePages ; $i++)
      echo '<a href="index.php?page=' . $i . '">' . $i . '</a> ';

      mysql_close();

      ?>
      <br><br>
      </center>
      </div>
      </body>
      </html>

      C'est chaud... Pour voir ce que ça donne, allez voir le site: http://judex.production.free.fr/
      1. merci de ce code...seulement il ne s'accorde pas avec ma version de php...
        Help! Je suis en détresse!
        1. comme je ne sais pas quel bug tu as...
          je te donne mon script que j'ai fais.
          <?php
          //Pagnination made by Okuni.
          /*LIMIT.
          	LIMIT $premier_message, $nombre_entree_par_page
          */
          	//On récupère les données propre à la page.
          		$page = $_GET['page'];
          		
          		$retour = mysql_query("SELECT * FROM raynal_pagination WHERE page='$page'");
          		$donnees = mysql_fetch_array($retour) or die (mysql_error());
          		
          		$table = $donnees['table'];
          	
          	//On calcule le nombre total d'entrée dans la table.
          		$retour1 = mysql_query("SELECT COUNT(*) AS nbre_entree FROM $table");
          		$donnees1 = mysql_fetch_array($retour1) or die (mysql_error());
          		$total = $donnees1['nbre_entree'];
          	
          	//On récupère le GET du lien.
          		if (!empty($_GET['lien']))
          		{
          			$lien = intval($_GET['lien']);
          		}
          		else
          		{
          			$lien = 1;
          		}
          	
          	//On indique le nombre d'entrée par page maximum.
          		$nombre_entree_par_page = $donnees['nombre_entree_par_page'];
          	
          	//On calcule le nombre de page.
          		$nombre_de_page = ceil($total / $nombre_entree_par_page);
          	
          	//On indique le nombre de lien max qu'on va écrire.
          		$nombre_lien_max = $donnees['nombre_lien_max'];
          		
          		//préparation au début du for
          		$nombre_lien_avant = $lien - $nombre_lien_max;
          		
          		if ($nombre_lien_avant <= 0)
          		{
          			$nombre_lien_avant  = 1;
          		}
          		
          		//préparation a la fin du for.
          		$nombre_lien_apres = $lien + $nombre_lien_max;
          		
          		if ($nombre_lien_apres >= $nombre_de_page)
          		{
          			$nombre_lien_apres = $nombre_de_page;
          		}
          	
          	//On écrit une boucle pour écrire les liens vers les différentes pages.
          		echo '<div class="pagination">Page :<br/>';
          		for ($i = $nombre_lien_avant; $i <= $nombre_lien_apres; $i++)
          		{
          			//si on commence le for, on vois si on est sur la première page ou pas.
          			if ($i == $nombre_lien_avant)
          			{
          				if ($_GET['lien'] == 1 or $lien == 1)
          				{
          					echo '>> ';
          					echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
          				}
          				else
          				{
          					$i_precedent = $_GET['lien'] - 1;
          					echo '<a href="?page='.$page.'&lien='.$i_precedent.'">Page précédente</a> ';
          					echo '<a href="?page='.$page.'&lien='.$i.'">'.$i.'</a> ';
          				}
          			}
          			//on souligne le numéro de la page sélectionnée.
          			else if ($i == $_GET['lien'])
          			{
          				if ($i == $nombre_de_page)
          				{
          					//echo 'dernier lien : '.$i;
          					if ($_GET['lien'] == $nombre_de_page)
          					{
          						echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
          						echo '<<';
          					}
          					else
          					{
          						$i_suivant = $_GET['lien'] + 1;
          						echo '<a href="?page='.$page.'&lien='.$i.'">'.$i.'</a> ';
          						echo '<a href="?page='.$page.'&lien='.$i_suivant.'">Page suivante</a> ';
          					}
          				}
          				else
          				{
          					echo '<a class="pageActive"><strong><u>'.$i.'</u></strong></a> ';
          				}
          			}
          			//si on termine le for, on vois si on a sélectionné le dernier lien ou pas.
          			else if ($i == $nombre_lien_apres)
          			{
          				//echo 'dernier lien : '.$i;
          				if ($_GET['lien'] == $nombre_lien_apres)
          				{
          					echo '<<';
          				}
          				else if (empty($_GET['lien']) and $lien == 1)
          				{
          					$i_suivant = 2;
          					echo '<a href="?page='.$page.'&lien='.$i.'">'.$i.'</a> ';
          					echo '<a href="?page='.$page.'&lien='.$i_suivant.'">Page suivante</a> ';
          				}
          				else
          				{
          					$i_suivant = $_GET['lien'] + 1;
          					echo '<a href="?page='.$page.'&lien='.$i.'">'.$i.'</a> ';
          					echo '<a href="?page='.$page.'&lien='.$i_suivant.'">Page suivante</a> ';
          				}
          			}
          			//sinon on affiche le lien correspondant a $i.
          			else
          			{
          				echo '<a href="?page='.$page.'&lien='.$i.'">'.$i.'</a> ';
          			}
          		}
          		echo '</div>';
          		
          		$premier_message = ($lien - 1) * $nombre_entree_par_page;
          ?>

          il fonctionne avec un $_GET['page'] qui est la page que tu visualise et $_GET['lien'] qui est le lien pour la pagination.
          il y a aussi tout au début une requete qui prend tout ce qui concerne la page ($_GET['page'])
          il y a donc dans cette table :
          page => le nom de la page que tu affiche ($_GET['page'])
          table => le nom de la table utilisé.
          nombre_entree_par_page => nombre de donnéée sur une page.
          nombre_lien_max => longueur des liens (ex : nombre_lien_max = 5 ça donnera comme affichage :5 liens a gauche du lien sélectionné et 5 a droite)

          Grace a ce code, tu peux include ce code partout, tu dois juste ajouter une données dans ta table.
          et pour la requete sql, tu dois rajouer a la fin la limit et ici : LIMIT $premier_message, $nombre_entree_par_page
          c'est noté tout en haut du script.

          voilà :)
          n'oublie pas de changer les nom de la table.^^
          1. $nombreDeMessagesParPage n'est défini nulle part. ( et ceil($totalDesMessages / 5))

            Ensuite, il faut gérer le nombre de pages avant l'affichage pour savoir quelle page affichée.

            Et ensuite, en changeant ta première requète en :
            SELECT * FROM news ORDER BY id DESC LIMIT $premierMessageAafficher, $nombreDeMessagesParPage
            1. Tu ne met pas de limit dans ta requete sql.
              donc forcément, php va afficher toute tes news sur la même page.

              $retour = mysql_query('SELECT * FROM news ORDER BY id DESC LIMIT $X,$Y'); 

              tu dois remplacer $X par le numéro du premier message, ici ce serait $premierMessageAafficher
              et $Y par le nombre d'entree par page.
              tu devra donc mettre ton système de pagination au dessus de la requete sql.

              voilà pour ton problème, mais j'aimerais rajouter une petite chose :
              évite ce genre de chose : date('d/m/Y à H\hi', $donnees['timestamp'])
              utilise plutot les date SQL, elle sont beaucoup plus maniable qu'un timestamp UNIX.

              voilà :)
              1. Avec ce que tu as mis avant :

                if (!$_GET["numpage"]) $numpage = 1;
                else $numpage = $_GET["numpage"];
                $nombreDeMessagesParPage = 5;
                
                mysql_connect("***", "***", "***");
                mysql_select_db("news"); 
                $premier_message_a_afficher = ($numpage-1) * $nombreDeMessagesParPage;
                $retour = mysql_query("SELECT COUNT(*) AS nb_messages FROM news 
                    LIMIT $premier_message_a_afficher, $nombreDeMessagesParPage");
                $totalDesMessages = mysql_result($retour, 0, "nb_messages");
                
                $nombreDePages = ceil($totalDesMessages / $nombreDeMessagesParPage);
                ?>
                <body>
                <center>
                <div id="body2">
                <br /><br />
                <?php
                
                $retour = mysql_query('SELECT * FROM news ORDER BY id DESC');
                while ($donnees = mysql_fetch_array($retour))
                {
                ?>
                
                <div id="news">
                <strong>News du <?php echo date('d/m/Y à H\hi', $donnees['timestamp']); ?></strong>
                <h2><div id="titre_news"><?php echo $donnees['titre']; ?></div></h2>
                <p>
                
                <?php
                $contenu = nl2br(stripslashes($donnees['contenu']));
                echo $contenu;
                ?>
                
                </p>
                </div>
                <br><br>
                
                <?php
                } 
                
                echo 'Page : ';
                for ($i = 1 ; $i <= $nombreDePages ; $i++)
                   echo '<a href="index.php?page=' . $i . '">' . $i . '</a> ';
                


                A voir pour la date si tu changes ton timestamp en format date, tu n'as qu'à afficher.
                Par contre, je n'ai pas tester.
                1. Ce n'est pas très précis tout ça, c'est quoi qui ne marche pas ?

                  ah oui, je viens de voir entre autre qu'il fallait changer $numpage par $page passé que tu passes dans ton lien.
                  1. As-tu changer le $numpage en $page ?

                    Si oui, fait des echo de tes variables pour voir où est le problème.
                    1. Je me permet de vous poster un code très simple pour la pagination en cas où.

                      <form name="pagination" method="post">
                      <? if ($entier > 1){ if ($page == 1) {echo"<    "; }else {$pr = $page-1; ?><a href="#" onclick="desc('<? echo"$pr"?>')"><?php echo"<"?></a>    <? }?>
                      <? for ($j = 1; $j <= $entier ; $j++){
                      if ($j != $page){?>
                      <a href="#" onclick="desc('<? echo"$j"?>')"><?php echo"$j"?></a><?php }else {echo $j;}?>    
                      <? }?>
                      <? if ($page == $entier) {echo">"; }else {$pr = $page+1; ?><a href="#" onclick="desc('<? echo"$pr"?>')"><?php echo">"?></a><? }}?>
                      <input type="hidden" name="page" />
                      </form>
                      <script language="javascript">
                      function desc(id)
                      {
                      document.pagination.page.value = id;
                      document.pagination.submit();
                      }
                      </script>

                      Ce code affiche

                      < 1 2 3 4 ... >