Portail PHP

Forum de discussion et d'aide au php

Vous n'êtes pas identifié.

Annonce

Regles d'utilisation des forums : pensez à toujours les respecter si vous désirez obtenir des réponses rapides.
FAQ : pensez à toujours chercher dedans si la réponse à votre question est dedans.
Proposez vos news : si vous avez un evenement à annoncer
le chat : venez discuter de php.
 

#1 09-05-2008 19:08:16

maxender
Membre
Date d'inscription: 09-05-2008
Messages: 4

Probleme de pagination

Bonjour,
je travaille actuellement sur un guide pratique qui fonctionne sur un moteur de recherche interne qui se présente ainsi sur toutes les pages :

Code:

<div id="barre">
<div style="text-align:center;">
<table align="center" class="moteur">
<tr>
<td class="align" colspan="3">
<p class="size" style="text-align:center;">
<div class="float">
Rechercher par : 
</div>
<div class="float">
/ Prix
<form method="post" action="prix.php"  onchange="submit()">
<select size="1" name="prix">
<option value="-1">Votre Choix</option>
<option value="cher">+ cher</option>
<option value="pascher">- cher</option>
</select>
</form>
</div>
<div class="float">
 / Ambiance
  <?php
$query = "SELECT * FROM ambiance";
$donnees = mysql_query($query);
echo '<form action="ambiance.php" method="post" onchange="submit()">';
echo '<select size="1" name="ambiance"><option value="-1">Votre Choix</option>',"\n";
while($ambiance = mysql_fetch_row($donnees))
{
echo '<option value="'.$ambiance[1].'">'.$ambiance[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
 / Luminosité
  <?php
$query = "SELECT * FROM luminosite";
$donnees = mysql_query($query);
echo '<form action="lumiere.php"  method="post" onchange="submit()">';
echo '<select size="1" name="luminosite"><option value="-1">Votre Choix</option>',"\n";
while($luminosite = mysql_fetch_row($donnees))
{
echo '<option value="'.$luminosite[1].'">'.$luminosite[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
  / Station de Métro
  <?php
$query = "SELECT * FROM metro";
$donnees = mysql_query($query);
echo '<form action="metro.php"  method="post" onchange="submit()">';
echo '<select size="1" name="metro" onchange="submit()"><option value="-1">Votre Choix</option>',"\n";
while($metro = mysql_fetch_row($donnees))
{
echo '<option value="'.$metro[1].'">'.$metro[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
 / arrêt de bus
  <?php
$query = "SELECT * FROM bus";
$donnees = mysql_query($query);
echo '<form action="bus.php"  method="post" onchange="submit()">';
echo '<select size="1" name="bus"><option value="-1">Votre Choix</option>',"\n";
while($bus = mysql_fetch_row($donnees))
{
echo '<option value="'.$bus[1].'">'.$bus[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo'</form>';
?>
</div>
<div class="float">
 / WC <i>(Hygiène)</i>
  <?php
$query = "SELECT * FROM wc_hygiene";
$donnees = mysql_query($query);
echo '<form action="hygiene.php" method="post" onchange="submit()">';
echo '<select size="1" name="hygiene"><option value="-1">Votre Choix</option>',"\n";
while($hygiene = mysql_fetch_row($donnees))
{
echo '<option value="'.$hygiene[1].'">'.$hygiene[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
 / WC <i>(Type)</i>
  <?php
$query = "SELECT * FROM wc_type";
$donnees = mysql_query($query);
echo '<form action="type.php" method="post" onchange="submit()">';
echo '<select size="1" name="type"><option value="-1">Votre Choix</option>',"\n";
while($type = mysql_fetch_row($donnees))
{
echo '<option value="'.$type[1].'">'.$type[1];
echo '</option>',"\n";
}
echo '</select>',"\n";
echo '</form>';
?>
</div>
<div class="float">
  / Rue
<form><input type="text" size="20" /></form>
  </div>
</p>
</td>
</tr>
</table>
</div>
</div>
<div style="clear:both;"></div>

Il est également présent sur la page index.php avec cette fonction de pagination

Code:

<?php
    $ambiance = $_POST['ambiance'];
    global $ambiance;
    $hygiene = $_POST['hygiene'];
    global $hygiene;
    $type = $_POST['type'];
    global $type;
function pagination($total,$courante)
{
    /* on définit quelques variables dont on aura besoin */
    $prec = $courante - 1; // numéro de la page précédente
    $suiv = $courante + 1; // numéro de la page suivante
    $avder = $total - 1; // avant dernière page
    $adjacentes = 3; // nombre de pages à afficher de chaque côté de la page courante
    $url = $_SERVER['RESQUEST_uri'];

    /*
    On commence la pagination que l'on stocke dans la variable à retourner
    pagination() pourra ainsi être appelée plusieurs fois, en haut et en bas d'une page par exemple
    */

    $pagination = ""; // s'il n'ya pas au moins deux pages, on n'affiche rien

    if($total > 1) // il y a au moins deux pages
    {
        // on commence par stocker dans $pagination le <div> d'ouverture
        $pagination .= "<div class=\"pagination\">\n";

        // on affiche d'abord le bouton précédent
        if ($courante == 2) // si on est sur la page 2, le bouton précédent renvoit sur la page initiale, il est inutile de mettre ?page=1 sinon on se retrouve avec un duplicate content
            $pagination.= "<a href=\"$url\">« préc</a>";
        elseif ($courante > 2) // si la page actuelle est supérieure à 2 le bouton précédent renvoit sur la page dont le numéro est immédiatement inférieur
            $pagination.= "<a href=\"$url?page=$prec\">« préc</a>";
        else // sinon on est sur la page 1 : on désactive le bouton précédent. on est nécessairement sur la page 1 car on a fait le traitement des pages dans index.php, pas besoin de mettre elseif ($courante==1)
            $pagination.= "<span class=\"desactive\">« préc</span>";


        /**
        On affiche maintenant les pages. On cherchera à afficher au maximum 11 numéros de page en général, et 12 dans le cas 1 où il n'y a pas de troncature :
        - dans un 1er cas, il n'y a pas assez de pages  pour "tronquer la pagination" : on affiche toutes les pages
        - dans le 2ème cas, il y a trop de pages : la troncature s'effectue selon la page sur laquelle on est positionnée
        */

        // CAS 1 : il n'y a pas assez de pages pour tronquer, on les affiche toutes (voir figure 1)
        if ($total < 7 + ($adjacentes * 2))
        {
            /*
            on AJOUTE la page 1. On la traite séparément pour avoir index.php au lieu de index.php?page=1 et ainsi éviter le duplicate content
            cette ligne équivaut à :
            if ($courante == 1)
                $pagination.= "<span class=\"courante\">1</span>";
            else
                $pagination.= "<a href=\"index.php\">1</a>";
             */
            $pagination.= ($courante == 1) ? "<span class=\"courante\">1</span>" : "<a href=\"$url\">1</a>";

            // pour les pages restantes on utilise une simple boucle for
            for ($compteur = 2; $compteur <= $total; $compteur++)
            {
                if ($compteur == $courante) // on affiche la page courante différemment pour la mettre en évidence
                    $pagination.= "<span class=\"courante\">$compteur</span>";
                else
                    $pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
            }
        }

        // CAS 2 : on a assez de pages pour tronquer en fonction de la page actuelle
        elseif($total > 5 + ($adjacentes * 2))
        {
            /*
            on est placé dans la partie proche des premières pages, on tronque donc la fin de la pagination.
            l'affichage sera 9 pages à gauche ... 2 pages à droite (voir figure 2)
            */
            if($courante < 1 + ($adjacentes * 2))
            {
                // on affiche la page 1 comme vu précédemment
                $pagination.= ($courante == 1) ? "<span class=\"courante\">1</span>" : "<a href=\"$url\">1</a>";

                // puis les huit pages suivantes
                for ($compteur = 2; $compteur < 4 + ($adjacentes * 2); $compteur++)
                {
                    if ($compteur == $courante)
                        $pagination.= "<span class=\"courante\">$compteur</span>";
                    else
                        $pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
                }

                // les ... pour marquer la troncature
                $pagination.= " ... ";

                // et enfin les deux dernières pages
                $pagination.= "<a href=\"$url?page=$avder\">$avder</a>";
                $pagination.= "<a href=\"$url?page=$total\">$total</a>";
            }

            /*
            on est placé dans la partie centrale de notre pagination, on tronque donc le début et la fin de la pagination.
            l'affichage sera 2 pages à gauche ... 7 pages au centre ... 2 pages à droite (voir figure 3)
            */
            elseif($total - ($adjacentes * 2) > $courante && $courante > ($adjacentes * 2))
            {
                // on affiche les deux premières pages
                $pagination.= "<a href=\"$url\">1</a>";
                $pagination.= "<a href=\"$url?page=2\">2</a>";

                // les ... pour marquer la troncature
                $pagination.= " ... ";

                // puis sept pages : les trois précédent la page courante, la page courante, puis les trois lui succédant
                for ($compteur = $courante - $adjacentes; $compteur <= $courante + $adjacentes; $compteur++)
                {
                    if ($compteur == $courante)
                        $pagination.= "<span class=\"courante\">$compteur</span>";
                    else
                        $pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
                }

                // les ... pour marquer la troncature
                $pagination.= " ... ";

                // et enfin les deux dernière spages
                $pagination.= "<a href=\"$url?page=$avder\">$avder</a>";
                $pagination.= "<a href=\"$url?page=$total\">$total</a>";
            }

            /*
            sinon on est placé dans la partie de droite, on tronque donc le début de la pagination.
            l'affichage sera 2 pages à gauche ... 9 pages à droite (voir figure 4)
            */
            else
            {
                // on affiche les deux premières pages
                $pagination.= "<a href=\"$url\">1</a>";
                $pagination.= "<a href=\"$url?page=2\">2</a>";

                // les ... pour marquer la troncature
                $pagination.= " ... ";

                // et enfin les neuf dernières pages
                for ($compteur = $total - (2 + ($adjacentes * 2)); $compteur <= $total; $compteur++)
                {
                    if ($compteur == $courante)
                        $pagination.= "<span class=\"courante\">$compteur</span>";
                    else
                        $pagination.= "<a href=\"$url?page=$compteur\">$compteur</a>";
                }
            }
        }

        // pour finir on affiche le bouton suivant
        if ($courante < $compteur - 1)
            $pagination.= "<a href=\"$url?page=$suiv\">suiv »</a>\n";
        else
            $pagination.= "<span class=\"desactive\">suiv »</span>\n";
        $pagination.= "</div>\n";
    }

    // et on retourne $pagination au programme appelant la fonction
    return ($pagination);
}
?>

Et le tout s'affiche (joliment) avec :

Code:

  <div id="mainContent">
    <h1>Guide Pratique des Caf&eacute;s de la Ville de Rennes</h1>
    <?php
$max = mysql_query ("SELECT COUNT(*) FROM cafe");
$donnees = mysql_fetch_row($max);
?>
    <h2>Actuellement <?php echo "<span class='color'>$donnees[0]</span>";?> lieux rennais r&eacute;f&eacute;renc&eacute;s</h2>
    <?php include ('inc/moteur.inc.php');?>
    <hr />
   <h3>Les derni&egrave;res trouvailles :</h3>
   <?php
    include ('fonctions/pagination.php');
    $query = mysql_query("SELECT COUNT(*) FROM cafe WHERE publie='oui'") or die(mysql_error());
    $nb_entrees = mysql_result($query,0,0);

    $entrees_par_page = 2;
    $total_pages = ceil($nb_entrees/$entrees_par_page);
    if(!isset($_GET['page'])){
        $page_courante = 1;
    } else {
        $page = $_GET['page'];
        if ($page<1) $page_courante=1;
        elseif ($page>$total_pages) $page_courante=$total_pages;
        else $page_courante=$page;
    }

    $start = ($page_courante * $entrees_par_page - $entrees_par_page);
    $query = "SELECT * FROM cafe WHERE publie = 'oui' ORDER BY ajout DESC LIMIT $start, $entrees_par_page";
    $resultat = mysql_query($query);
while($data = mysql_fetch_array($resultat))
{
echo "<table align='left' class='table'>\n";
        echo "<tr>\n";
        echo "<td colspan='3' class='td'>\n";
        echo "<div class='titre'>".$data['nom']."</div>";
        echo "</td>\n";
        echo "<tr>\n";
        echo "<td class='td'>\n";
        echo "<img class ='img' src='admin/upload/".$data['image'].".jpg'>";
        echo "</td>\n";
        echo "<td colspan='2' rowspan='2' class='td'>\n";
        echo "<p class='p'>Adresse : <span class='color'>".$data['adresse']."</span></p>\n";
        echo "<p class='p'>Horaires : <span class='color'>".$data['horaires']."</span> - Ferm&eacute; le : <span class='color'>".$data['fermeture']."</span></p>\n";
        echo "<p class='p'>Visit&eacute; le : <span class='color'>".$data['visite']."</span></p>\n";
        $total = $data['prix_cafe']+$data['deca'];
        echo "<p class='p'>Prix total : <span class='color'>".$total."&euro; </span>&nbsp;<i>(Café = <span class='color'>".$data['prix_cafe']."&euro; </span> D&eacute;ca = <span class='color'>".$data['deca']."&euro;</span>)</i></p>\n";
        echo "<p class='p'>Ambiance : <span class='color'>".$data['ambiance']."&nbsp;".$data['descriptif']."</span></p>\n";
        echo "<p class='p'>Lumière : <span class='color'>".$data['luminosite']."</span>&nbsp;&nbsp;WC : <span class='color'>".$data['type']."</span>&nbsp;Hygiène :&nbsp;<span class='color'>".$data['hygiene']."</span></p>\n";
        echo "</td>\n";
        echo "</tr>\n";
        echo "<tr>\n";
        echo "<td class='td'>\n";
        echo "<p class='p'>Metro : <span class='color'>".$data['station']."</span></p>\n";
        echo "<p class='p'>Bus : <span class='color'>".$data['arret']."</span></p>\n";
        echo "</td>\n";
        echo "</tr>\n";
        echo "</table>\n";
}
    echo "<div style='text-align:center;clear:both;'>";
    echo "<p>&nbsp;</p>\n";
    echo pagination($total_pages,$page_courante);
    echo "</div>";
    echo "<p style='text-align:center;font-weight:bold;'>Il y a " .$nb_entrees. " cafés</p>";
?>
</body>
</html>

Jusque là tout va bien... le couac vient de l'affichage après selection dans le moteur de recherche. La première page s'affiche correctement, mais lorsque l'on clic sur les autres numéros de pages (et bouton suivant), j'ai cette erreur qui apparait :
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home/cigam/www/uncafeundecacreme/hygiene.php on line 41

Pour être plus clair, le code de la page hygiene.php

Code:

<h1>Guide Pratique des Caf&eacute;s de la Ville de Rennes</h1>
    <?php
$max = mysql_query ("SELECT COUNT(*) FROM cafe");
$donnees = mysql_fetch_row($max);
?>
    <h2>Actuellement <?php echo "<span class='color'>$donnees[0]</span>";?> lieux rennais r&eacute;f&eacute;renc&eacute;s</h2>
    <?php include ('inc/moteur.inc.php');?>
    <hr />
<?php
    include ('fonctions/pagination.php');
    echo "<h3>Résultat de votre recherche : <span class='color'>Hygiene ".$hygiene."</span></h3>";
    $query = mysql_query("SELECT COUNT(*) FROM cafe WHERE hygiene LIKE '$hygiene' AND publie = 'oui'") or die(mysql_error());
    $nb_entrees = mysql_result($query,0,0);
    $entrees_par_page = 2;
    $total_pages = ceil($nb_entrees/$entrees_par_page);
    if(!isset($_GET['page'])){
        $page_courante = 1;
    } else {
        $page = $_GET['page'];
        if ($page<1) $page_courante=1;
        elseif ($page>$total_pages) $page_courante=$total_pages;
        else $page_courante=$page;
    }

    $start = ($page_courante * $entrees_par_page - $entrees_par_page);
    $query = "SELECT * FROM cafe WHERE hygiene LIKE '$hygiene' AND publie = 'oui' ORDER BY nom DESC LIMIT $start, $entrees_par_page" or die(mysql_error());
    $resultat = mysql_query($query);
while($data = mysql_fetch_array($resultat))
{
include ('inc/resultat.inc.php');
}
    echo "<div style='text-align:center;clear:both;'>";
    echo "<p>&nbsp;</p>\n";
    echo pagination($total_pages,$page_courante);
    echo "</div>";
    echo "<p style='text-align:center;font-weight:bold;'>Il y a " .$nb_entrees. " cafés</p>";
?>
    <p>&nbsp;</p>

j'ai l'impression que ma variable de formulaire se volatilise après la page une... d'ou ma tentative avec une variable globale.

Désolé pour le pavé que je laisse, mais j'espère que vous pourrez m'aider à résoudre ce problème.

Par avance, merci beaucoup à ceux qui vont se pencher sur le problème

Hors ligne

 

#2 13-05-2008 02:57:19

lolo3129
Membre
Lieu: Paris
Date d'inscription: 10-05-2005
Messages: 506
Site web

Re: Probleme de pagination

salut,

effectivement, le problème vient du fait que tes données de formulaires disparaissent de la variable $_POST
en fait, cette variable est réinitialisée à chaque appel de page. Donc à chaque fois que tu appelles une page (typiquement quand tu essaies de cliquer sur un lien de pagination, tu fais un appel en GET à une nouvelle page) tu perds le contenu de $_POST si tu ne postes rien.

je pense que tu devrais stocker les paramètres de ta recherches dans une session (qui elle va perdurer sur plusieurs pages).
Et à chaque fois que ton utilisateur lance une recherche, tu réinitialises les paramètres dans la session.

bon courage

Hors ligne

 

#3 13-05-2008 15:52:00

maxender
Membre
Date d'inscription: 09-05-2008
Messages: 4

Re: Probleme de pagination

Hello lolo3129,
Je n'avais pas pensé aux session, mais il est vrai que cela permet de rendre des variables disponibles sur toutes les pages. Merci pour ta réponse. Je regarde ça et je te tiens au courant... en espérant mettre une belle étiquette "résolu" sur ce post
Bonne soirée

Hors ligne

 

#4 15-05-2008 16:37:30

Asherah
Membre
Date d'inscription: 15-11-2007
Messages: 161
Site web

Re: Probleme de pagination

Salut,
j avais un script du genre, mais pour une pagination ce n'est pas top' car a chaques fois que tu clique sur une autre page tu re-parcours tout les resultats qui ont dejas été parcouru, tu as des solution beaucoup plus optimal avec l'utilisation d'itérateurs et notament via PHP5 et la SPL.

Hors ligne

 

#5 26-05-2008 18:03:35

maxender
Membre
Date d'inscription: 09-05-2008
Messages: 4

Re: Probleme de pagination

Bonjour,
Après moults essais, et autant de recherche, j'ai fini par trouver une solution à mon problème avec PEAR PAGER. C'est une très bonne classe, très facile à mettre en place.
Je remercie tous ceux qui se sont penchés sur ce post.

Hors ligne