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.";
}
}
}