Duży Problem z Mysql
speedkill
15.08.2011
Siemka robię sobie plugin z zapisem na mysql normalnie zapisuje do bazy ale gdy zapisze raz to już nie wykonuje się takjakby "UPDATE" dane zapisuje nick ile zabójstw ile śmierci ale potem przy zabójstwie i ponownym wejściu na serwer nie działa
Byłbym wdzięczny gdyby ktoś mógł mi powiedzieć gdzie jest błąd lub naprawić
Cały kod :
Byłbym wdzięczny gdyby ktoś mógł mi powiedzieć gdzie jest błąd lub naprawić
Cały kod :
#include <amxmodx> #include <csx> #include <sqlx> #define PLUGIN "test" #define VERSION "1.0" #define AUTHOR "speedkill" new Host[] = "" new User[] = "" new Pass[] = "" new Db[] = "" new Handle:g_SqlTuple new g_Error[512] new stats[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) set_task(1.0, "MySql_Init") } public MySql_Init() { g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error)) if(SqlConnection == Empty_Handle) set_fail_state(g_Error) new Handle:Queries Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))") if(!SQL_Execute(Queries)) { SQL_QueryError(Queries,g_Error,charsmax(g_Error)) set_fail_state(g_Error) } SQL_FreeHandle(Queries) SQL_FreeHandle(SqlConnection) } public plugin_end() { SQL_FreeHandle(g_SqlTuple) } public Load_MySql(id) { new name[32], szTemp[512] get_user_name(id, name, 31) new Data[1] Data[0] = id format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name) SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1) } public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { if(FailState == TQUERY_CONNECT_FAILED) { log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error) } else if(FailState == TQUERY_QUERY_FAILED) { log_amx("Load Query failed. [%d] %s", Errcode, Error) } new id id = Data[0] if(SQL_NumResults(Query) < 1) { new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) new szTemp[512] format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1]) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } else { stats[id] = SQL_ReadResult(Query, 1) } return PLUGIN_HANDLED } public Save_MySql(id) { new szTemp[512] new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name=%s",stats,stats[1],name) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { SQL_FreeHandle(Query) return PLUGIN_HANDLED } public client_putinserver(id) { Load_MySql(id) } public client_disconnect(id) { Save_MySql(id) }Pozdrawiam speedkill ;]
DarkGL
15.08.2011
stats[id] = SQL_ReadResult(Query, 1)na
stats[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Quer,"stats"))
speedkill
15.08.2011
Niestety , nie działa zapisze jednorazowo do bazy ile gość ma zabójstw i śmierci a potem już nie zapisuje jak się rozłącze z serwerem cały kod dodałem jeszcze zmienną deaths[33]
#include <amxmodx> #include <csx> #include <sqlx> #define PLUGIN "test" #define VERSION "1.0" #define AUTHOR "speedkill" new Host[] = "" new User[] = "" new Pass[] = "" new Db[] = "" new Handle:g_SqlTuple new g_Error[512] new stats[33] new deaths[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) set_task(1.0, "MySql_Init") } public MySql_Init() { g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error)) if(SqlConnection == Empty_Handle) set_fail_state(g_Error) new Handle:Queries Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))") if(!SQL_Execute(Queries)) { SQL_QueryError(Queries,g_Error,charsmax(g_Error)) set_fail_state(g_Error) } SQL_FreeHandle(Queries) SQL_FreeHandle(SqlConnection) } public plugin_end() { SQL_FreeHandle(g_SqlTuple) } public Load_MySql(id) { new name[32], szTemp[512] get_user_name(id, name, 31) new Data[1] Data[0] = id format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name) SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1) } public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { if(FailState == TQUERY_CONNECT_FAILED) { log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error) } else if(FailState == TQUERY_QUERY_FAILED) { log_amx("Load Query failed. [%d] %s", Errcode, Error) } new id id = Data[0] if(SQL_NumResults(Query) < 1) { new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) new szTemp[512] format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1]) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } else { stats[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"stats")) deaths[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"deaths")) } return PLUGIN_HANDLED } public Save_MySql(id) { new szTemp[512] new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name=%s",stats,stats[1],name) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { SQL_FreeHandle(Query) return PLUGIN_HANDLED } public client_putinserver(id) { Load_MySql(id) } public client_disconnect(id) { Save_MySql(id) }
DarkGL
15.08.2011
#include <amxmodx> #include <csx> #include <sqlx> #define PLUGIN "test" #define VERSION "1.0" #define AUTHOR "speedkill" new Host[] = "" new User[] = "" new Pass[] = "" new Db[] = "" new Handle:g_SqlTuple new stats[33] new deaths[33] public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) set_task(1.0, "MySql_Init") } public MySql_Init() { g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) SQL_ThreadQuery(g_SqlTuple,"register_client","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))") } public plugin_end() { SQL_FreeHandle(g_SqlTuple) } public Load_MySql(id) { new name[32], szTemp[512] get_user_name(id, name, 31) new Data[1] Data[0] = id format(szTemp,charsmax(szTemp),"SELECT * FROM `top15` WHERE (`top15`.`name` = '%s')", name) SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1) } public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { if(FailState == TQUERY_CONNECT_FAILED) { log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error) } else if(FailState == TQUERY_QUERY_FAILED) { log_amx("Load Query failed. [%d] %s", Errcode, Error) } new id id = Data[0] if(SQL_NumResults(Query) > 0) { stats[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"stats")) deaths[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query,"deaths")) } else { new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) new szTemp[512] format(szTemp,charsmax(szTemp),"INSERT INTO `top15` ( `name` , `stats`, `deaths`)VALUES ('%s','%d','%d');",name,stats,stats[1]) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } return PLUGIN_HANDLED } public Save_MySql(id) { new szTemp[512] new stats[8], bodyhits[8]; get_user_stats(id, stats, bodyhits); new name[32] get_user_name(id, name, 31) format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name = '%s'",stats,stats[1],name) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle",szTemp) } public IgnoreHandle(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { return PLUGIN_HANDLED } public client_putinserver(id) { Load_MySql(id) } public client_disconnect(id) { Save_MySql(id) }
speedkill
15.08.2011
Hmm działa , ale za każdą zmianą mapy tworzy tak jakby pusty wpis zobacz na screenshota
I da radę jakoś to usunąć jeśli nie to niech tak będzie jak jest ;]
I da radę jakoś to usunąć jeśli nie to niech tak będzie jak jest ;]
speedkill
15.08.2011
no cóż to nic Dark dzięki ;]
Dobra hiro więc czekam ;]
Użytkownik speedkill123 edytował ten post 15.08.2011 21:43
Dobra hiro więc czekam ;]
Użytkownik speedkill123 edytował ten post 15.08.2011 21:43
A może sma?
15.08.2011
Niby się nie znam, ale może dlatego, że masz nie używane miejsce w tablicach?
new stats[33]
new deaths[33] - po co 33 skoro graczy w CSie masz max 32? Wystarczy [32]
@down: gdy policzę od 0 do 31 to wypowiem 32 cyfry, +1 na "zakończenie" tablicy daje mi cyfrę 32 w nawiasie kwadratowym...
Choć tak jak już mówiłem - ma wiedza z zakresu Pawna jest nie wielka, ba nawet bilska zeru
Użytkownik A może sma? edytował ten post 15.08.2011 22:12
new stats[33]
new deaths[33] - po co 33 skoro graczy w CSie masz max 32? Wystarczy [32]
@down: gdy policzę od 0 do 31 to wypowiem 32 cyfry, +1 na "zakończenie" tablicy daje mi cyfrę 32 w nawiasie kwadratowym...
Choć tak jak już mówiłem - ma wiedza z zakresu Pawna jest nie wielka, ba nawet bilska zeru
Użytkownik A może sma? edytował ten post 15.08.2011 22:12
DarkGL
15.08.2011
bo maksymalne id gracza to 32
a
new tab[33];
tworzy tablice o polach od 0 do n-1
w tym przypadku od 0 do 32
przeczytaj jakikolwiek tutorial o tablicach
a
new tab[33];
tworzy tablice o polach od 0 do n-1
w tym przypadku od 0 do 32
przeczytaj jakikolwiek tutorial o tablicach
diggs
17.08.2011
Wiesz dla czego tak się dzieje? Tzn tworzy się przy zmianie mapy pusty wpis.
Już ci mówię ;] Błąd jest trywialny i nawet fajny . Dam ci możliwość pogłówkowania nad tą zagadką i nie napisze odpowiedzi od razu. Jeśli sam na to nie wpadniesz powiem ci o co chodzi. Powiem ci że błąd jest w kodzie, przyjrzyj się mu jeszcze raz dokładnie, jak nie znajdziesz błędu to ci napisze co jest nie tak tylko daj znać.
Już ci mówię ;] Błąd jest trywialny i nawet fajny . Dam ci możliwość pogłówkowania nad tą zagadką i nie napisze odpowiedzi od razu. Jeśli sam na to nie wpadniesz powiem ci o co chodzi. Powiem ci że błąd jest w kodzie, przyjrzyj się mu jeszcze raz dokładnie, jak nie znajdziesz błędu to ci napisze co jest nie tak tylko daj znać.
speedkill
17.08.2011
No właśnie niestety szukałem już ale nie znalazłem , więc jeśli mógłbyś napisać co jest źle
Gh0st
17.08.2011
format(szTemp,charsmax(szTemp),"UPDATE `top15` SET stats='%d' , deaths='%d' WHERE name = '%s'",stats,stats[1],name)
polecam dać :
format(szTemp,charsmax(szTemp),"UPDATE `top15` SET `stats`='%d' , `deaths`='%d' WHERE `name` = '%s'",stats,stats[1],name)
choć to nie rozwiąże problemu , taka poprawka
Użytkownik Gh0st edytował ten post 17.08.2011 16:37
speedkill
17.08.2011
To właściwie nic nie zmieni czekam jeszcze na odpowiedź diggs'a bo mówił , że wie gdzie jest błąd
diggs
17.08.2011
Chodzi o tą część kodu:
Ściślej o funkcje jakiej używasz do obsługi zapytania - "register_client" ona powoduje że tworzony jest pusty wpis w bazie.
Zmień to na np takie coś:
Proponuję ci też zaraz po stworzeniu uchwytu do danych do połączanie z bazą sprawdzić czy wprowadzone parametry są poprawne i można nawiązać połączenie z bazą danych, a jeśli go nie ma najlepiej wstrzymać działanie pluginu bo po co mają być wysyłane zapytania które i tak nie zostaną wykonane. Taki test możesz wykonać za pomocą SQL_Connect + sprawdzenie errorów.
Tutaj masz przykład takiego sprawdzenia połączenia:
public MySql_Init() { g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) SQL_ThreadQuery(g_SqlTuple,"register_client","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))") }
Ściślej o funkcje jakiej używasz do obsługi zapytania - "register_client" ona powoduje że tworzony jest pusty wpis w bazie.
Zmień to na np takie coś:
public MySql_Init() { g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db) SQL_ThreadQuery(g_SqlTuple,"IgnoreHandle","CREATE TABLE IF NOT EXISTS top15 (name varchar(255),stats varchar(255),deaths varchar(255))") }I po sprawie.
Proponuję ci też zaraz po stworzeniu uchwytu do danych do połączanie z bazą sprawdzić czy wprowadzone parametry są poprawne i można nawiązać połączenie z bazą danych, a jeśli go nie ma najlepiej wstrzymać działanie pluginu bo po co mają być wysyłane zapytania które i tak nie zostaną wykonane. Taki test możesz wykonać za pomocą SQL_Connect + sprawdzenie errorów.
Tutaj masz przykład takiego sprawdzenia połączenia:
new ErrorCode, Error[512]; new Handle:SqlConnection = SQL_Connect(g_SqlTuple, ErrorCode, Error, 511); if(SqlConnection) { SQL_FreeHandle(SqlConnection); //tworzenie baz danych za pomoca SQL_ThreadQuery() } else { log_to_file("addons/amxmodx/logs/moej logi.log", "Error (%d): %s", ErrorCode, Error); SQL_FreeHandle(SqlConnection); set_fail_state(g_Error); }
speedkill
17.08.2011
taki błąd a tyle hałasu działa pięknie
Oczywiście + ;]
można close
Użytkownik speedkill123 edytował ten post 17.08.2011 16:53
Oczywiście + ;]
można close
Użytkownik speedkill123 edytował ten post 17.08.2011 16:53