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 :

incompatibilité entre requête SQL et pagination [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 62
    Par défaut incompatibilité entre requête SQL et pagination
    Bonjour à tous et à toutes

    J'ai fais face il y a peu à un problème méthodologique dans la réalisation d'un script destiné à affiner l'affichage des annonces, sur un site de petites annonces
    Il s'agissait de les trier par catégorie, ville etc...J'ai reçu le script suivant comme solution:
    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
     
    include('fonction_pagination.php');
    $page = (isset($_GET['page']) ? htmlspecialchars(intval($_GET['page'])): 1);
    if($page <= 0) {
      $page = 1;
    }
    $debut = ($page - 1) *30;
    $retour = 'SELECT COUNT(*) AS total FROM ventes WHERE ';
    $requete_sql = 'SELECT * FROM ventes WHERE ';
    $values = array();
    $champs = array('catégorie','ville','demande_offre','part_pro');
    if(isset($_POST)){
      foreach ($_POST as $key => $value) {
        if(!empty($value)){
          foreach ($champs as $nom) {
            if($key == $nom){
     
              $requete_sql .= $key.'=\''.$value.'\' AND ';
              $retour .= $key.'=\''.$value.'\' AND ';
            }
          }
        }
      }
      $retour .= '1=1';
      $req3 = $bdd -> query($retour);
      $nombreElementsTotal = $req3 -> fetchcolumn();
    $nombreDePages = ceil($nombreElementsTotal/30);
      $requete_sql .= '1 = 1 LIMIT '.$debut.',30';
       echo $requete_sql ;
      $req = $bdd -> query($requete_sql);
    }
    La présence de la fonction de pagination et d'une requête pour obtenir le nombre total d'annonces n'est pas fortuite. J'y reviens...
    Le formulaire de tri contient 4 champs et un bouton validé. Tous les champs sont des SELECT. Ceux-ci sont stocké dans un tableau et utilisé dans le WHERE d'une requête SQL.
    Mais voilà, si ce procédé fonctionne bien sur la page d'accueil ie qu'après le clique sur le bouton validé les annonces s'affichent en fonction des valeurs des champs rempli.
    Dès qu'on passe à la page suivante, les annonces s'affichent comme si aucun champs n'avait été coché dans le formulaire de tri.
    Voici ma 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
     
    <?php function pagination($current_page, $nb_pages, $link='?page=%d', $around=3, $firstlast=1)
    {
      $pagination = '';
      $link = preg_replace('`%([^d])`', '%%$1', $link);
      if ( !preg_match('`(?<!%)%d`', $link) ) $link .= '%d';
      if ( $nb_pages > 1 ) {
     
            // Lien précédent
        if ( $current_page > 1 )
          $pagination .= '<a class="prevnext" href="'.sprintf($link, $current_page-1).'" title="Page précédente">&laquo; Précédent</a>';
        else
          $pagination .= '<span class="prevnext disabled">&laquo; Précédent</span>';
     
            // Lien(s) début
        for ( $i=1 ; $i<=$firstlast ; $i++ ) {
          $pagination .= ' ';
          $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }
     
            // ... après pages début ?
        if ( ($current_page-$around) > $firstlast+1 )
          $pagination .= ' &hellip;';
     
            // On boucle autour de la page courante
        $start = ($current_page-$around)>$firstlast ? $current_page-$around : $firstlast+1;
        $end = ($current_page+$around)<=($nb_pages-$firstlast) ? $current_page+$around : $nb_pages-$firstlast;
        for ( $i=$start ; $i<=$end ; $i++ ) {
          $pagination .= ' ';
          if ( $i==$current_page )
            $pagination .= '<span class="current">'.$i.'</span>';
          else
            $pagination .= '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }
     
            // ... avant page nb_pages ?
        if ( ($current_page+$around) < $nb_pages-$firstlast )
          $pagination .= ' &hellip;';
     
            // Lien(s) fin
        $start = $nb_pages-$firstlast+1;
        if( $start <= $firstlast ) $start = $firstlast+1;
        for ( $i=$start ; $i<=$nb_pages ; $i++ ) {
          $pagination .= ' ';
          $pagination .= ($current_page==$i) ? '<span class="current">'.$i.'</span>' : '<a href="'.sprintf($link, $i).'">'.$i.'</a>';
        }
     
            // Lien suivant
        if ( $current_page < $nb_pages )
          $pagination .= ' <a class="prevnext" href="'.sprintf($link, ($current_page+1)).'" title="Page suivante">Suivant &raquo;</a>';
        else
          $pagination .= ' <span class="prevnext disabled">Suivant &raquo;</span>';
      }
      if($current_page != 1){
        if( $_GET['page'] > $nb_pages){
        ?>
                     <script type="text/javascript">
                       <!--
                        location="index.php?page=1";
                       //-->
                     </script>
                  <?php
      }
    }
      return $pagination;
    }
    ?>
    Désolé, de n'avoir pu faire plus court.
    Merci d'avance à ceux qui voudront m'apporter leur lumière.

  2. #2
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Bonsoir,
    il faudrait passer le formulaire de tri en GET, là les filtres seront sauvegardés dans l'URL , le paramètre de la pagination viendra se "coller" au(x) filtre(s) si besoin
    1er cas, aucun filtre choisi, on a une url du genre xxxx?page=numero_page
    2ème cas , une url du genre xxx?filtre1=valeur&filtre2=valeur&page=numero_page.
    PS: le htmlspecialchars dans htmlspecialchars(intval($_GET['page'])) est inutile et pensez à préparer vos requêtes.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 62
    Par défaut
    Bonsoir Willy_k
    Merci pour l'idée je vais regarder ça un peu plus tard et revenir au cas ou.
    Le script ne fonctionne pas avec une requête préparé. Je me suis dit que c'est pas grave étant donné qu'avec les balises SELECT, l'utilisateur n'entre aucune valeur...il n'y a donc pas risque d'injection SQL.

  4. #4
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Euh. Non. Si ton select s'appelle toto. Qu'est-ce qui m'empêche de mettre la valeur que je veux dans l'url ?

    www.monsite.fr/mapage.php?toto=ce_que_je_veux

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 62
    Par défaut
    Ah oui c'est vrai ! ! !
    Avec la méthode $_GET je suis vulnérable...
    Dans ce cas je vais re-essayé de faire fonctionner la requête préparé 😢

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2017
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2017
    Messages : 62
    Par défaut
    Ou alors, je fais un htmlspecialchar sur mes variables $_GETavant de les utiliser.

  7. #7
    Membre Expert
    Avatar de badaze
    Homme Profil pro
    Chef de projets info
    Inscrit en
    Septembre 2002
    Messages
    1 412
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets info
    Secteur : Transports

    Informations forums :
    Inscription : Septembre 2002
    Messages : 1 412
    Par défaut
    Citation Envoyé par Stev_k Voir le message
    Ah oui c'est vrai ! ! !
    Avec la méthode $_GET je suis vulnérable...
    Dans ce cas je vais re-essayé de faire fonctionner la requête préparé 😢
    Même avec post.

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

Discussions similaires

  1. Choix entre requête SQL ou mapping entre tables
    Par webfranc dans le forum Connectivité
    Réponses: 4
    Dernier message: 25/01/2011, 14h52
  2. Requête SQL et tableau à double entrée
    Par Invité dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/06/2007, 20h51
  3. Différence de résultats entre requêtes SQL et Criteria
    Par titoudemtl dans le forum Hibernate
    Réponses: 3
    Dernier message: 07/08/2006, 09h30
  4. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06
  5. Résultats différent entre une requête SQL, et la même en VBA
    Par thetaps dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 23/09/2005, 12h05

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