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