Affichage page par page PHP MySQL
par remoh | Statut : Non résolu mardi 23 octobre 2007 à 15:45:59 |
Bonjour,
ça fait un bon moment que je me prend la tête sur cette page de résultats... j'en peux plus!
Je vous explique :
Je créé un moteur de recherche qui récupère des infos (sorties culturelles) dans ma base de données MySQL.
1/ L'utilisateur choisi ses critères de recherche (on va se limiter à 1 seul pour l'instant... le type de sorties : Concert, expo...) et valide le formulaire qui envoie ce critère par POST à ma page de résultats.
2/Dans la page de resultats en PHP, on fait une requete sur la bd en fonction du critère sélectionné et on affiche les resultats
3/On limite à 5 résultats par page avec des liens qui permettent de naviguer entre les pages.
Evidement, c'est le point 3/ qui déconne. La première page de résultats s'affiche correctement mais si on clique sur les liens pour aller sur les pages suivantes, la base ne me renvoie plus aucun résultat ???
Après plusieurs recherches, je pense que c'est du au fait que quand on clique sur le lien pour aller sur une page suivante, le critère de recherche sélectionné en 1/ n'a plus de valeur et la requete mysql ne renvoie donc plus de resultats...
J'ai donc essayer d'inclure cette valeur dans les liens (<a href=\"$_PHP[SELF]?limit=".$limit."&type=".$type."\">, mais ça n'a rien changé...
A l'aide svp !
Je vous livre le code en question... Merci d'avance
<?php
$type = $_POST['Type'];
//==============================================================================
// Configuration à modifier avec vos propres paramètres
//==============================================================================
// Connexion à la base de données
$host = "host";
$user = "user";
$pass = "xxx";
$data = "base"; // Nommer ici la base de données
$connect = mysql_connect($host, $user, $pass)
or die("Connexion au serveur impossible !");
$db = mysql_select_db($data, $connect)
or die("Sélection de la base impossible !");
// Paramétrage de la requête (ne pas modifier le nom des variable)
$table = "Sorties"; // Table à sélectionner dans la base
$champ = "Date"; // Champ de la table à afficher pour tester ce script
$champ2 = "Type";
$champ3 = "Designation";
$champ4 = "Lieu";
$sql = "SELECT * FROM $table WHERE Type='".$type."' ORDER by Date ASC"; // Requête initiale (à compléter si nécessaire)
$parpage = 5; // Nombre d'enregistrements par page à afficher
//==============================================================================
// Déclaration et initialisation des variables (ici ne rien modifier)
//==============================================================================
// On définit le suffixe du lien url qui affichera les pages
// $_SERVEUR['PHP_SELF'] donne l'arborescence de la page courante
$url = $_SERVER['PHP_SELF']."?limit=";
$total = mysql_query($sql); // Résultat total de la requête $sql
$nblignes = mysql_num_rows($total); // Nbre total d'enregistrements
// On calcule le nombre de pages à afficher en arrondissant
// le résultat au nombre supérieur grâce à la fonction ceil()
$nbpages = ceil($nblignes/$parpage);
//==============================================================================
// Exemple d'affichage HTML
//==============================================================================
// On teste en affichant la valeur des variables (facultatif)
echo "<p>La table <b>".$table."</b> compte ".$nblignes." <b>".$champ."</b>.";
echo "<br />\n"."On affiche <b>".$parpage." enregistrements</b> par page, ";
echo "soit un total de <b>".$nbpages." pages</b>.</p>\n";
// Si une valeur 'limit' est passée par url, on vérifie la validité de
// cette valeur par mesure de sécurité avec la fonction validlimit()
// cette fonction retourne automatiquement le résultat de la requête
$result = validlimit($nblignes,$parpage,$sql);
// On affiche le résultat de la requête
// On crée donc ici son propre tableau pour lequel on souhaite une pagination
echo '<table bgcolor="#FFFFFF">'."\n";
// première ligne on affiche les titres dans 4 colonnes
echo '<tr>';
echo '<td bgcolor="#669999"><b><u>Date</u></b></td>';
echo '<td bgcolor="#669999"><b><u>Type</u></b></td>';
echo '<td bgcolor="#669999"><b><u>Désignation</u></b></td>';
echo '<td bgcolor="#669999"><b><u>Lieu</u></b></td>';
echo '</tr>'."\n";
while ($ligne = mysql_fetch_array($result)) {
echo '<tr>';
echo '<td bgcolor="#CCCCCC">'.$ligne[$champ].'</td>';
echo '<td bgcolor="#CCCCCC">'.$ligne[$champ2].'</td>';
echo '<td bgcolor="#CCCCCC">'.$ligne[$champ3].'</td>';
echo '<td bgcolor="#CCCCCC">'.$ligne[$champ4].'</td>';
echo '</tr>'."\n";
}
echo '</table>'."\n";
// Menu de pagination que l'on place après la requête
echo "<div class='pagination'>";
echo pagination($url,$parpage,$nblignes,$nbpages);
echo "</div>";
mysql_free_result($result); // Libère le résultat de la mémoire
function pagination($url,$parpage,$nblignes,$nbpages)
{
// On crée le code html pour la pagination
$html = precedent($url,$parpage,$nblignes); // On crée le lien precedent
// On vérifie que l'on a plus d'une page à afficher
if ($nbpages > 1) {
// On boucle sur les numéros de pages à afficher
for ($i = 0 ; $i < $nbpages ; ++$i) {
$limit = $i * $parpage; // On calcule le début de la valeur 'limit'
$limit = $limit.",".$parpage; // On fait une concaténation avec $parpage
// On affiche les liens des numéros de pages
$html .= "<a href=\"".$url.$limit."&type=".$type."\">".($i + 1)."</a> | " ;
}
}
// Si l'on a qu'une page on affiche rien
else {
$html .= "";
}
$html .= suivant($url,$parpage,$nblignes); // On crée le lien suivant
// On retourne le code html
return $html;
}
function validlimit($nblignes,$parpage,$sql)
{
// On vérifie l'existence de la variable $_GET['limit']
// $limit correspond à la clause LIMIT que l'on ajoute à la requête $sql
if (isset($_GET['limit'])) {
$pointer = split('[,]', $_GET['limit']); // On scinde $_GET['limit'] en 2
$debut = $pointer[0];
$fin = $pointer[1];
// On vérifie la conformité de la variable $_GET['limit']
if (($debut >= 0) && ($debut < $nblignes) && ($fin == $parpage)) {
// Si $_GET['limit'] est valide on lance la requête pour afficher la page
$limit = $_GET['limit']; // On récupère la valeur 'limit' passée par url
$sql .= " LIMIT ".$limit.";"; // On ajoute $limit à la requête $sql
$result = mysql_query($sql); // Nouveau résultat de la requête
}
// Sinon on affiche la première page
else {
$sql .= " LIMIT 0,".$parpage.";"; // On ajoute la valeur LIMIT à la requête
$result = mysql_query($sql); // Nouveau résultat de la requête
}
}
// Si la valeur 'limit' n'est pas connue, on affiche la première page
else {
$sql .= " LIMIT 0,".$parpage.";"; // On ajoute la valeur LIMIT à la requête
$result = mysql_query($sql); // Nouveau résultat de la requête
}
// On retourne le résultat de la requête
return $result;
}
function precedent($url,$parpage,$nblignes)
{
// On vérifie qu'il y a au moins 2 pages à afficher
if ($nblignes > $parpage) {
// On vérifie l'existence de la variable $_GET['limit']
if (isset($_GET['limit'])) {
// On scinde la variable 'limit' en utilisant la virgule comme séparateur
$pointer = split('[,]', $_GET['limit']);
// On récupère le nombre avant la virgule et on soustrait la valeur $parpage
$pointer = $pointer[0]-$parpage;
// Si on atteint la première page, pas besoin de lien 'Précédent'
if ($pointer < 0) {
$precedent = "";
}
// Sinon on affiche le lien avec l'url de la page précédente
else {
$limit = "$pointer,$parpage";
$precedent = "<a href=\"".$url.$limit."&type=".$type."\"></a> | ";
}
}
else {
$precedent = ""; // On est à la première page, pas besoin de lien 'Précédent'
}
}
else {
$precedent = ""; // On a qu'une page, pas besoin de lien 'Précédent'
}
return $precedent;
}
function suivant($url,$parpage,$nblignes)
{
// On vérifie qu'il y a au moins 2 pages à afficher
if ($nblignes > $parpage) {
// On vérifie l'existence de la variable $_GET['limit']
if (isset($_GET['limit'])) {
// On scinde la variable 'limit' en utilisant la virgule comme séparateur
$pointer = split('[,]', $_GET['limit']);
// On récupère le nombre avant la virgule auquel on ajoute la valeur $parpage
$pointer = $pointer[0] + $parpage;
// Si on atteint la dernière page, pas besoin de lien 'Suivant'
if ($pointer >= $nblignes) {
$suivant = "";
}
// Sinon on affiche le lien avec l'url de la page suivante
else {
$limit = "$pointer,$parpage";
$suivant = "<a class='pagination' href=\"".$url.$limit."&type=".$type."\"></a>";
}
}
// Si pas de valeur 'limit' on affiche le lien de la deuxième page
if (@$_GET['limit']== false) {
$suivant = "<a href=\"".$url.$parpage."&type=".$type."\",".$parpage."></a>";
}
}
else {
$suivant = ""; // On a qu'une page, pas besoin de lien 'Suivant'
}
return $suivant;
}
// Fin du script
?>