For dette eksempel, lad os antage, at du stemmer på så-svar. Dette kræver mindst tre tabeller:
Brugere , Svar , Stemmer
Stemmetabellen vil indeholde hele historien:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
I dette eksempel ser vi, at der er registreret to stemmer. Brugere 12 og 28 stemte begge på svar 383. Bruger 12 elskede det og tilføjede 1 til støtten. Bruger 28 kunne ikke lide det og trak 1 fra dets support.
Hver gang en bruger stemmer, bør du først tjekke, om denne bruger allerede har stemt på det pågældende spørgsmål. Hvis de har, kan du afvise yderligere forsøg på at stemme eller overskrive deres gamle stemme med en ny.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Det er et meget simpelt eksempelforespørgsel, der vil fortælle dig, om brugeren allerede har stemt eller ej. Hvis det returnerer rekorder, ved du, at de har stemt. Du kan svare med et meget flot "Undskyld, du har allerede stemt." besked, eller du kan overskrive den:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Når det er sagt, lad os se på, hvordan SO opnår dette:
Når du klikker på op-stem-pilen, affyrer SO en anmodning til en url som følgende:
http://stackoverflow.com/posts/1303528/vote/2
I denne URL kan vi se, at afstemningen bliver afgivet på opslag #1303528. Og stemmetypen er repræsenteret af 2. Disse 2 repræsenterer sandsynligvis "tilføj en". Du kan bruge en mere grundlæggende url og gå med noget som:
vote.php?answerid=383&vote=1
vote.php-siden ville have en kode, der ligner følgende:
(advarsel:brug ikke denne kode som den er. Det er ment som et eksempel, ikke 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.";
}
}
}