Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/01/2012, 22h56   #1
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
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 :
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
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 11h55   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 030
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 030
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 :
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 18h10   #3
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci pour ta réponse, je vais tester et je reviens pour te dire ce que ca donne...
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/01/2012, 18h31   #4
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
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 :
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!!!
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 00h23   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 030
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 030
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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 de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 20h50   #6
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
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.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 10h40   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 030
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 030
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
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.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 15h20   #8
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
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!
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 15h48   #9
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 030
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 11 030
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
$_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 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 19h34   #10
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
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.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2012, 19h47   #11
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
$_GET est censé chercher les données de la table exemple
Code :
<?php $_GET['transactionID'] ?>
est liée aux deux boutons radio vendre ou louer pareil pour
Code :
<?php $_GET['rubriqueID'] ?>
qui est liée aux cases à cocher appartements et maisons

Code :
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
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2012, 10h13   #12
Membre du Club
 
Homme
Webmaster
Inscription : septembre 2008
Messages : 113
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Webmaster

Informations forums :
Inscription : septembre 2008
Messages : 113
Points : 45
Points : 45
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 :
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 :
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 :

Citation:
(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
cragoroth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2012, 20h37   #13
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Merci beaucoup, je vais tester ça.
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2012, 21h48   #14
Membre Expert
 
Homme Eric Dureuil
Développeur informatique
Inscription : avril 2011
Messages : 875
Détails du profil
Informations personnelles :
Nom : Homme Eric Dureuil
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 : 875
Points : 1 368
Points : 1 368
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 :
$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...
__________________
Eric Dureuil, développeur web, c/c++, java indépendant
soyons
pensez à mettre et
ericd69 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2012, 20h17   #15
Invité de passage
 
Inscription : novembre 2008
Messages : 24
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 24
Points : 0
Points : 0
Ok, merci beaucoup
bili31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h52.


 
 
 
 
Partenaires

Hébergement Web