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