Вопросы

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

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

 

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

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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;
    }
    
    /* здесь авторизация игрока */
}

 

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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]

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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;
}

 

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

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


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

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

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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.

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


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

  • Последние посетители   0 пользователей онлайн

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

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

    • KAIF
      От KAIF


      Скачать файл GTA RolePlay-МОД,СБОРКА
      !!!!!ВСЕГО ОДНА КОПИЯ!!!! 
      Единственный мод GTA RP.
       
      Фракции:
      Правительство
      ГИБДД
      Полиция Южного
      ФСБ
      ЦГБ-А
      Автошкола
      Китайская мафия
      Русская Мафия
      Итальянская Мафия
      Американская Мафия
      Чеченская Мафия
      ВВС
      МЧС
      ОПГ Тяп-Ляп
      ОПГ Хади-Такташ
      СМИ Южного
      ФСИН
      В комплекте идёт СБОРКА И МОД.
      Единственный мод GTA RP.
      Добавил KAIF Добавлено 01.01.2024 Категория Моды Автор Aleksandr  
    • KAIF
      От KAIF
      !!!!!ВСЕГО ОДНА КОПИЯ!!!! 
      Единственный мод GTA RP.
       
      Фракции:
      Правительство
      ГИБДД
      Полиция Южного
      ФСБ
      ЦГБ-А
      Автошкола
      Китайская мафия
      Русская Мафия
      Итальянская Мафия
      Американская Мафия
      Чеченская Мафия
      ВВС
      МЧС
      ОПГ Тяп-Ляп
      ОПГ Хади-Такташ
      СМИ Южного
      ФСИН
      В комплекте идёт СБОРКА И МОД.
      Единственный мод GTA RP.
    • Узбек
      От Узбек
      Всем добрый вечер ребят! 
      Я начинающий, сегодня я вам сливаю команду 2(шт) на технические работы
      Ловите