Partage
  • Partager sur Facebook
  • Partager sur Twitter

Système de votes

    24 juillet 2016 à 21:21:59

    Bonjour,
    Je suis en train de faire un système de votes pour liker ou disliker un contenu. Mon contenu est la réponse à une question posé par un utlisateur. L'utilisateur qui a posé sa question peut liker ou disliker la ou les réponse(s) obtenue(s) par d'autres utilisateurs. Un autre utilisateur peut liker ou disliker une ou plusieurs réponse(s) s'il la trouve pertinente ou non.
    J'utilise 3 tables de BD en guise d’exemple : users, reponses, votes

    -- Table users :

    user_id
    user_name

    -- Table réponses :

    reponse_id
    reponse_txt
    user_id (fk)

    -- Table votes :

    vote_id
    vote_like (int)
    vote_dislike (int)
    user_id (fk)
    reponse_id (fk)

    Mon système de vote fonctionne quand je suis connecté et quand je clic sur like ou dislike. Mon problème est le fait que quand j'ai plusieurs réponses je ne peux pas liker ou disliker plus d'une réponse avec une même session utilisateur. Et même quand je change de session, je ne peux pas liker ou dislike car j'ai toujours le message "vous avez voté ce contenu auparavant".

    Or j'aimerais que d'autres utilisateurs connectés puissent voter. Si un utilisateur n'est pas connecté on le lui demande. Voici le résumé de mon code ci-dessous :

    <!-- Partie HTML boutons like - dislike -->
    <div class="vote" id="<?=isset($row['reponse_id'])?$row['reponse_id']:'';?>">
         <div class="vote_btn">
               <div class="btn_like"><img src="thumbs-up.png" alt="like"></div><span class="votes_like">0</span>
          </div>
          <div class="vote_btn">
               <div class="btn_dislike"><img src="thumb-down.png" alt="dislike"></div><span class="votes_dislike">0</span>
          </div>
    </div>
    // Partie jquery
    $(document).ready(function() {
        $.each($('.vote'), function(){
            var id = $(this).attr("id");
            //console.log(id);
            post_d = {'id':id, 'vote':'fetch'};
            $.post('vote.php', post_d,  function(response) {
                $('#'+id+' .votes_like').text(response.vote_like);
                $('#'+id+' .votes_dislike').text(response.vote_dislike);
            },'json');
        });
        $(".vote .vote_btn").click(function(e) {
            var click_button = $(this).children().attr('class');
            var id = $(this).parent().attr("id");
            if (click_button==='btn_dislike') {
                post_d = {'id':id, 'vote':'dislike'};
                $.post('vote.php', post_d, function(data) {
                    $('#'+id+' .votes_dislike').text(data);
                    alert("Merci de votre vote !");
                }).fail(function(err) {
                    alert(err.statusText);
                });
            } else if(click_button==='btn_like') {
                post_d = {'id':id, 'vote':'like'};
                $.post('vote.php', post_d, function(data) {
                    $('#'+id+' .votes_like').text(data);
                    alert("Merci de votre vote !");
                }).fail(function(err) {
                    alert(err.statusText);
                });
            }
        });
    });
    // Partie php : vote.php
        // connexion à la BD
        require_once('db.php');
        $session_id = $_SESSION['user_id'];
        if($_POST) {
            $vote_type = trim($_POST["vote"]);
            $reponse_id = filter_var(trim($_POST["id"]), FILTER_SANITIZE_STRING, FILTER_FLAG_STRIP_LOW | FILTER_FLAG_STRIP_HIGH);
            if(!isset($_SERVER['HTTP_X_REQUESTED_WITH']) AND strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) != 'xmlhttprequest') {
                die();
            }
            $sql = "SELECT COUNT(*) AS nbr FROM votes WHERE reponse_id='$reponse_id' AND user_id='$session_id'";
            $req = $db->prepare($sql);
            $req->execute() or die(print_r($db->errorInfo()));
            $query = $req->fetch(PDO::FETCH_ASSOC);
            switch ($vote_type) {
                case 'like':
                    if ($query['nbr'] >= 1) {
                        header('HTTP/1.1 500 Vous avez vote auparavant !');
                        exit();
                    } else {
                        $sql = "
                              SELECT vote_like
                              FROM votes v
                              INNER JOIN reponses rp
                              ON rp.reponse_id = v.reponse_id
                              WHERE v.reponse_id<>'$reponse_id'
                              AND user_id='$session_id'
                        ";
                        $req = $db->prepare($sql);
                        $req->execute() or die(print_r($db->errorInfo()));
                        $rows1 = $req->fetch(PDO::FETCH_ASSOC);   
                        if($rows1) {
                            $sql = "
                                UPDATE votes v
                                SET vote_like=vote_like+1
                                WHERE NOT EXISTS (SELECT reponse_id FROM reponse rp WHERE rp.reponse_id = v.reponse_id)
                                AND user_id='$session_id'
                            ";
                            $req = $db->prepare($sql);
                            $req->execute() or die(print_r($db->errorInfo()));
                        } else {
                            $sql = "INSERT INTO votes (user_id, reponse_id, vote_like) VALUES ('$session_id', '$reponse_id', 1)";
                            $req = $db->prepare($sql);
                            $req->execute() or die(print_r($db->errorInfo()));
                        }
                    }
                    echo ($rows1["vote_like"]+1);
                    break;
                case 'dislike':
                    if ($query['nbr'] >= 1) {
                        header('HTTP/1.1 500 Vous avez vote ce contenu auparavant !');
                        exit();
                    } else {
                        $sql = "SELECT vote_dislike FROM votes WHERE reponse_id='$reponse_id'";
                        $req = $db->prepare($sql);
                        $req->execute() or die(print_r($db->errorInfo()));
                        $rows2 = $req->fetch(PDO::FETCH_ASSOC);
                        if ($rows2["vote_dislike"]) {
                            $sql = "UPDATE votes SET vote_dislike=vote_dislike+1 WHERE reponse_id='$reponse_id'";
                            $req = $db->prepare($sql);
                            $req->execute() or die(print_r($db->errorInfo()));
                        } else {
                            $sql = "INSERT INTO votes (user_id, reponse_id, vote_dislike) VALUES ('$session_id', '$reponse_id', 1)";
                            $req = $db->prepare($sql);
                            $req->execute() or die(print_r($db->errorInfo()));
                        }
                    }
                    echo ($rows2["vote_dislike"]+1);
                    break;
                case 'fetch':
                    $sql = "SELECT vote_like, vote_dislike FROM votes WHERE reponse_id='$reponse_id'";
                    $req = $db->prepare($sql);
                    $req->execute() or die(print_r($db->errorInfo()));
                    $rows3 = $req->fetch(PDO::FETCH_ASSOC);
                    $vote_like = ($rows3["vote_like"])?$rows3["vote_like"]:0;
                    $vote_dislike = ($rows3["vote_dislike"])?$rows3["vote_dislike"]:0;
                    $env_rep = array('vote_like'=>$vote_like, 'vote_dislike'=>$vote_dislike);
                    echo json_encode($env_rep);
                    break;
            }
        }

    J'aurais besoin d'aide. Merci par avance !



    -
    Edité par Marco000086 24 juillet 2016 à 21:25:46

    • Partager sur Facebook
    • Partager sur Twitter

    Système de votes

    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
    • Editeur
    • Markdown