sql >> データベース >  >> RDS >> Mysql

投票システムをプログラムする方法は?

    この例では、そう答えに投票していると仮定しましょう。これには、少なくとも3つのテーブルが必要です。

    ユーザー回答投票

    投票テーブルにはすべての履歴が保持されます:

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

    この例では、2つの投票が記録されていることがわかります。ユーザー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は、「1を追加」を表す可能性があります。より基本的な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. Enterprise Manager AppforGrafanaを使用してOEMをGrafanaに接続します

    2. OracleBulkCopyメモリリーク(OutOfMemory例外)

    3. MySQL-CASEで複数のWHEN条件を組み合わせる

    4. JPAを使用してマッピングしながらmysqlで文字列の長さを増やす方法