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

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

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

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

Урок Учимся работать с ORM-сценариями в MySQL [R34]

kamilot73

Умник
Сегодня предлагаю задействовать отличительную особенность R33-34 версии плагина - 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);  //обращаемся к серверу
Что-то похожее явно есть у Вас в гейммоде. А вот как выполняется этот же запрос при помощи ORM:

PHP:
   orm_select(PlayerInfo[playerid][ID_ORM],"OnPlayerDataLoad","d",playerid);  //ORM сценарий выборки данных игрока
Компактно, не правда ли? А теперь давайте рассмотрим callback первого и второго варианта:

В первом случае, мы будем иметь что-то похожее на это:

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); //удалили
orm_errno(ORM:id) - проверка на ошибки при обработке. Вызывать в callback'ах основных сценариев.

Пример:
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;
}
 
Последнее редактирование:
Сверху Снизу