Работа с mysql в плагинах cs (Отправка )

Архів · 2013 Файл є crash94 Статті 3 959

Архівний матеріал ya-cs.ru (2013). Російською. Плагіни й збірки можуть не працювати з ReHLDS та AMXX 1.10.

Работа с mysql( Отправка )

В последнее время часто поступают заказы, связанные с отправкой/получением данных с mysql. В данной статье я вам расскажу как сделать поддержу mysql в вашем плагине.

Описание:
В данной статье мы рассмотрим технику создание подключение к базе данных и отправку данных в базу. В скором времени появится ещё пару уроков посвященных mysql

Нам потребуется:
1. Игровой сервер
2. Хостинг с mysql на борту
3. Мозг
4. 2 руки ( Желательно )

Приступаем:

1. Создаем пустой *sma файл и вставляем туда начальный шаблон

#include <amxmodx>
#include <amxmisc>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

Как вы видите ничего, связанного с mysql тут нет.Мы будем пошагово разбираться во всём, чтобы вы поняли что к чему.

2. Чтобы работать с mysql требуется прикрутить модуль sqlx, что мы сейчас и сделаем. Для этого нам потребуется сделать инклуд файла с нативами вот так

#include <sqlx>

В итоге наш код должен выглядеть так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

3. Далее нам потребуется создать необходимые массивы для работы с подготовкой данных от базы и коннекта. Для этого добавляем

new Handle:MYSQL_Tuple //Служит при подготовки данных коннекта к базе
new Handle:MYSQL_Connect //Непосредственно коннект

new g_Cvar[5] // Где мы будем хранить данные от подключении к базе данных.

В итоге наш код должен выглядеть так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Cvar[5]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)
}

4. Теперь мы создадим квары для записи данных присоединения к базе данных. Будет это выглядеть так

g_Cvar[1] = register_cvar("amx_mysql_hostname", "127.0.0.1") //Хост подключения 
g_Cvar[2] = register_cvar("amx_mysql_username", "root") //Логин
g_Cvar[3] = register_cvar("amx_mysql_password", "password") //Пароль
g_Cvar[4] = register_cvar("amx_mysql_database", "testmysql") //Название базы

В итоге наш код должен выглядеть так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Cvar[5]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	g_Cvar[1] = register_cvar("amx_mysql_hostname", "127.0.0.1")
	g_Cvar[2] = register_cvar("amx_mysql_username", "root")
	g_Cvar[3] = register_cvar("amx_mysql_password", "password")
	g_Cvar[4] = register_cvar("amx_mysql_database", "testmysql")
}

5. Сейчас мы будет создать непосредственно обработчик подготовки и подключение к базе данных. Выглядеть это будет так

public MYSQL_Load() //Создаем функцию коннекта
{
	new szHostname[30], szUsername[30], szPassword[30], szDatabase[30] //Массивы для записи данных для подключения
	new szError[512], szErr //Массивы ошибок

	get_pcvar_string(g_Cvar[1], szHostname, charsmax( szHostname )) //Получение хоста из квара и запись в массив
	get_pcvar_string(g_Cvar[2], szUsername, charsmax( szUsername ))//Получение имени из квара и запись в массив
	get_pcvar_string(g_Cvar[3], szPassword, charsmax( szPassword ))//Получение пароля из квара и запись в массив
	get_pcvar_string(g_Cvar[4], szDatabase, charsmax( szDatabase ))//Получение базы из квара и запись в массив

	MYSQL_Tuple = SQL_MakeDbTuple(szHostname, szUsername, szPassword, szDatabase) //Подготовка данных к коннекту
	MYSQL_Connect= SQL_Connect(MYSQL_Tuple, szErr, szError, charsmax( szError ))  //Сам коннект к базе

	if(MYSQL_Connect == Empty_Handle) //Если во время коннекта произошла ошибка
		set_fail_state( szError ) //Отключаем плагин с причиной, указанной от обработчика SQL_Connect.
}

В итоге наш код должен выглядеть так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Cvar[5]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	g_Cvar[1] = register_cvar("amx_mysql_hostname", "127.0.0.1")
	g_Cvar[2] = register_cvar("amx_mysql_username", "root")
	g_Cvar[3] = register_cvar("amx_mysql_password", "password")
	g_Cvar[4] = register_cvar("amx_mysql_database", "testmysql")
}

public MYSQL_Load()
{
	new szHostname[30], szUsername[30], szPassword[30], szDatabase[30]
	new szError[512], szErr

	get_pcvar_string(g_Cvar[1], szHostname, charsmax( szHostname ))
	get_pcvar_string(g_Cvar[2], szUsername, charsmax( szUsername ))
	get_pcvar_string(g_Cvar[3], szPassword, charsmax( szPassword ))
	get_pcvar_string(g_Cvar[4], szDatabase, charsmax( szDatabase ))

	MYSQL_Tuple = SQL_MakeDbTuple(szHostname, szUsername, szPassword, szDatabase)
	MYSQL_Connect= SQL_Connect(MYSQL_Tuple, szErr, szError, charsmax( szError ))

	if(MYSQL_Connect == Empty_Handle)
		set_fail_state( szError )
}

6. Следующим шагом будет сама отправка данных в базу. Для теста мы будет отправлять IP-адрес сервера, карту ну и ещё к примеру время. Выглядеть это будет так

public InsertData()
{
	new szError[512] //Массив ошибок
	new Handle:szInsert //Массив отправки запроса в базу
	new szIP[32] //Массив для записи IP-адреса сервера
	new szMap[32] //Массив для записи карты сервера
	new szTime[32] //Массив для записи текущей даты и времени

	get_user_ip(0, szIP, charsmax( szIP ), 0) //Записываем IP-адрес+порт в массив
	get_mapname(szMap, charsmax( szMap )) //Записываем название карты в массив
	get_time("%m/%d/%Y - %H:%M:%S", szTime, charsmax( szTime ))

	szInsert = SQL_PrepareQuery(MYSQL_Connect, "INSERT INTO `info` (`ip`, `map`, `time`) VALUES ('%s', '%s', '%s');", szIP, szMap, szTime) //Отправка запроса

	//INSERT INTO //Означает, что мы отправляем данные в базу
	//`info` //Куда, в нашем случаи это будет таблица info
	//`ip`, `map`, `time` //В какие ячейки
	//'%s', '%s', '%s' // Что записываем
	//szIP, szMap, szTime //Массивы в данными что мы будет отправлять в базу

	if(!SQL_Execute(szInsert)) //Если во время отправки произошла ошибка
	{
		SQL_QueryError(szInsert, szError, charsmax( szError )) //Узнаем ошибку
		set_fail_state( szError ) //Отключаем плагин с указанной ошибкой
	}
}

В итоге наш код должен выглядеть так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Cvar[5]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	g_Cvar[1] = register_cvar("amx_mysql_hostname", "127.0.0.1")
	g_Cvar[2] = register_cvar("amx_mysql_username", "root")
	g_Cvar[3] = register_cvar("amx_mysql_password", "password")
	g_Cvar[4] = register_cvar("amx_mysql_database", "testmysql")
}

public MYSQL_Load()
{
	new szHostname[30], szUsername[30], szPassword[30], szDatabase[30]
	new szError[512], szErr

	get_pcvar_string(g_Cvar[1], szHostname, charsmax( szHostname ))
	get_pcvar_string(g_Cvar[2], szUsername, charsmax( szUsername ))
	get_pcvar_string(g_Cvar[3], szPassword, charsmax( szPassword ))
	get_pcvar_string(g_Cvar[4], szDatabase, charsmax( szDatabase ))

	MYSQL_Tuple = SQL_MakeDbTuple(szHostname, szUsername, szPassword, szDatabase)
	MYSQL_Connect= SQL_Connect(MYSQL_Tuple, szErr, szError, charsmax( szError ))

	if(MYSQL_Connect == Empty_Handle)
		set_fail_state( szError )
}

public InsertData()
{
	new szError[512]
	new Handle:szInsert
	new szIP[32]
	new szMap[32]
	new szTime[32]

	get_user_ip(0, szIP, charsmax( szIP ), 0)
	get_mapname(szMap, charsmax( szMap ))
	get_time("%m/%d/%Y - %H:%M:%S", szTime, charsmax( szTime ))

	szInsert = SQL_PrepareQuery(MYSQL_Connect, "INSERT INTO `info` (`ip`, `map`, `time`) VALUES ('%s', '%s', '%s');", szIP, szMap, szTime)

	if(!SQL_Execute(szInsert))
	{
		SQL_QueryError(szInsert, szError, charsmax( szError ))
		set_fail_state( szError )
	}
}

7. Заключительным шагом будет подключение к базе данных при загрузке плагина и запуск функции отправки данных после успешного коннекта к базе. Для этого нам потребуется создать 2 set_task`а.
Первый в обработчике plugin_init, который будет содержать к себе коннект к базе, а второй непосредственно в функции коннекта, после успешного подключения….

Готовый вариант плагина выглядит так:

#include <amxmodx>
#include <amxmisc>
#include <sqlx>

#define PLUGIN "MYSQL(ya-cs.ru)"
#define VERSION "1.0"
#define AUTHOR "CrAsH"

new Handle:MYSQL_Tuple
new Handle:MYSQL_Connect

new g_Cvar[5]

public plugin_init() 
{
	register_plugin(PLUGIN, VERSION, AUTHOR)

	g_Cvar[1] = register_cvar("amx_mysql_hostname", "127.0.0.1")
	g_Cvar[2] = register_cvar("amx_mysql_username", "root")
	g_Cvar[3] = register_cvar("amx_mysql_password", "password")
	g_Cvar[4] = register_cvar("amx_mysql_database", "testmysql")

	set_task(1.0, "MYSQL_Load")
}

public MYSQL_Load()
{
	new szHostname[30], szUsername[30], szPassword[30], szDatabase[30]
	new szError[512], szErr

	get_pcvar_string(g_Cvar[1], szHostname, charsmax( szHostname ))
	get_pcvar_string(g_Cvar[2], szUsername, charsmax( szUsername ))
	get_pcvar_string(g_Cvar[3], szPassword, charsmax( szPassword ))
	get_pcvar_string(g_Cvar[4], szDatabase, charsmax( szDatabase ))

	MYSQL_Tuple = SQL_MakeDbTuple(szHostname, szUsername, szPassword, szDatabase)
	MYSQL_Connect= SQL_Connect(MYSQL_Tuple, szErr, szError, charsmax( szError ))

	if(MYSQL_Connect == Empty_Handle)
		set_fail_state( szError )

	set_task(1.0, "InsertData")
}

public InsertData()
{
	new szError[512]
	new Handle:szInsert
	new szIP[32]
	new szMap[32]
	new szTime[32]

	get_user_ip(0, szIP, charsmax( szIP ), 0)
	get_mapname(szMap, charsmax( szMap ))
	get_time("%m/%d/%Y - %H:%M:%S", szTime, charsmax( szTime ))

	szInsert = SQL_PrepareQuery(MYSQL_Connect, "INSERT INTO `info` (`ip`, `map`, `time`) VALUES ('%s', '%s', '%s');", szIP, szMap, szTime)

	if(!SQL_Execute(szInsert))
	{
		SQL_QueryError(szInsert, szError, charsmax( szError ))
		set_fail_state( szError )
	}
}

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

Приступим.

1. Авторизуемся в phpmyadmin

2. После авторизации вы увидите главную панель управление базами данных. Для начала нам потребуется создать базу данных. Для этого заходим на странице Новая база данных, вводим название нашей базы.В нашем случаи это будет testmysql и тыкаем Создать

Работа с mysql( Отправка )

3. Ну вот мы создали базу данных, теперь нам нужно создать структуру базы.
Для этого открываем вкладку SQL и копируем туда данный код

CREATE TABLE  `info` //Создаем таблицу info
(
	`id` INT NOT NULL AUTO_INCREMENT , //Присваиваем идентификатор каждому запросу
 	`ip` VARCHAR( 32 ) NOT NULL , //Ячейка записи IP-адреса
 	`map` VARCHAR( 32 ) NOT NULL , //Ячейка записи карты
	`time` VARCHAR( 32 ) NOT NULL , //Ячейка записи времени

	PRIMARY KEY (  `id` ) //Говорим, что идентификатором является ячейка id
);

Работа с mysql( Отправка )

Ну чтож. Мы сделали всё необходимые. Осталось только проверить, что у нас получилось. Загружаем плагин на сервер, перезапускаем и через пару минут смотрим данные. Для этого тыкаем обзор и смотри, что пришло. Если же данных нет, то смотрите папку logs. Возможно вы ошиблись при указании данных от базы или же ваша база не поддерживает удаленный доступ

Работа с mysql( Отправка )

На этом всё. Думаю все смогли понять и освоить. В скором времени распишу как сделать получение данных из базы для определенного игрока

При копирование статьи ссылка на источник обязателен!
Статья написана специально для сайта ya-cs.ru

Мітки:

Коментарі 20

  1. vovchik2x2

    vovchik2x2, ты хоть понял о чем идет речь?:D

    Я смотрю ты у нас самый умный? Из названия статьи понятно о чем идет речь

    Opo4uMapy

    Жду твоих уг выпусков, я смотрю ты наконец то на amx-x вопросы перестал задавать.

    Відповісти

  2. StudenT

    vovchik2x2: я смотрю ты наконец то на amx-x вопросы перестал задавать

    Не, не перестал, там есть недавняя тема 😀

    Відповісти

  3. Opo4uMapy

    vovchik2x2, ты же нуб, зачем тебе смотреть если ты нечего понять не можешь помню просил меня помочь переписать плагин краша чтобы за нанесенный крон там что-то делало. Ты нуб и это не исправимо

    Відповісти

  4. vovchik2x2

    vovchik2x2, ты же нуб, зачем тебе смотреть если ты нечего понять не можешь помню просил меня помочь переписать плагин краша чтобы за нанесенный крон там что-то делало. Ты нуб и это не исправимо

    Начнём с того, что это не плагин креша, а только похожий, если попросил помочь что в этом такого? Нуб? – yasno, ponyatno.

    Відповісти

  5. Opo4uMapy

    by_nyasha, лучше + тебя не кто не спрашивает .
    vovchik2x2, в комменте к этой новости ты написал "Спасибо", а сам нефига не понял. или я не прав?

    Відповісти

  6. crash94

    Что вы обсуждаете?Логическое мышление человека?
    Вы не праве его судить. Понял он или нет это его личное дело и вас извините не должно это еб*ть

    Відповісти

  7. vovchik2x2

    vovchik2x2, в комменте к этой новости ты написал "Спасибо", а сам нефига не понял. или я не прав?

    Не прав, причем тут, что я написал спасибо?

    Відповісти

Ваш коментар

Коментар з’явиться після перевірки. E-mail не публікується.