[Урок] Регистрация на mysql [new.pwn] - Форум Cheat-Master.ru
  • Страница 1 из 1
  • 1
Модератор форума: Phoenixxx_Czar, Getbackthere, [CM]OlegEhtler  
[Урок] Регистрация на mysql [new.pwn]
Амасинк Дата: Воскресенье, 13.09.2015, 15:17 | Сообщение # 1
Боец
Сообщений: 267
Статус: Offline
Увидел, что некоторые ищут регистрацию на Mysql от BlueG. Дабы не отправлять пользователей на другой портал - решил так сказать "Перенести" урок сюда.


Первым делом подключаем инклуд и включаем denwer (phpmyadmin).

В начало мода добавляем:

Код

#define MYSQL_HOST                "localhost"    
#define MYSQL_USER                "root"    
#define MYSQL_DATABASE            "bd"    
#define MYSQL_PASSWORD            ""    
#define MYSQL_CONNECT_INFO        MYSQL_HOST,MYSQL_USER,MYSQL_DATABASE,MYSQL_PASSWORD    

new mysql_connect_ID;   


Где localhost/root/bd - ваш хост/имя пользователя/название базы соответственно.

В OnGamemodeInit:

Код
mysql_connect_ID = mysql_connect(MYSQL_CONNECT_INFO);


Тем самым мы подключаем мод к нашей базе.

Далее создаём enum (данные, которые мы будет загружать и выгружать из бд.

Код
enum player_information    
{    
      pID,    
      pName[MAX_PLAYER_NAME],    
      pPassword[30]    
};    
new pInfo[MAX_PLAYERS][player_information];  


Теперь нам нужно сделать поиск аккаунта при коннекте. В OnPlayerRequestClass:

Код
GetPlayerName(playerid, pInfo[playerid][pName], MAX_PLAYER_NAME);    
new query_string[52+MAX_PLAYER_NAME];    
format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);    
mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayerInTable","i", playerid);  


И создаём паблик в конце мода:

Код
forward FindPlayerInTable(playerid);    
public FindPlayerInTable(playerid)    
{    
      new rows, fields;    
      cache_get_data(rows, fields);    
      if(!rows)    
      {    
          ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "Введите пароль для регистрации нового аккаунта:", "Регистрация", "Выход");    
      }    
      else    
      {    
          ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "Введите пароль от аккаунта для того, чтоб продолжить игру:", "Вход", "Выход");    
          cache_get_field_content(0, "password", pInfo[playerid][pPassword], mysql_connect_ID, 30);    
      }    
      return 1;    
}  


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

В начало мода:

Код
#define    dRegister        0   
#define    dLogin            1


Далее создаём сами диалоги. В OnDialogResponse:

Код
switch(dialogid)    
{    
      case dRegister:    
      {    
          if(!response)    
          {    
              ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от регистрации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход");    
              return Kick(playerid);    
          }    
          if(!strlen(inputtext)) return ErrorDialogMessage(playerid, dRegister, 0);    
          else if(strlen(inputtext) < 4) return ErrorDialogMessage(playerid, dRegister, 1);    
          else if(strlen(inputtext) > 30) return ErrorDialogMessage(playerid, dRegister, 2);    
          for(new i = strlen(inputtext)-1; i != -1; i--)    
          {    
              switch(inputtext[i])    
              {    
                  case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;    
                  default: return ErrorDialogMessage(playerid, dRegister, 3);    
              }    
          }    
          strins(pInfo[playerid][pPassword], inputtext, 0);    
          CreateNewAccount(playerid, pInfo[playerid][pPassword]);    
          return 1;    
      }    
      case dLogin:    
      {    
          if(!response)    
          {    
              ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Отказ от авторизации.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход");    
              return Kick(playerid);    
          }    
          if(!strlen(inputtext)) return ErrorDialogMessage(playerid, dLogin, 0);    
          for(new i = strlen(inputtext)-1; i != -1; i--)    
          {    
              switch(inputtext[i])    
              {    
                  case '0'..'9', 'а'..'я', 'a'..'z', 'А'..'Я', 'A'..'Z': continue;    
                  default: return ErrorDialogMessage(playerid, dLogin, 1);    
              }    
          }    
          if(!strcmp(pInfo[playerid][pPassword], inputtext))    
          {    
              new query_string[52+MAX_PLAYER_NAME];    
              format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);    
              mysql_function_query(mysql_connect_ID, query_string, true, "UploadPlayerAccount","i", playerid);    
          }    
          else ErrorDialogMessage(playerid, dLogin, 2);    
          return 1;    
      }    
}  


Создаём функции для этих диалогов. В конец мода:

Код
stock CreateNewAccount(playerid, password[])    
{    
      new query_string[70+MAX_PLAYER_NAME+30];    
      format(query_string, sizeof(query_string), "INSERT INTO `accounts` (`player_name`, `password`) VALUES ('%s', '%s')", pInfo[playerid][pName], password);    
      mysql_function_query(mysql_connect_ID, query_string, false, "", "");    

      format(query_string, sizeof(query_string), "Аккаунт %s успешно зарегистрирован. Администрация желает Вам приятной игры!", pInfo[playerid][pName]);    
      SendClientMessage(playerid, 0xFFFFFF00, query_string);    
      SpawnPlayer(playerid);    
      return 1;    
}  


Загрузка аккаунта. В конец:

Код
forward UploadPlayerAccount(playerid);    
public UploadPlayerAccount(playerid)    
{    
      pInfo[playerid][pID] = cache_get_field_content_int(0, "ID", mysql_connect_ID);    
      SendClientMessage(playerid, 0xFFFFFF00, "Вы успешно авторизировались!");    
      SpawnPlayer(playerid);    
      return 1;    
}  


Теперь нужно создать функцию, которая хронит сообщения. Создаём Stock в конце мода.

Код

stock ErrorDialogMessage(playerid, dialogid, error_id)    
{    
      switch(dialogid)    
      {    
          case dRegister:    
          {    
              switch(error_id)    
              {    
                  case 0:    
                  {    
                      ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить регистрацию не введя пароль!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");    
                  }    
                  case 1:    
                  {    
                      ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком короткий!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");    
                  }    
                  case 2:    
                  {    
                      ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль слишком длинный!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");    
                  }    
                  case 3:    
                  {    
                      ShowPlayerDialog(playerid, dRegister, DIALOG_STYLE_INPUT, "Регистрация нового пользователя", "{FF0000}Ошибка: {FFFFFF}Пароль содержит запрещённые символы!\nВведите пароль для регистрации нового аккаунта:\n{C0C0C0}Примечание:\n{666666}- Пароль чувствителен к регистру.\n- Пароль должен содержать от 4 до 30 символов.\n- Пароль может содержать латинские/кириллические символы и цифры (aA-zZ, аА-яЯ, 0-9).", "Регистрация", "Выход");    
                  }    
              }    
              return 1;    
          }    
          case dLogin:    
          {    
              switch(error_id)    
              {    
                  case 0:    
                  {    
                      ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы не можете продолжить авторизацию не введя пароль!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                  }    
                  case 1:    
                  {    
                      ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Введённый пароль содержит запрещённые символы!\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                  }    
                  case 2:    
                  {    
                      switch(GetPVarInt(playerid, "WrongPassword"))    
                      {    
                          case 0: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 3 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                          case 1: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 2 попытки.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                          case 2: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталось 1 попытка.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                          case 3: ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_INPUT, "Авторизация", "{FF0000}Ошибка: {FFFFFF}Вы ввели неверный пароль! У Вас осталась последняя попытка, после чего Вас кикнет.\nВведите пароль от аккаунта для входа на сервер:", "Вход", "Выход");    
                          default:    
                          {    
                    ShowPlayerDialog(playerid, dLogin, DIALOG_STYLE_MSGBOX, "Оповещение", "{FFFFFF}Вы были кикнуты с сервера.\n{FF0000}Причина: Превышен лимит попыток на ввод пароля.\n{FFFFFF}Для выхода с сервера введите \"/q\" в чат", "Вход", "Выход");    
                    return Kick(playerid);    
                          }    
                      }    
                      SetPVarInt(playerid, "WrongPassword", GetPVarInt(playerid, "WrongPassword")+1);    
                  }    
              }    
              return 1;    
          }    
      }    
      return 1;    
}    


Основа готова. Теперь осталось сделать сохранение.

Код
stock SaveAccount(playerid)    
{    
      new query_string[(21)+(20+MAX_PLAYER_NAME)+(19+MAX_PLAYER_NAME)+(16+30)] = "UPDATE `accounts` SET";    

      format(query_string, sizeof(query_string), "%s `player_name` = '%s',", query_string, pInfo[playerid][pName]);    
      format(query_string, sizeof(query_string), "%s `password` = '%s'", query_string, pInfo[playerid][pPassword]);    

      format(query_string, sizeof(query_string), "%s WHERE `player_name` = '%s'", query_string, pInfo[playerid][pName]);    
      mysql_function_query(mysql_connect_ID, query_string, false, "", "");    
      return 1;    
}  


И в OnPlayerDisconnect:

Код
SaveAccount(playerid);


Тем самым мы сохраняем аккаунт при выходе с сервера.

Осталось дело за малым. Создать нашу таблицу.
Заходим в phpmyadmin (localhost), затем нажимаем на базы данных, затем в поле, где написано "Создание базы данных" мы вводим название нашей таблицы, которую мы вводили в "MYSQL_DATABASE". В нашем случае это "BD"

Мы создали базу, теперь нужно создать нужные нам таблицы. В нашем случае она одна - accounts. Название таблицы пишите всегда как указываете в моде т.к одна не та буква/раскладка - вы не подключитесь к этой таблице.

Создаём таблицу, в поле вводим "accounts", количество столбцов - 3.
Далее настраиваем саму таблицу. Первый столбец называется ID, тип которого INT, а длинна 11. Далее, чтобы иды не мешались - ищем A_I (Auto Increment) и ставим галочку.
Второй столбец - имя: player_name, тип: varchar, длинна: 24, остальное не трогаем.
Ну и последний столбец - это пароль. Имя столбца: password, тип: varchar, длина - 30.

Нажимаем сохранить и слева у нас есть наша таблица. Думаю как с ней работать вас учить не нужно

Автор урока: Автор урока - DeimoS and Mager
Источник: PI
Отдельное спасибо [CM]Kingster за то, что ответил в одной из тем на вопрос по созданию регистрации ссылкой на др. портал, тем самым дав идею копировать сюда популярные уроки с указанием авторства.


Помогаю новичкам в pawn

Сообщение отредактировал Амасинк - Воскресенье, 13.09.2015, 15:25
[CM]Kingster Дата: Воскресенье, 13.09.2015, 15:22 | Сообщение # 2
Боец
Сообщений: 245
Статус: Offline
Цитата Амасинк ()
new query_string[52+MAX_PLAYER_NAME];   
format(query_string, sizeof(query_string), "SELECT * FROM `accounts` WHERE `player_name` = '%s'", pInfo[playerid][pName]);   
mysql_function_query(mysql_connect_ID, query_string, true, "FindPlayerInTable","i", playerid);  

Лучше закинуть в OnPlayerRequestClass, если игрок нажмет на стрелку в права то исчезнет диалог.


Пользователь Cheat - Master уже 400 дней.

Я в Контакте - vk.com/buddy_fly
Амасинк Дата: Воскресенье, 13.09.2015, 15:25 | Сообщение # 3
Боец
Сообщений: 267
Статус: Offline
[CM]Kingster, урок не я писал, поправлю.

Помогаю новичкам в pawn
Busto Дата: Воскресенье, 13.09.2015, 21:17 | Сообщение # 4
Новичок
Сообщений: 21
Статус: Offline
Скинь на каком мускуле ты делал эту систему
Амасинк Дата: Воскресенье, 13.09.2015, 21:58 | Сообщение # 5
Боец
Сообщений: 267
Статус: Offline
Busto, mysql by BlueG R39-2/3.

Код
https://github.com/pBlueG/SA-MP-MySQL/releases


Помогаю новичкам в pawn
Покупатель[СМ] Дата: Понедельник, 26.10.2015, 09:26 | Сообщение # 6
Любитель
Сообщений: 31
Статус: Offline
Это не урок а скорее всего "скопируй вставь,и все будет работать" если бы ты объяснял каждую функцию и строку цены бы тебе не было!

http://vk.com/romapo4ka
Амасинк Дата: Понедельник, 26.10.2015, 10:58 | Сообщение # 7
Боец
Сообщений: 267
Статус: Offline
Покупатель[СМ], в наше время основная часть шарит что где, но не имеет возможность написать мод с new.pwn т.к не может сделать регистрация, но они знают что к чему. Так что нету смысла всё рассказывать, да и если ты немного напряжешь серое вещество, то думаю и сам поймешь каждую строчку.

Помогаю новичкам в pawn
Покупатель[СМ] Дата: Вторник, 27.10.2015, 10:49 | Сообщение # 8
Любитель
Сообщений: 31
Статус: Offline
Цитата Амасинк ()
в наше время основная часть шарит что где, но не имеет возможность написать мод с new.pwn т.к не может сделать регистрация, но они знают что к чему. Так что нету смысла всё рассказывать, да и если ты немного напряжешь серое вещество, то думаю и сам поймешь каждую строчку.

Боже,если они не имеют возможности написать мод с нуля,значит они не знают основных функций pawn,и по этому лучше всего объяснять подробно,а так твоими ставками не кто не чему не научится!если ты не в состоянии написать полноценный урок то и нету смысла тебе писать вот это,сам даже не понимая что написано
Цитата Амасинк ()
да и если ты немного напряжешь серое вещество, то думаю и сам поймешь каждую строчку

Сам за себя говори...


http://vk.com/romapo4ka
Амасинк Дата: Вторник, 27.10.2015, 14:41 | Сообщение # 9
Боец
Сообщений: 267
Статус: Offline
Цитата Покупатель[СМ] ()
Боже,если они не имеют возможности написать мод с нуля,значит они не знают основных функций pawn,и по этому лучше всего объяснять подробно,а так твоими ставками не кто не чему не научится!если ты не в состоянии написать полноценный урок то и нету смысла тебе писать вот это,сам даже не понимая что написано


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

Цитата Покупатель[СМ] ()
Сам за себя говори...

А что я не так сказал? Вам нужно рассказать как использовать диалоги или запросы mysql?

Лучше пройдите мимо и не показывайте свой сверхразум.


Помогаю новичкам в pawn
barawek_won Дата: Среда, 28.10.2015, 20:43 | Сообщение # 10
Боец
Сообщений: 62
Статус: Offline
Полезно, спасибо.

Приму в дар аккаунты 3+ lvl на проектах Samp-Rp / Diamond-Rp / Advance-Rp.
Приму юани/шмот/аккаунты в игре Perfect World.
Приму аккаунты WOT.
Приму логи.
Буду очень признателен Вам за них :3
Kirsnwe Дата: Суббота, 16.04.2016, 08:42 | Сообщение # 11
Новичок
Сообщений: 8
Статус: Offline
C:\Users\Þëÿ\Desktop\rp\gamemodes\GrandBather.pwn(64) : error 017: undefined symbol "mysql_function_query"
P


WQQ
  • Страница 1 из 1
  • 1
Поиск: