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

Langage PHP Discussion :

Filtrer des articles par catégories (aide pour requète SQL)


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut Filtrer des articles par catégories (aide pour requète SQL)
    Bonjour,

    Actuellement, j'ai un code qui fonctionne bien mais il y a un morceau qui ne réagit pas comme je le souhaiterais.

    Voici le contexte :

    J'ai une liste d'articles qui s'affiche sur ma page.
    Ces articles sont associés à des catégories ce qui me permet de les filtrer.

    Pour filtrer les articles, j'ai un champs texte et une liste de catégories (cases à cocher).
    Je peux donc combiner ma recherche mots clés / catégories.

    Le hic :

    Je coche les catégories "oiseaux" et "caraïbe". Je souhaiterais donc lister les articles qui appartiennent aux deux catégories, or aujourd'hui je liste tous les articles qui appartiennent à oiseaux et tous les articles qui appartiennent à "caraïbe".
    Ma requête effectue donc des "OR" et j'aimerais des AND.

    Technique :

    Deux tables sont concernées :
    La table "article" qui contient tous les articles et la table "rel_art_categ" qui permet de faire la jointure entre les catégories et les articles via leurs ID.

    Quand je coche une catégorie, son ID est inséré dans un tableau JavaScript que je récupère ensuite en PHP.

    Voici ma requête SQL simplifiée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       $valueCheck = $_REQUEST['checkVal']; // Mon tableau d'ID
       $categValue = implode(",", $valueCheck); // Que je transforme en chaîne
     
    "SELECT DISTINCT article.art_id, art_date, art_auteur, art_titre, art_desc, art_text, rel_art_categ.art_id 
    FROM `article`, `rel_art_categ`
    WHERE rel_art_categ.categ_id IN ($categValue) // où l'id de la catégorie est présente dans le tableau 
    AND rel_art_categ.art_id = article.art_id
    ORDER BY art_date DESC"
    Je pense qu'il est possible de faire ce que je souhaiterais avec une boucle mais j'ignore comment et je suppose qu'il y a une méthode plus efficace.

    Merci d'avance pour votre aide.

  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
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    if (isset($_REQUEST['checkVal'])) {
     
    foreach($_REQUEST['checkVal'] as $categValue) {
      $where[] =  " rel_art_categ.categ_id = " . intval($categValue);
    }
     
    $sql = "SELECT DISTINCT article.art_id, art_date, art_auteur, art_titre, art_desc, art_text, rel_art_categ.art_id 
    FROM `article` JOIN `rel_art_categ`ON rel_art_categ.art_id = article.art_id
    WHERE " . implode(" AND ", $where) . " 
    ORDER BY art_date DESC";
     
    }
    Je t'ai refais ta jointure au passage.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    Bonsoir Sabotage,

    Merci beaucoup, j'ai compris le principe et c'est exactement ce qu'il me fallait

    En revanche, j'ai pu constater qu'il me renvoi rien quand je check deux cases.
    Je ne comprends pas trop sachant que dans ma table j'ai bien des articles dans plusieurs catégories.

    Ma table rel_art_categ : Nom : table.PNG
Affichages : 802
Taille : 11,0 Ko

    Quand je coche les catégories 1 et 2, il devrait pourtant afficher les articles 45 et 49 non ?

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    	if (isset($_REQUEST['checkVal'])) {
    		$valueCheck = $_REQUEST['checkVal'];
     
    		foreach($_REQUEST['checkVal'] as $categValue) {
    			$where[] =  " rel_art_categ.categ_id = " . intval($categValue);
    		}
    		$r = implode(" AND ", $where);
    	}
    	$resultat=$connexion->query("SELECT DISTINCT article.art_id, art_date, art_auteur, art_titre, art_desc, art_text, rel_art_categ.art_id 
    						 FROM `article` JOIN `rel_art_categ` ON rel_art_categ.art_id = article.art_id
    						 WHERE art_public = 1 
    						 AND $r                 // ==> rel_art_categ.categ_id = 1 AND rel_art_categ.categ_id = 2
    						 ORDER BY art_date DESC");

  4. #4
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2013
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2013
    Messages : 19
    Par défaut
    Voici une solution : Pas forcement la meilleure mais elle fonctionne bien.
    (La jointure me posait problème donc je l'ai enlevé)

    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
     
    	if (isset($_REQUEST['checkVal'])) {
    		$valueCheck = $_REQUEST['checkVal'];
    		$compteur = 2;
    		$compteurm = $compteur-1;
    		foreach($_REQUEST['checkVal'] as $categValue) {
    			$where[] =  " rel_art_categ as r".$compteur." ON r".$compteurm.".art_id = r".$compteur.".art_id AND r".$compteurm.".categ_id = " . intval($categValue);
    			$compteur++;
    			$compteurm++;
    		}
    		$r = implode(" JOIN ", $where);
    	}
     
    	$inputVal = "'%".$valueInput."%'";
    	if ($categValue != "") {
    		$q = ("SELECT DISTINCT article.art_id, art_date, mem_id, mem_prenom, mem_nom, art_auteur, art_titre, art_desc, art_text, r1.art_id 
    			  FROM `article`, `membre`, `rel_art_categ` AS r1
    			  JOIN $r
    			  WHERE art_auteur = mem_id
    			  AND r1.art_id = article.art_id
    			  AND art_public = 1
    			  AND (art_titre LIKE $inputVal
    			  OR art_desc LIKE $inputVal
    			  OR art_text LIKE $inputVal
    			  OR mem_nom LIKE $inputVal
    			  OR mem_prenom LIKE $inputVal)
    			  ORDER BY art_date DESC");
    		$resultat=$connexion->query($q);
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide pour requête SQL
    Par 0x0000091 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 07/01/2009, 16h50
  2. Aide pour requête SQL
    Par eatherquake dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/12/2008, 15h44
  3. Aide pour requête SQL assez simple
    Par Pilloutou dans le forum Langage SQL
    Réponses: 15
    Dernier message: 28/03/2008, 16h07
  4. Besoin d'aide pour requête SQL
    Par dinver78 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/05/2007, 19h20
  5. Besoin d'aide pour requête SQL
    Par vallica dans le forum Requêtes
    Réponses: 10
    Dernier message: 09/06/2006, 00h16

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