8768 sujets

Développement web côté serveur, CMS

Bonjour,
je viens ici demander un peu d'aide SVP, car je galère à finaliser une requete avec des jointures.
Mon but est de récupérer ma liste des catégories dans ma page de gestions des catégories, et aussi d'afficher à coté du Nom de chaque catégories le nombre d'articles publiés (statut 1) par catégorie.

Avec un search WHERE mots clés entrés pour afficher mes catégories selon mots clés entrés, je ni arrive pas.
Avec le code ci-dessous, je n'arrive pas à faire en sorte que le search cherche dans la table categories.
Actuellement, mes catégories s'affichent toutes, quelque soit les mots clés entrés...

Peut on m'aider Svp ?

Voici mon code :

<?php
/*
* categories : Table des catégories qui peuvent etre reliées à des articles
* articles : Table des articles
* categories_jointes_articles : Table pivot (qui a comme champs id_article et id_categorie)
*
* SQL :
* _récupérer liste des catégories selon mots clés entrés dans search, et nombre d'articles par catégories :
* SELECT champs de la table categories
* , et COUNT le nombre de articles.id  (dans les parenthèses du count mettre (articles.id) au lieu de (*), servira à récup WHERE statut articles = 1 (publiés))
* FROM table categories
* JOIN table categories_jointes_articles
*   sur categories.id est = à categories_jointes_articles.id_categorie
*
* _count nombre d'articles par catégories uniquement WHERE articles.statut = 1 (statut publiés)
* JOIN table articles
*   sur articles.id = à categories_jointes_articles.id_article
*   AND articles.statut est = à 1   (AND ".$tablePosts.".statut = ?";, pour afficher aussi les catégories qui ne sont pas reliées à des articles where statut = 1)
*/
$sql = "SELECT categories.id, categories.nom
    , COUNT(articles.id) as nb_articles
    FROM categories
    LEFT OUTER JOIN categories_jointes_articles
        ON categories.id = categories_jointes_articles.id_categorie
 
    LEFT OUTER JOIN articles
        ON articles.id = categories_jointes_articles.id_article
        AND ".$tablePosts.".statut = ?";
 
$sql .= " AND categories.nom LIKE ? ";     // c'est cette ligne que je ne sais pas où mettre
 
$sql .= " GROUP BY categories.id, categories.nom";
 
$requete = self::getDb()->prepare($sql);
 
$requete->bindValue(1, 1, PDO::PARAM_INT);
$requete->bindValue(2, '%'.$mots.'%', PDO::PARAM_STR);
$requete->execute();
$requete->setFetchMode(PDO::FETCH_OBJ);
return $requete;

Merci beaucoup.
Modifié par dew (16 Oct 2015 - 10:30)
Salut,

Ajoute à ta requête une clause WHERE avec toute les conditions discriminante

SELECT categories.id, categories.nom, COUNT(articles.id) as nb_articles
FROM categories
LEFT OUTER JOIN categories_jointes_articles AS cja ON categories.id = cja.id_categorie
LEFT OUTER JOIN articles ON articles.id = cja.id_article
WHERE  tablePostsInjectionSQL.statut = ? AND categories.nom LIKE ?
GROUP BY categories.id


Bien a toi,

PS: Sauf erreur de ma part. J'ai un doute sur le COUNT(article.id) BY categories. Tu peux nous confirmer que c'est bien le nombre d'article par catégorie qui est retourné.
Modifié par Safina (14 Oct 2015 - 19:09)
Merci, mais quelle est la différence entre mon code est ton code?
La seule que je voit, est que tu a remplacer mon

AND ".$tablePosts.".statut = ?";

par

WHERE  tablePostsInjectionSQL.statut = ?

Si je fait ceci, ça va m'afficher uniquement les catégories qui sont relié à des articles.
Je veut que ça m'affiche toute mes catégorires WHERE LIKE mots clé entrés, y compris les catégorie qui ne sont jointes à aucun articles.

Le COUNT(articles.id) retourne bien le nombre d'articles par cétégories.
a écrit :
Actuellement, mes catégories s'affichent toutes, quelque soit les mots clés entrés...

Safina a écrit :
Ajoute à ta requête une clause WHERE

a écrit :
Merci, mais quelle est la différence entre mon code est ton code?

La clause WHERE...
a écrit :
Si je fait ceci, ça va m'afficher uniquement les catégories qui sont relié à des articles.

D'après mes souvenir, non. As tu essayé ?

Sauf erreur de ma part, il faudra ajouter "articles.status = 1 AND article.status != NULL" pour les catégories qui n'on pas d'article.
Du coup j'ai mis ceci :

$sql = "SELECT categories.id, categories.nom
    , COUNT(articles.id) as nb_articles
    FROM categories
    LEFT OUTER JOIN categories_jointes_articles
        ON categories.id = categories_jointes_articles.id_categorie
 
    LEFT OUTER JOIN articles
        ON articles.id = categories_jointes_articles.id_article
        AND ".$tablePosts.".statut = ?";
 
$sql .= " WHERE categories.nom LIKE ? ";     // fallais que je mette un WHERE et non un AND

sujet résolu. merci