Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak zaprogramować system głosowania?

W tym przykładzie załóżmy, że głosujesz na tak-odpowiedzi. Będzie to wymagało co najmniej trzech tabel:

Użytkownicy , Odpowiedzi , Głosy

W tabeli głosów będzie przechowywana cała historia:

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

W tym przykładzie widzimy, że zostały zarejestrowane dwa głosy. Zarówno użytkownicy 12, jak i 28 głosowali na odpowiedź 383. Użytkownikowi 12 podobało się to i dodał 1 do swojego poparcia. Użytkownikowi 28 się to nie podobało i odjął 1 od jego obsługi.

Za każdym razem, gdy użytkownik głosuje, należy najpierw sprawdzić, czy ten użytkownik już głosował na to konkretne pytanie. Jeśli tak, możesz odrzucić dalsze próby głosowania lub zastąpić ich stary głos nowym.

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

To bardzo proste przykładowe zapytanie, które powie Ci, czy użytkownik już zagłosował, czy nie. Jeśli zwróci rekordy, wiesz, że głosowali. Możesz odpowiedzieć bardzo ładnym „Przepraszam, już zagłosowałeś”. wiadomość lub możesz ją zastąpić:

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

Mając to, spójrzmy, jak SO to osiąga:

Po kliknięciu strzałki głosowania w górę SO wysyła żądanie do adresu URL, jak poniżej:

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

W tym adresie URL widzimy, że głos jest oddany w poście #1303528. A typ głosu jest reprezentowany przez 2. To 2 prawdopodobnie oznacza „dodaj jeden”. Możesz użyć bardziej podstawowego adresu URL i użyć czegoś takiego:

    vote.php?answerid=383&vote=1

Strona vote.php miałaby kod podobny do następującego:

(ostrzeżenie:nie używaj tego kodu tak, jak jest. Ma być przykładem, a nie rozwiązaniem)

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. Jak znaleźć kombinacje wierszy>kolumn za pomocą Cross Join? [SQL]

  2. MySQL:Nieprawidłowe dane GIS dostarczone do funkcji st_geometryfromtext

  3. Jak sprawić, by dostęp do bazy danych za pomocą Hibernate JPA był bezpieczny wątkowo?

  4. mysql Wiele kluczy obcych w tabeli do tego samego klucza podstawowego

  5. Kolejny błąd UnicodeEncodeError podczas używania metody pandy to_sql z MySQL