hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.28. 21:37



Jelenlévő felhasználók

Jelenleg 248 felhasználó van jelen :: 2 regisztrált, 0 rejtett és 246 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: Bing [Bot], Google [Bot] az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 57 hozzászólás ]  Oldal 1 2 3 4 5 6 Következő
Szerző Üzenet
 Hozzászólás témája: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 13:35 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
[kozep]SQL Tutorial
by mforce[/kozep]



Leírás:
Ez egy egy szálon futó folyamat, ha a leírás szerint alkalmazzátok, akkor kevés teljesítmény használat mellett van egy hibátlan SQL mentésetek.

Gyors ismertető:
Kód:
CREATE TABLE IF NOT EXISTS = Tábla létrehozása, ha nem létezik
SELECT * from `tabla_neve` = Összes kiválasztása a `tabla_neve` táblából
WHERE = Ahol
INSERT INTO = Beillesztés
UPDATE = Frissítés
VALUES = Értékek
varchar(32) = 32 karakterszámú szövegsor
int(11) = 11 karakterszámú számsor
(ugyanígy tovább float,boolean,text stb., de mi általában csak ezeket használjuk.)
NOT NULL = Nem üres sor
NULL = Automatikusan üres sor
AUTO_INCREMENT = Automatikus növekedés
PRIMARY KEY = Elsődleges kulcs



Alap:
SQL csatlakozás adatait és egy kezelő tömböt adjunk a pluginnak. (függvényen kívül felülre)
  1. new const SQL_INFO[][] = {
  2.     "127.0.0.1",    // HOST
  3.     "username",     // USERNAME
  4.     "password",     // PASSWORD
  5.     "database"      // DATABASE
  6. }
  7.  
  8. new Handle:g_SqlTuple;
  9.  
  10. // meg gondolom van legalább változónk is, ha már valamit menteni akarunk.
  11. new valtozo[33]
  12.  
  13. // tároljuk valamibe a nevet is, mert nem akarom, mindig lekérni.
  14. new name[33][32]



Tábla létrehozás:
Formázások a meghatározók a fentebb felsorolt gyors ismertető szerint. Jelenleg a tábla létrehozás az első.
Illesszük be a `tabla_neve` helyére a tábla nevét, amit majd minden parancshoz is beillesztünk, ahol ezt látunk.
Ezután adjuk meg a sorok nevét és az értékeket, esetleg a kiegészítő parancsokat, például jelen esetben NOT NULL, majd vesszővel válasszuk el a következő sortól.
Az `id` részt javaslom úgy hagyni. A phpmyadminok, csak úgy engedik szerkeszteni a táblákat, ha van egy egyedi elsődleges tábla.
Egy automatikusan növekvő számsor sorok létrehozása szerint tökéletes a célra.

Ezután a createTableThread rész az SQL kérést teszi meg és figyeli, hogy nem-e lett benne hiba.
  1. public plugin_cfg() {
  2.     new Query[512];
  3.     g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
  4.  
  5.     formatex(Query, charsmax(Query), "CREATE TABLE IF NOT EXISTS `tabla_neve` (`username` varchar(32) NOT NULL,`valami_ertek` int(11) NOT NULL,`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)")
  6.     SQL_ThreadQuery(g_SqlTuple,"createTableThread", Query)
  7. }
  8.  
  9. public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  10.     if(FailState == TQUERY_CONNECT_FAILED)
  11.         set_fail_state("Nem tudtam csatlakozni az adatbazishoz.");
  12.     else if(FailState == TQUERY_QUERY_FAILED)
  13.         set_fail_state("Query Error");
  14.     if(Errcode)
  15.         log_amx("Hibat dobtam: %s",Error);
  16. }



Játékos betöltése:
Mivel username sort készítettem, így most névre mutatom meg.
Persze változtatható egyszerűen, get_user_name részt átírjuk get_user_authid -re, akkor steamid-ről töltődik,
viszont akkor arra is kell menteni.
A load részből a QuerySelectData részbe visszük tovább az adatokat.
  1. public client_putinserver(id) {
  2.     if(!is_user_bot(id)) {
  3.         get_user_name(id, name[id], charsmax(name))
  4.         load(id)
  5.     }
  6. }
  7.  
  8. public load(id) {
  9.     new Query[512], Data[1]
  10.     Data[0] = id
  11.     formatex(Query, charsmax(Query), "SELECT * FROM `tabla_neve` WHERE username = ^"%s^";", name[id])
  12.     SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query, Data, 1)
  13. }
  14.  
  15. public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  16.     if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
  17.         log_amx("%s", Error)
  18.         return
  19.     }
  20.     else {
  21.         new id = Data[0];
  22.  
  23.         if(SQL_NumRows(Query) > 0) {    // Ha talált legalább 1 sort, akkor ezek történnek.
  24.             valtozo[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "valami_ertek"))
  25.             // Ez a parancs szöveg, szám és float esetében is másképp van, ehhez infó lentebb.
  26.         }
  27.         else {  // Ha nem talált sort, mert még nem volt a szerveren, akkor készítünk neki egyet.
  28.             save(id)    // Ehhez infó a Játékos sorainak létrehozásánál.
  29.         }
  30.     }
  31. }


Most egy szám változót töltöttünk be, de mi van ha szöveg kellene?
Az SQL_ReadResult mindenhol másképp van.
API infó:
https://www.amxmodx.org/api/sqlx/SQL_ReadResult

Könnyed leírás:
Szám betöltés, amit most láthattunk:
  1. valtozo[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "valami_ertek"))

Szöveg:
  1. SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "valami_ertek"), valami[id], charsmax(valami[]))

Float:
  1. SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "valami_ertek"), valami[id])



Játékos sorainak létrehozása:
Itt a betöltés résznél, már lekértük a save(id) függvényt, ha nem találtuk az adatbázisban az embert.
Az értéknek alapból 0-át adunk meg, nem is kérjük le inkább feleslegesen, még ha 0 is.
Lássuk:
  1. public save(id) {
  2.     new text[512];
  3.     formatex(text, charsmax(text), "INSERT INTO `tabla_neve` (`username`, `valami_ertek`) VALUES (^"%s^", ^"0^");", name[id])
  4.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
  5. }
  6.  
  7. public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  8.     if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
  9.         log_amx("%s", Error)
  10.         return
  11.     }
  12. }

Megjegyzés: A QuerySetData részt még felhasználjuk a játékos pontjainak mentéséhez is.


Játékos pontjainak mentése:
Az int = szám az %i, a string = szöveg az %s, ne felejtsük el.
Most a valtozo[id], az szám, tehát nézzük a példát:
  1. public update(id) {
  2.     new text[512];
  3.     formatex(text, charsmax(text), "UPDATE `tabla_neve` SET valami_ertek = ^"%i^" WHERE username = ^"%s^";", valtozo[id], name[id])
  4.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
  5. }

Ezzel frissültek a névre a pontok.
Több érték adása a formázásban így néz ki:
  1. formatex(text, charsmax(text), "UPDATE `tabla_neve` SET valami_ertek = ^"%i^", valami_szoveg = ^"%s^" WHERE username = ^"%s^";", valtozo[id], valami[id], name[id])

Tehát igazából csak simán vesszővel elválasszuk.

Az update(id) részt, oda rakjuk, ahol mentést szeretnénk, nem terheli le a szervert, mintha fájlba történne.
Mutatok azért egy lecsatlakozáskori mentést az egyszerűség kedvéért:
  1. public client_disconnect(id) {
  2.     if(!is_user_bot(id)) {
  3.         update(id)
  4.     }
  5.     valtozo[id] = 0
  6.     copy(name[id], charsmax(name[]), "")
  7. }


Megjegyzés: Mindig csekkoljuk le, hogy nem-e bot, mivel már csatlakozáskor nem töltöttük be, ha bot, így a tábla se jött létre.
Tehát hibát dob, ha botról van szó és frissülne neki valami, de nincs táblája.

Befejezés:
  1. public plugin_end() {
  2.     SQL_FreeHandle(g_SqlTuple)
  3. }


Teljes forráskód:
Kommentek nélkül.
  1. new const SQL_INFO[][] = {
  2.     "127.0.0.1",    // HOST
  3.     "username",     // USERNAME
  4.     "password",     // PASSWORD
  5.     "database"      // DATABASE
  6. }
  7.  
  8. new Handle:g_SqlTuple;
  9.  
  10. new valtozo[33]
  11. new name[33][32]
  12.  
  13. public plugin_cfg() {
  14.     new Query[512];
  15.     g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
  16.  
  17.     formatex(Query, charsmax(Query), "CREATE TABLE IF NOT EXISTS `tabla_neve` (`username` varchar(32) NOT NULL,`valami_ertek` int(11) NOT NULL,`id` INT(11) NOT NULL AUTO_INCREMENT PRIMARY KEY)")
  18.     SQL_ThreadQuery(g_SqlTuple,"createTableThread", Query)
  19. }
  20.  
  21. public createTableThread(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  22.     if(FailState == TQUERY_CONNECT_FAILED)
  23.         set_fail_state("Nem tudtam csatlakozni az adatbazishoz.");
  24.     else if(FailState == TQUERY_QUERY_FAILED)
  25.         set_fail_state("Query Error");
  26.     if(Errcode)
  27.         log_amx("Hibat dobtam: %s",Error);
  28. }
  29.  
  30. public client_putinserver(id) {
  31.     if(!is_user_bot(id)) {
  32.         get_user_name(id, name[id], charsmax(name))
  33.         load(id)
  34.     }
  35. }
  36.  
  37. public load(id) {
  38.     new Query[512], Data[1]
  39.     Data[0] = id
  40.     formatex(Query, charsmax(Query), "SELECT * FROM `tabla_neve` WHERE username = ^"%s^";", name[id])
  41.     SQL_ThreadQuery(g_SqlTuple, "QuerySelectData", Query, Data, 1)
  42. }
  43.  
  44. public QuerySelectData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  45.     if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
  46.         log_amx("%s", Error)
  47.         return
  48.     }
  49.     else {
  50.         new id = Data[0];
  51.  
  52.         if(SQL_NumRows(Query) > 0) {
  53.             valtozo[id] = SQL_ReadResult(Query, SQL_FieldNameToNum(Query, "valami_ertek"))
  54.         }
  55.         else {
  56.             save(id)
  57.         }
  58.     }
  59. }
  60.  
  61. public save(id) {
  62.     new text[512];
  63.     formatex(text, charsmax(text), "INSERT INTO `tabla_neve` (`username`, `valami_ertek`) VALUES (^"%s^", ^"0^");", name[id])
  64.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
  65. }
  66.  
  67. public QuerySetData(FailState, Handle:Query, Error[], Errcode, Data[], DataSize, Float:Queuetime) {
  68.     if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED) {
  69.         log_amx("%s", Error)
  70.         return
  71.     }
  72. }
  73.  
  74. public update(id) {
  75.     new text[512];
  76.     formatex(text, charsmax(text), "UPDATE `tabla_neve` SET valami_ertek = ^"%i^" WHERE username = ^"%s^";", valtozo[id], name[id])
  77.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
  78. }
  79.  
  80. public client_disconnect(id) {
  81.     if(!is_user_bot(id)) {
  82.         update(id)
  83.     }
  84.     valtozo[id] = 0
  85.     copy(name[id], charsmax(name[]), "")
  86. }
  87.  
  88. public plugin_end() {
  89.     SQL_FreeHandle(g_SqlTuple)
  90. }


Végszó:
Ennyi lenne, az egyszerűség kedvéért írtam csak változókat, persze ezzel mindent meg lehet oldani, de így tudtok minden parancsot.
További problémák kibeszélése ezzel kapcsolatban itt!

_________________
GitHub - mforce


A hozzászólást 1 alkalommal szerkesztették, utoljára mforce 2015.11.30. 15:24-kor.

Ők köszönték meg mforce nek ezt a hozzászólást (összesen 7): jokypapa (2015.12.01. 19:41) • Zeei (2015.12.03. 15:26) • Akosch:. (2015.12.06. 14:20) • Chuck:. (2016.05.21. 03:24) • Dragica:. (2016.05.27. 10:01) • {S}noopy (2017.05.17. 19:02) • Krisznitro (2017.08.13. 16:09)
  Népszerűség: 15.91%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 13:52 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Azonnal eszembe is jutott, hogy mit hagytam ki.
Index sor törlése az így néz ki, akinek szüksége van rá:
  1. public delete(id) {
  2.     new text[512];
  3.     formatex(text, charsmax(text), "DELETE * from `tabla_neve` WHERE username = ^"%s^";", name[id])
  4.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", text)
  5. }

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 14:14 
Offline
Jómunkásember

Csatlakozott: 2014.10.30. 10:18
Hozzászólások: 468
Megköszönt másnak: 235 alkalommal
Megköszönték neki: 34 alkalommal
Köszönjük! :)


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 14:37 
Offline
Tud valamit
Avatar

Csatlakozott: 2015.09.23. 19:53
Hozzászólások: 100
Telyes forraskodot nem birsz adni a vegere ?

_________________
SMA Forráskód: [ Mindet kijelol ]
  1. Uj Munkaim :
  2. Kes Mod[45%]
  3. Deathrun Menu[33%]


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 14:40 
Offline
Senior Tag

Csatlakozott: 2015.06.28. 13:00
Hozzászólások: 295
Megköszönt másnak: 20 alkalommal
Megköszönték neki: 10 alkalommal
Az a baj vele hogy egy Global modot nem lehet el menteni vele :(

_________________
Kép


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 15:04 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
PistaCFG írta:
Az a baj vele hogy egy Global modot nem lehet el menteni vele :(


De el lehet mindent, ne beszélj hülyeségeket feleslegesen pls...
Tanuld meg a len+ -t, told nagyobbra a karakterszámot, próbáld meg valamibe tárolni a táblák nevét és úgy megadni, azt kész.

  1. new Query[1024];
  2. new Len;
  3. Len += formatex(Query[Len], charsmax(Query), "INSERT INTO `tabla_neve` ")
  4. Len += formatex(Query[Len], charsmax(Query)-Len, "(`username`, `valami_ertek`) VALUES (^"%s^", ^"0^");", name[id])


  1. new const tabla[][] = {
  2.     "username",
  3.     "valami_ertek"
  4. }
  5.  
  6. public valami(id) {
  7.     new Query[1024];
  8.     new Len;
  9.     Len += formatex(Query[Len], charsmax(Query), "INSERT INTO `tabla_neve` ")
  10.     Len += formatex(Query[Len], charsmax(Query)-Len, "(`%s`, `%s`) VALUES (^"%s^", ^"0^");", tabla[0], tabla[1], name[id])
  11.     SQL_ThreadQuery(g_SqlTuple, "QuerySetData", Query)
  12. }

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.11.30. 16:00 
Offline
Jómunkásember

Csatlakozott: 2013.10.01. 19:07
Hozzászólások: 319
Megköszönt másnak: 50 alkalommal
Megköszönték neki: 23 alkalommal
nagyon köszönöm mforce régota keressem :D

_________________
[kozep]Kép[/kozep]
[kozep]Naponta fejlesztések ezért is megéri fel jonni!:)[/kozep]
[kozep]Troy ~ 1337. CFG[/kozep]


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.12.02. 21:58 
Offline
Felfüggesztve
Avatar

Csatlakozott: 2013.06.09. 18:47
Hozzászólások: 2004
Megköszönt másnak: 1 alkalommal
Megköszönték neki: 220 alkalommal
cmd írta:
Telyes forraskodot nem birsz adni a vegere ?



http://www.magyarhelyesiras.hu/

_________________
Ha elnyerte valamelyik témában a hozzászólásom a tetszésedet melyet olvastál, akkor egy egyszerű gombnyomással kifejezheted, hogy tetszett.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.12.03. 15:23 
Offline
Jómunkásember

Csatlakozott: 2013.10.01. 19:07
Hozzászólások: 319
Megköszönt másnak: 50 alkalommal
Megköszönték neki: 23 alkalommal
valami gondot dob erre a sorra valaki javitaná?
  1. ublic plugin_cfg() {
  2.     new Query[512];
  3.     g_SqlTuple = SQL_MakeDbTuple(SQL_INFO[0],SQL_INFO[1],SQL_INFO[2],SQL_INFO[3])
  4.  
  5.  
  6.     formatex(Query, charsmax(Query), "CREATE TABLE IF NOT EXISTS `hard_paintball` (`username` varchar(32) NOT NULL,`dollar` int(11) NOT NULL,`id` INT(11) NOT NULL,`kes1` int(11) NOT NULL, NOT NULL,`kes2` int(11) NOT NULL,`id` NOT NULL AUTO_INCREMENT PRIMARY KEY)")
  7.     SQL_ThreadQuery(g_SqlTuple,"createTableThread", Query)
  8. }

_________________
[kozep]Kép[/kozep]
[kozep]Naponta fejlesztések ezért is megéri fel jonni!:)[/kozep]
[kozep]Troy ~ 1337. CFG[/kozep]


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: SQL Tutorial
HozzászólásElküldve: 2015.12.03. 15:30 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
nem ublic, hanem public.

Meg ,`id` INT(11) NOT NULL

tehát id tábla 2x van. Az utolsó maradjon, mert az PRIMARY KEY meg AUTO_INCREMENT, nem véletlen lett odaírva, hogy kell.

_________________
GitHub - mforce


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 57 hozzászólás ]  Oldal 1 2 3 4 5 6 Következő


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 1 vendég


Nyithatsz új témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole