@QNA-1976

Насколько надёжен такой способ контроля?

Вводная: в игре 200 уровней, 118 единиц техники, 22 постройки, 10 операций, 100 миссий и т.д., они соответствуют уровню игрока. При получении нового уровня эта вся муть потихоньку добавляется, если уровень совпал с уровнем игрока.
$this->user->log_unit = $this->setProperty('unit');
$this->user->log_building = $this->setProperty('building');
$this->user->log_operation = $this->setProperty('operation');
$this->user->log_mission = $this->setProperty('mission');

Старый вариант добавления: в этом случае производится лишний запрос на проверку, ДАЖЕ если уровень не совпадёт и вставку делать не нужно.
private function setProperty($property)
    {
        if ($this->user->log_level) {
            $data = $this->pdo('select * from ' . $property . 's where lvl = ? limit 1', [
                $this->user->lvl
            ])->fetch();
            if ($data) {
                $this->pdo('insert into users_' . $property . 's set id = ?, id_' . $property . ' = ?', [
                    $this->user->id,
                    $data->{'id_' . $property}
                ]);
                return $data;
            }
        }
        return false;
    }

Новый вариант: выборка производится, если уровень пользуна есть в массиве добавляемого элемента
private function setProperty($property)
    {
        $array = [
            'unit' => [1, 2, 3, 6, 7, 8, 9, 11, 12, 13, 14, 16, 18, 19, 20, 24, 25, 26, 30, 31, 32, 36, 37, 38, 42, 43, 44, 48, 49, 50, 54, 55, 56, 60, 61, 62, 65, 66, 67, 68, 69, 70, 72, 73, 74, 78, 79, 80, 84, 85, 86, 90, 91, 92, 96, 97, 98, 102, 103, 104, 106, 107, 108, 109, 110, 111, 114, 115, 116, 120, 121, 122, 126, 127, 128, 131, 132, 133, 134, 138, 139, 140, 141, 142, 144, 145, 146, 150, 151, 152, 156, 157, 158, 161, 162, 163, 165, 167, 169, 171, 173, 174, 175, 177, 178, 180, 181, 182, 186, 187, 188, 192, 193, 194, 197, 198, 199, 200],
            'building' => [1, 2, 3, 21, 22, 35, 43, 44, 64, 66, 68, 85, 88, 101, 106, 110, 127, 132, 134, 154, 167, 176],
            'operation' => [1, 15, 30, 45, 60, 75, 90, 105, 120, 135],
            'mission' => [1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 60, 62, 64, 66, 68, 70, 72, 74, 76, 78, 75, 77, 79, 81, 83, 85, 87, 89, 91, 93, 90, 92, 94, 96, 98, 100, 102, 104, 106, 108, 105, 107, 109, 111, 113, 115, 117, 119, 121, 123, 120, 122, 124, 126, 128, 130, 132, 134, 136, 138, 135, 137, 139, 141, 143, 145, 147, 149, 151, 153]
        ];
        if ($this->user->log_level and in_array($this->user->lvl, $array[$property])) {
            $data = $this->pdo('select * from ' . $property . 's where lvl = ? limit 1', [
                $this->user->lvl
            ])->fetch();
            if ($data) {
                $this->pdo('insert into users_' . $property . 's set id = ?, id_' . $property . ' = ?', [
                    $this->user->id,
                    $data->{'id_' . $property}
                ]);
                return $data;
            }
        }
        return false;
    }

Вопрос: насколько надёжно так производить проверку, а то эти массивы чисто зрительно как-то не внушают доверия )))

Смысл: не производить запрос к БД, если нет соответствия.

А если я из админки отредачу элемент какой поменяю ему уровень или добавлю новый элемент или уровни добавлю игрокам, лазить в рукописный массив?

Как быть? Может элегантнее есть решения?
  • Вопрос задан
  • 167 просмотров
Решения вопроса 1
FanatPHP
@FanatPHP
Чебуратор тега РНР
А какая проблема с запросом? Код начинает что ли адски тормозить, когда игрок получает новый уровень?
Нет, не начинает? Ничего не трогай.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы