[MySQL] Problème avec requête et condition IN

Problème avec requête et condition IN [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 29-11-2006 à 10:10:36    

Bonjour, je rencontre un problème avec le traitement d'une chaine de caractères.
 
Je récupère les données d'une liste déroulante à choix multiples de cette manière:
 

Code :
  1. $secteurs = implode(',' , $_POST["secteurs"]);


 
Le résultat obtenu est de cette forme:
 
19,13,5,24
 
je voudrais isoler chaque résultat afin de les intégrer dans une requête.
 
Par exemple:
 

Code :
  1. $secteur_1 = 19
  2. $secteur_2 = 13
  3. $secteur_3 = 5
  4. $secteur_' = 24


 
Je ne sais pas si c'est possible.
 
Merci pour votre aide.


Message édité par Ben-o le 01-12-2006 à 14:34:08
Reply

Marsh Posté le 29-11-2006 à 10:10:36   

Reply

Marsh Posté le 29-11-2006 à 10:13:42    

En gros, tu commences par concaténer des valeurs individuelles (stockées dans un tableau) avec implode, et ensuite tu voudrais les séparer ? [:petrus dei]

 

Je saisis pas la logique...


Message édité par Chaos Intestinal le 29-11-2006 à 10:18:41
Reply

Marsh Posté le 29-11-2006 à 10:14:55    

tu sais ce que tu fais, tu es sur [:petrus dei]
 
$secteurs = implode(',' , $_POST["secteurs"]);  == là tu recuperes toutes les valeurs d'un array pour les mettres dans une string séparés par une ,
 
au lieu de faire ca, tu fais une putain de  boucle for et tu boucle sur le tableau $_POST["secteurs"];
 

Code :
  1. $sectors = $_POST["secteurs"]
  2. for ($i=0; $i....) {
  3. $sectors[i] ....
  4. }


 
 et au lieu de les mettres dans $secteur_1...  (ce qui est stupide)
 
tu créé ta requete pour générer une string directement [:mlc]

Reply

Marsh Posté le 29-11-2006 à 10:26:23    

C'est vrai que la logique et moi ça fait 2, merci à vous en tout cas.

Reply

Marsh Posté le 29-11-2006 à 10:26:51    

Ben-o a écrit :

C'est vrai que la logique et moi ça fait 2, merci à vous en tout cas.


Ca viendra avec le temps et la pratique :)

Reply

Marsh Posté le 29-11-2006 à 10:27:56    

FlorentG a écrit :

Ca viendra avec le temps et la pratique :)


 
+1.
Ben-o, tu seras pas le premier à te rendre compte avec un peu de recul que t'as fait un truc tordu ou illogique, je pense que c'est arrivé à tout le monde ;)

Reply

Marsh Posté le 29-11-2006 à 10:59:20    

Vous me rassurez :)
 
Par contre pouvez-vous m'écrire le code de la boucle en entier, j'ai pas tout saisi en fait.
 
Je vais avoir:
 

Code :
  1. $secteurs = $_POST["secteurs"];
  2. for ($i = 0; $i (là je ne sais pas quoi mettre?) ) {
  3. $secteurs[i] (je ne sais pas quoi mettre là non plus?)
  4. }


 
Je n'ai compris ceci non plus:
 
"et au lieu de les mettres dans $secteur_1...  (ce qui est stupide) tu créé ta requete pour générer une string directement [:mlc] "
 
 
J'avais également trouvé ce code sur internet:
 

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2. if (!empty ($tabsecteurs)){
  3. foreach ($tabsecteurs as $secteurs) {
  4.  //echo $secteurs;
  5. }
  6. }


 
Lequel est-il préférable d'utiliser?
 
Encore merci pour votre aide.  :)

Reply

Marsh Posté le 29-11-2006 à 11:17:56    

Le foreach est très bien

Reply

Marsh Posté le 29-11-2006 à 11:23:37    

Ben-o, c'était pas la peine de créer 2 topics. Je t'ai déjà dis comment fallait construire ta requête sql...où alors, j'ai mal compris ce que tu voulais faire...

Reply

Marsh Posté le 29-11-2006 à 11:27:16    

Ok, donc si j'utilise une boucle foreach, comment puis-je faire pour isoler les résultats retournés, car si je fais par exemple:
 

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2.      if (!empty ($tabsecteurs)){
  3.           foreach ($tabsecteurs as $secteurs) {
  4.                echo $secteurs[0];
  5.           }
  6.      }


 
echo $secteurs[0] me renvoie le premier caractère de chaque résultat, par exemple "11" si les résultats étaient "19,13"
 
Le problème est que je peux avoir des résultats à 1,2 ou 3 caractères.
 
Je ne sais pas comment faire.

Reply

Marsh Posté le 29-11-2006 à 11:27:16   

Reply

Marsh Posté le 29-11-2006 à 11:28:59    

C'est juste echo $secteurs (mais t'as oublié le explode)

Reply

Marsh Posté le 29-11-2006 à 11:32:00    

Ben-o a écrit :

Ok, donc si j'utilise une boucle foreach, comment puis-je faire pour isoler les résultats retournés, car si je fais par exemple:
 

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2.      if (!empty ($tabsecteurs)){
  3.           foreach ($tabsecteurs as $secteurs) {
  4.                echo $secteurs[0];
  5.           }
  6.      }


 
echo $secteurs[0] me renvoie le premier caractère de chaque résultat, par exemple "11" si les résultats étaient "19,13"
 
Le problème est que je peux avoir des résultats à 1,2 ou 3 caractères.
 
Je ne sais pas comment faire.


 
 

Code :
  1. $tabsecteurs = (isset($_POST["secteurs"]))?$_POST["secteurs"]:null;
  2.      if (!empty ($tabsecteurs)){
  3.           foreach ($tabsecteurs as $i => $CurrentSecteur) {
  4.                echo $CurrentSecteur;
  5.                // ou on peut faire un echo $tabsecteurs[$i]
  6.           }
  7.      }

Reply

Marsh Posté le 29-11-2006 à 11:52:54    

Merci et désolé pour la création des 2 topics, mais j'ai du mal avec tout ça. Je vais me pencher sur vos réponses et tâcher de m'en sortir.

Reply

Marsh Posté le 29-11-2006 à 14:29:31    

La où je bloque en fait, pour reprendre l'autre topic http://forum.hardware.fr/hfr/Progr [...] 8758_1.htm, c'est au niveau de la condition IN.
 
Pour reprendre, mon formulaire de recherche est donc composé de 2 listes déroulantes et d'une liste déroulante à choix multiple.
 
1 liste déroulante pour le prix
1 liste déroulante pour la catégorie du bien
et 1 liste à choix multiple donc pour les secteurs
 
Dans mon fichier de traitement, j'ai ceci:
 
La première partie de ma requête:

Code :
  1. $query = "SELECT t_maison.photo1,
  2.  t_type.type,
  3.  t_secteur.secteur,
  4.  t_categorie.categorie,
  5.  t_maison.no_asp,
  6.  t_maison.prix,
  7.  t_maison.cp_internet,
  8.  t_maison.ville_internet,
  9.  t_maison.nb_chambres,
  10.  t_maison.surf_hab,
  11.  t_maison.surf_terrain,
  12.  t_maison.prestige
  13.  FROM t_type,
  14.  t_secteur,
  15.  t_maison,
  16.  t_categorie,
  17.  t_mandat
  18.  WHERE t_maison.idx_type_mandat = t_mandat.id_mandat
  19.  AND (t_maison.idx_type_mandat = '1'
  20.  OR t_maison.idx_type_mandat = '2'
  21.  OR t_maison.idx_type_mandat = '3')
  22.  AND t_maison.idx_type_offre = '2'
  23.  AND t_maison.idx_type_offre = t_type.id_type_offre
  24.  AND t_maison.idx_secteur = t_secteur.id_secteur
  25.  AND t_maison.idx_categorie = t_categorie.id_categorie";


 
La partie pour le prix:

Code :
  1. if ($_POST["prix"] == 'prix_1') {
  2.  $result_requete_prix = " AND t_maison.prix <= 75000";
  3. }
  4. elseif ($_POST["prix"] == 'prix_2') {
  5.  $result_requete_prix = " AND t_maison.prix > 75000 AND t_maison.prix < 150000";
  6. }...


 
La partie pour la catégorie:

Code :
  1. if ($_POST["categorie"] == 'bastide') {
  2.  $result_requete_categorie = " AND t_maison.idx_categorie = '1'";
  3. }
  4. elseif ($_POST["categorie"] == 'bergerie') {
  5.  $result_requete_categorie = " AND t_maison.idx_categorie = '2'";
  6. }
  7. elseif ($_POST["categorie"] == 'cave') {
  8.  $result_requete_categorie = " AND t_maison.idx_categorie = '3'";
  9. }...


 
Et enfin la partie que j'avais avant pour les secteurs:

Code :
  1. if ($_POST["secteurs"] == 'cne') {
  2.  $result_requete_secteurs = " AND (t_maison.idx_secteur = '1' OR t_maison.idx_secteur = '2')";
  3. }
  4. elseif ($_POST["secteurs"] == 'ne') {
  5.  $result_requete_secteurs = " AND (t_maison.idx_secteur = '8' OR t_maison.idx_secteur = '9')";
  6. }...


 
Ensuite j'assemblais tout ça de cette manière:

Code :
  1. $query_final = $query.$result_requete_prix.$result_requete_secteurs.$result_requete_categorie;
  2. $reponse = mysql_query($query_final);...


 
Ce n'est certainement pas la meilleure méthode, mais ça fonctionne.
 
Avec une boucle foreach et la condition IN, je ne peux donc plus utiliser le même système pour construire ma requête, et c'est précisément là que je bloque. Je ne vois pas comment faire.
 
Encore merci pour votre aide.  :sweat:  :)

Reply

Marsh Posté le 29-11-2006 à 18:28:37    

tu devrais déjà regarder la syntaxe d'une requête SQL qui contient une clause IN (cf doc de MySQl par ex). Ca va déjà t'orienter sur ce que tu dois faire...

Reply

Marsh Posté le 29-11-2006 à 18:50:46    

J'ai bien trouvé ça sur la doc http://dev.mysql.com/doc/refman/5. [...] ators.html, mais je n'arrive pas à le mettre en place.
 
J'ai essayé comme ça:
 

Code :
  1. $result_requete_secteurs = " IN (".implode(',', $_POST["secteurs"])." )";


 
afin de conserver la structure de ma requête.
 
J'ai donc toujours comme requête finale:  
 

Code :
  1. $query_final = $query.$result_requete_prix.$result_requete_categorie.$result_requete_secteurs.$tri;
  2. $reponse = mysql_query($query_final);


 
Ca ne marche pas, je n'ai pas d'erreur, mais voilà ce que me renvoi echo $query_final:
 

Code :
  1. SELECT t_maison.photo1, t_type.type, t_secteur.secteur, t_categorie.categorie, t_maison.no_asp, t_maison.prix, t_maison.cp_internet, t_maison.ville_internet, t_maison.nb_chambres, t_maison.surf_hab, t_maison.surf_terrain, t_maison.prestige FROM t_type, t_secteur, t_maison, t_categorie, t_mandat WHERE t_maison.idx_type_mandat = t_mandat.id_mandat AND (t_maison.idx_type_mandat = '1' OR t_maison.idx_type_mandat = '2' OR t_maison.idx_type_mandat = '3') AND t_maison.idx_type_offre = '2' AND t_maison.idx_type_offre = t_type.id_type_offre AND t_maison.idx_secteur = t_secteur.id_secteur AND t_maison.idx_categorie = t_categorie.id_categorie AND (t_maison.idx_categorie = '1' OR t_maison.idx_categorie = '2' OR t_maison.idx_categorie = '3' OR t_maison.idx_categorie = '4' OR t_maison.idx_categorie = '5' OR t_maison.idx_categorie = '6' OR t_maison.idx_categorie = '7' OR t_maison.idx_categorie = '8' OR t_maison.idx_categorie = '9' OR t_maison.idx_categorie = '10' OR t_maison.idx_categorie = '11' OR t_maison.idx_categorie = '12' OR t_maison.idx_categorie = '13' OR t_maison.idx_categorie = '14' OR t_maison.idx_categorie = '15' OR t_maison.idx_categorie = '16' OR t_maison.idx_categorie = '17' OR t_maison.idx_categorie = '18' OR t_maison.idx_categorie = '19' OR t_maison.idx_categorie = '20' OR t_maison.idx_categorie = '21' OR t_maison.idx_categorie = '22' OR t_maison.idx_categorie = '23' OR t_maison.idx_categorie = '24') IN (21,28,14,8,9,3 ) ORDER BY prix


 
Merci d'avance.

Reply

Marsh Posté le 30-11-2006 à 09:56:34    

ben devant le IN, faudrait tout de même préciser quel champ doit avoir les valeurs précisées dans le IN. Et vire moi tous ces OR et remplaces les par des IN (ou des EXISTS).
 
http://www.1keydata.com/sql/sqlin.html

Reply

Marsh Posté le 30-11-2006 à 11:22:07    

Merci Rufo, je teste ça

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed