Skocz do zawartości

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Tworzenie Zapisu SQL od podstaw

poradnik slq mysql amxx

  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
2 odpowiedzi w tym temacie

#1 MrBully

    Wszechwidzący

  • Użytkownik

Reputacja: 11
Początkujący

  • Postów:233
  • Imię:Mateusz
  • Lokalizacja:Nieznana
Offline

Napisano 29.01.2023 11:13

Poradnik jak napisać zapis sql od podstaw

na samej górze 

#include <sqlx>
#include <amxmodx>

niżej zmienne 

// zmienna do cvarów 
new g_pCvarDB[4] 

new kille[33], 
    deady[33]

enum
{
	Host = 0,
	User,
	Pass,
	DB
}
new Handle:g_hTuple
//plik do logów w przypadku błędów 
new const g_szLogFile[] = "Zapislogi.log" 
// zmienna z poleceniem sql która stworzy nam tabele 
new const g_szTable[] = 
" \
	CREATE TABLE IF NOT EXISTS `zapis` \
	( \
		`SteamID` varchar(34) NOT NULL, \
		`Kille` int(20) NOT NULL DEFAULT '0', \
		`Deady` int(20) NOT NULL DEFAULT '0', \
		PRIMARY KEY (`SteamID`) \
	); \
"

dalej

public plugin_init()
{
	register_plugin("Zapis Sql", "1.0", "KTIVGames")
        register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")
//cvary
	g_pCvarDB[Host] = register_cvar("plugin_host", "127.0.0.1")
	g_pCvarDB[User] = register_cvar("plugin_user", "root")
	g_pCvarDB[Pass] = register_cvar("plugin_pass", "password")
	g_pCvarDB[DB] = register_cvar("plugin_dbname", "levels_db")
// task od ładowanie sql

	set_task(0.1, "Delay_MySQL_Init")
	
} 
// kille i deady które przechwycimy i zapiszemy
public DeathMsg()
{
	new kid = read_data(1)	//zabojca
	
	new vid = read_data(2)	// ofiara

	kille[kid] +=1
	deady[vid] +=1
       //zapisanie danych gracza
       SaveData(vid)
       SaveData(kid)
}

public plugin_end()
{

	if (g_hTuple != Empty_Handle)
	{
		SQL_FreeHandle(g_hTuple)
	}
	
}

public Delay_MySQL_Init()
{
	MySQL_Init()
}
public MySQL_Init()
{

	//dane sql do cvara
	new szHost[64], szUser[32], szPass[32], szDB[128]
	
	get_pcvar_string(g_pCvarDB[Host], szHost, charsmax(szHost))
	get_pcvar_string(g_pCvarDB[User], szUser, charsmax(szUser))
	get_pcvar_string(g_pCvarDB[Pass], szPass, charsmax(szPass))
	get_pcvar_string(g_pCvarDB[DB], szDB, charsmax(szDB))
	
	g_hTuple = SQL_MakeDbTuple(szHost, szUser, szPass, szDB)
	

	new iErrorCode, szError[512], Handle:hSQLConnection
	
	hSQLConnection = SQL_Connect(g_hTuple, iErrorCode, szError, charsmax(szError))
	//sprawdzanei połączenia z sql
	if (hSQLConnection != Empty_Handle)
	{
		log_amx("[MySQL]Successfully connected to host: %s (ALL IS OK).", szHost)
		SQL_FreeHandle(hSQLConnection)
	}
	else
	{
		
		set_fail_state("Failed to connect to MySQL database: %s.", szError)
	}
	
	SQL_ThreadQuery(g_hTuple, "QueryCreateTable", g_szTable)
}
public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime) 
{
	SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}

wczytywanie danych oraz tworzenie nowych w przypadku nowego gracza

public client_putinserver(id)
{
	if(is_user_hltv(id) || is_user_bot(id))
		return
	
	
	set_task(1.0, "DelayLoad", id)

	
}

public DelayLoad(id)
{
	// Load his data
	LoadData(id)
}
public LoadData(id)
{
	new szAuthID[35]
	
	get_user_authid(id, szAuthID, charsmax(szAuthID))
	
	new szQuery[128], szData[5]
        // zapytanie wybranie tabeli z której dane zostaną wyciągnięte na podstawie SteamID
	formatex(szQuery, charsmax(szQuery), "SELECT * FROM `zapis` WHERE ( `SteamID` = '%s' );", szAuthID)
	
	num_to_str(id, szData, charsmax(szData))
	SQL_ThreadQuery(g_hTuple, "QuerySelectData", szQuery, szData, charsmax(szData))

}

public QuerySelectData(iFailState, Handle:hQuery, szError[], iError, szData[]) 
{
	if (SQL_IsFail(iFailState, iError, szError, g_szLogFile))
		return
	
	new id = str_to_num(szData)
	// gracz nie istnieje w tabeli więc zostanie utworzone dane z jego killami i dedami
	if(!SQL_NumResults(hQuery))
	{
	
		new szAuthID[35]
		get_user_authid(id, szAuthID, charsmax(szAuthID))
		
		
		new szQuery[128]  
                //zapytanie które tworzy nowy wpis z danymi
		formatex(szQuery, charsmax(szQuery), "INSERT INTO `zapis` (`SteamID`, `Kille`, `Deady`) VALUES ('%s', '%i', '%i');", szAuthID, kille[id],deady[id])
		SQL_ThreadQuery(g_hTuple, "QueryInsertData", szQuery)
		return
	}
        // wyciaganie killi i deadów gracza z tabeli
	new Kille_Column = SQL_FieldNameToNum(hQuery, "Kille")
	new Deady_Column = SQL_FieldNameToNum(hQuery, "Deady")
	

	kille[id] = SQL_ReadResult(hQuery, Kille_Column)
	deady[id] = SQL_ReadResult(hQuery, Deady_Column)
}

zapis do bazy 

public SaveData(id)
{
	new szAuthID[35], szName[32]
	get_user_authid(id, szAuthID, charsmax(szAuthID))
	get_user_name(id, szName, charsmax(szName))

	new szQuery[128]
        // zapytanie o zaktulizowanie danych gracza
	formatex(szQuery, charsmax(szQuery), "UPDATE `zapis` SET `Kille` = '%d', `Deady` = '%d' WHERE ( `SteamID` = '%s' );", kille[id], deady[id], szAuthID)
	SQL_ThreadQuery(g_hTuple, "QueryUpdateData", szQuery)

}

public QueryUpdateData(iFailState, Handle:hQuery, szError[], iError, szData[], iSize, Float:flQueueTime) 
{
	SQL_IsFail(iFailState, iError, szError, g_szLogFile)
}

i na końcu stock od wyświetlania errorów 
 

stock SQL_IsFail(iFailState, iError, szError[], const szLogFile[])
{
	if (iFailState == TQUERY_CONNECT_FAILED)
	{
		log_to_file(szLogFile, "[MySQL] Could not connect to SQL database: %s", szError)
		return true
	}
	else if (iFailState == TQUERY_QUERY_FAILED)
	{
		log_to_file(szLogFile, "[MySQL] Query failed: %s", szError)
		return true
	}
	else if (iError)
	{
		log_to_file(szLogFile, "[MySQL] Error on query: %s", szError)
		return true
	}
	
	return false
}

Przykład : Załączony plik  sql.sma   4,48 KB  44 Ilość pobrań
  sql.amxx


Poradnik napisany przezemnie  na podstawie pluginu  ze _levels_system (przerobiony) Załączony plik  ze_level_system.sma   16,16 KB  38 Ilość pobrań
  ze_level_system.amxx


  • +
  • -
  • 0

#2 Boski Z Polski

    Profesjonalista

  • Użytkownik

Reputacja: 60
Pomocny

  • Postów:178
  • Steam:steam
  • Imię:Olgierd
  • Lokalizacja:Leszno
Offline

Napisano 30.01.2023 12:52

a więc tak.

register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")

Zbędne

DeathMsg()

Brak rejestracji eventu

 

 

W DeathMsg

SaveData(vid)
SaveData(kid)

Pytanie, jaki jest sens wysyłania dwóch zapytań co śmierć gracza? Nie lepiej raz, przy wyjściu z serwera?

 


  • +
  • -
  • 1

#3 MrBully

    Wszechwidzący

  • Autor tematu
  • Użytkownik

Reputacja: 11
Początkujący

  • Postów:233
  • Imię:Mateusz
  • Lokalizacja:Nieznana
Offline

Napisano 30.01.2023 16:08

a więc tak.

register_event("HLTV", "Nowa_Runda", "a", "1=0", "2=0")

Zbędne

DeathMsg()

Brak rejestracji eventu

 

 

W DeathMsg

SaveData(vid)
SaveData(kid)

Pytanie, jaki jest sens wysyłania dwóch zapytań co śmierć gracza? Nie lepiej raz, przy wyjściu z serwera?

 o tym że można deathmsg() użyć nie wiedziałem 
co do zapisów przy śmieci tak w przypadku craszu serwera dane mogą się nie zapisać 


  • +
  • -
  • 0





Również z jednym lub większą ilością słów kluczowych: poradnik, slq, mysql, amxx

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych