За този пример, нека приемем, че гласувате за така отговорите. Това ще изисква поне три таблици:
Потребители , Отговори , Гласове
Таблицата с гласовете ще съдържа цялата история:
voteid | userid | answerid | value
----------------------------------
1 | 12 | 383 | 1
2 | 28 | 383 | -1 (negative number would require signed values)
В този пример виждаме, че са записани два гласа. Потребители 12 и 28 гласуваха за отговор 383. Потребител 12 го хареса и добави 1 към своята подкрепа. Потребител 28 не го хареса и извади 1 от поддръжката му.
Всеки път, когато потребител гласува, първо трябва да проверите дали този потребител вече е гласувал по този конкретен въпрос. Ако имат, можете да отхвърлите всички по-нататъшни опити за гласуване или да презапишете стария им вот с нов.
SELECT *
FROM votes
WHERE (userid = 12)
AND (answerid = 383)
Това е много проста примерна заявка, която ще ви каже дали потребителят вече е гласувал или не. Ако върне записи, знаете, че са гласували. Можете да отговорите с много хубаво „Съжалявам, вие вече гласувахте“. съобщение или можете да го презапишете:
UPDATE votes
SET value = $votevalue
WHERE (userid = 12)
AND (answerid = 383)
Като казахме това, нека да видим как SO постига това:
Когато щракнете върху стрелката за гласуване нагоре, SO задейства заявка към URL като следния:
http://stackoverflow.com/posts/1303528/vote/2
В този URL можем да видим, че се гласува за публикация #1303528. И типът гласуване е представен от 2. Това 2 вероятно представлява „добавяне на едно“. Бихте могли да използвате по-основен URL адрес и да използвате нещо като:
vote.php?answerid=383&vote=1
Страницата vote.php ще има код, подобен на следния:
(предупреждение:не използвайте този код такъв, какъвто е. Той е предназначен да бъде пример, а не решение)
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.";
}
}
}