Bonjour ,
Je suis confronté a un petit pb voilà ma situation :

J'ai un blog avec des catégories et des sous catégories .
Je cherche à afficher les news des sous catégorie a partir de la catégorie principale.
Avec mes news de test , je veut afficher les news de développement en cliquant sur tutoriels ..
Ma table categories :

Ma table news :

Mon code pour afficher les catégories :

public function get_all_category(){
        $sql = "SELECT * FROM categorie ORDER by ID ASC";
        $req = mysql_query($sql) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
        while ($data = mysql_fetch_array($req)){
            if($data'parent_id']==0){
                echo'<li><a href="index.php?page=blog&&cat='.$data'id'].'">'.$data'titre'].'</a></li>';
                $sql2 = "SELECT * FROM `categorie` WHERE parent_id={$data'id']} ORDER by `position` ASC";
                $req2 = mysql_query($sql2) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
                $nb_sous_cat = mysql_numrows($req2);
                if($nb_sous_cat!=0){
                    echo'<ul>';
                    while ($data2 = mysql_fetch_array($req2)){
                        echo'<li><a href="index.php?page=blog&&cat='.$data2'id'].'">'.$data2'titre'].'</a></li>';
                    }

                   echo'</ul>';
                 }
            }
        }
        echo'<li><a href="index.php?page=blog">Tout afficher</a></li>';
    }

Pour afficher les news :

public function get_last_blog_news($cat=null){
        $cond='';
        if($cat!=''){
            $cond = ' WHERE categorie='.$cat;
        }
        $sql = "SELECT * FROM news $cond ORDER by ID ASC";
        $req = mysql_query($sql) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
        while ($data = mysql_fetch_array($req)){
            echo'
                    <div class="dmenu">
            <div class="dtop">'.$data'titre'].'</div>
            <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data'auteur']).'</a>, <i>le '.$this->convert_date($data'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data'categorie']).'</div></div>
            '.$data'contenu'].'
            <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>
            <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>
                        </div>
            ';
        }
    }

merci de l'aide !
:)

25 réponses


shuxx
Auteur
Réponse acceptée

Voila j'ai un peut (boucoup) modifié le code qui est un peut plus simple :

public function get_last_blog_news($cat=null){
        $fini = 0;
        $sql='';
        if($cat==''){
            $sql = "SELECT * FROM news ORDER by ID ASC";
        }
        else{
            $sql = "SELECT * FROM categorie WHERE parent_id=$cat ORDER by ID ASC";
            $req = mysql_query($sql) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
            if(mysql_num_rows($req)!=0){
                while ($data = mysql_fetch_array($req)){
                $sql2 = "SELECT * FROM news WHERE categorie = {$data'id']} ORDER by ID ASC";
                $req2 = mysql_query($sql2) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
                    while ($data2 = mysql_fetch_array($req2)){
                        echo'
                            <div class="dmenu">
                            <div class="dtop">'.$data2'titre'].'</div>
                            <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data2'auteur']).'</a>, <i>le '.$this->convert_date($data2'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data2'categorie']).'</div></div>
                            '.$data2'contenu'].'
                            <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>
                            <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>
                            </div>
                        ';
                    }
                }
               $fini = 1;
            }
           else{
            $sql = "SELECT * FROM news WHERE categorie=$cat ORDER by ID ASC";
           }
        }
        if($fini == 0){
            $req = mysql_query($sql) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');
            while ($data = mysql_fetch_array($req)){
                        echo'
                            <div class="dmenu">
                            <div class="dtop">'.$data'titre'].'</div>
                            <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data'auteur']).'</a>, <i>le '.$this->convert_date($data'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data'categorie']).'</div></div>
                            '.$data'contenu'].'
                            <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>
                            <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>
                            </div>
                        ';
                    }
        }

    }

Et c'est quoi le problème ?

shuxx
Auteur

J'ai un blog avec des catégories et des sous catégories .
Je cherche à afficher les news des sous catégorie a partir de la catégorie principale.
Par ex avec mes news de test , je veut afficher les news de développement en cliquant sur tutoriels ..

Tu fais en 2 temps, d'abord tu récup la liste des sous catégorie et tu sauvegarde les IDs et ensuite tu fais un SELECT sur ta table de news avec un WHERE categorie IN (1,3,4,5,6...)
Les chiffres représentant la liste des catégories :)

shuxx
Auteur

Et dans le in je met quoi ? les ids des sous catégories ?

shuxx
Auteur

J'ai pas trop bien comprit ...

On peut faire ça avec une sous-requête sinon (du moment qu'il n'y en a qu'une, ça reste lisible):

SELECT * FROM categorie WHERE parent_id = (SELECT id FROM categorie WHERE titre=:titre)

Ps: on a oublié les cours de SRC graph? :P

shuxx
Auteur

Tiorte = 'Ps: on a oublié les cours de SRC graph? :P' ???

shuxx
Auteur

euh , je panse pas que la requète est bonne , faut trouvé les articles (news) qui sont en sous cétégorie dans une autre catégorie .

Mmmmh, cette requête ne prend que les catégories, c'est vrai.
Tu peux faire:

SELECT * FROM news WHERE categorie = (SELECT * FROM categorie WHERE parent_id = (SELECT id FROM categorie WHERE titre=:titre))

Mais du coup il vaudrait peut-être mieux faire 2 requêtes ...

shuxx
Auteur

ah le con j'ai pas bien vu comment faire -_-" désolé

shuxx
Auteur

Personne peut me faire le boulot sa commence a ma saouler ? :° ...

Les sous requêtes ça fait exploser mySQL XD

shuxx
Auteur

Graf' tu peut me le faire pleasssseee je me met vip a chaque fois :^$

J'ai aps trop compris le problème, mais j'pense que tu veux faire ceci :

$sql = mysql_query('SELECT * FROM categories ORDER BY id ASC');
while($result = mysql_fetch_assoc($sql)){
    $sql = mysql_query('SELECT * FROM news WHERE categorie = '.$result'id'];
    while($data = mysql_fetch_assoc($sql)){
        echo ' 
              <div class="dmenu">  
        <div class="dtop">'.$data'titre'].'</div>  
        <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data'auteur']).'</a>, <i>le '.$this->convert_date($data'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data'categorie']).'</div></div>  
        '.$data'contenu'].'  
        <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>  
        <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>  
                       </div>  
           '; 
    }
}

Non ? J'ai fait en abrégé, mais les requêtes et la boucle sont là.

shuxx
Auteur

Je met mon site en ligne sa sera plus simple a comprendre

Ah bah on fait bien de l'apprendre! x)

shuxx
Auteur

mon compte d'hébergement n'est pas encore actif -_-"

Malgré la retenu de mamie Graph sur les sous-requêtes, essai ça pour voir:

public function get_last_blog_news($cat=null){  
       $cond='';  
       if($cat!=''){  
           $cond = ' WHERE categorie=(SELECT * FROM categorie WHERE parent_id = (SELECT id FROM categorie WHERE titre='.$cat.')';  
       }  
       $sql = "SELECT * FROM news $cond ORDER by ID ASC";  
       $req = mysql_query($sql) or die('Erreur SQL !<br/>'.mysql_error().'<br/>');  
       while ($data = mysql_fetch_array($req)){ 
        ...
       }  
   }
shuxx
Auteur

Voila :
http://djshuxx.olympe-network.com/index.php?page=blog
cliquer sur Développement ensuite sur Tutoriels ...

shuxx
Auteur

Tiortre sa marche pas ton truc

Si ton but est d'afficher les catégories, et leur dernière news par catégories, alors mon code est bon. Si c'est pas le cas, faudra m'expliquer ou est le problème.

shuxx
Auteur

Non , faut afficher tout les news des sous categorie dans la catégorie principale ; afficher par exemple toute les news de dev' de grph et autres dans la rubrique tutoriel

Ah d'accord. Ca change tout ^^

On peut faire ceci, mais ca fait beaucoup de requête

$sql = mysql_query('SELECT * FROM categories WHERE parent_id=0');
    while($res = mysql_fetch_assoc($sql)){        
         $sql = mysql_query('SELECT * FROM categories WHERE parent_id = '.$res'id']);
            if(mysql_num_rows == 0){
                $sql = mysql_query('SELECT * FROM news WHERE categories = '.$res'id']);
                $data = mysql_fetch_assoc($sql);
            echo'
                    <div class="dmenu">
            <div class="dtop">'.$data'titre'].'</div>
            <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data'auteur']).'</a>, <i>le '.$this->convert_date($data'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data'categorie']).'</div></div>
            '.$data'contenu'].'
            <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>
            <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>
                        </div>
            ';

            }else{
                 while($result = mysql_fetch_assoc($sql)){
                    $sql = mysql_query('SELECT * FROM news WHERE categories = '.$res'id']);
                    $data = mysql_fetch_assoc($sql);
                                   echo'
                    <div class="dmenu">
            <div class="dtop">'.$data'titre'].'</div>
            <div class="informations"><div class="qui"><img alt="*" class="iconessujets" src="images/icones/user.png"/>Posté par <a href="#">'.$this->get_blog_author($data'auteur']).'</a>, <i>le '.$this->convert_date($data'date']).'</i></div><div class="sujets"><img alt="*" class="iconessujets" src="images/icones/dossier.png"/>Dans '.$this->get_this_category($data'categorie']).'</div></div>
            '.$data'contenu'].'
            <div id="commentaires">[12]<img alt="*" class="iconessujets" src="images/icones/commentaires.png"/></div>
            <div class="lirelasuite"><img alt="*" class="iconessujets" src="images/icones/cursor.png"/><a href="#">Lire la suite...</a></div>
                        </div>
            '; 

                }   
            }    
    }

Ca fait pas mal de requête et pas mal de boucle, mais ca résoudra ton problème provisoirement ^^

shuxx
Auteur

merci :)
je teste sa dans la journée . je te remercie.