Comment faire pour ...

Par shuxx, il y a 14 ans


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

Grafikart, il y a 14 ans

Et c'est quoi le problème ?

shuxx, il y a 14 ans

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

Grafikart, il y a 14 ans

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, il y a 14 ans

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

shuxx, il y a 14 ans

J'ai pas trop bien comprit ...

Tiorte, il y a 14 ans

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, il y a 14 ans

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

shuxx, il y a 14 ans

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 .

Tiorte, il y a 14 ans

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, il y a 14 ans

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

shuxx, il y a 14 ans

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

Grafikart, il y a 14 ans

Les sous requêtes ça fait exploser mySQL XD

shuxx, il y a 14 ans

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

WinuX, il y a 14 ans

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, il y a 14 ans

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

Tiorte, il y a 14 ans

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

shuxx, il y a 14 ans

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

Tiorte, il y a 14 ans

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, il y a 14 ans

Tiortre sa marche pas ton truc

WinuX, il y a 14 ans

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, il y a 14 ans

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

WinuX, il y a 14 ans

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, il y a 14 ans

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

shuxx, il y a 14 ans

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>
                        ';
                    }
        }

    }