Comment ne pas afficher une categories qui n'a pas de produits

Eléphant du PHP | 331 Messages

24 janv. 2008, 16:49

Bonjour,

J'ai une table categorie et une table contenue.

Je veux afficher sur une même page toutes les categories et les produits qui y sont relié.

Cependant, si une categorie n'a pas de produit je ne veux pas que la categorie s'affiche.

Pouvez-vous m'indiquer comment faire svp?

Voici mon code:

J'utilise MYSQL 5.0
echo "<table width=\"80%\" colspan=\"2\" rowspan=\"2\"><tr><td><b>Section publique</b></td><td><p align=\"center\"><a href=\"intranet/prive.php\">Cliquez ici pour votre section priv&eacute;e</a></p></td></tr></table><br><br>\n";

echo "<table class=\"border\" align=\"center\" width=\"600\">\n";

echo "<tr>\n";

echo "<td colspan=\"2\">\n";

$sql_cat="select * from categories order by nom ASC, ord_affiche desc";

$query_cat=mysql_query($sql_cat);

while ($cat=mysql_fetch_array($query_cat)){

echo "<b>".$cat["nom"]."</b><br>\n";



$sql="select * from contenue where user_id='0' and categorie_id=".$cat["categorie_id"]." order by date_post DESC, ord_affiche DESC";

$result=mysql_query($sql);



while($row2=mysql_fetch_array($result))

{

echo "<tr>\n";

echo "<td bgcolor=\"#ffcd48\"><b>".stripslashes($row2["nom"])."</b></td><td bgcolor=\"#ffcd48\" align=\"right\"><b>".$row2["date_post"]."</b></td>\n";

echo "</tr>\n";

echo "<tr>\n";

echo "<td colspan=\"2\">".stripslashes($row2["description"])."</td>\n";

echo "</tr>\n";

echo "<tr>\n";

echo "<td colspan=\"2\"><a href=\"intranet/downloads/".$row2["file"]."\">".$row2["file"]."</a></td>\n";

echo "</tr>\n";

}



echo "</td>\n";

echo "</tr>\n";

}

echo "</table>\n";

Code : Tout sélectionner

CREATE TABLE `categories` ( `categorie_id` int(255) NOT NULL auto_increment, `nom` varchar(255) NOT NULL, `ord_affiche` int(255) NOT NULL, PRIMARY KEY (`categorie_id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; CREATE TABLE `contenue` ( `id` int(255) NOT NULL auto_increment, `nom` varchar(255) character set utf8 NOT NULL, `description` mediumtext character set ucs2 NOT NULL, `user_id` int(255) NOT NULL default '0', `file` varchar(255) character set utf8 NOT NULL, `ord_affiche` int(255) NOT NULL default '0', `date_post` date NOT NULL, `categorie_id` int(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=23 ;
Merci!

d0m
Mammouth du PHP | 1141 Messages

24 janv. 2008, 17:01

Un bon moyen est de stocker les produits dans un tableau à 2 dimensions après les requêtes.

Code : Tout sélectionner

array('catégorie1' => array('id1' = > produit1, 'id2' => produit2, ...), 'catégorie2' => array('id3' = > produit3, 'id4' => produit4, ...) )
Du coup après tu n'as plus qu'à parcourir le tableau suivant les catégories et si la catégorie ne contient aucun produit, ne pas l'afficher :
foreach($tablea as $categorie => produits_de_la_categorie){
  //il y a des produits pour cette catégorie
  if(!empty(produits_de_la_categorie)){
    //on affiche la catégorie et les produits
    echo $categorie;
    foreach(produits_de_la_categorie as $produit){
      ....
    }
  }
}

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 janv. 2008, 18:06

Tu pourrais également faire une jointure entre tes tables.

Cette solution aurait deux avantages :
1/ Ne pas remonter les catégories sans produits
2/ Remonter toutes les données en 1 seule requête
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 331 Messages

24 janv. 2008, 18:34

J'arrive pas a faire la jointure correctement.

Code : Tout sélectionner

$sql_cat="SELECT categorie_id, nom FROM categories INNER JOIN contenue ON categories.categorie_id=contenue.categorie_id";

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 janv. 2008, 18:38

Est-ce que tu as un message d'erreur ?
Si non, qu'est-ce qui te fait dire que la jointure n'est pas correcte ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 331 Messages

24 janv. 2008, 18:44

Dans ma page php sa donne:

Code : Tout sélectionner

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /var/www/html/autobusneron/web/intranet/publique.php on line 29
Si je colle la requete dans mysql sa donne:

Code : Tout sélectionner

Erreur requête SQL: Documentation $sql_cat = "SELECT categorie_id, nom FROM categories INNER JOIN contenue ON categories.categorie_id=contenue.categorie_id" MySQL a répondu:Documentation #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '$sql_cat="SELECT categorie_id, nom FROM categories INNER JOIN contenue ON catego' at line 1
[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 janv. 2008, 18:50

1/ Quand tu exécutes une requête directement dans PhpMyAdmin, il ne faut que la reqête SQL, pas le code PHP qui va autour

2/ Contrôle l'exécution de la requête dans ton PHP et fait afficher les messages d'erreur
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 331 Messages

24 janv. 2008, 18:53

Je ne suis pas certains d'avoir tout compris se que tu dis.

Voila le resultat de la requete seul dans phpmyadmin:

Code : Tout sélectionner

Erreur requête SQL: Documentation SELECT categorie_id, nom FROM categories INNER JOIN contenue ON categories.categorie_id = contenue.categorie_id LIMIT 0 , 30 MySQL a répondu:Documentation #1052 - Column 'categorie_id' in field list is ambiguous

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 janv. 2008, 18:57

Qu'est-ce que tu n'a pas compris :?:
Si ça t'intéresse, je me ferais un plaisir de te détailler mes explications ;)

En attendant, l'erreur dans ta requête viens du fait que MySQL ne sait pas dans quelle table il doit chercher le champ "categorie_id" vu qu'il est disponible dans 2 tables.
Pour corriger ce problème, il faut que tu spécifie explicitement quelle table est concernée, comme tu l'as fait dans le JOIN
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphant du PHP | 331 Messages

24 janv. 2008, 19:06

Se que je n'ai pas compris c'est:
Contrôle l'exécution de la requête dans ton PHP

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

24 janv. 2008, 20:43

Quand tu exécutes une requete SQL, il est possible que cette exécution échoue.
Dans ce cas, la fonction mysql_query() retourne FALSE.

Si tu ne contrôles pas que la requête se soit correctement exécuter, le code va continuer à s'exécuter jusqu'au mysql_fetch_array(). La variable que tu passes en paramètres à cette fonction contenant FALSE, tu vas avoir une grosse erreur PHP.

Sachant que le but de tout programme est avant tous de ne jamais planter, il faut que tu contrôle le retour de l'exécution de ta requête.
La manière la plus simple de la contrôler est de mettre un "or die(mysql_error())" après le mysql_query(), ce qui aura pour effet d'arrêter l'exécution de ton code (travail du die()) en affichant le message d'erreur retourné par l'exécution de la requête (travail du mysql_error())
Exemple :
$str_requete = "SELECT champ1, champ2 FROM maTable";
$result = mysql_query($str_requete) or die( mysql_error() );
Cette solution est la plus simple, mais la moins conseillée car elle arrête l'exécution du script et affiche le message d'erreur.

Je te conseillerais donc une autre solution : contrôler que le retour de l'exécution n'est pas FALSE ou afficher un message d'excuse.
Exemple :
$str_requete = "SELECT champ1, champ2 FROM maTable";
$result = mysql_query($str_requete);

// NOTE : !== contrôle l'égalité et le type
if( $result !== false ) 
{
  // Traitement normal
}
else
{
  echo "Une erreur est survenue. Veuillez réessayer dans quelques instants ou contacter un administrateur du site";
}

J'espère que j'ai été assez clair dans mes explications. En cas de doute, n'hésites pas à reposer des question, nous nous ferons un plaisir de t'aider à comprendre.
En tout cas, sache que si tu veux apprendre à développer des application web propres, il y a beaucoup à approfondir dans ce domaine et ce que je viens de t'expliquer ne représente que les 2 premières marches ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer