Mysql
 sql >> Database >  >> RDS >> Mysql

Come programmare un sistema di votazione?

Per questo esempio, supponiamo che tu stia votando su così-risposte. Ciò richiederà almeno tre tabelle:

Utenti , Risposte , Voti

La tabella dei voti conterrà tutta la cronologia:

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

In questo esempio, vediamo che sono stati registrati due voti. Gli utenti 12 e 28 hanno entrambi votato per la risposta 383. L'utente 12 l'ha adorato e ha aggiunto 1 al suo supporto. All'utente 28 non è piaciuto e ha sottratto 1 dal suo supporto.

Ogni volta che un utente vota, dovresti prima controllare se quell'utente ha già votato su quella particolare domanda. In tal caso, puoi rifiutare ulteriori tentativi di voto o sovrascrivere il vecchio voto con uno nuovo.

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

Questa è una query di esempio molto semplice che ti dirà se l'utente ha già votato o meno. Se restituisce record, sai che hanno votato. Puoi rispondere con un simpatico "Scusa, hai già votato". messaggio, oppure puoi sovrascriverlo:

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

Detto questo, diamo un'occhiata a come SO realizza questo:

Quando fai clic sulla freccia di voto positivo, SO invia una richiesta a un URL come il seguente:

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

In questo URL, possiamo vedere che il voto viene espresso sul post #1303528. E il tipo di voto è rappresentato da 2. Questo 2 probabilmente rappresenta "aggiungi uno". Potresti usare un URL più semplice e andare con qualcosa come:

    vote.php?answerid=383&vote=1

La pagina vote.php avrebbe un codice simile al seguente:

(attenzione:non utilizzare questo codice così com'è. Vuole essere un esempio, non una soluzione)

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

}