8792 sujets

Développement web côté serveur, CMS

Bonsoir tout le monde.

Voilà, j ai un petit soucis avec un menu déroulant et ma base de donnée

J essaie d afficher comme valeur dans mon select, des catégories, qui sont contenues dans une table (table cat_articles)
J'ai aussi ma tables articles où j ai une liaison avec ma table cat_articles, que je fais avec un left join

Le probleme c'est que avec mon code, cela m'affiche seulement le nom des catégories (select) où il y a au moins un article déjà présent dans ma table articles

Ex.
dans ma table cat_article j ai 4 catégories

ma table ---> id_cat - cat_article - cat_img

- CSS --> ID 1
- Tools --> ID 2
- PHP --> ID 3
- Autre --> etc..

Dans ma table articles, j ai déjà 3-4 article de créé. 1 dans catégorie Tools et 2 dans CSS.
C'est ces 2 catégories que je vois apparaitre dans mon select, alors que j aimerai qu il m affiche toutes les catégories existantes.

Le problème vient de mon LEFT JOIN ... ON articles.categorie = cat_articles.id_cat[/b
Ca j ai compris la logique du pourquoi comment, mais ce que je sais pas faire c mon ON (la jointure)

Ma requete SQL
$sql = "SELECT * FROM articles LEFT JOIN cat_articles ON articles.categorie = cat_articles.id_cat";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());


Mon select
<?
echo "<select  name=\"categorie\">";
        while($val = mysql_fetch_array($req)) {
            echo "<option name=\"categorie\" value=\"\">".$val['cat_article']."</option>";
        }
        echo "</select>";
?>


D'avance merci
Ok merci bien, je vais regarder de ce coté ci Smiley smile

Alors, merci bien, c'était bien ça le problème

A+
Modifié par Skippy1 (13 Dec 2006 - 12:08)
Ah ben j ai crié victoire trop vite Smiley cligne

En fait maintenant mon problème c'est que lorsque j insere un article qui par exemple fait partie de la catégorie tools, l'article est bien inséré correctement dans la table, mais je me retrouve avec deux valeurs tools dans mon select !

Je comprend pas pourquoi, car dans ma table cat_articles, je n'ai pas deux fois la table tools.

c'est toujours le même code qu'en dessus sauf que j ai remplacé LEFT par RIGHT
$sql = "SELECT * FROM articles RIGHT JOIN cat_articles ON 
        articles.categorie = cat_articles.id_cat";

Modifié par Skippy1 (13 Dec 2006 - 12:20)
Cela est tout à fait normal que tu auras une redondance de catégorie.
Puisqu'ici tu appliques une jointure.

Pourquoi n'utilises-tu pas une autre requête "SELECT" pour créer ta liste d'options ?

SELECT nom FROM categorie WHERE exists (
    SELECT nom FROM articles WHERE articles.categorie = cat_articles.id_cat
)

Ici on affichera les categories contenant au moins un article.

Pourrais-tu nous afficher tes deux tables ? Car ta question ne me parait pas tellement claire.
Hello,

Bah je fais une jointure car je venais de lire quelque part, que beaucoup de gens surchargaient les requetes sql en appelant plusieurs fois la DB alors que l'on pourrait faire qu'une seule requete (JOIN), donc je me suis lancé dans les joins Smiley lol

Oui j'ai de la peine a expliquer mon problème en effet

Tu as du mal comprendre, car en fait je veux pas que ca m'affiche les cat. contenant au moins un article. Je voulais juste faire une boucle des catégories existantes de ma table cat_articles.

Bon je vais faire comme tu as dis, 2 requetes.
Alors voici mes deux tables


#
# Structure de la table `articles`
#

CREATE TABLE `articles` (
  `id` int(4) NOT NULL auto_increment,
  `categorie` int(11) NOT NULL default '0',
  `auteur` varchar(15) NOT NULL default '',
  `titre` varchar(50) NOT NULL default '',
  `texte` text NOT NULL,
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  PRIMARY KEY  (`id`)
) TYPE=MyISAM AUTO_INCREMENT=4 ;

#
# Contenu de la table `articles`
#


#
# Structure de la table `cat_articles`
#

CREATE TABLE `cat_articles` (
  `id_cat` int(11) NOT NULL auto_increment,
  `cat_article` varchar(50) NOT NULL default '',
  `cat_img` varchar(250) NOT NULL default '',
  PRIMARY KEY  (`id_cat`)
) TYPE=MyISAM AUTO_INCREMENT=5 ;

#
# Contenu de la table `cat_articles`
#


Une autre question : Est-ce judicieux de stocker le nom d'image+ext (cat_img) dans la DB. De plus si oui, ne serait-ce pas mieux de créer une table img au lieu d'insérer un champ dans ma table cat_articles ?

Merci bien et A+
Je ne crois pas que cela soit possible.
C'est sur, le nombre de requêtes peut être un problème.
Mais ici tu n'as que quelques catégories.
Si tu avais eu des milliers de résultats, il y aurait eu certainement de fameux ralentissements.
Tu peux toujours utiliser les vues qui permettent d'économiser les ressources. Implémentées depuis la version 5.0.1 de MySQL.

Pour ce qui est du champ image cela me paraît une bonne solution puisque cela fait bien partie du domaine d'un article.
Elaborer une table en plus te demandera encore d'effectuer une relation. D'où encore des ressources (peut être minimes) en plus.
Si tu veux conserver l'unique requête avec jointure, il suffit de lui ajouter une clause group-by.
Ok !

z'etes bien sympa Smiley smile


je vais voir en détail tout ce que vous m'avez expliqué

par contre je n ai jamais entendu parler de vue. kesako ?

Merci bien et a+ !