Как запрограммировать систему голосования?

Я только начинаю изучать php. Я даю себе микропроекты, чтобы подтолкнуть себя.

Пока у меня есть база данных MYSQL, созданная через форму php. Одна колонка для кармы. У меня есть значения таблицы базы данных, отображаемые в таблице html, и в конце каждой строки я хотел бы щелкнуть гиперссылку, скажем, знак плюс, чтобы увеличить уровень кармы этой строки на 1. Затем знак плюс ушел бы.

Я должен, чтобы каждая строка имела целое число автоматического увеличения в качестве первичного ключа.


person Nir Levy    schedule 20.08.2009    source источник
comment
Где настоящий вопрос? Ну, может быть, вы хотите AJAX.   -  person Havenard    schedule 20.08.2009


Ответы (2)


Для этого примера предположим, что вы голосуете за так-ответы. Для этого потребуется как минимум три таблицы:

Пользователи, Ответы, Голосования

Таблица голосов будет хранить всю историю:

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
comment
Также может быть хорошей идеей кэшировать подсчет голосов, особенно для популярных вопросов. - person Dana the Sane; 20.08.2009

Лично мне нравится ответ Джонатана.

Однако, если вы чувствуете, что вам может понадобиться дополнительная информация, я мог бы помочь.

В качестве небольшого побочного проекта я попытался создать базу данных котировок наподобие bash.org для своего университета.
Она была разработана с использованием MySql и PHP, в ней есть публикация/голосование, очень похожие на то, что вы пытаетесь сделать.
Это ни в коем случае не хорошо разработанное веб-приложение. Однако это может помочь вам двигаться в правильном направлении.

Тестовый сайт: ссылка (будьте осторожны!)

Код на GitHub: ссылка

Я бы взглянул на схему базы данных , php-db-integration и ajax для обновления голосования.

Код довольно прост и прямолинеен. Следует отметить, что «filter_input». Эти функции взяты из библиотеки PHP для санации вводимых пользователем данных для предотвращения SQL-инъекций.

person Brian Gianforcaro    schedule 20.08.2009