Affichage page par page avec une barre de navigation

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Affichage page par page avec une barre de navigation

Re: Affichage page par page avec une barre de navigation

par noviceenphp » 01 mars 2010, 08:34

Là, ça paraît plus clair. Il n'affiche que les 12 premiers et il faut programmer pour le reste. Je vais essayer de voir ça de près. Merci beaucoup pour ton aide. Je reviendrai sur le forum lorsque c'est ok ou pas. :D

Re: Affichage page par page avec une barre de navigation

par ouckileou » 26 févr. 2010, 16:54

SELECT entrefrmlg, catfrmlg, deffrmlg, etyfrmlg, sensfrmlg, figefrmlg, voirfrmlg FROM dicofrmlg WHERE entrefrmlg LIKE "a%" ORDER BY entrefrmlg ASC LIMIT 0,12.
Cette requête t'affiche 12 lignes à partir de la première (le 0)

Cela semble bon, j'imagine que c'est donc la requête utilisée sur la première page. Quelle est la requête utilisée sur la deuxième ? C'est à partir de là qu'est ton problème, donc c'est sur celle là que tu dois regarder...

Re: Affichage page par page avec une barre de navigation

par noviceenphp » 26 févr. 2010, 16:32

Est-ce que tout ce que j'ai fait est correct ??? Tu peux me donner plus d'incides ??? 8-|

Re: Affichage page par page avec une barre de navigation

par noviceenphp » 26 févr. 2010, 12:05

Si je comprends bien. Tu me dits de remplacer l'affichage des résultats par un écho $sql; est-ce vrai ?? Et voir ensuite ce qui s'affiche à l'écran.

Je l'ai fait, voici le code :
<!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" xml:lang="fr">
<head>
</head>
<body>
<?php
       if (isset($_POST['submit']) && $_POST['submit']=='Ok') {
       if ((isset($_POST['entree']))) {

       // si le variable n'est pas vide alors, et seulement dans ce cas, on fera la suite de la requête
       if ((!empty($_POST['entree']))) {

      include ('../../include/configuration.php');

      //On se connecte à la base
      $base = mysql_connect ($host, $user,$passwd) or die ("erreur de connexion au serveur");
      mysql_select_db ($bdd , $base)  or die ("erreur de connexion a la base de donnees");

// on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages  
$sql = 'SELECT count(*) FROM dictionnaire WHERE entree LIKE "'.$_POST['entree'].'%" ORDER BY entree ASC';  

// 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 '<p align="center">Ce mot n\'existe pas dans le dictionnaire !</p>';  

}  

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 (!isset($_GET['debut'])) $_GET['debut'] = 0;

   $nb_affichage_par_page = 12;

    // on prépare notre requête avec le LIMIT

   $sql = 'SELECT entree, categorie, definition, etymologie, sens, figee, voir FROM dictionnaire WHERE entree LIKE

"'.$_POST['entree'].'%" ORDER BY entree ASC LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;  


   // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)

   $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());

   // on va scanner tous les tuples un par un

   while ($data = mysql_fetch_array($req)) {

      // on affiche les résultats

         echo "$sql";

//       echo '<table class="dictionnaire" border="1"><tr><td width="130">';

//       echo htmlentities(trim($data['entree']));

//       echo ' ',htmlentities(trim($data['categorie'])),'</td>';

//       echo '<td width="270">',htmlentities(trim($data['definition']));

//       echo ' ',htmlentities(trim($data['etymologie']));

//       echo ' ',htmlentities(trim($data['sens']));

//       echo ' ',htmlentities(trim($data['figee']));

//       echo ' ',htmlentities(trim($data['voir']));

//       echo '</td></tr></table><br />';

   }

   // on libère l'espace mémoire alloué pour cette reqête

   mysql_free_result ($req);
   
   
      // on affiche enfin notre barre de navigation

   echo '<div class="nbr_pages">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 5).'</div>';


     }

   // on libère l'espace mémoire alloué pour cette reqête

   mysql_free_result ($resultat);


   // on ferme la connection à la base de données.

   mysql_close ();

 }

               else{

        echo '<p align="center">Le formulaire est vide !!!</p>';

        }              

                  }

    else {

    $erreur = '<p align="center">Les variables nécessaires au script ne sont pas définies.</p>';

        }

             }

?>
</body>
</html>
Et voila maintenant ce qui s'affiche à l'écran. Si je n'ai pas fait de bêtise :shock: et si je comprends ce qui s'affiche à l'écran :

SELECT entrefrmlg, catfrmlg, deffrmlg, etyfrmlg, sensfrmlg, figefrmlg, voirfrmlg FROM dicofrmlg WHERE entrefrmlg LIKE "a%" ORDER BY entrefrmlg ASC LIMIT 0,12.

Il a mis beaucoup à l'écran mais je ne vais pas les mettres tous. Si je comprends bien, il ne veut afficher que les 12 premiers mais tous la bdd qui contient 10 000 entrées.

Re: Affichage page par page avec une barre de navigation

par ouckileou » 26 févr. 2010, 11:23

Affiche la requête SQL exécutée dans ta page et teste la directement sur MySQL, regarde si quelque chose ne va pas, tu n'as peut-être aucun résultat qui n'est renvoyé car ta requête est mal construite dynamiquement.

Affichage page par page avec une barre de navigation

par noviceenphp » 26 févr. 2010, 09:34

Bonjour,

J'ai un niveau moyen en php. J'essaie de faire un petit dictionnaire sous php. Lorsque je tape la lettre "a" ou "b" ou "c" dans un formulaire, le script affiche par douze tous les mots commençant par un "a" ou "b" ou "c" dans la base de donnée de mon dictionnaire avec une barre de navigation en bas.

Tout marche très bien pour la première page mais la deuxième page et la suite reste vide. #-o

Est-ce que quelqu'un peut corriger mon code et surtout ???
M'expliquer l'erreur dans mon script ???

Merci de votre réponse

Voici le premier code qui est la barre de navigation (ça marche très bien avec mon mini-livre d'or et forum):
<?php
// fonction barre de navigation qui marche très bien parce que je l'ai déjà utilisé sur un mini-livre d'or
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;   
}  
?>
Voici le code qui doit afficher le dictionnaire 12 entrées par page et qui est vide à partir de la deuxième page :
<!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" xml:lang="fr">
<head>
</head>
<body>
<?php
       if (isset($_POST['submit']) && $_POST['submit']=='Ok') {
       if ((isset($_POST['entree']))) {

       // si le variable n'est pas vide alors, et seulement dans ce cas, on fera la suite de la requête 
       if ((!empty($_POST['entree']))) {

      include ('../../include/configuration.php');

      //On se connecte à la base
      $base = mysql_connect ($host, $user,$passwd) or die ("erreur de connexion au serveur"); 
      mysql_select_db ($bdd , $base)  or die ("erreur de connexion a la base de donnees"); 

// on prépare une requête permettant de calculer le nombre total d'éléments qu'il faudra afficher sur nos différentes pages  
$sql = 'SELECT count(*) FROM dictionnaire WHERE entree LIKE "'.$_POST['entree'].'%" ORDER BY entree ASC';   

// 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 '<p align="center">Ce mot n\'existe pas dans le dictionnaire !</p>';  

}  

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 (!isset($_GET['debut'])) $_GET['debut'] = 0; 

   $nb_affichage_par_page = 12;

    // on prépare notre requête avec le LIMIT

   $sql = 'SELECT entree, categorie, definition, etymologie, sens, figee, voir FROM dictionnaire WHERE entree LIKE 

"'.$_POST['entree'].'%" ORDER BY entree ASC LIMIT '.$_GET['debut'].','.$nb_affichage_par_page;  


   // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) 

   $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 

   // on va scanner tous les tuples un par un 

   while ($data = mysql_fetch_array($req)) { 

      // on affiche les résultats 

       echo '<table class="dictionnaire" border="1"><tr><td width="130">';

       echo htmlentities(trim($data['entree']));

       echo ' ',htmlentities(trim($data['categorie'])),'</td>';

       echo '<td width="270">',htmlentities(trim($data['definition']));

       echo ' ',htmlentities(trim($data['etymologie']));

       echo ' ',htmlentities(trim($data['sens']));

       echo ' ',htmlentities(trim($data['figee']));

       echo ' ',htmlentities(trim($data['voir']));

       echo '</td></tr></table><br />';

   }

   // on libère l'espace mémoire alloué pour cette reqête 

   mysql_free_result ($req);
   
   
      // on affiche enfin notre barre de navigation

   echo '<div class="nbr_pages">'.barre_navigation($nb_total, $nb_affichage_par_page, $_GET['debut'], 5).'</div>';


     }

   // on libère l'espace mémoire alloué pour cette reqête 

   mysql_free_result ($resultat);


   // on ferme la connection à la base de données. 

   mysql_close ();

 }

               else{

        echo '<p align="center">Le formulaire est vide !!!</p>';

        }               

                  } 

    else { 

    $erreur = '<p align="center">Les variables nécessaires au script ne sont pas définies.</p>';

        }

             } 

?>
</body>
</html>