Доступ к готовым решениям

Переход в группу "Пользователь"

300.00
Одноразовый платёж
Быстрый переход в группу "Пользователи", без надобности написания постов и ожидания.

Покупка дает возможность:
Быть полноправным участником форума
Нормальное копирование кода
Создавать темы
Скачивать файлы
Доступ к архиву Pawno-Info

Урок Регистрация на MySQL R7. Подробный разбор регистрации.

Roy Weezy

Эксперт
Регистрация
13 Янв 2012
Сообщения
1,290
Лучшие ответы
0
Репутация
339
Здравствуйте, уважаемые посетители портала, буквально на днях меня попросили написать подробный разбор системы регистрации на MySQL, я выбрал самый удобный для меня - MySQL R7. Урок создан с целью максимально пояснить новичкам схему работы регистрации на MySQL.
Для нас MySQL является системой хранения информации в единой базе данных.
Система регистрации - привязка нашего столбца к игровому никнейму игрока, включающая в себя последующее сохранение всей информации связанной с этим игроком.

1.Для начала нам нужно разобраться с самой Базой Данных, для работы с БД я предпочитаю использовать Denwer.
Инструкция по эксплуатации:
Скачать Denwer можно тут -
Для скачки вам прийдётся ввести свои данные. Я надеюсь, что установить программу вы сможете сами, поэтому пропущу этот момент. У вас на рабочем столе должны появиться 3 ярлыка, их вы можете увидеть ниже:

Тыкаем на Start Denwer, далее открываем ваш интернет браузер, в строке адреса мы вводим

После этих процедур вы должны увидеть вот такую картину:

Следующим шагом мы должны создать нашу базу данных,следует тыкать на кнопочки в том порядке, который указан на скриншоте:

Если всё выполнено правильно, то перед вами появится такая страница:


На этом мы переходим к следующему этапу.

2.Теперь нам необходимо подготовить всё для работы.
1.Нам необходима инклуд
PHP:
a_mysql
именно нашей версии.
2.Нам нужен плагин нашей версии.
ПРИМЕЧАНИЕ:При использовании инклуда другой версии будут многочисленные ошибки, а при использовании плагина другой версии вы просто не запустите свой сервер.
Для вас я подготовил архив с нужными файлами:


В server.cfg в строку plugins добавляем
PHP:
mysql
Инклуд мы кидаем в папку pawno-->includes
В дальнейшем мы используем именно наше pawno.
3.Начинаем писать саму регистрацию.
Первым делом нам стоит подключить инклуд, после строки
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
Он вызывается сервером при подключении игрока. Для начала, в этом паблике мы должны обнулить старые данные, привязанные к ID игрока(не путать с ID аккаунта) для это создаём сток в конце мода, который привязываем к игроку
PHP:
stock ClearPlayerData ( playerid )
{
	PLAYER [ playerid ] [ ID ] = 0;//Вот и наш макет для работы с переменными. Обнуляем ID
	PLAYER [ playerid ] [ AGE ] = 0;//Обнуляем данные возраста игрока
}
,а в OnPlayerConnect мы вставляем только
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 (ид нашего игрока)
работу с OnPlayerConnect мы закончил,теперь нам нужен паблик таймера,именно паблик,т.к таймеры работают по принципу коллбэков
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 ;
На этом урок окончен, я надеюсь, что не зря потратил своё время и хоть кому-то урок пригодится :) Удачи!


Полезные ссылки:
 
Сверху Снизу