- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 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;
}
Этот говнокод кодил наш сотрудник https://vk.com/valiev_off, здесь вы можете наблюдать мастерские SQL запросы под тернарным соусом
Rooster 06.04.2021 05:47 # 0
PolinaAksenova 06.04.2021 07:21 # +4
> Балланс игрока $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
< Главный Фиксик
Вот фиксиков на Говнокоде я ещё ня видела!
guest6 06.04.2021 12:17 # +3
bormand 06.04.2021 19:39 # 0
Несекьюрно как-то... В теории, проёб 2FA и бекапных ключей должен быть эквивалентен проёбу аккаунта. На практике, конечно, много где дыру с его отключением оставляют.
PolinaAksenova 06.04.2021 20:16 # 0
Dev1lroot 21.04.2021 10:58 # 0
PolinaAksenova 06.04.2021 07:26 # +1
booratihno 06.04.2021 07:41 # 0
транзакцию делают, наверное
PolinaAksenova 06.04.2021 07:54 # 0
Вместо простого, быстрого и атомарного ON CONFLICT DO UPDATE — вот эта вот жесть. Кошмар.
booratihno 06.04.2021 07:58 # 0
BEGIN TRANSACTION (уровень изоляции должно быть repeatable reads наверное)
Потом SELECT по нужным условиям
Получаешь результат, и делаешь if в своем любимом языке программирования.
В зависимости от результата делаешь INSERT или UPDATE
потом COMMIT
PolinaAksenova 06.04.2021 08:13 # 0
booratihno 06.04.2021 08:17 # 0
PolinaAksenova 06.04.2021 08:21 # 0
guest6 06.04.2021 08:23 # 0
booratihno 06.04.2021 08:23 # 0
да и @@ROWCOUNT
Поди тока в MS SQL работает
PolinaAksenova 06.04.2021 08:31 # 0
booratihno 06.04.2021 12:10 # 0
CHayT 06.04.2021 11:21 # +2
CHayT 06.04.2021 11:38 # +2
bootcamp_dropout 06.04.2021 12:18 # 0
booratihno 06.04.2021 12:21 # +2
CHayT 06.04.2021 12:23 # 0
* Без side-effect'ов
bootcamp_dropout 06.04.2021 12:50 # 0
CHayT 06.04.2021 12:55 # +1
Да.
> Маппинг?
Нет, это не ORM, там свой движок.
> Не стрёмно транзакции произвольной продолжительности открывать если они сериализуемые?
В общем случае, нет, не стрёмно. Убивай их по таймауту, если хочешь, она стерпит.
bormand 06.04.2021 19:09 # 0
Кстати, а там какие-то гарантии на fairness есть? Или кто первый -- того и тапки, а какие-то длинные транзакции могут и вообще никогда не пройти.
CHayT 06.04.2021 19:22 # +1
Какие-то гарантии есть, а именно при разрешимом конфликте лочек, транзакции встают в очередь, отсортированную по их IDшнику (который часы Лапорта + pid транзакции). При неразрешимом — одна из них грохается и рестартует (емнип, самая старая). Отсутствие deadlock'ов эта схема гарантирует, отсутствие livelock'ов — нет. На практике я последних не видел.
bormand 06.04.2021 19:06 # 0
Судя по "без side-effect'ов" продолжительность у большинства из них весьма короткая...
PolinaAksenova 06.04.2021 19:07 # +1
CHayT 06.04.2021 19:12 # +2
Это скорее к постгре с её vacuum, лол. В mnesia все значения очень даже мутабельные. (На уровне таплов)
MAKAKA 06.04.2021 19:17 # 0
PolinaAksenova 06.04.2021 19:21 # 0
MAKAKA 06.04.2021 19:23 # +1
https://www.enterprisedb.com/blog/well-known-databases-use-different-approaches-mvcc
bormand 06.04.2021 19:26 # +1
Лочками на прочитанные строки, к примеру.
MAKAKA 06.04.2021 19:29 # +1
T1: изменила строку 1
T2: читает строку 1
Теперь у нас две версии строки 1, правда?
Кажется, одними лочками тут не обойдешься
CHayT 06.04.2021 19:30 # +2
MAKAKA 06.04.2021 19:31 # 0
Если T2 ничего не будет менять, то она вообще не должна страдать вроде
CHayT 06.04.2021 19:39 # 0
Да. Ну так речь про mnesia была вроде, она serializable.
guest6 06.04.2021 19:40 # 0
я о своем, о женс реляционноскульном
постгря вроде repeatable read по умолчанию, а ms-sql вообще read commited
CHayT 06.04.2021 19:50 # +1
Поэтому в ответе "с помощью лочек" на вопрос "как организовать repeatable reads" я уловил возможность сделать serializable, и тем самым, получить свойства базового класса, если так можно сказать.
bormand 06.04.2021 19:59 # 0
Да, я тоже думал о "не хуже чем repeatable read" когда предлагал эти лочки...
Насколько помню, во многих базах реализовано всего 1-2 уровня, а остальные превращаются в более жёсткие.
guest6 06.04.2021 20:02 # 0
Думаю, read uncomitted никто не реализует (кроме mysql с myisam)
CHayT 06.04.2021 19:28 # +1
MAKAKA 06.04.2021 19:31 # +1
Oracle maintains old versions in rollback segments (also known as 'undo log').
CHayT 06.04.2021 19:38 # 0
PolinaAksenova 06.04.2021 19:32 # 0
PolinaAksenova 06.04.2021 14:22 # +1
Steve_Brown 06.04.2021 17:51 # +1
А вот такое, кажется, реально есть. "Иконами так иконами..."
bormand 06.04.2021 19:01 # +2
Здесь такое не поощряется. Мало ли кто какое говно на рассвете карьеры писал, зачем ссылку на его профиль увековечивать то?
MAKAKA 06.04.2021 19:03 # +1
PolinaAksenova 06.04.2021 19:04 # +2
bormand 06.04.2021 19:19 # +3
Мы в ответе за тех, кого приручили.
MAKAKA 06.04.2021 19:20 # +2
KoWe4Ka_l7porpaMMep 06.04.2021 19:24 # +1
И в комментах люди всерьёз обсуждали как же поступить начальнику с заедушным прогером, который ещё и токсичный.
MAKAKA 06.04.2021 19:27 # +2
KoWe4Ka_l7porpaMMep 06.04.2021 19:39 # +1
Steve_Brown 07.04.2021 13:39 # +2
И смотреть, как она его будет есть со связанными руками.
KoWe4Ka_l7porpaMMep 06.04.2021 19:08 # +1
PolinaAksenova 06.04.2021 19:13 # +2
MAKAKA 06.04.2021 19:15 # +2
Это правда. Но вот только лучше делать это не на пхп
PolinaAksenova 06.04.2021 19:17 # +2
С другой стороны, в мире публичных пиратских серверов для Майнкрафта по-другому никак: там абсолютно всё завязано на PHP.
MAKAKA 06.04.2021 19:19 # +2
KoWe4Ka_l7porpaMMep 06.04.2021 19:19 # 0
PolinaAksenova 06.04.2021 19:25 # +1
Ай, нят, там PHP только в виде плагинов для всяческих вротпрессов. Зато ЙАЖА-говна полно!
MAKAKA 06.04.2021 19:27 # +1
PolinaAksenova 06.04.2021 19:30 # +1
KoWe4Ka_l7porpaMMep 06.04.2021 19:37 # +1
Прекрасно, восхитительно!
Это эталонный коД на ПХП, тут и хтмл, и ксс, и какое-то жкюри, кажется, только хсс не хватает, но может оно там и есть (я не знаю пхп).
PolinaAksenova 06.04.2021 19:41 # +1
KoWe4Ka_l7porpaMMep 06.04.2021 19:18 # 0
PolinaAksenova 06.04.2021 19:28 # +1
KoWe4Ka_l7porpaMMep 06.04.2021 19:32 # +1
Я, кстати, решил отказаться от ВК, особо ничего не поменялось, только смехуёчков теперь стало меньше.
bormand 06.04.2021 19:32 # +2
А теперь попробуй отказаться от ГК.
PolinaAksenova 06.04.2021 19:33 # +1
bormand 06.04.2021 19:36 # +1