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 :
sql.sma 4,48 KB 108 Ilość pobrań
sql.amxx
Poradnik napisany przezemnie na podstawie pluginu ze _levels_system (przerobiony)
ze_level_system.sma 16,16 KB 103 Ilość pobrań
ze_level_system.amxx


Dodatki SourceMod













