11521 sujets

JavaScript, DOM et API Web HTML5

Pages :
(reprise du message précédent)

parsimonhi a écrit :
Bonjour,

Il faut suivre les pistes données par Mathieuu ci-dessus. Mais déjà, il faudrait s'assurer que $_SESSION['user_id'] contient bien l'id d'un utilisateur. Par exemple en faisant provisoirement quelque chose du genre :
if(isset($_SESSION['user_id'])) $loggedIn=$_SESSION['user_id'];
else $loggedIn=null;
if ($loggedIn) file_put_contents("log.txt",date('Y-m-d H:i:s')." user id = ".$loggedIn."\n");
else file_put_contents("log.txt",date('Y-m-d H:i:s')." no user id\n");
Il suffit ensuite de regarder le contenu du fichier "log.txt" pour avoir la réponse.

Amicalement,


Merci pour les expliquations du JS et du span. C'est un peu plus clair pour moi Smiley smile
J'ai modifié mon code de listpost.php pour avoir le boutton que si l'utilisateur est connecté :

if ($loggedIn) {
            ?>
                <!--likes, on met un span pour que le JS cible plus facilement ce qui précède les boutons "j'aime"-->
                <div class="likes">
                    <span><?php echo $dbRow['likes_count'] . ' j\'aime'; ?></span>
                    <button class="like-button" data-post-id="<?php echo $dbRow['post_id']; ?>">J'aime</button>
                </div>
            <?php }
            else{
                // Utilisateur non connecté : affiche le nombre de likes sans le bouton
                ?>
                <div class="likes">
                    <span><?php echo $dbRow['likes_count'] . ' j\'aime'; ?></span>
                </div>
            <?php
            }
            ?>


Cela fonctionne. Cependant, je me demande si la condition qui vérifie si l'utilisateur a déjà aimé ce post devrait être dans le listpost.php ou dans like.php directement.

Si c'est listpost.php je verrais plutot ca :

        $likeQuery = "SELECT * FROM likes WHERE user_id = " . $_SESSION['user_id'] . " AND post_id = " . $dbRow['post_id'];
        $likeResult = mysqli_query($dbLink, $likeQuery);
        $alreadyLiked = mysqli_num_rows($likeResult) > 0;
        ?>

mais je trouve que cela fait "brouillon" et qu'il serait plus correct de faire ca sur like.php

J'ai procédé aux modifications pour like.php

<?php
require_once('config.php');
session_start();

if(isset($_POST['post_id'])) {
    $postId = $_POST['post_id'];

    // Connexion à la BD
    $dbLink = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME)
    or die('Erreur de connexion au serveur : ' . mysqli_connect_error());

    // Sélection de la base de données
    mysqli_select_db($dbLink, DB_NAME)
    or die('Erreur dans la sélection de la base : ' . mysqli_error($dbLink));

    // Vérifie si l'utilisateur a déjà liké ce post
    $query = "SELECT COUNT(*) FROM Likes WHERE post_id = $postId}";
    $result = mysqli_query($dbLink, $query);

    // On vérifie si l'utilisateur est connecté
    if (isset($_SESSION['user_id'])){
        $loggedIn = $_SESSION['user_id'];
    }
    else{
        $loggedIn = -1;
    }

    if ($loggedIn){
        if(mysqli_num_rows($result) == 0) {
            // Ajoute une entrée dans la table Likes pour enregistrer que l'utilisateur a liké ce post
            $query = "INSERT INTO Likes (post_id, user_id) VALUES ($postId, {$_SESSION['user_id']})";
            mysqli_query($dbLink, $query);
        }
    }

}


merci à vous deux,
Modérateur
Bonjour,

Si tu mets
    if (isset($_SESSION['user_id'])){
        $loggedIn = $_SESSION['user_id'];
    }
    else{
        $loggedIn = -1;
    }
Il faut ensuite utiliser
if ($loggedIn != -1)


Tu peux mettre quelque chose du genre
    if (isset($_SESSION['user_id'])){
        $loggedIn = $_SESSION['user_id'];
    }
    else{
        $loggedIn = false; // ou null ou 0
    }
et dans ce cas, on peut continuer à utiliser
if ($loggedIn)
en supposant par précaution qu'aucun utilisateur n'a pour id 0.

Amicalement,
Modifié par parsimonhi (26 Apr 2023 - 12:53)
Rebonjour, j'ai procédé aux modificiation pour $loggedIn merci.

J'ai également fait des modifications dans listpost.php comme suit :

<h2>Avis Clients</h2>
    <?php
    while ($dbRow = mysqli_fetch_assoc($dbResult)) {
        $post_id = $dbRow['post_id'];
        $likes_count = $dbRow['likes_count'];
        $has_liked = false; // Initialisation

        // Vérifie si l'utilisateur a aimé ce post
        if ($loggedIn) {
            $user_id = $_SESSION['user_id'];
            $like_query = "SELECT COUNT(*) AS count FROM Likes WHERE post_id=$post_id AND user_id=$user_id";
            $like_result = mysqli_query($dbLink, $like_query);
            $like_row = mysqli_fetch_assoc($like_result);
            $has_liked = ($like_row['count'] > 0);
        }

        ?>
        <div class="post">
            <div class="titre_post">
                <?php
                echo '<h3>' . $dbRow['title'] . '</h3><br>';
                ?>
            </div>
            <div class="info_post">
                <?php
                echo '<p>Pseudo : ' . $dbRow['pseudo'] . '</p><p>Date de publication : ' . $dbRow['date'] . '</p><br>';
                ?>
            </div>
            <div class="contenu_post">
                <?php
                echo '<p>Note: ' . $dbRow['note'] . '/5'. '</p><p>' . $dbRow['message'] . '</p>';
                ?>
                <br>
            </div>

            <!--likes, on met un span pour que le JS cible plus facilement ce qui précède les boutons "j'aime"-->
            <div class="likes">
                <span><?php echo $likes_count . ' j\'aime'; ?></span>
                <?php if ($loggedIn && !$has_liked) { ?>
                    <button class="like-button" data-post-id="<?php echo $post_id; ?>">J'aime</button>
                <?php } ?>
            </div>

        </div>


Cette partie de code remplace un peu le role de like.php je trouve.. Je n'ai pas encore trouvé comment adapter like.php
Qu'en pensez-vous ?
(PS : ca ne fonctionne toujours pas :') )
Modifié par linab (26 Apr 2023 - 16:33)
Salut

je suis que de passage, mais si tu as la possibilité d'éviter de mélanger le php et le html ça serait vraiiiiiiiment mieux Smiley smile
JENCAL a écrit :
Salut

je suis que de passage, mais si tu as la possibilité d'éviter de mélanger le php et le html ça serait vraiiiiiiiment mieux Smiley smile


Coucou Smiley smile !
Malheuresement, il m'est spécifier de procéder comme je l'ai fais Smiley ohwell
Modérateur
Bonjour,

Il faut d'abord faire marcher like.php

Est-ce que tu sais te servir de phpMyAdmin ?

Est-ce que la base est bien mise à jour comme espéré quand on clique sur le bouton "j'aime" ? (on le vérifie en allant regarder dans la table correspondante avec phpMyAdmin)

Amicalement,
parsimonhi a écrit :
Bonjour,

Il faut d'abord faire marcher like.php

Est-ce que tu sais te servir de phpMyAdmin ?

Est-ce que la base est bien mise à jour comme espéré quand on clique sur le bouton "j'aime" ? (on le vérifie en allant regarder dans la table correspondante avec phpMyAdmin)

Amicalement,


Bonjour,

Oui je me sers très bien de phpMyAdmin.
j'ai ajouté une contrainte d'unicité : ALTER TABLE Likes ADD CONSTRAINT unique_like UNIQUE (post_id, user_id);

En réfléchissant je viens de voir que dans mon code like.php il y avait une accolade en trop qui faussait tous le code !!!!!!

Donc maintenant, ma table likes s'incrémente qu'une fois Smiley decu
Quand je recharge la page, l'utilisateur ayant déjà liké un post ne peut plus le reliker Smiley smile ! Cependant, avant que la page se recharge il peut incrémenter autant qu'il veut Smiley ohwell Dois-je d'ailleurs rajouter un refresh de la page quelque part ? Dans listpost.php ? like.php ? ou dans le javascript ?

Un autre utilisateur peut appuyer sur le bouton j'aime mais son like n'est pas additionné avec l'ancien nombre Smiley decu


Mon code "d'intérêt" dans listpost.php :

// Requête pour récupérer les posts, le nombre de likes pour chaque post, et le pseudo de l'utilisateur qui a posté
    $data_post = 'SELECT Post.*, Utilisateur.pseudo, COUNT(Likes.post_id) as likes_count FROM Post 
    INNER JOIN Utilisateur ON Post.user_id=Utilisateur.user_id 
    LEFT JOIN Likes ON Post.post_id = Likes.post_id 
    GROUP BY Post.post_id 
    ORDER BY date DESC';

while ($dbRow = mysqli_fetch_assoc($dbResult)) {
        $post_id = $dbRow['post_id'];
        $likes_count = $dbRow['likes_count'];
        $has_liked = false; // Initialisation

        // Vérifie si l'utilisateur a aimé ce post
        if ($loggedIn) {
            $user_id = $_SESSION['user_id'];
            $like_query = "SELECT COUNT(*) AS count FROM Likes WHERE post_id=$post_id AND user_id=$user_id";
            $like_result = mysqli_query($dbLink, $like_query);
            $like_row = mysqli_fetch_assoc($like_result);
            $has_liked = ($like_row['count'] > 0);
        }

while ($dbRow = mysqli_fetch_assoc($dbResult)) {
        $post_id = $dbRow['post_id'];
        $likes_count = $dbRow['likes_count'];
        $has_liked = false; // Initialisation

        // Vérifie si l'utilisateur a aimé ce post
        if ($loggedIn) {
            $user_id = $_SESSION['user_id'];
            $like_query = "SELECT COUNT(*) AS count FROM Likes WHERE post_id=$post_id AND user_id=$user_id";
            $like_result = mysqli_query($dbLink, $like_query);
            $like_row = mysqli_fetch_assoc($like_result);
            $has_liked = ($like_row['count'] > 0);
        }



mon code like.php :

<?php
require_once('config.php');
session_start();

if(isset($_POST['post_id'])) {
    $postId = $_POST['post_id'];

    // Connexion à la BD
    $dbLink = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME)
    or die('Erreur de connexion au serveur : ' . mysqli_connect_error());

    // Sélection de la base de données
    mysqli_select_db($dbLink, DB_NAME)
    or die('Erreur dans la sélection de la base : ' . mysqli_error($dbLink));

    // Vérifie si l'utilisateur a déjà liké ce post
    $query = "SELECT COUNT(*) FROM Likes WHERE post_id = $postId";

    $result = mysqli_query($dbLink, $query);

    // On vérifie si l'utilisateur est connecté
    if (isset($_SESSION['user_id'])){
        $loggedIn = $_SESSION['user_id'];
    }
    else{
        $loggedIn = false;
    }

    if ($loggedIn && mysqli_fetch_array($result)[0] == 0){
        // Ajoute une entrée dans la table Likes pour enregistrer que l'utilisateur a liké ce post
        $query = "INSERT INTO Likes (post_id, user_id) VALUES ($postId, {$_SESSION['user_id']})";
        mysqli_query($dbLink, $query);


Mon code JS jaime.js :

$(document).ready(function() {
    // Ajoute un événement "click" sur chaque bouton "J'aime"
    $('.like-button').click(function() {
        var postId = $(this).data('post-id');
        var likesSpan = $(this).siblings().first();

        // Envoie une requête AJAX pour incrémenter le nombre de likes
        $.ajax({
            type: 'POST',
            url: 'like.php',
            data: {post_id: postId},
            success: function() {
                // Met à jour l'affichage avec le nouveau nombre de likes
                var likesCount = parseInt(likesSpan.text().split(' ')[0]) + 1; //on regarde le texte qui est dans le span,
                // on le divise en plusieurs éléments en prenant un espace comme séparateur,
                // et enfin on prend le premier élément trouvé pour lui ajouter 1.
                likesSpan.text(likesCount + ' j\'aime');
            }
        });
    });
});


Merci,
Modifié par linab (27 Apr 2023 - 12:30)
Salut,

a priori ce passage là du code est faux :

// Vérifie si l'utilisateur a déjà liké ce post
    $query = "SELECT COUNT(*) FROM Likes WHERE post_id = $postId";


La tu comptes le nombre de like du post, pas si l'utilisateur a déjà liké ou pas.
Mathieuu a écrit :
Salut,

a priori ce passage là du code est faux :

// Vérifie si l'utilisateur a déjà liké ce post
    $query = "SELECT COUNT(*) FROM Likes WHERE post_id = $postId";


La tu comptes le nombre de like du post, pas si l'utilisateur a déjà liké ou pas.


Oui effectivement mais j'ai l'impression de me répéter dans les codes.

Dans listpost.php j'ai ca :

// Vérifie si l'utilisateur a aimé ce post
        if ($loggedIn) {
            $user_id = $_SESSION['user_id'];
            $like_query = "SELECT COUNT(*) AS count FROM Likes WHERE post_id=$post_id AND user_id=$user_id";
            $like_result = mysqli_query($dbLink, $like_query);
            $like_row = mysqli_fetch_assoc($like_result);
            $has_liked = ($like_row['count'] > 0);
        }

Oui ce n'est pas très grave d'avoir plusieurs fois la même vérification vu que c'est des traitements différents.

Après perso je pense que j'aurai eu tendance à faire des traitements plus simple et plus cloisonné les un des autres : like.php insert juste que tel personne à like tel post (et tu fais confiance à ta contrainte d'unicité pour ne pas avoir de doublon donc pas grand chose à vérifier)
Et de la même manière j'aurai bien vu une page unlike.php qui fait le delete de la ligne.
Et ensuite une page compteur.php qui te retourne le calcul pour un poste donné.
Modifié par Mathieuu (27 Apr 2023 - 16:58)
Mathieuu a écrit :
Oui ce n'est pas très grave d'avoir plusieurs fois la même vérification vu que c'est des traitements différents.

Après perso je pense que j'aurai eu tendance à faire des traitements plus simple et plus cloisonné les un des autres : like.php insert juste que tel personne à like tel post (et tu fais confiance à ta contrainte d'unicité pour ne pas avoir de doublon donc pas grand chose à vérifier)
Et de la même manière j'aurai bien vu une page unlike.php qui fait le delete de la ligne.
Et ensuite une page compteur.php qui te retourne le calcul pour un poste donné.


Dans mon like.php c'est déjà ce que je fais techniquement. je ne mets à jour que ma table likes en véirfiant que l'utilisateur ne l'a pas déjà liké

<?php
require_once('config.php');
session_start();

if(isset($_POST['post_id'])) {
    $postId = $_POST['post_id'];
    $userId = $_SESSION['user_id'];

    // Connexion à la BD
    $dbLink = mysqli_connect(DB_HOST, DB_USER, DB_PASS, DB_NAME)
    or die('Erreur de connexion au serveur : ' . mysqli_connect_error());

    // Sélection de la base de données
    mysqli_select_db($dbLink, DB_NAME)
    or die('Erreur dans la sélection de la base : ' . mysqli_error($dbLink));

    // Vérifie si l'utilisateur a déjà liké ce post
    $verif = 'SELECT COUNT(*) FROM Likes WHERE post_id = '.$postId.';';
    $result = mysqli_query($dbLink, $verif);

    if (!$result) {
        echo 'Erreur dans requête<br/>';
        echo 'Erreur : ' . mysqli_error($dbLink) . '<br/>';
        echo 'Requête : ' . $verif . '<br/>';
        exit();
    }

    if ($result = False){
        // Insérer un nouveau like dans la base de données
        $ajout = "INSERT INTO Likes (post_id, user_id) VALUES ('$postId', '$userId')";
        $dbresult = mysqli_query($dbLink, $ajout);
        if (!$dbresult) {
            echo 'Erreur dans requête<br/>';
            echo 'Erreur : ' . mysqli_error($dbLink) . '<br/>';
            echo 'Requête : ' . $ajout . '<br/>';
            exit();
        }

        header('Location: listpost.php');
        exit();

    }

}


Malheuresement je ne suis pas encore au unlike.php Je dois déjà faire marcher mon like...
Pour faire marcher le like il faut que tu corriges cette ligne :

 // Vérifie si l'utilisateur a déjà liké ce post
    $verif = 'SELECT COUNT(*) FROM Likes WHERE post_id = '.$postId.';';


La à partir du moment où une personne à like, tu retournes un compteur positif et plus personne ne peux like..