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 multicritères php MySql


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut Recherche multicritères php MySql
    Bonjour,
    je suis plus que novice en matière de php et mysql. J'ai fait une bae de données avec plusieurs champs (id, sexe age_min age_max et symptomes). ce que j'ai fait c'est un formulaire en html et javascript qui transmet à ma page rechercher.php les variables $Age, $Sexe et 5 symptômes. Voici le code que j'ai essayé pour effectuer ma 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
    <?php  
    $Sexe = $_POST['sexe'];  
    $Age = $_POST['age'];  
    $Sympt1 = $_POST['sympt1'];  
    $Sympt2 = $_POST['sympt2'];  
    $Sympt3 = $_POST['sympt3'];  
    $Sympt4 = $_POST['sympt4'];  
    $Sympt5 = $_POST['sympt5'];  
     
    session_start(); 
    $DBName= "mydb"; 
    $userName = "root"; 
    $DBpasswd = ""; 
    $DBhost = "localhost"; 
     
     
    if(empty($Sympt1) || empty($Age)|| empty($Sexe)) { 
    echo 'Veuillez-vérifier que le sexe, l\'âge de l\'utilisateur et au moins un symptôme sont précisés.';}  
    else{ 
    $requete="SELECT * FROM diagnostique  
    WHERE sexe LIKE '$sexe'  
    AND age_min <= '$age' AND age_max >= '$age'  
    AND (symptomes LIKE '%$Sympt1%')  
    or (symptomes LIKE '%$Sympt2%')  
    or (symptomes LIKE '%$Sympt3%')  
    or (symptomes LIKE '%$Sympt4%')  
    or (symptomes LIKE '%$Sympt5%')" 
    } 
     
     
    ?>


    Ce que je voulais effectuer c'est une recherche qui prenne en compte l'âge et le sexe de façon essentielle c'est à dire que si l'âge n'est pas compris entre age_min et age_max, la maladie ne ressort pas à la recherche. Après pour la recherche au niveau des symptômes, je voudrait que ça soit la maladie qui a le bon sexe et le bon âge et ayant le plus de symptôme correspondant qui ressorte, ou disons les 2-3 correspondant le plus. Si vous pouviez m'aider, je vous remercie par avance!
    Pour ma BDD ça donne: id int nom varchar (100) sexe varchar (2) soit F pour féminin M pour masculin ou FM quand c'est les deux, age_min int age_max et symptomes varchar (1000)

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il vaudrait mieux avoir

    une table symptome
    id _ nom

    une table de liaison maladie_symptome
    id maladie_id symtome_id
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Bonjour, c'est ce que j'avais pensé au début mais je ne suis que lycéen en S, autant vous dire que l'informatique c'est pas ce qu'on nous enseigne en priorité.. Je n'ai que deux heures par semaines mais beaucoup plus en travail personnel pour apprendre de mon côté. Le fait d'avoir plusieurs table m'a effrayé.. Sinon qu'en pensez-vous, ça peut marcher comme ça?

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ca te permettra de compter facilement le nombre de symptomes :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT maladie_id, count(*) FROM maladie_symptome WHERE symptome IN (1, 45, 87) GROUP BY maladie_id ORDER BY count(*) DESC

    Et de proposer une liste de symptomes à choisir.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Rebonjour, ce code est adapté à ma base de données? Je suis désolé mais je ne vois pas à quoi ça me servira, si vous pouvez m'éclairer. Merci de prêter attention à mon cas.
    Ps: les utilisateurs peuvent accéder à une exhaustive liste de symptômes dans le formulaire avec des listes déroulantes liées en fonction des zones du corps

  6. #6
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Non c'est en rapport avec la structure que je te préconise.
    Si en plus tu as déjà une liste de symptomes, ca serait dommage de ne pas la mettre en base de données.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Je vois ce que vous voulez dire, mais j'ai déjà passé un temps très conséquent pour faire ma base actuelle. Suis-je obligé de faire comme vous me le préconiser ou bien je peux continuer sur ma lancé (sachant que j'ai très bien compris qu'il est préférable de faire de votre façon!)

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut problème trie requête sql
    Bonjour à tous,
    ma table est la suivante: id, sexe, nom_maladie, age_min, age_max, et symptomes
    j'ai fait un formulaire pour récupérer les données auprès de l'utilisateur et j'effectue la requête suivante:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM diagnostique WHERE sexe LIKE '%$sexe%' AND age_min <= '$age' AND age_max >= '$age' AND (symptomes LIKE '%$Sympt1%') or (symptomes LIKE '%$Sympt2%') or (symptomes LIKE '%$Sympt3%') or (symptomes LIKE '%$Sympt4%') or (symptomes LIKE '%$Sympt5%');

    Malheureusement la recherche me renvoie de très nombreux résultats que je souhaiterai trier. J'aimerai que la recherche m'affiche les 5 maladies les plus correspondantes par rapport aux 5 symptômes. J'ai donc penser à ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM diagnostique WHERE sexe LIKE '%$sexe%' AND age_min <= '$age' AND age_max >= '$age' AND (symptomes LIKE '%$Sympt1%') or (symptomes LIKE '%$Sympt2%') or (symptomes LIKE '%$Sympt3%') or (symptomes LIKE '%$Sympt4%') or (symptomes LIKE '%$Sympt5%') ORDER BY diagnostique LIMIT 5;
    Mais cela ne marche pas. Merci d'avance à vous.

  9. #9
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Je pense qu'il n'y a pas grand chose à faire de sérieux avec ça.

    Tu peux bien faire un truc moche comme ça, ça doit marcher
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT *,
    IF(
    symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 5,
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%', 4, 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%', 3,
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%', 2, 
    1)))
    ) as Nbre
    FROM diagnostique WHERE sexe LIKE '%$sexe%' AND age_min <= '$age' AND age_max >= '$age' AND (symptomes LIKE '%$Sympt1%') or (symptomes LIKE '%$Sympt2%') or (symptomes LIKE '%$Sympt3%') or (symptomes LIKE '%$Sympt4%') or (symptomes LIKE '%$Sympt5%')
    ORDER BY Nbre DESC;
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Si j'avais du temps devant moi et tes connaissances dans le language SQl sans aucuns doûtes que j'aurai refait ma table comme tu me l'as suggéré! Maintenant je reconnait moi-même que ça n'a rien de professionnel et que ça peut te paraître assez médiocre! Je vais de ce pas essayer ta solution qui je pense va beaucoup m'aider! Je te remercie beaucoup.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    ta méthode marche très bien mais je me demandais si il ne fallait pas envisager beaucoup plus de cas que ça quelque chose comme ça:
    Code sql : 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
    SELECT *,
    IF(symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 5,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%', 4,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt5%', 4,) 
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 4,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 4,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt4%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%', 3,)
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 3,)
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt2%', 2,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt3%', 2,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt4%', 2,) 
    IF (symptomes LIKE '%$Sympt1%' AND symptomes LIKE '%$Sympt5%', 2,) 
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt3%', 2,) 
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt4%', 2,) 
    IF (symptomes LIKE '%$Sympt2%' AND symptomes LIKE '%$Sympt5%', 2,) 
    IF (symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt4%', 2,) 
    IF (symptomes LIKE '%$Sympt3%' AND symptomes LIKE '%$Sympt5%', 2,) 
    IF (symptomes LIKE '%$Sympt4%' AND symptomes LIKE '%$Sympt5%', 2,) 
    IF (symptomes LIKE '%$Sympt1%' 1,) 
    IF (symptomes LIKE '%$Sympt2%' 1,) 
    IF (symptomes LIKE '%$Sympt3%' 1,) 
    IF (symptomes LIKE '%$Sympt4%' 1,) 
    IF (symptomes LIKE '%$Sympt5%' 1,) 
    ) as Nbre
    FROM diagnostique WHERE sexe LIKE '%$sexe%' AND age_min <= '$age' AND age_max >= '$age' AND (symptomes LIKE '%$Sympt1%') or (symptomes LIKE '%$Sympt2%') or (symptomes LIKE '%$Sympt3%') or (symptomes LIKE '%$Sympt4%') or (symptomes LIKE '%$Sympt5%')
    ORDER BY Nbre DESC;

  12. #12
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Nous avons engendré un monstre.
    Si tu arrives à passer cette étape au prix, comme tu le vois, d'une protubérance, tu vas te retrouver à nouveau dans l'impasse au prochain developpement que tu voudras faire.

    Restructurer la partie "symptome" de ta bdd ce n'est pas compliqué et ça permettrait d'arrêter le massacre.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  13. #13
    Membre émérite
    Avatar de gene69
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 769
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 769
    Points : 2 446
    Points
    2 446
    Par défaut
    Il y a un mince probleme théorique que je voudrai rappeler.

    Une base de donnée relationnelle peut témoigner de l’existence d'une relation (ta ta !!) entre vite dit deux informations. Un symptome, un diagnostique.

    Le probleme c'est que la question que tu poses ce n'est pas savoir si le nez qui coule est en liaison avec une grippe ou un rhume, c'est de savoir si c'est plutôt un rhume qu'une grippe. Et là c'est le drame... parce que SQL n'est pas fait pour répondre à ce genre de question.

    SQL ne va jamais te dire mettre un diagnostique en premier parce qu'il est compatible avec plus de symptome mais plutot parce que c'est le premier enregistrement lu qui satisfait les conditions.
    Après avoir obtenu tes résultats, il faut que tu mettes au point une méthode d'évaluation desdits résultats pour ne garder que le pertinent.

    Et ça c'est très compliqué, travaille t'on dans un monde fermé ou ouvert? Si un diagnostique présume 4 symptomes mais que 3 sont trouvés doit-on éliminer le résultat? Peut-on avoir la grippe sans symptomes?
    PHP fait nativement la validation d'adresse électronique .
    Celui qui a inventé mysql_connect(...) or die() est déjà mort plusieurs fois.

    Utilisez le bouton résolu!

  14. #14
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Donc concrètement que me conseillez vous? Refaire ma BDD comme le préconise sabotage? Il est vrai qu'en soit ce n'est pas plus compliqué mais ce qui me fait peur c'est au niveau de la requête et du code php pour la recherche multicritères qui me parait beaucoup plus complexe avec cette base, mes connaissances étant limitée ...

  15. #15
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Points : 331
    Points
    331
    Par défaut
    Je pense que c'est mieux oui. Il n'y a rien de sorcier pour faire des jointures.

  16. #16
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2013
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2013
    Messages : 26
    Points : 6
    Points
    6
    Par défaut
    Bon et bien il faut se résigner, je vais tenter de refaire la base et je reviendrai vers vous si j'ai un problème... Quelque chose comme ça?
    Images attachées Images attachées  

Discussions similaires

  1. [MySQL] Recherche multicritères PHP/MySQL
    Par didigue dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 29/09/2008, 14h32
  2. [MySQL] créer un moteur de recherche en php/mysql
    Par belakhdarbts10 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 21/05/2007, 12h52
  3. Recherche multicritère PHP-MySql
    Par pod1978 dans le forum Débuter
    Réponses: 4
    Dernier message: 14/10/2006, 23h52
  4. Requête multicritère PHP-Mysql
    Par pod1978 dans le forum Requêtes
    Réponses: 5
    Dernier message: 28/05/2006, 18h42

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