8791 sujets

Développement web côté serveur, CMS

Bonjour,

J'aurais besoin d'un peu d'aide sur la manière dont je peux obtenir les infos adéquates à partir de 2 tables :

La 1ère table "catégories" contient le nom de la catégorie et l'Id correspondant.
La 2nde table "articles" contient un champs categ qui contient plusieurs id correspondant aux id de la table categories, sous cette forme par exemple (,12,3,5,4,).


Le but est donc d'afficher pour chaque articles, le nom de toutes les catégories auquel il appartient.
J'essaye de faire 2 boucles imbriquées mais ça ne fonctionne pas.

Comment réaliser ça ?
Quelqu'un aurait une idée ?

Merci de votre aide Smiley cligne
Modifié par webcrea (08 Sep 2007 - 00:35)
bonjour,

Si tu as enregistré dans ta base mysql, les id sous la forme 1,5,6,8 dans une seul champs cela sera un peu compliquer ( et cela n'est pas conforme avec une bonne utilisation de ta table) Tu aurais du crée une 3 eme table avec deux champs un idarticle et un idcategorie, et comme cela tu n'aurais meme pas eu besoin de requete imbriquer mais seulement de lien entre celle ci.
Oui c'est vrai que ce n'est pas conforme et pas très propre mais il m'est difficile (voir impossible) de revenir en arrière.
Y a sûrement un moyen non ?
Etant pas un pro des requetes imbriquer je dirai je sais pas Smiley lol

Sinon en php facilement, tu fait des requetes separé, et tu remplis des tableaux pour les utiliser autant que tu le veux.

Ensuite tu fais un explode sur ton champs categ et tu affiches.

exemple factise car je suis pas sur Smiley langue


<?php
$sql="select * from categorie"
mysql=query...

while($bouh=...){
$tabcat[$bouh['idcategorie']]=$bouh['nomcategorie'];
}

Dans ce style ensuite tu as ton autre requete avec ta boucle et lors de l'affiche quand tu as besoin de nom et en ayant recupere tout les infos de tes articles tu as juste a faire.


$articlecat=explode(',',$article['categ']);
$i=0;
while($i<count($articlecat)){
echo $tabcat[$articlecat];
$i++;
}


Si je me suis pas tomper sa marche si besoin de faire plus detailler dit le moi j'editerai car j'etait un peu presser Smiley lol
Merci Halindel

J'ai suivi ton code précisemment mais j'obtiens une erreur :
Warning: Illegal offset type in ...
La ligne concernée est

echo $tabcat[$ArticleCat];



Voici le code complet :

//REQUETES CATEGORIES
$sql = "SELECT * FROM categ";
$req = mysql_query($sql);

while($NomCateg = mysql_fetch_assoc($req)) 
{
$tabcat[$NomCateg['id']]=$NomCateg['nom'];
}

//REQUETES ARTICLES
$sql1 = "SELECT * FROM articles";
$req1 = mysql_query($sql1);
while($data = mysql_fetch_assoc($req1)) 
    {  
$ArticleCat = explode(',',$data[categories]);
$i=0;
while($i<count($ArticleCat)){
echo $tabcat[$ArticleCat];
$i++;
}    
    }
autant pour moi j'avais oublier un $i Smiley lol

change la ligne d'erreur par celle la :


echo $tabcat[$ArticleCat[$i]];


Car $ArticleCat est un tableau si on oublie de lui dire quelque item faut prendre Smiley lol
Salut
Pour le fun, on peut faire ça en une requête, et récupérer le nom des catégories dans un seul champ, séparés par un caractère user-defined :

SELECT
    alsa_articles.nom,
    alsa_articles.categories,
    GROUP_CONCAT(
        IF (FIND_IN_SET(alsa_categories.id,alsa_articles.categories), alsa_categories.nom, NULL)
        ORDER BY alsa_categories.nom
        SEPARATOR ","
    ) AS categories_article
FROM
    `alsa_articles`,
    `alsa_categories`
GROUP BY alsa_articles.nom

Avec les tables :
alsa_articles : nom (varchar) | categories (varchar)
alsa_categories : id (int) | nom (varchar)


Liens vers la doc MySQL :
- GROUP_CONCAT
- IF
- FIND_IN_SET

enjoy Smiley cligne
Ah oui, plus compliqué mais peut-être plus direct aussi.
Je vais regarder ça. Merci jeje. Smiley smile