Roy Weezy
Эксперт
- Регистрация
- 13 Янв 2012
- Сообщения
- 1,290
- Лучшие ответы
- 0
- Репутация
- 339
Здравствуйте, уважаемые посетители портала, буквально на днях меня попросили написать подробный разбор системы регистрации на MySQL, я выбрал самый удобный для меня - MySQL R7. Урок создан с целью максимально пояснить новичкам схему работы регистрации на MySQL.
Для нас MySQL является системой хранения информации в единой базе данных.
Система регистрации - привязка нашего столбца к игровому никнейму игрока, включающая в себя последующее сохранение всей информации связанной с этим игроком.
1.Для начала нам нужно разобраться с самой Базой Данных, для работы с БД я предпочитаю использовать Denwer.
Инструкция по эксплуатации:
2.Теперь нам необходимо подготовить всё для работы.
3.Начинаем писать саму регистрацию.
Ну а теперь мы должны создать в Базе Данных таблицу, в которую мы будем сохранять наши аккаунты. Научиться составлять их сами вы можете с помощью штудирования SQL запросов,которые можете найти в поисковике.
Вот скриншот, чтобы вы верно вставили запрос.
На этом урок окончен, я надеюсь, что не зря потратил своё время и хоть кому-то урок пригодится Удачи!
Полезные ссылки:
Для нас MySQL является системой хранения информации в единой базе данных.
Система регистрации - привязка нашего столбца к игровому никнейму игрока, включающая в себя последующее сохранение всей информации связанной с этим игроком.
1.Для начала нам нужно разобраться с самой Базой Данных, для работы с БД я предпочитаю использовать Denwer.
Инструкция по эксплуатации:
Скачать Denwer можно тут -
Для скачки вам прийдётся ввести свои данные. Я надеюсь, что установить программу вы сможете сами, поэтому пропущу этот момент. У вас на рабочем столе должны появиться 3 ярлыка, их вы можете увидеть ниже:
Тыкаем на Start Denwer, далее открываем ваш интернет браузер, в строке адреса мы вводим
После этих процедур вы должны увидеть вот такую картину:
Следующим шагом мы должны создать нашу базу данных,следует тыкать на кнопочки в том порядке, который указан на скриншоте:
Если всё выполнено правильно, то перед вами появится такая страница:
На этом мы переходим к следующему этапу.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Для скачки вам прийдётся ввести свои данные. Я надеюсь, что установить программу вы сможете сами, поэтому пропущу этот момент. У вас на рабочем столе должны появиться 3 ярлыка, их вы можете увидеть ниже:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Тыкаем на Start Denwer, далее открываем ваш интернет браузер, в строке адреса мы вводим
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
После этих процедур вы должны увидеть вот такую картину:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Следующим шагом мы должны создать нашу базу данных,следует тыкать на кнопочки в том порядке, который указан на скриншоте:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Если всё выполнено правильно, то перед вами появится такая страница:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
На этом мы переходим к следующему этапу.
2.Теперь нам необходимо подготовить всё для работы.
1.Нам необходима инклуд
именно нашей версии.
2.Нам нужен плагин нашей версии.
ПРИМЕЧАНИЕ:При использовании инклуда другой версии будут многочисленные ошибки, а при использовании плагина другой версии вы просто не запустите свой сервер.
Для вас я подготовил архив с нужными файлами:
В server.cfg в строку plugins добавляем
Инклуд мы кидаем в папку pawno-->includes
В дальнейшем мы используем именно наше pawno.
PHP:
a_mysql
2.Нам нужен плагин нашей версии.
ПРИМЕЧАНИЕ:При использовании инклуда другой версии будут многочисленные ошибки, а при использовании плагина другой версии вы просто не запустите свой сервер.
Для вас я подготовил архив с нужными файлами:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
В server.cfg в строку plugins добавляем
PHP:
mysql
В дальнейшем мы используем именно наше pawno.
Первым делом нам стоит подключить инклуд, после строки
мы ставим строку
Теперь инклуд подключён.
Функции плагина и инклуда я описывать не буду, с ними вы можете ознакомиться на официальном сайте
Надеюсь, что вы изучали английский язык в школьном курсе, либо любым другим способом.
Теперь у нас появляется вопрос:" А как подключается мод к БД и откуда мы берём данные?"
Данные от базы данных мы прописываем при подключении, я предпочитаю создать дефайны с этой информацией
Далее нам следует создать переменную, которой мы обозначим нашу базу данных
Она в дальнейшем будет использоваться при всех запросах в базу данных.
Теперь нам нужно сделать функцию подключения мода к базе данных.
Теперь нам нужно сделать так, чтобы подключение срабатывало при включении мода, поэтому ищем паблик
и там вставляем
Половина дела сделана. Подключение готово. Теперь мы переходим к осуществлению регистрации игрока.
Первым делом нам нужно создать enum, в котором мы будем записывать все данные игрока:
Создадим последнюю переменную, в которой мы будем хранить имя нашего игрока.
Так как же нам вызвать начало регистрации/авторизации? Лично я использую паблик
Он вызывается сервером при подключении игрока. Для начала, в этом паблике мы должны обнулить старые данные, привязанные к ID игрока(не путать с ID аккаунта) для это создаём сток в конце мода, который привязываем к игроку
,а в OnPlayerConnect мы вставляем только
Далее в этом паблике мы узнаём имя игрока с помощью стандартной функции
Чтобы вызвать диалог регистрации я предпочитаю вызывать для игрока таймер, к сожалению, я не нашёл стоящий урок про таймеры на данном портале объясню про наш таймер кратко.
работу с OnPlayerConnect мы закончил,теперь нам нужен паблик таймера,именно паблик,т.к таймеры работают по принципу коллбэков
Мы вызвали коллбэк, но теперь нам нужно его создать
Теперь мы должны направиться в паблик диалогов сервера
Теперь нам нужен запрос логина игрока(наш коллбэк), который выглядит вот так:
Собственно регистрация готова, но нам нужно сделать сохранение игрока и спавн,чтобы не спавниться в нулевые координаты.
Для настройки спавна отправимся в
,там вставляем
Ну а теперь нам осталось сделать сохранение игрока, для этого мы должны создать функцию
Вызывать сохранение мы будем при отключении игрока, я считаю, что это самый оптимальный вариант.В
PHP:
#include <a_samp>
PHP:
#include <a_mysql>
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Теперь инклуд подключён.
Функции плагина и инклуда я описывать не буду, с ними вы можете ознакомиться на официальном сайте
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
Надеюсь, что вы изучали английский язык в школьном курсе, либо любым другим способом.
Теперь у нас появляется вопрос:" А как подключается мод к БД и откуда мы берём данные?"
Данные от базы данных мы прописываем при подключении, я предпочитаю создать дефайны с этой информацией
PHP:
#define MySQL_DEBUG 1
#define MySQL_HOST "localhost"//Хостинг нашей БД, чаще всего это именно "localhost"
#define MySQL_USER "root"//Аккаунт от нашей БД, если ваш сервер на хостинге, то данные вам выдаёт ваш хостер
#define MySQL_PASS ""//Пароль от нашей БД, если ваш сервер на хостинге, то данные вам выдаёт ваш хостер
#define MySQL_DB "root"//Название базы данных, тут мы вписываем то, что вы вписали при создании базы данных в первом пункте(Denwer)
PHP:
new dbHandle;
Теперь нам нужно сделать функцию подключения мода к базе данных.
PHP:
stock MySQLConnect ( )
{
dbHandle = mysql_connect ( MySQL_HOST, MySQL_USER, MySQL_DB, MySQL_PASS ) ;//Подключение к базе данных и объявление её переменной dbHandle
switch ( mysql_ping ( ) )//Проверяем через пинг активность подключения
{
case 1: print ( "MySQL connection: OK." ) ;//Выводим в консоль активность
case -1: print ( "MySQL connection: ERROR." ) ;//Выводим в консоль отсутствие соединения
}
mysql_debug ( MySQL_DEBUG ) ;//Включаем вывод всех запросов в лог(файл mysql_log)
mysql_function_query( dbHandle, "SET NAMES cp1251", false, "", "" ) ;//Придаём именам необходимый формат для записи в базу
return 1;
}
PHP:
OnGameModeInit
PHP:
MySQLConnect ( ) ;
Первым делом нам нужно создать enum, в котором мы будем записывать все данные игрока:
PHP:
enum _player//объявление enuma
{
ID,//Сюда запишется ид аккаунта игрока
AGE//Сюда запишется возраст игрока
}
Между скобок помещаются переменные
new PLAYER [ MAX_PLAYERS ] [ _player ] ;//Создаём переменную, с помощью которой мы будем работать с данными из enum`а. С помощью этой переменной мы создаём макет, по которому будем работать с данными.
PHP:
new PlayerName[MAX_PLAYERS];
PHP:
OnPlayerConnect
PHP:
stock ClearPlayerData ( playerid )
{
PLAYER [ playerid ] [ ID ] = 0;//Вот и наш макет для работы с переменными. Обнуляем ID
PLAYER [ playerid ] [ AGE ] = 0;//Обнуляем данные возраста игрока
}
PHP:
ClearPlayerData ( playerid );//Вызываем функцию для игрока с ID=playerid(на деле playerid равен целому числу)
PHP:
GetPlayerName ( playerid, PlayerName [ playerid ] , MAX_PLAYER_NAME ) ;//MAX_PLAYER_NAME - максимальная длина имен игрока, по стандарту 32,playerid-cнова ид игрока,PlayerName [ playerid ] наша переменная, в которую записываем
PHP:
SetTimerEx ( "connection", 500, false, "i", playerid ) ;//connection-название таймера,а 500 это время(0.5 секунды) и снова playerid (ид нашего игрока)
PHP:
forward connection( playerid );
public connection( playerid )
{
new query [ 60 + MAX_PLAYER_NAME ];
format ( query, sizeof query, "SELECT `id` FROM `users` WHERE `login` = '%s' LIMIT 1", PlayerName [ playerid ] ) ;//Наш SQL запрос.SELECT-Выбираем ID из таблицы `users` где наш логин равен нашему имени
mysql_function_query ( dbHandle, query, true, "CheckPlayerRegistered", "ii", playerid, 0 ) ;//вызываем коллбэк, проверку зарегистрирован игрок или нет
SetPlayerPos ( playerid,-1396.0210,980.2402,179.3737 ) ;//Координаты для камеры(интро)
SetPlayerCameraPos ( playerid,-1399.0210,976.2402,179.3737 ) ;//Координаты для камеры(интро)
SetPlayerCameraLookAt ( playerid, -1754.3281, 669.2344, 62.8203 ) ;//Координаты для камеры(интро)
return 1;
}
PHP:
forward CheckPlayerRegistered ( playerid );
public CheckPlayerRegistered ( playerid )
{
new rows, fields ;
cache_get_data ( rows, fields ) ;
if ( rows )//Если нашли аккаунт запросом, то открываем авторизацию
{
ShowPlayerDialog ( playerid, 1, DIALOG_STYLE_PASSWORD, "{FFFFFF}Авторизация", "{FFFFFF}Добро пожаловать на сервер.\nВведите ваш пароль:", "Вход", "" ) ;
}
else//если не нашли аккаунт, то регистрация
{
ShowPlayerDialog ( playerid, 0, DIALOG_STYLE_PASSWORD, "{FFFFFF}Регистрация", "{FFFFFF}Добро пожаловать на сервер.\nВведите пароль для аккаунта:", "Ввод", "" ) ;
}
return 1;
}
PHP:
OnDialogResponse
PHP:
switch ( dialogid )
{
case 0:
{
new query [ 144 ], temp [ 32 ] ;
mysql_real_escape_string ( inputtext, temp ) ;
format ( query, sizeof query, "INSERT INTO `users` ( `login`, `password` ) VALUES ( '%s', '%s' )", PlayerName [ playerid ], temp ) ;//Делаем запрос,создать аккаунт где логин и пароль равны имени игрока и введённому в диалог тексту
mysql_function_query ( dbHandle, query, false, "", "" ) ;//Отправка запроса
format ( query, sizeof query, "SELECT * FROM `users` WHERE `login` = '%s' AND `password` = '%s' LIMIT 1", PlayerName [ playerid ], temp ) ;//Выводим в коллбэк аккаун где логин и пароль равны мени игрока и введённому паролю
mysql_function_query ( dbHandle, query, true, "PlayerLogin", "i", playerid ) ;//наш коллбэк
}
case 1:
{
new query [ 144 ], temp [ 32 ] ;
mysql_real_escape_string ( inputtext, temp ) ;
format ( query, sizeof query, "SELECT * FROM `users` WHERE `login` = '%s' AND `password` = '%s' LIMIT 1", PlayerName [ playerid ] , temp ) ;//Выводим в коллбэк аккаун где логин и пароль равны мени игрока и введённому паролю
mysql_function_query ( dbHandle, query, true, "PlayerLogin", "i", playerid ) ;//наш коллбэк
}
case 2:
{
if (!response)ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Возраст","{FFFFFF}Введите Ваш игровой возраст\n","Готово","Назад");
if(response)
{
if(strval(inputtext) < 12 || strval(inputtext) > 120)return SendClientMessage(playerid,-1,"Возраст не может быть меньше 12 и не больше 120"),ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Возраст","{FFFFFF}Введите Ваш игровой возраст\n","Готово","Назад");//если значение меньше 12 и больше 120,то заного диалог
PLAYER[playerid][AGE] = strval(inputtext);//Присвоили введённое значение
SpawnPlayer(playerid);//спавним игрока
}
}
PHP:
forward PlayerLogin ( playerid );
public PlayerLogin ( playerid )
{
new rows, fields, temp [ 128 ] ;
cache_get_data ( rows, fields ) ;
if ( rows )
{
cache_get_field_content ( 0, "id", temp )/*записываем на temp,а с temp на переменную игрока*/ , PLAYER [ playerid ] [ ID ] = strval ( temp );//загружаем ID аккаунта игрока,где "id" это колонка таблицы,a strval ( temp )-целое число
cache_get_field_content ( 0, "age", temp )/*записываем на temp,а с temp на переменную игрока*/ , PLAYER [ playerid ] [ AGE ] = strval ( temp );//загружаем возраст игрока,где "age" это колонка таблицы
SetSpawnInfo ( playerid, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ) ;//дабы избежать краша игры
SetPVarInt ( playerid, "Logged", 1 ) ;//ПВар,авторизован игрок или нет
DeletePVar ( playerid, "WrongPassword" ) ;//кол-во неверных вводов пароля
if(PLAYER[playerid][AGE] != 0)//еси возраст не равен нулю(таким образом мы проверяем до конца ли зарегестрировался игрок)
{
SpawnPlayer ( playerid ) ;
format(temp, sizeof(temp), "~w~Welcome ~n~~g~ %s", PlayerName[playerid]);
GameTextForPlayer(playerid, temp, 5000, 1);
}//если же равен,то регистрация продолжается
else ShowPlayerDialog(playerid,2,DIALOG_STYLE_INPUT,"Возраст","{FFFFFF}Введите Ваш игровой возраст\n","Готово","Назад");
}
else
{
if ( GetPVarInt ( playerid, "WrongPassword" ) == 4 )
{
Kick ( playerid ) ;
return 1;
}
SetPVarInt ( playerid, "WrongPassword", GetPVarInt ( playerid, "WrongPassword" ) + 1 ) ;
ShowPlayerDialog ( playerid, 1, DIALOG_STYLE_PASSWORD, "{FFFFFF}Авторизация", "{FFFFFF}Добро пожаловать на сервер.\nВведите ваш пароль:", "Вход", "" ) ;
}
return 1;
}
Для настройки спавна отправимся в
PHP:
OnPlayerSpawn
PHP:
if ( GetPVarInt ( playerid, "Logged" ) == 0)return true;//если не залогинился,то не спавнимся
SetPlayerPos ( playerid, 2228.0400,-1160.4053,25.7803);//телепортируемся по координатам
PHP:
stock SaveAccount ( playerid )
{
new query [ 144 ] ;
format ( query, sizeof query, "UPDATE `users` SET \
`age` = '%d' \ // перечисляем то,куда нужно сохранять
WHERE `id` = '%d' LIMIT 1",
PLAYER [ playerid ] [ AGE ] ,//переменные,которые сохраняем
PLAYER [ playerid ] [ ID ] ) ;//мы записываем в query запрос
mysql_function_query ( dbHandle, query, false, "", "" ) ;//тут мы делаем запрос,который ввели в query
return 1;
}
PHP:
OnPlayerDisconnect
PHP:
SaveAccount ( playerid );
Ну а теперь мы должны создать в Базе Данных таблицу, в которую мы будем сохранять наши аккаунты. Научиться составлять их сами вы можете с помощью штудирования SQL запросов,которые можете найти в поисковике.
Вот скриншот, чтобы вы верно вставили запрос.
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!
PHP:
Структура таблицы `users`
--
CREATE TABLE IF NOT EXISTS `users` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`login` varchar(24) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(32) CHARACTER SET cp1251 COLLATE cp1251_bin NOT NULL,
`age` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=56 ;
Полезные ссылки:
Чтобы видеть скрытое содержание Зарегистрируйтесь на форуме!