Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!: Создание системы регистрации [MySQL R39/R40] - Форум Pawn-Wiki.Ru - Воплоти мечту в реальность!

Перейти к содержимому

Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

[ Урок ]
Создание системы регистрации [MySQL R39/R40] Создание системы регистрации на основе плагина MySQL [R39/R40]
Оценка: -----

#1
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию
Доброго времени суток.
В этом уроке я попытаюсь объяснить Вам, как создаётся система записи/загрузки аккаунтов на основе плагина MySQL от BlueG.
Код, предоставленный в статье, актуален для веток "R39" и "R40".
Начнём.




Плагин MySQL от BlueG:

GitHub
«Скачать актуальную версию»
Тема на официальном форуме
«Описание и т.п.»



F.A.Q. <Как скачать с GitHub> [Показать]





База данных:

  • Софт для работы с базой данных:
    Для работы с базой данных (чтение/редактирование) я предпочитаю использовать Denwer. О нём я Вам и расскажу.
    P.S. Если Вы боитесь софта с закрытым исходным кодом, можете использовать любую другую программу, но инструкции по работе с ней придётся искать самостоятельно
    (так же буду не против, если Вы напишете мне название этой программы. Возможно, я дополню свой урок, рассказав о ней)


    Официальный сайт программы denwer.ru На нём Вы можете как скачать программу,
    так и найти кучу полезной информации по работе с ней.
    Я лишь опишу Вам о тех её возможностях,
    что пригодятся Вам при создании нашей системы.
    Страница в википедии ru.wikipedia.org/wiki/Денвер_(программа) Так же есть немного полезной информации


    F.A.Q. <Как скачать с официального сайта Denwer> [Показать]





    F.A.Q. <Установка Denwer> [Показать]





    F.A.Q. <Как открыть веб-приложение для работы с СУБД MySQL (Denwer)> [Показать]





    F.A.Q. <Краткий экскурс по phpMyAdmin> [Показать]





  • Работа с базой данных:

    В данной инструкции я расскажу Вам о том, как создать базу данных в Denwer (об этой программе я рассказал выше)


    • Открываем phpMyAdmin, если не сделали этого ранее


    • В панели сверху выбираем пункт "Базы данных"


      Скриншот [Показать]




    • В поле под надписью "Создать базу данных" вводим имя нашей базы данных (я введу "sa-mp". Вы можете написать своё) и в поле "Сравнение" выбираем "utf8_general_ci". После того, как совершили эти действия, нажимаем на кнопку "Создать".


      Скриншот [Показать]




    • Если всё сделали правильно, phpMyAdmin уведомит Вас о успешном создании нашей базы данных и в списке слева появится новая запись.

      Скриншот [Показать]



      Если нет - исправляем ошибки, о которых сообщит phpMyAdmin, и создаём.


  • Создание таблицы для хранения аккаунтов:

    • Выбираем базу данных, в которой будем создавать таблицу (если Вы создавали базу данных вместе со мной, то выбираем "sa-mp")


    • На открывшейся странице находим окошко "Создать таблицу" и вводим данные о таблице:
      • В поле "Имя таблицы" вводим "accounts"
      • В поле "Количество столбцов" вводим "3"

      и нажимаем "ОК"

      Скриншот [Показать]




    • Структуру новой таблицы заполняем следующим образом:


      Скрытый текст [Показать]




      Скриншот [Показать]



  • Создание самой системы:

    • Данные для подключения
      В начало нашего скрипта (под "#include <a_samp>") добавим:
      #include <a_mysql>
      
      #define MYSQL_HOST                "localhost"//Адрес, по которому расположен MySQL-Сервер
      #define MYSQL_USER                "root"//Имя пользователя, на которого была создана база данных
      #define MYSQL_DATABASE            "sa-mp"// Имя базы данных
      #define MYSQL_PASSWORD            ""//Пароль для доступа к серверу MySQL 
      
      


      Так же нужно добавить переменную, в которой будет хранится ID подключения к базе данных

      Скрытый текст [Показать]





      Разбор кода [Показать]





      Скриншот [Показать]








    • Подключение к базе данных
      Теперь нам нужно связать сервер с нашей базой данных. Для этого в OnGameModeInIt пропишем следующий код:


      Скрытый текст [Показать]




      Так же, если Вы хотите сохранять в базу данных текст на русском, следует добавить следующие запросы прямо после подключения

      Скрытый текст [Показать]





      Разбор кода [Показать]




      Скриншот [Показать]





      Дополнение: Отслеживание качества подключения [Показать]









    • "Перечисление" (enum) для хранения данных


      Немного лирики [Показать]



      Под наши данные для подключения добавим следующий код:
      enum e_PLAYER_INFO
      {
      	pID,
      	pName[MAX_PLAYER_NAME],
      	pPassword[31]
      };
      new pInfo[MAX_PLAYERS][e_PLAYER_INFO];
      



      Разбор кода [Показать]





      Скриншот [Показать]









    • Поиск игрока в базе данных и запись ника в массив

      Теперь нам нужно сделать запрос для поиска игрока в базе данных, а так же записать ник игрока (ибо игрок не сможет сменить свой ник без нашего ведома, поэтому логичнее всего просто 1 раз записать его при входе и уже использовать массив, чем каждый раз вызывать GetPlayerName).
      В OnPlayerConnect вставим:

      Скрытый текст [Показать]







      Скриншот [Показать]




      Так же нам нужно эти данные записать в наш массив. Для этого мы идём в самый конец скрипта (для удобства) и вставляем туда следующий код:

      Скрытый текст [Показать]








    • Создание действий для диалогов регистрации/авторизации

      Сначала нам нужно вспомнить о себе любимых и упростить работу с диалогами, создав ещё одно перечисление, которое будет позволять писать нам на месте ID диалога какие-то слова, намекающие нам на предназначение этого диалога, а не обычные числа. Ведь согласитесь, "dRegister" гораздо сильнее намекает нам на то, что этот диалог является диалогом регистрации, нежели просто "0", "1" или какое-либо ещё число. Но перечисление не только даст нам возможность более лучше понимать предназначение диалога по его ID, но и избавит нас от страха того, что ID диалогов могут перепутаться, ведь перечисление само определит свободный ID и установит его.

      Чтоб создать такое перечисление, находим наше перечисление с данными игроков и выше него создадим ещё одно:
      enum e_DIALOG_IDs
      {
      	dKickMessage,//Автоматически займёт ID 0
      	dRegister,//ID 1
      	dLogin//ID 2
      };
      



      Если Вы желаете изменить порядковые ID в перечислении [Показать]



      Всё =) Теперь достаточно придумывать имя каждому новому диалогу, дописывать его в этот список и тогда Вы точно никогда не запутаетесь при создании новых диалогов.

      Теперь напишем сами действия. В OnDialogResponse добавим:

      Скрытый текст [Показать]




      Разбор кода [Показать]




      Скриншот [Показать]




  • Создание/загрузка аккаунта игрока

    Создание аккаунта:
    В самый конец мода вставим этот stock:

    Скрытый текст [Показать]




    Загрузка аккаунта:

    Скрытый текст [Показать]





    Скриншот [Показать]








  • Сохранение аккаунта

    Так же, в самом конце, добавим новый stock

    Скрытый текст [Показать]





    Немного моего мнения [Показать]





    Скрытый текст [Показать]



    И в OnPlayerDisconnect
    SaveAccount(playerid);
    






  • Отключение от базы данных

    Так же нужно не забыть добавить запрос к плагину MySQL на отключение от нашей базы данных. Делается это просто.
    В OnGameModeExit
    mysql_close(mysql_connect_ID);  
    






  • Обнуление массива с данными
    Это действие требуется для того, чтоб данные одного игрока не перемешались с данными другого в случае, если один игрок вышел и второй зашёл на тот же слот.

    Делается это просто. Сначала в OnPlayerDisconnect, после "SaveAccount(playerid);" добавим:
    RemovePlayerInfo(playerid);
    


    А после в конец скрипта:
    stock RemovePlayerInfo(playerid)
    {
        pInfo[playerid][pID] = 0;
        pInfo[playerid][pName][0] = EOS;
        pInfo[playerid][pPassword][0] = EOS;
        return 1;
    }
    



    Разбор кода [Показать]








  • Проверка на авторизацию игрока
    Эта проверка может пригодится в случаях, когда нужно запретить игроку выполнять какие-либо действия пока он не авторизировался.

    В начало мода, к переменным, добавим следующий массив:
    new player_is_authorized[MAX_PLAYERS char];
    


    Почему именно массив, а не pVar [Показать]



    А далее есть два варианта: либо использовать массив напрямую, либо сделать макрос-функцию, которую уже и использовать дальше. Я опишу оба варианта, а дальше выбирать только Вам :)

    Вариант первый: Использование макроса [Показать]




    Вариант второй: Прямое использование [Показать]




Если есть какие-либо вопросы, если что-то непонятно объяснено или есть какие-либо дополнения/исправления для данного урока, прошу написать об этом ниже. Всем постараюсь помочь, все мнения приму к сведению.
С вами был DeimoS. Спасибо за внимание :dn:

Автор урока - DeimoS
Копирование данного материала запрещено без разрешения автора




UPD: Исправление ошибок "Запуск программы невозможен, так как на компьютере отсутствует MSVCP***.dll. Попробуйте переустановить программу"

Цитата

Сообщение об ошибке Требуемый компонент
MSVCP120.dll Microsoft Visual C++ 2013
MSVCP110.dll Microsoft Visual C++ 2012
MSVCP100.dll Microsoft Visual C++ 2010
MSVCP90.dll Microsoft Visual C++ 2008
MSVCP80.dll Microsoft Visual C++ 2005

Microsoft Visual C++ 2013 Redistributable Package
32 - bit
64 - bit
Microsoft Visual C++ 2012 Redistributable Package
32 - bit
64 - bit
Microsoft Visual C++ 2010 Redistributable Package
32 - bit
64 - bit
Microsoft Visual C++ 2008 Redistributable Package
32 - bit
64 - bit
Microsoft Visual C++ 2005 Redistributable Package
32 - bit
64 - bit


Цитата

Готовый код регистрации (R39) на Pastebin: http://pastebin.com/QiymnrPK
Готовый код регистрации (R40) на Pastebin: http://pastebin.com/BFDpSDtx

Сообщение отредактировал DeimoS: 29 июня 2020 - 20:19

3

#2
Пользователь офлайн   OrizonaFp 

  • Новичок
  • Вставить ник
  • Раскрыть информацию
Привет, начал делать мод с твоей основой(спасибо,она хорошая).Но почемуто именно в этом коде не работает система денег. Чтобы при заходе давалось то кол-во денег которое записано в БД.
ResetPlayerMoney(playerid);
GivePlayerMoney(playerid, pInfo[playerid][pMoney]);

Помоги пожалуйста!

Сообщение отредактировал OrizonaFp: 05 июля 2020 - 20:43

0

#3
Пользователь офлайн   DeimoS 

  • Evil Scripter
  • Вставить ник
  • Раскрыть информацию

Просмотр сообщенияOrizonaFp (05 июля 2020 - 20:43) писал:

Нажмите сюда, чтобы прочитать это сообщение. [Показать]


Вопрос, как я понимаю, решён?
0

Поделиться темой:


Страница 1 из 1
  • Вы не можете создать новую тему
  • Вы не можете ответить в тему

1 человек читают эту тему
0 пользователей, 1 гостей, 0 скрытых пользователей


Яндекс.Метрика