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
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.
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; ?>