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