- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
public function addMoney($name, $amount, $type)
{
$checkExist = $this->checkUserMoney($name);
$checkExist = ($checkExist != '<b>(Ico)</b> <h11 style=\"color: red\">Произошла ошибка!</h11> <br/>') ? true : false;
$name_uuid = $this->genUUID($name);
if ($this->version == '1.12.2' AND $this->plugin != 'iconomy')
{
if ($checkExist)
{
if ($type == 'add')
{
$queryText = ($this->plugin == 'economylite') ? "UPDATE `economyliteplayers` SET `balance` = `balance` + '$amount' WHERE `uuid` = '$name_uuid' AND `currency` = 'economylite:coin'"
: "UPDATE `{$this->table}` SET `money` = `money` + '$amount' WHERE `player_name` = '$name'";
} else
{
$queryText = ($this->plugin == 'economylite') ? "UPDATE `economyliteplayers` SET `balance` = '$amount' WHERE `uuid` = '$name_uuid' AND `currency` = 'economylite:coin'"
: "UPDATE `{$this->table}` SET `money` = '$amount' WHERE `player_name` = '$name'";
}
} else
{
$queryText = ($this->plugin == 'economylite') ? "INSERT INTO `economyliteplayers` (`uuid`, `balance`, `currency`) VALUES ('$name_uuid', '$amount', 'economylite:coin')"
: "INSERT INTO `{$this->table}` (`player_uuid`, `player_name`, `money`, `sync_complete`, `last_seen`) VALUES ('$name_uuid', '$name', '$amount', 'true', '0')";
}
} else
{
if ($checkExist)
{
$queryText = ($type == 'add') ? "UPDATE `{$this->table}` SET `balance` = `balance` + $amount WHERE `username` = '$name'"
: "UPDATE `{$this->table}` SET `balance` = $amount WHERE `username` = '$name'";
} else
{
$queryText = "INSERT INTO `{$this->table}` (`username`, `balance`) VALUES ('$name', $amount)";
}
}
echo $queryText;
$data = siteQuery($queryText, 'query', $this->mysqli);
$text = ($data != NULL) ? "<b>(Ico)</b> <h11 style=\"color: green\">Игроку $name успешно начисленно: $amount эмеральдов!</h11> <br/>"
: '<b>(Ico)</b> <h11 style="color: red">Произошла ошибка!</h11> <br/>';
return $text;
}
public function checkUserMoney($name)
{
$name_uuid = $this->genUUID($name);
if ($this->version == '1.12.2' AND $this->plugin != 'iconomy')
{
$queryText = ($this->plugin == 'economylite') ? "SELECT `balance` FROM `economyliteplayers` WHERE `uuid` = '{$name_uuid}' AND `currency` = 'economylite:coin'"
: "SELECT `money` as 'balance' FROM `{$this->table}` WHERE `player_name` = '{$name}'";
} else
{
$queryText = "SELECT `balance` FROM `{$this->table}` WHERE `username` = '{$name}'";
}
$data = siteQuery($queryText, 'assoc', $this->mysqli);
$text = ($data != NULL) ? "<b>(Ico)</b> <h11 style=\"color: green\">Балланс игрока $name: {$data['balance']} эмеральдов!</h11> <br/>"
: '<b>(Ico)</b> <h11 style=\"color: red\">Произошла ошибка!</h11> <br/>';
return $text;
}
Rooster # 0
PolinaAksenova # 0
> Балланс игрока $name: {$data['balance']} эмеральдов!
https://mcskill.net/?page=shop-info
< Покупка эмеральдов
< Покупка игровой валюты на серверах.
https://mcskill.net/mcforum/index.php?/topic/99675-немогу-зайти-в-аккаунт/
<
> 2002 г.
Такой маленький, а уже PHP (。•́︿•̀。).
> Запостил: Dev1lroot
https://mcskill.net/?page=admin
< Dev1lroot
< Главный Фиксик
Вот фиксиков на Говнокоде я ещё ня видела!
guest # 0 ⇈
bormand # 0 ⇈
Несекьюрно как-то... В теории, проёб 2FA и бекапных ключей должен быть эквивалентен проёбу аккаунта. На практике, конечно, много где дыру с его отключением оставляют.
PolinaAksenova # 0 ⇈
Dev1lroot # 0 ⇈
PolinaAksenova # 0
booratihno # 0 ⇈
транзакцию делают, наверное
PolinaAksenova # 0 ⇈
Вместо простого, быстрого и атомарного ON CONFLICT DO UPDATE — вот эта вот жесть. Кошмар.
booratihno # 0 ⇈
BEGIN TRANSACTION (уровень изоляции должно быть repeatable reads наверное)
Потом SELECT по нужным условиям
Получаешь результат, и делаешь if в своем любимом языке программирования.
В зависимости от результата делаешь INSERT или UPDATE
потом COMMIT
PolinaAksenova # 0 ⇈
booratihno # 0 ⇈
PolinaAksenova # 0 ⇈
guest # 0 ⇈
booratihno # 0 ⇈
да и @@ROWCOUNT
Поди тока в MS SQL работает
PolinaAksenova # 0 ⇈
booratihno # 0 ⇈
CHayT # 0 ⇈
CHayT # 0 ⇈
bootcamp_dropout # 0 ⇈
booratihno # 0 ⇈
CHayT # 0 ⇈
* Без side-effect'ов
bootcamp_dropout # 0 ⇈
CHayT # 0 ⇈
Да.
> Маппинг?
Нет, это не ORM, там свой движок.
> Не стрёмно транзакции произвольной продолжительности открывать если они сериализуемые?
В общем случае, нет, не стрёмно. Убивай их по таймауту, если хочешь, она стерпит.
bormand # 0 ⇈
Кстати, а там какие-то гарантии на fairness есть? Или кто первый -- того и тапки, а какие-то длинные транзакции могут и вообще никогда не пройти.
CHayT # 0 ⇈
Какие-то гарантии есть, а именно при разрешимом конфликте лочек, транзакции встают в очередь, отсортированную по их IDшнику (который часы Лапорта + pid транзакции). При неразрешимом — одна из них грохается и рестартует (емнип, самая старая). Отсутствие deadlock'ов эта схема гарантирует, отсутствие livelock'ов — нет. На практике я последних не видел.
bormand # 0 ⇈
Судя по "без side-effect'ов" продолжительность у большинства из них весьма короткая...
PolinaAksenova # 0 ⇈
CHayT # 0 ⇈
Это скорее к постгре с её vacuum, лол. В mnesia все значения очень даже мутабельные. (На уровне таплов)
MAKAKA # 0 ⇈
PolinaAksenova # 0 ⇈
MAKAKA # 0 ⇈
https://www.enterprisedb.com/blog/well-known-databases-use-different-approaches-mvcc
bormand # 0 ⇈
Лочками на прочитанные строки, к примеру.
MAKAKA # 0 ⇈
T1: изменила строку 1
T2: читает строку 1
Теперь у нас две версии строки 1, правда?
Кажется, одними лочками тут не обойдешься
CHayT # 0 ⇈
MAKAKA # 0 ⇈
Если T2 ничего не будет менять, то она вообще не должна страдать вроде
CHayT # 0 ⇈
Да. Ну так речь про mnesia была вроде, она serializable.
guest # 0 ⇈
я о своем, о женс реляционноскульном
постгря вроде repeatable read по умолчанию, а ms-sql вообще read commited
CHayT # 0 ⇈
Поэтому в ответе "с помощью лочек" на вопрос "как организовать repeatable reads" я уловил возможность сделать serializable, и тем самым, получить свойства базового класса, если так можно сказать.
bormand # 0 ⇈
Да, я тоже думал о "не хуже чем repeatable read" когда предлагал эти лочки...
Насколько помню, во многих базах реализовано всего 1-2 уровня, а остальные превращаются в более жёсткие.
guest # 0 ⇈
Думаю, read uncomitted никто не реализует (кроме mysql с myisam)
CHayT # 0 ⇈
MAKAKA # 0 ⇈
Oracle maintains old versions in rollback segments (also known as 'undo log').
CHayT # 0 ⇈
PolinaAksenova # 0 ⇈
PolinaAksenova # 0 ⇈
Steve_Brown # 0
А вот такое, кажется, реально есть. "Иконами так иконами..."
bormand # 0
Здесь такое не поощряется. Мало ли кто какое говно на рассвете карьеры писал, зачем ссылку на его профиль увековечивать то?
MAKAKA # 0 ⇈
PolinaAksenova # 0 ⇈
bormand # 0 ⇈
Мы в ответе за тех, кого приручили.
MAKAKA # 0 ⇈
KoWe4Ka_l7porpaMMep # 0 ⇈
И в комментах люди всерьёз обсуждали как же поступить начальнику с заедушным прогером, который ещё и токсичный.
MAKAKA # 0 ⇈
KoWe4Ka_l7porpaMMep # 0 ⇈
Steve_Brown # 0 ⇈
И смотреть, как она его будет есть со связанными руками.
KoWe4Ka_l7porpaMMep # 0 ⇈
PolinaAksenova # 0 ⇈
MAKAKA # 0 ⇈
Это правда. Но вот только лучше делать это не на пхп
PolinaAksenova # 0 ⇈
С другой стороны, в мире публичных пиратских серверов для Майнкрафта по-другому никак: там абсолютно всё завязано на PHP.
MAKAKA # 0 ⇈
KoWe4Ka_l7porpaMMep # 0 ⇈
PolinaAksenova # 0 ⇈
Ай, нят, там PHP только в виде плагинов для всяческих вротпрессов. Зато ЙАЖА-говна полно!
MAKAKA # 0 ⇈
PolinaAksenova # 0 ⇈
KoWe4Ka_l7porpaMMep # 0 ⇈
Прекрасно, восхитительно!
Это эталонный коД на ПХП, тут и хтмл, и ксс, и какое-то жкюри, кажется, только хсс не хватает, но может оно там и есть (я не знаю пхп).
PolinaAksenova # 0 ⇈
KoWe4Ka_l7porpaMMep # 0
PolinaAksenova # 0 ⇈
KoWe4Ka_l7porpaMMep # 0 ⇈
Я, кстати, решил отказаться от ВК, особо ничего не поменялось, только смехуёчков теперь стало меньше.
bormand # 0 ⇈
А теперь попробуй отказаться от ГК.
PolinaAksenova # 0 ⇈
bormand # 0 ⇈