Witam jak mogę sprawdzić czy dana nazwa w bazie istnieje ?
Witamy w Nieoficjalnym polskim support'cie AMX Mod X
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Sql - czy nazwa istnieje
#1
Napisano 19.05.2013 00:54
#2
Napisano 19.05.2013 01:02
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
#3
Napisano 19.05.2013 04:25
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?
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#4
Napisano 19.05.2013 11:19
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 }
#5
Napisano 19.05.2013 14:23
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ń.
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#6
Napisano 19.05.2013 18:37
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 ?
#7
Napisano 19.05.2013 20:39
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
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
#8
Napisano 19.05.2013 21:17
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 }
#9
Napisano 19.05.2013 22:10
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
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Użytkownicy przeglądający ten temat: 0
0 użytkowników, 0 gości, 0 anonimowych