←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Sql - czy nazwa istnieje

  • +
  • -
KariiO - zdjęcie KariiO 19.05.2013

Witam jak mogę sprawdzić czy dana nazwa w bazie istnieje ?

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 19.05.2013

Nazwa czego?
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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?

Odpowiedz

  • +
  • -
KariiO - zdjęcie 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
}
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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ń.

Odpowiedz

  • +
  • -
KariiO - zdjęcie 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 ?

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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 :)

Odpowiedz

  • +
  • -
KariiO - zdjęcie KariiO 19.05.2013

Wiem że wystarczy zmienić ale nie o to mi chodziło :D 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
}
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie 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

Odpowiedz