За последние 24 часа нас посетили 22593 программиста и 1017 роботов. Сейчас ищут 770 программистов ...

Хочу сделать очки и их прибавление, спустя 24 часов после регистрации пользователя.

Тема в разделе "PHP для новичков", создана пользователем Kory, 27 дек 2019.

  1. Kory

    Kory Новичок

    С нами с:
    27 дек 2019
    Сообщения:
    19
    Симпатии:
    1
    Привет. Хочу сделать очки, которые будут у пользователя и чтобы они прибавлялись по одному спустя 24 часа после регистрации.

    Например, пользователь зарегистрировался и у него 0 очков, но спустя 24 часа после регистрации 1 и так каждый день до бесконечности.

    Подскажите, пожалуйста, как можно это реализовать, скинув нужные книги или ещё что-то, не знаю.
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Гуглить
    операции с датой временем в PHP
    операции с датой временем в MySQL
    --- Добавлено ---
    Всё, что тебе нужно знать это сколько дней прошло с указанной даты. Научись это вычислять, для этого надо чуть-чуть узнать про конкретный язык, на котором будешь делать.
     
  3. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Самая простая реализация это:

    1. Написать скрипт, который будет при обращении к нему увеличивать очки всех пользователей на единицу.

    2. Раз в сутки, в полночь (непременно в полночь!) запускать этот скрипт с помощью его величества Crontab: https://help.ubuntu.ru/wiki/cron

    всё
     
  4. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Это самая дебильная реализация.
     
    miketomlin нравится это.
  5. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, ему чужие посты ЧСВ не позволяет читать. Или он уже успел отправить artoodetoo в ЧС :)
    --- Добавлено ---
    @Kory, тебе в первом посте написали, что нужно просто посчитать кол-во суток с момента регистрации, время которой, естественно, нужно запоминать. При отдаче страницы ты вычисляешь это кол-во, ну а на клиенте дополнительно можешь запускать счетчик на JS, если нужна интерактивность.
     
  6. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @Kory, тебе @artoodetoo уже подсказал правильный вариант.
    текущая дата (timestamp) - дата регистрации (timestamp) / (60*60*24) = количество очков (если надо можно округлить до целого)
    вот и вся математика
     
    qdevelopment нравится это.
  7. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    У тебя уже есть пользователи, поэтому сначала нужно всем (кто соответствует требованиям) выдать хотя бы по одному очку (если это необходимо).
    Код (Text):
    1. UPDATE `users` SET `points` = `points` +1 WHERE `date_reg` >  ( UNIX_TIMESTAMP() - 86400 );  
    Либо выдать всем кол-во очков равное кол-ву суток с момента регистрации, Valick подсказал как.



    По хорошему, нужно записывать время, когда нужно выдавать следующий бонус (добавлять очки) конкретному пользователю.

    Можешь добавить поле при регистрации `last_bonus` и записывать текущее время + сутки.
    В итоге запрос может выглядеть так
    Код (Text):
    1.  
    2. UPDATE `users` SET `last_bonus` = ( UNIX_TIMESTAMP()  + 86400 ), `points` = `points` +1 WHERE `last_bonus` <  UNIX_TIMESTAMP();
    last_bonus = записываешь текущее время + 86400 (сутки)
    points = кол-во очков(бонусов)

    Все это дело можно запихнуть в крон-задачу, если погрешность выдачи бонусов в виде 1-5 минут не критична.
    --- Добавлено ---
    50 клиентов = 50 счетчиков? "Хороший" совет.
    И просто посчитать время с момента регистрации не решит проблему, когда нужно каждые сутки выдавать эти бонусы.
     
  8. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @lastdays, ты немного отвлекаешся от тз. Речь о том как начислять по одному очку в сутки с момента регистрации. Кроме таймстампа момента регистрации для этого ничего не надо.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @lastdays, совет хороший. Какие 50 счетчиков?

    А вот по поводу «крон-задачи» и т.п. Валик уже высказался. ТС ничего не писал про трату бонусов и т.п. Так что пока это просто статус.
    --- Добавлено ---
    P.S. Даже если очки нужно будет тратить, можно просто завести поле «потрачено».
     
    qdevelopment и Valick нравится это.
  10. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, именно об этом речь.

    @lastdays, про трату очков не было ни слова. И даже забегая вперёд если речь зайдёт об оптимизации, крон можно использовать для обхода всей БД типа аля кеш для каких-то специфических выборок типа рейтинга и тд. Но ни в коем случае для начисления каких-либо очков. Грубо говоря если скрипт крона запустить два и более раз подряд с учётом суточного интервала, то состояние БД ничем не должно отличаться хоть запускай до посинения. Иными словами крон должен брать информацию из БД обрабатывать и складывать обратно в БД ничего не добавляя от себя.
     
    #10 Valick, 28 дек 2019
    Последнее редактирование: 28 дек 2019
    artoodetoo нравится это.
  11. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    А если вспомнить про тестирование и воспроизводимость результатов, бекапы/ресторы, перенос данных с продакшена на локалку...
    Дабавление каждый день по крону внесёт только путаницу в которой фиг разберёшся. Не надо так делать. Это дорого во всех отношениях.
     
    qdevelopment и Valick нравится это.
  12. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    это самое простое решение, пусть начнет с этого, дальше будет постепенно усложнять

    обучение должно идти от победы к победе

    дай новичку победить в малом, и постепенно он победит во всем остальном

    это только Елисеев первым словом вместо "мама" произнес "полиморфизм" - а всем остальным приходится учиться :(
     
  13. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    - Здравствуйте, мне нужно крутить шурупы, как это сделать?
    - Чувак, возьми отвертку, потом если надо докупишь шуруповерт
    Всё остальные:
    - Какая блин отвертка, ты дурак? Шуруп можно просто захерачить молотком!

    Жесть

    p.s. ТС хочет начислять очки раз в день. "Очки" явно подразумевают под собой отдельную сущность, а вовсе не количество дней с момента регистрации. Ещё раз - жесть. Форум окончательно превратился в какое-то говно.
     
    mkramer и Roman __construct нравится это.
  14. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @romach, только не молотком, а токарным станком.
    --- Добавлено ---
    Значит, я вас не понял :)
    --- Добавлено ---
    Это действительно жесть. На элементарщине такие баталии. Такое ощущение, что здесь половина диванных теоретиков. Вариант artoodetoo более чем адекватный. Да, он критичен к показаниям тек. времени. Но это вполне норм. Сейчас все так работает. Нужно следить за корректностью тек. времени.
     
  15. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @romach, херовастенько у тебя с аллегориями.
    Не надо заниматься подменой понятий, то что предложил @Roman __construct это как раз и есть забить шуруп молотком, и не абы как, а наебеняку с загибом "шоб крепше держался".
     
  16. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Да какая разница. @Roman __construct (ну и @lastdays) дал наиболее близкий к общему решению ответ. Потому что очки добавляемые раз в сутки, должны добавляться раз в сутки, вне зависимости от того кто какую страницу открыл и сколько дней прошло с момента регистрации. Очки могут начисляться и сниматься и по другим событиям ни как не связанными с этим.

    Что же мы видим?

    1. Считать количество дней с момента регистрации и выдавать за очки - это костыль. Самый настоящий, потому что в таком раскладе очки вообще перестают быть собой, без комментариев.
    2. Слишком много кронов и вообще непереносимо. Чо? Да просто берешь pm2, описываешь конфиг и вот у тебя уже работают кроны, очереди и прочие сервисы вокруг приложения. Правильный flow, когда таск оформлен в виде handler`а запускающегося из любого окружения (веб, cli, очереди) позволит и тестировать и поддерживать. CQRS
    3. Иммутабельный крон - это конечно сила )
     
    lastdays и Roman __construct нравится это.
  17. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @romach, не надо додумывать за ТСа. По его словам «очки» напрямую завязаны на время.
     
  18. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Я внезапно хочу предложить вашему вниманию одну из некогда любимых мной притч:

    То же самое и здесь :)

    Судя по вопросу человека - ему даже просто разобраться с использованием Cron - это уже будет значительный прогресс.

    А писать решения, которые он не сможет использовать - это только зря тратить время.

    Такова моя мотивация в данном конкретном случае.
     
  19. romach

    romach Старожил

    С нами с:
    26 окт 2013
    Сообщения:
    2.904
    Симпатии:
    719
    Начисление очков завязаны на время. Ключевое здесь именно "очки", а вовсе не "сколько дней прошло с регистрации". Т.ч. я исхожу именно из того что написал ТС.
     
  20. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Это ваша трактовка. Она далеко не единственная. Например, это может быть «репа», завязанная на «возраст». О чем и писал ТС в стартовом посте.
    --- Добавлено ---
    А если в этом показателе нужно будет учитывать какой-то доп. фактор, тогда уже будем думать. Я, кстати, сходу предложил вариант и на этот случай. Такой же адекватный, без всяких кронов.
    --- Добавлено ---
    Я начинаю догадываться, чем у вас (в шир. смысле) занимается сервер большую часть времени. Выполнением «крон-задач» :)
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Я худею с вас. Здесь что-то личное задето, старые раны болят?
    Да пофигу, пусть будет крон :) Бедный ТС растерялся с такого напора.
     
    miketomlin нравится это.
  22. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    Во-во. Пусть будет крон :D Не всем же писать быстрые приложения. Кому-то нужно и полностью перелопачивать БД каждый день, «потому что крон», «потому что записи не должны застаиваться в своем первозданном состоянии, а то их потенциал улетучится», «потому что...» Конкуренция :)
     
  23. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    @miketomlin, я посмотрю на них, когда надо будет начислять очки каждую минуту.
     
  24. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.792
    Симпатии:
    650
    @Valick, да, я пока в мыслях понизил планку до часа. Но изначально держал в голове поп. площадки, где зарегано 100500 пользователей. И мне уже поплохело :)
     
  25. Roman __construct

    Roman __construct Активный пользователь

    С нами с:
    27 апр 2019
    Сообщения:
    1.270
    Симпатии:
    112
    Мне б тоже страшно стало на его месте :D