В теме 2 сообщения

Antoxa39
Dance 80-90, mmm Nice)

Дратути,я научился делать регистрацию, и хочу поделится со всеми как это сделать им самим.

1.Нам потребуется: Denwer или Open Server. ( Урок про подключение я делал ранее, так что обьяснять сейчас что и как делать для подключения не буду, но урок можно посмотреть тут)

2.MySQL R39-6.

3. Прямые руки.

4. Переходим к процессу.

//P.S БД - База Данных

Делаем подключение к БД.

main(){}
#include <a_samp>


#include <a_mysql>
#include <Pawn.CMD>
#include <sscanf2>
#include <streamer>
#include <time>

//--------------   SQL     ----------------------
new dbHandle;
#define MYSQL_HOST "127.0.0.1"
#define MYSQL_USER "mysql"
#define MYSQL_BD "urok"
#define MYSQL_PASSWORD "mysql"
//------------------------

public OnGameModeInit()
{
    dbHandle = mysql_connect(MYSQL_HOST,MYSQL_USER,MYSQL_BD,MYSQL_PASSWORD);
    CheckConnectSQL();
    return 1;
}

public OnGameModeExit()
{
    return 1;
}
stock CheckConnectSQL()
{
    if(mysql_errno()) printf("Подключение к БД %s прервалось. Код ошибки: %d",MYSQL_BD,mysql_errno())
    else printf("Подключение к БД %s успешно!",MYSQL_BD)
    return 1;
}


Подключение сделано.

Далее мы должны сделать такое: Когда игрок заходит на сервер, нужно проверить есть ли игрок с таким Никнеймом в БД.

Делаем массив,который будет хранить в себе пароль,имя игрока. ( сделаем еще и уровень ).

// перед --------------   SQL     ---------------------- создаем enum
//Enum - это вещь, позволяющая создавать большее количество адресов одной переменной
enum pInfo{
    pID,
    pNick[24],
    pPassword[32],
    pLevel
}
new Player[MAX_PLAYERS][pInfo];//Мы обьявили переменную,которая будет хранить в себе наш Enum.

Идем создавать БД.

1.

2.

3.

4.

5. Идем обратно к скриптингу

И вот тут, мы сделаем проверку есть ли в БД аккаунт с таким никнеймом.

public OnPlayerConnect(playerid)
{
    GetPlayerName(playerid,Player[playerid][pNick],MAX_PLAYER_NAME);//Мы записали ник игрока в массив pNick.
    new query[100];//создаем переменную с запросом.
    format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//Форматируем запрос, SELECT * FROM, то есть 
    //загружаем всю информацию о игроке с ником, записаным в pNick.
    mysql_function_query(dbHandle,query,true,"CheckPlayerBD","i",playerid);//Посылаем запрос в БД, указываем ИД подключение - dbHandle. true - потому что мы хотим получить информацию. И вызываем следующим паблик "CheckPlayerBD"
    return 1;
}
//в конец мода
forward CheckPlayerBD(playerid);
public  CheckPlayerBD(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);//Проверили есть ли строка с таким именем.
    if(!rows)//если нет такого игрока то показываем регистрацию
    {
        ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Приветствуем Вас! Вы еще не зарегистрированы,введите свой пароль ниже.""Далее""");
    }
    else
    {
        ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Рады видеть Вас снова на Urok. Авторизуйтесь.""Далее""");
        cache_get_field_content(0,"pPassword",Player[playerid][pPassword],dbHandle);//Загружаем пароль игрока из БД.
    }
    return 1;
}

Я мог сделать ИД диалогов через енум, но для примера можно и так.

Далее идем в OnDialogResponse

public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
{
    switch(dialogid)
    {
        //case 1 это регистрация
        case 1:
        {
            if(!response) return Kick(playerid); // если игрок отказывается от регистрации кикаем его.
            if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Длина пароля от 4 до 32 символов.\n Вы также не можете продолжить не указав пароль""Далее""");
            //это была проверка на длину пароля
            for(new i; i < strlen(inputtext); i++)
            {
                switch(inputtext[i])
                {
                    case 'A'..'Z','a'..'z','0'..'9':continue;
                    defaultreturn ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Регистрация""Пароль может быть только: a-z, A-Z,0-9""Далее""");
                }
            }
            //это проверка на символы,если игрок будет писать пароль на русском, или какие нибудь другие символы
            //например \*? то ему будет возвращатся этот же диалог,а если все отлично то регистрация продолжится.
            new query[120 + MAX_PLAYER_NAME];//также создали запрос
            format(query,sizeof(query),"INSERT INTO `account` (`pNick`,`pPassword`,`pLevel`) VALUES ('%s','%s','1')"),Player[playerid][pNick],inputtext);
            /*Мы отформатировали строку,сделав в ней запрос: Добавить строку в таблице account, со столбцами pNick = '%s', %s значит строка
            в данном случае эта строка, это массив который хранит в себе никнейм игрока,inputtext это введеный текст игроком, pLevel это уровень игрока,изначально в бд он будет 1.*/
            mysql_query(dbHandle,query);
            //теперь делаем запрос на загрузку акканута.
            new query1[100];
            format(query1,sizeof(query1),"SELECT * FROM `account` WHERE `pNick` = '%s'",Player[playerid][pNick]);//отфарматироваали новый запрос
            mysql_function_query(dbHandle,query1,true,,"LoadAcc","i",playerid);
        }
    }
    case 2:
    {
        if(!response) return Kick(playerid); // если игрок отказывается от авторизации также кикаем его.
        if(strlen(inputtext) < 4 || strlen(inputtext) > 32 || strlen(inputtext) == 0return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Неверный пароль""Далее""");//Делаем проверку на длину пароля, т.к при регистрации у нас пароль был от 4 до 32, тут тоже самое должно быть
        for(new i; i < strlen(inputtext); i++)
        {
            switch(inputtext[i])
            {
                case 'A'..'Z','a'..'z','0'..'9'continue;//если он также вводит правильные символы продолжаем выполнение кода для игрока.
                defaultreturn  ShowPlayerDialog(playerid, 2, DIALOG_STYLE_INPUT, "Авторизация""Не верный пароль!""Далее""");// при вводе спец.символов ему будет возвращать диалог авторизации
            }
        }
        new query[120];
        format(query,sizeof(query),"SELECT * FROM `account` WHERE `pNick` = '%s' AND `pPassword` = '%s'",Player[playerid][pNick],inputtext)//Загрузить информацию о игроке,и проверить совпадает введеный пароль игроком,с тем который в БД.
        mysql_function_query(dbHandle,query,true,"CheckPass","i",playerid);
    }
    return 1;
}
//создаем паблик LoadAcc
forward LoadAcc(playerid);
public LoadAcc(playerid)
{
    Player[playerid][pID] = cache_get_field_content_int(0,"pID",dbHandle);// 0 потому что в БД может быть только одна строка с таким именем или ИД
    Player[playerid][pLevel] = cache_get_field_content_int(0,"pLevel",dbHandle);// приравнение, то есть записываем Левел и ИД игрока в наши массивы.
    //Пароль и никнейм загружать не надо
}
forward CheckPass(playerid);
public CheckPass(playerid)
{
    new rows,fields;
    cache_get_data(rows,fields);//сверяем пароль
    if(rows)
    {
        //если веденный пароль совпадает с паролем в БД то авторизуем игрока
        SpawnPlayer(playerid);
        SendClientMessage(playerid,-1,"Вы успешно авторизовались!");
    }
    else
    {
        //если нет то считаем попытки ввода пароля
        SetPVarInt(playerid,"wrong_password",GetPVarInt(playerid,"wrong_password") + 1)
        ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Авторизация","Не верный пароль!","Далее","");
        new str[64];
        format(str,sizeof(str),"У вас осталось: %d попыток",GetPVarInt(playerid,"wrong_password"));
        SendClientMessage(playerid,-1,str);//форматируем строку, где говорим игроку сколько у него осталось попыток
        if(GetPVarInt(playerid,"wrong_password") >= 5return Kick(playerid);//если игрок использовал больше 5 попыток, то кикаем его
    }

}

и в OnGameModeExit()

public OnGameModeExit()
{
    mysql_close(dbHandle);//отключаемся от БД
    return 1;
}

 

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


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

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

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

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

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

    • miroki
      От miroki
      Возможно ли как-то в pawno сделать темную тему?
    • Доналдо Фарекелка
      От Доналдо Фарекелка
      Приветствую, этот мод я нашёл на просторах интернета. 
      Скачал мод у автора:  Developer Stravinskiy.
      Доработал мод: Donaldo_Farekelka.
       
      Предупреждаю! Мод сырой, багов стало меньше, но они есть.
      Мод: Баня, Подвал, В некоторых местах маппинг, система коронавируса, 8 лвл админок.
       
      [01.11.2025] ВНИМАНИЕ! Не используйте бесплатные хостинги, если Вы не уверены в их работоспособности. Если запустили мод на бесплатном хостинге и он не работает, то просьба мне не писать! (Вина скорее всего, лежит на хостинге!). Исключение: dragon(Не реклама. Проверено на личном опыте).
      [29.11.2025] Спасибо! За 1000+ скачиваний. 
      [08.12.2025] ВНИМАНИЕ! Мод не рекомендуется к использованию для новичков. Мод признается старым.
      [16.02.2026] ВНИМАНИЕ! Если вы не умеете что-либо делать, то новичкам рекомендуется к изучению pawn роликов... книг(Например, PawnBook)... просмотр форумов на тему уроков. 
       
      Информация:
      1) Dc_Cmd
      2) Mysql, mode, language - Всё настраивается теперь в pawno ( UPDATE: 1.1.0 )
      3) Административные права в данный момент можно выдать через /amakeadmin(Смотреть уроки) или БД ( UPDATE: 1.2.2 ).

      Всё что я делаю сейчас, смотрите в изменениях.
      Что сделал:
       

      Как установить мод на хостинг(Чтобы больше не было вопросов в ЛС):
      RUTUBE: https://rutube.ru/video/private/f74276be05e090652ee46bcbe2b4e27d/?p=6tWFvG_lTFk4sHVaCjheZQ
      YOUTUBE: https://youtu.be/z07sJUAVQpI
    • Доналдо Фарекелка
      От Доналдо Фарекелка


      Скачать файл Arizona RolePlay || Ser
      Приветствую, этот мод я нашёл на просторах интернета. 
      Скачал мод у автора:  Developer Stravinskiy.
      Доработал мод: Donaldo_Farekelka.
       
      Предупреждаю! Мод сырой, багов стало меньше, но они есть.
      Мод: Баня, Подвал, В некоторых местах маппинг, система коронавируса, 8 лвл админок.
       
      [01.11.2025] ВНИМАНИЕ! Не используйте бесплатные хостинги, если Вы не уверены в их работоспособности. Если запустили мод на бесплатном хостинге и он не работает, то просьба мне не писать! (Вина скорее всего, лежит на хостинге!). Исключение: dragon(Не реклама. Проверено на личном опыте).
      [29.11.2025] Спасибо! За 1000+ скачиваний. 
      [08.12.2025] ВНИМАНИЕ! Мод не рекомендуется к использованию для новичков. Мод признается старым.
      [16.02.2026] ВНИМАНИЕ! Если вы не умеете что-либо делать, то новичкам рекомендуется к изучению pawn роликов... книг(Например, PawnBook)... просмотр форумов на тему уроков. 
       
      Информация:
      1) Dc_Cmd
      2) Mysql, mode, language - Всё настраивается теперь в pawno ( UPDATE: 1.1.0 )
      3) Административные права в данный момент можно выдать через /amakeadmin(Смотреть уроки) или БД ( UPDATE: 1.2.2 ).

      Всё что я делаю сейчас, смотрите в изменениях.
      Что сделал:
       

      Как установить мод на хостинг(Чтобы больше не было вопросов в ЛС):
      RUTUBE: https://rutube.ru/video/private/f74276be05e090652ee46bcbe2b4e27d/?p=6tWFvG_lTFk4sHVaCjheZQ
      YOUTUBE: https://youtu.be/z07sJUAVQpI
      Добавил Доналдо Фарекелка Добавлено 13.04.2023 Категория Моды Автор shenol (vk.com/donaldo_farekelka)  
    • Roman_Neblatnoy
      От Roman_Neblatnoy
      Не могу залить в мод систему /drift на копию радмир рп пробывал просто добавить в мод кучу варнингов и это просто не работает кто может объяснить как правильно заливать системы?