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

Langage SQL Discussion :

Barre de filtres : requête AND et OR


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 203
    Points : 92
    Points
    92
    Par défaut Barre de filtres : requête AND et OR
    Bonsoir,
    j'ai crée une barre de filtres pour rechercher des recettes de cuisine avec trois critères (un formulaire avec trois select). j'ai fais une requête préparée pour rechercher avec ces trois critères en faisant des jointures de mes tables et tout marche bien.. maintenant je me pose la question si c'est possible d'élargir ma requête pour pouvoir filtrer avec un seul critère sur trois ou deux critères.
    Est ce que c'est possible dans la meme requête en utilisant des and et OR en meme temps ? Comment combiner la requete pour filtrer avec 1 critère sur trois ou 2 sur trois ?
    Voici ma requêté qui marche bien en filtrant avec les 3 critères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     $req=$this->bdd->prepare("select rec.id_rec, rec.titre, rec.description, rec.photo from recettes rec, rec_ingr_unite, ingredients, formes, types, regions  
                where rec.id_rec = rec_ingr_unite.id_rec and rec_ingr_unite.id_ingr = ingredients.id_ingr and rec.fkidReg = regions.id_reg
                and rec.fkidForme = formes.id_forme and formes.fkidType = types.id_type and regions.id_reg =:id_reg and ingredients.id_ingr= :id_ingr
                and types.id_type = :id_type");
                $req->bindParam(':id_reg', $region);
                $req->bindParam(':id_ingr', $ingredient);
                $req->bindParam(':id_type', $type);
                $req->execute();
                return $req->fetchAll(PDO::FETCH_ASSOC);
    merci pour votre aide

  2. #2
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 351
    Points : 1 452
    Points
    1 452
    Par défaut
    Tu es obligé de modifier ta préparation de requête (c'est moche en une sorte de pseudo code mais bon tu verras le principe):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sql = "select (les champs) from (la ou les tables) where (condition qq soient tes param)" 
    si select1 pas vide : sql .= "AND (condition1) " 
    si select2 pas vide : sql .= "AND (condition2) " 
    si select3 pas vide : sql .= "AND (condition3) " 
    sql .= "order by (si tu en as) ;"
     
    $req=$this->bdd->prepare(sql);
    si select1 pas vide : bindparam1
    si select2 pas vide :  bindparam2
    si select3 pas vide : bindparam3
     
    $req->execute();
    return $req->fetchAll(PDO::FETCH_ASSOC);

  3. #3
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 203
    Points : 92
    Points
    92
    Par défaut
    Bonsoir,
    merci beaucoup pour le pseudo code je vais essayer demain matin et je vous redis si je réussi , encore merci...

  4. #4
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 203
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Je reviens vers vous j'ai essayé de transformer en code mais j'ai l'impression que cela ne marche pas quand je choisi un seul select :
    voici mon code :
    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
    function getByFilter($ingredient, $type, $region) {
                $sql="select rec.id_rec, rec.titre, rec.description, rec.photo from recettes rec, rec_ingr_unite, ingredients, formes, types, regions  
                where rec.id_rec = rec_ingr_unite.id_rec and rec_ingr_unite.id_ingr = ingredients.id_ingr and rec.fkidReg = regions.id_reg
                and rec.fkidForme = formes.id_forme and formes.fkidType = types.id_type";
     
                if(!empty($indredient)) {
                    $sql .= " and ingredients.id_ingr= :id_ingr";
                }
                if(!empty($type)) {
                    $sql.= " and types.id_type = :id_type";
                }
     
                if(!empty($region)) {
                    $sql .= " and regions.id_reg =:id_reg";
                }
     
                $req=$this->bdd->prepare($sql);
     
                if(!empty($ingredient)){
                    $req->bindParam(':id_ingr', $ingredient);
                }
                if(!empty($type)){
                    $req->bindParam(':id_type', $type);
                }
     
                if(!empty($region)){
                    $req->bindParam(':id_reg', $region);
                }
     
                $req->execute();
                return $req->fetchAll(PDO::FETCH_ASSOC);
            }
     
        }
    j'ai aussi ajouter value="" à mes options selected (sinon j'ai les titres comme valeurs et le empty je suppose ne marcherais pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    <option value= ""  selected>Ingrédients</option>
    <option value ="" selected>Type de pâtes</option>
    <option value="" selected>Régions d'Italie</option>
    Et quand je choisi les trois critères en meme temps j'ai ce message d'erreur :
    Warning: PDOStatement::execute(): SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens in C:\wamp64\www\projet\model\modelRecettes.php on line 98

    Est ce que j'ai fais des erreurs dans le code ?
    merci

  5. #5
    Membre expérimenté
    Inscrit en
    Mai 2006
    Messages
    351
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 351
    Points : 1 452
    Points
    1 452
    Par défaut
    Citation Envoyé par Matteo53 Voir le message
    where rec.id_rec = rec_ingr_unite.id_rec and rec_ingr_unite.id_ingr = ingredients.id_ingr and rec.fkidReg = regions.id_reg
    and rec.fkidForme = formes.id_forme and formes.fkidType = types.id_type";
    Mets pas tout ça dans ton where fais un join entre les tables.
    Pour ton problème il semble que pour lui il n'a pas le même nombre de prametres dans la raquete et dans tes bind params pourtant ca devrait etre le cas, verifie la chaine sql en sortie avant ton prepare

  6. #6
    Membre régulier
    Homme Profil pro
    Autre
    Inscrit en
    Mars 2021
    Messages
    203
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Mayenne (Pays de la Loire)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Mars 2021
    Messages : 203
    Points : 92
    Points
    92
    Par défaut
    Bonjour,
    je vais analiser tout ca et encore merci pour votre aide et votre disponibilité.

Discussions similaires

  1. Barre de Progression - Requête SQL
    Par phpdev dans le forum Langage
    Réponses: 3
    Dernier message: 03/06/2013, 14h56
  2. [AC-2010] Filtre requête par case à cocher
    Par alexbrabo dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 30/01/2013, 09h45
  3. [MySQL] Requète AND LIKE
    Par guillaumebdx dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 09/01/2013, 21h16
  4. requête AND sur un même champ
    Par MrBonheur dans le forum Requêtes
    Réponses: 8
    Dernier message: 25/01/2009, 16h35
  5. probleme de requête AND
    Par Methode dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/01/2007, 16h21

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