IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Probleme de requete sql et pagination [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Par défaut Probleme de requete sql et 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
     
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
      <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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    <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

  2. #2
    Membre confirmé Avatar de Sekmeth
    Femme Profil pro
    Assistante scientifique
    Inscrit en
    Janvier 2008
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Assistante scientifique
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2008
    Messages : 65
    Par défaut
    Si tu fais un echo des variables qui se "volatilisent", qu'est-ce que ça donne ? Tes variables apparaissent ?

    J'ai pas vraiment tout lu mais à première vue je te dirais de passer tes variables en paramètres dans l'url de chaque page que t'affiche à l'aide de ta pagination..
    Mais je sais pas si c'est vraiment une réponse à ton problème..

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Par défaut
    Bonjour Sekmeth,
    La variable est bien présente sur la première page mais plus sur les autres... j'ai changé la méthode de transmission pour un $_GET mais le résultat est le même.
    J'ai essayé aussi de l'intégrer à la fonction de pagination mais j'obtiens une url du style xxx.php?ma_variable?page=2
    Mais je crois que la question est bien là : comment conserver ma variable d'une page à l'autre ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Mai 2008
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 4
    Par défaut
    J'ai résolu mon problème de pagination grâce à PAGER (PEAR). Une classe simple à utiliser et surtout très pratique

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de requete SQL avec la valeur NULL
    Par samyghan dans le forum Installation
    Réponses: 8
    Dernier message: 12/03/2006, 17h24
  2. Probleme de requete SQL
    Par arcane dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 04/10/2005, 11h59
  3. Probleme de requete SQL avec un champs date
    Par ju360modena dans le forum ASP
    Réponses: 5
    Dernier message: 16/06/2005, 11h18
  4. Probleme Session/requete SQL
    Par kolib dans le forum ASP
    Réponses: 4
    Dernier message: 14/06/2005, 16h23
  5. probleme avec requete sql aime pas les strings
    Par lil_jam63 dans le forum Bases de données
    Réponses: 3
    Dernier message: 24/02/2004, 14h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo