affichage des données de ma base

Mammouth du PHP | 19672 Messages

08 août 2005, 17:26

Remettons les choses à plat et partons de zéro.

Nous avons besoin de deux choses essentielles:
  1. Le nombre de lignes que nous affichons par page;
  2. Le nombre total de pages pour l'ensemble des enregistrements.
Le premier point est fixé dans un fichier de configuration qu'on mets dans notre page en include.

Le second point est obtenu avec la requête de base sans clause LIMIT. On récupère le total et on divise par le nombre d'articles par page, nombre qu'on arrondit avec la fonction ceil().

Quand on a ces éléments là, on peut commencer à voir l,affichage des boutons si il est nécessaire d'en mettre. Si on a trois articles dans la base et qu'on en affiche 5 par page, aucun bouton ne sera nécessaire. Comment déterminer ce qui doit faire afficher [Précédent] ou [suivant] ?

Il faut qu'on ait un point de repère, donc la page en cours. Par défaut, la première page sera la page 0. mais si on navigue dans les autres pages on aura la page 1, 2, 25 etc...

Supposons qu'on ait 12 pages : en récupérant la page en cours, je sais tout de suite si je peux afficher le bouton suivant ou non : si je suis à la page 0, 1, 2, .... 11 j'affiche le bouton suivant, mais si je suis à la page 12, je ne l'affiche pas puisqu'il n'y a pas d'autres pages. De même que si je suis à la page 0, je n'afficherai pas [Précédent]

Nous avons déterminé ces points de repère plus haut

Avec ça et mon bout de code... yapuka :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

08 août 2005, 17:39

merci pour les explications , elles m'ont permis de voir plus clair
par contre peu etre que alors mon code est faux mais par contre ça marche le seul souci c'est qu'il m'affhiche suivant au dernier resulat et ausi quand il ya 1 seul resultat , chose qu'il ne devrait pas faire et pourtant je n'ai pas utilisé de fonction ceil
permets moi de te mettre mon code afin d'en avoir une correction (j'espere que je n'abuse pas :wink: ) j'aimerais bien gardais ce code s'il ya moyen de voir où se trouve l'erreur
merci encore
<?
require_once("connexion.php");
$connexion = mysql_connect($server, $user, $motdepasse); 
echo "Connexion au serveur ". $connexion ? "réussie": "ratée"; 

$connexion2 = mysql_select_db($base); 
echo "Connexion à la base ". $connexion2 ? "réussie": "ratée"; 



$debut = isset($_GET['debut']) ? $_GET['debut'] : 0;
$requete="select * from produit where nomfamille='horizontaux' order by nomproduit ASC LIMIT  ". $debut .",1"; 

$resultat=mysql_query($requete,$connexion) or die ('Erreur : '.mysql_error() ); 
//echo $requete; 
$nb_resultats = mysql_num_rows($resultat); // compte le nombre de résultats de la requète 
echo $nb_resultats;

while ($ligne = mysql_fetch_array($resultat)) 
{
?>
	
 
	<table border="1" bordercolor="#000000" width="95%" align="center">			
				<tr>
				<td bgcolor="#00CC00"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
				<b>Nom Produit</b> </font> </td>
				<td><font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>
				<?php echo $ligne["nomproduit"];?></font></b></td>
				</tr>
				
				<tr>							
				<? if ($ligne["description"]!= "") //si le champ application de la table produit est vide 			
				{ ?>
					<td bgcolor="#00CC00"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">
				<b>Description</b> </font> </td> 
					<td><font size="1" face="Verdana, Arial, Helvetica, sans-serif">
					<?php echo($ligne ["description"]);?></font></td>
			<? 	}?> 
			</tr>
		</table>
		
		<?
if($debut == "0")
# si la variable "$debut" est égal à zéro, c'est que l'on est au début des résultats, alors on affiche
# seulement le bouton "suivants"
    {
    $debut = $debut + 1; // on ajoute 5 à la variable "$debut"
    echo "<a href='page.php?debut=$debut'> Suivant</a>";
    }

elseif($nb_resultats == "1" AND $debut != "0")
# si le nombre de résultats est égal à 5 ET que la variable de début est différente de zéro, alors c'est que 
# l'on est ni au début ni à la fin des résultats, donc on affiche les boutons "suivants" et précédents à la foi
    {
    $debut = $debut - 1; // on retire 5 à la variable "$debut"
    echo "<a href='page.php?debut=$debut'>Précédent </a>&nbsp;&nbsp;";
    $debut = $debut + 2; // ici, on rajoute 10 à "$debut", forcément car on à retiré 5 a cette variable deux lignes plus haut!
    echo "<a href='page.php?debut=$debut'>Suivant</a>";
    }

elseif($nb_resultats < "1")
# si le nombre de résultats est inférieur à 5, alors c'est que l'on a atteint
# la fin des résultats, donc on affiche seulement le bouton "précedents"
    {
    $debut = $debut - 1; // on retire 5 à la variable "$debut"
    echo "<a href='page.php?debut=$debut'>Précédent</a>";
    }

}

mysql_close();

?>

</div>

merci

Mammouth du PHP | 19672 Messages

08 août 2005, 17:50

Bon, d'abord, ton code remis à peu près droit, les explications suvent:
<?
require_once("connexion.php");
$connexion = mysql_connect($server, $user, $motdepasse);
echo "Connexion au serveur ". $connexion ? "réussie": "ratée";

$connexion2 = mysql_select_db($base);
echo "Connexion à la base ". $connexion2 ? "réussie": "ratée";

$debut = isset($_GET['debut']) ? $_GET['debut'] : 0;
$requete="select * from produit where nomfamille='horizontaux' order by nomproduit ASC LIMIT  ". $debut .",1";

$resultat=mysql_query($requete,$connexion) or die ('Erreur : '.mysql_error() );
//echo $requete;
$nb_resultats = mysql_num_rows($resultat); // compte le nombre de résultats de la requète
echo $nb_resultats;

while ($ligne = mysql_fetch_array($resultat))
{
?>
<table border="1" bordercolor="#000000" width="95%" align="center"> 
  <tr>
    <td bgcolor="#00CC00">
      <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Nom Produit</b></font>
    </td>
    <td>
      <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b><?php echo $ligne["nomproduit"];?></font></b>
    </td>
  </tr>
  <tr> 
<?
    if ($ligne["description"]!= "") //si le champ application de la table produit est vide
    {
        ?>
    <td bgcolor="#00CC00">
      <font face="Verdana, Arial, Helvetica, sans-serif" size="2"><b>Description</b></font>
    </td>
    <td>
      <font size="1" face="Verdana, Arial, Helvetica, sans-serif"><?php echo($ligne ["description"]);?></font>
    </td>
<?
    }
    ?>
  </tr>
</table>
<?
    if($debut == "0")
    # si la variable "$debut" est égal à zéro, c'est que l'on est au début des résultats, alors on affiche
    # seulement le bouton "suivants"
    {
        $debut = $debut + 1; // on ajoute 5 à la variable "$debut"
        echo "<a href=\"page.php?debut=". $debut. "\"> Suivant </a>";
    }
    elseif($nb_resultats == 1 && $debut != 0)
    # si le nombre de résultats est égal à 5 ET que la variable de début est différente de zéro, alors c'est que
    # l'on est ni au début ni à la fin des résultats, donc on affiche les boutons "suivants" et précédents à la foi
    {
        $debut = $debut - 1; // on retire 5 à la variable "$debut"
        echo "<a href=\"page.php?debut=". $debut ."\">Précédent </a>&nbsp;&nbsp;";
        $debut = $debut + 2; // ici, on rajoute 10 à "$debut", forcément car on à retiré 5 a cette variable deux lignes plus haut!
        echo "<a href=\"page.php?debut=". $debut ."\">Suivant</a>";
    }
    elseif($nb_resultats < 1)
    # si le nombre de résultats est inférieur à 5, alors c'est que l'on a atteint
    # la fin des résultats, donc on affiche seulement le bouton "précedents"
    {
        $debut = $debut - 1; // on retire 5 à la variable "$debut"
        echo "<a href=\"page.php?debut=". $debut ."\">Précédent</a>";
    }
}
mysql_close();
?>
</div>
Où est ta variable fixant le nombre de ligne à afficher par page ?

Ensuite tu avais mis de + "2" ou des -"1" : les chiffres entre guillemets sont donc traités en chaine de caractère, les opérations ne peuvent pas fonctionner correctement.

Essaye déjà ça et ensuite on verra l'évolution des erreurs restantes.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

08 août 2005, 18:05

je fais les modifications et je vous dis quoi
merci

Eléphanteau du PHP | 32 Messages

09 août 2005, 08:12

Bonjour,
j'ai fais les modifications (la synthaxe )que vous m'avez suggérées mais il ya toujours le meme probleme est ce que c'est dû à la fonction ceil

Mammouth du PHP | 19672 Messages

09 août 2005, 09:19

Ça me surprendrait: ceil() effectue un arrondi à l'entier supérieur. Il faudrait voir le code pour trouver une erreur ou un oubli quelque part.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

09 août 2005, 13:57

bon,
j'ai alors tout revu comme vous me l'avez suggéré, j'ai trouvé un tutoriel qui explique bien l'utilisation de ceil mais mon souci est que malgré que j'ai limité le nombre d'enregistrement par page a 2 il m'affiche tout sur la premiere page
pouvez vous me dire (une fois de plus :wink: )où se trouve mon erreur
<?
require_once("connexion.php");
$connexion = mysql_connect($server, $user, $motdepasse); 
echo "Connexion au serveur ". $connexion ? "réussie": "ratée"; 

$connexion2 = mysql_select_db($base); 
echo "Connexion à la base ". $connexion2 ? "réussie": "ratée"; 



$nbaffich = 2; 
//on effectue la requète sur l'objet que l'on souhaite paginer ( ici des news ) 
$requete="select * from produit where nom='titi' order by nompr ASC" ; 

$resultat=mysql_query($requete,$connexion) or die ('Erreur : '.mysql_error() ); 
echo $requete; 
$nb_resultats = mysql_num_rows($resultat); // compte le nombre de résultats de la requète 
echo "il ya $nb_resultats";


  
//On calcule le nombre de numéro à afficher en fonction du nombre de news par 
//page en arrondissant au nombre supérieur grace a la fonction ceil. 
$moy= ceil($nb_resultats/$nbaffich); 
echo "<br>et il y aura $moy page<br>"; 
//*********** Partie concernant le "bouton" précedent ***********\\ 
//on vérifie qu'il y a au minimum 2 page a afficher pour utiliser 
//la fonction Suivant / précédent 
if ($moy>=2) 
{ 
  //on vérifie l'éxistence de la variable page avant les vérifications 
  if (isset($_GET['page'])) 
  { 
      //si $_GET['page'] = 1 alors on est a la première page et donc pas besoins 
      //de lien vers la précédente qui n'éxiste pas 
      if ($_GET['page']==1){echo "Precedent ";} 
//sinon on met le lien en ajoutant +1 page a la page courante 
else 
{ 
echo "<a href=\"toto.php?page=".($_GET['page']-1)."\">Precedent</a> "; 
} 
} 
else{echo "Precedent ";} 
} 
//*********** fin de la partie concernant le "bouton" précedent ***********\\ 
// on effectue une boucle tant qu'il y a des pages on ajoute un lien 
for ($i=0;$i<$moy;$i++) 
{ 
    // on ajoute 1 a $i pour afficher 1-2-3-... au lieu de 0-1-2-3-... 
    echo "<a href=\"toto.php?page=".($i+1)."\"> Page ".($i+1)."</a> "; 
} 
  
//*********** Partie concernant le "bouton" suivant ***********\\ 
//on vérifie qu'il y a au minimum 2 page a afficher pour utiliser
//la fonction Suivant / précédent
if ($moy>=2)
{
  //on vérifie l'éxistence de la variable page avant les vérifications
  if (isset($_GET['page']))
  {
//si $_GET['page'] = $moy alors on est a la dernière page et donc pas besoins
//de lien vers la suivante qui n'éxiste pas
      if ($_GET['page']==$moy){echo " Suivant";}
      //sinon on met le lien en ajoutant +1 page a la page courante
      else
      {
          echo " <a href=\"toto.php?page=".($_GET['page']+1)."\">Suivant</a>";
      }
      echo "<br>La page courante est :".$_GET['page']."";
  }
  else{echo "<a href=\"toto.php?page=1\">Suivant</a>";}
}
//*********** fin de la partie concernant le "bouton" Suivant ***********\\


while ($ligne = mysql_fetch_array($resultat)) 
{
?>
<table border="1" bordercolor="#000000" width="95%" align="center">			
				<tr>
				<td><? echo $ligne["nomp"];?></font></b></td>
				<td><? echo $ligne["desproduit"];?></font></b></td>
				</tr>
				</table>

Mammouth du PHP | 19672 Messages

09 août 2005, 14:08

C'est normal que tu affiches tout sur la première page: tu as zappé la seconde requête qui consiste à rajouter la clause LIMIT. Donc on utilise la première requête qui récupère TOUS les résultats.

Avant ton While d'affichage, il faut exécuter à nouveau la requête en utilisant tous les paramètres définis juste avant pour définir la limite. Cette limite sera le numéro de la page en cours multiplié par le nombre de lignes à afficher par page pour le premier paramètre et le nombre de lignes à afficher par page pour le second paramètre, ce qui donnera quelque chose du style:
<?php
// [....]
$limit = " LIMIT ". $page * $nbparpage .", ". $nbparpage .";";
// On refait la requête en récupérant la première:
$requete2 = $requete . $limit;
// on exécute et après on utilise les résultats pour l'affichage.
?>
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

09 août 2005, 14:17

j'ai rajouté le bout de code que vous m'avez mis juste avant le while et voici le message
Notice: Undefined variable: page on line 65 qui correspond a
$limit = " LIMIT ". $page * $nbaffich .", ". $nbaffich .";";

Eléphanteau du PHP | 32 Messages

09 août 2005, 14:19

peut etre que alors je dois le déclarer ainsi
$page = isset($_GET['page']) ? $_GET['page'] : 0;

Mammouth du PHP | 19672 Messages

09 août 2005, 14:44

peut etre que alors je dois le déclarer ainsi
$page = isset($_GET['page']) ? $_GET['page'] : 0;
Peut-être bien :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

09 août 2005, 14:51

je l'ai rajouté il nya plus de message d'erreur mais les 7 resultats trouvés sont tous sur la premiere page en quand kje clique sur cuivant c'est pareil

Mammouth du PHP | 19672 Messages

09 août 2005, 14:55

Ça en devient désespérant : :shock:
Suis donc un schéma logique: lis ton code en suivant le parcours de l'exécution avec sous la main un papier et un crayon et note. Fais-toi un croquis. C'est de la logique élémentaire, si ton code ne fonctionne pas, c'est que tu as omi quelque chose quelque part, je ne vais quand même pas le faire à ta place :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 32 Messages

10 août 2005, 08:01

c'est réussi!! merci pour tout l'aide apportéé