Nehmen wir für dieses Beispiel an, Sie stimmen über So-Antworten ab. Dazu sind mindestens drei Tabellen erforderlich:
Nutzer , Antworten , Stimmen
Die Abstimmungstabelle enthält den gesamten Verlauf:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
In diesem Beispiel sehen wir, dass zwei Stimmen erfasst wurden. Benutzer 12 und 28 stimmten beide für Antwort 383 ab. Benutzer 12 war begeistert und fügte 1 zu seiner Unterstützung hinzu. Benutzer 28 mochte es nicht und zog 1 von seiner Unterstützung ab.
Jedes Mal, wenn ein Benutzer abstimmt, sollten Sie zuerst prüfen, ob dieser Benutzer bereits über diese bestimmte Frage abgestimmt hat. Wenn dies der Fall ist, können Sie alle weiteren Stimmversuche ablehnen oder ihre alte Stimme mit einer neuen überschreiben.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Das ist eine sehr einfache Beispielabfrage, die Ihnen sagt, ob der Benutzer bereits abgestimmt hat oder nicht. Wenn es Datensätze zurückgibt, wissen Sie, dass sie gewählt haben. Sie können mit einem sehr netten „Entschuldigung, Sie haben bereits abgestimmt“ antworten. Nachricht, oder Sie können sie überschreiben:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Sehen wir uns an, wie SO dies erreicht:
Wenn Sie auf den Abstimmpfeil nach oben klicken, sendet SO eine Anfrage an eine URL wie die folgende:
http://stackoverflow.com/posts/1303528/vote/2
In dieser URL können wir sehen, dass die Stimme für Beitrag Nr. 1303528 abgegeben wird. Und der Abstimmungstyp wird durch 2 dargestellt. Diese 2 steht wahrscheinlich für „eins hinzufügen“. Sie könnten eine einfachere URL verwenden und so etwas wie:
verwendenvote.php?answerid=383&vote=1
Die Seite vote.php hätte Code ähnlich dem folgenden:
(Warnung:Verwenden Sie diesen Code nicht unverändert. Er soll ein Beispiel sein, keine Lösung)
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.";
}
}
}