Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в эту темуОткрыть новую тему
> Предел в MySQL
Llirik
сообщение 10.11.2015, 11:30
Сообщение #1


******

Expert
Сообщений: 681
Регистрация: 5.9.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.259



Ребята такая проблема хочу сделать донатный сервер и чтобы каждый чар вводил свой уникальный 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, а не сразу все?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 10.11.2015, 21:10
Сообщение #2


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8679
Пользователь №: 15.607



Тебе либо айдишники ещё нужны, либо Timestamp инсерта.
У тебя нет никакой индикации конкретной записи. Ты достаёшь селектом записи, причем все. А потом апдейтищь сразу все.
Тебе нужно достать 1 запись и по какому-то индикатору её же проапдейтить.
Индикатором можеть быть Id или TimeStamp в момент инсерта например. Тоесть в любом случае нужно ещё 1 поле для определения записи.
Понятно?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Llirik
сообщение 11.11.2015, 0:20
Сообщение #3


******

Expert
Сообщений: 681
Регистрация: 5.9.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.259



Да, а что, если db.execute delete from moneys where email="<CONT.TAG.E-MAIL>" limit 1, нормально удалять будет по 1?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 11.11.2015, 2:46
Сообщение #4


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8679
Пользователь №: 15.607



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

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


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

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

Иначе у тебя просто свалка с записями, которые даже отличить друг от друга нельзя.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 11.11.2015, 14:46
Сообщение #5


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13730
Из: Екатеринбург
Пользователь №: 16.211



Таблица БД должна выглядеть таким образом:
Код
_______________________________________________________
| Transaction.ID | User.Email | Money.Amount | Status  |
|______________________________________________________|
| Integer        | String     | Integer      | Integer |
|______________________________________________________|


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

Сообщение отредактировал RL_ka - 11.11.2015, 14:47
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
RL_ka
сообщение 11.11.2015, 15:09
Сообщение #6


*****

Разработчик Injection
Сообщений: 464
Регистрация: 13.7.2013
Группа: Модераторы
Наличность: 13730
Из: Екатеринбург
Пользователь №: 16.211



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>"


Типа того. Не знаю всё ли верно с синтаксисом, никогда не писал для сферы.
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 11.11.2015, 15:48
Сообщение #7


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8679
Пользователь №: 15.607



Спасибо что разжевал за меня (IMG:style_emoticons/default/biggrin.gif)

Правда иногда полезно что-бы сами помучались, как показывает практика (IMG:style_emoticons/default/rolleyes.gif)
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Aimed
сообщение 11.11.2015, 16:02
Сообщение #8


*********

Grandmaster
Сообщений: 2.250
Регистрация: 29.12.2012
Группа: Пользователи
Наличность: 8679
Пользователь №: 15.607



Кстати, тут есть вообще мега простое решение.
Зачем по 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!*.

Сразу за все записи кидаешь сумму золота в банк + апдейтишь все записи.
Понятно?
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения
Llirik
сообщение 11.11.2015, 19:16
Сообщение #9


******

Expert
Сообщений: 681
Регистрация: 5.9.2012
Группа: Пользователи
Наличность: 0
Пользователь №: 15.259



Да, спасибо!
Пользователь в офлайнеDelete PostОтправить личное сообщение
Вернуться в начало страницы
+Ответить с цитированием данного сообщения

Ответить в эту темуОткрыть новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия | Версия для КПК Сейчас: 24.4.2024, 13:43
Designed by Nickostyle