Для этого примера предположим, что вы голосуете за со-ответы. Для этого потребуется как минимум три таблицы:
Пользователи , Ответы , Голосов
Таблица голосов будет содержать всю историю:
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
Страница voice.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.";
}
}
}