BDD et multichoix

Petit nouveau ! | 1 Messages

14 févr. 2013, 15:22

Bonjour à tous,

J'ai un formulaire pour créer des articles, lors de la validation d'un articles je peu choisir la catégorie dans lequel il sera posté, j'aimerais le poster dans plusieurs catégories donc j'ai ajouté [] au select et j'ai utiliser la commande implode (séparé par une virgule).
Dans ma BDD tout est correcte j'ai une table $T_sites et ma structure est ID | DESCRIPTION | TITRE | ID_CAT qui me donne 1652 | ma descrption | mon titre | 106,107.

Sur mon accueil j'ai toutes les catégories avec le nombre d'articles présents, les articles dans une seule catégorie apparaissent les autres non, voici le code qui me permet de récupérer les sites :

Code : Tout sélectionner

function get_nbsites($cat) //retourne le nombre de sites presents dans une categorie ainsi que dans ses sous-categories { global $T_categories,$T_sites; //noms des tables utilisees //on place la categorie dans un tableau $list_all_cats[] = $cat; while (list($cle,$id_cat) = each ($list_all_cats)) //tant qu'on a encore des nouvelles categories { //on va chercher toutes les sous-categories de id_cat $sql_scats = "SELECT id FROM $T_categories WHERE id_cat_mere = '$id_cat' AND activation = 1 "; //on envoie la requete $res_scats = send_sql($sql_scats,"trouver le nombre de sous-catégories de $id_cat"); //ajout des categories dans le tableau while ($result = mysql_fetch_array($res_scats,MYSQL_ASSOC)) $list_all_cats[] = $result["id"]; } //preparation de la requete pour aller chercher le nombre de site $sql_nb_sites = "SELECT count(id) as count FROM $T_sites WHERE activation = 1 and ("; $nb_cats = sizeof($list_all_cats); for ($i=0;$i<$nb_cats-1;$i++) //on rajoute toutes les sous-categories $sql_nb_sites .= "id_cat = '$list_all_cats[$i]' or "; $sql_nb_sites .= "id_cat = '$list_all_cats[$i]') "; //envoi de la requete $res_nb_sites = send_sql($sql_nb_sites,"trouver le nombre de sites dans la catégorie $id_cat"); return mysql_result($res_nb_sites,0,"count"); }
Je sais qu'il faut lui dire de vérifier qu'il y a des , mais je ne sais pas comment faire, j'ai essayé pas mal de chose mais je débute alors un petit coup de main serait sympa.

Merci d'avance.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 févr. 2013, 00:14

Salut,

C'est un problème de modélisation de ta base.

Dans ton cas il te faut

Une table catégorie idcategorie, nom
Une table site : idsite, description, titre
Une table categoriesSite : idsite, idcategorie : clef primaire sur ces deux colonnes.

Il s'agit de clef étrangères. Elles font références aux deux autres tables.

En sql
create table categoriesite(
Idsite INT not null ,
Idcategorie INT not null ´
Primary key(Idsite,Idcategorie),
foreign key idsite references site(idsite),
foreign key idcategrorie references catégorie (idcategorie)
)
Avec sa tu peux gérer simplement les catégories des sites, en avoir autant que tu veux pour chaqué en supprimer une sans avoir besoin de modifier les autres.
C'est aussi beaucoup plus simple pour compter le nombre de site par catégorie.
Select count(*) as nb, idcategorie from categoriesite group by idcategrorie;


@+
Il en faut peu pour être heureux ......