Вопросы

Surfer_Selectrum
Новичок

здравствуйте, подскажите как сделать так, чтобы команда /makeadmin после назначения игрока на админа, или повышение админа, добавляла в базу данных админку игроку, чтобы в таблице users меняла уровень админки, а в таблице admins добавляла игрока и также изменяла уровень.

Code:

CMD:makeadmin(playerid, params[])
{
    new string[128];
    if(GetAdmin(playerid, adminLogin) == falsereturn SCM(playerid, 0xA3A3A3FF"{C20000}[Ошибка]"C_GREY" Вы не являетесь администратором");
    if(GetAdmin(playerid, adminLevel) < 6return SCM(playerid, 0xA3A3A3FF"{C20000}[Ошибка]"C_GREY" Вы не можете использовать данную команду.");
    if(sscanf(params, "ii", params[0], params[1])) return SCM(playerid, 0xA3A3A3AA"{C20000}[Ошибка]"C_GREY" Введите: /makeadmin [ID] [Level].");
    if(!IsPlayerConnected(params[0])) return SCM(playerid, 0xA3A3A3FF"{C20000}[Ошибка]"C_GREY" Данный игрок не в сети!");
    if(params[1] < 0 || params[1] > 8return SCM(playerid, 0xA3A3A3FF"{C20000}[Ошибка]"C_GREY" Уровень администратора [0-8]");
    InfoPlayer[params[0]][pAdmin] = params[1];
    format(string, sizeof(string), "Администратор %s изменил ваш уровень администратора на: %d", InfoPlayer[playerid][pName], params[1]);
    SCM(params[0], 0xFFFFFFAA, string);
    return true;
}

Screens - click

 

Снимок экрана 2024-07-25 234801.png

Снимок экрана 2024-07-25 234904.png

Снимок экрана 2024-07-25 234923.png

Снимок экрана 2024-07-25 235212.png

Поделиться сообщением


Ссылка на сообщение

11 ответов на этот вопрос

  • 0
Cawfee
Великий Гуру

@Surfer_Selectrum, это называется избыточность: вы в двух таблицах храните и уровень прав администратора, и имя пользователя. В вашем случае правильнее хранить в столбце admin таблицы users идентификатор дескриптора (описателя) прав администратора в таблице admins. Тогда таблица admins не будет содержать столбец name, а таблица users в столбце admin не будет хранить уровень прав администратора текущего пользователя.

 

Тем не менее, дабы все-таки ответить на ваш вопрос, сообщаю, что в приведенном вами фрагменте кода отсутствуют какие-либо функции для записи данных в базу данных. Возможно, InfoPlayer какой-то навороченный макрос, а может быть сохранение текущих данных в базу данных осуществляется по флагу от какого-нибудь таймера, либо по событию.

Поделиться сообщением


Ссылка на сообщение
  • 0
moffes
Новичок

Если я правильно понял, то:
 

Создать в таблицу admins:

mysql_format(mysql, query, sizeof query, "INSERT INTO admins (name, password, level) VALUES (%s, %d, '%d')", name, password, level);

    mysql_query(mysql, query, false);


Изменить в Users:

mysql_format(mysql, query, sizeof query, "UPDATE users SET admin=%d", admin);
    mysql_query(mysql, query, false);

только все замени под себя

Если я все же правильно тебя понял, то нужно сделать проверку на то, есть ли уже в admins строка

Отредактировано пользователем moffes

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру


@moffes, не совсем. Идея в том, чтобы можно было сопоставить данные из таблиц users и admins на основе общего поля (идентификатора аккаунта) через операторы соединения (JOIN).

 

Таблица users должна иметь следующие столбцы:

  1. id (уникальный идентификатор аккаунта).
  2. name.
  3. password.
  4. sex.
  5. skin.
  6. money.
  7. regip.
  8. lastip.

Обратите внимание на отсутствие столбца admin!

 

Таблица admins должна иметь следующие столбцы:

  1. id (уникальный номер записи).
  2. accountid (уникальный идентификатор аккаунта, аналогичный полю id таблицы users.
  3. password.
  4. level.

 

Теперь для выдачи прав администратора игроку нужно создать новую запись в таблице admins. Для изменения текущих прав администратора нужно, соответственно, изменить существующую запись. Удаление записи влечет лишение игрока прав администратора. Для того, чтобы при подключении игрока к серверу одним запросом получить всю информацию как из таблицы users, так и из таблицы admins, нужно соединить обе этих таблицы по столбцу admins. Например, вот так:

"SELECT * FROM users LEFT JOIN admins ON users.id = admins.accountid WHERE users.name = '%s' and users.password = '%s'", PlayerInfo[playerid][pAccountID], PlayerInfo[playerid][pPassword]

Пример выше очень примитивен и не учитывает тот факт, что, скажем, хранение паролей в базе данных "как есть" мягко говоря плохое решение.

Поделиться сообщением


Ссылка на сообщение
  • 0
surenescore
Освоившийся

@Surfer_Selectrum Чтобы решить твою проблему правильно: нужно учитывать несколько моментов архитектуры базы данных и обеспечения целостности данных. В твоем же случае наблюдается что ты хранишь уровень администратора и имя пользователя в двух таблицах (`admins` и `users`), что не является оптимальным подходом.

 

Правильнее было бы использовать одну таблицу для хранения информации об уровне администратора и ссылаться на нее из основной таблицы пользователей. Это уменьшит избыточность и упростит управление данными. Например, в таблице `users` у тебя должен быть столбец `admin_id`, который ссылается на идентификатор в таблице `admins`.

 

Твой текущий код не включает операции вставки и обновления в базу данных. Вот как это можно сделать, сохраняя корректность и эффективность работы:

CMD:makeadmin(playerid, params[])
{
    new string[128];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));

    if(GetAdmin(playerid, adminLogin) == falsereturn SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Вы не являетесь администратором");
    if(GetAdmin(playerid, adminLevel) < 6return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Вы не можете использовать данную команду");

    if(!IsPlayerConnected(params[1])) return SCM(playerid, 0xA3A3A3AA"[C20000]Ошибка[]C_GREY] Данный игрок не в сети!");
    if(!strlen(params[1]) || !strlen(params[2])) return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Введите: /makeadmin [ID игрока] [Уровень администратора 0-8]");

    new targetid = strval(params[1]);
    new level = strval(params[2]);

    if(level < 0 || level > 8return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Уровень администратора [0-8]!");

    format(string, sizeof(string), "SELECT `id` FROM `users` WHERE `name`='%s'", pname);
    new Cache:cache = db_query(mysqlHandle, string);
    if(cache_get_row_count(cache) == 0) {
        db_free_result(cache);
        return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Пользователь не найден в базе данных");
    }
    db_free_result(cache);

    if(level == 0) {
        format(string, sizeof(string), "DELETE FROM `admins` WHERE `name`='%s'", pname);
        db_query(mysqlHandle, string);
    } else {
        format(string, sizeof(string), "REPLACE INTO `admins` (`name`, `password`, `level`) VALUES ('%s', '%s', %d)", pname, "somepassword", level);
        db_query(mysqlHandle, string);
    }

    format(string, sizeof(string), "UPDATE `users` SET `admin`=%d WHERE `name`='%s'", level, pname);
    db_query(mysqlHandle, string);

    InfoPlayer[targetid][pName] = level;
    format(string, sizeof(string), "Администратор %s изменил ваш уровень администратора на: %d", pname, level);
    SCM(params[0], 0xFFFFFFAA, string);

    return true;
}

 

В этом коде выполняется сначала проверка наличия пользователя в таблице `users`. Если он найден, затем проверяется уровень администратора. Если он равен 0, то запись удаляется из таблицы `admins`. В противном случае используется `REPLACE INTO`, чтобы обновить или вставить новую запись в `admins`. Также обновляется поле `admin` в таблице `users`.

Такой подход минимизирует избыточность данных и поддерживает целостность и консистентность базы данных.

Отредактировано пользователем D2DChat
Причина: Орфографические ошибки.

Поделиться сообщением


Ссылка на сообщение
  • 0
Surfer_Selectrum
Новичок

@D2DChat 

Снимок экрана 2024-07-27 223136.png

@D2DChat ../server/admins/cmd.inc(30) : error 017: undefined symbol "mysqlHandle"
../server/admins/cmd.inc(30) : warning 213: tag mismatch: expected tag "Cache", but found "DBResult"
../server/admins/cmd.inc(31) : warning 213: tag mismatch: expected tag none ("_"), but found "Cache"
../server/admins/cmd.inc(32) : warning 213: tag mismatch: expected tag "DBResult", but found "Cache"
../server/admins/cmd.inc(35) : warning 213: tag mismatch: expected tag "DBResult", but found "Cache"
../server/admins/cmd.inc(39) : error 017: undefined symbol "mysqlHandle"
../server/admins/cmd.inc(42) : error 017: undefined symbol "mysqlHandle"
../server/admins/cmd.inc(46) : error 017: undefined symbol "mysqlHandle"

некоторые ошибки исправил

 

Отредактировано пользователем Surfer_Selectrum

Поделиться сообщением


Ссылка на сообщение
  • 0
surenescore
Освоившийся

@Surfer_Selectrum 

CMD:makeadmin(playerid, params[])
{
    new string[256];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));

    if(GetAdmin(playerid, adminLogin) == falsereturn SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Вы не являетесь администратором");
    if(GetAdmin(playerid, adminLevel) < 6return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Вы не можете использовать данную команду");

    if(!IsPlayerConnected(params[1])) return SCM(playerid, 0xA3A3A3AA"[C20000]Ошибка[]C_GREY] Данный игрок не в сети!");
    if(!strlen(params[1]) || !strlen(params[2])) return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Введите: /makeadmin [ID игрока] [Уровень администратора 0-8]");

    new targetid = strval(params[1]);
    new level = strval(params[2]);

    if(level < 0 || level > 8return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Уровень администратора [0-8]!");

    format(string, sizeof(string), "SELECT `id` FROM `users` WHERE `name`='%s'", pname);
    mysql_tquery(mysqlHandle, string, "OnAdminCheckQuery""ii", playerid, level);

    return true;
}

forward OnAdminCheckQuery(playerid, level);
public OnAdminCheckQuery(playerid, level)
{
    new string[256];
    new pname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, pname, sizeof(pname));

    if(cache_num_rows() == 0) {
        return SCM(playerid, 0xA3A3A3FF"[C20000]Ошибка[]C_GREY] Пользователь не найден в базе данных");
    }

    if(level == 0) {
        format(string, sizeof(string), "DELETE FROM `admins` WHERE `name`='%s'", pname);
        mysql_tquery(mysqlHandle, string);
    } else {
        format(string, sizeof(string), "REPLACE INTO `admins` (`name`, `password`, `level`) VALUES ('%s', '%s', %d)", pname, "somepassword", level);
        mysql_tquery(mysqlHandle, string);
    }

    format(string, sizeof(string), "UPDATE `users` SET `admin`=%d WHERE `name`='%s'", level, pname);
    mysql_tquery(mysqlHandle, string);

    InfoPlayer[playerid][pName] = level;
    format(string, sizeof(string), "Администратор %s изменил ваш уровень администратора на: %d", pname, level);
    SCM(playerid, 0xFFFFFFAA, string);

    return true;
}

 

Поделиться сообщением


Ссылка на сообщение
  • 0
Cawfee
Великий Гуру

@D2DChat, не нужен столбец admin в таблице users – он вообще не имеет никакого смысла, это избыточность. Достаточно в таблице admins завести столбец для хранения идентификатора аккаунта, который и будет первичным и уникальным ключом для данной таблицы.

Поделиться сообщением


Ссылка на сообщение
Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу

  • Похожий контент

    • Дебилойд
      От Дебилойд
      Здравствуйте!
      Мы ищем талантливого 3D-моделлера в команду нашего CRMP-проекта!
      Что нужно будет делать:
      Моделировать и адаптировать автомобили.
      Создавать и настраивать скины (модели персонажей).
      Большим плюсом будет:
      Умение создавать качественные и оптимизированные интерьеры.
      Если вы хотите стать частью нашей команды и развивать проект вместе с нами, пишите в ЛС. Ждем ваши портфолио!
    • LORDIKUS
      От LORDIKUS
      Уважаемые участники форума - всех приветствую, кто перешел в беседу моей темы обсуждения. В настоящее время у меня зарождается огромное желание и мысль создать собственный CR:MP проект, но столкнулся с единственной проблемой - с отсутствием команды людей, у которых будет искреннее желание ежедневно вкладывать свой труд на разработку проекта. Особого опыта в скриптинге, маппинге, дизайне или в моделировании у меня не имеется, поэтому такой критерий как опыт в определенной сфере для желающих вступить в команду я не рассматриваю. Так как проект не открыт и находится на начальной стадии создания, мое сотрудничество выстраивается на некоммерческой основе (без выплаты за проделанную работу и труд), однако я не собираюсь отрицать высокую ценность вложенного командой труд — труд, особенно на первой стадии разработки я рассматриваю превыше всего. После открытия проекта в зависимости от коммерции и чистой прибыли каждый участник будет получать настоящую выплату, однако это также может убить еще значительное время. Мне нужна команда, которая проявит искренний интерес в создании общего между командой CR:MP проекта, пожертвует свое время, а также вложит собственный труд благодаря заработанным навыкам. Если вас заинтересовала данная тема обсуждения, пожалуйста, свяжитесь со мной по любым возможным и удобным для вас контактам связи ниже. Спасибо всем, кто зашел в мою беседу!

      🔗 Спец. Связь:
      — DISCORD: https://discord.com/users/1452715348196589691 (перейти по ссылке и добавить в друзья) ИЛИ _shin833_ (ввести никнейм и отправить запрос дружбы)
      — VK: https://vk.com/shin833
      — TG: https://t.me/s_hin833
    • Korochansky
      От Korochansky
      Настало время объявить о скором выпуске первого релиза среды разработки под названием Spawn.

      В настоящее время программа находится на заключительных этапах доработки кода и локализации интерфейса.
      Таким образом, в течение следующей недели будет выпущена быстрая и современная среда разработки, обладающая следующими возможностями (о которых я расскажу сейчас, а о других — позже):
       
      Полнофункциональный локальный Git: 
      Индексирование, фиксации, индикаторы состояния и мягкий/жесткий сброс до любой точки сохранения одним щелчком мыши. Разрабатывайте свой игровой сервер, не боясь его сломать.
      Новички могут рассматривать это как историю кодовой базы вашего сервера (что и есть на самом деле).
       
      Чистый UTF-8 (без BOM): 
      Полный отказ от устаревшей кодировки Windows-1251 (CP1251) для абсолютной стабильности и идеальной совместимости с Git.
      Реализация поддержки CP1251 привела бы к нестабильному поведению программы и ухудшила бы пользовательский опыт.
       
      История изменений строк: Редактор выделяет измененные строки в реальном времени в полях рядом с номерами строк. Это позволяет мгновенно видеть границы изменений, внесенных с момента открытия файла.
       
      Сопоставление и выделение фигурных скобок: мгновенное выделение открывающих и закрывающих фигурных скобок для быстрой навигации по структуре кода и защиты от ошибок компиляции.
       
      Интеграция с SAMPCTL: готовая к использованию автоматизация процессов. Сборка, запуск сервера и менеджер зависимостей (управление библиотеками и плагинами) работают напрямую из интерфейса редактора.
       
      И многое другое...
       
      И самое главное: проект будет с открытым исходным кодом под лицензией GPLv3!
      Следите за новостями о выпуске в репозитории: https://github.com/daniilkorochansky/spawn
    • KodBi
      От KodBi
      шапка
      по одиночке работают
      нужны оба