Version complète: sur le forum Webmaster Hub : script de pagination ne marche pas
Webmaster Hub > Création et exploitation de Sites Internet > Les langages du Net > PHP
tonguim
Bonsoir,

Je voudrais réaliser un script en php qui affiche tous les enregistrements de ma base de données (10 enregistrements par page, en 2 colonnes: donc 5 enregistrements par colonnes); de plus je voudrais paginer toutes les pages que j'obtiendrais, de cette manière: 1, 2, 3, .... (1, 2, 3, ... étant des nombres hyperactifs; cela signifie qu'en cliquant sur "1", je vais sur la première page; sur "2" sur la 2e page etc.)

Mon code que voici, ne m'affiche rien du tout: juste le titre de la page avec les numéros hyperactifs 1, 2, 3 ... Il n'ya aucune erreur php; les noms des champs de la table, et le nom de la table sont bien justes. A mon avis, le problème se situe problablement au niveau des boucles (while et for). Pouvez vous m'aider à détecter ce qui ne va dans mon code? Merci


CODE
<!doctype html public "-//W3C//DTD HTML 4.0 //EN">
<html>
    <head>
      <title>Title here!</title>
    </head>
    <body>
 <table>
 <tr>
     <td colspan="2"><h2><center>Actualités</center></h2>
     </td>
 </tr>
 <tr>
     <td>
    <?php
     include("connexion.php");    
 
     $requete=mysql_query("select * from articles order by date desc"); //query
     $nombreLignes=mysql_num_rows($requete); //nombre d'enregistrements total de la bd
     $nombreArticlePage=10; //nombre d'article par column
     $nombrePg=ceil($nombreLignes/$nombreArticlePage); //nombre total de pages qui seront affichées      
     $numPgUrl=@$_GET["num"]; //numero de la page dans l'url
     $numPgCour=0;
     $col1=0; //premiere colonne du tableau html
     $col2=0; //deuxième colonne du tableau html
     while($numPgCour < $numPgUrl)
           {
   for($i = 1; $i<=$nombreArticlePage/2; $i++)
   {
       mysql_fetch_array($requete);    
   }
   $numPgCour++;
     }
     for($i = 1; $i<=$nombreArticlePage/2; $i++)
     {
   if ($col1=mysql_fetch_array($requete) == 0) break;
   if ($col2=mysql_fetch_array($requete) == 0) break;
           echo "<tr><td><b>" .$col1['titre']. "</b></td><td><b>".$col2['titre']."</b></td></tr>
             <tr><td>" .$col1['resume']. "</td><td>" .$col2['resume']. "</td></tr>";
           }      
     ?>Page<?
     for($i = 1; $i<=$nombrePg; $i++)
     {
         if($numPgUrl == $i)
   {
         echo $i;
         }
   else
   { ?>
         <a href="?num=<? echo $i ?>"
           >&nbsp;<? echo $i; ?>&nbsp;</a>
         <? }
     }      
    ?>
 </table>
    </body>
</html>
e.MiLoU
Déjà quelques commentaires d'optimisation... Je ne comprends pas pourquoi tu mets ce morceau de code
CODE
while($numPgCour < $numPgUrl)
       {
  for($i = 1; $i<=$nombreArticlePage/2; $i++)
  {
   mysql_fetch_array($requete);
  }
  $numPgCour++;
 }


Ne serait-ce pas plus facile de faire un SELECT avec un limite?? Du genre:

"SELECT titre,resume FROM articles SELECT BY DATE LIMIT $nbPage*$nombreArticlePage, ($nPage+1)*$nombreArticlePage" (=> non-vérifié, mais ça devrait marcher wink.gif )


Et ici
CODE
for($i = 1; $i<=$nombreArticlePage/2; $i++)
 {
  if ($col1=mysql_fetch_array($requete) == 0) break;
  if ($col2=mysql_fetch_array($requete) == 0) break;
          echo "<tr><td><b>" .$col1['titre']. "</b></td><td><b>".$col2['titre']."</b></td></tr>
            <tr><td>" .$col1['resume']. "</td><td>" .$col2['resume']. "</td></tr>";
 }  


Je crois qu'il ne faut pas diviser par deux dans ton test du for... En plus dans le test avec $col2, tu pourrais perdre un article pcq $col1 contient quelque chose mais $col2 pas (j'espère que tu as suivi wink.gif )

Essaie avec ces quelques changements et dis-nous si il y a une différence...
tonguim
Bonsoir e.milou,

j'ai effectue de grands changements dans le code ... qui est plus logique maintenant. Les enregistrements ne s'affichent toujours pas.

CODE
<html>
    <body>
    <?
 include("connexion.php");  

 $nbMsgPage = 3;

 $requete = mysql_query('select count(*) as nb_messages from articles');
 $resultat = mysql_fetch_array($requete);
 $nbMsgTotal = $resultat['nb_messages'];

 $nbPages = ceil($nbMsgTotal / $nbMsgPage);

 echo 'Page : ';
 for ($i=1; $i<=$nbPages; $i++)
 {
     echo '<a href="pagination7.php?page=' . $i . '">' . $i . '</a> ';
 }
 //$requete = mysql_query('select * from articles order by date desc limit 0, $nbMsgPage');
    ?>
    <?
 $page=1; // par defaut, on est sur la premiere page
 if(isset($_GET['page'])) // si on a un parametre dans l'url
 {
     $page=(int)$_GET['page']; // on le recupere, le (int) devant c'est pour s'assurer de recuperer un nombre
 }
 // on verifie si on n'a pas 0 dans $page
 if ($page<=0) // si on a 0 ou un nombre negatif
     $page=1; // on se remet sur la premiere page

 // on est qu'on est au moins sur la première page
 // calcul de la valeur a utiliser dans LIMIT pour le debut
 $debut=($page-1)*$nbMsgPage;
 
 //requete pour chercher les articles adequats a la page où on se trouve :
 $requete=mysql_query('select * from articles order by date desc limit '.$debut.', '.$nbMsgPage);
 ?><table><?
 
 //ci dessous je divise parce que je veux afficher les articles en 2 colonnes sur chaque page
 while((($ligne1=mysql_fetch_array($requete))!=0) && (($ligne2=mysql_fetch_array($requete))!=0))
 {
     if (($ligne1=mysql_fetch_array($requete)) == 0) break;
     if (($ligne2=mysql_fetch_array($requete)) == 0) break;
    ?>
    <?      
 echo "<tr><td><b>" .$ligne1['titre']. "</b></td><td><b>".$ligne2['titre']."</b></td></tr>
           <tr><td>" .$ligne1['resume']. "</td><td>" .$ligne2['resume']. "</td></tr>";    
    }
    ?></table>
    </body>
</html>
e.MiLoU
Voilà, j'ai quelque peu modifier... Dis-moi ce que ça donne

CODE

<?


include('connection.php');

$nbMsgPage = 10;

// On va chercher le nombre de messages
$requete = mysql_query('select count(*) as nb_messages from articles');
$resultat = mysql_fetch_array($requete);
$nbMsgTotal = $resultat['nb_messages'];

// On en détermine le nombre de pages
$nbPages = ceil($nbMsgTotal / $nbMsgPage);

// On affiche les liens pour les différentes pages
echo 'Page : ';
for ($i=1; $i<=$nbPages; $i++)
{
echo "<a href=\"?page=$i\">$i</a> ";
}


// On détermine la page
$page = 1; // Par defaut, on est sur la premiere page
// Si on a un parametre dans l'url et que c'est un nombre supérieur à 0
if(isset($_GET['page']) && is_numeric($_GET['page']) && $_GET['page'] > 0)
{
$page = (int)$_GET['page'];
}


// Calcul de la valeur a utiliser dans LIMIT pour le debut et la fin
$debut = ($page-1)*$nbMsgPage;

// Requête pour chercher les articles adequats a la page où on se trouve :
$sql = "SELECT titre,resume FROM articles ORDER BY nom LIMIT $debut, $nbMsgPage "; // A MODIFIER
$sql = mysql_query($sql) or die(mysql_error());

echo '<table>';

// Ci-dessous je divise parce que je veux afficher les articles en 2 colonnes sur chaque page
$i = 0;
echo '<tr>';
while( $ligne1 = mysql_fetch_array($sql) )
{
if ($ligne2 = mysql_fetch_array($sql) == 0)
{
$ligne2['titre'] = '&nbsp;';
$ligne2['resume'] = '&nbsp;';
}
echo '</tr><td><b>'.$ligne1['titre'].'</b></td><td><b>'.$ligne2['titre'].'</b></td></tr>';
echo '</tr><td>'.$ligne1['resume'].'</td><td>'.$ligne2['resume'].'</td></tr>';
}

echo '</table>';

echo '</table>';
echo '</body>';
echo '</html>';

?>
tonguim
Bonsoir e.Milou,

j'ai essayé ton code; il affiche des enregistrements seulement sur la première page, et pas sur les autres. J'ai encore modifié mon code, mais le résultat est le même: les enregistrements ne s'affichent pas. Je pense que le problème vient de mes boucles, mais quoi precisement. Merci de m'aider.

CITATION
<html>
<body>
<?
  include("connexion.php"); 

  $nbMsgPage = 3;

  $requete = mysql_query('select count(*) as nb_messages from articles');
  $resultat = mysql_fetch_array($requete, MYSQL_ASSOC);
  $nbMsgTotal = $resultat['nb_messages'];

  $nbPages = ceil($nbMsgTotal / $nbMsgPage);

  echo 'Page : ';
  for ($i=1; $i<=$nbPages; $i++)
  {
  echo '<a href="pagination7.php?page=' . $i . '">' . $i . '</a> ';
  }
  //$requete = mysql_query('select * from articles order by date desc limit 0, $nbMsgPage');
?>
<?
  $page=1; // par defaut, on est sur la premiere page
  if(isset($_GET['page'])) // si on a un parametre dans l'url
  {
  $page=(int)$_GET['page']; // on le recupere, le (int) devant c'est pour s'assurer de recuperer un nombre
  }
  // on verifie si on n'a pas 0 dans $page
  if ($page<=0) // si on a 0 ou un nombre negatif
  $page=1; // on se remet sur la premiere page

  // on est qu'on est au moins sur la première page
  // calcul de la valeur a utiliser dans LIMIT pour le debut
  $debut=($page-1)*$nbMsgPage;
 
  //requete pour chercher les articles adequats a la page où on se trouve :
  $requete=mysql_query('select * from articles order by date desc limit '.$debut.', '.$nbMsgPage);
  ?><table><?
 
  //ci dessous je divise parce que je veux afficher les articles en 2 colonnes sur chaque page
  while(($ligne1=mysql_fetch_array($requete, MYSQL_ASSOC))!=0)
  { 
  if (($ligne2=mysql_fetch_array($requete, MYSQL_ASSOC)) == 0)
?>
<? 
  echo "<tr><td><b>" .$ligne1['titre']. "</b></td><td><b>".$ligne2['titre']."</b></td></tr>
        <tr><td>" .$ligne1['resume']. "</td><td>" .$ligne2['resume']. "</td></tr>";
}
?></table>
</body>
</html>
tonguim
Bonjour,

mon code marche maintenant; voici la bonne version:

CITATION
<html>
<body>
<?
  include("connexion.php"); 

  $nbMsgPage = 10;

  $requete = mysql_query('select count(*) as nb_messages from articles');
  $resultat = mysql_fetch_array($requete, MYSQL_ASSOC);
  $nbMsgTotal = $resultat['nb_messages'];
  $debut=0;
  $nbPages = ceil($nbMsgTotal / $nbMsgPage);

  echo 'Page : ';
  for ($i=1; $i<=$nbPages; $i++)
  {
  echo '<a href="pagination8.php?page=' . $i . '">' . $i . '</a> ';
  }
  //$requete = mysql_query('select * from articles order by date desc limit 0, $nbMsgPage');
?>
<?
  $page=1; // par defaut, on est sur la premiere page
  if(isset($_GET['page'])) // si on a un parametre dans l'url
  {
  $page=(int)$_GET['page']; // on le recupere, le (int) devant c'est pour s'assurer de recuperer un nombre
  }
  // on verifie si on n'a pas 0 dans $page
  if ($page<=0) // si on a 0 ou un nombre negatif
  $page=1; // on se remet sur la premiere page

  // on est qu'on est au moins sur la première page
  // calcul de la valeur a utiliser dans LIMIT pour le debut
  $debut=($page-1)*$nbMsgPage;

  //requete pour chercher les articles adequats a la page où on se trouve :
  //$requete=mysql_query('select * from articles order by date desc limit '.$debut.', '.$nbMsgPage);
  $requete=mysql_query('select * from articles order by date desc limit '.$debut.', '.$page*$nbMsgPage); 
  ?><table><? 
  //ci dessous je divise parce que je veux afficher les articles en 2 colonnes sur chaque page
  $i=0;
  echo"<tr>";
  while(($ligne=mysql_fetch_array($requete))
  { 
  $i++; 
  echo "<td><b>" .$ligne1['titre']. "</b></td>";
  if($i==2)]
  {
    echo"</tr><tr>";
    $i=0;
  }
  }
  echo"</tr>";
?>
</table>
</body>
</html>


Merci a tous
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'information, la mise en page et les images, veuillez cliquer ici.