- 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 запросы под тернарным соусом
> Балланс игрока $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
< Главный Фиксик
Вот фиксиков на Говнокоде я ещё ня видела!
Несекьюрно как-то... В теории, проёб 2FA и бекапных ключей должен быть эквивалентен проёбу аккаунта. На практике, конечно, много где дыру с его отключением оставляют.
транзакцию делают, наверное
Вместо простого, быстрого и атомарного ON CONFLICT DO UPDATE — вот эта вот жесть. Кошмар.
BEGIN TRANSACTION (уровень изоляции должно быть repeatable reads наверное)
Потом SELECT по нужным условиям
Получаешь результат, и делаешь if в своем любимом языке программирования.
В зависимости от результата делаешь INSERT или UPDATE
потом COMMIT
да и @@ROWCOUNT
Поди тока в MS SQL работает
* Без side-effect'ов
Да.
> Маппинг?
Нет, это не ORM, там свой движок.
> Не стрёмно транзакции произвольной продолжительности открывать если они сериализуемые?
В общем случае, нет, не стрёмно. Убивай их по таймауту, если хочешь, она стерпит.
Кстати, а там какие-то гарантии на fairness есть? Или кто первый -- того и тапки, а какие-то длинные транзакции могут и вообще никогда не пройти.
Какие-то гарантии есть, а именно при разрешимом конфликте лочек, транзакции встают в очередь, отсортированную по их IDшнику (который часы Лапорта + pid транзакции). При неразрешимом — одна из них грохается и рестартует (емнип, самая старая). Отсутствие deadlock'ов эта схема гарантирует, отсутствие livelock'ов — нет. На практике я последних не видел.
Судя по "без side-effect'ов" продолжительность у большинства из них весьма короткая...
Это скорее к постгре с её vacuum, лол. В mnesia все значения очень даже мутабельные. (На уровне таплов)
https://www.enterprisedb.com/blog/well-known-databases-use-different-approaches-mvcc
Лочками на прочитанные строки, к примеру.
T1: изменила строку 1
T2: читает строку 1
Теперь у нас две версии строки 1, правда?
Кажется, одними лочками тут не обойдешься
Если T2 ничего не будет менять, то она вообще не должна страдать вроде
Да. Ну так речь про mnesia была вроде, она serializable.
я о своем, о женс реляционноскульном
постгря вроде repeatable read по умолчанию, а ms-sql вообще read commited
Поэтому в ответе "с помощью лочек" на вопрос "как организовать repeatable reads" я уловил возможность сделать serializable, и тем самым, получить свойства базового класса, если так можно сказать.
Да, я тоже думал о "не хуже чем repeatable read" когда предлагал эти лочки...
Насколько помню, во многих базах реализовано всего 1-2 уровня, а остальные превращаются в более жёсткие.
Думаю, read uncomitted никто не реализует (кроме mysql с myisam)
Oracle maintains old versions in rollback segments (also known as 'undo log').
А вот такое, кажется, реально есть. "Иконами так иконами..."
Здесь такое не поощряется. Мало ли кто какое говно на рассвете карьеры писал, зачем ссылку на его профиль увековечивать то?
Мы в ответе за тех, кого приручили.
И в комментах люди всерьёз обсуждали как же поступить начальнику с заедушным прогером, который ещё и токсичный.
И смотреть, как она его будет есть со связанными руками.
Это правда. Но вот только лучше делать это не на пхп
С другой стороны, в мире публичных пиратских серверов для Майнкрафта по-другому никак: там абсолютно всё завязано на PHP.
Ай, нят, там PHP только в виде плагинов для всяческих вротпрессов. Зато ЙАЖА-говна полно!
Прекрасно, восхитительно!
Это эталонный коД на ПХП, тут и хтмл, и ксс, и какое-то жкюри, кажется, только хсс не хватает, но может оно там и есть (я не знаю пхп).
Я, кстати, решил отказаться от ВК, особо ничего не поменялось, только смехуёчков теперь стало меньше.
А теперь попробуй отказаться от ГК.