[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите составить простой цикл
Страницы: 1, 2
Frost-56
Думаю как реализовать такую штуку:

Есть таблица с юзерами, у каждого юзера есть поле balance.
Надо каждый день списывать -1 руб. пока баланс не станет менее или равно 0.99 р.
Если баланс кончился то //действие

запрос будет прримерно такой SELECT balance FROM users
думаю как засунуть в while или for и каждый день запускать.

Хотелось бы реализовать без cron, проверкой даты наверное.

Всем заранее спасибо за помощь.
Arh
Можно сделать дату последней операции или (дату последней синхронизации баланса).
настоящий баланс пользователя == (баланс - Количество дней пройденных с последней операции)

То есть пользователь положил 100р на счёт (пополнился счет, обновилась дата изменения баланса), прошло 3 дня, значит его счет равен 100 - 3
Ну и соответственно делать обновления этой даты и баланса, когда происходит что то, связанное с балансом пользователя (просмотр баланса, операции со средствами)

В общем, да, проверка даты)

_____________
Промокод предоставляет скидку на заказ домена и/или хостинга reg.ru
BFCC-3895-8804-9ED2
AllesKlar
Frost-56
Это как-бэ тригер...
Но, т.к. скорее всего тригер - это страшное слово, то реализуем его упрощенную имитацию.

Направление было верное - дата последнего списания.

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

Имеет смысл сделать отдельную таблицу, скажем некий Registry (реестр)
И в этом реестре у тебя всякая служебная инфа, в том числе, дата последнего списания.
Читаешь эту дату, если время Ч, одним запросом обновляешь всем баланс.
UPDATE users SET balnce = balance - 1 WHERE balance > 0.99


А перед этим нужно сделать запрос для "Если баланс кончился, то действие"
SELECT *  FROM users WHERE balance <= 1.99 AND balnce > 0.99


И все.. всего два запроса и никаких циклов.


_____________
[продано копирайтерам]
linker
Проще было бы раз в сутки запускать скрипт по crontab и на париться с датами последних операций и прочее. Запустилось само, всем списалось по рублю и заснуло до следующего дня.

_____________
Gear Framework
Gear Framework на Github
Frost-56
Спасибо всем, да думаю проще уж кроном тогда реализовать.

Спасибо за запрос:
SELECT *  FROM users WHERE balance <= 1.99 AND balnce > 0.99



Только сначала надо делать проверку не кончился ли баланс? или оставить запрос чтобы WHERE там же проверил его <=0.99 ?

Да, и запрос сразу же пойдет циклом по всем?
Как со стороны безопасности лучше сделать? проверку на дату или крон?
linker
Логично, что списывать надо ежедневно, независимо заходил юзверь или нет. Списывать при заходе требует реализации большего функционала, логики и т.п., что влечёт за собой увеличение вероятности ошибок. Для списывания можно такой запрос заюзать
UPDATE `users` SET `balance` = `balance` - 1 WHERE `balance` > 0.99
а потом сделать
SELECT * FROM `users` WHERE `balance` <= 0.99
и совершить над ними требуемые операции. Это я привожу пример такой, потому что не знаю, какие должны быть операции над теми, у кого баланс меньше или равно 0.99

_____________
Gear Framework
Gear Framework на Github
Frost-56
Цитата (linker @ 10.06.2014 - 15:08)
Логично, что списывать надо ежедневно, независимо заходил юзверь или нет. Списывать при заходе требует реализации большего функционала, логики и т.п., что влечёт за собой увеличение вероятности ошибок. Для списывания можно такой запрос заюзать
UPDATE `users` SET `balance` = `balance` - 1 WHERE `balance` > 0.99
а потом сделать
SELECT * FROM `users` WHERE `balance` <= 0.99
и совершить над ними требуемые операции. Это я привожу пример такой, потому что не знаю, какие должны быть операции над теми, у кого баланс меньше или равно 0.99

Спасибо, если баланс кончится, на wp сменится группа пользователя.
Frost-56
Как вывести в проверку второй запрос?

типа так?

$proverka = mysql_query("SELECT * FROM `users` WHERE `balance` <= 0.99") or die("хрен там");

if ($proverka) {



так?
linker
Проверку чего так делать?

А группа пользователя в этой же таблице или в другой?

_____________
Gear Framework
Gear Framework на Github
Frost-56
Не, там таблица user_meta, там геморно мета данные передаются, не вывезу, думаю в эту же таблицу добавить поле oplata которое будет проверять если цифра 1 значит баланс еще есть, если 0 значит кончился. но как реализовать саму проверку через elseif
linker
Ну я бы попробовал что-то типа
UPDATE `user_metadata` SET `user_group` = 2 WHERE `user_id` IN (SELECT id FROM `users` WHERE `balance`<= 0.99)


_____________
Gear Framework
Gear Framework на Github
Frost-56
Цитата (linker @ 10.06.2014 - 23:59)
Ну я бы попробовал что-то типа
UPDATE `user_metadata` SET `user_group` = 2 WHERE `user_id` IN (SELECT id FROM `users` WHERE `balance`<= 0.99)

нифига се запрос, не пока 3 юзера в бд проще новое поле добавить к таблице, вот только как сделать проверку через if else когда в бд баланс менее или равно 0.99.

А еще вопрос, если например каждый день делать не -1 а например - 1.32, то в бд при списании точка определится?
FatCat
Цитата (Frost-56 @ 10.06.2014 - 13:34)
если баланс кончится, на wp сменится группа пользователя

И ради этого городить такой огород?
Зачем вообще хранить в БД цифру баланса? Достаточно хранить дату пополнения баланса и сумму на счету на дату пополнения. Текущая дата всегда известна, дальше простая арифметика.

_____________
Бесплатному сыру в дырки не заглядывают...
linker
FatCat
Цитата
Достаточно хранить дату пополнения баланса и сумму на счету на дату пополнения

Т.е. вместо одного поля баланса, получается два поля, одно из которых собственно балансом и является. Плюс лишняя арифметика, и только ради того, чтобы раз в сутки для каждого пользователя сделать balance = balance - 1, а у кого баланс ниже рубля сменить ещё группу.

Frost-56
Как знаешь. Если поле balance есть float или double, то 1.32 нормально воспримется.

_____________
Gear Framework
Gear Framework на Github
sergeiss
Цитата (Frost-56 @ 10.06.2014 - 11:57)
Как со стороны безопасности лучше сделать? проверку на дату или крон?

Даже если кроном запускать, то все равно дату проверять надо обязательно.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.