|
Стаж: 12 лет
Сообщений: 1
Благодарностей: 1
Полезность: 0
|
Вообщем интересует работа с БД. Наработки есть №1 Код:
#include <amxmodx> #include <amxmisc> #include <sqlx> #include <hamsandwich> #include <colorchat> #define PLUGIN "[SQLx.inc] SQL_ReadResult" #define VERSION "1.0" #define AUTHOR "Admin" new Handle:SQL_Tuple new Handle:SQL_Connection new name[32], kills[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) register_cvar("SQLx_host","") register_cvar("SQLx_db","") register_cvar("SQLx_user","") register_cvar("SQLx_password","") register_clcmd("say /check","check") RegisterHam(Ham_Killed,"player","ham_player_kill") } public plugin_cfg(){ new host[33],dbase[33],user[33],pass[33] get_cvar_string("SQLx_host",host,30) get_cvar_string("SQLx_db",dbase,30) get_cvar_string("SQLx_user",user,30) get_cvar_string("SQLx_password",pass,30) SQL_Tuple = SQL_MakeDbTuple(host,user,pass,dbase) // Создание картежа данных для соединения с БД new err, error[256] SQL_Connection = SQL_Connect(SQL_Tuple, err, error, charsmax(error)) // Соединение с БД if(SQL_Connection != Empty_Handle) { log_amx("[SQLx connect ok]") //Если соединение установлено }else{ log_amx("[SQLX sql error] %s ",error) //Если нет и выводим причину(ошибку) pause("a") } } public check(id){
ColorChat(id,TEAM_COLOR, "^3killed %d", kills[id]) }
public ham_player_kill(victim, attacker){ if(is_user_connected(attacker)) kills[attacker]++; set_task(0.1, "read") } public read(id){
new Handle:query = SQL_PrepareQuery(SQL_Connection,"UPDATE `table` SET `kills`='%d' WHERE `name` = '%s' ", kills[id], name ) SQL_Execute (query) } public client_authorized(id){ get_user_name(id, name, 31) new Handle:query = SQL_PrepareQuery(SQL_Connection,"INSERT INTO `table` (`name`, `kills`) VALUES ('%s','0') ", name) SQL_Execute (query) } public plugin_end(){ SQL_FreeHandle(SQL_Connection) } /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1049\\ f0\\ fs16 \n\\ par } */
В этом случаи записи в БД делается, но не пишутся фраги(kills), то есть запись типа: Ник 0. И 0 остается всегда №2, тут очень все запутано и не работает, пытался сделать не прямым запросом к базе, а поточным Код:
#include <amxmodx> #include <amxmisc> #include <sqlx> #include <hamsandwich> #include <colorchat> #define PLUGIN "[SQLx.inc] SQL_ReadResult" #define VERSION "1.0" #define AUTHOR "Admin" new Handle:SQL_Tuple new Handle:SQL_Connection
new g_Error[512];
enum _:PlData { gId,gKills,gName }; new name[32], kills[33] new Host,User,Password,DbName new UserData[33][PlData]; public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) Host = register_cvar("SQLx_host","") DbName = register_cvar("SQLx_db","") User = register_cvar("SQLx_user","") Password = register_cvar("SQLx_password","") register_clcmd("say /check","check") RegisterHam(Ham_Killed,"player","ham_player_kill") set_task(0.1, "sql_init"); }
public sql_init() { new szHost[64],szUser[64],szPassword[64],szDbName[64],ErrorCode; get_pcvar_string(Host,szHost,63); get_pcvar_string(User,szUser,63); get_pcvar_string(Password,szPassword,63); get_pcvar_string(DbName,szDbName,63); SQL_Tuple = SQL_MakeDbTuple(szHost,szUser,szPassword,szDbName); new Handle:SQL_Connection = SQL_Connect(SQL_Tuple,ErrorCode,g_Error,511) if(SQL_Connection == Empty_Handle) set_fail_state(g_Error);
new Handle:Queries = SQL_PrepareQuery(SQL_Connection,"CREATE TABLE IF NOT EXISTS `table`(`id` INT(10) NOT NULL AUTO_INCREMENT,`name` VARCHAR(32) NOT NULL,`kills` INT(10000) NOT NULL,PRIMARY KEY (id));") if(!SQL_Execute(Queries)) { SQL_QueryError(Queries,g_Error,charsmax(g_Error)) set_fail_state(g_Error); } SQL_QueryAndIgnore(SQL_Connection, "DELETE FROM table WHERE kills=0"); // 24.10.12 SQL_FreeHandle(Queries) SQL_FreeHandle(SQL_Connection); } // public plugin_end() { if(SQL_Tuple != Empty_Handle) SQL_FreeHandle(SQL_Tuple); } // public client_putinserver(id) { UserData[id] = UserData[0]; load_data(id); }
public load_data(id) { new Name[33]; get_user_name(id,Name,32); new reaad[256] SQL_QuoteString(SQL_Connection, Name, 32, Name); if(SQL_Connection == Empty_Handle) { log_amx(g_Error); return ; } format(reaad,255,"SELECT id, kills FROM table WHERE name = '%s';", Name) //вытаскиваем фраги из таблицы, где имя равно переменной SQL_ThreadQuery(SQL_Tuple,"result_load_data",reaad);//читаем результаты }
public result_load_data(id, FailState, Handle:Query, error[], err, data[], size, Float:querytime) { //Если произошла ошибка if(FailState != TQUERY_SUCCESS) { log_amx("sql error: %d (%s)", err, error)//пишется в лог об ошибке return } //Ошибки не было и если результат не нулевой if( SQL_NumResults(Query) > 0 ) { UserData[id][gId]= SQL_ReadResult(Query,0); //Как я понимаю, тут записываются данные из 1 поля в БД -> id UserData[id][gKills]= SQL_ReadResult(Query,1); //а тут уже со 2 поля в БД -> kills } else { register_player(id); //если в базе не найден, тогда идет регистрация } } public check(id){
ColorChat(id,TEAM_COLOR, "^3 User ID %d killed %d",UserData[id][gId], UserData[id][gKills]) }
public register_player(id){
get_user_name(id, name, 31) new Handle:query = SQL_PrepareQuery(SQL_Connection,"INSERT INTO `table` (`name`, `kills`) VALUES ('%s','0') ", name) SQL_Execute (query)
}
public ham_player_kill(victim, attacker){ if(is_user_connected(attacker)) kills[attacker]++; set_task(0.1, "read") } public read(id){
new query[256] format(query,charsmax(query),"UPDATE `table` SET `kills`='%d' WHERE `name` = '%s' ",UserData[id][gKills],UserData[id][gName] ) //Выполнение запроса SQL_ThreadQuery(SQL_Tuple,"QueryHandler",query) //new Handle:query = SQL_PrepareQuery(SQL_Connection,"UPDATE `table` SET `kills`='%d' WHERE `name` = '%s' ", kills[id], name ) //SQL_Execute (query) }
public QueryHandler(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { if(FailState != TQUERY_SUCCESS) { log_amx("sql error: DB connected") return } //Ошибки не было и если результат не нулевой if( SQL_NumResults(Query) > 0 ) server_print("Sql result [%d] data[%d]",SQL_ReadResult(Query,0), SQL_ReadResult(Query,1))
}
public save_usr(id) { new query[256] format(query,charsmax(query),"UPDATE `table` SET `kills`='%d' WHERE `name` = '%s' ",UserData[id][gKills],UserData[id][gName] ) //Выполнение запроса SQL_ThreadQuery(SQL_Tuple,"QueryHandler",query) }
В этом случаи ничего не создает, даже таблицу. Если кто может поделится кодом для такой задачи: Записать в БД ник\стим_ид и фраги. Потом вывести в команду /check . Ключом будет ник\стим_ид Ваш ник: лал фрагов: 12
|