Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 9 из 9
  1. #1
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,536
    Репутация:
    1963 ±

    ORM в SA-MP (MySQL плагин от pBlueG)


    ORM
    (англ. Object-Relational Mapping, рус. объектно-реляционное отображение, или преобразование)

    • ORM - технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных». © Википедия

    Если же говорить по-простому, то ORM можно назвать своеобразной прослойкой между Вашим скриптом и Базой Данных (далее: БД). В эту прослойку заложен ряд функций, которые способны собирать простенькие запросы по заранее заложенным шаблонам, вставляя данные, которые Вы заранее укажите для вставки, создавая экземпляр ORM (подробнее ниже).



    Как и у всего, у данной реализации есть как плюсы, так и минусы, и вот основная их часть:


    • Плюсы:
      1. Уменьшен риск допущения ошибок в запросах, так как они генерируются автоматически, а имена столбцов указываются в одном месте
        (применимо только до тех пор, пока Вам не потребуется составить какой-то более сложный запрос, для реализации которого придётся прибегнуть к обычным функциям работы с кэшем)
      2. Более компактный код (следовательно, скорость разработки немного увеличится)
      3. Нет нужды дополнительно изучать SQL (до тех пор, пока вам не понадобиться написать более сложные запросы, на которые не способна ORM)
      4. Все запросы автоматически обрабатываются в отдельном потоке

    • Минусы:
      1. Нельзя составлять сложные условия для выборки данных (проверять несколько столбцов одновременно).
      2. При отправке update запроса, обновляются все данные, внесённые в экземпляр ORM (нельзя обновить конкретный столбец).
      3. Существует потеря в производительности, так как в системе присутствуют дополнительные проверки того, какие данные Вы вносите и т.п.
      4. Так же существует потеря в производительности из-за того, что некоторые функции и защиты для запросов SQL пришлось обособить для всех данных (например, ORM экранирует все строки, дабы избежать SQL-инъекции, хотя далеко не во всех случаях это нужно)

    *Вы так же можете указать на тот или иной плюс/минус использования ORM и я включу его в статью


    Настало время определиться с тем, что же такое «экземпляр ORM».
    Перед тем, как начать работать с данными в таблице, Вы должны сообщить ORM системе имя таблицы, с которой нужно работать, и указать нужные столбцы, сопоставив каждому глобальную переменную из скрипта, куда данные будут записываться при загрузке и откуда данные будут изыматься при обновлении таблицы. Эта совокупность данных и называется экземпляром ORM.


    Ну а теперь перейдём к описанию функционала, при помощи которого мы можем управлять ORM системой и "общаться" с ней.

    • Создание экземпляра ORM:
      PHP код:
      native ORM:orm_create(const table[], MySQL:handle MYSQL_DEFAULT_HANDLE); 
      • Описание:
        Функция orm_create создаёт экземпляр ORM.

         Подробнее:
        • Параметры:
          const table[] - Имя таблицы, к которой будет привязан создаваемый экземпляр.
          MySQL:handle - ID подключения к базе данных на случай, если Вы подключаетесь одновременно к нескольким БД
          (по умолчанию равен MYSQL_DEFAULT_HANDLE)

        • Возвращаемые значения: Пояснение:
          ID
          созданного
          экземпляра ORM
          Создание прошло успешно
          0 Экземпляр создать не удалось
          (напр: не найдена указанная таблица)

        • Пример использования:
          PHP код:
          public OnPlayerConnect(playerid)
          {
              
          // Создадим экземпляр ORM при подключении игрока
              
          new ORM:ormid orm_create("accounts"mysql_connection_ID);

              
          /* ... */
              
          return 1;




    • Уничтожение экземпляра ORM:
      PHP код:
      native orm_destroy(ORM:id); 
      • Описание:
        Функция orm_destroy удаляет экземпляр ORM из памяти плагина.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.

        • Возвращаемые значения: Пояснение:
          1 Удаление прошло успешно
          0 Экземпляр удалить не удалось
          (напр: указан ID ещё не созданного экземпляра)

        • Пример использования:
          PHP код:
          enum e_PLAYER_INFO
          {
              
          pORM_ID,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              
          // Сохраним ID экземпляра в глобальную переменную, дабы в последующем использовать его для работы с экземпляром
              
          new ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              // Удалим созданную ранее ORM из памяти
              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Регистрация целочисленной переменной для экземпляра ORM:
      PHP код:
      native orm_addvar_int(ORM:id, &var, const columnname[]); 
      • Описание:
        Функция orm_addvar_int регистрирует целочисленную переменную, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.
        Примечание: Зарегистрировать можно только глобальную переменную, так как плагин не выделяет на своей стороне какой-либо памяти для хранения данных, а лишь записывает адрес указанной переменной, впоследствии обращаясь к ней же. Локальные переменные хранятся в стэке, который отчищается после обработки сегмента кода, в котором была объявлена переменная. Соответственно, хранить данные в локальной переменной на постоянной основе для ORM не представляется возможным.
        Так же стоит отметить, что в Pawn нет возможности передать по ссылке адрес конкретного байта (можно передать лишь адрес ячейки), поэтому использование char переменных (напр: "array{idx}") не представляется возможным.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          &var - Целочисленная переменная, которая будет хранить нужные для хранения в таблице данные
          const columnname[] - Столбец из таблицы, к которой привязан экземпляр ORM, в который будут хранится данные для переменной

        • Возвращаемые значения: Пояснение:
          1 Регистрация переменной прошла успешно
          0 Зарегистрировать переменную не удалось
          (напр: указан несуществующий столбец)

        • Пример использования:
          PHP код:
          enum e_PLAYER_INFO
          {
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          //Зарегистрируем две целочисленные переменные
              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Регистрация вещественной переменной для экземпляра ORM:
      PHP код:
      native orm_addvar_float(ORM:id, &Float:var, const columnname[]); 
      • Описание:
        Функция orm_addvar_float регистрирует вещественную переменную, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          &Float:var - Вещественная переменная, которая будет хранить нужные для хранения в таблице данные
          const columnname[] - Столбец из таблицы, к которой привязан экземпляр ORM, в который будут хранится данные для переменной

        • Возвращаемые значения: Пояснение:
          1 Регистрация переменной прошла успешно
          0 Зарегистрировать переменную не удалось
          (напр: указан несуществующий столбец)

        • Пример использования:
          PHP код:
          enum e_PLAYER_INFO
          {
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");

              
          //Зарегистрируем три вещественные переменные
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Регистрация переменной с текстом для экземпляра ORM:
      PHP код:
      native orm_addvar_string(ORM:id, var[], var_maxlen, const columnname[]); 
      • Описание:
        Функция orm_addvar_string регистрирует переменную, хранящую текст, связывая её с указанным столбцом в таблице, к которой привязан экземпляр ORM.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          var[] - Массив, который будет хранить нужный для хранения в таблице текст
          var_maxlen - Размер регистрируемого массива
          const columnname[] - Столбец из таблицы, к которой привязан экземпляр ORM, в который будут хранится данные для массива

        • Возвращаемые значения: Пояснение:
          1 Регистрация массива прошла успешно
          0 Зарегистрировать массив не удалось
          (напр: указан несуществующий столбец)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");

              
          //Зарегистрируем два массива
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Обнуление переменных, зарегистрированных в экземпляре ORM:
      PHP код:
      native orm_clear_vars(ORM:id); 
      • Описание:
        Функция orm_clear_vars устанавливает значение, равное нулю, для всех переменных, зарегистрированных ранее в экземпляре ORM.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.

        • Возвращаемые значения: Пояснение:
          1 Обнуление прошло успешно
          0 Обнулить переменные не удалось
          (напр: указан ID несуществующего экземпляра ORM)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          // Обнулим все зарегистрированные переменные
              
          orm_clear_vars(ormid);

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;
          }

          CMD:clearplayerinfo(playeridparams[])
          {
              new 
          giveplayerid;
              if(
          sscanf(params"r"giveplayerid))
              {
                  
          SendClientMessage(playerid0xFF0000FF"Примечание: {FFFFFF}/clearplayerinfo [PlayerID]");
                  return 
          1;
              }
              if(
          giveplayerid == INVALID_PLAYER_ID)
              {
                  
          SendClientMessage(playerid0xFF0000FF"Ошибка: {FFFFFF}Указанный игрок не найден на сервере!");
                  return 
          1;
              }

              
          // Пример того, что переменные можно обнулять не только сразу после их регистрации.
              
          new result orm_clear_vars(pInfo[giveplayerid][pORM_ID]);
              if(
          result == 1)
              {
                  
          SendClientMessage(playerid0x00FF00FF"Обнуление данных прошло успешно!");
              }
              else
              {
                  
          SendClientMessage(playerid0xFF0000FF"При обнулении данных произошла ошибка!");
              }
              return 
          1;




    • Удаление ранее зарегистрированной переменной в экземпляре ORM:
      PHP код:
      native orm_delvar(ORM:id, const columnname[]); 
      • Описание:
        Функция orm_delvar удаляет ранее зарегистрированную переменную в экземпляре ORM по имени столбца.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const columnname[] - Имя столбца, переменную которого нужно удалить из экземпляра ORM

        • Возвращаемые значения: Пояснение:
          1 Удаление прошло успешно
          0 Удалить переменную не удалось
          (напр: указана не созданная/уже удалённая переменная)

        • Пример использования:
          PHP код:
          /* Код авторизации */

          // Если введённый игроком пароль совпал с тем, что он указывал при регистрации
          if(!strcmp(inputtextpInfo[playerid][pPassword], falseMAX_PLAYER_PASSWORD+1))
          {
              
          // Удаляем из экземпляра переменную с паролем, так как она нам больше не пригодится (лишь пример)
              
          orm_delvar(pInfo[playerid][pORM_ID], "account_password");

              
          /* Авторизуем игрока */




    • Установка зарегистрированной в экземпляре ORM переменной в качестве ключа:
      PHP код:
      native orm_setkey(ORM:id, const columnname[]); 
      • Описание:
        Функция orm_setkey устанавливает ранее зарегистрированную переменную в качестве ключа.
        Иными словами, выбранная переменная станет формировать условие выборки (всё, что находится после WHERE в обычном запросе).
        Одновременно может быть установлена только одна переменная в качестве ключа.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const columnname[] - Имя столбца, переменную которого нужно установить в качестве ключа

        • Возвращаемые значения: Пояснение:
          1 Установка ключа прошла успешно
          0 Установить переменную в качестве ключа не удалось
          (напр: указана не созданная переменная/столбец не существует)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          //Запишем в переменную pName ник игрока, дабы в последующем использовать его в запросах
              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);

              
          orm_setkey(ormid"account_name");// Все последующие запросы будут иметь вид " ... WHERE `account_name` = 'содержимое_переменной_pName' "
              // Соответственно, после загрузки данных из таблицы в переменные (подробнее об этом ниже), в качестве ключа лучше установить столбец "account_id", дабы сравнивалось число, а не строка

              /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Отправка запроса на выборку данных из таблицы в экземпляр ORM (загрузка данных):
      PHP код:
      native orm_select(ORM:id, const callback[] = "", const format[] = "", {Float_}:...); 
      • Описание:
        Функция orm_select формирует и отправляет запрос SELECT в таблицу для выгрузки данных в зарегистрированные переменные.
        orm_load является полным аналогом функции orm_select

        Запрос формируется по следующему шаблону:
        PHP код:
        SELECT
            
        /* переменная_1 */,
            
        /* переменная_2 */,
            
        /* переменная_3 */,
            
        /* все оставшиеся зарегистрированные переменные, кроме той, что установлена в качестве ключа */
        FROM
            
        /* таблица */
        WHERE
            
        /* имя столбца, установленного в качестве ключа*/ /*текущее значение переменной, установленной в качестве ключа */ 

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const callback[] = "" - Название коллбэка, в котором произойдёт обработка результата (опционально)
          const format[] = "" - Список спецификаторов для параметров коллбэка (опционально)
          {Float, _}:... - Значения, передаваемые в параметры коллбэка (опционально)

        • Возвращаемые значения: Пояснение:
          1 Запрос успешно отправлен
          0 Запрос не удалось отправить
          (напр: указан ID не существующего экземпляра ORM)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);
              
          orm_setkey(ormid"account_name");

              
          // Отправим запрос на выгрузку данных
              /* Сгенерированный запрос будет выглядеть так:

                  SELECT `account_id`, `player_money`, `last_pos_x`, `last_pos_y`, `last_pos_z`, `account_password` FROM `accounts` WHERE `account_name` = 'Ник_из_переменной_pName'

              */
              
          orm_select(pInfo[playerid][pORM_ID], "UploadPlayerAccount""i"playerid);

              
          /* ... */
              
          return 1;
          }

          forward UploadPlayerAccount(playerid);
          public 
          UploadPlayerAccount(playerid)
          {
              
          /* ... */

              // Изменим переменную ключа на ID аккаунта, дабы при каждом последующем запросе сравнивались числа, а не строки
              
          orm_setkey(pInfo[playerid][pORM_ID], "account_id");

              
          /*
                  Выгружать какие-либо данные вручную не нужно.
                  На момент вызова указанного Вами коллбэка (в данном случае это UploadPlayerAccount) все данные уже находятся в зарегистрированных переменных.
              */

              /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Отправка запроса на обновление данных в таблице:
      PHP код:
      native orm_update(ORM:id, const callback[] = "", const format[] = "", {Float_}:...); 
      • Описание:
        Функция orm_update формирует и отправляет запрос UPDATE в таблицу для обновления данных в ней исходя из значений в зарегистрированных переменных (обновляются сразу все переменные).

        Запрос формируется по следующему шаблону:
        PHP код:
        UPDATE
            
        /* таблица */
        SET
            
        /* столбец_1 */ /* переменная_1 */,
            
        /* столбец_2 */ /* переменная_2 */,
            
        /* столбец_3 */ /* переменная_3 */,
            
        /* все оставшиеся зарегистрированные столбцы/переменные, кроме той, что установлена в качестве ключа */
        WHERE
            
        /* имя столбца, установленного в качестве ключа*/ /*текущее значение переменной, установленной в качестве ключа */ 

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const callback[] = "" - Название коллбэка, в котором произойдёт обработка результата (опционально)
          const format[] = "" - Список спецификаторов для параметров коллбэка (опционально)
          {Float, _}:... - Значения, передаваемые в параметры коллбэка (опционально)

        • Возвращаемые значения: Пояснение:
          1 Запрос успешно отправлен
          0 Запрос не удалось отправить
          (напр: указан ID не существующего экземпляра ORM)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);
              
          orm_setkey(ormid"account_name");

              
          orm_select(pInfo[playerid][pORM_ID], "UploadPlayerAccount""i"playerid);

              
          /* ... */
              
          return 1;
          }

          forward UploadPlayerAccount(playerid);
          public 
          UploadPlayerAccount(playerid)
          {
              
          /* ... */

              
          orm_setkey(pInfo[playerid][pORM_ID], "account_id");



              
          // В качестве примера изменим значения переменных и отправим запрос на обновление данных

              
          pInfo[playerid][pMoney] = 50000;
              
          pInfo[playerid][pPosX] = pInfo[playerid][pPosY] = pInfo[playerid][pPosZ] = 50.0// Установим всем 3-м переменным значение `50.0`

              /* Сгенерированный запрос будет выглядеть так:

                  UPDATE `accounts`SET `player_money`= '50000', `last_pos_x` = 50.0, `last_pos_y` = 50.0, `last_pos_z` = 50.0, `account_name` = 'значение_pName', `account_password` = 'значение_pPassword' WHERE `account_id` = /* текущее значение переменной pAccountID */

                  
          Как Вы могли заметитьпосле WHERE уже указан столбец "account_id"а не "account_name"так как мы изменили ключ
              
          */
              
          orm_update(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;




    • Отправка запроса на создание данных в таблице:
      PHP код:
      native orm_insert(ORM:id, const callback[] = "", const format[] = "", {Float_}:...); 
      • Описание:
        Функция orm_insert формирует и отправляет запрос INSERT в таблицу для создания данных в ней исходя из значений в зарегистрированных переменных.

        Запрос формируется по следующему шаблону:
        PHP код:
        INSERT INTO
            
        /* таблица */
        (
            
        /* столбец_1 */,
            
        /* столбец_2 */,
            
        /* столбец_3 */,
            
        /* все оставшиеся зарегистрированные столбцы */
        )
        VALUES
        (
            
        /* переменная_1 */,
            
        /* переменная_2 */,
            
        /* переменная_3 */,
            
        /* все оставшиеся зарегистрированные переменные */


         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const callback[] = "" - Название коллбэка, в котором произойдёт обработка результата (опционально)
          const format[] = "" - Список спецификаторов для параметров коллбэка (опционально)
          {Float, _}:... - Значения, передаваемые в параметры коллбэка (опционально)

        • Возвращаемые значения: Пояснение:
          1 Запрос успешно отправлен
          0 Запрос не удалось отправить
          (напр: указан ID не существующего экземпляра ORM)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);
              
          orm_setkey(ormid"account_name");

              
          // В качестве примера сразу же отправим запрос на создание нового аккаунта
              // (более реальные примеры ищите в статье по созданию системы аккаунтов с использованием ORM, ссылку на которую прикреплю в конце статьи)
              
          orm_insert(pInfo[playerid][pORM_ID], "OnPlayerRegistered""i"playerid);

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerRegistered(playerid)
          {
              
          printf("Игрок %s зарегистрирован. ID аккаунта: %d"pInfo[playerid][pName], pInfo[playerid][pAccountID]);
              return 
          1;




    • Отправка запроса на удаление данных из таблицы:
      PHP код:
      native orm_delete(ORM:id, const callback[] = "", const format[] = "", {Float_}:...); 
      • Описание:
        Функция orm_delete формирует и отправляет запрос DELETE в таблицу для удаления данных из неё исходя из значения переменной, указанной в качестве ключа.

        Запрос формируется по следующему шаблону:
        PHP код:
        DELETE FROM /* таблица */ WHERE /* имя столбца, установленного в качестве ключа */ /*текущее значение переменной, установленной в качестве ключа */ 

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const callback[] = "" - Название коллбэка, в котором произойдёт обработка результата (опционально)
          const format[] = "" - Список спецификаторов для параметров коллбэка (опционально)
          {Float, _}:... - Значения, передаваемые в параметры коллбэка (опционально)

        • Возвращаемые значения: Пояснение:
          1 Запрос успешно отправлен
          0 Запрос не удалось отправить
          (напр: указан ID не существующего экземпляра ORM)

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);
              
          orm_setkey(ormid"account_name");

              
          // В качестве примера используем код из предыдущего примера
              
          orm_insert(pInfo[playerid][pORM_ID], "OnPlayerRegistered""i"playerid);

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerRegistered(playerid)
          {
              
          // И удалим только что созданную строку
              
          orm_delete(Player[playerid][ORM_ID]);

              
          /* Сгенерированный запрос будет выглядеть так:

                  DELETE FROM `accounts` WHERE `account_name` = 'значение_pName'
              */

              
          return 1;




    • Отправка запроса на обновление данных в таблице или создание этих данных, если ранее они не были созданы:
      PHP код:
      native orm_save(ORM:id, const callback[] = "", const format[] = "", {Float_}:...); 
      • Описание:
        Функция orm_save совмещает в себе функционал "orm_insert" и "orm_update".
        То, какой именно запрос будет отправлен, зависит от того, имеется ли в переменной, указанной в качестве ключа, какое-либо значение или там указан нуль/пустая строка.

        То бишь, если в качестве ключа установлена переменная pAccountID (целочисленная переменная) и её значение равно нулю (а в MySQL столбцы, имеющие атрибут AUTO_INCREMENT, который должен быть установлен у столбца "account_id", не могут иметь нулевое значение), то данная функция отправит запрос INSERT, создавая новую строку. Так же будет и в случае, если в качестве ключа установлен массив pName (переменная с текстом) и в нём не записано никакое значение. Если же в переменной ключа будет записано какое-либо значение, функция отправит запрос UPDATE

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          const callback[] = "" - Название коллбэка, в котором произойдёт обработка результата (опционально)
          const format[] = "" - Список спецификаторов для параметров коллбэка (опционально)
          {Float, _}:... - Значения, передаваемые в параметры коллбэка (опционально)

        • Возвращаемые значения: Пояснение:
          1 Запрос успешно отправлен
          0 Запрос не удалось отправить
          (напр: указан ID не существующего экземпляра ORM)

        • Пример использования:
          Данную функцию можно использовать вместо orm_update и orm_insert, если в Вашем коде предусмотрено обнуление значения ключа тогда, когда столбец не создан.



    • Выгрузка данных из активного кэша в переменные экземпляра ORM:
      PHP код:
      native orm_apply_cache(ORM:idrow_idxresult_idx 0); 
      • Описание:
        Функция orm_apply_cache извлекает данные из кэша, помещая их в переменные экземпляра ORM.
        Иными словами, Вы можете составить обычный запрос (пригодится, когда нужно сделать выборку по нескольким условиям, а не только по одному) и отправить его при помощи mysql_(t/p)query, а уже результат обрабатывать не через cache_get_value_index(...), а использовать данную функцию, которая сама запишет данные в нужные переменные.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.
          row_idx - Порядковый номер строки в кэше, из которого нужно получать данные (равносильно первому параметру в cache_get_value_index(...).)
          result_idx - ID кэша, из которого нужно извлекать данные (опционально)

        • Возвращаемые значения: Пояснение:
          1 Данные успешно извлечены
          0 Данные не удалось извлечь
          (напр: нет активного кэша)

        • Пример использования:
          Первый пример (mysql_query):
          PHP код:
          new query[42+11+1];
          format(query_stringsizeof(query_string), "SELECT * FROM `accounts` WHERE `account_id` = %d"pInfo[playerid][pAccountID]);
          new 
          Cache:result mysql_query(mysql_connection_IDquery_stringtrue);
          if(!
          cache_num_rows())
          {
              
          cache_delete(result);
              return print(
          "Аккаунт не найден!");
          }
          orm_apply_cache(pInfo[playerid][pORM_ID], 0result);
          printf("Игрок %s имеет %d$ и находится в координатах %f,%f,%f"pInfo[playerid][pName], pInfo[playerid][pMoney], pInfo[playerid][pPosX], pInfo[playerid][pPosY], pInfo[playerid][pPosZ]);
          cache_delete(result); 
          Второй пример (mysql_tquery):
          PHP код:
          new query[42+11+1];
          format(query_stringsizeof(query_string), "SELECT * FROM `accounts` WHERE `account_id` = %d"pInfo[playerid][pAccountID]);
          mysql_tquery(mysql_connection_IDquery_string"OnStuffSelected""d"playerid);

          public 
          OnStuffSelected(playerid)
          {
              if(!
          cache_num_rows())
                  return print(
          "Аккаунт не найден!");
              
          orm_apply_cache(pInfo[playerid][pORM_ID], 0);
              
          printf("Игрок %s имеет %d$ и находится в координатах %f,%f,%f"pInfo[playerid][pName], pInfo[playerid][pMoney], pInfo[playerid][pPosX], pInfo[playerid][pPosY], pInfo[playerid][pPosZ]);
              return 
          1;




    • Поиск ошибок в отправленном запросе ORM:
      PHP код:
      native E_ORM_ERROR:orm_errno(ORM:id); 
      • Описание:
        Функция orm_errno даёт информацию о качестве последнего запроса, возвращая одно из трех значений.

         Подробнее:
        • Параметры:
          ORM:id[] - ID экземпляра ORM, возвращаемого функцией orm_create.

        • Возвращаемые значения: Пояснение:
          ERROR_INVALID Ошибка при выполнении функции orm_errno
          (Указан ID не существующего экземпляра ORM)
          ERROR_OK В ходе запроса ошибок не произошло
          (Для orm_select: данные найдены)
          ERROR_NO_DATA В таблице не найдено данных по выбранному ключу

        • Пример использования:
          PHP код:
          const MAX_PLAYER_PASSWORD 128;

          enum e_PLAYER_INFO
          {
              
          pName[MAX_PLAYER_NAME],
              
          pPassword[MAX_PLAYER_PASSWORD+1],
              
          pORM_ID,
              
          pAccountID,
              
          pMoney,
              
          Float:pPosX,
              
          Float:pPosY,
              
          Float:pPosZ,

              
          /* ... */
          };
          new 
          pInfo[MAX_PLAYERS][e_PLAYER_INFO];

          public 
          OnPlayerConnect(playerid)
          {
              new 
          ORM:ormid pInfo[playerid][pORM_ID] = orm_create("accounts"mysql_connection_ID);

              
          orm_addvar_int(ormidpInfo[playerid][pAccountID], "account_id");
              
          orm_addvar_int(ormidpInfo[playerid][pMoney], "player_money");
              
          orm_addvar_float(ormidpInfo[playerid][pPosX], "last_pos_x");
              
          orm_addvar_float(ormidpInfo[playerid][pPosY], "last_pos_y");
              
          orm_addvar_float(ormidpInfo[playerid][pPosZ], "last_pos_z");
              
          orm_addvar_string(ormidpInfo[playerid][pName], MAX_PLAYER_NAME"account_name");
              
          orm_addvar_string(ormidpInfo[playerid][pPassword], MAX_PLAYER_PASSWORD+1"account_password");

              
          orm_clear_vars(ormid);

              
          GetPlayerName(playeridpInfo[playerid][pName], MAX_PLAYER_NAME);
              
          orm_setkey(ormid"account_name");

              
          // Отправим запрос на выгрузку данных
              
          orm_select(pInfo[playerid][pORM_ID], "UploadPlayerAccount""i"playerid);

              
          /* ... */
              
          return 1;
          }

          forward UploadPlayerAccount(playerid);
          public 
          UploadPlayerAccount(playerid)
          {
              
          /* ... */

              
          orm_setkey(pInfo[playerid][pORM_ID], "account_id");

              
          //Проверим, нашлись-ли какие-нибудь данные по нашему запросу
              
          switch (orm_errno(pInfo[playerid][pORM_ID]))
              {
                  case 
          ERROR_OK:// Если нашлись
                  
          {
                      
          // Покажем диалог авторизации
                  
          }
                  case 
          ERROR_NO_DATA:// Если не нашлись
                  
          {
                      
          // Покажем диалог регистрации
                  
          }
              }

              
          /* ... */
              
          return 1;
          }

          public 
          OnPlayerDisconnect(playerid)
          {
              
          /* ... */

              
          orm_destroy(pInfo[playerid][pORM_ID]);

              
          /* ... */
              
          return 1;







    Если есть какие-либо вопросы, прошу написать об этом в комментариях.
    Автор статьи - DeimoS
    Копирование данного материала без разрешения автора запрещено





    Интересные статьи на подобную тему:
    * [Урок] Создание системы регистрации на основе плагина MySQL [R39-R41] (ORM) (в разработке)


    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  2. 8 пользователя(ей) сказали cпасибо:
    #enotya (09.02.2018) Daniel_Cortez (07.02.2018) Geebrox (07.02.2018) Mr_LemoneZ (07.02.2018) Nurick (07.02.2018) Osetin (08.02.2018) Web (07.02.2018) ziggi (07.02.2018)
  3. #2
    Аватар для TheMallard
    Пользователь

    Статус
    Оффлайн
    Регистрация
    08.12.2015
    Адрес
    San Fierro
    Сообщений
    217
    Репутация:
    39 ±

  4. #3
    Аватар для ziggi
    Проверенный

    Статус
    Оффлайн
    Регистрация
    14.05.2015
    Сообщений
    1,181
    Репутация:
    788 ±
    Делал регу на MySQL ORM, может пригодится кому: https://gist.github.com/ziggi/ef37b916efd7ced12b99

  5. #4
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,536
    Репутация:
    1963 ±
    Тогда что, делать статью ещё и по регистрации на ORM или хватит тех двух примеров, что выше дали?
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  6. #5
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,159
    Репутация:
    2540 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    Тогда что, делать статью ещё и по регистрации на ORM или хватит тех двух примеров, что выше дали?
    Или сделать разбор кода одного из двух примеров выше, если в них есть что-то, чего нет в твоём коде для готовящейся статьи. Но это если ziggi не против использования своего примера (в коде по ссылке выше только копирайт, лицензии нет).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  7. #6
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,536
    Репутация:
    1963 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    Или сделать разбор кода одного из двух примеров выше, если в них есть что-то, чего нет в твоём коде для готовящейся статьи. Но это если ziggi не против использования своего примера (в коде по ссылке выше только копирайт, лицензии нет).
    В обеих реализациях есть то, что я реализовал бы иначе, так что если и делать, то делать на основе своего кода.
    Тут речь о том, станет ли кто-то пользоваться подобным или нет
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    whale (09.02.2018)
  9. #7
    Аватар для whale
    Пользователь

    Статус
    Оффлайн
    Регистрация
    10.04.2014
    Сообщений
    74
    Репутация:
    17 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    В обеих реализациях есть то, что я реализовал бы иначе, так что если и делать, то делать на основе своего кода.
    Тут речь о том, станет ли кто-то пользоваться подобным или нет
    Думаю, что стоит. Не знаю, как остальным, но мне было бы интересно посмотреть и, возможно, узнать что-то новое для себя :)

  10. #8
    Аватар для xqtOr
    Пользователь

    Статус
    Оффлайн
    Регистрация
    22.02.2021
    Сообщений
    1
    Репутация:
    0 ±
    @ziggi @DeimoS @Daniel_Cortez
    Парни, привет! Спустя 3 года поднимаю эту тему. Есть вопросы, помогите разобраться.
    1. Хочу поинтересоваться, возможно ли одновременное сосуществование двух разных ORM_ID? К чему я веду? Например, есть функция загрузки данных игрока, ей присваивается ORM_ID по которому она и осуществляет запросы, но мне нужно после загрузки игрока загрузить автомобили, так же через ORM. Для того, чтобы это сделать, мне нужно вызвать orm_destroy и "убить" предыдущий ORM-сценарий, но тогда, в дальнейшем мне недоступно, к примеру, то же сохранение игрока. Как быть? Каким образом можно реализовать через ORM-сценарии другие функции загрузок: машин, домов, кланов и т.д. 2. И да, возможно ли сразу полная загрузка всех строк из таблицы, а не по отдельности для каждого игрока? (Ведь, cache_get_row_count тут уже не проканает...)
    Брал систему регистрации из первого коммента в этой теме, реализация та же, ничего не менял, а добавить не могу, ибо не понимаю, как осуществлять загрузку авто или чего-либо прочего, непосредственно для одного игрока при коннекте. И как это все связать между собой...

    ----------------------------------------
    Так, вроде, я понял, что нужно использовать orm_apply_cache, но каким образом, если остается все та же проблема с orm_id
    ----------------------------------------
    Вопрос закрыт! Разобрался. Если кому-то нужно помочь - пишите
    Последний раз редактировалось xqtOr; 23.02.2021 в 04:17.

  11. #9
    Аватар для DeimoS
    Модератор?

    Статус
    Онлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,536
    Репутация:
    1963 ±
    Я советую сначала разобраться с "голым" MySQL, а уже потом только переходить к ORM, если вдруг такое желание появится.
    И под "разобраться" я подразумеваю не просто чтение статей, а-ля "MySQL в Pawn", где "рассказывается" про 3 вида запросов, а полноценно углубиться в тему, узнав какие есть правила ведения таблиц, как делать не нужно и т.п. Вот после того, как со всем этим разберёшься и будет понимание того, как работать с БД, уже можно будет смотреть в сторону ORM, понимая, где её можно применять и нужно ли вообще. А пока что ты лишь ненужное усложнение в код внесёшь и не более.
    Связаться со мной в VK можно через личные сообщения этой группы

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •