sql >> Databáze >  >> RDS >> Mysql

Jak naprogramovat hlasovací systém?

V tomto příkladu předpokládejme, že hlasujete pro takové odpovědi. To bude vyžadovat alespoň tři tabulky:

Uživatelé , Odpovědi , Hlasy

Tabulka hlasování bude obsahovat celou historii:

voteid | userid | answerid | value
----------------------------------
   1   |   12   |   383    |   1
   2   |   28   |   383    |  -1  (negative number would require signed values)

V tomto příkladu vidíme, že byly zaznamenány dva hlasy. Uživatelé 12 a 28 hlasovali pro odpověď 383. Uživateli 12 se to líbilo a přidal 1 na svou podporu. Uživateli 28 se to nelíbilo a odečetl 1 od podpory.

Kdykoli uživatel hlasuje, měli byste nejprve zkontrolovat, zda daný uživatel již hlasoval pro danou konkrétní otázku. Pokud ano, můžete odmítnout jakékoli další pokusy o hlasování nebo přepsat jejich starý hlas novým.

SELECT * 
FROM votes 
WHERE (userid = 12) 
  AND (answerid = 383)

To je velmi jednoduchý příklad dotazu, který vám řekne, zda uživatel již hlasoval nebo ne. Pokud vrátí záznamy, víte, že hlasovali. Můžete odpovědět velmi milým "Promiňte, už jste hlasovali." zprávu, nebo ji můžete přepsat:

UPDATE votes 
SET value = $votevalue 
WHERE (userid = 12) 
  AND (answerid = 383)

Po tom se podívejme, jak toho SO dosáhne:

Když kliknete na šipku pro hlasování nahoru, SO odešle požadavek na adresu URL, jako je tato:

    http://stackoverflow.com/posts/1303528/vote/2

Na této adrese URL vidíme, že se hlasuje o příspěvku #1303528. A typ hlasování je reprezentován 2. Tato 2 pravděpodobně představuje „přidat jeden“. Můžete použít základnější adresu URL a použít něco jako:

    vote.php?answerid=383&vote=1

Stránka vote.php by měla kód podobný následujícímu:

(varování:nepoužívejte tento kód tak, jak je. Má sloužit jako příklad, nikoli jako řešení)

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. Jak snadno nasadit TimescaleDB

  2. Agregát produktů v PostgreSQL

  3. Maximální velikost UNIQUE indexu v MySQL

  4. Jak mohu do tabulky přidat omezení ON DELETE?