Концептуально говоря, как можно было бы написать систему достижений для веб-сайта с использованием PHP и MySQL?
Единственный реальный способ сделать это – постоянно выполнять запросы MySQL для проверки достижений и т. Д.?
Возможно, вам захочется рассмотреть вопрос о том же вопросе о мета , чтобы узнать, готов ли Джефф поделиться своими уроками, извлеченными на этой арене. Если вы это сделаете, вопрос должен быть конкретно о том, как SO подошла к проблеме. Этот вопрос, однако, является вполне актуальным вопросом для этого сайта (поскольку он спрашивает о создании нового проекта, вдохновленного тем, что было сделано на SO).
Я подозреваю, однако, что команда SO имеет задание, которое периодически запускает набор запросов для поиска новых значков для награждения, а затем присуждает их. Вот почему значки не присуждаются сразу же после того, как были приняты меры для их получения.
У вас есть два варианта и, скорее всего, их можно комбинировать:
У вас может быть задание cron, которое выполняется каждые X-минут, и работает над базой данных, глядя на каждого пользователя, и проверяет, заслуживают ли они нового значка.
Например, StackOverflow реализует это для значка Nice Answer. Каждый раз, когда он запускается, он проверяет, сколько ответов есть с +10 upvotes, и видит, нужно ли вам получить еще один значок. (Он видит 5 сообщений с 10 upvotes и 4 замечательных ответных значка, вы получаете значок). Джефф уже заявил, что это означает, что если вы получите ответ, который получит 10 голосов, затем будет отменен, а затем еще один пост получит 10 голосов, вы не получите значок.
Второй вариант – триггеры, основанные на событиях. Что действительно просто:
$badgeSystem->giveBadge("Some Badge Name", $User_ID);
Это можно использовать для событий, которые, как вы знаете, происходят. Как значок автобиографа. Скорее всего, пользователь не будет заполнять свой профиль, если кнопка отправки не нажата, поэтому сайт может просто проверить, заполнил ли пользователь все, и если они есть, и они все равно нуждаются в значке, они его получают.
Задача cron должна использоваться для действий, которые постоянно проверяются. Такие вещи, как количественные цели, такие как посещение сайта в течение 150 дней или редактирование 500 раз.
Триггер, основанный на событии, должен произойти, когда событие произойдет только в том случае, если пользователь выполнил определенное действие, например, отправив форму.
(Вероятно, вы можете использовать либо практически для любой ситуации. Триггер, основанный на событиях, дает более быструю обратную связь, хотя ..)
Другим вариантом является использование API от компании, занимающейся игровой платформой, например http://iactionable.com