Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment programmer un système de vote ?

Pour cet exemple, supposons que vous votiez sur des réponses. Cela nécessitera au moins trois tables :

Utilisateurs , Réponses , Votes

La table des votes contiendra tout l'historique :

voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)

Dans cet exemple, on voit que deux votes ont été enregistrés. Les utilisateurs 12 et 28 ont tous deux voté sur la réponse 383. L'utilisateur 12 l'a adorée et a ajouté 1 à son support. L'utilisateur 28 n'a pas aimé et a soustrait 1 à son support.

Chaque fois qu'un utilisateur vote, vous devez d'abord vérifier si cet utilisateur a déjà voté sur cette question particulière. S'ils l'ont fait, vous pouvez rejeter toute nouvelle tentative de vote ou remplacer leur ancien vote par un nouveau.

SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)

C'est un exemple de requête très simple qui vous dira si l'utilisateur a déjà voté ou non. S'il renvoie des enregistrements, vous savez qu'ils ont voté. Vous pouvez répondre par un très gentil "Désolé, vous avez déjà voté". message, ou vous pouvez le remplacer :

UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)

Cela dit, regardons comment SO y parvient :

Lorsque vous cliquez sur la flèche de vote positif, SO lance une requête vers une URL comme celle-ci :

    http://stackoverflow.com/posts/1303528/vote/2

Dans cette URL, nous pouvons voir que le vote est exprimé sur le message #1303528. Et le type de vote est représenté par 2. Ce 2 représente probablement "ajouter un". Vous pouvez utiliser une URL plus basique et utiliser quelque chose comme :

    vote.php?answerid=383&vote=1

La page vote.php aurait un code similaire au suivant :

(avertissement :n'utilisez pas ce code tel quel. Il est censé être un exemple, pas une solution)

if ($_GET) {

  $userid   = $_SESSION["userid"]; // assumes the user is logged in via SESSIONS
  $answerid = $_GET["answerid"];
  $votetype = $_GET["vote"];

  $query = "SELECT * 
            FROM votes 
            WHERE (userid = {$userid}) 
              AND (answerid = {$answerid})";

  $result = mysql_query($query) or die(mysql_error());

  if (mysql_num_rows($result) > 0) {
    # User has voted
    print "Sorry, you are only allowed one vote.";
  } else {
    # User has not voted, cast the vote
    $query = "INSERT INTO votes (userid, answerid, votevalue)
              VALUES({$userid},{$answerid},{$vote})";
    $result = mysql_query($query) or die(mysql_error());
    if (mysql_affected_rows($result) > 0) {
      print "Your vote has been recorded.";
    }
  }

}