IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

BDD et multichoix


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut BDD et multichoix
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $list = "<select class='selcat' size='3' class='select' multiple='true' name='" . $name_field . "[]'>\n"; 
    $list_cats[] = "<option label=\"$path \" value=\"$resultat[id]\">$path</option>";
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    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 si 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.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Ta structure n'est pas adaptée : il te faut une table de liaison entre les articles et les categories :
    id , article_id, categorie_id
    et donc une entrée par catégorie associée.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    bonjour sabotage,

    Merci de prendre le temps de me répondre,

    Je ne comprend pas pourquoi ce n'est pas adapté puisque le script à la base fonctionne, n'y aurait-il pas un moyen de lui faire vérifier si il y a plusieurs catégories ?

    Sinon peux tu m'en dire un peu plus sur ta solution ?

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Bonjour G_Du_Mal,

    La notion que sabotage a émise plus haut est ce qu'on appelle dans le jargon SGBD une "relation". Une relation permet de lier deux tables tout en respectant certaines conventions au niveau SGBD. Ici intervient la notion de "clé étrangère".

    Une clé étrangère est un champ d'une table faisant référence à un autre champ d'une autre table. Par exemple, tu disposes d'une tables pour les articles, une autre pour les catégories d'articles. La structure est (admettons) comme tel :

    * => Clé primaire
    # => Clé étrangère

    articles
    -------
    idArticle*
    titreArticle
    contenuArticle


    categories
    ----------
    idCategorie*
    intituleCategorie
    Dans le cas où une seule catégorie peut être liée à un article mais qu'une catégorie peut concerner plusieurs articles, nous rencontrons une relation de type (1,n) qui signifie "Pour 1 X j'ai une liaison avec n Y". Dans le cas de la relation (1,n), il convient de rajouter un champ à la table disposant de l'indice 1, à savoir les articles ici. Ce champ sera donc une clé étrangère puisqu'il fera explicitement référence à la clé primaire de categories. On pourrait donc établir le schéma suivant :

    * => Clé primaire
    # => Clé étrangère

    articles
    -------
    idArticle*
    titreArticle
    contenuArticle
    idCategorie#

    categories
    ----------
    idCategorie*
    intituleCategorie
    A partir de là, tu es sûr qu'un article n'est concerné que par une seule catégorie : il te suffit donc grâce au SQL d'effectuer une jointure avec le prédicat adéquat :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT idArticle, titreArticle, contenuArticle
    FROM articles
    JOIN categories
    ON categories.idCategorie = articles.idCategorie;

    La clause ON de la jointure permet de spécifier la "condition" de jointure.

    Malheureusement, dans ton cas, ce n'est pas aussi "simple" (rien de bien compliqué non plus). Tu souhaites disposer de plusieurs catégories (éventuellement) pour un seul articles. ON peut donc dire :

    - Un article peut avoir une ou plusieurs catégories
    - Une catégorie peut concerner zéro ou plusieurs articles (généralement, lorsque tu crées un catégorie, c'est qu'elle sert, mais bon )

    Nous nous retrouvons donc dans un cas de relation (n,n). Dans ce type de relation, la solution n'est pas de placer un unique champ dans la table articles. IL convient donc, comme l'a évoqué sabotage, de créer une "table de correspondance" qui fera la jointure avec articles et avec categories.

    POur effectuer cette jointure, cette table devra donc disposer de clé étrangères qui ne sont autre que les clé primaires des tables articles et catégories :

    * => Clé primaire
    # => Clé étrangère

    categoriesArticle:
    -----------------
    idArticle#
    idCategorie#

    SAns oublier d'ajouter une clé primaire qui englobe les deux champs de ta base puisque :
    - toute table doit posséder un identifiant
    - si pour un article,si tu as 2 catégories, SQL refusera que tu dupliques l'entrée "idArticle" si elle est clé primaire seule.

    Avec la belle clé primaire, on obtient :
    * => Clé primaire
    # => Clé étrangère

    categoriesArticle
    ----------------
    (idArticle#
    idCategorie#)*
    Ainsi, ta table categoriesArticle servira de lien entre articles et categories. Si tu souhaites récupérer l'intitulé des catégories pour un article donné, il te faudra faire :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT idArticle, titreArticle, contenuArticle, intituleCategorie
    FROM articles
    JOIN categoriesArticles
    ON categoriesArticle.idArticle = articles.idArticle
    JOIN categories
    ON categoriesArticle.idCategorie = categories.idCategorie;

    Après, pour ton formulaire d'insertion, il te faudra alimenter la table categoriesArticle en insérant, pour ton article et pour chaque catégorie ajoutée, l'identifiant de ton article et l'identifiant de ta catégories.

    VOilà, je ne sais pas si j'ai bien expliqué et surtout si tu as compris, si tu as d'autres questions n'hésite pas POur plus de renseignements sur les jointures, je t'invite à lire ceci (http://www.w3schools.com/sql/sql_join.asp) ou encore http://www.aide-oracle.net/2009/04/l...plusieurs.html


    BOnne journée

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup pour ta réponse très complète je vais prendre le temps de bien tout lire, c'est comme ça qu'on apprend


    Une dernière petite question en passant, il a t-il un moyen de dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    If (index.php) {
    echo 'Coucou' 
    }
    Merci encore une fois pour votre aide précieuse.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    Que cherches-tu à faire avec ton code ? Vérifier que la page index.php existe ou que la page en cours est index.php ?

  7. #7
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    J'ai une include que j'appelle sur plusieurs pages : page1.php, page2.php,..

    J'aimerais que sur

    page1.php il affiche une chose
    page2.php une autre chose etc...

    Via l'include

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 34
    Points : 46
    Points
    46
    Par défaut
    D'accord. Et le-dit message, il est variable pour une même page ou quelque soit le moment ou je rafraîchis page1.php par exemple, j'obtiendrais toujours le même message ?

    Cordialement

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2013
    Messages : 8
    Points : 4
    Points
    4
    Par défaut
    Toujours le même message.

    EDIT : Voici la solution au cas où.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $path = $_SERVER['PHP_SELF'];$file = basename ($path); 
    If ( $file == "mapage.php" ){
    echo 'Coucou'
    }
    Encore un grand merci tout particulier à Cr3a pour sa longue explication.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Quick Report et impression de données hors BDD
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 19/08/2002, 09h47
  2. portabilité et BDD
    Par delire8 dans le forum C++Builder
    Réponses: 7
    Dernier message: 04/07/2002, 10h59
  3. connection a une BDD MySql
    Par delire8 dans le forum MFC
    Réponses: 7
    Dernier message: 19/06/2002, 18h18
  4. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo