För det här exemplet, låt oss anta att du röstar på så-svar. Detta kräver minst tre tabeller:
Användare , Svar , röster
Rösttabellen kommer att innehålla all historik:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
I det här exemplet ser vi att två röster har registrerats. Användare 12 och 28 röstade båda på svar 383. Användare 12 älskade det och lade till 1 till sitt stöd. Användare 28 gillade det inte, och subtraherade 1 från dess stöd.
När en användare röstar bör du först kontrollera om den användaren redan har röstat på just den frågan. Om de har det kan du avvisa ytterligare försök att rösta eller skriva över deras gamla röst med en ny.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Det är en mycket enkel exempelfråga som kommer att berätta om användaren redan har röstat eller inte. Om det ger rekord vet du att de har röstat. Du kan svara med ett mycket trevligt "Förlåt, du har redan röstat." meddelande, eller så kan du skriva över det:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
När det är sagt, låt oss titta på hur SO åstadkommer detta:
När du klickar på upp-rösta-pilen avfyrar SO en begäran till en webbadress som följande:
http://stackoverflow.com/posts/1303528/vote/2
I den här webbadressen kan vi se att omröstningen görs på inlägg #1303528. Och rösttypen representeras av 2. Dessa 2 representerar sannolikt "lägg till en". Du kan använda en mer grundläggande url och gå med något som:
vote.php?answerid=383&vote=1
Sidan vote.php skulle ha kod som liknar följande:
(varning:använd inte den här koden som den är. Den är tänkt att vara ett exempel, inte en lösning)
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.";
}
}
}