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 sur plusieurs tables


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut Recherche multicritères sur plusieurs tables
    Bonsoir,
    J'ai un formulaire de recherche multicritères contenant des boutons radio et des cases à cocher, il va piocher dans plusieurs tables pour afficher les résultats selon le choix des critères.
    J'ai une table "appartements", une table "maisons", une table "transactions" (Acheter ou Louer), une table "themes" (appartement, maison) et une table "pieces" (T1, T2, T3, T4, T5).
    Les tables "appartements" et "maisons" contiennent toutes les deux des clès étrangères pour faire le lien avec les autres table, à savoir, "transactionID", "rubriqueID" et "piecesID"
    Ce que je veut, c'est l'orsqu'on coche par exemple le bouton Acheter, la case Appartement et la case T1, il va questionner la table appartement pour sortir les critères demandés, la même chose si on coche la case maison.
    Voilà le code que j'ai écrit et qui ne marche pas encore:
    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
     
    SELECT r.theme, a.Reference,  p.nombre, t.ID
    FROM transactions t  
    INNER JOIN appartements a ON a.transactionID=t.ID
    WHERE a.transactionID=colbien  
    INNER JOIN rubriques r ON a.rubriqueID=r.ID 
    WHERE a.rubriqueID=coltheme 
    INNER JOIN pieces p ON a.piecesID=p.ID WHERE a.piecesID=colnombre
    union ALL
    SELECT r.theme, m.Reference,  p.nombre, t.ID
    FROM transactions t  
    INNER JOIN maisons m ON m.transactionID=t.ID
    WHERE m.transactionID=colbien  
    INNER JOIN rubriques r ON m.rubriqueID=r.ID 
    WHERE m.rubriqueID=coltheme 
    INNER JOIN pieces p ON m.piecesID=p.ID 
    WHERE m.piecesID=colnombre

    colbien=$_GET['transactionID']
    coltheme=$_GET['rubriqueID']
    colpieces[$_GET['piecesID']


    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 053
    Points
    34 053
    Billets dans le blog
    14
    Par défaut
    C'est sûr que comme ça, ça ne peut pas fonctionner ! Il ne faut qu'un seul WHERE par requête !

    Ça devrait déjà être mieux 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
    SELECT r.theme, a.Reference,  p.nombre, t.ID
    FROM transactions t  
    INNER JOIN appartements a ON a.transactionID = t.ID
    	INNER JOIN rubriques r ON a.rubriqueID = r.ID 
    	INNER JOIN pieces p ON a.piecesID = p.ID 
    WHERE a.piecesID = colnombre
    	AND a.transactionID = colbien  
    	AND a.rubriqueID = coltheme 
    UNION ALL
    SELECT r.theme, m.Reference,  p.nombre, t.ID
    FROM transactions t  
    INNER JOIN maisons m ON m.transactionID = t.ID
    	INNER JOIN rubriques r ON m.rubriqueID = r.ID 
    	INNER JOIN pieces p ON m.piecesID = p.ID 
    WHERE m.transactionID = colbien  
    	AND m.rubriqueID = coltheme 
    	AND m.piecesID = colnombre
    Cependant, pourquoi avoir joint à la fois maison et appartement avec rubrique et piece ?
    Il eut été plus simple de faire la liaison directement dans la table des transactions.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse, je vais tester et je reviens pour te dire ce que ca donne...

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Ton code marche bien, J'obtiens exactement le même résultat qu'avec le code suivant que j'ai modifier il y a peu
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT a.rubriqueID , a.transactionID, a.piecesID, a.Reference,  a.Libelle FROM appartements a 
    WHERE a.rubriqueID = coltheme 
      AND a.transactionID = colbien 
      AND a.piecesID = colnombre 
    UNION ALL  
    SELECT m.rubriqueID , m.transactionID, m.piecesID, m.Reference, m.Libelle
    FROM maisons m
    WHERE m.rubriqueID = coltheme 
      AND m.transactionID = colbien 
      AND m.piecesID=colnombre

    Par contre, sur le tien et sur le mien, je n'obtiens pas les appartements et les maisons dans le même tableau si l'utilisateur coche appartements et maisons en même temps!!!

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 053
    Points
    34 053
    Billets dans le blog
    14
    Par défaut
    Je vois un petit problème sur ta requête qui devrait à mon avis provoquer une erreur : tu sélectionnes 5 colonnes dans la première requête et 6 dans la seconde.

    Comment récupères-tu le résultat de la case à cocher maison et appartement ?
    Si c'est coltheme, comme tu utilises la même variable dans les deux sous-requêtes, c'est peut-être normal que tu n'aies que les appartements ou les maisons?

    En tout cas, je pense que ça viendrais plutôt du code applicatif que de la requête.

    Et je continue de penser que tu devrais corriger ton modèle de données.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Tout à fait, je viens de supprimer m.Surface qui été en plus.
    Par contre pour la variable coltheme, dois-je utiliser une autre variable pour maisons?
    Merci.

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 053
    Points
    34 053
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par bili31 Voir le message
    Par contre pour la variable coltheme, dois-je utiliser une autre variable pour maisons?
    Ben il me semble puisque si je comprends bien la variable coltheme contient soit la référence à appartement ou à maison mais pas les deux à la fois !

    Mais là ça ne tient plus de MySQL mais de l'application.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    En faite la variable coltheme= $_GET['rubriqueID'] j'ai mis rubriqueID comme colonne dans les deux tables, rubriqueID=1 dans appartements et =2 dans la table maisons, peut être qu'il fallait que je change le nom de la variable et mettre coltheme=$_GET['VARtheme'] pour la différencier du nom de la colonne!

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 801
    Points : 34 053
    Points
    34 053
    Billets dans le blog
    14
    Par défaut
    $_GET contient les données provenant de ton formulaire. Rien à voir avec les colonnes de la table !

    Il faut que tu affectes à la variable utilisée dans la requête la valeur du champ de sélection appartement ou maison. Si tu as 2 cases à cocher dans le formulaire, tu récupéreras deux paramètres dans $_GET et c'est la valeur de ces deux paramètres qu'il faut affecter à deux variables.

    Déjà que ton modèle de données n'est pas top mais j'ai l'impression que le processus de traitement du formualire n'est pas top non plus !

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Justement j'essaye d'améliorer mes connaissances à travers ce blog.
    Peut tu s'il te plait me donner plus d'explications pour que je puisse comprendre, avec un exemple si c'est possible.
    Merci pour ton aide.

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    $_GET est censé chercher les données de la table exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $_GET['transactionID'] ?>
    est liée aux deux boutons radio vendre ou louer pareil pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $_GET['rubriqueID'] ?>
    qui est liée aux cases à cocher appartements et maisons

    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
     
    <form name="form1" method="get" action="results.php">
        <table   width="100%" border="0" class="table7" >
      <tr>
        <td colspan="2" style="color:#333"><label>
                        <input <?php if (!(strcmp($_GET['transactionID'],"1"))) {echo "checked=\"checked\"";} ?> <?php if (!(strcmp($_GET['transactionID'],1))) {echo "checked=\"checked\"";} ?> type="radio" name="transactionID" value="1" id="transaction_0" />
                  Acheter</label></td>
        <td colspan="2" style="color:#333"><label>
                        <input <?php if (!(strcmp($_GET['transactionID'],"2"))) {echo "checked=\"checked\"";} ?> type="radio" name="transactionID" value="2" id="transactionID_1" />
                  Louer</label></td>
      </tr>
      <tr>
        <td colspan="4" style="color:#333"><span style="color:#333; font-size:12px; font-weight:bold" >TYPE(S) DE BIENS</span></td>
        </tr>
      <tr>
        <td colspan="2" style="color:#333"><label>
                        <input <?php if (!(strcmp($_GET['rubriqueID'],1))) {echo "checked=\"checked\"";} ?> type="checkbox" name="rubriqueID" value="1" id="rubriqueID_0" />
                  Appartement</label></td>
        <td colspan="2" style="color:#333"><label>
                        <input type="checkbox" name="rubriqueID" value="2" id="rubriqueID_1" />
                  Maison</label></td>
        </tr>
      <tr>
        <td colspan="2" style="color:#333"><label>
                        <input  type="checkbox" name="rubriqueID" value="3" id="rubriqueID_2" /></tr>
     
    <td colspan="4" align="center"><input type="submit" name="button" id="button" value="Rechercher" /></td>
      </tr>
        </table>
        </form>
    Si tu peut me proposer mieux, je suis preneur, d'autant plus qu'avec la requête que j'ai posté plus haut elle ne fonctionne plus aprés la dernière mise à jour que j'ai effectué sur le site, je n'arrive pas à trouver l'erreur.
    Quelques soient les critères que je sélectionne, ca m'affiche tout le contenu de la table.
    Merci

  12. #12
    Membre régulier
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2008
    Messages : 171
    Points : 106
    Points
    106
    Par défaut
    Salut,

    j'ai fais à peu prêt la même chose mais avec des offres d'emploi :

    Je vais d'abord tester mes checkbox en AJAX si elles sont coché je les mets dans un tableau et je passe mes valeurs en post:

    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
    $(function(){
    
        //first_step
        $('form.submit_recherche').submit(function(){ 
    			return false; 
    	});
        $('#submit_recherche').click(function(){
    		        $("#resultsEmploi").empty();
    				arrayCheckBox = new Array;
    				         $("input:checked").each(function() {
    				          arrayCheckBox.push(this.value);
    				        }); 
    								        
    		     	$.post("ajax_search.php", { 'typeOffre[]' : arrayCheckBox, mots_clef : $("#mots_clef").val(), poste : $("#poste").val(), secteur : $("#secteur").val(), localisation  : $("#localisation ").val()},
    					function(data) {
    						$("#resultsEmploi").html(data);
    		        	});		    
        });
    });
    ensuite j'ai plus cas faire ce traitement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    				$valeur_requete_contrat =  '';
    				while($Offre = array_shift($typeOffre))
    					 $valeur_requete_contrat .= 'OR (type_contrat_offre_emploi LIKE \'%' . $Offre . '%\') ';
    					 $valeur_requete_contrat = ltrim($valeur_requete_contrat,'OR');
    ce qui me donne le résultat suivant :

    (type_contrat_offre_emploi LIKE '%CDI%') OR (type_contrat_offre_emploi LIKE '%CDD%') OR (type_contrat_offre_emploi LIKE '%intérim%') OR (type_contrat_offre_emploi LIKE '%alternance%') OR (type_contrat_offre_emploi LIKE '%stage%')
    j'ai plus qu'à combiner avec mon where, order by.....

    je sais pas si cela peut t'aider, mais fait un echo de ta requête pour voir ce qu'elle t'affiche ...des fois c'est juste un espace, une parenthèse qui peut faire foirer ta requête.

    perso : j'avais laisser un <br /> car pour mon affichage plus visible et ça ma plombé mes résultats et j'ai tourner en rond pendant 2h. LoooL

    tiens au courant

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Merci beaucoup, je vais tester ça.

  14. #14
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    salut,

    coté requête cinephil t'as bien dégrossi le problème...

    coté php maintenant...

    déjà ne jamais faire confiance à ce que tu récupères dans $_POST ou $_GET

    limite au maximum la récupération de texte... et teste toujours avec des regexp si c'est du texte libre si tu peux...

    tout ce qui as un équivalent sous forme d'index dans ta bd dois être récupéré sous sa forme numérique (bien plus compact pour la quantité de données passée en GET ou POST et facile à sécuriser contre les attaques par injections)

    un entier ce récupère toujours via un:
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $v=intval($_GET['truc']);
    là tu es sur que quoi qu'il arrive que tu as un entier (0 si pas de valeur numérique dans la variable) donc pas d'injection

    pour ta requête de recherche, selon l'organisation de ton formulaire tu vas peut-être devoir découpé celle-ci et faire des unions éventuelles...

    tu vas construire ta requete de manière modulaire en fonction des paramètre choisi... tu peux le faire dynamiquement coté mysql avec une procédure stockée (requête préparée, table temporaire et/ou utilisation d'union) ou coté php selon l'isolation php/mysql que tu veux avoir... mais le principe sera le même...

    identifier la ou les requêtes qui sont en jeu en fonction des paramètres...
    construire la ou les chaines de caractère en fonction puis finaliser la chaine contenant la requête finale avec des unions (coté php pas trop le choix niveau performances) si besoin... là, ta structure de bd est importante et va t'imposer les critères, les requêtes et les performances aussi... d'où cinephil te disant de bien penser ton modèle de données vu qu'il est au centre de tout...

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    Points : 8
    Points
    8
    Par défaut
    Ok, merci beaucoup

Discussions similaires

  1. Recherche multicritères sur plusieurs tables
    Par bili31 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 31/01/2012, 23h30
  2. [MySQL] recherche multicritères sur plusieurs table
    Par rvm31 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 24/11/2007, 17h42
  3. recherche multicritères sur deux tables
    Par amélie22 dans le forum Access
    Réponses: 1
    Dernier message: 16/06/2006, 11h59
  4. recherche multicritères sur plusieurs tables
    Par amélie22 dans le forum Access
    Réponses: 1
    Dernier message: 16/06/2006, 09h48
  5. Recherche multicritère sur plusieurs tables
    Par Nabouille dans le forum Access
    Réponses: 3
    Dernier message: 12/04/2006, 18h39

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