Помогите усложнить запрос

Тема в разделе "Программирование / Скриптинг", создана пользователем egorzenit, 5 ноя 2012.

  1. egorzenit

    egorzenit

    Сообщения:
    20
    Симпатии:
    0
    Здравствуйте..
    помогите пожалуйста с mysql плагином для сервера. мне нужно сделать следующее:
    Нужно при подключении проверять по базе есть ли стим ид в ней,если нету то кикать,если есть то смотреть на стоящюю рядом графу status: если в ней указан 0 то изменять его значение на 1. а если уже стоит 1 то кикать опять же.
    кто сможет помочь с таким вроде как не сложным заданием готов даже финансово отблагодарить
     
  2. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Re: Помогите усложнить запрос.

    g_SQL - Handle: sql подключения (глобальная переменная)

    `my_tab` - таблица
    `status` - поле (значение: 1/0)
    `my_steamid` - поле (значение: стим игрока)

    PHP:
    public OnClientPutInServer(client)
    {
        
    // игрок вошел, делаем запрос
        /////////////////////////////////////////////////////

        // Если это бот, стоп
        
    if (IsFakeClient(client)) return;

        
    // Если не удалось стим получить (wtf..), стоп
        
    decl String:steamid[28];
        if (!
    GetClientAuthString(clientsteamid28))
        {
            
    KickClient(client"Не удалось определить ваш SteamID (1)");
            return;
        }

        
    decl String:zapros[125];
        
    Format(zapros125"SELECT `status` FROM `my_tab` WHERE `my_steamid` = '%s' LIMIT 1"steamid);
        
    SQL_TQuery(g_SQLwS_OnClientPutInServer_CallBackzaprosGetClientUserId(client));
    }

    public 
    wS_OnClientPutInServer_CallBack(Handle:ownerHandle:result, const String:error[], any:userid)
    {
        
    // игрок успел выйти, стоп (wtf)
        
    new client GetClientOfUserId(userid);
        if (
    client 1) return;

        if (
    result == INVALID_HANDLE)
        {
            
    LogError(error); KickClient(client"wtf, ошибка в SQL запросе");
            return;
        }

        if (!
    SQL_FetchRow(result))
        {
            
    KickClient(client"Вашего SteamID нет в таблице 'my_tab'");
            return;
        }

        if (
    SQL_FetchInt(result0) == 1)
        {
            
    KickClient(client"Вы отключены (status = 1)");
            return;
        }

        
    // Разрешаем играть и обновляем status на 1
        
    decl String:steamid[28];
        if (!
    GetClientAuthString(clientsteamid28))
        {
            
    KickClient(client"Не удалось определить ваш SteamID (2)");
            return;
        }

        
    decl String:zapros[125];
        
    Format(zapros125"UPDATE `my_tab` SET `status` = 1 WHERE `my_steamid` = '%s'"steamid);
        
    SQL_TQuery(g_SQLSQL_CallBackzapros);
    }

    public 
    SQL_CallBack(Handle:ownerHandle:result, const String:error[], any:data)
    {
        if (
    result == INVALID_HANDLELogError(error);
    }
     
    Последнее редактирование: 6 ноя 2012
    egorzenit и September нравится это.
  3. egorzenit

    egorzenit

    Сообщения:
    20
    Симпатии:
    0
    Re: Помогите усложнить запрос.

    Воспользовался твоей же функцией подключения которая у тебя на сайте написана получаю ошибку следующего типа:
    /groups/sourcemod/upload_tmp/textwiwij2.sp(83) : error 100: function prototypes do not match

    1 Error.
    Подскажи что не так?
    PHP:
    #include <sourcemod> 

    new Handle:g_SQL INVALID_HANDLEbool:MYSQL

    public 
    OnPluginStart() 

         if (!
    SQL_CheckConfig("fastmix")) 
         { 
             
    SetFailState("Секция \"fastmix\" не найдена в databases.cfg"); 
             return; 
         } 

         
    decl String:error[256]; 
         
    g_SQL SQL_Connect("fastmix"trueerror256); 
         if (
    g_SQL == INVALID_HANDLE
         { 
             
    LogError(error); 
             
    SetFailState("Не удалось установить SQL соединение"); 
             return; 
         } 

         
    // тип соединения (mysql или sqlite) 
         
    new String:driver[15]; SQL_ReadDriver(g_SQLdriver15); 
         
    MYSQL StrEqual(driver"mysql"false); 
         
    LogMessage("Установлено %s соединение"MYSQL "MYSQL" "SQLite"); 
         }
         
    public 
    OnClientPutInServer(client

        
    // игрок вошел, делаем запрос 
        ///////////////////////////////////////////////////// 

        // Если это бот, стоп 
        
    if (IsFakeClient(client)) return; 

        
    // Если не удалось стим получить (wtf..), стоп 
        
    decl String:steamid[28]; 
        if (!
    GetClientAuthString(clientsteamid28)) 
        { 
            
    KickClient(client"Не удалось определить ваш SteamID (1)"); 
            return; 
        } 

        
    decl String:zapros[125]; 
        
    Format(zapros125"SELECT `status` FROM `my_tab` WHERE `my_steamid` = '%s' LIMIT 1"steamid); 
        
    SQL_TQuery(g_SQLwS_OnClientPutInServer_CallBackzaprosGetClientUserId(client)); 


    public 
    wS_OnClientPutInServer_CallBack(Handle:ownerHandle:result, const String:error[], any:userid

        
    // игрок успел выйти, стоп (wtf) 
        
    new client GetClientOfUserId(userid); 
        if (
    client 1) return; 

        if (
    result == INVALID_HANDLE
        { 
            
    LogError(error); KickClient(client"wtf, ошибка в SQL запросе"); 
            return; 
        } 

        if (!
    SQL_FetchRow(result)) 
        { 
            
    KickClient(client"Вашего SteamID нет в таблице 'my_tab'"); 
            return; 
        } 

        if (
    SQL_FetchInt(result0) == 1
        { 
            
    KickClient(client"Вы отключены (status = 1)"); 
            return; 
        } 

        
    // Разрешаем играть и обновляем status на 1 
        
    decl String:steamid[28]; 
        if (!
    GetClientAuthString(clientsteamid28)) 
        { 
            
    KickClient(client"Не удалось определить ваш SteamID (2)"); 
            return; 
        } 

        
    decl String:zapros[125]; 
        
    Format(zapros125"UPDATE `my_tab` SET `status` = 1 WHERE `my_steamid` = '%s'"steamid); 
        
    SQL_TQuery(g_SQLSQL_CallBackzapros); 


    public 
    SQL_CallBack(Handle:ownerHandle:result, const String:error[]) 

        if (
    result == INVALID_HANDLELogError(error); 
    }  
     
  4. schmidt

    schmidt wS (skype: ws.css)

    Сообщения:
    188
    Симпатии:
    347
    Было так:

    PHP:
    public SQL_CallBack(Handle:ownerHandle:result, const String:error[])
    {
        if (
    result == INVALID_HANDLELogError(error);
    }
    Нужно так:

    PHP:
    public SQL_CallBack(Handle:ownerHandle:result, const String:error[], any:data)
    {
        if (
    result == INVALID_HANDLELogError(error);
    }
    Я недосмотрел, sorry :(
     
    September, Scarface_slv и egorzenit нравится это.
  5. Scarface_slv

    Scarface_slv

    Сообщения:
    228
    Симпатии:
    47
    Ну хоть тут можно понять как получить что то с БД, а то подключаться умею максимум...=)
     
  6. egorzenit

    egorzenit

    Сообщения:
    20
    Симпатии:
    0
    Апаю тему дабы заного не создавать
    помогите пожалуйста добавить событие:
    когда игрок отключается менять значение status на 0 вновь
     
  7. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    PHP:
    public OnClientDisconnect(client)
    {
        
    decl String:SteamID[40];
        if (
    GetClientAuthString(clientSteamIDsizeof(SteamID)))
        {
            
    decl String:query[256];
            
    Format(querysizeof(query), "UPDATE my_tab SET status = 0 WHERE my_steamid = '%s'"SteamID);

            if (!
    SQL_FastQuery(g_SQLquery))
            {
                if (
    SQL_GetError(g_SQLquerysizeof(query)))
                {
                    
    LogError("Ошибка (%s)"query);
                }
            }
        }
    }
     
  8. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    The End Is Near..., FastQuery лучше не использовать, при отключении игроков и не локальном соедиинении с БД сервер будет подлагивать, лучше TQuery и сопутствующие ему Callback'и
     
  9. The End Is Near...

    The End Is Near... Russian Roulette

    Сообщения:
    893
    Симпатии:
    659
    KorDen
     
  10. FrozDark

    FrozDark Команда сайта HLMod Модератор

    Сообщения:
    1.761
    Симпатии:
    1.914
    FastQuery - лишь возвращает true если запрос успешно отправлен ну false при не успешном соответственно. А Query отправляет запрос и ожидает результата, если между бд и сервером есть существенная задержка, то сервер просто зависнет на одном фрейме до возвращения результата
     
    Серый™ и KorDen нравится это.
  11. KorDen

    KorDen Atra esterní ono thelduin! Ньюсмейкер

    Сообщения:
    2.194
    Симпатии:
    1.398
    Пардон, мне казалось что FastQuery тоже ждет пока запрос выполнится, т.е. не поточно работает (под "запрос успешно отправлен" мне казалось что именно SQL-сервер его принял, но без разбора ответа, т.е. все равно техническое ожидание принятия запроса сервером)