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 :

Problème avec recherche multicritères [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut Problème avec recherche multicritères
    Bonjour à tous,

    je débute en php et malgré avoir cherché pas mal et lu plusieurs tutos, je n'arrive toujours pas à résoudre mon problème, que voici :

    Je cherche à référencer des dispositifs médicaux, en l'occurrence des implants dentaires qui ont tous peu ou prou les mêmes caractéristiques, a savoir, j'ai choisi huit critères différents. Par exemple pour le premier critère "Forme générale" on peut avoir trois valeurs différentes : cylindrique, conique et mixte. Pour chaque critères j'ai entre deux et quatre valeurs possibles. J'ai donc créer ma base avec une table de treize champs : un champ index, huit champs pour les caractéristiques à décrire et quatre champs qui contiennent la marque, le modèle, l'url d'une image et l'url d'une page d'info.
    Je voudrais pour voir faire une recherche dans la base sur un, plusieurs ou tous les critères défini.
    Pour l'instant j'ai réussi a faire (en suivant et adaptant un tuto trouvé sur le net) un moteur de recherche qui fonctionne mais uniquement lorsque l'on a choisi une valeur pour chaque critères. Par exemple, je n'arrive pas à avoir un résultat pour une recherche où le premier critère (la forme) n'est pas défini mais tous les autres le sont, c'est à dire faire une recherche dans la base pour tous les implants qui sont de forme cylindrique, conique ou mixte mais dont tous les autres critères sont uniques. Et ceci pour chaque critères. Je ne sais pas si je suis très clair…

    Bref, voici le code source de mon formulaire et la page de résultats.

    Le formulaire :
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    		<title>Module de recherche</title>
    	</head>
     
    	<body>
     
    <form method="POST" action="resultat.php">
    	<center>
    	<table border="1" id="table1">
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Forme Générale</b></font></td>
    			<td>
    				<select name="forme">
    		        <option value="*">--Non défini--</option>
    		        <option value="Cylindrique">Cylindrique</option>
    		        <option value="Conique">Conique</option>
    		        <option value="Mixte">Mixte</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
                <td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Connexion prothétique</b></font></td>
                <td>
                	<select name="connexion">
    		        <option value="*">--Non défini--</option>
    		        <option value="Interne">Interne</option>
    		        <option value="Externe">Externe</option>
    		    	</select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Forme du col</b></font></td>
    			<td>
    				<select name="forme_col">
    		        <option value="*">--Non défini--</option>
    		        <option value="Droit">Droit</option>
    		        <option value="Large">Large</option>
    		        <option value="Evasé">Evasé</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Aspect du col</b></font></td>
    			<td>
    				<select name="aspect_col">
    		        <option value="*">--Non défini--</option>
    		        <option value="Lisse">Lisse</option>
    		        <option value="Spires">Spires</option>
    		        <option value="Microspires">Microspires</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Forme du filetage</b></font></td>
    			<td>
    				<select name="filetage">
    		        <option value="*">--Non défini--</option>
    		        <option value="En V">En V</option>
    		        <option value="Carré">Carré</option>
    		        <option value="Asymétrique">Asymétrique</option>
    		        <option value="Double">Double</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Forme de l'apex</b></font></td>
    			<td>
    				<select name="forme_apex">
    		        <option value="*">--Non défini--</option>
    		        <option value="Plat">Plat</option>
    		        <option value="Arrondi">Arrondi</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Caractéristique apicale</b></font></td>
    			<td>
    				<select name="caract_apex">
    		        <option value="*">--Non défini--</option>
    		        <option value="Aucune">Aucune</option>
    		        <option value="Présence d'un évent">Présence d'un évent</option>
    		        <option value="Présence d'une chambre et d'un évent">Présence d'une chambre et d'un évent</option>
    		        <option value="Autre">Autre</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><font color="#FFFF00"><b>Platform Switching</b></font></td>
    			<td>
    				<select name="platform">
    		        <option value="*">--Non défini--</option>
    		        <option value="Oui">Oui</option>
    		        <option value="Non">Non</option>
    		        </select>
    			</td>
    		</tr>
    		<tr>
    			<td align="center" bgcolor="#808080"><input type="submit" value="Recherche"><input type="reset" value="Réinitialiser la recherche"></td>
    		</tr>
    	</table>
    </form>
     
    </body>
    </html>
    Et le moteur de recherche :
    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
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr">
    	<head>
    		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    		<title>Module de recherche</title>
    	</head>
     
    	<body>
     
    <?php
    try
    {
    	$bdd = new PDO('mysql:host=localhost;dbname=rxid', 'root', '');
    }
    catch (Exception $e)
    {
            die('Erreur : ' . $e->getMessage());
    }
     
    $req = $bdd->prepare('
    SELECT marque,modele,rx,info 
    FROM implants 
    WHERE forme = :forme AND connexion = :connexion AND forme_col = :forme_col AND aspect_col = :aspect_col AND filetage = :filetage 
    	AND forme_apex = :forme_apex AND caract_apex = :caract_apex AND platform = :platform')
    or die(print_r($bdd->errorInfo()));
     
    $req->execute(array('forme' => $_POST['forme'], 'connexion' => $_POST['connexion'], 'forme_col' => $_POST['forme_col'],
    'aspect_col' => $_POST['aspect_col'], 'filetage' => $_POST['filetage'], 'forme_apex' => $_POST['forme_apex'],
    'caract_apex' => $_POST['caract_apex'], 'platform' => $_POST['platform']));
     
    echo '<center><table bgcolor="#669999">'."\n";
    	echo '<caption>Il peut s\'agir de cet (ou ces) implant(s)</caption>';
    	echo '<tr>';
    	echo '<th bgcolor="#669999"><b><u>Marque</u></b></td>';
    	echo '<th bgcolor="#669999"><b><u>Modèle</u></b></td>';
    	echo '<th bgcolor="#669999"><b><u>Radio</u></b></td>' ;
    	echo '<th bgcolor="#669999"><b><u>Informations</u></b></td>' ;
    	echo '</tr>'."\n";
    	echo '<tr>';
    while ($donnees = $req->fetch())
    { 
    	echo '<td bgcolor="#CCCCCC">'. $donnees["marque"] .'</td>';
    	echo '<td bgcolor="#CCCCCC">'. $donnees["modele"] .'</td>';
    	echo '<td bgcolor="#CCCCCC"><img src='. $donnees["rx"] .' /></td>';
    	echo '<td bgcolor="#CCCCCC"><a href='. $donnees["info"] .'>Informations</a></td>';
    	echo '</tr>'."\n";
    }
    echo '</table></center>'."\n";
     
    $req->closeCursor();
    ?>
     
    </body>
    </html>
    Pour chaque critères j'ai rajouté une option "non défini" avec la valeur "*" en pensant que la recherche se ferait comme ça sur toutes les valeurs mais ça ne marche pas, j'ai aussi essayé, en vain, avec "%". Malheureusement mes connaisssances en php et mysql sont très limités et je ne sais pas comment m'en sortir, c'est pourquoi je solicite votre aide. En vous remerciant par avance.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    Les requêtes préparées ne conviennent pas réellement à ces cas. En espérant ne pas manquer d'idée :
    • Sans requête préparée :
      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
      $fields = array(
          'forme',
          'connexion',
          'forme_col',
          'aspect_col',
          'filetage',
          'forme_apex',
          'caract_apex',
          'platform',
      );
       
      $q = 'SELECT marque, modele, rx, info FROM implants';
      $inject = array();
      foreach ($fields as $f) {
          if (/*isset($_POST[$f]) && */$_POST[$f] != '*') {
              $inject[] = $f . ' = ' . $bdd->quote($_POST[$f]);
          }
      }
      if ($inject) {
          $q .= ' WHERE ' . implode(' AND ', $inject);
      }
      $req = $bdd->query($q);
    • Avec (peu d'intérêt ici) :
      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
      $fields = array(
          'forme',
          'connexion',
          'forme_col',
          'aspect_col',
          'filetage',
          'forme_apex',
          'caract_apex',
          'platform',
      );
       
      $q = 'SELECT marque, modele, rx, info FROM implants';
      $params = array();
      $values = array();
      foreach ($fields as $f) {
          if (/*isset($_POST[$f]) && */$_POST[$f] != '*') {
              $params[] = $f . ' = :' . $f;
              $values[$f] = $_POST[$f];
          }
      }
      if ($params) {
          $q .= ' WHERE ' . implode(' AND ', $params);
      }
      $req = $bdd->prepare($q);
      $req->execute($values);

    (non testé, magic_quotes_gpc supposé à Off, gestion des erreurs à ajouter)

    Au besoin, il est possible de "complexifier" (gestion de type notamment, ce qui semble inutile ici).

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    C'est parfait, merci beaucoup c'est exactement ce que je voulais faire. Ça marche impeccable, bref je suis super heureux

    Merci encore pour ton aide

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

Discussions similaires

  1. [AC-2007] Problème avec recherche via liste déroulante
    Par akroma59 dans le forum Access
    Réponses: 2
    Dernier message: 25/05/2012, 17h00
  2. problème avec "rechercher et remplacer"
    Par Edward Bunzl dans le forum Word
    Réponses: 2
    Dernier message: 16/05/2010, 16h12
  3. problème avec recherche multi-critères
    Par yannick63 dans le forum VBA Access
    Réponses: 2
    Dernier message: 27/01/2010, 15h48
  4. Problème de recherche multicritère
    Par darkann dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/07/2007, 19h02
  5. Problème avec recherche
    Par Mimisio dans le forum IHM
    Réponses: 2
    Dernier message: 06/07/2007, 13h28

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