Reddit式投票系统,如何避免重复投票?

时间:2015-04-23 11:15:45

标签: php mysql voting

我有一张存储帖子的表格。每个帖子都有id,标题,内容和分数。目前,你可以喜欢一个帖子,如果你不喜欢它,它的分数会增加和减少。

现在我不明白的事情:如何避免用户多次投票?当然,他们可以再次刷新和投票。我已经阅读了一些存储cookie等的文章,但你不能只是禁用cookie或清除它们并再次投票吗?

我原本以为你必须存储已经投票的人,或者更确切地说是投票人的身份证。但是,我似乎无法想象我会怎么做呢?我会将选民的身份证存储在他们投票的帖子中,还是其他什么?

3 个答案:

答案 0 :(得分:0)

您需要额外的表格posts_vote或其他内容。将字段user_id和post_id放入其中。如果用户对帖子进行投票,则在此表中插入两个ID。如果用户投票,请找到该记录并将其删除。

答案 1 :(得分:0)

您可以将投票记录存储在单独的表格中。

投票历史(备选方案1)

  • voter_id
  • post_id
  • 行动(upvote / downvote)
  • created_at

投票历史(备选方案2)

  • voter_id
  • POST_ID
  • 点(此字段可以获得downvote的负数)
  • created_at

因此,当您拥有该特定记录时,您可以检查用户之前是否已投票支持该帖子,并决定增加/减少实际帖子表中的点数。

将来投票历史记录表会增长并导致性能问题,您可以使用redis / memcached / etc同步历史记录。并使用这些存储技术更快地完成检查。

同样使用cookie可以帮助您在不点击服务器的情况下禁用投票,并减少对Web服务器的请求数量。 您可以将已投票的帖子ID存储在Cookie中并使用javascript进行检查,如果用户已经投票,请不要执行此操作。

因此,您可以使用两个图层来检查用户是否已投票。

  1. Cookie和javascript
  2. 服务器端持久数据
  3. 如果第一个失败(用户可以通过更改浏览器或清除cookie来绕过此选项),它会回退到第二个,并且您不允许在服务器端进行投票。

答案 2 :(得分:0)

就像一个例子: 假设您有表 public void Export(string filename, string name, string value, DataGridView dg, int iRows) { oWord = null; object missing = System.Reflection.Missing.Value; object lineNo = missing; // Get word instance. ExportData.GetWordInstance(ref oWord); if (oWord != null) { try { int iPos = 1; oDocs = oWord.Documents; // Open document. object fileName = DirectoryFiles.OpenFile(filename); object readOnly = false; object isVisible = true; object oMissing = Type.Missing; oDoc = oDocs.Open(ref fileName, ref oMissing, false, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing, ref oMissing); oBookmarks = oDoc.Bookmarks; if (name == "bookmarkPositions") { int rows = dg.Rows.Count * 3; object oEndOfDoc = "bookmarkPositions"); Word.Table oTable; Word.Range wrdRng = oDoc.Bookmarks.Item(ref oEndOfDoc).Range; oTable = oDoc.Tables.Add(wrdRng, rows + 1, 5, ref oMissing, ref oMissing); // .... posts。然后你可以有votes作为查找表。

目视: enter image description here