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 :

[Conception] Création d'un forum PHP : gestion des messages lus/non lus


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut [Conception] Création d'un forum PHP : gestion des messages lus/non lus
    Bonjour à tous.

    Je suis en train de créer un forum PHP "préfabriqué" (genre phpbb),
    Je n'ai pas commencé la partie administrative, J'en suis à la partie d'affichage, Pour le moment tout marche très bien: je peux créer des nouveaux topics / répondre / éditer; enfin les fonctionnalités de base quoi

    Mais voila, là j'ai un soucis
    Je n'ai aucune idée de comment m'y prendre pour la gestion des nouveaux messages, Où comment afficher qu'un message est nouveaux pour certains utilisateur et pour d'autre non.

    J'ai pensé à créer un champ "not_new_for"(text) (par exemple) et d'y insérer les utilisateurs qui ont visionné le message, de cette façon: "user1; user2; user4 ..." et d'ensuite utiliser une explosion de chaine avec pour délimiteur ";" et de vérifier si la $_SESSION['pseudo'] est égale a l'un des termes de l'array.
    Pour ceux qui le sont, le message s'affiche normalement, et en nouveau message pour les autres.

    Je peux déjà limiter les dégas en enregistrant cette info que sur le topic principale et non sur les réponses, mais ça fais vraiment lourd si, imaginons, le forum compte 1000 utilisateurs ou plus et/ou contient 10k messages...

    Donc voila, si vous voyez d'autre solutions, j'attends vos conseils

  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
    "user1; user2; user4 ..." et d'ensuite utiliser une explosion de chaine
    Ca serait un peu absurde d'insérer dans une base de donnée, des données avec séparateur.

    Sinon je pense que ca serait plus economique d'enregistrer :
    idmessage - idutilisateur - status(0, lu, repondu etc.)

  3. #3
    Invité
    Invité(e)
    Par défaut réponse
    pour chaque message tu met un champ genre TIMESTAMP ou DATE ou INT (qui contient la date et l'heure)

    exemple:

    tu ajoutes une colonne INT (unsigned/non-signé) à ta table de messages. Tu indiques le nom de la colonne comme étant DATE_MISEAJOUR..

    lorsque quelqu'un modifie le message ou fait une réponse tu utilises la commande 'time()' de php pour insérer la date et l'heure actuelle.

    Pour ce qui est de tes usagers, tu fais la même pratique, dans ta table des membres de ton forum, tu ajoutes une colonne DATE_DERNIERE_CONNECTION.

    Ton usager se connecte (login) à ton forum, tu met à jour DATE_DERNIERE_CONNECTION en y insérant l'heure et la date actuelle (encore la fonction 'time()').

    Il ne te reste qu'à faire une recherche de tous les messages dont la DATE_MISEAJOUR >= DATE_DERNIERE_CONNECTION de l'usager

    ---------

    maintenant l'usager voit les nouveaux messages, mais si il se déconnecte et reconnecte, la liste de nouveaux messages sera vide. Ce n'est p-etre pas ce que tu désires.


    Tu peux à la place mettre une colonne ID_DERNIER_MESSAGE_LU (INT) dans la table de tes membres et chaque fois que l'usager clique sur un messsage tu fais semblable a ceci


    if (ID_MESSAGE > ID_DERNIER_MESSAGE_LU)
    // MISE A JOUR DU ID_DERNIER_MESSAGE_LU=ID_MESSAGE

    de cette facon, quand l'usager se connecte, tu affiches tous les messages avec un # d'ID supérieur au dernier message lu par le membre.

    c'est la manière la plus simple..

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 92
    Points : 77
    Points
    77
    Par défaut
    Ajoutez dans la table Topics une champ du type DATETIME : last_replied;
    et une champs dans la table Users du type DATETIME: last_login;

    Et quand vous affichez les topics d'une rubrique, vous faites des comparaisons de date.

  5. #5
    Membre habitué
    Inscrit en
    Mai 2008
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 317
    Points : 135
    Points
    135
    Par défaut
    Citation Envoyé par sabotage Voir le message
    Ca serait un peu absurde d'insérer dans une base de donnée, des données avec séparateur.

    Sinon je pense que ca serait plus economique d'enregistrer :
    idmessage - idutilisateur - status(0, lu, repondu etc.)
    Je comprends pas vraiment, tu me suggère de carrément crée un table pour annoter les topics ?
    ça c'est ce que j'ai fais pour mon module de messagerie privée,mais là, c'est un forum, ce qui implique qu'il faille enregistrer 'lu'(1) ou 'non lu'(0) pour chaque utilisateur et chaque topic, avec ce procédé ça va être très lourd.

    Ajoutez dans la table Topics une champ du type DATETIME : last_replied;
    et une champs dans la table Users du type DATETIME: last_login;
    j'ai déjà les deux, mais on perd la notion du clic :S
    Je m'explique, il est plus conviviale d'annoter les topics qui on vraiment été lu, et là, mise à part le clic...

    Tu peux à la place mettre une colonne ID_DERNIER_MESSAGE_LU (INT) dans la table de tes membres et chaque fois que l'usager clique sur un messsage tu fais semblable a ceci


    if (ID_MESSAGE > ID_DERNIER_MESSAGE_LU)
    // MISE A JOUR DU ID_DERNIER_MESSAGE_LU=ID_MESSAGE
    ah ça me plait ça
    ça m'a l'air intéressant, je n'avais pas pensé a ce moyen,
    reste encore un petit soucis, prenons un cas concret:

    -Une personne ce log.
    -8 nouveaux message.
    -elle choisis en premier, malheureusement, le dernier message qui ai été poster sur les 8,
    -Resultat: 0 nouveaux messages.

    Je pioche déjà dans ma table `users` et `forum` faire des comparaisons n'est pas un problème, mais si je pouvais éviter de créer de nouvelles requêtes, pour la légèreté ça serrait cool

    Merci à tous pour vos avis, vos idées, et vos conseils

  6. #6
    Invité
    Invité(e)
    Par défaut
    reste encore un petit soucis, prenons un cas concret:

    -Une personne ce log.
    -8 nouveaux message.
    -elle choisis en premier, malheureusement, le dernier message qui ai été poster sur les 8,
    -Resultat: 0 nouveaux messages.
    je suis content, tu as très bien comprit la limitation. Ne classons pas l'idée comme mauvaise, voyons comment on peut l'améliorer.

    La limitation actuelle vient du fait que l,on conserve un seul ID, il suffit d'en conserver d'avantages mais d'y aller dans la limite du raisonnable.

    Je te suggère de conserver l'ID du dernier message lu mais pour chacun des groupes de discussion de ton site web.

    Pour ce faire, ne met pas la colonne DERNIERMESSAGELU dans ta table des membres mais fait plutôt ceci:


    Si tu créés une nouvelle table, disons STATUS_MESSAGES avec 3 colonnes
    id_Membre: (int) //contient l'ID du membre
    id_Forum: (int) //contient l'ID du forum (ou si tu aimes mieux , groupe de discussion)
    id_Message: (int) //l'ID du dernier message lu pour chaque forum (l'ID du forum est indiqué dans id_forum)



    tu conserves le même principle, mais au lieu de garder le dernier ID du message lu par l'abonné , tu conserves le dernier message lu dans chaque groupe de discussion (forum)..

    si ton site possède 5 groupes de discussion genre : Général, Aide, Tutoriel, ...

    chaque forum a son propre ID, et l'utilisateur va lire des articles dans chaque forum. Le but de l'opération consiste à conserver le dernier message lu (celui avec l'ID le plus élevé) dans chacun des groupes de discussions



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    //quand l'usager se connecte tu lit l'info
     select id_forum, id_message from STATUS_MESSAGES where id_member=$ID_MEMBRE
     
    tu mets le résultat dans un tableau genre 
    DERNIER_MESSAGE_FORUMS[ ]=array()
     
     
    if (ID_MESSAGE > DERNIER_MESSAGE_FORUMS[$ID_FORUM])
    // MISE A JOUR DU ID_DERNIER_MESSAGE_LU=ID_MESSAGE
    la limitation de cette méthode, n'en n'est pas nécessairement une. Si 5 nouveaux messages apparaissent dans un forum Aide, si l'usager clique sur le dernier message de ce groupe de discussion, les 4 autres messages plus anciens seront indiqués comme lu mais bon, je ne crois pas que l,usager veuillent volontairement ouvrir chaque message pour les marqués comme lu.

    espérant t'avoir suggéré une alternative qui t'intéresse

  7. #7
    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
    ce qui implique qu'il faille enregistrer 'lu'(1) ou 'non lu'(0) pour chaque utilisateu
    Non uniquement pour les utilisateurs ayant effectivement lu ou répondu.

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/12/2006, 21h03
  2. Création d'un logiciel de gestion des bulletins de notes de notre Lycée
    Par cheickssy dans le forum VB 6 et antérieur
    Réponses: 11
    Dernier message: 31/07/2006, 13h49
  3. [Oracle] [PHP] Gestion des erreurs de connexion
    Par Mimo dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/06/2006, 01h17

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