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

Requêtes MySQL Discussion :

[SGBD] Module de recherche multicritere en PHP/Mysql comment faire


Sujet :

Requêtes MySQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut [SGBD] Module de recherche multicritere en PHP/Mysql comment faire
    bonjour à tous, je souhaiterai faire un module de recherche multicritere sur ma table, par exemple si j'ai une table 'personne' qui contient nom, prenom, age, sexe je voudrait avoir un module avec des checkbox qui me permette de choisir les champs que je veux afficher ou non.
    Si je coche que sur nom je ne fait ma requette que sur les noms ....

    Es-ce possible de faire ca en php mysql de facon "dynamique" à savoir avec des concatenation dans les WHERE ???

    Merci d'avance. Je n'ai pas envie de partir sur une fausse piste.

    Bonne année

  2. #2
    Membre éclairé Avatar de nako
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2003
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2003
    Messages : 577
    Points : 663
    Points
    663
    Par défaut
    Salut, bien sur, c'est tout à fait possible.
    Le SELECT est un chaîne de caractère, ni plus ni moins, tu peux donc l'écrire directement dans le code ou la "construire" selon certain paramètres.
    Aucun problème ! tu peux te lancer.
    a+

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    Merci je m'y attele, je posterai ce que j'ai fait pour savoir si on ne peut pas faire mieu

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    J'ai fais cela mais je ne sais pas comment faire une clause du style Where Nom = Dupont AND Prenom = Jean.
    Mais je voudrais avoir des AND seulement lorsqu'on choisi plusieur champs sinon on fait une recherche unique.
    En gros possibilité de recherche :
    Soit par nom, ou prenom ou codealliance ou les 3 ou 2 sur 3 .....

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    <form action="recherche.php">
    <input type="hidden" name="formulaire" value="yes">
    <input type="checkbox" name="options[]" value="Nom">&nbsp;Nom<br>
    <input type="text" name="Nom"><br>
    <input type="checkbox" name="options[]" value="Prenom">&nbsp;Prénom<br>
    <input type="text" name="Prenom"><br>
    <input type="checkbox" name="options[]" value="CodeAlliance">&nbsp;CodeAlliance<br>
    <input type="text" name="CodeAlliance"><br>
    <input type="submit">
    </form>
     
    <?php
    $Nom = $_GET['Nom'];
    $Prenom = $_GET['Prenom'];
    $CodeAlliance = $_GET['CodeAlliance'];
     
     
    if ($Nom<>"")
    {
    $Elt=$Nom;
    }
     
    if ($Prenom<>"")
    {
    $Elt=$Prenom;
    }
     
    if ($CodeAlliance<>"")
    {
    $Elt=$CodeAlliance;
    }
     
     
    $formulaire = $_GET['formulaire'];
    $options = $_GET['options'];
     
    if ($formulaire == 'yes') {
    $options_text = implode('',$options);
    }
     
    $Requette = "SELECT * FROM Agents WHERE ".$options_text."="."'".$Elt."';";
    echo  $Requette;
     
    ?>
    Merci

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Pas sûr que les checkboxes soient vraiment utiles, elles alourdissent l'interface pour rien.
    Basiquement, si nom de champ de <form> == nom de champ de la BdD je ferais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $fields = array('nom', 'prenom', 'codeAlliance') ; // Champs <form>/BdD
    $sql = 'SELECT ALL tesChamps FROM taTable WHERE 1 = 1 ' ;
    foreach ( $fields as $field ) {
        if ( isset($_POST[$field]) && $_POST[$field] !== '' ) { // Ignore les champs vides
            $sql .= " AND $field = '{$_POST[$field]}'" ;
        }
    }
    echo $sql ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Points : 1 504
    Points
    1 504
    Par défaut
    Tout d'abord, OUI, c'est tout à fait possible.
    J'avais déjà fait ça et je me souviens être tombé sur les problèmes suivants

    ->Il faut tester le type de ton champ dans la base. Il me semblait que faire un where user_id='id' ou id est un numérique provoquait une erreur, de même qu'un username=$name provoquait une erreur sans les ' . Mais j'avoue ne plus trop me rappeler si ca faisait une erreur ou pas mais vérifie quand même au cas où.

    Sinon j'avais utilisé la même logique que Sèb sauf que je devais pouvoir gérer les OR aussi mais c'est la même mécanique à une condition près.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    Tout d'abord Merci et Bonne année ; j'ai essayé de faire tourner ton code mais j'ai eu un peu de mal :

    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
     
    Formulaire de recherche multicritères
     
    <form action="recherche.php">
    <input type="hidden" name="formulaire" value="yes">
    <input type="text" name="Nom"><br>
    <input type="text" name="Prenom"><br>
    <input type="text" name="CodeAlliance"><br>
    <input type="submit">
    </form>
     
    <?php
     
    $fields = array('Nom', 'Prenom', 'CodeAlliance') ; // Champs <form>/BdD 
    $sql = 'SELECT * FROM Agents WHERE 1 = 1 ' ; 
    foreach ( $fields as $field ) { 
        if ( isset($_POST[$field]) && $_POST[$field] !== '' ) { // Ignore les champs vides 
            $sql .= " AND $field = '{$_POST[$field]}'" ; 
        } 
    } 
    echo $sql ;
     
    ?>

  8. #8
    Membre averti
    Avatar de Julien.alkaza
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 239
    Points : 363
    Points
    363
    Par défaut
    Moi j'aurais fait un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = "SELECT....FROM....WHERE ";
    if ($_POST['nom']!="")
    $sql.= "nom = '$_POST['nom']' ";
    if ......
    $sql.="......";
    J'ai déjà fait ca pour une sélection multicritères via des sélects...
    Admin Réseaux & Systèmes.

    Red Hat Certified Technician...#604006101698235

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    Merci ,

    Ton script marcherait bien si je n'avais que 3 champs, mais étant donné que je vais en avoir une bonne dizaine, cela allourderai le script de façon significative, tu ne pense pas ?

    J'aimerai un test sur les champs afin de faire une requette personnalisée, si un champ est rempli alors on le rajoute avec AND si on en utilise qu'un alors on ne prend que celui-ci ....

  10. #10
    Membre averti
    Avatar de Julien.alkaza
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 239
    Points : 363
    Points
    363
    Par défaut
    En effet, ca risque d'être lourd...
    Admin Réseaux & Systèmes.

    Red Hat Certified Technician...#604006101698235

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    Ca marche :

    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
     
    <form action="recherche.php">
    <input type="hidden" name="formulaire" value="yes">
    <input type="text" name="Nom"><br>
    <input type="text" name="Prenom"><br>
    <input type="text" name="CodeAlliance"><br>
    <input type="submit">
    </form>
     
    <?php
     
    //Connection à la base de données
    require_once("../Connection/Connection.php");
     
    $fields = array('Nom', 'Prenom', 'CodeAlliance') ; // Champs <form>/BdD 
    $sql = 'SELECT * FROM Agents WHERE 1 = 1 ' ; 
    foreach ( $fields as $field ) { 
        if ( isset($_GET[$field]) && $_GET[$field] !== '' ) { // Ignore les champs vides 
            $sql .= " AND $field = '{$_GET[$field]}'" ; 
        } 
    } 
    echo $sql ;
     
    ?>
    Il recupere les champs et fait la requette personnalisée

  12. #12
    Membre averti
    Avatar de Julien.alkaza
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    239
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 239
    Points : 363
    Points
    363
    Par défaut
    Ok...

    Résolu??
    Admin Réseaux & Systèmes.

    Red Hat Certified Technician...#604006101698235

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 87
    Points : 46
    Points
    46
    Par défaut
    Bah en fait nan

    Parceque la requette marche mais le 1=1 de la requette fe fait tout afficher. Quand je rempli les champs ca marche, mais tant que je ne fait rien il m'affiche toute les valeurs.
    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
     
    <form action="recherche.php">
    <input type="hidden" name="formulaire" value="yes">
    Nom<input type="text" name="Nom"><br>
    Prénom <input type="text" name="Prenom"><br>
    Code Alliance <input type="text" name="CodeAlliance"><br>
    <input type="submit">
    </form>
     
    <?php
     
    //Connection à la base de données
    require_once("../Connection/Connection.php");
     
    $fields = array('Nom', 'Prenom', 'CodeAlliance') ; // Champs <form>/BdD 
    $sql = 'SELECT * FROM agents WHERE 1 = 1' ; 
    foreach ( $fields as $field ) { 
        if ( isset($_GET[$field]) && $_GET[$field] !== '' ) { // Ignore les champs vides 
            $sql .= " AND $field = '{$_GET[$field]}'" ; 
        } 
    } 
    $sql .=";"; 
    $result = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
    echo $sql ;
     
    echo "<div align='center' class='Titre'>Administration<br /><span class='menu'>Résultat de la recherche</span></div>
    	<table width='720' border='0' align='center' cellpadding='10' cellspacing='1'>
    	<tr valign='top'>
          <th>Nom</th>
        <th >Prénom</th>
    	<th >Code Alliance</th>
    	</tr>";
     
    	while($temp=mysql_fetch_assoc($result)){
    	$query2 = "SELECT agents.IdAgent, agents.Nom, agents.Prenom, agents.CodeAlliance FROM agents WHERE agents.IdAgent='".$temp['IdAgent']."'";
    	$result2 = @mysql_query ($query2) or die (mysql_error());
     
    	while($temp2=mysql_fetch_assoc($result2)){
    echo "<tr valign='top' class='TDDonnees' onmouseover=\"setPointer('over', this, '#FFFFFF', '', '', '')\" onmouseout=\"setPointer('out', this, '#f5f5f5', '', '', '')\">
        <td >".$temp2['Nom']."</td>
        <td >".$temp2['Prenom']."</td>
    	 <td >".$temp2['CodeAlliance']."</td>
      </tr>";
      	}
      }
     
      echo "</table>";
     
    ?>

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Mars 2009
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    esqu'il ya une autre solution car le WHERE 1=1 ça affiche toujours ??

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

Discussions similaires

  1. Recherche multicritere sur base mysql
    Par matsay81 dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/05/2009, 11h23
  2. Recherche Login Script PHP & MySQL
    Par whbh dans le forum SQL Procédural
    Réponses: 9
    Dernier message: 01/12/2005, 16h45

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