Requete vu non vu topic

Le problème exposé dans ce sujet a été résolu.

Bonjour,

Je suis tout nouveau ici alors bienvenue parmi moi o_O j’ai un certain sens de l’humour :D

J’explique mon sujet :

Je suis en train de mettre a jour un vieux forum vers POO pour l’instant je test encore certaine chose en procédural notamment cette partie ou je dois mettre a jour la date pour un système de vu non vu.

Alors mon système fonctionne sauf que lors de la création d’une réponse ou d’un topic je dois quand même actualisé la page topic même si c’est moi l’auteur pour qu’a l’index du forum l’image change.

Voici la partie de la requête :

    if(empty($error)){

        //on insert une reponse
        $i = [$userid,$f_rep_name, $content, $id];

        $db->prepare("INSERT INTO f_topics_reponse SET f_user_id = ?, f_rep_name = ?, f_topic_reponse = ?, f_topic_id = ?, f_topic_rep_date = NOW()")->execute($i);

        $lastid = $db->lastInsertId(); //pour la redirection

        //on met a jour la date du premier topic pour mettre en avant 
        $db->prepare("UPDATE f_topics SET f_topic_message_date = NOW() WHERE id = ?")->execute([$id]);
        
        // on met ajour topic track
        $smtp = $db->prepare('SELECT * FROM f_topic_track WHERE user_id = ? AND topic_id = ?');
    
        $smtp->execute([$userid,$id]);
        
        $views = $smtp->fetch();
        
        //on update topic track en fonction de l'utilisateur
        if($views != null){ 
            $db->prepare("UPDATE f_topic_track SET read_topic = NOW() WHERE user_id = ? AND topic_id = ?")->execute([$userid,$id]);
        }else{
            $db->prepare("INSERT INTO f_topic_track SET read_topic = NOW(), user_id = ?, topic_id = ?")->execute([$userid,$id]);
        }

        //tester une redirection vers la page en court et redirigé dessus même si une nouvelle page se créer
        if($pagination->isPage() > 1){
            setFlash('Votre réponse a bien étais poster');
            redirect($router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'?page='.$pagination->isPage().'#rep-' . $lastid]));
        }
        setFlash('Votre réponse a bien étais poster');
        redirect($router->routeGenerate('viewtopic',['id' => $match['params']['id'] .'#rep-' . $lastid]));
        
    }

Pour faire mon vu non vu j’ai 2 table une table de tracking lié au topic et la table topic ou j’insert la date de topic, et en cas de réponse une date de réponse.

ici c’est la partie post réponse mais c’est pareil pour la création d’un topic, les dates se mettent bien a jour en bdd mais ça dois se joué en micro second car a l’index du forum ça reste en non vu jusqu’à ce que je vois le topic que je viens de créer, je comprend que l’image change pour un autre utilisateur mais pour moi qui suis l’auteur elle devrais resté neutre.

Peut être un ordre des requête ?

j’ai aussi une fonction qui met a jour seulement dans le cas ou un utilisateur n’a pas vu un topic ou une réponse mais seulement pour ceux qui sont connecté.

/**********
* view not view seulement si l'utilisateur est connecter
***********/
if(isset($_SESSION['auth']) && isset($match['params']['id'])){

    $userid = (int) $_SESSION['auth']->id;
    $get = (int) $match['params']['id'];

    $smtp = $db->prepare('SELECT * FROM f_topic_track WHERE user_id = ? AND topic_id = ?');

    $smtp->execute([$userid,$get]);
    
    $views = $smtp->fetch();
    
    //on update topic track en fonction de l'utilisateur
    if($views != null){ 
        
        // il faudrai que l'update ce fasse seulement si la date du topic ou des réponses est supérieur a f_topic_track
        if($topic->f_topic_message_date >= $views->read_topic or $topic->f_topic_date >= $views->read_topic){
            $db->prepare("UPDATE f_topic_track SET read_topic = NOW() WHERE user_id = ? AND topic_id = ?")->execute([$userid,$get]);
        }

    }else{
        $db->prepare("INSERT INTO f_topic_track SET read_topic = NOW(), user_id = ?, topic_id = ?")->execute([$userid,$get]);
    }

}	

J’ai conscience que ça fais beaucoup pour un premier message mais c’est une partie un peut technique on vois pas de tuto là dessus sur youtube, surtout que j’utilise pas une méthode simple.

Bonne journée a vous.

Salut

Permets moi de m’assurer que j’ai bien compris. Si dans un onglet tu as la page d’index du forum et que dans un autre tu ajoutes une réponse à un sujet, la page d’index du forum ne change pas automatiquement. C’est bien ça ?

+0 -0

Bonjour, sur un forum il y a un une image qui change pour indiquer qu’il y a un nouveau topic ou une nouvelle réponse et cette image change bien quand j’ai une nouvelle réponse en comparant les dates

				  CASE
		
					WHEN f_topic_date < f_topic_message_date THEN f_topic_message_date
		
					WHEN f_topic_date > f_topic_message_date THEN f_topic_date
		
					ELSE f_topic_date
		
				  END AS Lastdate

le problème n’est pas que ça ne fonctionne pas mais que l’image reste comme non lu même si je suis l’auteur, jusqu’à ce que je me rende sur le nouveau message et active ma deuxième partie de code celle que j’ai donner plus haut.

Bonjour, je sais pas si ça va t’avancer beaucoup plus

             <div class="<?= isset($posts->read_last) && $posts->read_last > $posts->Lastdate ? 'anime__review__item__pic' : 'anime__review__item__pic_view' ; ?>">
                <?= !empty($posts->avatar)
                  ? "<img src='" . WEBROOT . "inc/img/avatars/" . $posts->avatar . "' draggable='false' alt=''>"
                  : "<img src='" . WEBROOT . "inc/img/avatars/default.png' draggable='false' alt=''>"; ?>
                <?= $forum->hot($count->countid) ?>
              </div>

Ici j’ai une class css qui change en fonction de lastdate dans le case when juste au dessus, j’ai choisis d’afficher une bordure d’une couleur différente sur l’avatar mais cette partie là fonctionne très bien.

voilà a quoi ça ressemble dans ma req, ensuite je compare lastdate avec read_last pour avoir mon vu non vu

/*
CASE - si on a un nouveau topic on le met au dessu
et si on a une réponse on passe au dessu du dernier topic
*/
CASE

	WHEN f_topic_date < f_topic_message_date THEN f_topic_message_date

	WHEN f_topic_date > f_topic_message_date THEN f_topic_date

	ELSE f_topic_date

END AS Lastdate,
/* view not view */
CASE

	WHEN read_topic < f_topic_date THEN f_topic_date

	WHEN read_topic > f_topic_date THEN read_topic

END AS read_last
...
ORDER BY sticky DESC, Lastdate DESC

Mais là n’est pas le souci le tout est que l’image ne devrais pas afficher nouvelle réponse/topic si je suis l’auteur car forcément si je suis l’auteur c’est que j’ai déjà vu.

C’est dans post réponse/topic que ça se passe c’est là que je met a jour les dates.

bonne journée.

Je n’ai soit toujours pas compris, soit pas vu ce que je voudrais.

L’image ne devrais pas afficher nouvelle réponse

C’est-à-dire ? Tu as des images différentes en fonction de s’il y a une nouvelle réponse dans un sujet, et le souci est donc que cette image n’est pas la bonne pour le sujet quand tu viens d’y répondre ?
Tu nous as bien fourni le code concerné, pas du code d’une autre partie ? Parce que je n’y vois pas de différence selon la dernière réponse, je ne vois que l’affichage de l’avatar par défaut selon s’il y en a un ou non. Il y a bien des vérifications pour la classe de l’image uniquement — et tu nous confirmes que ce n’est pas le problème.

Si jamais, now() en SQL ne gère par défaut qu’à la maille de la seconde

+0 -0

Bonjour,

J’ai laisser un peut de temps pour voir ce que je pouvais faire !

@Ymox C’est-à-dire ? Tu as des images différentes en fonction de s’il y a une nouvelle réponse dans un sujet, et le souci est donc que cette image n’est pas la bonne pour le sujet quand tu viens d’y répondre ?

Alors oui c’est ça a peut près, l’image change bien, j’ai mis une bordure verte en cas de nouvelle réponse ou topic mais si je suis l’auteur elle ne devrais pas changer puisse que si j’ai créer le topic/réponse je l’ai forcement lu.

c’est pas optimal mais j’ai mis un sleep entre la sauvegarde des topic/réponse et la sauvegarde qui gère les tracking et c’est ok il s’agit bien d’une contrainte de temps la comparaison se fait au supérieure ou égal pour afficher l’image.

bonne journée.

Je pense plutôt que c’est un souci de cache quelconque si bricoler avec sleep() est parmi les solutions.

Mais bon, tu sembles avoir trouvé quelque chose qui te convient, c’est le principal.

Signale ton sujet résolu, s’il te plaît, tu as une action pour ce faire en haut à droite du sujet (pour les mobiles ou tablettes, c’est dans le menu).

+1 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte