Napisałem taki kod, oczywiście patrzyłem jak inne pluginy są napisane w SQL, wyszło mi takie coś:
Spoiler
#include <amxmodx> #include <amxmisc> #include <hamsandwich> #include <sqlx> #include <cstrike> #include <fun> #include <colorchat> new Handle:info, bool:connected; new nazwa_gracza[33]; enum CVARS { host, user, pass, db }; new g_pCvars[CVARS]; new liczba[33]; public plugin_init() { register_plugin("TEST", "0.2", "Bl@ck"); g_pCvars[host] = register_cvar("host_sql", "xxx"); g_pCvars[user] = register_cvar("user_sql", "xxx", FCVAR_PROTECTED); g_pCvars[pass] = register_cvar("password_sql", "xxx", FCVAR_PROTECTED); g_pCvars[db] = register_cvar("database_sql", "xxx"); register_clcmd("say /test", "test"); register_clcmd("say /ile", "sprawdz"); } public plugin_end() SQL_FreeHandle(info); public test(id) liczba[id]++ public sprawdz(id) ColorChat(id, GREEN, "POSIADASZ %d PUNKTOW", liczba[id]); public plugin_cfg() { new szHost[64], szUser[64], szPass[64], szDB[64]; get_pcvar_string(g_pCvars[host], szHost, charsmax(szHost)); get_pcvar_string(g_pCvars[user], szUser, charsmax(szUser)); get_pcvar_string(g_pCvars[pass], szPass, charsmax(szPass)); get_pcvar_string(g_pCvars[db], szDB, charsmax(szDB)); info = SQL_MakeDbTuple(szHost, szUser, szPass, szDB); new len_full, temp_full[2024]; len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "CREATE TABLE IF NOT EXISTS `TESTOWE` (`name` VARCHAR(48), `liczba` INT(10))"); SQL_ThreadQuery(info, "ConnectSql_Handler", temp_full); } public ConnectSql_Handler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { connected = false; return PLUGIN_CONTINUE; } connected = true; return PLUGIN_CONTINUE; } public client_putinserver(id) { get_user_name(id, nazwa_gracza, 32) resetData(id); readData(id); } public client_disconnect(id) { saveData(id); resetData(id); } public resetData(id) { liczba[id] = 0 } public saveData(id) { if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL")) return PLUGIN_CONTINUE; new len_full, temp_full[2048]; mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); len_full += formatex(temp_full[len_full], charsmax(temp_full)-len_full, "UPDATE `TESTOWE` SET `liczba` = '%d' WHERE `name` = '%s'", liczba[id], nazwa_gracza); SQL_ThreadQuery(info, "saveDataHandler", temp_full); return PLUGIN_CONTINUE; } public saveDataHandler(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readData(id) { if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL")) return PLUGIN_CONTINUE; new data[1], temp[2048], name[33]; data[0] = id; mysql_escape_string(name, charsmax(name)); formatex(temp, charsmax(temp), "SELECT * FROM `TESTOWE` WHERE `name` = '%s'", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } public readDataHandler(failstate, Handle:query, error[], errnum, data[], size) { new id = data[0]; if(failstate != TQUERY_SUCCESS) { return PLUGIN_CONTINUE; } if(SQL_MoreResults(query)) { liczba[id] = SQL_ReadResult(query, SQL_FieldNameToNum(query,"liczba")) } else { new data[1]; data[0] = id; if(!connected || !is_user_connected(id) || is_user_bot(id) || is_user_hltv(id) || !module_exists("MySQL")) return PLUGIN_CONTINUE; new temp[2048]; mysql_escape_string(nazwa_gracza, charsmax(nazwa_gracza)); format(temp, charsmax(temp), "INSERT INTO `TESTOWE` (name, liczba) VALUES ('%s', '0')", nazwa_gracza); SQL_ThreadQuery(info, "readDataHandler2", temp, data, sizeof(data)); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } public readDataHandler2(failstate, Handle:query, error[], errnum, data[], size) { if(failstate != TQUERY_SUCCESS) { log_amx("Wczytywanie dla %s blad %s", nazwa_gracza, error); return PLUGIN_CONTINUE; } return PLUGIN_CONTINUE; } stock mysql_escape_string(output[], len) { static const szReplaceIn[][] = { "\\", "\0", "\n", "\r", "\x1a", "'", "^"" }; static const szReplaceOut[][] = { "\\\\", "\\0", "\\n", "\\r", "\Z", "\'", "\^"" }; for(new i; i < sizeof szReplaceIn; i++) replace_all(output, len, szReplaceIn[i], szReplaceOut[i]); }
Kod ku mojemu zdziwieniu działa, ale czy dałoby się go jakoś go lepiej napisać? Czega mam unikać w robieniu zapisu sql?
Czy da się to:
liczba[id] = SQL_ReadResult(query, SQL_FieldNameToNum(query,"liczba"))
Odczytać to jakoś inaczej? W innych pluginach inaczej czasami to się robi w inny sposób. Dobry jest to sposób?
Ostanie pytanie, czy da się jakoś bardziej usprawnić ten zapis?
Jeszcze jedno, jak zapisać stringa w sql i go odczytać?
Użytkownik Black004 edytował ten post 31.07.2019 18:50