Вопросы

Antoxa39
Dance 80-90, mmm Nice)
case DLG_LOG:{
            if(!strlen(inputtext))    return ShowPlayerDialog(playerid, DLG_LOG, DIALOG_STYLE_INPUT, "Login""Âû íè÷åãî íå ââåëè â îêíî ðåãèñòðàöèè!""Äàëåå""Exit");
            new check_pass[124];
            format(check_pass,sizeof(check_pass),"SELECT `pass` FROM `accounts` WHERE `nick` = '%s'",pinfo[playerid][nick]);
            mysql_function_query(MySQL,check_pass,false,"spawn","i",playerid);

Я пытался сделать проверку на пароль но не понял как, подскажите пожалуйста

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


Ссылка на сообщение
Поделиться на другие сайты

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

  • 0
iZiZ
Новичок

@Antoxa39 Можно и так сказать. Это более менее нормальная реализация, хотя можно куда лучше сделать.

 

@Cawfee Как по мне, ваш вариант ещё хуже. :(

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 1
Cawfee
Великий Гуру

@iZiZ, ваш вариант действительно лучше, нежели мой, подогнанный под автора. К сожалению, у вас не увидел запрос на выборку данных об игроке из базы данных. Ибо, судя по предоставленным автором материалам, такого запроса больше у него нет.

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Cawfee
Великий Гуру

@Antoxa39, как у вас сейчас это реализовано:

  1. Игрок вводит пароль.
  2. Вы делаете запрос к базе данных, в котором просите ее вернуть пароль для конкретного игрока.
  3. Сверяете, соответствует ли введенное значение с паролем, хранящимся в базе данных. 

Как лучше реализовать в данной ситуации:

  1. Игрок вводит пароль.
  2. Вы делаете запрос к базе данных, в котором просите ее вернуть все данные об игроке с конкретным ником и конкретным паролем.
  3. Смотрите на результат SQL-запроса. Если он пуст, значит пароль введенный неверный. Если не пуст, то можете уже записывать все данные, полученные от базы данных, в переменную игрока.
Спойлер

case DLG_LOG: {
    if(!strlen(inputtext)) return ShowPlayerDialog(playerid, DLG_LOG, DIALOG_STYLE_INPUT, "Login""Âû íè÷åãî íå ââåëè â îêíî ðåãèñòðàöèè!""Äàëåå""Exit");
                
    new check_pass[124];
    format(check_pass,sizeof(check_pass),"SELECT * FROM `accounts` WHERE `nick` = '%s' AND `pass` = '%s'", pinfo[playerid][nick], inputtext);
    mysql_function_query(MySQL,check_pass,false,"spawn","i",playerid);  
}

forward spawn(playerid);
public spawn(playerid) {
    new rows, fields;
    cache_get_data(rows, fields); // получаем количество возвращенных строк и столбцов
    
    if (!rows) { // если строк нет, значит в базе данных нет аккаунта с таким ником и паролем
        /* здесь действия, если введен неправильный пароль */
        return;
    }
    
    /* здесь авторизация игрока */
}

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Antoxa39
Dance 80-90, mmm Nice)

@Cawfee не особо вас понял,вообщем я все заного сделал и вот смотрите:

////

//это в конце мода
forward check_reg(playerid);
public check_reg(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields,dbHandle);
    if(!rows)
    {
        ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Регистрация""Черный""ну ок)""выход");
    }
    else
    {
        ShowPlayerDialog(playerid,D_LOG, DIALOG_STYLE_INPUT, "АВТОРИЗЕЙШЕН""Черный""ну ок)""выход");
    }
    cache_get_field_content(rows,"pPassword",pinfo[playerid][pPassword],dbHandle);
}
forward spawn(playerid);
public spawn(playerid)
{
    SpawnPlayer(playerid);
    SetPlayerSkin(playerid,1);
    SetPlayerPos(playerid,1860.9879,2254.6895,15.2729);

    return 1;
}
//это в OnDialogResponse
    switch(dialogid)
    {
        case D_REG:{
        if(!response) return SCM(playerid,lime,"вы отказались от регистрации. Перезайдите!") & Kick(playerid);
        if(strlen(inputtext) < 4return ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Регистрация""{fed800}Пароль {FFFAFA} от 4 до 24 символов""ну ок)""выход");
        GetPlayerName(playerid,pinfo[playerid][pName],MAX_PLAYER_NAME);
        strmid(pinfo[playerid][pPassword],inputtext,0,strlen(inputtext));
        new query[160];
        format(query,sizeof(query),"INSERT INTO `accounts` (`pName`,`pPassword`) VALUES ('%s','%s')",pinfo[playerid][pName],inputtext);
        mysql_function_query(dbHandle,query,false,"spawn","i",playerid);
        strmid(pinfo[playerid][pPassword],inputtext,0,strlen(inputtext));
        }
        case D_LOG:{
        if(!response) return SCM(playerid,lime,"вы отказались от авторизации. Перезайдите!") & Kick(playerid);
        new pass[150];
        GetPlayerName(playerid,pinfo[playerid][pName],MAX_PLAYER_NAME);
        format(pass,sizeof(pass),"SELECT `pName` `pPassword` FROM `accounts` WHERE `pName` = '%s' AND `pPassword` = '%s'",pinfo[playerid][pName],pinfo[playerid][pPassword]);
        mysql_query(dbHandle,pass);
        if(strcmp(inputtext,pinfo[playerid][pPassword],true))
        {
            return ShowPlayerDialog(playerid,D_LOG, DIALOG_STYLE_INPUT, "АВТОРИЗЕЙШЕН""У ТИБЯ ДРУГОЙ ПОРОЛЬ""ну ок)""выход");
        }
        else
        {
            SCM(playerid,green,"Все топ");
            SpawnPlayer(playerid);
        }
        }
    }

То есть когда я ввожу любой пароль,и даже тот который указан в бд ( он там есть ), то пишет не верный пароль,а когда ничего не ввожу то игрока спавнит,у меня не записывается веденный пароль игрока в переменную pinfo[playerid][pPassword]

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
iZiZ
Новичок

@Antoxa39 

forward check_reg(playerid);
public check_reg(playerid)
{
    new rows, fields;
    cache_get_data(rows, fields, dbHandle);

    if(!rows)
    {
        ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Регистрация""Черный""ну ок)""выход");
    }
    else
    {
        cache_get_field_content(rows, "pPassword", pinfo[playerid][pPassword], dbHandle);

        ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "АВТОРИЗЕЙШЕН""Черный""ну ок)""выход");
    }
    return 1;
}
public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        case D_LOG:
        {
            if(!response) 
                return SCM(playerid, lime, "вы отказались от авторизации. Перезайдите!") & Kick(playerid);

            if(!strcmp(pinfo[playerid][pPassword], inputtext))
            {
                SCM(playerid, green, "Все топ");
                SpawnPlayer(playerid);
            }
            else ShowPlayerDialog(playerid, D_LOG, DIALOG_STYLE_INPUT, "АВТОРИЗЕЙШЕН""У ТИБЯ ДРУГОЙ ПОРОЛЬ""ну ок)""выход");
        }
    }
    return 1;
}

 

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 0
Cawfee
Великий Гуру

@Antoxa39, как минимум в самом запросе у вас ошибка (отсутствует запятая между полями для выборки):

SELECT `pName` `pPassword` FROM `accounts` WHERE `pName` = '%s' AND `pPassword` = '%s'

По идее, есть аккаунт с такой комбинацией есть в базе данных, необходимо загрузить все данные об игроке из базы данных в память сервера.

SELECT * FROM `accounts` WHERE `pName` = '%s' AND `pPassword` = '%s'

Далее, я не вижу вызов функции check_reg. Для того, чтобы ее вызвать, необходимо использовать функцию mysql_tquery вместо mysql_query. И да, желательно переименовать переменную pass, например, на query, ведь там содержится запрос, а не пароль. 

mysql_tquery(dbHandle, pass, "check_reg""i", playerid);

После вызова этой функции все события, связанные с авторизацией, должны проводиться в функции check_reg (поскольку все данные об аккаунте будут именно там, а не в текущем исполняемом блоке кода).

 

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

Спойлер

forward check_reg(playerid);
public check_reg(playerid) {
    new rows,fields;
    cache_get_data(rows,fields,dbHandle);
    if(!rows) {
        return ShowPlayerDialog(playerid,D_LOG, DIALOG_STYLE_INPUT, "АВТОРИЗЕЙШЕН""У ТИБЯ ДРУГОЙ ПОРОЛЬ""ну ок)""выход");
    }
    
    cache_get_field_content(rows,"pPassword",pinfo[playerid][pPassword],dbHandle);
    
    SCM(playerid,green,"Все топ");
    SpawnPlayer(playerid);
}

forward spawn(playerid);
public spawn(playerid) {
    SpawnPlayer(playerid);
    SetPlayerSkin(playerid,1);
    SetPlayerPos(playerid,1860.9879,2254.6895,15.2729);

    return 1;
}

//это в OnDialogResponse
switch(dialogid)
{
    case D_REG:{
        if(!response) return SCM(playerid,lime,"вы отказались от регистрации. Перезайдите!") & Kick(playerid);
        if(strlen(inputtext) < 4return ShowPlayerDialog(playerid, D_REG, DIALOG_STYLE_INPUT, "Регистрация""{fed800}Пароль {FFFAFA} от 4 до 24 символов""ну ок)""выход");
        
        GetPlayerName(playerid,pinfo[playerid][pName],MAX_PLAYER_NAME);
        strmid(pinfo[playerid][pPassword],inputtext,0,strlen(inputtext));
        
        new query[160];
        format(query,sizeof(query),"INSERT INTO `accounts` (`pName`,`pPassword`) VALUES ('%s','%s')",pinfo[playerid][pName],inputtext);
        mysql_function_query(dbHandle,query,false,"spawn","i",playerid);
        strcpy(pinfo[playerid][pPassword], inputtext);
    }
    
    case D_LOG:{
        if(!response) return SCM(playerid,lime,"вы отказались от авторизации. Перезайдите!") & Kick(playerid);
        
        new query[150];
        GetPlayerName(playerid,pinfo[playerid][pName],MAX_PLAYER_NAME);
        
        format(query,sizeof(query),"SELECT * FROM `accounts` WHERE `pName` = '%s' AND `pPassword` = '%s'", pinfo[playerid][pName], pinfo[playerid][pPassword]);
        mysql_tquery(dbHandle, query, "check_reg""i", playerid);
    }
}

 

 

И да, для полной перезаписи строки, вместо strmid лучше используйте strcpy.

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


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

  • Последние посетители   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
      шапка
      по одиночке работают
      нужны оба