Sql - czy nazwa istnieje
GwynBleidD
19.05.2013
Lepszym zwyczajem jest opisanie do czego chcesz to "sprawdzenie" wykorzystać. Często ludzie zabierają się za coś trochę naokoło, może się okazać, że samo sprawdzenie nie jest Ci potrzebne No i uściślij, jak sebul już napisał, czego ta nazwa ma dotyczyć? Kolumny? Rekordu? Tabeli? Bazy danych?
KariiO
19.05.2013
Nie robię na około na pewno ponieważ tworzę nazwę ale nie może być dwóch takich samych więc muszę sprawdzić czy w bazie taka istenieje.
Chodzi mi o rekord w danej tabeli, niby kod mam taki ale czy dobry...:
public sprawdz_nazwe_party(id,party[]) { new data[1] data[0] = id new host[128] new user[64] new pass[64] new database[64] get_cvar_string("party_sql_database",database,63) get_cvar_string("party_sql_host",host,127) get_cvar_string("party_sql_user",user,63) get_cvar_string("party_sql_pass",pass,63) get_cvar_string("party_sql_table",g_sqlTable,63) g_SqlTuple = SQL_MakeDbTuple(host,user,pass,database) new q_command[512] format(q_command,511,"SELECT * FROM `%s` WHERE `np`='%s' ",g_sqlTable,party) SQL_ThreadQuery(g_SqlTuple,"SelectHandley",q_command,data,1) } public SelectHandley(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { new id= Data[0] if(Errcode) { log_to_file("addons/amxmodx/logs/diablo.log","Error on load_xp query: %s",Error) } if(FailState == TQUERY_CONNECT_FAILED) { log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.") return PLUGIN_CONTINUE } else if(FailState == TQUERY_QUERY_FAILED) { log_to_file("addons/amxmodx/logs/diablo.log","load_xp Query failed.") return PLUGIN_CONTINUE } new chwyc = SQL_FieldNameToNum(Query, "np") new przypisz[512] SQL_ReadResult(Query, chwyc, przypisz, 511) if(equal(sprawdzane_party[id],przypisz)) { client_print(id,print_chat,"[PARTY] Party o nazwie %s juz istnieje !",sprawdzane_party[id]) glowne_menu_party(id) } else { client_print(id,print_chat,"[PARTY] Nazwa %s jest wolna !",sprawdzane_party[id]) glowne_menu_party(id) } return PLUGIN_CONTINUE }
GwynBleidD
19.05.2013
Więc... robisz na około Sposób jest dobry, ale...
Utworzenie unikalnego klucza w bazie pozwoli Ci na wyłapanie duplikatu przy próbie utworzenia rekordu o istniejącej już nazwie. No chyba, że potrzebujesz koniecznie sprawdzenie robić wcześniej, jednak i tak zadbałbym o utworzenie unikalnego klucza. Dobrze zaprojektowana baza danych jest kluczem do optymalnej aplikacji
Wróćmy jednak do Twojego kodu. Masz kilka błędów.
1. Nie musisz po pobraniu rekordu z bazy sprawdzać, czy jest on na pewno taki sam. Zapytanie już jest tak skonstruowane, że nie zwróci Ci nic niezgodnego z Twoim założeniem. Nie używaj więc SQL_ReadResult. Użyj SQL_NumResults. Jeśli zwrócona wartość jest większa od zera, zapytanie "coś" zwróciło, więc rekord istnieje.
2. Nie używaj tablicy globalnej sprawdzane_party. Nie jest to błędem, ale można zrobić to lepiej. W tablicy data, w której przekazujesz ID, możesz przekazać również nazwę party, aby wykonywać dalsze operacje na tej nazwie. Wystarczy coś takiego, zakładając że party ma długość 32:
new data[33] data[0] = id copy(data[1], 31, party);
3. tuple do bazy danych twórz najlepiej w plugin_cfg lub ewentualnie w plugin_init. Nie ma sensu marnować zasobów na tworzenie go przy każdym zapytaniu. Lepiej utworzyć zmienną globalną i w niej tuple przechowywać dla wszystkich zapytań.
KariiO
19.05.2013
Okej śmiga wszystko Dzięki, nie wiem czy moje by zadziałało czy nie ale do tej pory nie działało bo pomyliłem sobie miejsca w funkcji copy...
Druga sprawa, jak mogę pobrać wszystkie rekordy które są w danej kolumnie ? Chodzi mi przykladowo o pobranie wszystkich nicków gdzie nazwa drużyny jest jakaś tam ?
GwynBleidD
19.05.2013
Zaznajom się z SQL_NextRow, poszukaj poradników na forum o używaniu SQL w pluginach i pomyśl co się stanie, jeśli w zapytaniu zmienisz
WHERE `np`='%s'
na
WHERE `team`='%s'
lub jakkolwiek kolumna z drużynami się u Ciebie nazywa, i podasz nazwę drużyny jako parametr %s
KariiO
19.05.2013
Wiem że wystarczy zmienić ale nie o to mi chodziło Mnie mam że jak to użyje to zwróci tylko jednego użytkownika tak ? Bo nie wiem ilu ich jest
O SQL_NextRow w dokumentacji dużo nie ma więc powiedz coś od siebie
Edit1
Póki co coś takiego wyszkrobałem :
public sprawdz_nicki_czlonkow_party(id,party[]) { new data[33] data[0] = id copy(data[1], 31, party); new host[128] new user[64] new pass[64] new database[64] get_cvar_string("party_sql_database",database,63) get_cvar_string("party_sql_host",host,127) get_cvar_string("party_sql_user",user,63) get_cvar_string("party_sql_pass",pass,63) get_cvar_string("party_sql_table",g_sqlTable,63) g_SqlTuple = SQL_MakeDbTuple(host,user,pass,database) new q_command[512] format(q_command,511,"SELECT * FROM `%s` WHERE `np`='%s' ",g_sqlTable,party) SQL_ThreadQuery(g_SqlTuple,"SelectHandley",q_command,data,32) } public SelectHandley(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) { new id= Data[0] if(Errcode) { log_to_file("addons/amxmodx/logs/diablo.log","Error on load_xp query: %s",Error) } if(FailState == TQUERY_CONNECT_FAILED) { log_to_file("addons/amxmodx/logs/diablo.log","Could not connect to SQL database.") return PLUGIN_CONTINUE } else if(FailState == TQUERY_QUERY_FAILED) { log_to_file("addons/amxmodx/logs/diablo.log","load_xp Query failed.") return PLUGIN_CONTINUE } new chwyc= SQL_FieldNameToNum(Query, "nick") new przypisz[512] SQL_ReadResult(Query, chwyc, przypisz, 511) client_print(id,print_chat,"Gracz %s jest w twoim party !",przypisz) return PLUGIN_CONTINUE }
GwynBleidD
19.05.2013
Widzę, że za poradnikami już rozglądać Ci się nie chciało...
http://amxx.pl/topic...czym-to-sie-je/ - ściślej podrozdział Przechodzenie z jednego wpisu do drugiego