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 PHP Discussion :

Problème recherche multi critères dans plusieurs champs


Sujet :

Langage PHP

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut Problème recherche multi critères dans plusieurs champs
    Bonjour,

    J'ai un formulaire de recherche (méthode GET) avec plusieurs champs. J'ai un petit souci. Je n'arrive pas à rechercher à partir d'une valeur sélectionnée dans le drop down du formulaire dans plusieurs champs de la base.

    Voici un exemple. Dans la base le champ "discipline1" à plusieurs valeurs : géo, histoire, français, maths... le champ "discipline2" a exactement les mêmes valeurs, idem pour discipline3....

    Je voudrais qu'à partir du formulaire de recherche l'utilisateur sélectionne une valeur par exemple maths et ca trouve tous les enregistrements ou maths a été sélectionné en discipline1 ou en discipline2 ou en discipline3

    Voici mon code. Comment l'adapter pour que ca cherche dans les autres champs?
    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
     
     
    <?php
     
    $discipline1=""; if(!empty($_GET["discipline1"])) 
    $discipline1=$_GET["discipline1"];
     
     
    if(!isset($_GET['page'])){
        $page = 1;
    } else {
        $page = $_GET['page'];
    }
     
     
    $max_results = 10;
     
     
    $from = (($page * $max_results) - $max_results); 
     
     
     
    $query = "SELECT discipline1 FROM matable";
     
    if(isset($_GET['discipline1']) && $_GET['discipline1'] != "") {
         $fields['discipline1'] = $_GET['discipline1'];
    }
    if(!empty($fields)) {
         $i = 0;
         $query .= " WHERE ";
         foreach($fields AS $field => $value) {
              if($i > 0) {
                   $query .= " AND ";
              }
     
    ...
     
              else {
                   $query .= $field." = '".$value."'";
              }
              $i++;
         }
    }
     
    $query .= " ORDER BY discipline1 DESC";
    Merci beaucoup pour votre aide

  2. #2
    Membre émérite Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 022
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 022
    Points : 2 273
    Points
    2 273
    Par défaut
    Salut,
    il suffit que t'ajoutes les champs qui t'intérèssent dans la requête :

    $query = "SELECT discipline1, discipline2, discipline3 FROM matable";

    Bye
    Vive les roues en pierre

  3. #3
    Membre averti Avatar de Space Cowboy
    Homme Profil pro
    chomeur
    Inscrit en
    Avril 2005
    Messages
    496
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : chomeur

    Informations forums :
    Inscription : Avril 2005
    Messages : 496
    Points : 401
    Points
    401
    Par défaut
    Au sujet de l'initialisation de discipline1.


    J'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!isset($_GET['id']))	$id 	= '';
    else				$id 	= quote_smart($_GET['id']);
    Ce qui est plus propre. Comme ca je n'ai aucune variable vide, soit elle valent '' ou une valeur.


    Et pour tu initialise cette variable, pour ne pas l'utiliser ensuite ? Tu enregistre le contenu de $_GET['discipline1'] dans $discipline1 mais tu ne l'utilise pas ensuite ...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Je ne suis pas arrivé à résoudre mon problème. J'ai ajouté discipline2, discipline3... dans ma requête seulement avec mon code voici à quoi ressemble ma requête :

    WHERE discipline1 = 'Maths' AND discipline1 = 'Maths'

    Le problème c'est que moi je veux que ca soit OU et pas AND. Je veux que ca affiche les résultats où Maths est en discipline 1 et ou il est aussi en discipline 2. Vous voyez le truc???

  5. #5
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut pourquoi faire si compliqué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $request = "SELECT discipline1, discipline2, discipline3 FROM matable 
    WHERE discipline1='$_POST[discipline1]' OR discipline2='$_POST[discipline2]' OR discipline3='$_POST[discipline3]' ";
    Business, Stratégie, Leadership
    Toujours à l'écoute du marché : Surtout en Suisse ! ;-)

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    Citation Envoyé par zyongh
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $request = "SELECT discipline1, discipline2, discipline3 FROM matable 
    WHERE discipline1='$_POST[discipline1]' OR discipline2='$_POST[discipline2]' OR discipline3='$_POST[discipline3]' ";
    Je complique parce que mon formulaire de recherche multi-critères est compliqué. Il contient 10 champs (listes déroulantes). L'utilisateur peut choisir d'afficher les résultats en fonction de tous ces champs et en plus compris entre 2 valeurs. Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT id,champ1,champ2,champ3,discipline1,discipline2,discipline3 FROM matable WHERE discipline1 = 'maths' AND prix >= 0 AND prix <= 20000 AND 
    age >= 0 AND age <= 10 AND taille>= 150 AND taille <= 185 ORDER BY 
    addate DESC LIMIT 0, 10
    Mon problème si je vais chercher les résultats dans plusieurs disciplines ca utilise query AND alors que je voudrais un OU. Comment puis je introduire la notion de OU dans mon code. Voici la partie dont qui traite la recheche avec WHERE

    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
     
    if(!empty($fields)) {
         $i = 0;
         $query .= " WHERE ";
         foreach($fields AS $field => $value) 
    	 {
              if($i > 0) 
    		  {
                   $query .= " AND ";
              }  
    		  if($field == "prixmin") {
                   $query .= "prix >= ".$value;
              }
              else if($field == "prixmax") {
                   $query .= "prix <= ".$value;
              }
    		  else if($field == "agemin") {
                   $query .= "age >= ".$value;
              } 
    		  else if($field == "agemax") {
                   $query .= "age <= ".$value;
              }
    		  else if($field == "taillemin") {
                   $query .= "taille >= ".$value;
              } 
    		  else if($field == "taillemax") {
                   $query .= "taille <= ".$value;
              }
              else {
                   $query .= $field." = '".$value."'";
              }
              $i++;
         }
    }
     
    $query .= " ORDER BY date DESC LIMIT $from, $max_results ";

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    175
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 175
    Points : 60
    Points
    60
    Par défaut
    personne pour me filer un coup de main?

  8. #8
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    685
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 685
    Points : 658
    Points
    658
    Par défaut
    Je viens d'essayer pour voir en me basant sur les 3 premières lettres des clefs :

    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
    $fields = array('prixmin' => 100, 'prixmax' => 500, 'agemin' => 20, 'agemax' => 30, 'taillemin' => 100, 'taillemax' => 150);
    ksort($fields);
     
    if(!empty($fields)) 
    {
       $i = 0;
       $query .= ' WHERE (';
       foreach($fields AS $k => $v) 
    	 {
    	 		$debut_actu = $k[0].$k[1].$k[2];
          if($i > 0) 
    		  {
    		  	 echo $debut_actu . '<br />';
    		  	 if( $debut_actu != $debut_prec )
    		  	 {
    				 		$debut_prec = $debut_actu;
    				 		$query .= ') OR (';
    				 }
    				 else
    				 		$query .= ' AND ';
          }
          else
          	 $debut_prec = $k[0].$k[1].$k[2];
     
    		  if($k == 'prixmin')
               $query .= 'prix >= ' .$v;
          else if($k == 'prixmax')
               $query .= 'prix <= ' . $v;
    		  else if($k == 'agemin')
               $query .= 'age >= ' . $v;
    		  else if($k == 'agemax')
               $query .= 'age <= ' . $v;
    		  else if($k == 'taillemin')
               $query .= 'taille >= ' . $v;
    		  else if($k == 'taillemax')
               $query .= 'taille <= ' . $v;
    		  else
              $query .= $k . '=\'' . $v . '\'';
    		  $i++;
       }
    }
    $query .= ')';
     
    echo $query;
    A voir si ça peut te convenir.

    Edit: sinon, je viens d'y penser seulement, t'as BETWEEN qui existe en SQL.

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

Discussions similaires

  1. [AC-2003] Recherche multi-critère dans une même table
    Par Tadao dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 09/03/2010, 19h01
  2. recherche multi-critères dans un formulaire de recherche
    Par sam1975 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/08/2009, 18h12
  3. [AC-2003] Problème recherche multi-critères
    Par Meph-Dev dans le forum IHM
    Réponses: 3
    Dernier message: 13/05/2009, 10h54
  4. Réponses: 6
    Dernier message: 18/03/2007, 16h22
  5. problème recherche multi critère
    Par jeck dans le forum Access
    Réponses: 3
    Dernier message: 16/05/2006, 10h42

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