equal for all

mercredi 14 juillet 2010

PHP : un moteur avec un affichage paginé

Objectif

Imaginons que dans notre table tutoriel, nous ayions toute une grande famille Martin. Si nous recherchons avec notre moteur de recherche les Martin, l'affichage de tous les résultats risque de générer une page très longue. Nous allons remédier à cela en n'affichant que 5 réponses à la fois.

Principe

Le principe est le suivant : comme précédemment on construit un formulaire et on construit à partir de là une requête pour interroger la table. On va simplement ajouter au bout de la requete une instruction qui va déterminer l'index du premier résultat à renvoyer et le nombre de résultats à afficher par page.
Après l'affichage, une autre série d'instructions va gérer ce qui doit se passer lors de l'affichage des pages suivantes ou précédentes. pour gérer cet affichage page par page, nous allons donc avoir besoin de quelques variables en plus de celles utilisées pour le moteur à proprement parler. Celles ci sont :
  • $pge : l'index de la page en cours d'affichage (=N° de page-1 puisque les index commencent à 0)
  • $debut : index du premier résultat à afficher
  • $limit, nombre de résultats à afficher par page. Celui-ci peut être soit indiqué dans une variable, ce qui permet par exemple au lecteur de choisir lui même combien de résultats il veut voir sur chaque page.




Construction de la requete





La requete est la suivante :
$requete= "select * from tutoriel where nom like '%$f_nom%' limit $debut, $limit";
Celle ci (quelle que soit la page) renvoie toujours le même tableau de valeur. La seule chose qui change c'est la fraction des résultats qu'on affiche : ceux dont les index sont compris entre $debut et $debut+$limit.
Nous allons voir maintenant ce qui se passe à chaque page.
Lorsque le formulaire est affiché pour la première fois, les variables $pge et $debut n'ont pas encore été initialisées. On le fait en les mettant à 0. On détermine ensuite quelles sont les astuces à afficher. Pour la première page, le premier résultat à afficher ($debut) a pour index 0. Si on affiche 5 résultats ($limit) par page, à la seconde page, d'index 1, le premier résultat à afficher sera celui d'index 4. On peut donc utiliser une formule pour calculer $debut :
$debut = $pge*$limit
Nous aurons également besoin du nombre total de pages à afficher. Il dépend de $nb_tot : nombre total de résultats renvoyé par la requête et de $limit : nombre de résultats à afficher par page.
la partie php est donc la suivante :
$limit = 10;
if($debut==""){$debut=0;}
$debut=$pge*$limit;
$requete= "select * from tutoriel where nom like '%$f_nom%'";
$total=mysql_query($requete) or die("SQL1 : ".mysql_error());
$nb_tot=mysql_num_rows($total);
$nbpages=ceil($nb_tot/$limit); // ceil = plafond : pour arrondir à la valeur supérieure
$resultat=mysql_query($requete. "limit, $debut, $limit) or die("SQL1 : ".mysql_error());

while ($rows=mysql_fetch_array($resultat)) {
$nom=$rows[nom]; $prenom=$rows[prenom] ; $adresse=$rows[mail];
echo "nom : $nom, prenom : $prenom, adresse : $adresse";}

Affichage du bas de la page

Il reste à afficher ce qui doit figurer en bas de la page : un lien hypertexte vers les pages suivantes et précedentes.
Le nombre total de liens doit rester dans des limites raisonnables disons les deux précédentes, la page en cours, et les deux suivantes. Plus éventuellement la première et la dernière page. Attention à ne pas vous tromper entre les numéros de page et leur index...
Il faut aussi donner les instructions nécessaires à l'explorateur pour savoir que faire lorsque l'on va cliquer sur le lien vers une nouvelle page. Les infos à envoyer sont le N° qu'aura cette page et le mot clef utilisé dans le moteur de recherche. Cette info n'est en effet pas conservée d'une page sur l'autre. Si on ne donne pas cette info, le formulaire sera réinitialisé et la requête ne renverra plus aucun résultat.
Il faut donc renvoyer dans la boite de texte la valeur de la variable $f_nom.

Passer des paramètres à une page HTML

Comment passer des paramètres à une page html ? en mettant ces paramètres dans le lien avec une instruction de type Les différents paramètres sont séparés par le caractère &. Si dans votre formulaire, vous utilisez plusieurs critères (nom, prénom, age...) vous devez renvoyer chacune des valeurs initialement saisies dans le formulaire pour qu'elles soient re-traitées lors de l'affichage d'une nouvelle page. Vous pourriez ainsi avoir quelque chose comme cela :



Le code php du bas de la page est ainsi le suivant.

// affichage de la première page si nécessaire (si nb total de pages supérieur à 5)
if($nbpages>>3 and $pge>2){
echo  "Début";
}
// AFFICHAGE DU LIEN PRECEDENT SI BESOIN EST (LA PREMIERE PAGES EST 0)
if ($pge>0){
$precedent=$pge-1;
echo  "

Précédente";
}
// AFFICHAGE DES NUMEROS DE PAGE
$i=0;$j=1;
if($nb_tot>$limit){
while($i<($nbpages))   { //  pour limiter l'affichage du nombre de pages restantes    if ($i>$pge-3 and $i<$pge+3)    {     if($i!=$pge){echo "$j";}
else {echo "$j ";}//met en gras le N° de la page en cours
}
$i++;$j++;
}
}
// AFFICHAGE DU LIEN SUIVANT SI BESOIN EST
if($pge<$nbpages-1){  $suivant=$pge+1;  echo "";
}
// affichage de la dernière page si nécessaire
if($nbpages>3 and $pge<$nbpages-3){ $fin=$nbpages-1;  echo  "fin ($nbpages)";
}

1 commentaires:

Unknown a dit…

www.jeuxtorrent.0fees.net
www.jeuxtorrent.0fees.net

Enregistrer un commentaire