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

PHP & Base de données Discussion :

Lier un commentaire à un message [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut Lier un commentaire à un message
    Bonjour.

    Je cherche à créer une association des commentaire aux messages. C'est un conseil que je demande.

    Est-il préférable d'associer un champ de la table commentaires à message ou inversément?

    Ma table des message :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `messages` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `title` varchar(32) NOT NULL,
      `descb` varchar(255) NOT NULL,
      `links` varchar(120) NOT NULL,
      `image` varchar(120) NOT NULL,
      `media` varchar(120) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Dans une autre table, il pourrait y avoir un champ qui associerait à "message".

    Genre à comment_id dans la 2e table et je mettrait le ID de message.

    J'ai besoin de vos idées sur cela.

    Je parle aussi du principe de créer un système pour faire des catégories.

  2. #2
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Etant donné que tu peut avoir plusieurs commentaires pour un message, il est mieux de mettre ta clé étrangère dans la table commentaires

  3. #3
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Alors, je ferais comme ceci :

    Le ID de la table messages irait à mon champ coment_id de
    ma table commentaires que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `commentaires` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nname` varchar(32) NOT NULL,
      `title` varchar(32) NOT NULL,
      `messg` varchar(32) NOT NULL,
      `coment_id` varchar(32) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Au champ coment_id`, j'ai besoin de créer un index? ou autre?

    Et je créerait ma requête avec une jointure quelconque.

    Merci pour ce conseil.
    Bonne année

  4. #4
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    Alors, je ferais comme ceci :

    Le ID de la table messages irait à mon champ coment_id de
    ma table commentaires que voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE TABLE IF NOT EXISTS `commentaires` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nname` varchar(32) NOT NULL,
      `title` varchar(32) NOT NULL,
      `messg` varchar(32) NOT NULL,
      `coment_id` varchar(32) NOT NULL,
      `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
    Au champ coment_id`, j'ai besoin de créer un index? ou autre?

    Et je créerait ma requête avec une jointure quelconque.

    Merci pour ce conseil.
    Bonne année
    Pour le champs en question je te conseil de l'appeler messageId_fk (Id du message, fk = foreign key = clé étrangère), c'est pas obligatoire mais c'est mieux pour la lisibilité notamment dans tes requêtes, pour le reste non t'a rien d'autre à faire à part ne pas te planter en faisant tes jointures

  5. #5
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je pense que je dois ajouter une référence dans la table des messages afin de pouvoir effacer les commentaires si j'éfface un message.

    En détruisant un message qui porterais le ID 100

    qui lui a comme commentaire les ID1, ID2, ID3 et ID6

    Il faudrait que j'indique à message, les ID des commentaire?

    Parce que si je détruit un message, je ne veux pas que les
    commentaires associé reste.

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Théoriquement il faudrait 3 tables pour représenter cette relation 1,n (une à plusieurs) qu'il y a entre la table "messages" et "commentaires".

    Les 3 tables :
    - "messages" : id_message comme clé primaire et auto_increment.
    - "commentaires" : id_commentaires comme clé primaire et auto_increment.
    - "commentaires_messages" : une clé double zone comme clé primaire, c'est à dire -> PRIMARY KEY (id_message, id_commentaire). Cette table n'aura alors que 2 champs, les couples d'IDs de messages et commentaires.

  7. #7
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Comment j'appliquerais la 3e table en PHP?

    Je sais à quoi sert messages et commentaires mais le dernier?

    Citation Envoyé par RunCodePhp Voir le message
    Salut
    Les 3 tables :
    - "messages" : id_message comme clé primaire et auto_increment.
    - "commentaires" : id_commentaires comme clé primaire et auto_increment.
    - "commentaires_messages" : une clé double zone comme clé primaire, c'est à dire -> PRIMARY KEY (id_message, id_commentaire). Cette table n'aura alors que 2 champs, les couples d'IDs de messages et commentaires.

  8. #8
    Membre éclairé
    Homme Profil pro
    Inscrit en
    Avril 2011
    Messages
    660
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2011
    Messages : 660
    Par défaut
    Cela permet de savoir à quel message et rattacher le commentaire et vice versa.

  9. #9
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    J'ai fait avec deux table une requête et ça donne ceci en image.

    En regardant l'image jointe, je me demande comment je vais appliquer la 3e table. Je comprends l'idée mais la manière d'appliquer la table en question.
    Images attachées Images attachées  

  10. #10
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Tu ne peux pas appliquer le modèle qu'il y a dans cette image (linker), car sur celui-ci il y a une relation 1-1, et non 1,n, ce qui change tout.
    En gros, un message pourra être lié à 1 et 1 seul commentaire.

    Pour qu'il y ait cette relation 1,n (et même 0,n), c'est à dire que pour 1 message avoir plusieurs commentaires, il faut une autre table comme je l'ai expliqué.
    Cette table aura uniquement 2 champs (couple id_message et id_commentaire), de même que la clé primaire sera aussi ces 2 champs (ou double clé en faite).
    Le fait de définir une clé double zone évitera d'avoir des doublons.

    Exemple de ce qu'on obtiendra.

    messages (uniquement des messaged, donc 1 clé primaire auto_increment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    id_message | title | -> autres champs
    1          | premier message
    2          | deuxième message
    3          | troisième message
    PRIMARY KEY (id_message)


    commentaires (la aussi uniquement des commentaires, donc 1 clé primaire auto_increment)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_commentaire | name | -> autres champs
    1              | premier commentaire
    2              | deuxième commentaire
    3              | troisième commentaire
    4              | quatrième commentaire
    PRIMARY KEY (id_commentaire)


    commentaires_messages (les associations des commentaires des messages, une clé double)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    id_message | id_commentaire
    1          | 2
    2          | 3
    1          | 1
    1          | 4
    PRIMARY KEY (id_message, id_commentaire)


    Donc dans cette exemple on a 3 messages (1, 2, 3) et 4 commentaires (1, 2, 3, 4).
    Le message 1 a 3 commentaires -> les 2, 1 et 4
    Puis le message 2 a qu'un seul commentaire -> le 3
    Et le message 3 n'a aucun commentaire

  11. #11
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Le résultat de la requête dans mon image ne me permet pas d'afficher les commentaires pour chaque item.

    Je vais me concentrer sur votre dernière explication. Merci pour vous être donné la peine de m'expliquer. Ça va servir. Je tente des choses et j'y reviens si j'y arrive pas.

    Ma requête vas se baser sur les trois tables surement.

  12. #12
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Le résultat de la requête dans mon image ne me permet pas d'afficher les commentaires pour chaque item.
    En faite, ça dépend de ce que tu veux obtenir.

    Le modèles en 3 tables que je t'ai mis permets de faire un peu plus que d'associer des commentaires à un message.
    Ca permet d'avoir des messages sans commentaires, d'avoir aussi des commentaires non liés à des messages (on peu le voir comme un brouillon), et aussi (je dirais surtout) d'associer un même commentaire à plusieurs messages différents.


    Si ton besoin ne va pas aussi loin que ça, s'il est plus restrictif comme dire qu'un commentaire devra être lié un 1 et 1 seul message en particulier (et non à d'autres), alors effectivement ,il faudrait le faire avec 2 tables uniquement.
    Comme :
    "commentaires"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    commentaire_id | message_id | name -> autres champs
    1              | 1          | premier commentaire du message 1
    2              | 1          | deuxième commentaire du message 1
    3              | 2          | premier commentaire du message 2
    commentaire_id comme clé primaire et en auto_increment
    J'avais peut être mal compris ce que tu voulais.
    Disons que maintenant tu as les 2 modèles.

  13. #13
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Effectivement, le modèle que je cherchais est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    message1 
     - commentaire id1
     - commentaire id4
     
    message2 
     - commetnaire id2
     - commentaire id3
    Le problème que ça pose est que j'obtiens 4 donnée quand j'applique avec une WHILE.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    En PHP j'obtiens ceci : 
     
    message1 avec commentaire id1
    message1 avec commentaire id2
     
    Pas pratique pour faire un listing.
    Mais, grâce à votre intervention, je n'avais jamais entendu parlé de 1,n et j'ai trouvé un site qui en parle bien :
    http://www.intras.fr/tutoriels/mysql/mysql-jointure.php
    (je vais étudier ça en détails).

    Pour faire mes jointures ou pour déboguer, j'utilise navicat qui m'aide beaucoup à comprendre mais ça ne permet pas de tout comprendre.

    J'apprécie beaucoup votre aide RunCodePhp.

  14. #14
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Citation Envoyé par dancom5 Voir le message
    ... je n'avais jamais entendu parlé de 1,n et j'ai trouvé un site qui en parle bien
    Si on résume ça, on peu dire que tout repose sur ce principe là, les relations qu'il y a entre chaque données, car il y en une pour toutes les données.

    A une époque (ça remonte pas mal maintenant), j'avais fais du MERISE, et ceci permet de concevoir ce genre de chose.
    On parle de MCD (Modèles Conceptuel de Données), de MPD (Modèle Physique de Données).
    Il y a des tutos d'ailleurs :
    http://sgbd.developpez.com/cours/

    Cependant, du MERISE sans prof ou une personne pour guider/orienter, ça ne doit pas être évident.

    De mon coté, une fois les cours terminés, MERISE je l'ai mis au placard.
    Depuis je fais tout au feeling, mes besoins sont très loin d'être complexes.

  15. #15
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Je vous trouve sympathique!
    Je vais aller voir le tuto :-)

  16. #16
    Membre émérite
    Avatar de amoiraud
    Homme Profil pro
    Développeur Web
    Inscrit en
    Octobre 2006
    Messages
    606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Octobre 2006
    Messages : 606
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Cependant, du MERISE sans prof ou une personne pour guider/orienter, ça ne doit pas être évident.
    Tu m’étonne
    N’empêche je l'utilise toujours au taf, un petit MCD permet d'avoir une bonne visualisation de la BDD, très pratique pour la conception, mais aussi pour le développement

  17. #17
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    J'ai commencé à débloquer en utilisant Navicat pour les "jointures". Mais, il me manque encore pas mal de théories.

    Ma principale préoccupation après le CRUD (create, read, update and delete) dans mysql. Ce sont les relations entre les catégories et les sous-catégories; c'est pour cette raison que j'ai créé ce poste. Je cherche pas à créer un script en tant que tel mais plutôt être en mesure d'en faire un.

  18. #18
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Ce sont les relations entre les catégories et les sous-catégories;
    Et bien cette, ça change un peu, voir beaucoup.
    Ca dépend là aussi de ce tu souhaite obtenir.

    En 1er je te mets un lien qui te seras peut être utile :
    Arborescence classique en au-jointure et arborescence intervallaire
    On peu voir dans ce tuto 2 façons de concevoir cela, le "classique" qui est le plus courant (plus simple), et "l'intervallaire" qui est assez rare (plus complexe).

    Si on regarde comment son conçus les Soft Open Source comme les CMS, blog, etc ... ils optent pour ce genre de solutions.

    A coté de ça, si on se tient à Merise de manière très stricte, on peu être amener à dire que la Bdd de ces Softs serait mal conçue (pour cette partie là du moins).


    Pour faire court, on va dire que selon le contexte (le Web, des besoins par moment particuliers, contraintes, optimisations, etc ...), fait qu'on ne peu pas toujours tout respecter à la lettre.
    Disons que Merise a été créé il y a pas mal de temps, et ne pouvait pas connaitre les besoins/contraintes actuels.


    Donc pour faire des menus (ou autres) avec une arborescences comme des catégories, sous catégories, sous sous catégories, voire au-delà et même à l'infini, il est bon de se baser sur des concepts connus.


    Je dirais donc que te référer à des Soft Open Source plus ou moins proches de ce que tu souhaites faire est un bon moyen de voir comment ils font, et ça permet aussi d'apprendre.
    Voire pourquoi pas en adopter un pour peu qu'il répond tout ou en parti à ton besoin.

  19. #19
    Membre éclairé Avatar de dancom5
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    808
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56

    Informations forums :
    Inscription : Janvier 2010
    Messages : 808
    Par défaut
    Mysql ne permet pas de faire ressortir les messages une seule fois.

    message1 - commentaire de A
    message1 - commentaire de B

    Chaque fois qu'un commentaire est émis, le même message est ajouté dans la liste. Sans les commentaires, j'ai 5 messages. Mais avec les commentaire si j'en ai 2, c'est comme si j'avais 7 message dont deux identique.

    Tout ça avec les jointures.

    Faut tricher avec PHP avec des Loop avec while et à l'intérieur d'autres loop pour faire ressortir un résultat. Mais, ça reste que le résultat de la requête n'est pas 5 ligne de message mais 7 lignes qui inclu les commentaires.

    Ce qui me faut c'est une requête qui me fait sortir 5 lignes de messages et soit que la requête me fait inclure les commentaire dans les bons message.

    J'essais juste de comprendre.

    J'ai essayé avec trois tables et on doit encore faire des jointures qui fabrique des lignes de plus pour inclure des commentaires. Et à l'affichage, j ai des ligne en double. Y'a pas un site qui donne un exemple déjà fait en démo?

    Mysql c'est puissant à ce qu'on dit.

    Merci pour les explications précédentes.

  20. #20
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Mysql ne permet pas de faire ressortir les messages une seule fois.
    Normalement si, mais les résultats obtenus dépendent de ce que tu souhaites faire.
    Poster le code de la requête est utile aussi pour qu'on vois mieux ce que tu fais.

    Si tu fais une requête qui sélection un message bien déterminer et ces commentaires associés, il est vrai qu'en faisant ça en 1 seul requête il va avoir un phénomène de répétition concernant les données du message.

    C'est aussi la même chose si on récupère plusieurs messages et les commentaires associés.

    Par ailleurs, on peu aussi le faire en 2 requêtes imbriquées ce qui au bout facilitera les choses.
    C'est théoriquement moins performant, mais faut voir si cela est si contraignant que ça ou pas.

    J'ai essayé avec trois tables et on doit encore faire des jointures qui fabrique des lignes de plus pour inclure des commentaires
    Quelque soit le modèle adopté on aura se phénomène si on le fait en 1 requête.
    Cependant on n'opte pas un modèle en 1 ou 2 tables juste pour espérer de simplifier les codes, on opte pour tel ou tel modèle car c'est les relations entre les données qui l'impose.
    Si tu obtiens plus de lignes que prévu alors c'est la requête SQL qui ne va pas.
    Poster la requête est plus simple (et poster la structure des tables au besoin).

    Y'a pas un site qui donne un exemple déjà fait en démo?
    Si tu fais des recherche avec quelque chose comme "jointure sur 2 tables" tu trouveras une quantité impressionnante d'exemples.
    Puis sur ce même forum php/mysql c'est pareil.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [PHP 5.0] Lier l'article aux commentaires
    Par lythande dans le forum Langage
    Réponses: 9
    Dernier message: 13/04/2015, 16h15
  2. [Modèle Relationnel] Plusieurs commentaires pour un seul message
    Par -Fly- dans le forum Schéma
    Réponses: 2
    Dernier message: 16/03/2012, 15h43
  3. [XL-2003] Lier des évennements aux différents choix d'un Message Box
    Par Mas_Carpone dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/10/2009, 14h38
  4. A lire impérativement avant de poster un message
    Par ok.Idriss dans le forum Demandes
    Réponses: 0
    Dernier message: 01/05/2002, 18h57

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