Mysql
 sql >> база данни >  >> RDS >> Mysql

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

За този пример, нека приемем, че гласувате за така отговорите. Това ще изисква поне три таблици:

Потребители , Отговори , Гласове

Таблицата с гласовете ще съдържа цялата история:

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

Страницата 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.";
    }
  }

}


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Symfony3 - SQLSTATE[HY000] [2002] Няма такъв файл или директория

  2. ШИРОКИ таблици mysql

  3. Използвайте заявка за избор в заявката Insert за същото име на таблица

  4. Бутони предишни/следващи?

  5. Обща грешка в MySql:2053