Добавление записи в mysql

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

  1. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Пишу маленький скрипт по добавление steamid моих игроков в базу.
    И тут проблема :( Только на половину работает...
    Нужно что бы человек заходил на сервер и его SteamID добавлялся мне в базу, а если он уже есть в базе то игнорилось. (в скрипте это уже почти реализовано).

    Код:
    PHP:
    #pragma semicolon 1

    #include <sourcemod>

    #define PLUGIN_VERSION "1.0"

    new Handle:g_SQL INVALID_HANDLEbool:MYSQL,conte

    public 
    Plugin:myinfo =
    {
         
    name "Injection",
         
    description "123",
         
    author "123",
         
    version PLUGIN_VERSION,
         
    url "123"
    };

    public 
    OnPluginStart() 

         new 
    Handle:kv CreateKeyValues("injection");
         
    KvSetString(kv"driver""mysql");
         
    KvSetString(kv"host""mysql.***.ru");
         
    KvSetString(kv"database""injection");
         
    KvSetString(kv"user""spawn");
         
    KvSetString(kv"pass""f0sU7OFK");
         
    KvSetString(kv"port""3306");
        
         
    decl String:error[255];
         
    g_SQL SQL_ConnectCustom(kverror255true); 
         
    CloseHandle(kv);
         
         new 
    String:driver[15];
         
    SQL_ReadDriver(g_SQLdriver15); 
         
    MYSQL StrEqual(driver"mysql"false);
         
    LogMessage("Установлено %s соединение"MYSQL "MYSQL" "SQLite");
         
         
    decl String:steamid[64];
         
    GetClientAuthString(clientsteamid64);
         
         
    conte SQL_TQuery(g_SQLSQL_DefCallback"SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1"steamid); 
         
         if(
    conte != 0
      { 
         
    SQL_TQuery(g_SQLSQL_DefCallback"INSERT INTO `steam` (`SteamID`) VALUES ('%s')"steamid); 
      }
         
    }

    public 
    SQL_DefCallback(Handle:ownerHandle:hndl, const String:error[], any:data

         if (
    hndl == INVALID_HANDLELogError(error); 
    }
    Ах, да. Ошибка:
     
  2. neatek

    neatek

    Сообщения:
    442
    Симпатии:
    233
    PHP:
    public OnPluginStart()  //  <---- !!!

         ...
         
    decl String:steamid[64];
         
    GetClientAuthString(clientsteamid64);
         
         
    conte SQL_TQuery(g_SQLSQL_DefCallback"SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1"steamid); 
         
         if(
    conte != 0
      { 
         
    SQL_TQuery(g_SQLSQL_DefCallback"INSERT INTO `steam` (`SteamID`) VALUES ('%s')"steamid); 
      }
         ...
    }
    [​IMG]

    Ништяк у тебя событие...

    Попробуй вот это - OnClientPostAdminCheck
     
    JumPixX нравится это.
  3. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Я знаю что я лол в этом деле :D
    Вот как правильно?
     
  4. neatek

    neatek

    Сообщения:
    442
    Симпатии:
    233
    PHP:
    #pragma semicolon 1
    #include <sourcemod>

    static Handle:db;

    public 
    Plugin:myinfo =
    {
        
    name "None",
        
    description "None",
        
    author "www.Neatek.ru",
        
    version "0.0",
        
    url "http://neatek.ru/"
    };
        
    public 
    OnPluginStart() 

        
    ConnectDB();
    }

    public 
    OnClientPostAdminCheck(client)
    {
        if(
    client <= MaxClients && !IsFakeClient(client))
        {
            
    // check
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(clientsteamidsizeof(steamid));
            
    Format(querysizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1"steamid);
            
    SQL_TQuery(dbSQL_CheckInsertqueryclient);
        }
    }

    public 
    SQL_CheckInsert(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }
        
        if(
    SQL_GetRowCount(hndl) == 0)
        {
            
    // insert
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(datasteamidsizeof(steamid));
            
    Format(querysizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')"steamid);
            
    SQL_TQuery(dbSQLErrorCheckCallbackquery); 
        }
    }

    public 
    ConnectDB()
    {
        if (
    SQL_CheckConfig("injection"))
        {
            
    decl String:Error[256];
            
    db SQL_Connect("injection"trueErrorsizeof(Error));

            if (
    db == INVALID_HANDLE)
            {
                
    LogError("Failed to connect to database: %s"Error);
            }
        }
        else
            
    LogError("Database.cfg missing 'injection' entry!");
    }

    public 
    SQLErrorCheckCallback(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }

        if(!
    StrEqual(""error))
        {
            
    LogError("SQL Error: %s"error);
        }
    }
    Вот так, деточка, правильно...
    Что нужно сказать дяде? :-D

    в databases.cfg добавляешь пункт

    "injection"
    {
    ...
    }
     
    JumPixX нравится это.
  5. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Спасибо!!!! :3
     
  6. maverick1660

    maverick1660 Проект DeathLine.ru

    Сообщения:
    187
    Симпатии:
    97
    Neatek что это?
    PHP:
    public OnClientPostAdminCheck(client)
    {
        if(
    client <= MaxClients && !IsFakeClient(client))
        {
            
    // check
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(clientsteamidsizeof(steamid));
            
    Format(querysizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1"steamid);
            
    SQL_TQuery(dbSQL_CheckInsertqueryclient);
        }
    }
    Разве OnClientPostAdminCheck это не проверка админ или нет?
    Что этой функцией проверяешь? :dntknw:
     
  7. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    maverick1660, это пост собыдие проверки на то есть админка у игрока или нет, до него проверять админку смысла нет, в данном случае впринципе можно использовать и OnClientPutInServer
     
    JumPixX нравится это.
  8. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Так как правильно будет?
     
  9. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    JumPixX, не имеет значения
     
    JumPixX нравится это.
  10. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    вот только не работает :(
    База пуста.... Тоесть одна запись со старой версии

    Добавлено через 2 минуты

    Скрипт:
    PHP:
    #pragma semicolon 1
    #include <sourcemod>

    static Handle:db;

    public 
    Plugin:myinfo =
    {
        
    name "injection",
        
    description "None",
        
    author "123",
        
    version "1.0",
        
    url "123"
    };
        
    public 
    OnPluginStart() 

        
    ConnectDB();
    }

    public 
    OnClientPutInServer(client)
    {
        if(
    client <= MaxClients && !IsFakeClient(client))
        {
            
    // check
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(clientsteamidsizeof(steamid));
            
    Format(querysizeof(query), "SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1"steamid);
            
    SQL_TQuery(dbSQL_CheckInsertqueryclient);
        }
    }

    public 
    SQL_CheckInsert(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }
        
        if(
    SQL_GetRowCount(hndl) == 0)
        {
            
    // insert
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(datasteamidsizeof(steamid));
            
    Format(querysizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')"steamid);
            
    SQL_TQuery(dbSQLErrorCheckCallbackquery); 
        }
    }

    public 
    ConnectDB()
    {
        if (
    SQL_CheckConfig("injection"))
        {
            new 
    Handle:kv CreateKeyValues("injection");
            
    KvSetString(kv"driver""mysql");
            
    KvSetString(kv"host""***hub.ru");
            
    KvSetString(kv"database""injection");
            
    KvSetString(kv"user""spawn");
            
    KvSetString(kv"pass""U7OFK");
            
    KvSetString(kv"port""3306");
        
            
    decl String:Error[255];
            
    db SQL_ConnectCustom(kvError255true); 
            
    CloseHandle(kv);

            if (
    db == INVALID_HANDLE)
            {
                
    LogError("Failed to connect to database: %s"Error);
            }
        }
        else
            
    LogError("Database.cfg missing 'injection' entry!");
    }

    public 
    SQLErrorCheckCallback(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }

        if(!
    StrEqual(""error))
        {
            
    LogError("SQL Error: %s"error);
        }
    }
    Авторизация ничего не меняет, хотя с прошлой тоже самое было.
     
    Последнее редактирование: 4 ноя 2012
  11. 0wn3r

    0wn3r

    Сообщения:
    184
    Симпатии:
    54
    Замени OnClientPutInServer на public OnClientAuthorized(client, const String:auth[])
    decl String:steamid[64];
    GetClientAuthString(client, steamid, sizeof(steamid));

    Естественно не понадобиться.

    И если ты делаешь ConnectCustom, то (SQL_CheckConfig("injection")) тебе не нужно, это и причина того что ничего не вписываеться.
    Либо делай это как все нормальные люди через databases.cfg

    Такой запрос не нужен: SELECT COUNT(*) FROM `steam` WHERE `SteamID` = '%s' LIMIT 1
    Хватит такого SELECT * FROM `steam` WHERE `SteamID` = '%s'
     
    Последнее редактирование: 4 ноя 2012
    JumPixX нравится это.
  12. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Вот только все равно тоже самое :(

    ------

    Тут разницы нету :(
    Все равно не работает.
     
  13. 0wn3r

    0wn3r

    Сообщения:
    184
    Симпатии:
    54
    Посмотри ошибки. Они туда добавлены не просто так.
     
    JumPixX нравится это.
  14. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    Ура заработало!!!!! Я чуток код переписал и сделал логирование в консоль сервера....
    Так и правда оказался не правильный запрос mysql.
    Старый запрос был для моей первой версии, для нее он был правильный. А тут я не сильно обратил внимание на "SQL_GetRowCount(hndl) == 0"
     
  15. HooLIGUN

    HooLIGUN

    Сообщения:
    748
    Симпатии:
    124
    Выложи рабочий код (если не трудно) , может пригодится данной плагин
     
  16. JumPixX

    JumPixX Админ. CSSRUS.ru

    Сообщения:
    94
    Симпатии:
    16
    PHP:
    #pragma semicolon 1
    #include <sourcemod>

    static Handle:db;

    public 
    Plugin:myinfo =
    {
        
    name "None"
        
    description "None"
        
    author "www.Neatek.ru"
        
    version "0.0"
        
    url "http://neatek.ru/" 
    };
        
    public 
    OnPluginStart() 

        
    ConnectDB();
    }

    public 
    OnClientAuthorized(client)
    {
        if(
    client <= MaxClients && !IsFakeClient(client))
        {
            
    // check
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(clientsteamidsizeof(steamid));
            
    PrintToServer("SteamID: %s"steamid);
            
    Format(querysizeof(query), "SELECT * FROM `steam` WHERE `SteamID` = '%s'"steamid);
            
    SQL_TQuery(dbSQL_CheckInsertqueryclient);
        }
    }

    public 
    SQL_CheckInsert(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }
        
        if(
    SQL_GetRowCount(hndl) == 0)
        {
            
    // insert
            
    decl String:steamid[64], String:query[256];
            
    GetClientAuthString(datasteamidsizeof(steamid));
            
    Format(querysizeof(query), "INSERT INTO `steam` (`SteamID`) VALUES ('%s')"steamid);
            
    SQL_TQuery(dbSQLErrorCheckCallbackquery); 
        }
    }

    public 
    ConnectDB()
    {
            new 
    Handle:kv CreateKeyValues("injection");
            
    KvSetString(kv"driver""mysql");
            
    KvSetString(kv"host""rhub.ru");
            
    KvSetString(kv"database""injection");
            
    KvSetString(kv"user""spawn");
            
    KvSetString(kv"pass""f0sU7OFK");
            
    KvSetString(kv"port""3306");
        
            
    decl String:Error[255];
            
    db SQL_ConnectCustom(kvError255true); 
            
    CloseHandle(kv);

            if (
    db == INVALID_HANDLE)
            {
                
    LogError("Failed to connect to database: %s"Error);
            }
    }

    public 
    SQLErrorCheckCallback(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    db == INVALID_HANDLE)
        {
            return;
        }

        if(!
    StrEqual(""error))
        {
            
    LogError("SQL Error: %s"error);
        }
    }
     
    Последнее редактирование: 4 ноя 2012
    Серый™ и HooLIGUN нравится это.
  17. 0wn3r

    0wn3r

    Сообщения:
    184
    Симпатии:
    54
    PHP:
    public OnClientAuthorized(client, const String:auth[])
    {
        if(
    client <= MaxClients && !IsFakeClient(client))
        {
            
    // check
            
    decl String:query[256];
            
    PrintToServer("SteamID: %s"auth);
            
    FormatEx(querysizeof(query), "SELECT * FROM `steam` WHERE `SteamID` = '%s'"auth);
            
    SQL_TQuery(dbSQL_CheckInsertqueryclient);
        }
    }
    ....

    И в threaded запросах лучше использовать такую проверку на ошибки:
    PHP:
    public SQLErrorCheckCallback(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    owner == INVALID_HANDLE)
        {
            
    LogError("SQL Error (owner): %s"error);
            return;
        }
        
    // или
        
    if (hndl == INVALID_HANDLE)
        {
            
    LogError("SQL Error(hndl): %s"error);
            return;
        }
        
    // чаще используеться hndl поскольку это и есть наш запрос
        // а onwer это sql соедниение
    }
     
  18. maverick1660

    maverick1660 Проект DeathLine.ru

    Сообщения:
    187
    Симпатии:
    97
    Возвращаясь к моему вопросу в посте 6. Так а зачем в данном плагине вообще проверять админ игрок или нет? Здесь нет ни чего связанного с админ правами.
     
  19. 0wn3r

    0wn3r

    Сообщения:
    184
    Симпатии:
    54
    /**
    * Called when a client is entering the game.
    *
    * Whether a client has a steamid is undefined until OnClientAuthorized
    * is called, which may occur either before or after OnClientPutInServer.
    * Similarly, use OnClientPostAdminCheck() if you need to verify whether
    * connecting players are admins.
    *
    * GetClientCount() will include clients as they are passed through this
    * function, as clients are already in game at this point.
    *
    * @param client Client index.
    * @noreturn
    */
    forward OnClientPutInServer(client);

    /**
    * Called once a client is authorized and fully in-game, and
    * after all post-connection authorizations have been performed.
    *
    * This callback is gauranteed to occur on all clients, and always
    * after each OnClientPutInServer() call.
    *
    * @param client Client index.
    * @noreturn
    */
    forward OnClientPostAdminCheck(client);

    /**
    * Called when a client receives a Steam ID. The state of a client's
    * authorization as an admin is not guaranteed here. Use
    * OnClientPostAdminCheck() if you need a client's admin status.
    *
    * This is called by bots, but the ID will be "BOT".
    *
    * @param client Client index.
    * @param auth Client auth string.
    * @noreturn
    */
    forward OnClientAuthorized(client, const String:auth[]);

    OnClientPostAdminCheck используеться для того что с полной точностью получить стим айди клиента и быть увереным в том админ ли клиент, поскольку OnClientPutInServer может и не дать этого.

    Зачем ты уперся в то что данная функция проверяет админ ли игрок или нет, я не понимаю.

    Иногда полезно зайти в папку include и почитать немного.
     
    maverick1660 нравится это.
  20. maverick1660

    maverick1660 Проект DeathLine.ru

    Сообщения:
    187
    Симпатии:
    97
    да я не уперся друг, хочю просто разобраться. я ни к чему не придираюсь это просто вопросы, на которые я не знаю ответы ;)