Jump to content

Recommended Posts

Доброго времени, Уважаемые!

Задача:

необходимо сделать счетчик, который будет каждый день к исходному значению, добавлять значение.

Пример: исходное = 100, каждый день к этому значению, должно прибавляться +3, т.е. в понедельник = 100, вторник = 103, среда = 106 и так далее.

Что рассматривал:

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

НО! триггер в MySQL, срабатывают по событию (добавление,удаление, изменение) записей в таблицы. Время срабатывания - не основной фактор, как я понял.

Внимание, вопрос )))

 

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

 

Share this post


Link to post
Share on other sites

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все) 

  • +1 1

Share this post


Link to post
Share on other sites

мне нужно выполнять действие, на стороне сервера.мне не нужен сервис дополнительный.

это все надстройки, которые не нужны!!!

 

Share this post


Link to post
Share on other sites
16 минут назад, anboza сказал:

мне нужно выполнять действие, на стороне сервера.мне не нужен сервис дополнительный.

это все надстройки, которые не нужны!!!

 

все вам правильно написали, пишите скрипт который берет данные из бд и возвращаюет туда же, и срабатывает по крону каждый день в нужное время

Share this post


Link to post
Share on other sites
29 минут назад, flai0616 сказал:

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все) 

UPDATE table SET table.field = table.field + 3 

не годится?

 

Ну и если правильно погуглить то видим по заросу cron mysql query

Первая же ссылка на стаковерфлоу и очень простое решение задачи

 

 personally find it easier use MySQL event scheduler than cron.

Enable it with

SET GLOBAL event_scheduler = ON;

and create an event like this:

CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

 

Share this post


Link to post
Share on other sites

но это же жесть ((( а зачем тогда вообще сервер БД? для того, чтобы просто таблицы хранить?

 

Share this post


Link to post
Share on other sites

а если сервер случайно выключили во время когда должно сработать событие?

Share this post


Link to post
Share on other sites
1 минуту назад, nikifalex сказал:

а если сервер случайно выключили во время когда должно сработать событие?

ну так в том и соль, что триггер должен сработать не просто "в момент", а по состоянию на момент...и так он и работает в "нормальных" СУБД

 

Share this post


Link to post
Share on other sites
10 часов назад, anboza сказал:

ну так в том и соль, что триггер должен сработать не просто "в момент", а по состоянию на момент

Ну можно придумать такой алгоритм. Создать триггер на select из этой таблицы. Делаем хранилище для метки, которая помогает определять добавлять +3 или нет, например еще таблицу. В триггере такой примерно алгоритм - смотреть текущее время и сравниваем ее с меткой, в метке может быть текущее время с прошлого добавления +3, делаем вывод надо ли добавлять +3 или нет, если надо, то добавляем и обновляем метку, если нет, то ничего не делаем. Но я бы так не делал. Лучше в коде php обложить select-ы из той таблицы проверкой по аналогичному алгоритму, это будет легче поддерживать. 

Share this post


Link to post
Share on other sites

пока нет понимания, для чего это надо вопрошающему, все потуги как то решить проблему, тщетны.

 

Share this post


Link to post
Share on other sites
3 часа назад, i3bepb сказал:

Создать триггер на select из этой таблицы.

расскажите - как

Share this post


Link to post
Share on other sites
3 часа назад, nikifalex сказал:

пока нет понимания, для чего это надо вопрошающему, все потуги как то решить проблему, тщетны.

 

я в первом посте описал задачу. она именно так и выглядит. результат этого состояния счетчика, просто  будет выводиться на фронте, в блоке типа "наш сервис посетило" столько-то людей. 

Share this post


Link to post
Share on other sites
4 часа назад, i3bepb сказал:

Создать триггер на select из этой таблицы.

ну как бы вариант, но уж больно он громоздкий. Ну и не факт, что обращение будет каждый день. Соответственно нужно не просто проверять дату обновления, но и вычислять разность и потом умножать накол-во пропущенных дней...

 

Я же ищу вариант решения, чтобы задача выполнялась просто на сервере. Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

Но сдается мне, что это не про mysql, судя по обсуждению...

Share this post


Link to post
Share on other sites
19 минут назад, anboza сказал:

результат этого состояния счетчика, просто  будет выводиться на фронте, в блоке типа "наш сервис посетило" столько-то людей. 

берите просто количество дней от часа X и умножайте на три.

Share this post


Link to post
Share on other sites
26 минут назад, anboza сказал:

Я же ищу вариант решения, чтобы задача выполнялась просто на сервере. Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

 

15 часов назад, Yoda сказал:

and create an event like this:

CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

Что здесь не так?

Share this post


Link to post
Share on other sites
27 минут назад, anboza сказал:

Каждый день, вне зависимости от селектов и апдейтов каких-либо данных...

Такие вариант выше же предлагали

16 часов назад, flai0616 сказал:

Грубо говоря - пишете скрипт, который получает текущее значение, прибавляет к нему 3 и записывает обратно в БД. Ставите выполнение по cron раз в сутки и все)

 

15 часов назад, Yoda сказал:

Ну и если правильно погуглить то видим по заросу cron mysql query

Первая же ссылка на стаковерфлоу и очень простое решение задачи

 

 personally find it easier use MySQL event scheduler than cron.

Enable it with

SET GLOBAL event_scheduler = ON;

and create an event like this:

CREATE EVENT name_of_event
ON SCHEDULE EVERY 1 DAY
STARTS '2014-01-18 00:00:00'
DO
DELETE FROM tbl_message WHERE DATEDIFF( NOW( ) ,  timestamp ) >=7;

and that's it.

 

Share this post


Link to post
Share on other sites
1 час назад, chukcha сказал:

расскажите - как

Да Вы правы на select триггер не навешать, но если погуглить, то например предлагается вариант через хранимые процедуры, т.е. вместо select-а на прямую делается процедура, которая будет оберткой и уже в ней алгоритм. Возможно еще какие-то решения найдутся как это сделать.

Share this post


Link to post
Share on other sites

Самое простое крон
Более менее управляемо, и вычисляемо
Таски (евентсы) о них нужно знать, помнить и использовать, но это должно быть в ГДЕ- ТО  - Внимание Есть events

Share this post


Link to post
Share on other sites
Только что, chukcha сказал:

Что здесь не так?

здесь все так, просто пояснял суть заданного вопроса.

Share this post


Link to post
Share on other sites

Я с вас со всех худею дорогая редакция.
Откуда столько глупостей в голове?


1. Если падает сервер и не срабатывает sheduled task  - надо просто менять сервер.

2. Любые хранимые процедуры, триггеры и таски в базе - в конечном итоге оборачиваются некой головной болью при смене окружения, особенно если используется shared хостинг.

3. Нет принципиальной разницы это cron скрипт php, cron команда mysql или bash скрипт. Это все серверные пережитки и они все обладают одним большим недостатком - при смене окружения, паролей в базу, пользователя базы, про них можно случайно забыть.

4. Если делать совсем дубово в рамках идеи opencart - надо делать какой то шедаллер в виде событий при инициализации генераций страниц с файлом или записью базы содержащими временную метку последнго успешного события. Если вы уверены в своих силах и втом, что вы не забудете перенести кроны - крон. Если знаете как решить потенциальные проблемы с пользователем, от которого работюат триггеры и процедуры - делайте в базе. В том или ином виде задача решается однозначно и малыми костами.

 

Просто кому то удобно за 10 минут скрипт сваять, а кому то в базу пару запросов воткнуть. Единого верного решения здесь быть не может. Следуйте принципу write less do more и будет вам счастье!

Share this post


Link to post
Share on other sites

так и не понял, зачем писать в базу?

 

 

12 часов назад, anboza сказал:

просто  будет выводиться на фронте

 

В 24.12.2019 в 20:53, anboza сказал:

Пример: исходное = 100, каждый день к этому значению, должно прибавляться +3, т.е. в понедельник = 100, вторник = 103, среда = 106 и так далее.

echo (100+floor(($now_date - $start_date) / 86400)*3)

 

  • +1 1

Share this post


Link to post
Share on other sites
Только что, Otvet сказал:

так и не понял, зачем писать в базу?

в базу писать для того, чтобы обрабатывать не на клиенте. И в клиента передавать 1 конечное значение, а не передавать значение, плодить переменные и потом все это обрабатывать.

Речь об оптимальном решении, с возможностью использовать преимущество наличия БД.

 

Только что, Yoda сказал:

Просто кому то удобно за 10 минут скрипт сваять, а кому то в базу пару запросов воткнуть. Единого верного решения здесь быть не может.

Для того и обсуждаем на форуме))

 

В любом случае, я благодарен всем участникам дискуссии, за версии, мысли и предложения )))

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
You are posting as a guest. If you have an account, please sign in.
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×

Important Information

On our site, cookies are used and personal data is processed to improve the user interface. To find out what and what personal data we are processing, please go to the link. If you click "I agree," it means that you understand and accept all the conditions specified in this Privacy Notice.