Bonjour,
J'ai un problème dans le résultat lors de l'exécution de ma requête SQL.

Mes tables

Mon code

<?php
$selectArticle = $db->prepare('SELECT articles.titre_article AS titre, categories.nom_categorie AS categorie
FROM articles
INNER JOIN jonction
ON articles.id_article = jonction.id_article
INNER JOIN categories
ON categories.id_categorie = jonction.id_categorie');
$selectArticle->execute() or die(print_r($selectArticle->errorInfo()));
$articles = $selectArticle->fetchAll(PDO::FETCH_OBJ);
?>
<?php foreach ($articles as $article): ?>
  <h3>
    <a href="#"><?php echo $article->titre; ?>
      <span class="badge"><?php echo $article->categorie; ?></span>
    </a>
  </h3>
  <hr>
<?php endforeach ?>

Résultat que j'obtiens

Résultat que je veux

et merci d'avance

4 réponses


Huggy
Réponse acceptée

Bonsoir TheMancunien,

Tu as plusieurs solutions : la première c'est de garder ta requête telle-quelle mais de gérer les ruptures de catégories dans la boucle foreach.
Il y a eu un fil, il y a quelques jours qui utilisait cette technique.

l'autre solution c'est d'utiliser l'instruction GROUP_CONCAT() dans ta requête, de façon à concaténer toutes les catégories d'un article dans une chaine.
dans ce cas tu devras explode ta chaine pour en sortir un tableau de catégories , puis un foreach pour générer les badges.

Huggy
Réponse acceptée

Oui, mais mon idée c'était de n'avoir qu'une seule requête
comme ceci

<?php
  $selectArticle = $db->prepare('SELECT A.id_article AS id, A.titre_article AS titre, GROUP_CONCAT(C.nom_categorie SEPARATOR ";") AS categs
    FROM articles A
    INNER JOIN jonction J ON A.id_article = J.id_article
    INNER JOIN categories C ON J.id_article = C.id_categorie
    GROUP BY id, titre');
  $selectArticle->execute() or die(print_r($selectArticle->errorInfo()));
  $articles = $selectArticle->fetchAll(PDO::FETCH_OBJ);
  $articleExistant = "";
?>
<?php foreach ($articles as $article): ?>
  <?php if ($articleExistant != $article): ?> 
  <h3>
    <a href="#"><?php echo $article->titre; ?>
        <?php $tab_categ = explode(';', $article.categs);
            foreach($tab_categ as $categ) : ?>
              <span class="badge">
                  <?php echo $categ; ?>
                         </span>
            <?php endforeach; ?>
    </a>
  </h3>
  <hr>
  <?php $articleExistant = $article; ?>
  <?php endif ?>
<?php endforeach; ?>

Merci pour ta réponse Huggy
j'ai utilisé le GROUP_CONCAT()

<?php
  $selectArticle = $db->prepare('SELECT articles.id_article AS id, articles.titre_article AS titre
    FROM articles
    INNER JOIN jonction
    ON articles.id_article = jonction.id_article');
  $selectArticle->execute() or die(print_r($selectArticle->errorInfo()));
  $articles = $selectArticle->fetchAll(PDO::FETCH_OBJ);
  $articleExistant = "";
?>
<?php foreach ($articles as $article): ?>
  <?php if ($articleExistant != $article): ?> 
  <h3>
    <a href="#"><?php echo $article->titre; ?>
      <span class="badge">
        <?php
          $selectCategories = $db->prepare('SELECT GROUP_CONCAT(categories.nom_categorie) AS concat_categories
            FROM categories
            INNER JOIN jonction
            ON categories.id_categorie = jonction.id_categorie
            WHERE jonction.id_article = :id_article');
          $selectCategories->bindValue(':id_article', $article->id);
          $selectCategories->execute() or die(print_r($selectCategories->errorInfo()));
          $categories = $selectCategories->fetchAll(PDO::FETCH_OBJ);
        ?>
        <?php foreach ($categories as $categorie): ?>
          <?php echo $categorie->concat_categories; ?>
        <?php endforeach; ?>
      </span>
    </a>
  </h3>
  <hr>
  <?php $articleExistant = $article; ?>
  <?php endif ?>
<?php endforeach; ?>

oui, c'est beaucoup mieux comme ça ^^ .. Merci encore une fois