Как да взема информация от mysql databse

Ако имате затруднения при изработката/преработката на даден плъгин - пишете тук, ще се опитаме да ви помогнем!
Аватар
gadinkata
Извън линия
Потребител
Потребител
Мнения: 234
Регистриран на: 21 Мар 2018, 12:33
Местоположение: Враца
Се отблагодари: 21 пъти
Получена благодарност: 5 пъти
Обратна връзка:

Как да взема информация от mysql databse

Мнение от gadinkata » 15 Авг 2020, 01:21

Здравейте,искам да опитам да направя плъгин свързван с добавянето на админи през web,в базата данни,мисля да има nick,ip,pass,steam,flags,каквото е нужно.за теста бих пробвъл първо с ник и флаговете и в плъгина да проверя дали ника съвпада с този на играча съвпада,да му даде права(флагове).
Въпрос 1?
1.В коя функция да направя проверката client_connect или client_putinserver?
Намерих един урок [TUT] MySql - Запазване / Зареждане / Полезни неща
Свързан е с ник и добавянето и взимане на хп,но него никъде в него не се вкарва ехпт-о само никът на играч.

Код за потвърждение: Избери целия код

public MySql_Init()
{
    //Казваме на API, че това е информацията към която е нужна за свързването
    // just not yet. basically it's like storing it in global variables
    //не още. Всъщност съхраняваме я във глобални променливи
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
    
    // Добре, вече сме готови да се свържем
    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
    if(SqlConnection == Empty_Handle)
        // Спираме плъгина с съобщение ГРЕШКА (Error)
    set_fail_state(g_Error)
    
    new Handle:Queries
    // we must now prepare some random queries
    // Сега трябва да се подготвим за някой произволни запитвания
    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (steamid varchar(32),exp INT(11))")
    
    if(!SQL_Execute(Queries))
    {
        // Ако има някакви проблеми плъгина ще се зададе като Bad Load (Лошо зареден - Плъгина няма да тръгне)
        SQL_QueryError(Queries,g_Error,charsmax(g_Error))
        set_fail_state(g_Error)
        
    }
    
    // Освобождаваме запитванията
    SQL_FreeHandle(Queries)
    
    // Освобождаваме всичко с SQL_FreeHandle
    SQL_FreeHandle(SqlConnection)   
}
Този код проверява дали съществува определена таблица или да създаде?
new Handle:Queries // we must now prepare some random queries // Сега трябва да се подготвим за някой произволни запитвания Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (steamid varchar(32),exp INT(11))")

Защо взимаме само никът?

Код за потвърждение: Избери целия код

public Load_MySql(id)
{
    new szName[32], szTemp[512]
    get_user_name(id, szName, charsmax(szName))
    
    new Data[1]
    Data[0] = id
    
    //Сега ще вземем от таблица "tutorial" информация, когато Nick-a
    format(szTemp,charsmax(szTemp),"SELECT * FROM `tutorial` WHERE (`tutorial`.`name` = '%s')", szName)
    SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
Трябва лида ползвам този код,защото като гледам в него се вкарва информация в базата данни,а на мен ми трябва сами извличане/взимане

Код за потвърждение: Избери целия код

public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
    if(FailState == TQUERY_CONNECT_FAILED)
    {
        log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
    }
    else if(FailState == TQUERY_QUERY_FAILED)
    {
        log_amx("Load Query failed. [%d] %s", Errcode, Error)
    }
    
    new id
    id = Data[0]
    
    if(SQL_NumResults(Query) < 1) 
    {
        
        new szName[32]
        get_user_name(id, szName, charsmax(szName)) // Взимаме името на играча
        
        //  Ако още изчакваме не може да направим нищо
        if (equal(szName,"ID_PENDING"))
            return PLUGIN_HANDLED
        
        new szTemp[512]
        
        // Сега ще сложим нашите данни в нашата таблица
        format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `name` , `exp`)VALUES ('%s','0');",szName)
        SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
    } 
    else 
    {
        // Ако няма намерени резултати
        iExp[id]         = SQL_ReadResult(Query, 1)
    }
    
    return PLUGIN_HANDLED
}
Ето го и целия код

Код за потвърждение: Избери целия код

#include <amxmodx>
#include <sqlx>

#define PLUGIN "Tutorial"
#define VERSION "1.0"
#define AUTHOR "Just In Case"

// Ur Mysql Information - Тук попълвате данните на SQL сървърът ви
new Host[]     = "hostname"
new User[]    = "username"
new Pass[]     = "password"
new Db[]     = "database"


new Handle:g_SqlTuple
new g_Error[512]

new iExp[33]

// Pcvar-ове
new cKill
new cHeadshot
new cDeath

public plugin_init() {
    register_plugin(PLUGIN, VERSION, AUTHOR)
    
    register_event("DeathMsg", "Event_DeathMsg", "a") // Register death event
    
    // Регистрираме PCVAR-овете
    cKill = register_cvar("exp_kill", "2")
    cHeadshot = register_cvar("exp_headshot", "4")
    cDeath = register_cvar("exp_death", "1")
}
public MySql_Init()
{
    //Казваме на API, че това е информацията към която е нужна за свързването
    // just not yet. basically it's like storing it in global variables
    //не още. Всъщност съхраняваме я във глобални променливи
    g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
    
    // Добре, вече сме готови да се свържем
    new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
    if(SqlConnection == Empty_Handle)
        // Спираме плъгина с съобщение ГРЕШКА (Error)
    set_fail_state(g_Error)
    
    new Handle:Queries
    // we must now prepare some random queries
    // Сега трябва да се подготвим за някой произволни запитвания
    Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS tutorial (name varchar(32),exp INT(11))")
    
    if(!SQL_Execute(Queries))
    {
        // Ако има някакви проблеми плъгина ще се зададе като Bad Load (Лошо зареден - Плъгина няма да тръгне)
        SQL_QueryError(Queries,g_Error,charsmax(g_Error))
        set_fail_state(g_Error)
        
    }
    
    // Освобождаваме запитванията
    SQL_FreeHandle(Queries)
    
    // Освобождаваме всичко с SQL_FreeHandle
    SQL_FreeHandle(SqlConnection)   
}
public plugin_end()
{
    SQL_FreeHandle(g_SqlTuple)
}
public Save_MySql(id)
{
    new szName[32], szTemp[512]
    get_user_name(id, szName, charsmax(szName))
    
    // Тук ще ъпдейтваме XP-то на играча но само ако името съвпадне с някое от имената в таблицата
    format(szTemp,charsmax(szTemp),"UPDATE `tutorial` SET `exp` = '%i' WHERE `tutorial`.`name` = '%s';",iExp[id], szName)
    SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
}
public Load_MySql(id)
{
    new szName[32], szTemp[512]
    get_user_name(id, szName, charsmax(szName))
    
    new Data[1]
    Data[0] = id
    
    //Сега ще вземем от таблица "tutorial" информация, когато Nick-a
    format(szTemp,charsmax(szTemp),"SELECT * FROM `tutorial` WHERE (`tutorial`.`name` = '%s')", szName)
    SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
}
public Event_DeathMsg()
{
    new iKiller = read_data(1) // Взимаме информация за убиеца и жертвата
    new iVictim = read_data(2)
    
    if(is_user_alive(iKiller)) // Проверяваме дали убиеца е жив в случай, че се е самоубил
    {
        if(read_data(3)) // Проверяваме дали е HEADSHOT
        {
            iExp[iKiller] += get_pcvar_num(cHeadshot) // Добавяме PCvar стойността за HEADSHOT към iExp (XP-то)
        }
        else
        {
            iExp[iKiller] += get_pcvar_num(cKill)
        }
    }
    iExp[iVictim] -= get_pcvar_num(cDeath) // Махаме стойността при смърт (от PCVAR-a за взимане на XP при смърт) 
}
public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
{
    if(FailState == TQUERY_CONNECT_FAILED)
    {
        log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
    }
    else if(FailState == TQUERY_QUERY_FAILED)
    {
        log_amx("Load Query failed. [%d] %s", Errcode, Error)
    }
    
    new id
    id = Data[0]
    
    if(SQL_NumResults(Query) < 1) 
    {
        
        new szName[32]
        get_user_name(id, szName, charsmax(szName)) // Взимаме името на играча
        
        //  Ако още изчакваме не може да направим нищо
        if (equal(szName,"ID_PENDING"))
            return PLUGIN_HANDLED
        
        new szTemp[512]
        
        // Сега ще сложим нашите данни в нашата таблица
        format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `name` , `exp`)VALUES ('%s','0');",szName)
        SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
    } 
    else 
    {
        // Ако няма намерени резултати
        iExp[id]         = SQL_ReadResult(Query, 1)
    }
    
    return PLUGIN_HANDLED
}
Аз ще си създам базата данни и таблица и през сайт ще си добавя ника ,паролата и флаговете,само искам да разбера как да ги взема от там и да направя проверката

Аватар
JustInCase
Извън линия
Потребител
Потребител
Мнения: 579
Регистриран на: 14 Окт 2016, 23:31
Се отблагодари: 4 пъти
Получена благодарност: 7 пъти

Как да взема информация от mysql databse

Мнение от JustInCase » 14 Сеп 2020, 22:32

Преди да пишеш плъгин с SQL заявки е добре първо да научиш какво е SQL и как се работи с него.
MANSION - HNS : 93.123.18.46:27016
ONLINE

Аватар
gadinkata
Извън линия
Потребител
Потребител
Мнения: 234
Регистриран на: 21 Мар 2018, 12:33
Местоположение: Враца
Се отблагодари: 21 пъти
Получена благодарност: 5 пъти
Обратна връзка:

Как да взема информация от mysql databse

Мнение от gadinkata » 14 Сеп 2020, 22:39

JustInCase написа:
14 Сеп 2020, 22:32
Преди да пишеш плъгин с SQL заявки е добре първо да научиш какво е SQL и как се работи с него.
имам познания отностно SQL,но просто в Pawn ми е малко сложно да го разбера,трябва ми само, pawn SQl да чете от базата данни всичко друго ще се справя и сам

Аватар
JustInCase
Извън линия
Потребител
Потребител
Мнения: 579
Регистриран на: 14 Окт 2016, 23:31
Се отблагодари: 4 пъти
Получена благодарност: 7 пъти

Как да взема информация от mysql databse

Мнение от JustInCase » 14 Сеп 2020, 22:50

gadinkata написа:
14 Сеп 2020, 22:39

имам познания отностно SQL,но просто в Pawn ми е малко сложно да го разбера,трябва ми само, pawn SQl да чете от базата данни всичко друго ще се справя и сам
Не знам как смяташ да правиш хората админи но тази функция тук която е и в урока проверява дали има даден запис ако няма - създава нов запис с текущото име, а ако има то запазва XP -то на играча от базата данни в глобалната променлива iExp, не знам какво не ясно има.

Код за потвърждение: Избери целия код

	public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
	{
	    if(FailState == TQUERY_CONNECT_FAILED)
	    {
		log_amx("Load - Could not connect to SQL database.  [%d] %s", Errcode, Error)
	    }
	    else if(FailState == TQUERY_QUERY_FAILED)
	    {
		log_amx("Load Query failed. [%d] %s", Errcode, Error)
	    }
	    
	    new id
	    id = Data[0]
	    
	    if(SQL_NumResults(Query) < 1) //Ако няма записи
	    {
		
		new szName[32]
		get_user_name(id, szName, charsmax(szName)) 
		
		//  Ако още изчакваме не може да направим нищо
		if (equal(szName,"ID_PENDING"))
		    return PLUGIN_HANDLED
		
		new szTemp[512]
		
		format(szTemp,charsmax(szTemp),"INSERT INTO `tutorial` ( `name` , `exp`)VALUES ('%s','0');",szName)
		SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp)
	    } 
	    else //Ако има запис
	    {
		iExp[id]         = SQL_ReadResult(Query, 1)
	    }
	    
	    return PLUGIN_HANDLED
	}
ЕДИТ:

Сега като четох кода в урока има разминаване в проверките и описанието, когато съм го превеждал :D

Но почти всеки би се досетил като прочете кода че са разменени if(SQL_NumResults(Query) < 1) това е ако няма записи е в else влиза ако има записи.

Редактирал съм урока и съм оправил проблема.
MANSION - HNS : 93.123.18.46:27016
ONLINE

Публикувай отговор
  • Подобни теми
    Отговори
    Преглеждания
     Последно мнение

Обратно към “Помощ в скриптирането”

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 5 госта