[Sourcepawn] mysql

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

  1. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    сейчас пишу плагин, есть коннект с базой mysql.

    как сделать чтоб шла проверка, есть steamid игрока в таблице или нет?)

    когда допишу плагин выложу в паблик, плагин ауры, делаю для удобства когда хочется поставить не несколько серверов.
     
  2. criminalist

    criminalist

    Сообщения:
    191
    Симпатии:
    20
    В чем суть вашего плагина ? у меня есть плагин который проверяет steam ID игрока если его нету в базе тупо не пускает его на сервер.
     
  3. maza511

    maza511

    Сообщения:
    927
    Симпатии:
    456
    Записываешь в базу стимID, потом смотришь есть там или нет. Разве не так?

    Лучше было бы чтоб при создании темы указывали примерно свои знания.
    А то что толку я тебе сейчас напишу ты все равно не поймешь.
     
  4. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    я не допираю как это изобразить в коде...

    когда в консоль пишется команда color, должно проверять, есть человек в базе или нет, если нет то выдаёт сообщение, написано всё кроме вот этого if
     
  5. maza511

    maza511

    Сообщения:
    927
    Симпатии:
    456
    PHP:
        Format(querysizeof(query), "SELECT * FROM 'Nametable' WHERE steamid ='%s'"steamId);        
        new 
    Handle:result SQL_Query(DBquery);
        if(!
    SQL_FetchRow(result)) {   // не нашел ни одной строки
            // ....
        
    }
     
    semjef нравится это.
  6. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    пререпутал(((

    как посмотреть что есть строка?
     
  7. maza511

    maza511

    Сообщения:
    927
    Симпатии:
    456
    Точно так же. Условие измени.
     
  8. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    на что?

    или просто поменять if и else, скажем так))
     
  9. maza511

    maza511

    Сообщения:
    927
    Симпатии:
    456
    semjef нравится это.
  10. criminalist

    criminalist

    Сообщения:
    191
    Симпатии:
    20
    PHP:
    CheckSteamID(userid, const String:auth[])
    {
        
    decl String:query[255];
        
    Format(querysizeof(query), "SELECT value FROM ws_user_gameacc WHERE value = '%s'"auth);
        
    SQL_TQuery(hDatabaseT_CheckSteamIDqueryuserid)
    }
    PHP:

    #include <sourcemod>

    ///*****************************************************************
    //*                      BASE INFORMATION                          * 
    //SELECT value FROM ws_user_gameacc WHERE value =
    //******************************************************************/


    new Handle:hDatabase INVALID_HANDLE;

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

    public 
    OnPluginStart()
    {
        
    StartSQL()
    }

    public 
    OnClientAuthorized(client)
    {
        
    decl String:auth[32];
        
    GetClientAuthString(clientauthsizeof(auth));

        
    CheckSteamID(clientauth)
    }

    public 
    GotDatabase(Handle:ownerHandle:hndl, const String:error[], any:data)
    {
        if (
    hndl == INVALID_HANDLE)
        {
            
    LogError("Database failure: %s"error);
        }
        else
        {
            
    hDatabase hndl;
        }
    }

    public 
    T_CheckSteamID(Handle:ownerHandle:hndl, const String:error[], any:client)
    {
        
    /* Make sure the client didn't disconnect while the thread was running */
        
    if (!IsClientConnected(client))
        {
            return;
        }

        
        if (
    hndl == INVALID_HANDLE)
        {
            
    LogError("Query failed! %s"error);
            
    KickClient(client"Авторизация провалена, пожалуйста обратитесь к Администратору, на сайте www.exeplay.ru");
        }
        else if (!
    SQL_GetRowCount(hndl))
        {
            
    KickClient(client"Для игры на сервере вы должны пройти регистрацию и ввести SteamID на сайте www.exeplay.ru");
        }
    }

    StartSQL()
    {
        
    SQL_TConnect(GotDatabase);
    }

    CheckSteamID(userid, const String:auth[])
    {
        
    decl String:query[255];
        
    Format(querysizeof(query), "SELECT value FROM ws_user_gameacc WHERE value = '%s'"auth);
        
    SQL_TQuery(hDatabaseT_CheckSteamIDqueryuserid)

    Полностью скрипт
     
    semjef нравится это.
  11. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    круто кстати, спасибо, пригодится)

    Добавлено через 34 минуты
    L 11/12/2011 - 22:28:10: [SM] Native "SQL_FetchRow" reported: Invalid query Handle 0 (error: 4)
    L 11/12/2011 - 22:28:10: [SM] Displaying call stack trace for plugin "aura_db.smx":
    L 11/12/2011 - 22:28:10: [SM] [0] Line 105, aura_db.sp::Command_Color()

    why!?

    public Action:Command_Color(client, args)
    {
    if (args != 4)
    {
    PrintToConsole(client, "Incorrect usage! Usage: glow_color r g b a, where r g b - color, a - alpha.");
    return Plugin_Handled;
    }
    else
    {
    decl String:query[255];
    new String:SteamId[64];
    GetClientAuthString(client, SteamId, sizeof(SteamId));
    Format(query, sizeof(query), "SELECT * FROM 'steamid' WHERE steamid ='%s'", SteamId);
    new Handle:result = SQL_Query(g_hDb, query);
    if(SQL_FetchRow(result)) // нашел то...
    {
    new String:Arg1[32], String:Arg2[32], String:Arg3[32], String:Arg4[32];
    GetCmdArg(1, g_fPlayercolorr, sizeof(Arg1));
    GetCmdArg(2, g_fPlayercolorg, sizeof(Arg2));
    GetCmdArg(3, g_fPlayercolorg, sizeof(Arg3));
    GetCmdArg(4, g_fPlayeralpha, sizeof(Arg4));
    decl String:szSteamId[32];
    GetClientAuthString(client, szSteamId, 32);


    decl String:szalpha[38];
    decl String:szcolorr[38];
    decl String:szcolorg[38];
    decl String:szcolorb[38];


    //заносим цвета в буфер
    Format(szalpha, 38, "%f",g_fPlayeralpha);
    Format(szcolorr, 38, "%f",g_fPlayercolorr);
    Format(szcolorg, 38, "%f",g_fPlayercolorg);
    Format(szcolorb, 38, "%f",g_fPlayercolorb);

    //обновляем в базе
    db_updatePlayerColor(client, szalpha, szcolorr, szcolorg, szcolorb);

    }
    else
    {
    PrintToChat(client, "%t","glow_cannot",LIGHTGREEN,YELLOW);
    return Plugin_Handled;
    }
    }
    return Plugin_Handled;

    }
     
    Последнее редактирование: 12 ноя 2011
  12. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    надеюсь последний вопрос:

    как вытащить значение из базы и присвоить его переменной?
     
  13. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    PHP:
    //запрос на сервер
    //hndl - Handle запроса
    if (SQL_FetchRow(hndl)) {
     new 
    intvalue SQL_FetchInt(hndl0);
     new 
    Float:floatvalue SQL_FetchFloat(hndl1);
     
    decl String:stringvalue[64];
     
    SQL_FetchString(hndl2stringvaluesizeof(stringvalue));
    }
    CloseHandle(hndl);
     
    semjef нравится это.
  14. semjef

    semjef semjef.ru

    Сообщения:
    1.031
    Симпатии:
    473
    извиняюсь но не понял((

    вот пример что есть сейчас:
    п.с. плагин ауры S1deX))
    ReadColor(String:SteamId[])
    {
    new color[4];
    new r, g, b, a;
    new String:file[255];
    BuildPath(Path_SM, file, 255, "configs/aura/steamid.txt");
    new Handle:kv = CreateKeyValues("SteamId");
    FileToKeyValues(kv, file);
    KvJumpToKey(kv, SteamId);
    r = KvGetNum(kv, "r");
    g = KvGetNum(kv, "g");
    b = KvGetNum(kv, "b");
    a = KvGetNum(kv, "a");
    CloseHandle(kv);
    color[0] = r;
    color[1] = g;
    color[2] = b;
    color[3] = a;
    return color;
    }

    нужно чтоб из таблицы player брались значения которые напротив steamid в строке: colorr, colorg, colorb, alpha и соответственно присваивались к r, g, b, a)

    напишите пожалуйста
     
  15. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Ах, это еще и мое творение. Ну это существо просто умоляет об оптимизации. Открывать файл при каждом запросе - ужас, о чем я в тот момент думал? Намного удобнее, к примеру, парсить файл при старте карты, сохраняя массивы со значениями уникальных игроков в Trie, а уже при коннекте считывать инфу из Trie. Ну это так, лирика, а ответ на конкретно поставленный вопрос примерно таков:
    PHP:
    ReadColor(String:SteamId[])
     {
     new 
    color[4];
     new 
    rgba;
     new 
    String:file[255];
     new 
    String:query[512];
     
    Format(querysizeof(query), "SELECT colorr, colorg, colorb, alpha FROM table_name WHERE steamid='%s'"SteamId);
     new 
    Handle:hquery SQL_Query(g_hSQLConnectionHandlequery);
     if (
    hquery == INVALID_HANDLE) return;
     if (
    SQL_FetchRow(hquery)) {
      
    SQL_FetchInt(hquery0);
      
    SQL_FetchInt(hquery1);
      
    SQL_FetchInt(hquery2);
      
    SQL_FetchInt(hquery3);
     }
     
    CloseHandle(hquery);
     
    color[0] = r;
     
    color[1] = g;
     
    color[2] = b;
     
    color[3] = a;
     return 
    color;
     }
     
    semjef нравится это.
  16. tooshkan4uk

    tooshkan4uk http://cssrus.ru

    Сообщения:
    423
    Симпатии:
    369
    Ну раз пошла такая пьянка, то объясните, как создавать mysql таблицу с помощью SourcePawn,а также как обновлять значение строки.
    Заранее спасибо!
     
  17. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    как и в обычных пхп - составляем запрос (CREATE TABLE IF NOT EXISTS trololo (список полей) PRIMARY KEY и т.д. ну или обновить значение - UPDATE table_name SET field_name = 1 WHERE field_name2 = 'yeah') и отправляем его как обычный скуль запрос. Только разница в том, что если уже использовать не потоковые (threaded) запросы, то в таких случаях лучше юзать SQL_FastQuery (http://docs.sourcemod.net/api/index.php?fastload=show&id=338&), который не возвращает хэндл запроса.
     
    tooshkan4uk нравится это.
  18. tooshkan4uk

    tooshkan4uk http://cssrus.ru

    Сообщения:
    423
    Симпатии:
    369
    Есть какой-нибудь простой пример?
     
  19. maza511

    maza511

    Сообщения:
    927
    Симпатии:
    456
    PHP:
    SQL_FastQuery(DB"CREATE TABLE IF NOT EXISTS 'Players' (name TEXT DEFAULT 'None', steamid TEXT DEFAULT 'STEAM_0:0:000000');");
     
    tooshkan4uk нравится это.
  20. S1deX

    S1deX Скриптер ;)

    Сообщения:
    129
    Симпатии:
    204
    Ну в вики довольно скупо описано взаимодействие с бд, так что примерно так:
    PHP:
    new Handle:g_hSQLConnection;
    OnPluginStart()
    {
     
    decl String:error[256];
     
    g_hSQLConnection SQL_Connect("default"trueerrorsizeof(error));
     if (
    g_hSQLConnection == INVALID_HANDLE)
      
    SetFailState(error);

     new 
    String:query[] = "CREATE TABLE IF NOT EXISTS test ( \
                        id INT(4) NOT NULL , \
                        key INT(4) NOT NULL , \
                     PRIMARY KEY (id) ) \
                     ENGINE = InnoDB;"
    ;
     if (!
    SQL_FastQuery(g_hSQLConnectionquery))
      
    SetFailState("fail :(");

     new 
    String:query2[] = "INSERT INTO test (key) VALUES (42)";
     if (!
    SQL_FastQuery(g_hSQLConnectionquery2))
      
    SetFailState("fail :(");

     new 
    String:query3[] = "UPDATE test SET key = 21 WHERE key = 42";
     if (!
    SQL_FastQuery(g_hSQLConnectionquery3))
      
    SetFailState("fail :(");
    }
     
    tooshkan4uk нравится это.