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

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

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

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

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

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

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

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

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

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

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

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

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

Я бы посмотрел схему базы данных , интеграцию php- db и ajax, чтобы обновить голосование .

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