Laten we voor dit voorbeeld aannemen dat u op zo-antwoorden stemt. Hiervoor zijn minimaal drie tabellen nodig:
Gebruikers , Antwoorden , Stemmen
De stemtabel bevat de hele geschiedenis:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
In dit voorbeeld zien we dat er twee stemmen zijn geregistreerd. Gebruikers 12 en 28 stemden allebei op antwoord 383. Gebruiker 12 vond het geweldig en voegde 1 toe aan zijn ondersteuning. Gebruiker 28 vond het niet leuk en trok 1 af van zijn ondersteuning.
Telkens wanneer een gebruiker stemt, moet u eerst controleren of die gebruiker al op die specifieke vraag heeft gestemd. Als dat het geval is, kunt u verdere pogingen om te stemmen afwijzen of hun oude stem overschrijven met een nieuwe.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Dat is een heel eenvoudige voorbeeldquery die u zal vertellen of de gebruiker al heeft gestemd of niet. Als het records teruggeeft, weet je dat ze hebben gestemd. Je kunt reageren met een heel aardig "Sorry, je hebt al gestemd." bericht, of u kunt het overschrijven:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Dat gezegd hebbende, laten we eens kijken hoe SO dit bereikt:
Wanneer u op de pijl omhoog klikt, stuurt SO een verzoek naar een url zoals de volgende:
http://stackoverflow.com/posts/1303528/vote/2
In deze URL kunnen we zien dat de stem wordt uitgebracht op post #1303528. En het stemtype wordt weergegeven door 2. Deze 2 staat waarschijnlijk voor 'een toevoegen'. Je zou een meer basale url kunnen gebruiken, en zoiets als:
vote.php?answerid=383&vote=1
De vote.php-pagina zou een code hebben die lijkt op de volgende:
(waarschuwing:gebruik deze code niet zoals hij is. Het is bedoeld als voorbeeld, niet als oplossing)
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.";
}
}
}