je vous ai posé une question
Je développe un web site news et j'ai créé un tableau des catégories et un autre tableau des articles. et les deux tables sont liées avec le id des catégories. Je souhaite afficher chaque catégorie avec les posts dans la page index et dans chaque catégorie afficher le dernier article de cette catégorie avec aun image et en dessous afficher une liste de 2 articles de la même catégorie. Comment je faire? il existe la fonction query_post dans wordpress mais je ne sais pas comment je applique par php et sql. un exemple dans la photos.

6 réponses


tleb
Réponse acceptée
SELECT a.id, a.title, a.creation_date, c.name
FROM articles a
INNER JOIN categories c
ON a.category_id = c.id
WHERE a.category_id = :category_id
ORDER BY a.creation_date DESC
LIMIT 1
  • On veut l'id de l'article, son titre, sa date de création et le nom de la catégorie;
  • de la table articles, que l'on va nommer a;
  • que l'on va joindre à la table categories, que l'on appelle c;
  • le lien entre les deux bases est l'id de la catégorie;
  • on veut juste les lignes appartenant à notre catégorie;
  • on commence par le plus récent des articles;
  • on ne veut qu'un article.

(Il y a une faute à Technology :))

Je confirme que la requête de @FOREVER est bonne et ton code @MED_AMINE, utilise l'objet PDO pour tes requêtes c'est plus simple (enfin je trouve) et en plus cet objet s'adapte à n'importe quels serveurs SQL (mysql, postgre_sql, etc ..).

Je suis désolé, mais je suis encore débutant =)

J'ai terminé les leçons "Créer un portfolio de A à Z "
j'ai créé un tableau des catégories

et un autre tableau des works

et un autre tableau des images

comment afficher chaque catégorie comme ça?

code de la page index

<?php
$auth = 0;
include 'lib/include.php';
include 'lib/image.php';
include 'partials/header.php';

$condition = ''; 
$category = false;
if(isset($_GET['category'])){
        $slug = $db->quote($_GET['category']);
        $select = $db->query("SELECT * FROM categories WHERE slug=$slug");  
            if(!isset($_GET['category'])){
            header("HTTP/1.1 301 moved Permanently");
            Header('Location:' . WEBROOT);
            die();
            }
        $category = $select->fetch();
        $condition = "WHERE works.category_id={$category['id']}";

    }

$works = $db->query("
    SELECT works.name, works.id, works.slug, images.name as image_name
    FROM works
    LEFT JOIN images ON images.id = works.image_id
    $condition
    ")->fetchAll();

$categories = $db->query('SELECT  slug, name FROM categories')->fetchAll();

if($category){
       $title = "{$category['name']}";
}else{
       $title = "Bienvenue sur mon portfolio";
}

include 'partials/header.php';
?>
<h1><?= $title; ?></h1>

<div class="row"> 
    <div class="col-sm-8">

        <div class="row">
           <?php foreach ($works as $k => $work): ?>
              <div class="col-sm-3">
                <a href="<?= WEBROOT; ?>realisation/<?= $work['slug']; ?>">
                    <img src="<?= WEBROOT; ?>img/works/<?= resizedName($work['image_name'], 150, 150); ?>" alt="">
                     <h4><?= $work['name']; ?></h4>
                </a>
        </div>
        <?php endforeach ?>
    </div>
</div>

    <div class="col-sm-4">
            <ul>
                <?php foreach ($categories as $category): ?>
                    <li>
                        <a href="<?= WEBROOT; ?>categorie/<?=  $category['slug']; ?>"><?=  $category['name']; ?>
                        </a>
                    </li>
                <?php endforeach ?>    
            </ul> 
    </div>    
</div>

<?php include 'partials/footer.php'; ?>

Pour ma part, je pense que la requete qui a été donné est bonne.

Du coup, tu as juste une gestion d'affichage a faire. Avec un twitter bootstrap, tu geres 12 colonnes donc tu recuperes le nombre de catégories ($nb) et tu vas obtenir 12 / $nb en fonction du nombre max de catégories et de ton design.

$homeblocks = $pre->fetchAll(PDO::FETCH_OBJ);
 switch(count($homeblocks)){
    case 1:
    $hb_col = 12;
    break;

    case 2:
    $hb_col = 6;
    break;

    case 3: case 5: case 6:
    $hb_col = 4;
    break;

    case 4: case 7: case 8:
    $hb_col = 3;
    break;
 }

Il y a peut etre un moyen d'automatisés mais pour moi c'était fonctionnelle comme ça

Tu dois tester avec un article par rapport à ton code PHP, si celui-ci s'affiche bien, teste avec deux ou plusieurs, si cela s'affiche avec les articles principaux et les articles secondaires en-dessous c'est que cela est bon et donc que ce n'est seulement un problème lié à l'affichage donc c'est dans ton css et html que cela se passe!!

pour afficher les catégories dans un page j'ai utilisé se code
catégorie id=1

SELECT works.name, works.id, works.slug, images.name as image_name FROM works LEFT JOIN images ON images.id = works.image_id WHERE category_id = '1'

et pour créé une page pour une catégorie d’articles en entête vous voulez affichez le dernier article de cette catégorie et en dessous vous voulez affichez une liste de dix articles de la même catégorie :

pour afficher le dernier article de la catégorie en entête utiliser order by et LIMIT

SELECT works.name, works.id, works.slug, images.name as image_name FROM works LEFT JOIN images ON images.id = works.image_id WHERE category_id = '1' ORDER BY works.id DESC LIMIT 1

pour afficher les dix autres articles de la même catégorie utiliser OFFSET

 SELECT works.name, works.id, works.slug, images.name as image_name FROM works LEFT JOIN images ON images.id = works.image_id WHERE category_id = '1' ORDER BY works.id DESC LIMIT 10 OFFSET 1

Merci @FOREVER @Mistah_Be @François Cammas =)