像这里的stackoverflow在PHP中的成就系统?

twe*_*ypi 8 php web

从概念上讲,如何使用PHP和MySQL为网站编写成就系统?

这样做的唯一真正方法是不断地进行MySQL查询以测试成就等吗?

Tyl*_*ter 15

您有两种选择,最有可能将它们组合在一起:

您可以拥有一个每X分钟运行一次的cron-job,并在数据库上运行,查看每个用户并检查它们是否值得拥有新徽章.

例如,StackOverflow为Nice Answer徽章实现了这一点.每次运行时,它都会检查您拥有+10个投票的答案数量,并查看是否需要获得另一个徽章.(它看到5个帖子有10个upvotes和4个Nice Answer Badges,你会得到一个徽章).杰夫已经表示,这意味着如果你得到一个得到10票,然后投票,然后另一个帖子获得10票的答案,你就不会获得徽章.

第二个选项是基于事件的触发器.这真的很简单:

$badgeSystem->giveBadge("Some Badge Name", $User_ID);
Run Code Online (Sandbox Code Playgroud)

这可用于您知道正在发生的事件.就像Autobiographer徽章一样.除非按下提交按钮,否则用户将无法填写他的个人资料,因此网站可以检查用户是否填写了整个内容,如果他们有,并且他们仍然需要徽章,他们就会得到它.

cron-job应该用于经常检查的操作.像量化目标,如访问网站150天,或编辑500次.

只有当用户执行特定操作(例如提交表单)时,才会发生基于事件的触发器.

(你几乎可以在任何情况下使用它.基于事件的触发器可以提供更快的反馈..)


pka*_*ing 1

您可能需要考虑在meta上提出类似的问题,看看Jeff是否愿意分享他在这个领域学到的经验教训。如果你这样做,问题应该具体是关于SO解决问题的方式。 然而,这个问题对于这个网站来说是一个完全有效的问题(因为它询问的是创建一个新项目,灵感来自于SO上所做的事情)。

不过,我怀疑 SO 团队的工作是定期运行一组查询来寻找要授予的新徽章,然后授予它们。这就是为什么在采取行动获得徽章后不会立即授予徽章的原因。

  • 这**不**属于元数据 (20认同)
  • 不,我并不是说这个问题属于元。我的意思是,向 SO 团队询问在开发 SO 时学到的见解可能是这个问题的一个合适的姊妹问题。我对此进行了补充说明。 (3认同)