Question

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);

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

Share this post


Link to post
Share on other sites

7 answers to this question

  • 0

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

 

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

Edited by iZiZ

Share this post


Link to post
Share on other sites
  • 1

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

Share this post


Link to post
Share on other sites
  • 0

@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;
    }
    
    /* здесь авторизация игрока */
}

 

 

Share this post


Link to post
Share on other sites
  • 0

@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]

Share this post


Link to post
Share on other sites
  • 0

@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;
}

 

Edited by iZiZ

Share this post


Link to post
Share on other sites
  • 0

@iZiZ стоп,это проверка на правильность пароля?

Share this post


Link to post
Share on other sites
  • 0

@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.

Share this post


Link to post
Share on other sites
Guest
This topic is now closed to further replies.

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • danya_white
      By danya_white


      Просмотр файла Игровой мод Renaissance RolePlay
      Доброго времени суток, хочу выставить на продажу игровой мод проекта Renaissance RP.
       
      Данный мод является не последний актуальный версии проекта, а версия ниже, многие актуальные систему отсутствуют, но они будут дополняться, со временем. Основные функции на проекте Renaissance RP присутствую в данном моде, это первая версия проекта, поэтому буду дополнять тему своими доработками, также есть TEST IP, реальному покупателю в личные сообщение на форуме, дам данные.
       
      Информация о моде:
      Версия MYSQL - R39-6
      Античит - Встроенный + SAMP-AC
      Стример - Streamer Plugin v2.9.4 by Incognito
      Командный процессор - Pawn CMD
      Основа мода - Brilliant RP
      Остальное Все плагины обновлены до последней версии
       
       
      Основные системы которые присутствуют в данном моде:
      - Система промокодов для семей (/family) - Система выборов - Динамичная система (/lmenu), возможность назначать транспорт, форму сотрудников - Система подразделений в гос.организациях - Система КАЗИНО - Система акксесуаров - Оптимизация игрового мода. - Риелторское агенство. - Квестовая линия (НАЧАЛО) p.s И еще многие другие системы, более подробно на тестовом сервере.
      Добавил danya_white Добавлено 26.10.2021 Категория Моды Автор danya  
    • danya_white
      By danya_white
      Доброго времени суток, хочу выставить на продажу игровой мод проекта Renaissance RP.
       
      Данный мод является не последний актуальный версии проекта, а версия ниже, многие актуальные систему отсутствуют, но они будут дополняться, со временем. Основные функции на проекте Renaissance RP присутствую в данном моде, это первая версия проекта, поэтому буду дополнять тему своими доработками, также есть TEST IP, реальному покупателю в личные сообщение на форуме, дам данные.
       
      Информация о моде:
      Версия MYSQL - R39-6
      Античит - Встроенный + SAMP-AC
      Стример - Streamer Plugin v2.9.4 by Incognito
      Командный процессор - Pawn CMD
      Основа мода - Brilliant RP
      Остальное Все плагины обновлены до последней версии
       
       
      Основные системы которые присутствуют в данном моде:
      - Система промокодов для семей (/family) - Система выборов - Динамичная система (/lmenu), возможность назначать транспорт, форму сотрудников - Система подразделений в гос.организациях - Система КАЗИНО - Система акксесуаров - Оптимизация игрового мода. - Риелторское агенство. - Квестовая линия (НАЧАЛО) p.s И еще многие другие системы, более подробно на тестовом сервере.
    • Kirill_Bess
      By Kirill_Bess
      Приветствую
      При запуске сервера на хостинге выдаёт ошибку [Unknown] 
      При запуске сервера через приложение samp-server.exe выдаёт ошибки плагинов,но я не знаю как из исправить подскажите пожалуйста
      Сразу спасибо за помощь
      Вот логи: