Вопросы

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
Cawfee
Великий Гуру

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

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

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

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

 

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


Ссылка на сообщение
Поделиться на другие сайты
  • 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. Если из базы данных не было получено ни одной строки, значит введен неправильный пароль. Если же было что-либо получено, отлично, авторизуем игрока.

  открыть спойлер

 

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

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


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

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

 

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

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

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


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

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

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


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

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

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

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

    • whccompany
      От whccompany
      World Hosting Corporations 
                                                                GTA Game Host 
                                               CRMP PC& Mobile Project 
                                           Rostov Role Play | Rostov RP 
      Друзья, нашему проекту срочно требуется маппер для масштабного маппинга, нам требуется сделать:
      1) Городской маппинг (удалить города и создать новые города, сначало необходимо создать город Ростов-на-Дону ; посёлок Коксовый и село Ряженое, создать используя стоковые фотографии из Яндекса и Гугла)
      2) Фракционный маппинг ( Текстуры + Экстерьер + Интерьер )
      3) Маппинг работ ( Текстуры + Экстерьеры + Интерьеры )
      Бюджет до 60 000 рублей
      Возможно заключение трудового контракта 
      Пишите: ВКонтакте

    • gooding
      От gooding
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

    • gooding
      От gooding


      Скачать файл PAR RP | Уникальный мод без багов
      Всем здравствуйте, уважаемые читатели. Я много времени потратил на доработку данного игрового мода, чтобы его выставить на форум.
      Лог доработок можно посмотреть внизу, а скриншоты игрового мода внизу и верху.
       
       

      Добавил gooding Добавлено 20.11.2024 Категория Моды Автор GOODING (Я)  
    • Kalinin
      От Kalinin
      1. Набираю команду для создания CRMP сервера.
      2. Вакансии  которые свободны. Связь через TG @kalinin_sql
      Нам нужны;
      1.Кодеры
      2.Маперы
      3.СММ
      Так-же дружная работа. По поводу зарплаты будем обговаривать все лично в беседе ТГ