Как запрограммировать систему голосования? - PullRequest
2 голосов
/ 20 августа 2009

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

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

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

Ответы [ 2 ]

12 голосов
/ 20 августа 2009

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

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

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

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.";
    }
  }

}
2 голосов
/ 20 августа 2009

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

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

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

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

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

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

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

...