В последнее время часто поступают заказы, связанные с отправкой/получением данных с 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 и тыкаем Создать
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
);
Ну чтож. Мы сделали всё необходимые. Осталось только проверить, что у нас получилось. Загружаем плагин на сервер, перезапускаем и через пару минут смотрим данные. Для этого тыкаем обзор и смотри, что пришло. Если же данных нет, то смотрите папку logs. Возможно вы ошиблись при указании данных от базы или же ваша база не поддерживает удаленный доступ
На этом всё. Думаю все смогли понять и освоить. В скором времени распишу как сделать получение данных из базы для определенного игрока
Статья написана специально для сайта ya-cs.ru
Спасибо креш.
Помните когда мою мамку ебали?
YouTouchMe, +
лучше напиши как обойти привязку к бд)
Я смотрю ты у нас самый умный? Из названия статьи понятно о чем идет речь
Жду твоих уг выпусков, я смотрю ты наконец то на amx-x вопросы перестал задавать.
steelzzz, со временем все будет.
И машину тебе подарим.=)
steelzzz
Что ещё рассказать о великий =)
Краш – респект. Радуешь)))
Не, не перестал, там есть недавняя тема 😀
YouTouchMe,
vovchik2x2, О, кэп? Куда мне до вас, о великий!
vovchik2x2, ты же нуб, зачем тебе смотреть если ты нечего понять не можешь помню просил меня помочь переписать плагин краша чтобы за нанесенный крон там что-то делало. Ты нуб и это не исправимо
Opo4uMapy Не умничай, ты ни чем не лучше
Начнём с того, что это не плагин креша, а только похожий, если попросил помочь что в этом такого? Нуб? – yasno, ponyatno.
by_nyasha, лучше + тебя не кто не спрашивает .
vovchik2x2, в комменте к этой новости ты написал "Спасибо", а сам нефига не понял. или я не прав?
Что вы обсуждаете?Логическое мышление человека?
Вы не праве его судить. Понял он или нет это его личное дело и вас извините не должно это еб*ть
Единственный нормальный коммент 😀
Не прав, причем тут, что я написал спасибо?