Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como programar um sistema de votação?


Para este exemplo, vamos supor que você está votando nas respostas. Isso exigirá pelo menos três tabelas:

Usuários , Respostas , Votos

A tabela de votos conterá todo o histórico:
voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)

Neste exemplo, vemos que dois votos foram registrados. Os usuários 12 e 28 votaram na Resposta 383. O usuário 12 adorou e adicionou 1 ao suporte. O usuário 28 não gostou e subtraiu 1 de seu suporte.

Sempre que um usuário votar, você deve primeiro verificar se esse usuário já votou nessa questão específica. Em caso afirmativo, você pode rejeitar quaisquer outras tentativas de voto ou substituir o voto antigo por um novo.
SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)

Essa é uma consulta de exemplo muito simples que lhe dirá se o usuário já votou ou não. Se ele retornar registros, você sabe que eles votaram. Você pode responder com um "Desculpe, você já votou". mensagem, ou você pode sobrescrevê-la:
UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)

Dito isso, vamos ver como o SO faz isso:


Quando você clica na seta de votação, o SO dispara uma solicitação para um URL como o seguinte:
    http://stackoverflow.com/posts/1303528/vote/2

Neste URL, podemos ver que o voto está sendo lançado na postagem #1303528. E o tipo de voto é representado por 2. Este 2 provavelmente representa "adicionar um". Você pode usar um URL mais básico e usar algo como:
    vote.php?answerid=383&vote=1

A página vote.php teria um código semelhante ao seguinte:

(aviso:não use este código como está. Ele é um exemplo, não uma solução)
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.";
    }
  }

}