Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

UoKit.com Форумы _ Sphere Server 0.56 - Sphere X _ Предел в MySQL

Автор: Llirik 10.11.2015, 11:30

Ребята такая проблема хочу сделать донатный сервер и чтобы каждый чар вводил свой уникальный e-mail. Далее мне приходит от Яндекса его e-mail и я ввожу этот e-mail с кол-вом денег в MySQL, и активом=0. Далее на чаре происходит проверка раз в секунду и если мыла совпадают (MySQL с TAG.E-MAIL), то падает определённое кол-во монет в банк. Проблема вот в чём, что, если он у меня закажет монеты 10 раз, а войдёт в игру после этого. И status=1 изменится сразу во всех 10, а мне надо по 1. Извините просто я плохо знаю MySQL или программист из меня плохой. Помогите пожалуйста!

on=@timer

db.query SELECT * FROM moneys WHERE email="<CONT.TAG.E-MAIL>" and status=0
if <db.row.numrows> > 0
cont.f_add_gold <db.row.money>
db.execute UPDATE moneys SET status = 1 WHERE email="<CONT.TAG.E-MAIL>"
CONT.SYSMESSAGE @color_o_gold <db.row.money> gp put in your bank!
endif

timer=1
return 1

Надо, чтобы значение status=1 менялось по 1, а не сразу все?

Автор: Aimed 10.11.2015, 21:10

Тебе либо айдишники ещё нужны, либо Timestamp инсерта.
У тебя нет никакой индикации конкретной записи. Ты достаёшь селектом записи, причем все. А потом апдейтищь сразу все.
Тебе нужно достать 1 запись и по какому-то индикатору её же проапдейтить.
Индикатором можеть быть Id или TimeStamp в момент инсерта например. Тоесть в любом случае нужно ещё 1 поле для определения записи.
Понятно?

Автор: Llirik 11.11.2015, 0:20

Да, а что, если db.execute delete from moneys where email="<CONT.TAG.E-MAIL>" limit 1, нормально удалять будет по 1?

Автор: Aimed 11.11.2015, 2:46

Цитата(Llirik @ 10.11.2015, 22:20) *

Да, а что, если db.execute delete from moneys where email="<CONT.TAG.E-MAIL>" limit 1, нормально удалять будет по 1?


Так не делается. Он будет последне-добавленные записи удалять с указанным мылом, тебе нужно наоборот. + Нет никаких гарантий что что-то пойдёт не так и удалиться что-то с любым индексом.
Тебе нужно КОНКРЕТНУЮ запись достать и ЕЁ проапдейтить либо удалить.

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

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

Автор: RL_ka 11.11.2015, 14:46

Таблица БД должна выглядеть таким образом:

Код
_______________________________________________________
| Transaction.ID | User.Email | Money.Amount | Status  |
|______________________________________________________|
| Integer        | String     | Integer      | Integer |
|______________________________________________________|


Затем ты ищешь одну нужную запись по айди и имейлу, выдаёшь количество денег из Money.Amount и измняешь её статус с 0 на 1

Автор: RL_ka 11.11.2015, 15:09

1. Ищешь одну запись с нужным имейлом и статусом 0

Код
db.query SELECT * FROM moneys WHERE User.Email="<CONT.TAG.E-MAIL>" and Status=0 LIMIT 1

2. Выдаёшь деньги
3. Обновляешь статус записи с нужным айди
Код
db.execute UPDATE moneys SET Status=1 WHERE User.Email="<CONT.TAG.E-MAIL>" and Transaction.ID="<db.row.TransactionID>"


Типа того. Не знаю всё ли верно с синтаксисом, никогда не писал для сферы.

Автор: Aimed 11.11.2015, 15:48

Спасибо что разжевал за меня biggrin.gif

Правда иногда полезно что-бы сами помучались, как показывает практика rolleyes.gif

Автор: Aimed 11.11.2015, 16:02

Кстати, тут есть вообще мега простое решение.
Зачем по 1 записи ковырять? Берёшь весь селект со статусом 0 и мылом х, берешь его сумму по деньгам, выкидываешь в банк и апдейтишь статус на 0. Даже айдишники не нужны будут, но по нормальному в таблице их желательно иметь, либо уникальный ключ из других полей.
А вот и вариант *всё сразу*:

Код
on=@timer

db.query SELECT SUM(money) FROM moneys WHERE email="<CONT.TAG.E-MAIL>" and status=0
if <db.row.numrows> > 0
    cont.f_add_gold <db.row.money>
    db.execute UPDATE moneys SET status = 1 WHERE email="<CONT.TAG.E-MAIL>"
    CONT.SYSMESSAGE @color_o_gold <db.row.money> gp put in your bank!
endif

timer=1
return 1


Всё. И дело с концом, всего 1 функцию добавляем и получаем результат который даже лучше. Не будет кучу сообщений *x gp put in your bank!*.

Сразу за все записи кидаешь сумму золота в банк + апдейтишь все записи.
Понятно?

Автор: Llirik 11.11.2015, 19:16

Да, спасибо!

Русская версия Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)