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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

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

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    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
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    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.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    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
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Septembre 2008
    Messages
    171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    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
    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

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

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

  9. #9
    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
    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...

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

    Informations forums :
    Inscription : Novembre 2008
    Messages : 26
    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