Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 13 из 13

Тема: ORM запросы

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

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    PHP код:
    COMMAND:makevip(adminid,params[]) 

        
    CheckAdminLevel(adminidADMIN_LVL_makeadmin); 

        
    extract params -> new playeridlevelday; else 
        { 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR
                !
    "Используйте: /makevip [playerid] [уровень] [дни]"); 
        } 

        else if(!
    IsPlayerConnected(playerid)) 
            return 
    CMD_INVALID_PLAYER_ID

        else if(
    admin[adminid][admin_level] < admin[playerid][admin_level]) 
            return 
    CMD_INVALID_PERMISSIONS

        else if(!(-
    level MAX_VIP_LEVEL)) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"Уровень не может быть больше чем "#MAX_VIP_LEVEL" и меньше чем 0!");

        
    else if(!(day 365)) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"Количество дней должно быть от 1 до 365!"); 

        else if(
    level == vip[playerid][v_level]) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"У игрока уже установлен данный уровень!"); 

        else if(
    == level
        { 
            
    vip[playerid][v_level] = 0
            
    orm_delete(vip[playerid][vip_orm]); 

            static const 
    string_content[] = ""COLOR_ERROR"%s "COLOR_NOTE"забрал VIP привелегии у "COLOR_ERROR"%s"
            new 
    string[sizeof string_content - (2*3) + MAX_ADMIN_RANK + (MAX_PLAYER_NAME*2)]; 

            
    format(stringsizeof stringstring_contentplayer[adminid][player_name], player[playerid][player_name]); 
            
    SendMessageToAdmins(string); 
            
    SendMessageToVips(string); 

            
    format(stringsizeof string""COLOR_ERROR"%s "COLOR_NOTE" забрал у вас VIP привелегии!"player[adminid][player_name]);
            
    SendClientMessage(playeridHEX_COLOR_NOTEstring); 
            return 
    1
        } 
        else if(!
    vip[playerid][v_level]) 
        { 
            static const 
    string_content[] = ""COLOR_ERROR" %s "COLOR_NOTE" выдал вам VIP уровень: "COLOR_ERROR"%s"
            new 
    string[sizeof string_content + (-MAX_PLAYER_NAME) + (-9)]; 
            
    format(stringsizeof stringstring_contentplayer[adminid][player_name], vip_level[level]); 
            
    SendClientMessage(playeridHEX_COLOR_NOTEstring); 

            static const 
    string_content2[] = ""COLOR_ERROR" %s "COLOR_NOTE" выдал "COLOR_ERROR"%s "COLOR_NOTE"VIP уровень: "COLOR_ERROR"%s"
            new 
    string2[sizeof string_content2 + (-MAX_PLAYER_NAME)*+ (-9)]; 
            
    format(string2sizeof string2string_content2player[adminid][player_name], player[playerid][player_name], vip_level[level]); 
            
    SendMessageToAdmins(string2); 

            
    vip[playerid][vip_day] = 86400 day
            
    vip[playerid][v_id] = player[playerid][player_unique_id]; 
            
    vip[playerid][v_level] = level


            
    printf("\n\n%d | %d | %d\n\n"vip[playerid][v_id], vip[playerid][v_level], vip[playerid][vip_day]);
            
    orm_save(vip[playerid][vip_orm]);
            return 
    1
        } 
        else 
        { 
            
    vip[playerid][v_level] = level
            
    vip[playerid][vip_day] = 86400 day
            
    vip[playerid][v_id] = player[playerid][player_unique_id]; 
            
    orm_update(vip[playerid][vip_orm]); 
        } 
        return 
    true

    Вот так попробуй и если всё равно будет 0, скинь логи сервера + скрин структуры таблицы.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

  2. #12
    Аватар для _MegaMix_
    Пользователь

    Статус
    Оффлайн
    Регистрация
    25.12.2016
    Сообщений
    31
    Репутация:
    0 ±
    Цитата Сообщение от DeimoS Посмотреть сообщение
    PHP код:
    COMMAND:makevip(adminid,params[]) 

        
    CheckAdminLevel(adminidADMIN_LVL_makeadmin); 

        
    extract params -> new playeridlevelday; else 
        { 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR
                !
    "Используйте: /makevip [playerid] [уровень] [дни]"); 
        } 

        else if(!
    IsPlayerConnected(playerid)) 
            return 
    CMD_INVALID_PLAYER_ID

        else if(
    admin[adminid][admin_level] < admin[playerid][admin_level]) 
            return 
    CMD_INVALID_PERMISSIONS

        else if(!(-
    level MAX_VIP_LEVEL)) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"Уровень не может быть больше чем "#MAX_VIP_LEVEL" и меньше чем 0!");

        
    else if(!(day 365)) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"Количество дней должно быть от 1 до 365!"); 

        else if(
    level == vip[playerid][v_level]) 
            return 
    SendClientMessage(adminidHEX_COLOR_ERROR, !"У игрока уже установлен данный уровень!"); 

        else if(
    == level
        { 
            
    vip[playerid][v_level] = 0
            
    orm_delete(vip[playerid][vip_orm]); 

            static const 
    string_content[] = ""COLOR_ERROR"%s "COLOR_NOTE"забрал VIP привелегии у "COLOR_ERROR"%s"
            new 
    string[sizeof string_content - (2*3) + MAX_ADMIN_RANK + (MAX_PLAYER_NAME*2)]; 

            
    format(stringsizeof stringstring_contentplayer[adminid][player_name], player[playerid][player_name]); 
            
    SendMessageToAdmins(string); 
            
    SendMessageToVips(string); 

            
    format(stringsizeof string""COLOR_ERROR"%s "COLOR_NOTE" забрал у вас VIP привелегии!"player[adminid][player_name]);
            
    SendClientMessage(playeridHEX_COLOR_NOTEstring); 
            return 
    1
        } 
        else if(!
    vip[playerid][v_level]) 
        { 
            static const 
    string_content[] = ""COLOR_ERROR" %s "COLOR_NOTE" выдал вам VIP уровень: "COLOR_ERROR"%s"
            new 
    string[sizeof string_content + (-MAX_PLAYER_NAME) + (-9)]; 
            
    format(stringsizeof stringstring_contentplayer[adminid][player_name], vip_level[level]); 
            
    SendClientMessage(playeridHEX_COLOR_NOTEstring); 

            static const 
    string_content2[] = ""COLOR_ERROR" %s "COLOR_NOTE" выдал "COLOR_ERROR"%s "COLOR_NOTE"VIP уровень: "COLOR_ERROR"%s"
            new 
    string2[sizeof string_content2 + (-MAX_PLAYER_NAME)*+ (-9)]; 
            
    format(string2sizeof string2string_content2player[adminid][player_name], player[playerid][player_name], vip_level[level]); 
            
    SendMessageToAdmins(string2); 

            
    vip[playerid][vip_day] = 86400 day
            
    vip[playerid][v_id] = player[playerid][player_unique_id]; 
            
    vip[playerid][v_level] = level


            
    printf("\n\n%d | %d | %d\n\n"vip[playerid][v_id], vip[playerid][v_level], vip[playerid][vip_day]);
            
    orm_save(vip[playerid][vip_orm]);
            return 
    1
        } 
        else 
        { 
            
    vip[playerid][v_level] = level
            
    vip[playerid][vip_day] = 86400 day
            
    vip[playerid][v_id] = player[playerid][player_unique_id]; 
            
    orm_update(vip[playerid][vip_orm]); 
        } 
        return 
    true

    Вот так попробуй и если всё равно будет 0, скинь логи сервера + скрин структуры таблицы.
    В бд сейчас вообще ничего не записалось, в server_log вывело:

    1 | 4 | 691200

    А вот скрин структуры:

  3. #13
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    И тут всё встало на свои места :)

    Причина вот этой ошибки:
    PHP код:
    [ERRORCOrm::UpdateKeyValue inserted id is zero 
    В том, что у тебя столбец vip_id не имеет параметра AUTO_INCREMENT, из-за чего новая строка и создаётся со значением 0, что не совсем верно для MySQL

    Вот этот код:
    PHP код:
    vip[playerid][vip_day] = 86400 day
    vip[playerid][v_id] = player[playerid][player_unique_id]; 
    vip[playerid][v_level] = level
    orm_setkey(vip[playerid][vip_orm], "vip_id");
    orm_insert(vip[playerid][vip_orm]); 
    В результате сформирует вот такой запрос (можно в логах посмотреть, если прописать в OnGameModeInIt "mysql_log(ALL);":
    PHP код:
    INSERT INTO `vips` (`vip_level`,`vip_days`) VALUES ('уровень','дни'
    То бишь, значение vip_id не будет учитываться, так как этот столбец установлен в качестве уникального ключа.

    Что бы всё работало как надо, нужно создать дополнительный столбец, который и будет являться идентификатором строк.
    Вот тебе готовый запрос
      Открыть/закрыть
    PHP код:
    DROP TABLE IF EXISTS vips;
    CREATE TABLE vips (
      
    row_id int(11NOT NULL,
      
    vip_id int(11NOT NULL,
      
    vip_level int(11NOT NULL,
      
    vip_days int(11NOT NULL
    ENGINE=InnoDB DEFAULT CHARSET=utf8;


    ALTER TABLE vips
      ADD PRIMARY KEY 
    (row_id);

    ALTER TABLE vips
      MODIFY row_id int
    (11NOT NULL AUTO_INCREMENT


    Так же нужно это поле занести в ORM:
    PHP код:
    enum VIP_DATA
    {
        
    ORMvip_orm,
        
    v_level,
        
    vip_day,
        
    v_id,
        
    v_rid
    }; 
    PHP код:
    public OnPlayerSpawn(playerid

        if(
    IsPVarSet(playerid"_adsss_connect"
            && 
    player[playerid][player_status] == PLAYER_STATUS_LOGGED
        { 
            new 
    ORM:ormid vip[playerid][vip_orm] = orm_create("vips"); 

            
    orm_addvar_int(ormidvip[playerid][v_rid], "row_id"); 

            
    vip[playerid][v_id] = player[playerid][player_unique_id];// Если этого не сделать, orm_select будет искать vip_id со значением 0 

            
    orm_addvar_int(ormidvip[playerid][v_id], "vip_id"); 

            
    orm_addvar_int(ormidvip[playerid][v_level], "vip_level"); 

            
    orm_addvar_int(ormidvip[playerid][vip_day], "vip_days"); 

            
    orm_setkey(ormid"vip_id"); 

            
    orm_select(ormid"CheckPlayerForVip""i"playerid); 

            
    DeletePVar(playerid"_adsss_connect"); 
        } 
        
    #if defined adsv_OnPlayerSpawn 
            
    return adsv_OnPlayerSpawn(playerid); 
        
    #else 
            
    return 1
        
    #endif 

    #if defined _ALS_OnPlayerSpawn 
        #undef OnPlayerSpawn 
    #else 
        #define _ALS_OnPlayerSpawn 
    #endif 
    #define OnPlayerSpawn adsv_OnPlayerSpawn 
    #if defined adsv_OnPlayerSpawn 
        
    forward adsv_OnPlayerSpawn(playerid); 
    #endif 
    И уже в самой команде устанавливай в качестве ключа новый столбец:
    PHP код:
    orm_setkey(vip[playerid][vip_orm], "row_id"); 
    orm_insert(vip[playerid][vip_orm]); 
    Если я ничего не забыл, то всё должно работать


    UPD: Вопрос решён Закрыто.
    Последний раз редактировалось DeimoS; 22.05.2017 в 19:58.
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

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

    Steve Pavlina

 

 
Страница 2 из 2 ПерваяПервая 1 2

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

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

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

Ваши права

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