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

jQuery Discussion :

Système de votes


Sujet :

jQuery

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut Système de votes
    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 :

    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 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>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    // 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);
                });
            }
        });
    });
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    // Partie php : vote.php
        // connexion à la BD
        require_once('db.php');
        $session_id = $_SESSION['client_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 d'aide. Merci par avance !

  2. #2
    Rédacteur

    Avatar de danielhagnoul
    Homme Profil pro
    Étudiant perpétuel
    Inscrit en
    Février 2009
    Messages
    6 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant perpétuel
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2009
    Messages : 6 389
    Billets dans le blog
    125
    Par défaut
    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".
    Il faudra lever cette interdiction. Regarder le système de vote pour les messages de ce forum (pouce vert et pouce rouge). Chaque utilisateur peut voter et modifier son vote sur chaque message des autres utilisateurs et cela est indépendant du nombre de visites sur une discussion ou sur le forum.

    Je pratique peu le PHP et les bases de données, mais je suppose qu'il y a une table d'enregistrement des votes pour chaque message.

    Blog

    Sans l'analyse et la conception, la programmation est l'art d'ajouter des bogues à un fichier texte vide.
    (Louis Srygley : Without requirements or design, programming is the art of adding bugs to an empty text file.)

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 161
    Par défaut
    Bonjour @danielhagnoul,

    Merci d'avoir pris le temps de me répondre.
    J'ai déjà une table votes ou j'enregistre tous les votes. Malgré que je lie chaque vote à un identifiant unique attribué à chaque réponse ainsi qu'à l'identifiant de la personne connectée. Cela ne permet pas donc par exemple à une même personne de voter pour 2 réponses, par exemple si elle trouve que les 2 sont utiles.

    Cdlt,

Discussions similaires

  1. [Système] Système de vote sécurisé
    Par mathieu3392 dans le forum Langage
    Réponses: 4
    Dernier message: 22/11/2007, 14h18
  2. Système de votes
    Par Auden dans le forum Langage SQL
    Réponses: 2
    Dernier message: 23/05/2007, 13h27
  3. [AJAX] système de vote ajax
    Par sisco97 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 07/05/2007, 03h52
  4. [Système] Questions système de votes
    Par masseur dans le forum Langage
    Réponses: 2
    Dernier message: 03/10/2006, 15h47
  5. [MySQL] Système de votes (pour les membres) : cmt le créer ?
    Par yazerty dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 20/02/2006, 12h58

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