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 :

[SQL] Recherche mutli critère


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut [SQL] Recherche mutli critère
    Bonjour.

    J'aimerai avoir un petit eclaircissement.
    Je possède un formulaire possédant 9 champs possibles.

    AU minimum un champs doit être rempli et après le reste est optionnel.
    Quel est le meilleur moyen de s'y prendre?

    J'avais penser à faire comme ceci

    $query="SELECT * FROM prospects";


    $query.=" WHERE nom LIKE '$choixrechercher_nom' AND adresse1 LIKE '$choixrechercher_adresse' AND cp LIKE '$choixrechercher_cp' AND type_base LIKE '$choixrechercher_typebase' AND datecreation_base LIKE '$choixrechercher_datebase' AND profession LIKE '$choixrechercher_profession' AND societe LIKE '$choixrechercher_societe' AND CSP LIKE '$choixrechercher_CSP' ORDER BY nom";
    Et les champs n'étant pas rempli vallait donc %.
    Seul hic c'est lorsque il y a des champs non remplis dans la BDD et qu'ils valent donc NULL ben l'histoire du % ne marche plus.

    Au final quel est la meilleure solution pour faire une recherche mutli critère sachant que 8 champs sur 9 sont optionnels.

    Cordialement

  2. #2
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Il y a pas mal d'exemples de ce genre de problemes dans le forum.
    Le mieux déjà est de constuire ta requete au fur et a mesure pour chaque critère indépendemment les uns des autres, exemple :

    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
     
    $req = "SELECT * FROM matable ";
    $cond = " WHERE " ;
     
    if(isset($_POST['critere1']))
    {
    $req .= $cond . " critere1 = '" . $_POST['critere1'] . "' ";
    $cond = " AND ";
    } 
     
    if(isset($_POST['critere2']))
    {
    $req .= $cond . " critere2 = '" . $_POST['critere2'] . "' ";
    $cond = " AND ";
    }
    etc.
    tu notes que $cond permet de savoir quelle condition utiliser (par défaut WHERE et ensuite AND)

    sinon il me semble que Asmodean (mais je confonds peut etre) utilise un WHERE 1 = 1 comme première condition, du coup tu sais que tu as toujours des AND et tu n'as pas de probleme de conditions.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Ouais et si ton deuxieme critiere y a rien il me semble que la requete finissant par AND plante non?
    Donc pas tres malin

    Pour reprendre l'exemple precedent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    if(isset($_POST['obligatoire'])){
    $param1 = "obligatoire = ".$obligatoire. "'";
    }
    else{
     $param1 = 1;
    }
    if(isset($_POST['option1'])){
     $param2 = ' AND param2='.$_POST['option1'];
    }
     
    $sql="SELECT * FROM table WHERE $param1 $param2 "
    Je trouve plus leger et tu peux mieux gérer les OR ou cas bizzard

  4. #4
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Avec le code de koopajah ça ne marchera pas si un champs est vide. Si tu met des 1 quand le champs est vide ça marche à tous les couts puisuqe 1 est interprété comme le boolean vrai (et n'a donc pas d'effet sur les AND)

    EDIT : ça ne marchera pas si le dernier champs et vide pardon

  5. #5
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    Je viens de faire un EDIT mais il me semble que si le dernier de tes paramètres est vide tu vas te retrouver avec un AND puis rien après.
    Mais je me trompe peut être

  6. #6
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Citation Envoyé par guigui5931
    Je viens de faire un EDIT mais il me semble que si le dernier de tes paramètres est vide tu vas te retrouver avec un AND puis rien après.
    Mais je me trompe peut être
    Et bien relis mon code qui ne fait pourtant que quelques lignes et tu verras bien que ca n'est pas le cas.

    Dans chaque if on a deux lignes, la première ajoute a notre requete courante la condition courante (where si c'est le premier critère non vide, and sinon) et ensuite le critère lui meme.
    La seconde ligne sert a dire "la condition courante de vient AND vu qu'on a mis un WHERE avant"

    donc ce code marche très bien.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Citation Envoyé par koopajah
    Dans ma solution le AND n'est ajouté a la requete que si on met bel et bien un critere après donc je pense que mon message bien que pas forcément malin etait largement viable, je l'utilise tous les jours

    Dans la solution de guigui c'est parfaitement viable aussi vu qu'on se retrouve avec dans 1 entre chaque AND si le critère n'est pas rempli. Le seul défaut étant qu'il faut connaitre a l'avance le nombre de paramètres.

    Par contre j'aimerais savoir quelle est ta solution si intelligente que tu ne daignes meme pas proposer?
    Si tu m'avais laissé le temps de modifier mon com

  8. #8
    Membre Expert Avatar de guigui5931
    Profil pro
    Chef de projet NTIC
    Inscrit en
    Avril 2006
    Messages
    1 667
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 667
    Par défaut
    ce que je fais dans ce cas la c'est que si le champs n'est pas rempli je ne le met pas dans la requete SQL. Je te fais un exemple avec 2 champs optionnel et un obligatoire
    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
     
    $obligatoire = $_POST['obligatoire'];
    $optionnel1= $_POST['optionnel1'];
    $optionnel2= $_POST['optionnel2'];
    if (!empty($obligatoire  ))
    {
    $param1 = "obligatoire = '" .$obligatoire. "'";
    }
    else
    {
    $param1 = "1";
    }
    if (!empty($optionnel1))
    {
    $param2 = "optionnel1= '" .$optionnel1. "'";
    }
    else
    {
    $param2 = "1";
    }
    if (!empty($optionnel2))
    {
    $param3 = "optionnel2= '" .$optionnel2. "'";
    }
    else
    {
    $param3 = "1";
    }
    $sql="SELECT $ FROM table WHERE $param1 AND $param2 AND $param3"
    Si tu as besoin de plus d'explication demande

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    Merci à vous deux, voila qui m'éclaire bien sur la facon de m'y prendre?
    EN cas de besoin je reviendrai.

    Merci

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    550
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 550
    Par défaut
    J'ai utilisé la méthode de koopajah plus ou moins qui me convenait mieux et ca marche nickeL

    Merci

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

Discussions similaires

  1. [MySQL] Requete SQL pour faire une recherche multi critères
    Par nassing dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 19/05/2011, 17h01
  2. Recherches multi critères multi tables SQL
    Par Marc_L dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/07/2010, 11h54
  3. Aide pour Requete SQL - recherche de critères
    Par AuroreBezu dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/01/2009, 07h54
  4. [Oracle] [SQL] Recherche sur 2 critères
    Par guyanais dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 31/10/2008, 17h45
  5. problème SQL avec le tutoriel recherche multi critère
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/12/2005, 19h33

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