Comment afficher par catégorie?

amadousoind
Invité n'ayant pas de compte PHPfrance

12 janv. 2007, 19:37

Je suis un débutant et je voudrais qu'on m'aide à afficher le résultat de ma requête.

J'ai deux tables categorie( id, nomcategorie) et
produits(num, idcategorie, nomproduit)

Ma requette est : SELECT * from categorie,produits where categorie.id = produits.idcategorie

Pour afficher je fais
//j'affiche les catégories par ligne
<?  $sqlfr2 = mysql_query("SELECT * FROM categorie ");
while($result=mysql_fetch_array ($sqlfr2)) {
$nomcategorie=$result['nomcategorie'];
 ?> <tr> <td>  <? echo "$nomcategorie";?></td></tr>

//j'affiche les produits par catégorie
$sqlprod = mysql_query("SELECT * FROM categorie,produits  where categorie.id = produits.idcategorie");
while($resulprod=mysql_fetch_array ($sqlprod)) {
$nomproduit=$resulprod['nomproduit'];  ?> 
<tr> <td>  <? echo "$nomproduit";?></td></tr> 
//je ferme la boucle des produits
<? }?>

//je ferme la boucle des catégories
<? }?>
Pourtant lorsque ça affiche je vois tous les produits sous chaque catégorie. erci de m'aider à créer la variable temporaire qui va vérifier si le produit correspond à la catégorie.

Eléphant du PHP | 445 Messages

12 janv. 2007, 19:41

Bonjour,

Utilises les balises PHP pour que ton code soit coloré et indenté, car là c'est difficilement lisible...

Par contre, évite le joker * en SQL, et écrit directement les noms des champs que tu veux sélectionner.
LLDC
Ulti

ViPHP
ViPHP | 1961 Messages

12 janv. 2007, 19:46

Bonjour,

Tu devrais mettre ton code entre les balises [ php] et [/php]

Ensuite, dans un premier temps, tu devras grouper tes produits par catégorie avec la clause GROUP BY.

Après avec PHP tu devras boucler sur les résultats en conservant la dernière valeur de la catégorie.

À la lecture de chaque ligne tu regardes si la catégorie est la même.
si c'est le cas, tu n'affiches que le produit, sinon tu affiches la nouvelle catégorie et le produit sans oublier d'écraser la valeur de la catégorie par la nouvelle.
Deux choses sont infinies, l'Univers et la sottise humaine!!
Mais je ne suis pas sur de ce que j'affirme au sujet de l'Univers.

A. Einstein

Mammouth du PHP | 19653 Messages

12 janv. 2007, 23:30

Comme invité, tu ne peux pas éditer ton message, je l'ai donc fait pour toi, penses-y la prochaine fois.

Ton problème maintenant :
-1- Ton code est un peu fouillis et illisible, essaye de faire ça proprement, tu auras ultérieurement beaucoup moins de problèmes pour relire et trouver un bug éventuel;

-2- Tu fais une requête puis une seconde que tu exécute en boucle : et comme dans la seconde boucle tu n'as pas de clause de tri sur la catégorie, tu obtiens tous les produits même si ils ne correspondent pas à la catégorie définie dans la première boucle.

On va simplifier : une seule requête et une seule boucle. Exemple, suis les commentaires, tu devrais t'y retrouver :
<?php
/* -1- : on crée la requête SQL */
$sql = "SELECT c.nom_categorie, p.nom_produit ".
       "FROM categorie AS c, produits AS p ".
       "WHERE c.id = p.idcategorie ".
       "ORDER BY p.idcategorie;";
/* -2- : on exécute la requête */
$sqlprod = mysql_query($sql);
/* On établit un point de repère pour déterminer les changements de catégories */
$cat = "";
while(false != ($result = mysql_fetch_array ($sqlprod)))
{
    /**
     * Si ma variable repère $cat n'a pas la même valeur que la 
     * catégorie retournée, alors c'est qu'on aborde une nouvelle 
     * catégorie : on ajoute la ligne pour la catégorie.
     */
    if($result['nomcategorie'] != $cat)
    {
        /**
         * On met à jour la variable $cat : de cette manière, au
         * prochain tour, si on est toujours dans la même catégorie, on
         * affichera pas cette ligne
         */
        $cat = $result['nomcategorie'];
?>
  <tr>
    <th><?php echo $result['nom_categorie']; ?></th>
  </tr>
<?php
    }// Fin du test sur la catégorie
    /* On affiche le produit */
?> 
  <tr>
    <td><?php echo $result['nom_produit'] ?></td>
  </tr>
<?php
} /* Fin de la boucle */
?> 
Regarde bien la requête modifiée : j'ai ajouté une clause ORDER BY de façon à trier tous les produits par catégorie : c'est important pour le fonctionnement de ce code.

Teste ça et reviens avec le résultat.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ert
Invité n'ayant pas de compte PHPfrance

29 sept. 2015, 16:41

pk ta photo c un mamout

Mammouth du PHP | 19653 Messages

29 sept. 2015, 16:45

pk ta photo c un mamout
Pour faire parler ceux qui n'ont rien d'autre à dire :mrgreen:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: