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 :

Recherche muticritères [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut Recherche muticritères
    Bonjour,

    j'ai créé une base de données que je voudrais lier à une formulaire de recherche.
    Ce formulaire devrait permettre une recherche suivant les critères suivant
    public
    département
    activité
    mot clef

    Les visiteurs pouvant remplir 1,2,3 ou les quatre champs pour préciser leur recherche.

    Les 3 premiers champs font référence à des colonnes précises de ma BDD, le dernier est un champ libre pour permettre de rechercher dans toutes les colonnes de la BDD.

    Je suis tout simplement perdue pour commencer mon code.
    est-ce que je commence qq chose du type

    if (isset($_POST['public']) && isset($_POST['departement']) && isset($_POST['activite'])

    mais ca multiplie les possibilités à prendre en compte,

    ou est-ce qu'il existe un code plus simple.

    Si vous connaissez un tutoriel là dessus, je veux bien l'adresse,

    merci beaucoup pour votre aide

  2. #2
    Membre éclairé Avatar de Sytchev3
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    433
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 433
    Par défaut
    le mieux est que ta requête de recherche se construise au fur et à mesure du style :

    requete="select * from zzz"

    Si xxxx<>"" alors

    requete=requete + "where ..."

    sinon si yyy<> "" alors

    requete=requete + "and..."

    fin si
    fin si

    J'espère que cela t'aidera

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2006
    Messages
    111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 111
    Par défaut
    Je fairai presque ca , mais je présiserai ma premiére condition :
    Requete ='where 1=1 '
    si champtext1.est_rempli() {Requette .="AND 'champ' = ".champtext1}
    si champ 2 .....

    Cela permet d'eviter de prendre en compte le cas ou le premier champ et vie ou il ne faudrai pas mettre le and dasn le 2eme ....
    Et d'eviter de mettre le and a la fin et se retrouver avec le derniére champ vide .

    Autre avantage ca evite de di si champ[x].est_vide() {'1=1 AND'}

    En bref sa simplifie l'utilisation des AND et donc de la construction de la requette .
    Inconvennient on pert un pe de puissance dans la requette ,
    Je conseil de l'utiliser pour une base de donnée inféreur a 1million d'entré .( environ )

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    un 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
    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
    $requete = "SELECT id_pkg, ville, pays, hotel, tour_op, lpays_fr, status FROM descriptions, code_pays WHERE descriptions.pays = code_pays.cpays";
     
    if (isset($id_pkg) && $id_pkg !="" && $id_pkg !="pkg-")
    {
    	$requete .= " AND  LOWER(id_pkg) LIKE '".strtolower($id_pkg)."%'";
    }
     
    if (isset($hotel) && $hotel !="")
    {
    	$requete .= " AND  LOWER(hotel) LIKE '%".strtolower($hotel)."%'";
    }
     
    if (isset($tour_op) && $tour_op != '#')
    {
    	$requete .= " AND  LOWER(tour_op) LIKE '".strtolower($tour_op)."'";
    }
     
    if (isset($ville_depart) && $ville_depart != '#')
    {
    	$requete .= " AND  LOWER(ville_depart) LIKE '".strtolower($ville_depart)."'";
    }
     
    if (isset($status) && $status != '#')
    {
    	$requete .= " AND  status='".$status."'";
    }
     
    if (isset($prix_min) && $prix_min != '')
    {
    	$requete .= " AND  prix_min > '".$prix_min."'";
    }
    if (isset($prix_max) && $prix_max != '')
    {
    	$requete .= " AND  prix_max < '".$prix_max."'";
    }
     
    if (isset($mois) && $mois != '#')
    {
    	$date = $annee."-".$mois."-01";
    	$requete .= " AND op_date_debut < '".$date."' AND '".$date."' < op_date_fin";
    }
     
     
     
     
     
    if (isset($pays) && $pays != "#")
    {
    	if(is_numeric(strpos($pays,'/')))
    	{
    		$ville = substr($pays,3);
    		$requete .= " AND  LOWER(ville) LIKE '".strtolower($ville)."'";
    	}
    	else
    	{
    		$requete .= " AND LOWER(pays) LIKE '".strtolower($pays)."'";
    	}
    }
     
     
    $requete .= " ORDER BY id_pkg, pays, ville, tour_op;";

    voila un exemple de construction de requete de recherche en fonction de multiples criteres, ville, pays, prix, date, etc...

    En esperant que ca t'aide !

  5. #5
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    merci à tous, je vais bosser à partir de tous vos conseils

  6. #6
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    j'ai essayé d'adapter la méthode Zevince mais j'ai une page blanche. Bon, au moins, je n'ai pas de message d'erreur, c'est déjà ca ;-)

    Si qqn peut m'aider à faire miraculeusement apparaitre du texte...
    Merci à tous
    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
     
    $base = mysql_connect ('***', '***', '***');
    mysql_select_db ('***', $base);
     
    $requete = " SELECT * FROM aide_ac,aide_st WHERE aide_ac.structure = aide_st.s_clef "; 
     
    if (isset($public) && $public !="") 
    { 
       $requete .= " AND  LOWER(public) LIKE '".strtolower($public)."%'"; 
    } 
     
    if (isset($departement) && $departement !="") 
    { 
       $requete .= " AND  LOWER(s_departement) LIKE '%".strtolower($departement)."%'"; 
    } 
     
    if (isset($activite) && $activite != "") 
    { 
       $requete .= " AND  LOWER(activite) LIKE '".strtolower($activite)."'"; 
    } 
     
    $requete .= " ORDER BY public,s_departement, activite;";
     
     // on exécute la requête
    $req = mysql_query($requete) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
     
    // on scanne tous les tuples un par un 
    while ($data = mysql_fetch_array($req)) {
    // on affiches les résultats dans la <table>
     
            echo '<tr><td class="txtg">Activités</td><td class="txtp">' , stripslashes(htmlentities(trim($data['activite']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Description</td><td class="txtp">' , stripslashes(htmlentities(trim($data['description']))) , '</td></tr>';echo '<tr><td class="txtg">Organisateur</td><td class="txtp">' , stripslashes(htmlentities(trim($data['s_nom']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Horaires</td><td class="txtp">' , stripslashes(htmlentities(trim($data['horaires']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Dates</td><td class="txtp">' , stripslashes(htmlentities(trim($data['dates']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Tarifs</td><td class="txtp">' , stripslashes(htmlentities(trim($data['tarifs']))) , '</td></tr>';
    		}
            // on libère l'espace mémoire alloué pour cette requête 
        mysql_free_result ($req); 
     
    ?>

  7. #7
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    voilà où j'en suis, et rien ne s'affiche.

    J'ai trois menus déroulants dans ma page de recherche, construits sur la base

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <select name="public" id="public">
                          <option value="#" selected>Choisir dans la liste</option>
                          <option value="particulier">particulier</option>
                          <option value="professionnel">professionnel</option>
                          <option value="encadrant">professionnel encadrant</option>
                        </select>

    ma requête se présente comme cela

    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
     
    <?php
     
    $base = mysql_connect ('***', '***', '***');
    mysql_select_db ('***', $base);
     
    $requete = " SELECT * FROM aide_ac,aide_st WHERE aide_ac.structure = aide_st.s_clef "; 
     
    if (isset($_POST['public'])&&($_POST['public'])!="#") 
    { 
       $requete .= ' AND  public = "'.$_POST['public'].'"'; 
    }
     
    if (isset($_POST['departement'])&&($_POST['departement'])!="#") 
    { 
        $requete .= ' AND  s_departement = "'.$_POST['departement'].'"'; 
    } 
     
    if (isset($_POST['activite'])&&($_POST['activite'])!="#") 
    { 
       $requete .= ' AND  activite = "'.$_POST['activite'].'"';
    } 
     
    $requete .= " ORDER BY activite;";
     
     // exécution de la requête
    $req = mysql_query($requete) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
     
    while ($data = mysql_fetch_array($req)) {
    //affichage des résultats        
     
        echo '<table><tr><td class="txtg">Activités</td><td class="txtp">' , stripslashes(htmlentities(trim($data['activite']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Description</td><td class="txtp">' , stripslashes(htmlentities(trim($data['description']))) , '</td></tr>';echo '<tr><td class="txtg">Organisateur</td><td class="txtp">' , stripslashes(htmlentities(trim($data['s_nom']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Horaires</td><td class="txtp">' , stripslashes(htmlentities(trim($data['horaires']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Dates</td><td class="txtp">' , stripslashes(htmlentities(trim($data['dates']))) , '</td></tr>';
    		echo '<tr><td class="txtg">Tarifs</td><td class="txtp">' , stripslashes(htmlentities(trim($data['tarifs']))) , '</td></tr></table><br />';
    		}
            // on libère l'espace mémoire 
    mysql_free_result ($req);

    pas d'erreur de code apparement mais rien ne s'affiche, si quelqu'un peut me débloquer, merci beaucoup à tous.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 123
    Par défaut
    au lieu de directement faire mysql_query
    construisez votre requete comme zevincec a fait. $req.= .....
    n'oubliez pas le . devant le égal pour pas écrasez vos anciennes valeurs
    à la fin de tout vos tests faites un écho et allez tester votre requete là où vous avez votre base de données. sql vous dira ce qui va pas.

    et encore un conseil, si tas une page blanche qui saffiche.
    moi je fais $req=mysql_query($marequeteconstruite)

    si $req=1
    alors echo, j'ai des résultats
    sinon echo j'ai pas de résultats. et tu verras si tu as un pb daffichage ou de requete.

  9. #9
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    au lieu de directement faire mysql_query
    construisez votre requete comme zevincec a fait. $req.= .....
    merci pour cette réponse, mais je suis désolée, je n'arrive pas à la comprendre : j'ai fait la même chose que zevince, sauf qu'effectivement j'ai ajouté à la fin
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     // exécution de la requête 
    $req = mysql_query($requete) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); 
     
    while ($data = mysql_fetch_array($req)) { 
    //affichage des résultats
    mais je ne vois pas comment faire autrement que mysql_query pour demander d'effectuer la requête.
    merci encore pour votre aide !

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    Si tu as un affichage vierge, c'est que tu n'as pas d'erreur dans ta requete SQL, mais qu'elle retourne un resultat vide... (enfin, c'est la 1ere explication qui me vient !) affiche la, et examine la de près !

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    Oups...
    mais je viens de voir ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = mysql_query($requete) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    tu effectue une "$requete" et si elle echoue, tu affiche un "$sql" ... qui sort d'ou ?

    ca serait plutot ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $result = mysql_query($requete) or die (mysql_error().$requete);
    Si ta "$requete" n'est pas bonne, tu affiches l'erreur et la requete en question !

  12. #12
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    merci,

    il y avait effectivement une erreur à la fin
    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
     
    $requete = " SELECT * FROM aide_ac,aide_st WHERE aide_ac.structure = aide_st.s_clef "; 
     
    if (isset($_POST['public'])&&($_POST['public'])!="#") 
    { 
       $requete .= ' AND  public = "'.$_POST['public'].'"'; 
    } 
     
    if (isset($_POST['departement'])&&($_POST['departement'])!="#") 
    { 
        $requete .= ' AND  s_departement = "'.$_POST['departement'].'"'; 
    } 
     
    if (isset($_POST['activite'])&&($_POST['activite'])!="#") 
    { 
       $requete .= ' AND  activite = "'.$_POST['activite'].'"'; 
    } 
     
    $requete .= ' ORDER BY s_nom;'; 
     
     // exécution de la requête 
    $req = mysql_query($requete) or die (mysql_error().$requete);
     
    while ($data = mysql_fetch_array($req)) { 
    //affichage des résultats        
     
        echo 'Activités' , stripslashes(htmlentities(trim($data['activite']))) , 'proposées'; 
     
    mysql_free_result ($req); 
    ?>
    en revanche, il n'y a que le premier "if" qui est pris en compte, même si je précise les suivants (comme si les AND n'étaient pas pris en compte). il y a sûrement qq chose qui ne va pas avec la concaténation des requêtes, mais c'est la première fois que je me penche la dessus, alors je ne vois pas. [/quote]

  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    bon, alors, dans ton script, tu as repris tel quel mon bout de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isset($_POST['public']) && ($_POST['public'])!="#"
    Pour le ($_POST['public'])!="#" ... # dans mon code html est la valeur par defaut d'un champ non selectionné, donc a ne pas prendre en compte :

    <option value='#'>Selectionnez</option>

    est-ce que chez toi c'est pareil, ou alors tu as mis ce test sans trop chercher a voir a quoi il correspondait ?

  14. #14
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    j'ai mis # quand c'est à ne pas prendre en compte

    par exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <select name="public" id="public"> 
                          <option value="#" selected>Choisir dans la liste</option> 
                          <option value="particulier">particulier</option> 
                          <option value="professionnel">professionnel</option> 
                          <option value="encadrant">professionnel encadrant</option> 
                        </select>
    j'ai mis # comme value pour "choisir dans la liste" car c'est celui par défaut et qui ne correspond à aucun critère, ce qui veut dire qu'il faut regarder les critères des autres variables. J'espère être claire.

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (isset($_POST['public'])&&($_POST['public'])!="#") 
    { 
       $requete .= ' AND  public = "'.$_POST['public'].'"'; 
    }
    signifie pour moi "si la variable est différente de # pour "public" la rechercher dans la colonne "public".

  15. #15
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    495
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 495
    Par défaut
    ben la je ne vois pas, ca me semble correct...
    tu fais un affichage du style
    print_r($_POST);
    histoire de voir, si toutes tes variables passent bien ?

  16. #16
    Membre confirmé Avatar de carelha
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Mars 2006
    Messages : 168
    Par défaut
    merci beaucoup, c'est OK. J'avais changé dans mon formulaire le nom d'une variable, et pas dans la page de résultats

    je vais pouvoir passer au problème suivant, à dans pas trop longtemps

    merci Zevince

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

Discussions similaires

  1. formulaire de recherche muticritère
    Par elodie1283 dans le forum IHM
    Réponses: 4
    Dernier message: 11/10/2013, 10h29
  2. recherche muticritère : prise en compte de champs vide
    Par kramokamo dans le forum Access
    Réponses: 2
    Dernier message: 13/03/2006, 18h14
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de données
    Réponses: 6
    Dernier message: 19/05/2002, 22h18
  4. [PRO*C] Recherche information
    Par Anonymous dans le forum Interfaces de programmation
    Réponses: 2
    Dernier message: 04/04/2002, 17h53
  5. Recherche de documentation complète en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 29/03/2002, 12h09

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