sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo programar un sistema de votaciones?

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

}