1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2012
    Messages : 24
    Points : 11
    Points
    11

    Par défaut requête à plusieurs conditions

    bonjour à tous ,

    j'ai une base produit , l'utilisateur peut effectuer une recherche en sélectionnant des champs de tri :

    sur le login qui travail sur le produit ( le login s'occupe de plusieurs produit ) 1 choix possible )
    sur le fournisseur du produit ( 1 choix possible )
    et sur les collections des produit ( 3 choix possibles )

    je rencontre donc un problème sur la requête avec les AND et OR ....

    j'ai effectué plusieurs test , mais je n'arrive pas à obtenir le tri complet , cad :

    choix login ok
    choix fournisseur ok
    choix 1,2 ou 3 collections ok

    dès que je mélange login et fournisseur , ou collection et login cela ne fonctionne pas , du moins les resultat ne sont pas ce que j ai demandé .

    voila le code et merci pour votre aide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $tri_login = ($result->tri_login);
     $fournisseur = ($result->tri_fournisseur);
     $tri_collection_client1 = ($result->tri_collection1);
     $tri_collection_client2 = ($result->tri_collection2);
     $tri_collection_client3 = ($result->tri_collection3);
     
     $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' OR fournisseur ='".$fournisseur."' OR
                                                                                                 (collection_client = '".$tri_collection_client1."' OR
                                                                                                  collection_client = '".$tri_collection_client2."' OR
                                                                                                  collection_client = '".$tri_collection_client3."')");
    $resultats->setFetchMode(PDO::FETCH_OBJ);
    while ( $donnees = $resultats->fetch() )
    	{

  2. #2
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2014
    Messages : 109
    Points : 58
    Points
    58

    Par défaut

    Bonjour,

    Si j'ai bien compris l'explication pour par exemple login et fournisseurs tu dois mettre un AND et pas un OR.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' AND fournisseur ='".$fournisseur."' OR
                                                                                                 (collection_client = '".$tri_collection_client1."' OR
                                                                                                  collection_client = '".$tri_collection_client2."' OR
                                                                                                  collection_client = '".$tri_collection_client3."')");
    Connais tu les tableau booléan ? c'est t'aidera a mieux comprendre quand utilisé OR et AND ainsi que leurs variante NOR, NAND (je ne sais plus comment ça s'écrit en SQL).

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2012
    Messages : 24
    Points : 11
    Points
    11

    Par défaut

    bonjour math 71,

    merci , en effet mais si je met AND a la place de OR , j'ai un résultat avec login et fournisseur , mais le resultat pour login seul ou fournisseur seul ne marche plus ....

    et j'ai bien regarder comment les utiliser , mais la je bloque , et je ne connaissait pas NOR et NAND ....je vais voir ça ( j'aiu regardé , ça n'a pas l'air de correspondre à ce que je cherche à suivre )

  4. #4
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    octobre 2014
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 25
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2014
    Messages : 109
    Points : 58
    Points
    58

    Par défaut

    Si tu mets la condition vide est ce ça te retourne ce qu'il faut ?

    j'ai un trou de mémoire pour les conditions non utilisées

    ou sinon tu fais des tests pour savoirs quels paramètres est utilisés et tu créés plusieurs requètes selon la demande

  5. #5
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 297
    Points : 10 534
    Points
    10 534

    Par défaut

    Salut,

    comment sais-tu quand une condition n'est pas demandée ?
    Par exemple : aucun filtre sur le fournisseur.

    Tu dois générer dynamiquement le SQL adapté aux critères reçus.
    # Dans la Création, tout est permis mais tout n'est pas utile...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2012
    Messages : 24
    Points : 11
    Points
    11

    Par défaut

    bonjour ,

    en fait j essaier actuellement de faire plusieurs requete en fonction de ce qu on envoie comme choix

    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
     $tri_login = ($result->tri_login);
     $fournisseur = ($result->tri_fournisseur);
     $tri_collection_client1 = ($result->tri_collection1);
     $tri_collection_client2 = ($result->tri_collection2);
     $tri_collection_client3 = ($result->tri_collection3);
     
     if(($tri_login = ($result->tri_login)) || ($fournisseur = ($result->tri_fournisseur)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' OR fournisseur ='".$fournisseur."'");
    }
     if(($tri_login = ($result->tri_login)) && ($fournisseur = ($result->tri_fournisseur)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' AND fournisseur ='".$fournisseur."'");
    } 
      if(($tri_login = ($result->tri_login)) && ($tri_collection_client1 = ($result->tri_collection1)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' AND collection_client ='".$tri_collection_client1."'");
    }
    if(($tri_login = ($result->tri_login)) && ($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' AND collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' ");
    }
    if(($tri_login = ($result->tri_login)) && ($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)) && ($tri_collection_client3 = ($result->tri_collection3)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE login ='".$tri_login."' AND collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' OR collection_client ='".$tri_collection_client3."' ");
    }
    if(($fournisseur = ($result->tri_fournisseur)) && ($tri_collection_client1 = ($result->tri_collection1)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE fournisseur ='".$fournisseur."' AND collection_client ='".$tri_collection_client1."'");
    }
    if(($fournisseur = ($result->tri_fournisseur)) && ($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE fournisseur ='".$fournisseur."' AND collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' ");
    }
    if(($fournisseur = ($result->tri_fournisseur)) && ($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)) && ($tri_collection_client3 = ($result->tri_collection3)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE fournisseur ='".$fournisseur."' AND collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' OR collection_client ='".$tri_collection_client3."'");
    }
    if($tri_collection_client1 = ($result->tri_collection1))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' OR collection_client ='".$tri_collection_client3."'");
    }
    if(($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)) )
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' OR collection_client ='".$tri_collection_client3."'");
    }
    if(($tri_collection_client1 = ($result->tri_collection1)) && ($tri_collection_client2 = ($result->tri_collection2)) && ($tri_collection_client3 = ($result->tri_collection3)))
    {
    $resultats=$connexion->query("SELECT * FROM Produit WHERE collection_client ='".$tri_collection_client1."' OR collection_client ='".$tri_collection_client2."' OR collection_client ='".$tri_collection_client3."'");
    }
    mais tout ne fonctionne pas encore comme je le voudrais , surtout sur l ajout de collection

  7. #7
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 297
    Points : 10 534
    Points
    10 534

    Par défaut

    Ouch ouch, ça pique...
    ce choix technique est intenable, tu dois créer dynamiquement le where en fonction des critères reçus.
    Il faut aussi penser à sécuriser les données.

    Tu utilises PDO ?
    # Dans la Création, tout est permis mais tout n'est pas utile...

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    septembre 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : septembre 2012
    Messages : 24
    Points : 11
    Points
    11

    Par défaut

    c'est a dire ?

    je suis débutant , il faut m'aiguiller un peu plus ...

  9. #9
    Modérateur
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    mars 2004
    Messages
    4 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : mars 2004
    Messages : 4 297
    Points : 10 534
    Points
    10 534

    Par défaut

    Quelque chose dans ce genre :
    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
    <?php
     
    $where  = [];
    $values = [];
     
    if ( ! empty($result->tri_login)) {
        $where[]          = 'login = :login';
        $values[':login'] = $result->tri_login;
    }
     
    if ( ! empty($result->tri_fournisseur)) {
        $where[]                = 'fournisseur = :fournisseur';
        $values[':fournisseur'] = $result->tri_fournisseur;
    }
     
    $where_collection = [];
     
    $filter_collection = function($p) use (&$where_collection, &$result, &$values) {
        if ( ! empty($result->$p)) {
            $where_collection[] = "collection_client = :{$p}";
            $values[":{$p}"]    = $result->$p;
        }
    };
     
    $filter_collection('tri_collection1');
    $filter_collection('tri_collection2');
    $filter_collection('tri_collection3');
     
    // montage du sql
    $sql                  = 'SELECT * FROM Produit';
    $sql_where            = implode(' AND ', $where);               // ici c'est login AND fournisseur
    $sql_where_collection = implode(' OR ', $where_collection);     // ici c'est collec1 OR collec2 OR collec3 
    if ($sql_where && $sql_where_collection) {
        $sql_where_collection = ' OR ('.$sql_where_collection.')';    
    }
     
    $sql .= ($sql_where || $sql_where_collection) ? " WHERE {$sql_where}.{$sql_where_collection}": '';
     
    $stmt = $connexion->prepare($sql);
    $stmt->execute($values);
    $data = $stmt->fetchAll(PDO::FETCH_ASSOC);
    Pour faire de la génération de SQL dynamique, il te faut quand même un bon niveau dans la maîtrise du langage PHP, sinon ça risque d'être difficile.
    # Dans la Création, tout est permis mais tout n'est pas utile...

Discussions similaires

  1. Réponses: 20
    Dernier message: 01/04/2013, 18h40
  2. Requête jointe avec plusieurs conditions
    Par bugbug73 dans le forum Requêtes
    Réponses: 6
    Dernier message: 13/03/2013, 17h03
  3. [AC-2003] Requête avec plusieurs conditions
    Par Brut4lity dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 09/09/2011, 14h09
  4. Réponses: 10
    Dernier message: 26/03/2008, 15h00
  5. Réponses: 2
    Dernier message: 16/02/2008, 12h26

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