Skocz do zawartości

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.
  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Sql - czy nazwa istnieje


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
8 odpowiedzi w tym temacie

#1 KariiO

    Super Hero

  • Power User

Reputacja: 396
Wszechpomocny

  • Postów:1 133
  • GG:
  • Imię:Korneliusz
  • Lokalizacja:Cieszyn
Offline

Napisano 19.05.2013 00:54

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


  • +
  • -
  • 0

#2 sebul

    Godlike

  • Przyjaciel

Reputacja: 2 035
Godlike

  • Postów:5 411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 19.05.2013 01:02

Nazwa czego?
  • +
  • -
  • 0

Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo


#3 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

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?


  • +
  • -
  • 0

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ę.
 
1988650.png?theme=dark


#4 KariiO

    Super Hero

  • Autor tematu
  • Power User

Reputacja: 396
Wszechpomocny

  • Postów:1 133
  • GG:
  • Imię:Korneliusz
  • Lokalizacja:Cieszyn
Offline

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
}

  • +
  • -
  • 0

#5 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

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ń.


  • +
  • -
  • 2

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ę.
 
1988650.png?theme=dark


#6 KariiO

    Super Hero

  • Autor tematu
  • Power User

Reputacja: 396
Wszechpomocny

  • Postów:1 133
  • GG:
  • Imię:Korneliusz
  • Lokalizacja:Cieszyn
Offline

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 ?


  • +
  • -
  • 0

#7 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

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 :)


  • +
  • -
  • 0

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ę.
 
1988650.png?theme=dark


#8 KariiO

    Super Hero

  • Autor tematu
  • Power User

Reputacja: 396
Wszechpomocny

  • Postów:1 133
  • GG:
  • Imię:Korneliusz
  • Lokalizacja:Cieszyn
Offline

Napisano 19.05.2013 21:17

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
}

  • +
  • -
  • 0

#9 GwynBleidD

    Godlike

  • Przyjaciel

Reputacja: 1 869
Godlike

  • Postów:3 066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

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


  • +
  • -
  • 0

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ę.
 
1988650.png?theme=dark





Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych