Para este ejemplo, supongamos que está votando por las respuestas. Esto requerirá al menos tres tablas:
Usuarios , Respuestas , Votos
La tabla de votos contendrá todo el historial:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
En este ejemplo, vemos que se han registrado dos votos. Los usuarios 12 y 28 votaron por la Respuesta 383. Al usuario 12 le encantó y agregó 1 a su apoyo. Al usuario 28 no le gustó y restó 1 de su apoyo.
Cada vez que un usuario vota, primero debe verificar si ese usuario ya votó sobre esa pregunta en particular. Si es así, puede rechazar cualquier otro intento de votar o sobrescribir su voto anterior con uno nuevo.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Esa es una consulta de ejemplo muy simple que le dirá si el usuario ya votó o no. Si devuelve registros, sabrá que han votado. Puedes responder con un muy amable "Lo siento, ya has votado". mensaje, o puede sobrescribirlo:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Dicho esto, veamos cómo SO logra esto:
Cuando hace clic en la flecha de voto positivo, SO envía una solicitud a una URL como la siguiente:
http://stackoverflow.com/posts/1303528/vote/2
En esta URL, podemos ver que el voto se está emitiendo en la publicación #1303528. Y el tipo de voto está representado por 2. Este 2 probablemente representa "agregar uno". Podrías usar una URL más básica e ir con algo como:
vote.php?answerid=383&vote=1
La página vote.php tendría un código similar al siguiente:
(advertencia:no use este código tal como está. Está destinado a ser un ejemplo, no una solución)
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.";
}
}
}