kamilot73
Умник
Сегодня предлагаю задействовать отличительную особенность R33-34 версии плагина - ORM конструкцию. Все предельно просто и удобно.
Обратите внимание: Данный урок не рассчитан на новичков. Для начала, советую разобраться что представляет из себя MySQL и с чем
его едят.
ORM очень упрощает жизнь скриптера. Грубо говоря, ORM - заготовленные сценарии для общения сервера с Базой Данных. Окей, начнем.
Для начала, давайте вспомним, какие запросы мы в основном посылаем к БД - SELECT(выборка информации из БД), INSERT(Вставка информации в
БД), UPDATE(Обновление уже существующей информации в БД) и в редких случаях - DELETE.
Рассмотрим банальный запрос, который существует в большинстве модах:
Что-то похожее явно есть у Вас в гейммоде. А вот как выполняется этот же запрос при помощи ORM:
Компактно, не правда ли? А теперь давайте рассмотрим callback первого и второго варианта:
В первом случае, мы будем иметь что-то похожее на это:
Второй снова порадует своей компактностью:
Круто, не правда ли? Однако, чтобы давольствоваться такими прелестями нам всё же придется кое-где "заморочиться". Теперь, когда вы
примерно понимаете, в чем разница, начнем сначала и рассмотрим детали.
Для начала, разберемся в ORM-функциях, которые нам предлагают разработчики:
orm_create("название_таблицы") - создание ORM
orm_destroy(id:ORM) - удаление ранее созданного ORM
Пример:
orm_errno(ORM:id) - проверка на ошибки при обработке. Вызывать в callback'ах основных сценариев.
Пример:
Основные сценарии:
orm_select(ORM:id,callback,format,float) и orm_load(ORM:id,callback,format,float) - сценарии идентичны запросу SELECT (Получение информации)
orm_update(ORM:id) - сценарий идентичны запросу UPDATE (обновление)
orm_insert(ORM:id,callback,format,float) - сценарий идентичны запросу INSERT (вставка строки)
orm_delete(ORM:id) - сценарий идентичны запросу DELETE (удаление строки)
orm_save(ORM:id,callback,format,float) -очень умный сценарий. Комбинация INSERT и UPDATE. Если данной строки нет в таблицы, то он выполняет INSERT(вставку), если же есть - UPDATE (обновление)
Функции привязки:
orm_addvar_int(ORM:id, &var, varname[]) - привязка целочисленной переменной.
orm_addvar_float(ORM:id, &var, varname[]) - привязка числа с плавающей точкой.
orm_addvar_string(ORM:id, &var, var_maxlen, varname[]) - привязка строки.
И немаловажные:
orm_setkey(ORM:id,varname[]) - относительно каких переменных выполняем поиск.(Что-то вроде конструкции: WHERE ID =)
orm_apply_cache(ORM:id, row) - применить кэширование. Используется при циклической загрузки множества данных.
Для самых сообразительных уже должно было статья ясно "Как то всё работает". Но без примеров - никуда.
Пример работы ORM:
Обратите внимание: Данный урок не рассчитан на новичков. Для начала, советую разобраться что представляет из себя MySQL и с чем
его едят.
ORM очень упрощает жизнь скриптера. Грубо говоря, ORM - заготовленные сценарии для общения сервера с Базой Данных. Окей, начнем.
Для начала, давайте вспомним, какие запросы мы в основном посылаем к БД - SELECT(выборка информации из БД), INSERT(Вставка информации в
БД), UPDATE(Обновление уже существующей информации в БД) и в редких случаях - DELETE.
Рассмотрим банальный запрос, который существует в большинстве модах:
PHP:
new
mSQL[256+1]; //мутим переменную для запроса
mysql_format(Actconnect,mSQL,"SELECT * FROM `my_user` WHERE Name = %s",his_name); //составляем запрос
mysql_tquery(Actconnect,mSQL,"PlayerDataLoad","d",playerid); //обращаемся к серверу
PHP:
orm_select(PlayerInfo[playerid][ID_ORM],"OnPlayerDataLoad","d",playerid); //ORM сценарий выборки данных игрока
В первом случае, мы будем иметь что-то похожее на это:
PHP:
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid) {
new r,f; // кол-во строк и столбцов
cache_get_data(r,f); // Обрабатываем запрос, получаем кол-во строк и столбцов
if(rows) { //Смотрим, существует ли такая строка в таблице
PlayerInfo[playerid][pLevel] = cache_get_field_content_int(0,"Level"); // Заполнение переменых
PlayerInfo[playerid][pAdmin] = cache_get_field_content_int(0,"Admin");
PlayerInfo[playerid][pLeader] = cache_get_field_content_int(0,"Leader");
PlayerInfo[playerid][pMember] = cache_get_field_content_int(0,"Member");
PlayerInfo[playerid][pSkin] = cache_get_field_content_int(0,"Skin");
}
else print("Упс! Мы не нашли такого человека в базе!"); // Игрока нет
return 1;
}
PHP:
forward OnPlayerDataLoad(playerid);
public OnPlayerDataLoad(playerid) {
switch(orm_errno(Player[playerid][ID_ORM])){
case ERROR_OK: printf("Player with ID:%d data load!"); //Все отлично, сценарий заполнил все данные игрока
case ERROR_NO_DATA: printf("Player with ID:%d - LOADING ERROR"); //Ошибка, мы не нашли данных на этого игрока!
}
return 1;
}
примерно понимаете, в чем разница, начнем сначала и рассмотрим детали.
Для начала, разберемся в ORM-функциях, которые нам предлагают разработчики:
orm_create("название_таблицы") - создание ORM
orm_destroy(id:ORM) - удаление ранее созданного ORM
Пример:
PHP:
new ORM:myorm = orm_create("players_table"); //создали
orm_destroy(myorm); //удалили
Пример:
PHP:
switch(orm_errno(myorm)) {
case ERROR_OK: printf("Player with ID:%d data load!"); //Все отлично, сценарий заполнил все данные игрока
case ERROR_NO_DATA: printf("Player with ID:%d - LOADING ERROR"); //Ошибка, мы не нашли данных на этого игрока!
}
orm_select(ORM:id,callback,format,float) и orm_load(ORM:id,callback,format,float) - сценарии идентичны запросу SELECT (Получение информации)
orm_update(ORM:id) - сценарий идентичны запросу UPDATE (обновление)
orm_insert(ORM:id,callback,format,float) - сценарий идентичны запросу INSERT (вставка строки)
orm_delete(ORM:id) - сценарий идентичны запросу DELETE (удаление строки)
orm_save(ORM:id,callback,format,float) -очень умный сценарий. Комбинация INSERT и UPDATE. Если данной строки нет в таблицы, то он выполняет INSERT(вставку), если же есть - UPDATE (обновление)
Функции привязки:
orm_addvar_int(ORM:id, &var, varname[]) - привязка целочисленной переменной.
orm_addvar_float(ORM:id, &var, varname[]) - привязка числа с плавающей точкой.
orm_addvar_string(ORM:id, &var, var_maxlen, varname[]) - привязка строки.
И немаловажные:
orm_setkey(ORM:id,varname[]) - относительно каких переменных выполняем поиск.(Что-то вроде конструкции: WHERE ID =)
orm_apply_cache(ORM:id, row) - применить кэширование. Используется при циклической загрузки множества данных.
Для самых сообразительных уже должно было статья ясно "Как то всё работает". Но без примеров - никуда.
Пример работы ORM:
PHP:
enun inPla{ //
ORM:ORM_ID, // создаем идентификатор для ORM, чтобы было проще работать,
ID, // В базе данных
Name[MAX_PLAYER_NAME],
Password[MAX_PASS_LEN],
Level,
Skin
}
new PlayerInfo[MAX_PLAYERS][inPla]; //основной массив с пользовательскими данными
public OnPlayerConnect(playerid) {
GetPlayerName(playerid,Name,sizeof(Name)); //берем имя игрока
PlayerInfo[playerid][ORM_ID] = orm_create("players_table"); //создаем ORM
/* Теперь крепим переменные к их значениям в БД*/
new p = PlayerInfo[playerid][ORM_ID]; //для упрощения привязки
orm_addvar_int(p,PlayerInfo[playerid][ID],"user_ID"); // Привязываем переменную PlayerInfo[playerid][ID] к значеню "ID" в таблице
orm_addvar_string(p,PlayerInfo[playerid][Name],MAX_PLAYER_NAME,"user_Name");
orm_addvar_string(p,PlayerInfo[playerid][Password],MAX_PASS_LEN,"user_Pass");
orm_addvar_int(p,PlayerInfo[playerid][Level],"user_Level");
orm_addvar_int(p,PlayerInfo[playerid][Skin],"user_Skin");
/* */
orm_setkey(p,"Name"); //т.к. мы не знаем ID игрока в БД, ставим за ключ Никигрока
orm_load(p,"OnPlayerDataLoad","d",playerid); //сценарий выгрузки информации из БД и записи их в прикрепленные переменные
return 1;
}
forward OnPlayerDataLoad(playerid); // объявляем функцию
public OnPlayerDataLoad(playerid) {
case ERROR_OK: {
// Игрок есть в базе; данные присвоены; просим его пароль;
ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Вход", "Введите Ваш пароль:", "Вход", "Отмена");
}
case ERROR_NO_DATA: {
// Игрока нет; данные не присвоенны; Регистрируем игрока;
ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Регистрация", "Введите желаемый пароль", "Далее", "Отмена");
}
return 1;
}
public OnPlayerDisconnect(playerid, reason) // Игрок покинуд сервер
{
if(Player[playerid][ID] != 0) { // Обратите внимание: у вас не должно быть в базе игрока с 0 ид. Начинайте регистрировать с 1
orm_update(Player[playerid][ORM_ID]); // Обновляем его данные
}
orm_destroy(Player[playerid][ORM_ID]); // Уничтожаем его ORM, т.к. для нового игрока они будут неактуальны.
for(new E_PLAYER:e; e < E_PLAYER; ++e) //очищаем все переменные, для будущих игроков
Player[playerid][e] = 0;
return 1;
}
Последнее редактирование:
