Peršokti į turinį

2 Pamoką by: Master. MySQL pagrindai.


bahurastrys

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3650 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Recommended Posts

Kadangi pastebėjau jog vis daugiau žmonių nori naudoti MySQL, bet ne visi žino nuo ko pradėti, todėl trumpai parodysiu.

Pavyzdžiuose bus naudojamas BlueG R7 pluginas.

Šiek tiek teorijos, tikriausiai ne karta girdėjote (bent iš manęs) kad R7 yra daug greitesnis, tai žinoma yra tiesa. Greičio palyginimu su kitomis versijomis galite rastičia.
Kodėl jis toks greitas? O todėl kad dabar kol pluginas ką nors daro su duomenų baze, serveri tuo metu gali užsimti kitais dalykais. Gal to ir nepastebėjote, bet su senesnėmis versijomis jis to negalėjo.

Jeigu iš mano kalbų niekas nepaiškėjo, nesirūpinkite, viskas tuoj paaiškės ,nes keliaujame prie praktikos.

Prieš pradėdami, prisijunkime į duomenų bazę:
new DB;
public OnGameModeInit()
{
DB=mysql_connect("Duombazės adresas","Vartotojas","Duombaze","slaptazodis");
return 1;
}

Įsivaizduokime kad duomenų bazėje turime tokia lentele:

e6ubly.png

Pradžiai išmokime įrašyti į duomenų bazę. Dalykas kurį siunčiame į duomenų bazę vadinamas "Query", todėl įprasta šį pavadinimą ir naudoti.
new query[128],Name[MAX_PLAYER_NAME],Float:X,Float:Y,Float:Z;
GetPlayerName(playerid,Name,sizeof(Name));
GetPlayerPos(playerid,X,Y,Z);

format(query,sizeof(query),"INSERT INTO `lentelesPavadinimas` (Username,Password,PosX,PosY,PosZ) VALUES ('%s',%s','%f','%f','%f')",Name,slaptazodis,X,Y,Z);

Ši query viršuje įrašys naują eilutę(tačiau ji dar neišsiusta,apie tai žemiau). Jeigu eilutė jau egzistuoja, reikės siųsti kitokia query.

Jeigu norime atnaujinti informaciją reikėtu kurti tokį query:
new query[128],name[MAX_PLAYER_NAME];
format(query,sizeof(query),"UPDATE `lenteles_pavadinimas` SET Pinigai ='%d' WHERE Username='%s'",GetPlayerMoney(playerid),name);
Ši query viršuje atnaujins lentelę(bet ji neišsiųsta todėl nieko nepadarys,apie tai žemiau), ir nustatys pinigus į tiek kiek žaidėjas jų turi, TEN kur Username yra lygus žaidėjo vardui.


Kaip minėjau nei viena iš tu query(užklausų) neišsiųsta,kaip tą padaryti?
mysql_function_query(DB,query,false,"SendQuery","");Dabar, query jau išsiųsta.
"DB", kas tai? Prisiminkime prisijungima prie duomenų bazės, tai reiškia kad query bus nusiųsta į tą duomenų bazę. (galima dirbti su keliomis duombazėmis)
"False", kodėl? Šis parametras rodo ar naudojame "caching" funckcija. Siųsdami duomenis į bazę, jos niekada nenaudojame.
"SendQuery", tai tėra funkcija kuri siunčiant ką nors į duomenų bazę visada bus vienoda ir atrodys taip:
forward SendQuery();
public SendQuery()
{
return 1;
}
Jeigu viska perskaitet dabar jau turetumet moket irasinet duomenis...


Ką gi, nemalonioji dalis, parsisiuntimas iš duomenų bazės...Čia viskas kiek pasunkėja, bet reikia tik suprasti ir tai jums atrodys lengva.

Prisiminę lentelės struktūra iš viršaus pradėkime. Dėl aiškumo aš naudosiu playerDB kad turėčiau kur visa gautą informacija sudėt.

Pradėkime nuo query.
new query[128],name[MAX_PLAYER_NAME];
GetPlayerName(playerid,name,sizeof(name));

format(query,sizeof(query),"SELECT * FROM `lenteles_pavadinimas` WHERE Useraname='%s'",name);
SELECT *,reiškia kad renkamės VISKĄ. Galima rinktis ir neviską: pvz ("SELECT `Pinigai` FROM...");


Query turime, siųskime ją.
mysql_function_query(DB,query,true,"OnInfoLoad","d",playerid);
DB - mūsų duomenų bazė.
"True", gaunant informaciją mes norime naudoti "caching" funkcija (ji ir suteikia greitį)
"OnInfoLoad", tai nurodo kur vyks visas "veiksmas", tai yra funkcija kurioje mes gautą informaciją panaudosime. Pavadinti galit kaip tik norit. Kad ir "nuciatipogaunukazka".
"d", tai reiskia kad pridėsime papildomą integer tipo parametrą.
"playerid", tai yra tas parametras kuri pridedame.

forward OnInfoLoad(playerid);
public OnInfoLoad(playerid)
{
new rows,fields;
cache_get_data(rows,fields);
if(rows>0)
{
new tmp[16];
cache_get_row(0,0,tmp,DB); playerDB[playerid][id]=strval(tmp);
cache_get_row(0,1,tmp,DB); format(playerDB[playerid][Username],sizeof(tmp),tmp);
cache_get_row(0,2,tmp,DB); format(playerDB[playerid][Password],sizeof(tmp),tmp);
cache_get_row(0,3,tmp,DB); playerDB[playerid][X]=floatstr(tmp);
cache_get_row(0,4,tmp,DB); playerDB[playerid][Y]=floatstr(tmp);
cache_get_row(0,5,tmp,DB); playerDB[playerid][Z]=floatstr(tmp);
cache_get_row(0,6,tmp,DB); playerDB[playerid][XP]=strval(tmp);
cache_get_row(0,7,tmp,DB); playerDB[playerid][Pinigai]=strval(tmp);
}
return 1; //Butinas!!
}Kosmosas? Aiškinamės po truputį:
"cache_get_data", tai tėra viena iš "caching" funkciju kuri suskaičiuos kiek yra eilučių ir stulpelių. Mums rūpi tik eilutės,tačiau turimi imti abu
"cache_get_row(0,0,tmp,DB); tai reiškia kad norime išgauti informacija iš eilutės 0(pirmas skaičius) ir 0 stulpelio(antras skaičius). Pastaba stulpeliai skaičiuojami nuo nulio. Tie skaičiai vadinami indeksais. (Pavizdinėje lentelėje juos sužymėjau).
"strval(tmp)", kadangi galime išgauti informaciją tik string tipu (kaip ir matote tmp yra stringas) todėl ją paverčiame į skaičių. Tai padaro funkcija strval();
"format...", nors išgauname string formatu, iš patirties turiu pasakyt kad vistiek reikia daryti tai dviem etapais. (priežasties nežinau bet taip yra)
"floatstr(tmp)", kadangime norime koordinačių o jos būna su skaičiumi po kablelio(Float tipo) turime naudoti floatstr(); Galima sakyt tai yra taspats kas strval, tik kad naudojama Float tipui


Ir viskas! Tiek užtenka kad galėtumėte atnaujinti savo senas sistemas!

Tačiau MySQL gali DAUG daugiau. Kelias smulkmenas dar paminėsiu:
Kartais norisi ir ištrint duomenis, tokio tipo query atrodytu taip:
format(query,sizeof(query),"DELETE FROM `lentele_pavadinimas` WHERE kasnors='%'");tai ištrins visą eilutę

MySQL turi tokį dalyką kaip "deffault values". Pavyzdžiui turite tokią lentelę kaip pavyzdinė viršuje, įrašote tik žaidėjo vardą bei slaptažodį, ir galite padaryti jog pas jį iškarto atsirastų kasnors. Tai galite padaryti nuėję į savo duomenų bazę, paspaudę ant lentelės,tada viršuje "structure", susiraskite norima laukelį ir spauskite change, atsidarys stulpelio nustatymai, ten kur "deffault" pasirinkite "as defined" ir įrašykite norimą vertę.

Dar vienas naudingas privalumas tai yra ryšiai. Kalbu apie ryšius tarp lentelių. Pavyzdžiui galima susieti mašina su žaidėjo, kad ištrynus žaidėja, dingtų ir mašina. Bet čia jau atskiros temos vertas dalykas.


Šįkartą tiek. Radę klaidų ar jei turit pasiūlymų, rašykit! Jei patiko +rep,ačiū :)

Nuoroda į komentarą
Dalintis per kitą puslapį

Ši tema yra neaktyvi. Paskutinis pranešimas šioje temoje buvo prieš 3650 dienas (-ų). Patariame sukurti naują temą, o ne rašyti naują pranešimą.

Už neaktyvių temų prikėlimą galite sulaukti įspėjimo ir pranešimo pašalinimo!

Prisijungti prie diskusijos

Palikti atsakymą galite iš karto, o užsiregistruoti vėliau. Jeigu jau turite paskyrą mūsų forume, Prisijunkite.

Svečias
Atsakyti šioje temoje...

×   Įklijuotas tekstas turi teksto formatavimą.   Pašalinti teksto formatavimą

  Galimi tik 75 veidukai.

×   Nuoroda buvo automatiškai įterpta.   Įterpti nuorodą paprastai

×   Jūsų ankstesnis pranešimas buvo atkurtas.   Išvalyti redaktorių

×   Jūs negalite įkelti nuotraukas tiesiogiai.Įkelkite arba įdėkite nuotraukas iš URL.

  • Šiame puslapyje naršo:   0 nariai

    • Nėra registruotų narių peržiūrinčių šį forumą.

Skelbimai


×
×
  • Sukurti naują...