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>> </a>";
}
if ($page==1){
$moins = "";
}Else{
$moins = "<a href=".$_SERVER['PHP_SELF']."?page=".($page-1).">";
$moins .= "<<Pré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