Conseil pour pagination via PHP

Albert
Invité n'ayant pas de compte PHPfrance

27 août 2005, 21:05

Bonjour à tous... me revoilà avec mon problème de pagination.
Pour rappel voilà mon dernier post : http://phpfrance.com/forums/voir_repons ... .php#53216

Alors un petit récapitulatif :
Pour le moment, je fais une application qui nécessite d'être identifié (login + mdp) et je récupère les infos via les sessions.
Dans mes pages, pour le retour de mes requêtes, je souhaite paginer ces derniers car très nombreux.

J'ai donc fait une fonction qui fait tout ça mais je sais pas si c'est le mieux, et j'ai quand même des problèmes car :
1- pour réactualiser la page après une action (modification ou suppression de l'enregistrement), je conserve la requête dans une variable de session => mais ça veut dire que si je veux faire ça dans une zone "publique" (sans besoin d'être identifié, je ne peux pas l'utiliser...)
2- y-a-t-il mieux que mon "usine à gaz" ?

Voici le code de la fonction :
<?
/**
 * Fonctions de pagination de résultat
 *
 * Cette fonction permet d'afficher le résultat d'une requete sur plusieurs
 * pages.
 *
 */

function paginer($requete,$nombre_total_de_resultat,$iResultPPpage){
    global $barre;
     $nombre_de_page=ceil($nombre_total_de_resultat/$iResultPPpage);
        //par defaut nous sommes sur la page 1
         // Sinon prend la valeur de $_GET[page]
         //a condition quelle soit inferieure ou egale au nombre total de page
         if (isset ($_GET[page])){
             if($_GET[page]<=$nombre_de_page){
                $page=$_GET[page];
             }else{
               $page=1;
             }
         }else{
            $page=1;
         }
     // on calcule la valeur du début de la clause SQL LIMIT
     // d'après la page où l'on se trouve...

      $debut=($page*$iResultPPpage)-$iResultPPpage;

     // on concatène le tout à la requête de départ et on va ensuite
     // travailler sur le résultat de CETTE requête.
     $requete.=" LIMIT $debut,$iResultPPpage";

      // on veut afficher au maximum 9 pages sous la forme
      // " <<-1-2-3-4-5-6-7-8-9->> "
      // on va donc faire une boucle que l'on va décaler
      // à chaque fois de une page, à partir de la cinquième page
      // et jusqu'à l'avant avant ...n page.

      if($_GET[page]>5 && $_GET[page]<=($nombre_de_page-4)){
          $decale=$_GET[page]-5;
          }
      elseif($_GET[page]<5) {$decale=0;}
      elseif($_GET[page]>($nombre_de_page-5))
      {
      $decale=$nombre_de_page-9;
      //Echo "<p>page en cour > $nombre_de_page-5";
      }
      // ensuite on veut afficher des "boutons" précedent et suivant
      //Echo ("<br>page=".$page." sur ".$nombre_de_page."<br>");

      if($page==$nombre_de_page){
          $plus= "";
      }Else{
          $plus = "<a href=".$_SERVER['PHP_SELF']."?page=".($page+1).">";
          $plus .= "Suivant&gt&gt </a>";
      }

      if ($page==1){
          $moins = "";
      }Else{
          $moins = "<a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">";
          $moins .= "&lt&ltPrécedent </a>";
      }

      // en fonction du nombre de page on distingue deux fin de boucle
      // possible...

      if ($nombre_de_page<10){
         $fin_de_boucle= $nombre_de_page;
         $decale=0;
      }else{
         $fin_de_boucle=9+$decale;
      }
      // on fait une boucle afin d'afficher les N°s de page.
      for($i=1+$decale;$i<=$fin_de_boucle;$i++){
          if($i==$page){
             $menu .= " $i ";
          }else{
             $menu .=" <a href=".$_SERVER['PHP_SELF']."?page=$i>$i</a> ";
          }
       }
      $barre= $moins . $menu . $plus;
      Return($requete);

    }  
?>
Maintenant voilà le code d'une page qui se sert de cette fonction :
<?php
/**
 * Modifier / Supprimer les informations d'une épreuve
 *
 * Page qui permet de modifier les informations d'une épreuve après avoir recherché
 * cette dernière.<br>
 * Module : Intranet
 *
 * @author Albert
 * @version Version 1.0 - 22 Aout 2005
 */

 //On va utiliser les sessions
 session_start();

 //On va avoir besoin des constantes de l'application
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_constantes.php");
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_connexion.php");
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_imgUser.php");
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_session.php");
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_cleanHTML.php");
 require_once($_SERVER['DOCUMENT_ROOT']."/cfg/include/_paginer.php");

 //On appelle la fonction qui vérifie l'état de la session
 //en fonction du type d'utilisateur
 isLogged('user');

//On vérifie si l'on a demandé la suppression de l'enregistrement
if ($_GET['action']=='suppr'){
 //Requête de sélection de l'épreuve
 $sReqDel = "DELETE FROM epreuve ";
 $sReqDel = $sReqDel . "WHERE id_epr = " . $_POST['num_epr'];

 //Appel de la fonction de connexion à la BDD
 conn_intranet(BASE);

 //Exécution de la requête SQL
 $result = query($sReqDel);

 //Appel de la fonction de deconnexion à la BDD
 deconnexion();
}

 //On indique le titre que l'on veut donner à la page dans la barre des titres
 $titre = 'Modifier / Supprimer une épreuve';

 //Entête qui apparait entre les boutons de retour et d'aide dans le tableau
 $entete = $titre;

 //On définit le nom du fichier d'aide
 $fichier_aide='aide_rech_epr.php';

?>
<html>
  <head>
    <title>
      <? echo "" . NOM_APPLICATION . " - " . $titre; ?>
    </title>
    <? echo "<link href='".PATH_APPLI."/style.css' rel='stylesheet' type='text/css'>"; ?>

    <script language="JavaScript" type="text/javascript">
    function suppression()
    {
	  confirmation = confirm("Etes-vous sûr de vouloir supprimer définitivement cette épreuve ?")
	  if(confirmation==true)
      {
        document.form_epr.submit();
	return true;
      }
      else
      {
        return false;
      }
    }
    </script>

  </head>

  <body onload="javascript:document.form_cat.libelle.focus()">

<!--Formulaire de saisie des informations-->
<form name="form_epr" method="POST" action="<? $_SERVER['PHP_SELF'] ?>">
  <!--Tableau permettant l'encadrement des données-->
  <table align='center' width='45%' class='tableau_container' cellpadding='0' cellspacing='0'>
    <tr>
      <td>
        <!--Tableau contenant les 2 autres tableaux (données et boutons)-->
        <table align='center' width='100%' class='tableau_contenu' cellpadding='' cellspacing=''>
          <tr>
            <td>
              <!--Tableau des données-->
              <table align='center' width='100%' border='0' cellpadding='4' cellspacing=''>
                <tr>
		  <td class='entete_tableau_home'><?php user_img(); ?></td>
                  <td class='entete_tableau'><?php echo "$entete";?></td>
                  <td class='entete_tableau_aide'><?php aide_img($fichier_aide); ?></td>
                </tr>
                <tr>
		  <td colspan='3'>
		    <table width='100%'>
                      <tr>
                        <td>Libellé de l'épreuve :</td>
                        <td>
			  <input type='text' name='libelle' size='20' maxlength='50'>
		        </td>
		        <td width='5'></td>
         	      </tr>
		      <tr>
		        <td align='center' width='100%' colspan='5'>
		  	  <input type='submit' name='recherche' value="Rechercher">
  	                </td>
                      </tr>         	
                    </table>
                  </td>
                </tr>
              </table>
            </td>
          </tr>
        </table>
      </td>
    </tr>
  </table>
  <div class='remarque'>Si aucun champ n'est renseigné, tous les résultats s'afficheront.</div>
</form>

<br>
<br>
<?
//================================
//   TRAITEMENT DU FORMULAIRE
//================================

//Si le bouton 'Rechercher' a été cliqué, on traite la requête
//Cas du premier passage sur la page
if (isset($_POST['recherche'])){
    //On récupère les valeurs saisies
    $sLib = $_POST['libelle'];

    //On nettoie les données
    $sLib = cleanHTML($sLib);

    /* +------------------------------+
       |  SELECTION DES INFORMATIONS  |
       +------------------------------+ */
    //Requête de sélection
    $sReqInfo = "SELECT id_epr, epr_libelle, epr_description FROM cfg_epreuve ";
    $sReqInfo = $sReqInfo . "WHERE epr_libelle LIKE '$sLib%' ORDER BY epr_libelle ASC";

    //On stocke la requête pour pouvoir afficher le reste des résultats
    //dans le cas d'un affichage multipages
    $_SESSION['req'] = $sReqInfo;

    //On stocke également la requête qui permet de calculer le nombre total
    //de résultats de la requête pour l'affichage.
    //En effet, c'est plus rapide de le faire calculer par le serveur de BDD
    //que par le serveur Web via mysql_num_rows()
    $_SESSION['nbTotal'] = "SELECT count(*) FROM epreuve WHERE epr_libelle LIKE '$sLib%'";
}

//Si le bouton 'Rechercher' a été cliqué, ou que le paramètre 'page' de l'URL
//est renseigné, on traite la requête
if ((isset($_POST['recherche'])) || (isset($_GET[page]))){
    //Appel de la fonction de connexion à la BDD
    conn_intranet(BASE);

    //Exécution de la requête
    $result = query($_SESSION['nbTotal']);

    //On récupère le nombre de lignes correspondant à la requête pour
    //la fonction de pagination
    $row=mysql_fetch_row($result);
    $iNombre_total_de_resultat=$row[0];

    //Deconnexion de la BDD
    deconnexion();

    //Appel de la fonction de connexion à la BDD
    //pour l'exécution de la requête avec la fonction de pagination
    conn_intranet(BASE);

    //Requete paginnée
    $sReq = $_SESSION['req'];
    //Appel de la fonction de pagination en passant en paramètres :
    //  - la requête à paginer
    //  - le nombre total de résultats
    //  - le nombre de résultats par page souhaité
    $sReqPaginee = paginer($sReq,$iNombre_total_de_resultat,10);

    //Exécution de la requête
    $result = query($sReqPaginee);

    //On traite en fonction du nombre de résultats
    if($iNombre_total_de_resultat == 0){
      echo "<br>\n";
      echo "<div class='erreur'>\n";
      echo "Désolé, aucun résultat répondant à votre requête n'a été trouvé !";
      echo "</div>\n";
    }
    else{
    ?>

    <!--Affichage du nombre de résultats-->
    <table align='center' width='70%' cellpadding='0' cellspacing='0'>
      <tr>
        <td>
          Il y a <b><? echo $iNombre_total_de_resultat ?></b> résultat(s) correspondant(s)
        </td>
        <!--Affichage de la barre de navigation-->
        <td align='right'><?echo($barre);?>
        </td>
      </tr>
    </table>
    <!--Tableau permettant l'encadrement des données-->
    <table align='center' width='70%' class='resultat_container' cellpadding='0' cellspacing='0'>
      <tr>
        <td>
          <!--Tableau contenant les 2 autres tableaux (données et boutons)-->
          <table align='center' width='100%' cellpadding='' cellspacing=''>
            <tr>
              <td>
                <!--Tableau des données-->
              	<table align='center' width='100%' border='0' cellpadding='2' cellspacing='2'>
                  <tr>
                    <td class='resultat_entete' nowrap='nowrap'>Libellé de l'épreuve</td>
                    <td class='resultat_entete' nowrap='nowrap'>Description de l'épreuve</td>
                    <td class='resultat_entete' colspan='2' nowrap='nowrap'>Action</td>
                  </tr>

    <?
    //On fait une boucle pour récupérer les résultats
    while($ligne=mysql_fetch_array($result))
    {
      $iNumero = $ligne['id_epr'];
      $sLibelle = $ligne['epr_libelle'];
      $sDescription = $ligne['epr_description'];

      //On traite les éventuels retours à la ligne pour l'affichage dans la cellule
      $sDescription = nl2br($sDescription);

      //On enlève les éventuels slashs dans les chaines
      $sLibelle = stripslashes($sLibelle);
      $sDescription = stripslashes($sDescription);

      //Formulaire pour la modification
      echo "        <form name='form_mod' method='POST' action='ajt_epr.php'>\n";
      //Champs cachés permettant de transmettre le type d'action à entreprendre
      //ainsi que le numéro de l'utilisateur à traiter
      echo "<input type='hidden' name='num_epr' value='$iNumero'>\n";
      echo "<input type='hidden' name='modif_epr' value='Modifier Epreuve'>\n";

      //Affichage des cellules avec les résultats
      echo "          <tr class='resultat_contenu'>\n";
      echo "            <td>$sLibelle</td>\n";
      echo "            <td>$sDescription</td>\n";
      echo "            <td align='center'>\n";
      echo "		  <input type='image' src='".PATH_APPLI."/images/modifier.gif' border='0' alt=\"Modifier l'épreuve\">\n";
      echo "		</td>\n";      		
      echo "	  </form>\n";

      //Formulaire pour la suppression
      //On cherche le numéro de page pour mettre le lien en page
      if(empty($_GET['page'])){
	  $page ='page=1&';
      }
      else{
	  $page = 'page='.$_GET['page'].'&';
      }

      echo "        <form name='form_supp' method='POST' action='rech_epr.php?".$page."action=suppr' onsubmit='javascript:return suppression();'>\n";
      //Champs cachés permettant de transmettre le numéro de la catégorie à traiter
      echo "<input type='hidden' name='num_epr' value='$iNumero'>\n";
      echo "            <td align='center'>\n";
      echo "              <input type='image' src='".PATH_APPLI."/images/supprimer.gif' border='0' alt=\"Supprimer l'épreuve\">\n";
      echo "            </td>\n";
      echo "          </tr>\n";
      echo "	  </form>\n";
    }

    //Appel de la fonction de déconnexion de la BDD
    deconnexion();

    echo "        </table>\n";
    ?>

                </td>
              </tr>
            </table>
          </td>
        </tr>
      </table>

  <?
  //Fin du ELSE
  }

//Fin du IF
}
?>

  <p class="credit"><? echo CREDIT; ?></p>
</body>
</html>
Voilà j'espère que vous pourrez m'aider à simplifier tout ça ou me donner des conseils.
Merci d'avance.
Albert

Eléphant du PHP | 185 Messages

27 août 2005, 21:20

Oula, c'est bien compliqué tout ca, et puis entre balise

Code : Tout sélectionner

et [/code ], ca colore pas bien le php... Utilises plutot [php ] et [/php ]. Sinon, pas besoin de passer par les sessions, il faut juste un peu mieux structurer :) Deja, tu peux enlever tes sessions en mettant le paramètre page avec valeur par défault à 1 (ou 0, ca depend ce que tu veux faire...) [php]<?php if (isset($_GET['page'])) { $page = $_GET['page']; } else { $page = 1; }[/php] Après, j'ai pas eu le courage de tout lire... Colore deja bien ton code, rajoute les balises php manquantes, et on verra apres!

Mammouth du PHP | 19672 Messages

27 août 2005, 22:24

...Colore deja bien ton code, rajoute les balises php manquantes, et on verra apres!
Comme invité, il ne peut pas éditer, donc je l'ai fait.

Merci d'y penser lorsque c'est du PHP, la coloration syntaxique rend quand même plus facile la lecture du code.

Ceci dit, envoyer 400 lignes de code n'est pas le moyen le plus approprié de demander de l'aide, c'est en général très indigeste. Il faut commencer par comprendre et suivre le code avant de pouvoir faire la moindre analyse et ça ne donnera pas forcément le meilleur résultat puisqu'il n'y a que toi qui connait parfaitement l'application. Je vais regarder un peu, mais sans garantie de réponse, je ne passerai pas deux heures dessus, donc à priori je referai une réponse si je vois un truc vraiment flagrant.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Albert
Invité n'ayant pas de compte PHPfrance

28 août 2005, 14:20

OK,

Merci pour vos conseils.... même s'ils ne concernent pas vraiment le code :? :cry: (mais je comprends fort bien vos remarques.... :D ).

Merci à toi Cyrano d'avoir pris le temps d'éditer mon poste pour essayer de m'aider. :D

J'ai d'ailleurs pris note de toutes ces infos et je vais penser à devenir membre de ce forum... effectivement ce sera plus simple.

Merci encore et je reste ouvert à toute remarque.

Albert.

Eléphant du PHP | 281 Messages

28 août 2005, 15:40

Salut,

Une classe php que j'utilise pour la pagination et que je trouve on ne peut mieux :

http://miasmatik.maladoc.org/articles/pagination/

Tu as en plus un super didactitiel pour découvrir comment l'utiliser :wink:

@+

Albert
Invité n'ayant pas de compte PHPfrance

28 août 2005, 16:03

Merci, je regarde ça de suite.

J'espère que ça ira pour mes besoins :-)